ISS-2026-9169 · Improvement · Phase 1 — تحليل (بلا كود)

تحكّم الأعمدة في جداول «إذن الصرف» و«إذن الإضافة» Per-column show/hide · reorder · resize on the stock-issue & stock-receipt line grids — "like the invoices"

المشروع: مون 2 حسابات (283) الشاشات: stock-issues · stock-receipts النوع: واجهة/UX مالي: لا (عرض فقط) الفرع: hazemdev2

1 المشكلة

في نافذتَي «تعديل إذن الصرف» و«تعديل إذن الإضافة»، جدول بنود الأصناف واسع (المنتج، المتغيّرات، المخزون، الوحدة، المطلوب/الكمية، المصروف، مخزن المصدر، صاحب الأمانة، رقم الدفعة…) ومحتاج تمرير أفقي. العميل عايز يقدر يتحكّم في عرض الأعمدة وترتيبها (وإخفاء اللي مايحتاجهوش) — «زي الفواتير» بالظبط: يسحب العمود يوسّعه/يضيّقه، ويسحبه يغيّر مكانه، ويخفي أعمدة.

2 الوضع الحالي (ما هو موجود فعلاً)

أ) الفاتورة — عندها التحكّم الكامل بالفعل ✅

فاتورة المبيعات (وباقي المستندات) بتستخدم مكوّن مشترك TransactionLineItemsComponent (src/app/shared/components/transaction-line-items/) اللي فيه:

القدرةالآليةالمرجع
إظهار/إخفاء عمود + زر ترس ⚙docConfig.fieldVisible() + popoverinvoices.component.html:440 · doc-config.service.ts:227
إعادة الترتيب (سحب رأس العمود)Angular CDK DragDrop → setLineColumnOrder()transaction-line-items.ts:352 · doc-config.service.ts:290
تغيير العرض (مقبض سحب على الرأس)Pointer-Events → setLineColumnWidth()transaction-line-items.ts:389 · doc-config.service.ts:321

التخزين: الثلاثة (ظهور + ترتيب + عرض) بيتحفظوا في إعداد واحد core.document_settings عبر PUT /core/settingsعلى مستوى الشركة (per-company)، ومحمي بصلاحية core.settings. مفيش أي حفظ per-user لتخطيط الأعمدة في البرنامج كله.

ب) إذن الصرف / الإضافة — جداول مكتوبة يدويًا، بلا تحكّم ❌

الشاشتان لا تستخدمان المكوّن المشترك — كل واحدة <table> HTML عادية مكتوبة بالكامل يدويًا (بسبب خلاياها الخاصة: منتقي الأمانة، بادج المخزون، شِيبس السيريال/اللوط، الباركود). docConfig بيتحكّم في ظهور عمود أو اثنين فقط؛ الباقي وعرض كل الأعمدة وترتيبها ثابت في الكود.

الشاشةdocKeyأعمدة يتحكّم فيها docConfigباقي الأعمدة
إذن الصرف
stock-issues.component
inventory.issueunit_id فقطثابتة دائمًا: المنتج، المتغيّر، المخزون، المطلوب، المصروف، مخزن المصدر، صاحب الأمانة، الدفعة
إذن الإضافة
stock-receipts.component
inventory.receiptunit_id + unit_costثابتة دائمًا: المنتج، المتغيّر، المخزون، الكمية، إجمالي التكلفة، الدفعة
ملاحظة سجلّ الإعدادات: في DOC_CONFIG_REGISTRY الحالي، الـdocKey للشاشتين مُسجَّل بـ٣ حقول سطر فقط (product/unit/quantity) — باقي أعمدة الجدول غير مُسجَّلة أصلًا، فحتى الإظهار/الإخفاء مش متاح لها اليوم.

3 المطلوب

جلب نفس تجربة الفاتورة إلى جدولَي إذن الصرف والإضافة: (أ) إظهار/إخفاء كل الأعمدة، (ب) إعادة ترتيب بالسحب، (ج) تغيير العرض بالسحب — مع حفظ التفضيل بحيث يفضل ثابت بعد إعادة فتح الشاشة.

4 الفجوة (GAP)

القدرةالفاتورة (موجود)إذن الصرف/الإضافة (الآن)المطلوب عمله
إظهار/إخفاء عمودكامل ⚙عمود–اثنين فقطتسجيل كل الأعمدة + زر الترس على الجدولين
إعادة الترتيب (سحب)موجودغير موجودسحب الرأس + احترام الترتيب المحفوظ عند رسم الصفوف
تغيير العرض (سحب)موجودغير موجودمقبض عرض على الرأس + عرض محفوظ لكل عمود
حفظ التفضيلشركة-عام (core.settings)لا يوجدقرار: شركة-عام (زي الفاتورة) أم per-user؟ (قسم 8)

5 الملفات المتأثرة والاعتماديات

