Moon ERP · خطة تنفيذ

توحيد جدول الأصناف عبر كل المستندات + تحكّم الأعمدة بالسحب (محفوظ على مستوى الشركة) Unify the line-items grid everywhere → drag-reorderable, show/hide columns, persisted company-wide

الهدف: كل المستندات (بيع/شراء/مخازن) تستخدم مكوّن جدول أصناف واحد (TransactionLineItemsComponent) بأعمدة config، وبعدها المستخدم يقدر يسحب الأعمدة يرتّبها ويُظهر/يُخفي، ويتحفظ مرة واحدة على مستوى الشركة كلها (مش لكل مستخدم) عبر DocConfigService الموجود.

📅 2026-06-23 القرارات: حفظ لكل الشركة · سحب لترتيب الأعمدة · وحّد الكل أولًا النطاق: FE Angular 21 / PrimeNG v21 (+ امتداد بسيط بالباك-إند للحفظ)

0 المبدأ والمعمارية

مكوّن واحد مصدر الحقيقة لكل جداول الأصناف. كل مستند يمرّر descriptor (أعمدته + أنواعها). إعدادات الأعمدة (الترتيب + الإظهار) تُحفظ لكل مستند على حدة، لكل الشركة، في نفس آلية DocConfigService (إعداد core.document_settings في الباك-إند).

// نموذج الإعداد المحفوظ (لكل الشركة) — نمدّد الموجود
core.document_settings = {
  "sales.invoice": {
    fields: { ... },                       // (موجود) إظهار/إخفاء + إلزامية
    "lineColumns": [                     // (جديد) ترتيب + إظهار الأعمدة
      {key:"product_id", visible:true, order:0},
      {key:"quantity",   visible:true, order:1},
      {key:"unit_price", visible:true, order:2}, ...
    ]
  }, ...
}

المكوّن المشترك يقرأ lineColumns من DocConfigService ويطبّق الترتيب/الإظهار على الأعمدة قبل الرندر. شاشة «إعدادات المستندات» الموجودة (core/settings) تكسب تبويب/قسم «أعمدة الأصناف» بسحب + توجيلات، تحفظ مرة واحدة.

1 جرد المستندات (هدف التوحيد)

المستندالحالةأعمدة مميّزة تحتاج دعم
أمر بيع✅ موحّد (المرجع)منتج، مخزن، كمية، سعر، خصم، ضريبة، إجمالي
فاتورة بيعالتالي+ مخزن (مفلتر بالفرع)، ضريبة مشمولة، (مُسلَّم/متبقّي للعرض)
عرض سعر بيعللتوحيد≈ أمر البيع
مرتجع بيعللتوحيد+ ربط بسطر الفاتورة، تكلفة
أمر/فاتورة/طلب شراءللتوحيدمنتج، مخزن، كمية، تكلفة، ضريبة، خصم
مرتجع شراءللتوحيد+ ربط بفاتورة الشراء
إذن صرف/استلام/تسوية/تحويل مخزونللتوحيدمنتج، كمية (+ المنصرف)، باتش/سيريال، تكلفة
جرد / رصيد افتتاحيللتوحيدمنتج، كمية، تكلفة
التصنيع (BOM/أوامر)مرحلة لاحقةتركيب مختلف (مكوّنات/توجيه) — يُقيَّم منفصل
ملاحظة: حقل البحث عن المنتج (app-product-search) مشترك بالفعل في 19 شاشة — التوحيد هنا عن الجدول كامل (الأعمدة وتركيبها)، مش البحث.

2 المراحل (تنفيذ تدريجي بمراجعة لكل خطوة)

1

تجهيز المكوّن المشترك (Audit + Extend)

متوسط
نراجع TransactionLineItemsComponent + أنواع خلاياه (TxCellType): هل تغطّي كل ما تحتاجه المستندات (مخزن، باتش/سيريال، ضريبة مشمولة، عمود «المنصرف» للإذن، أعمدة عرض-فقط)؟ نضيف الأنواع الناقصة. نضمن إن المكوّن يقبل قائمة أعمدة مرتّبة/مفلترة من الخارج (تمهيد للحفظ). مخرج: مكوّن مشترك «كامل القدرات» جاهز يستوعب كل الشاشات.
2

توحيد المستندات — واحدًا واحدًا

عالٍ (تراكمي)
لكل مستند: نبني lineDescriptor يطابق أعمدته، ونستبدل الجدول اليدوي بـ <app-transaction-line-items [descriptor]>، ونوصّل الـ FormArray والـ callbacks، ونتأكّد بالبناء + مراجعة بصرية. الترتيب: فاتورة بيع (الأهم) → عرض سعر → مرتجع بيع → شراء (أمر/فاتورة/طلب/مرتجع) → مخازن (صرف/استلام/تسوية/تحويل/جرد). كل شاشة = خطوة مستقلة قابلة للمراجعة والرجوع.
إدارة المخاطر: فاتورة البيع فيها مميزات حسّاسة (ضريبة مشمولة، مخزن مفلتر بالفرع، أعمدة التسليم الجزئي الجديدة) — نتعامل معاها بحذر ونتأكّد إنها ماتكسرش. كل شاشة تتبني وتتراجع قبل اللي بعدها.
3

تحكّم الأعمدة: سحب + إظهار/إخفاء

متوسط
نضيف للمكوّن المشترك: سحب رؤوس الأعمدة لإعادة الترتيب (Angular CDK DragDrop) + منتقي أعمدة (زرّ ⚙ بتوجيلات إظهار). لأنه مكوّن واحد، الميزة تشتغل في كل المستندات الموحّدة مرة واحدة. (عرض الأعمدة/resize: مرحلة لاحقة اختيارية.)
4

الحفظ على مستوى الشركة + شاشة الإعدادات

متوسط
نمدّد DocConfigService ليخزّن lineColumns (ترتيب + إظهار) لكل مستند ضمن core.document_settings (لكل الشركة). المكوّن المشترك يقرأها ويطبّقها عند الرندر. شاشة core/settings (إعدادات المستندات) تكسب قسم «ترتيب أعمدة الأصناف» لكل مستند — سحب + توجيلات، يحفظ مرة واحدة للشركة كلها. (نقطة الباك-إند الوحيدة: نفس مفتاح الإعداد الموجود — مجرد توسيع الـ JSON، بلا migration.)

3 طريقة التنفيذ والجودة

نقطة البداية

هنبدأ بـ: المرحلة 1 (تجهيز المكوّن المشترك — audit القدرات وإضافة الناقص)، وبعدها فورًا توحيد فاتورة البيع كأول شاشة (الأهم والأقرب لأمر البيع). بعد ما تستقر، نكمّل باقي المستندات تباعًا، ثم التحكّم بالسحب، ثم الحفظ على مستوى الشركة.