ISS-2026-9258 · المرحلة ٢

متغيّرات المنتج (الألوان والمقاسات) — الاختيار في المبيعات والمشتريات + الطباعة

تحليل فجوات · مرحلة بحث بلا كود · مبني على تدقيق ISS-2026-9253 ومُتحقَّق منه على الكود الحالي

الفرع hazemdev2 BE bef656a FE c0c804a التاريخ 2026-07-27 المرحلة ١ ISS-2026-9257 مقفولة
١. المشكلة ٢. الوضع الحالي ٣. الفجوة ٤. تصحيحات على التدقيق السابق ٥. الملفات المتأثرة ٦. معاينة الواجهة ٧. الحالات الحدّية ٨. خطة التنفيذ ٩. قرارات تحتاج المالك

١ المشكلة

المنتج اللي له ألوان أو مقاسات ماينفعش يتباع ولا يتشترى بلون محدّد من شاشات المبيعات والمشتريات — مافيش منتقي متغيّر أصلًا في أي منها. وحتى لو المتغيّر اتحفظ بطريقة تانية، ولا طباعة واحدة بتعرضه، فسطرين لنفس المنتج بلونين مختلفين بيطلعوا متطابقين حرفيًا في الفاتورة المطبوعة — العميل يستلم فاتورة مايعرفش منها استلم إيه.

٢ الوضع الحالي — المحرّك جاهز، الإدخال والعرض ناقصين

✅ اللي شغّال بالفعل (متحقَّق على الكود والقاعدة)

⇒ الفرضية الحاكمة للتذكرة صحيحة: طبقة البيانات كاملة، والشغل إدخال وعرض وطباعة بس.

السبب الجذري لغياب الإدخال

الجدول المشترك لسطور المستندات مابيرسمش عمود متغيّر من نفسه — بيوفّر خطّافين اختياريين:

visibleForRow?: (index: number) => boolean          // transaction-line.types.ts:29
optionsByIndex?: (index: number) => readonly unknown[] // transaction-line.types.ts:38

شاشات المخزون الأربعة فعّلتهم؛ شاشات المبيعات والمشتريات لأ. يعني الميزة مش ناقصة — الشاشات مش مفعّلاها. وأي شاشة مستند جديدة تتعمل بكرة هتطلع بلا عمود متغيّر برضه، لحد ما حد يفعّل الخطّاف فيها.

٣ الفجوة — موجود مقابل مطلوب

الطبقةالموجود دلوقتيالمطلوب
قاعدة البياناتكامل — أعمدة ومفاتيح أجنبية وفهارسلا شيء
التحويلات بين المستنداتبتنقل المتغيّرلا شيء
مسار قائمة المتغيّراتموجود ومكتمللا شيء
إدخال المتغيّر في الشاشاتصفر منتقي في ٨ شاشات قابلة للتحريرعمود منتقي معتمد على منتج الصف
الباركودبيحلّ المتغيّر ثم يرميهيمرّر المتغيّر للسطر
التحقّق في الباك إندموجود بس ضعيف — exists مجرّد بلا تقييد بالشركة ولا بمنتج السطريستخدم الـtrait المراجَع الموجود
ريسورس فاتورة البيعبيرجّع الاسم المحلّي بالفعللا شيء
ريسورس فاتورة الشراءرقم بلا اسم، ومفيش تحميل مسبق في أي مسار — ولا حتى showحقل الاسم + التحميل المسبق
الطباعةصفر ذكر للمتغيّر في الطبقة المشتركةحقل واحد مشترك + سطر لكل مستند

٤ تصحيحات جوهرية على التدقيق السابق

⛔ الأهم: كود الطباعة اللي في الباك إند ميت — الواجهة عمرها ما بتناديه

التدقيق قال إن كونترولري الطباعة في الباك إند مابيضفوش المتغيّر. ده صحيح — لكن النتيجة منسوبة لمكان غلط: الـSPA مابيناديش المسارات دي إطلاقًا (المستهلك الوحيد لأي مسار /print في الواجهة كلها هو موديول العيادة). وكمان خدمتا الفاتورتين بتنادوا مسار /{id}/pdf غير موجود أصلًا. ومفيش أي مسار Blade/DomPDF للمبيعات أو المشتريات.

الطباعة الحقيقية كلها في الواجهة: رد show() ← مُحوِّل لكل مستند ← باني صفوف مشترك واحد ← HTML في نافذة طباعة. ⇒ إصلاح كونترولرات الباك إند مش هيغيّر حاجة يشوفها المستخدم.