الملفالدور في التغيير
src/app/core/services/doc-config.service.tsتسجيل كل أعمدة inventory.issue/inventory.receipt؛ استخدام lineColumnOrder/Width الموجودين أصلًا
transaction-line-items.component.tsمصدر آلية السحب/العرض/الترتيب — نُعيد استخدامها (استخراج موجِّه/directive أو تبنّي المكوّن)
stock-issues.component.html / .tsتحويل رسم الأعمدة إلى مقاد بالترتيب + مقابض الرأس + زر الترس
stock-receipts.component.html / .tsنفس الشيء لجدول الإضافة
i18n ar.json/en.jsonمفاتيح تسميات الأعمدة الجديدة في الترس

Backend: لا تغيير على الأغلب — التخزين الحالي core.document_settings عبر /core/settings كافٍ للخيار «شركة-عام». (per-user يحتاج تخزين جديد — قسم 8.)

6 الحالات الحدّية

7 خطة التنفيذ المقترحة (WPs)

WP1 — تسجيل الأعمدة + الإظهار/الإخفاء (ترس ⚙): سجّل كل أعمدة الجدولين في DOC_CONFIG_REGISTRY وأضف زر الترس على الشاشتين (نمط الفاتورة). أقل مخاطرة — بيوصّل أغلب القيمة

WP2 — إعادة الترتيب + تغيير العرض: استخرج آلية DragDrop+Resize من المكوّن المشترك إلى موجِّه قابل لإعادة الاستخدام، وطبّقه على رؤوس الجدولين، وحوّل رسم الصفوف ليكون مقادًا بترتيب الأعمدة (بدل ترتيب <td> الثابت) مع احترام العرض المحفوظ. أكبر — رسم الصف يتغيّر

WP3 — i18n + مراجعة + بناء: مفاتيح التسميات، مراجعة Codex/opus، ng build، نشر /app.

تسلسل موصى به: WP1 أولًا (يُسلَّم ويُجرَّب)، ثم WP2 بعد تأكيد العميل على السلوك والصلاحية.

8 قرارات تحتاج العميل

Q1 — الحفظ: شركة-عام (زي الفاتورة) أم لكل مستخدم؟ توصية: شركة-عام

الفاتورة بتحفظ ترتيب/عرض/ظهور الأعمدة على مستوى الشركة (إعداد واحد، محمي بصلاحية core.settings). الأبسط والأسرع والمتّسق = نفس الشيء هنا. لكن لو المطلوب إن كل أمين مخزن يرتّب جدوله بنفسه (ولمّا العميل قال «يمكن اتحكم» ممكن يقصد ده) → نحتاج تخزين per-user جديد. أي واحد؟

Q2 — مين يقدر يعدّل الأعمدة؟ توصية: صلاحية إدارية زي الفاتورة

لو اخترنا «شركة-عام» فالمنطقي إن اللي يعدّل الأعمدة هو صاحب صلاحية إعدادات (زي الفاتورة تمامًا) — يظبطها مرة وتسري على الكل. لو اخترنا «per-user» فكل مستخدم يعدّل بتاعه بلا صلاحية خاصة. القرار مربوط بـQ1.

Q3 — مدى التنفيذ: الكل دفعة واحدة أم WP1 (إظهار/إخفاء) أولًا؟ توصية: WP1 أولًا

إظهار/إخفاء الأعمدة (WP1) لوحده بيحل «الجدول مزدحم» بأقل مخاطرة وسرعة. الترتيب+العرض (WP2) أكبر شوية. أبدأ بـWP1 وأسلّمه، ثم WP2؟ أم تعمل الاتنين مع بعض؟

Q4 — الشاشتان معًا؟ توصية: نعم

إذن الصرف + إذن الإضافة يتعملهم نفس التحسين معًا (نفس الآلية). موافق؟

9 معاينة الواجهة المتوقّعة (Before → After)

جدول بنود «تعديل إذن الصرف» — قبل (أعمدة ثابتة، بلا تحكّم) مقابل بعد (مقبض سحب ⋮⋮ لإعادة الترتيب + مقبض عرض على حافة الرأس + زر ترس ⚙ للإظهار/الإخفاء):

#المنتجالمتغيّراتالمخزونالوحدةالمطلوبالمصروفمخزن المصدرالأمانةالدفعة
1PRD·i731913.90كيلو6.066.06مخزن ١FEFO
2PRD·i0639487قطعة300300مخزن ١FEFO
قبل — كل الأعمدة ظاهرة وبعرض ثابت، بلا سحب
⚙ الأعمدة
# ⋮⋮المنتج ⋮⋮المخزون ⋮⋮المطلوب ⋮⋮المصروف ⋮⋮مخزن المصدر ⋮⋮الأمانة
1PRD·i731913.906.066.06مخزن ١
2PRD·i0639487300300مخزن ١
بعد — أخفى (المتغيّرات/الوحدة/الدفعة) عبر ⚙، رتّب بالسحب ⋮⋮، وغيّر العرض من المقبض
الملف المتأثر: stock-issues.component.html (رؤوس + رسم الصف مقاد بالترتيب) وstock-receipts.component.html بنفس الشكل. لا يتغيّر أي منطق حفظ/اعتماد — تحكّم عرض بحت.

تحليل Phase 1 — بلا كود. بانتظار قرارات العميل (قسم 8) قبل أي تنفيذ. | ISS-2026-9169 · Moon ERP · hazemdev2