ما قاله التدقيقالواقع بعد التحقّق
«١٠ شاشات مبيعات ومشتريات بلا منتقي»٨ بس قابلة للتحرير. إذن التسليم وإذن الاستلام مالهمش محرّر سطور ولا FormArray — جداولهم عرض فقط وبيتولدوا من مستند مصدر بينقل المتغيّر. ⇒ شغلهم عرض وطباعة، مش منتقي.
«النمط واحد ويتكرّر»المرتجعات مزدوجة. مرتجع البيع والشراء بيستخدموا الجدول المشترك في المسار المستقل، وجدولًا يدويًا في المسار المربوط بفاتورة — محتاج حمل وعرض لا اختيار. تعديلان مختلفان في نفس الملف.
«اسم المتغيّر بيتحمّل في show لكل المستندات»غلط لفاتورة الشراء: مفيش أي مسار بيحمّله — ولا show نفسه. وفاتورة البيع بالعكس سليمة تمامًا وبترجّع الاسم المحلّي.
«product_variants = صفر صف»بقى ٢ صف (اتعملوا 2026-07-26، بعد التدقيق) على منتج واحد «tshirt». لكن صفر سطر في كل جداول المبيعات والمشتريات العشرةحجة «الإصلاح قبل دخول البيانات أرخص» لسه قائمة بالكامل.
(غير مذكور)الباركود بيرمي المتغيّر: خدمة البحث بالباركود بترجّع variantId فعلًا، والفاتورتان بتاخدوا المنتج بس وبيرموه. سطح إدخال تاني لنفس الميزة.
(غير مذكور)أداة جاهزة ومراجَعة: ValidatesLineVariantOwnership بتتحقّق إن المتغيّر تابع لمنتج السطر ولشركة المستخدم — مستخدمة في طلبين بس، وكل الـ٢٠ طلب مبيعات/مشتريات لسه على القاعدة الضعيفة.

٥ الملفات المتأثرة (لشاشتَي البداية)

الملفالتغيير
shared/print/print.interfaces.tsحقل variantName? على عنصر الطباعة المشترك — سطر واحد يخدم كل المستندات
shared/print/print-helpers.tsعرض المتغيّر جوّه خانة اسم المنتج الموجودة — مفيش عمود جديد ⇒ مفيش أي تغيير في التخطيط
shared/print/print-templates.ts⚠️ سكين الطباعة الحرارية عنده صفوفه الخاصة وبيتخطّى الباني المشترك — لازم يتلمس منفصل وإلا هيفضل يسقط المتغيّر بصمت
features/sales/invoices/invoices.component.tsعمود المنتقي + تحميل كسول عند اختيار المنتج + الحمولة + الاستعادة عند التعديل + مسار الباركود
features/purchases/bills/bills.component.tsنفسه (أبسط — بلا شارة مخزون)
*/invoice-print.config.ts · bill-print.config.tsسطر تحويل واحد لكل واحد
Modules/Purchases/…/PurchaseBillItemResource.phpإضافة الاسم المحلّي
Modules/Purchases/…/PurchaseBillController.phpتحميل مسبق للعلاقة (على الأقل في show)
Modules/Sales/…/StoreSalesInvoiceRequest.php + Updateاستبدال exists المجرّد بالـtrait المراجَع
Modules/Purchases/…/StorePurchaseBillRequest.php + Updateنفسه
core/services/doc-config.service.tsتسجيل العمود عشان يبقى قابل للإخفاء/الترتيب من إعدادات المستندات زي باقي الأعمدة

٦ معاينة الواجهة المتوقّعة

أ) شبكة سطور الفاتورة — قبل ← بعد

قبل — المنتج اللي له ألوان مافيش طريقة تحدّد لونه
#الصنفالوحدةالكميةالسعرالإجمالي
1تي شيرت قطن PRD-17156قطعة10120.001,200.00
2تي شيرت قطن PRD-17156قطعة5120.00600.00

سطران متطابقان — محدش يعرف ده أحمر وده أخضر.

بعد — عمود «اللون/المقاس» بيظهر للصف اللي منتجه له متغيّرات
#الصنفاللون/المقاسالوحدةالكميةالسعرالإجمالي
1تي شيرت قطن PRD-17156أحمر ▾قطعة10120.001,200.00
2تي شيرت قطن PRD-17156أخضر ▾قطعة5120.00600.00
3قلم جاف PRD-2201— لا ينطبق —علبة235.0070.00

الصف ٣ منتجه بلا متغيّرات ⇒ الخانة فاضية (نفس سلوك شاشات المخزون الأربعة الحالي). خيارات كل صف بتتحمّل من منتج الصف نفسه.

ب) الفاتورة المطبوعة — قبل ← بعد

قبل
#الصنفالوحدةالكميةالسعرالخصمالإجمالي
1تي شيرت قطن
PRD-17156
قطعة10120.000%1,200.00
2تي شيرت قطن
PRD-17156
قطعة5120.000%600.00
بعد — المتغيّر جوّه نفس الخانة، بلا عمود جديد وبلا أي تغيير في التخطيط
#الصنفالوحدةالكميةالسعرالخصمالإجمالي
1تي شيرت قطن أحمر
PRD-17156
قطعة10120.000%1,200.00
2تي شيرت قطن أخضر
PRD-17156
قطعة5120.000%600.00

لأن الإضافة داخل الخانة الموجودة، كل المستندات (١٤ نوع) وكل قوالب A4 بتاخد التعديل تلقائيًا — والقوالب المخصّصة اللي عملها المستخدم كمان.

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

الحالةالمعالجة
منتج بلا متغيّراتالخانة فاضية والحمولة بتبعت null — نفس سلوك شاشات المخزون الحالي بالظبط
تغيير منتج الصف بعد اختيار لونالمتغيّر يتصفّر إجباريًا (نمط شاشات المخزون) وإلا يفضل لون منتج تاني
تعديل مستند قديم فيه متغيّرلازم تحميل الخيارات قبل رسم القائمة وإلا القيمة تتفقد — الشاشات الأربعة بتعمل كده صراحةً
مستند اتحوّل من مصدر (أمر ← فاتورة)المتغيّر بينتقل بالفعل — المطلوب إنه ما يضيعش عند إعادة الحفظ
شركة رتّبت أعمدة الشبكة قبل كده⚠️ العمود الجديد هيظهر في آخر الشبكة مش جنب الصنف — لأن الترتيب المحفوظ مافيهوش المفتاح الجديد
الطباعة الحرارية⚠️ صفوفها مستقلة — لو ما اتلمستش هتفضل تسقط المتغيّر بصمت
الاسم العربي للمتغيّر فاضيالمتغيّرين الموجودين على الجهاز name_ar = NULLالعربي والإنجليزي هيطلعوا واحد ومش هينفع نتحقّق من التعريب إلا بمتغيّر تجريبي بالعربي

⚠️ عيب سابق مستقل رصدناه في الطريق: زر الطباعة في قائمة فواتير الشراء بيطبع الصف كما هو من القائمة، والقائمة مابترجعش السطور أصلًا ⇒ الطباعة دي بتطلع بجدول أصناف فاضي النهارده. مالوش علاقة بالمتغيّرات لكنه هيبلع أي شغل متغيّرات على الزر ده.

٨ خطة التنفيذ المقترحة

#النطاقالريبو
١الطباعة في الطبقة المشتركة — حقل واحد + عرض داخل خانة الصنف + سكين الحراريةFE
٢فاتورة البيع: عمود المنتقي + الحمولة + الاستعادة + الباركود + التحقّق بالـtraitFE + BE
٣فاتورة الشراء: نفسه + إصلاح الريسورس والتحميل المسبق (بلاهم مفيش اسم يتطبع أصلًا)FE + BE
٤تسجيل العمود في إعدادات المستنداتFE
٥اختبارات — صفر تغطية للمتغيّرات في المبيعات والمشتريات حاليًاBE
٦(بعد تجربتك) الست شاشات الباقية + المرتجعات مزدوجة النمط + عرض إذن التسليم والاستلامFE + BE

٩ قرارات تحتاج المالك

  1. موضع العمود: جنب الصنف مباشرة (يتطلّب تصفير ترتيب الأعمدة المحفوظ لشاشتَي البداية) — ولا في آخر الشبكة بلا مساس بأي إعداد محفوظ؟
  2. شكل المتغيّر في الطباعة: جوّه خانة الصنف (بلا تغيير تخطيط) ولا عمود مستقل (أوضح لكن بيضغط الأعمدة على A4)؟
  3. سعر المتغيّر: المتغيّر عنده additional_price والشاشات الحالية بتتجاهله. يتطبّق تلقائيًا على سعر السطر في المبيعات ولا يفضل متجاهَل؟
  4. كونترولرات الطباعة الميتة في الباك إند: تتصلّح احتياطًا، تتساب، ولا تتشال؟
  5. الاختيار إجباري؟ منتج له متغيّرات وانحفظ بلا اختيار: يُرفض، يُحذّر، ولا يعدّي (السلوك الحالي)؟

مرحلة بحث — صفر كود وصفر migration. التنفيذ يبدأ بعد اعتماد النطاق والإجابة على القرارات أعلاه.