طلبك: «في الإنتاج نستخدم نفس البحث بتاع المنتجات، وكمان نفس قصة تغيير حجم العواميد زي الفواتير والمستندات». التدقيق شمل ٥٠ شاشة إنتاج و١٦ جدول سطور والطبقة المشتركة والباك-إند — وطلّع إن اللي طلبته قابل للتنفيذ وأرخص مما تتصور، لكنه كشف عيبين أخطر بكتير على نفس الشاشات: حفظ مكوّنات قائمة التصنيع بيتجاهل التعديلات بالكامل، ومنتقي المنتجات مش شغّال لأي دور إنتاج أصلًا.
وده على الشاشة اللي إنت سمّيتها بالظبط كمثال.
السلسلة كاملة، متتبَّعة من الواجهة للسيرفر:
components[] (وجوّاها substitutes[]) وoperations[] — boms.component.ts:465-499PUT /production/boms/{id} — boms.component.ts:504PUT /boms/{id}/components موجود في السيرفر والواجهة ما بتناديهوش ولا مرةUpdateBomRequest ما بيعلنش components ولا operations — UpdateBomRequest.php:19-44BomController::update() بيعمل $bom->update($request->validated()) — BomController.php:128. المصفوفتين اتمسحوا قبل ما يوصلوا.النتيجة: تعدّل مكوّنات أو عمليات قائمة تصنيع، الشاشة تقول «تم الحفظ»، ومفيش حاجة اتغيّرت. المكوّنات بتتحفظ عند الإنشاء بس.
ومفيش اختبار بيغطّي ده — الاختبارات الموجودة بتجرّب مدخل المزامنة اللي الواجهة ما بتناديهوش.
وليه ده يسبق شغل الأعمدة: قيمة الجدول المشترك كلها إنه يعدّل سطور مستند موجود. لو حطّيناه فوق مسار حفظ بيرمي مخرجاته، الشغل هيبان إنه سبب عيبًا هو في الحقيقة بس كشفه.
وفخ تاني في نفس المكان: BomController::show() ما بيحمّلش components.substitutes، وsyncComponents بيمسح كل البدائل ويعيد إنشاءها من الحمولة. يعني تحميل → تعديل → مزامنة عبر الشاشة الحالية = مسح كل البدائل.
منتقي المنتجات المشترك بينادي GET /api/core/products، وده محروس بصلاحية core.products.view.
ولا دور إنتاج واحد بيمتلكها. اتأكدنا بطريقتين — بالبحث في سيدر أدوار الإنتاج (صفر نتيجة)، وبقراءة قاعدة بيانات التطوير:
| الدور | صلاحيات إنتاج | core.products.view |
|---|---|---|
| مشرف الإنتاج | ٢٠ | ٠ |
| مدير الإنتاج | ٢٠ | ٠ |
| مخطّط الإنتاج | ١١ | ٠ |
| محاسب تكاليف الإنتاج | ٣٢ | ٠ |
| مدير الجودة | ١١ | ٠ |
| أمين مخزن | ٢ | ٠ |
| مدير النظام / المالك | ٢٥ / ٧٣ | ✔ |
وحارس المسار في الواجهة بيعدّي (بيفحص صلاحية الإنتاج)، فالشاشة بتفتح عادي — وطلب المنتقي بيترفض ٤٠٣. والرد ما بيسمّيش الصلاحية الناقصة (معطّل في الإعدادات)، والمعترِض ما بيعرضش ٤٠٣ — فبيقع في فرع الخطأ والقايمة تفضل فاضية.
يعني: مشرف الإنتاج بيفتح قائمة التصنيع، يدوّر على مكوّن، وما يلاقيش حاجة — من غير أي رسالة.
ده موجود قبل أي شغل ليك — مش هيتسبّب فيه التوحيد. بس أي تعديل على الشاشات دي هياخد اللوم عليه، فلازم يتصلّح أو يتستثنى صراحةً.
خطة يونيو للتوحيد استثنت الإنتاج صراحةً وكتبت: «التصنيع (BOM/أوامر) — مرحلة لاحقة — تركيب مختلف (مكوّنات/توجيه) — يُقيَّم منفصل». وطلبك ده هو التقييم المنفصل المقصود. فمفيش قرار بيتراجع هنا — فيه قرار مؤجَّل بيتاخد.
الشاشات في الإنتاج مش متسقة مع باقي النظام: بحث المنتجات مختلف في مكان، وجداول السطور مالهاش أي تحكم في الأعمدة — لا ترتيب ولا تحجيم ولا إخفاء — بينما الفواتير والمستندات عندها ده كله ومحفوظ. والمثال اللي سمّيته: شاشة قوائم التصنيع، تبويب اختيار المكوّنات.
السحب والتحجيم والإظهار/الإخفاء التلاتة شغّالين على ١٤ شاشة. والخطة الأصلية كانت مؤجّلة التحجيم كمرحلة اختيارية — واتبنى برضه.
| القدرة | موجودة؟ | الدليل |
|---|---|---|
| سحب لإعادة الترتيب | أيوه | transaction-line-items.component.ts:40-46, 352-363 · tx-column-layout.ts:116-122 |
| سحب للتحجيم (بالبكسل) | أيوه | …component.ts:64-70, 389-468 — مقبض ٥px، واعٍ بالـRTL، حد أدنى 48px |
| إظهار/إخفاء | أيوه | عبر نظام رؤية الحقول في الإعدادات، والجدول بيحترمه عبر TxColumn.visible |
| الحفظ لكل مستند | أيوه | مفتاح خارجي في DocConfigState |
| الحفظ لكل الشركة | أيوه | SettingDefinitionSeeder.php:135-149 — scope => 'company' |
| الحفظ لكل مستخدم | لأ — مش موجود | القرار كان «الشركة» في خطة يونيو |
| على أي شاشة إنتاج | ولا واحدة | صفر إشارة لخدمة الإعدادات تحت features/production/ |
١٢ شاشة: فواتير وأوردرات المبيعات والمشتريات · المرتجعات · الطلبات · الجرد · التسويات · التحويلات · الأرصدة الافتتاحية.
الشاشة بتسلّم وصف أعمدة والمكوّن بيرسم الصف كله.
شرطه القاسي: السطور لازم تكون FormArray. مش مصفوفة إشارات ولا كائنات عادية.
شاشتين: أذون الصرف · أذون الاستلام.
الشاشة بتحتفظ بخلاياها كما هي وتاخد السحب والتحجيم بس.
واتعملت بالظبط للحالات دي — تعليقها في الكود بيقول إن خلايا الجداول دي «مختلفة جوهريًا» فاتنقلت الآلية وحدها.
الثمانية: قوائم التصنيع · التشغيلات · الأمانات · الخطة الرئيسية · أوامر الإنتاج · التوجيه · عقود التصنيع للغير · العُدد.
الفجوة الوحيدة: شاشة البحث والتطوير — بتستخدم قائمة منسدلة عادية، وبتسحب كتالوج المنتجات كله عبر مُصفِّح بيجيب ٢٥ صف في المرة، وبتصفّي في المتصفح.
ولو الطلب فشل، بتبلع الخطأ وتسيب القايمة فاضية.
وده معناه إنها كمان مش هتاخد تحسين النهاردة (عرض اسم عميل التصنيع والبحث باسمه) — لأنها برّه المكوّن المشترك.
| الجدول | مخزن السطور | الأعمدة (بالترتيب) |
|---|---|---|
| قوائم التصنيع — المكوّنات | FormArray | #· المنتج · الكمية · الوحدة · نسبة الهالك · نوع الصرف · مستوى الصرف · تسلسل العملية · التكلفة/وحدة · مصدر التوريد · كمية العميل/وحدة · إجراءات (٣ أزرار) |
| قوائم التصنيع — البدائل | FormArray متداخل | المنتج البديل · الأولوية · النسبة · حذف — جوّه صف موسَّع |
| قوائم التصنيع — العمليات | FormArray | # · مركز الإنتاج · اسم العملية · زمن التجهيز · زمن التشغيل · تكلفة العمالة/ساعة — بلا منتج |
| التوجيه — العمليات | إشارات | ١٢ عمودًا: رقم · اسم · مركز · عُدّة · تجهيز · تشغيل · تجاويف · زمن دورة · انتظار · نقل · ☑ فحص · ☑ حرجة — بلا منتج |
| الخطة الرئيسية | إشارات | المنتج · الفترة (تاريخ) · الكمية · المصدر · حذف |
| الأمانات — سطور الاستلام | إشارات | المنتج · الكمية · التكلفة المعلنة · رقم التشغيلة · الصلاحية · تاريخ الإنتاج · قيمة السطر · حذف |
| أوامر الإنتاج — صرف المواد | إشارات | ٥ أعمدة للقراءة + كمية الصرف + مخزن + مالك — سطور من السيرفر، ما تتضافش |
| شهادات التحليل · التأكيدات · استلام التام · الورشة · التقويمات · طلبات الصرف الزائد · تخصيص التشغيلات · عقود التصنيع | مختلط | أشكال خاصة — تفاصيل في §٤ |
يتحوّل كامل = المكوّن المشترك · يتحوّل جزئيًا = آلية الأعمدة فوق جدوله · ما يتحوّلش · لا ينطبق
| الشاشة | الحكم | السبب — من الكود |
|---|---|---|
| الخطة الرئيسية | كامل | السطر = منتج + تاريخ + كمية + مصدر. الشكل الوحيد في الإنتاج المطابق لسطر مستند. التكلفة الوحيدة: تحويل من إشارات لـFormArray. |
| الأمانات — الاستلام | كامل | منتج + كمية + تكلفة وحدة + قيمة سطر محسوبة = سطر مستند حرفيًا. والتشغيلة والصلاحية أعمدة عادية. وبُعد الملكية على رأس المستند مش على السطر — فمش بيكلّف عمودًا. |
| قوائم التصنيع — المكوّنات | جزئيًا | على البحث المشترك وFormArray خلاص — بس ١١ عمودًا ومفيش سعر ولا ضريبة ولا إجمالي (اللي المكوّن المشترك مبني حواليهم)، وفيها صف بدائل موسَّع والمكوّن مالوش أي دعم للتوسيع. |
| أوامر الإنتاج — صرف المواد | جزئيًا | السطور مبنية من السيرفر وما تتضافش، و٥ من ٨ أعمدة للقراءة. مش شبكة إدخال — شبكة تنفيذ. بس آلية الأعمدة هتفيد لأنها أعرض جدول في الموديول. |
| التوجيه — العمليات | جزئيًا | ١٢ عمودًا مفيش فيهم منتج، وعمودين اختيار (☑) — والمكوّن المشترك مالوش نوع خلية منطقية أصلًا. |
| شهادات التحليل | جزئيًا | FormArray بس بلا منتج، وفيه خلية حالة نجاح/رسوب مشتقّة — والنوع المحسوب في المكوّن بيرجّع رقم مش حالة. |
| البحث والتطوير | جزئيًا | مافيهاش جدول سطور أصلًا — بس منتقيين المنتج فيها تبديل مباشر للبحث المشترك. الفجوة الوحيدة الباقية في الموديول. |
| عقود التصنيع للغير | لأ | كروت مكدّسة فيها منطقة نص ورافع ملفات لكل سطر — مفيش نوع خلية بيرسم أي منهم. |
| البدائل · تخصيص التشغيلات | لأ | جداول متداخلة جوّه صف موسَّع من جدول أب. المكوّن بيطلع صفًا واحدًا لكل سطر، بلا أي خطّاف توسيع. |
| التأكيدات · استلام التام · الورشة | لأ | درجة + كمية + سعر بلا منتج. والورشة مصمّمة بأزرار لمس كبيرة — تحويلها بيدمّر الغرض منها. |
| التقويمات | لأ | ٧ صفوف ثابتة لأيام الأسبوع، ما بتتضافش ولا بتتحذف. مش مجموعة سطور أصلًا. |
| التكاليف المعيارية · التسعير · التجهيز · جداول التقارير | لأ | جداول عرض للقراءة — التحكم في أعمدتها شغل جدول عادي مش جدول سطور. |
| باقي ٣٣ شاشة | لا ينطبق | لوحات ومؤشرات وتقارير وإعدادات — مفيش منتقي ولا سطور. |
١) وصف الأعمدة مش محتاج تسجيل في فهرس المستندات. الأعمدة بتيجي من الشاشة نفسها؛ ومفتاح المستند بيُستخدم للحفظ بس. يعني الشاشة تاخد السحب والتحجيم بمجرد ما تمرّر مفتاحًا جديدًا. التسجيل مطلوب للإظهار/الإخفاء بس.
٢) والشرط الحقيقي هو FormArray — و٨ من جداول الإنتاج مصفوفات إشارات، فتحويلها للطريقة الأولى بيتطلّب إعادة كتابة حالة الشاشة.
والطريقة التانية ما عندهاش الشرط ده إطلاقًا.
core.products.view) ٤٠٣ الصامتcore.document_settings)الإنتاج مش بيرفض المفاتيح غير المعروفة. السِمة اللي بترفض موجودة في نقاط البيع بس — والإنتاج كله تحقّق لارافيل عادي.
وده بيقلب الخطر مش بيلغيه: أي مفتاح جديد أو متغيّر الاسم مش هيرفع خطأ — هيتساقط في صمت. ودي نفس عيلة العيب اللي صلّحناه النهاردة في اسم القسم بالإنجليزي.
| الحقل | الخطر |
|---|---|
مصدر التوريدfactory ≠ own |
factory معناها «غير معلَن — ارجع لعلم أمر التصنيع»، وown معناها «إجبارًا من المصنع حتى على أمر تصنيع للغير». جدول بيوحّدهم أو بيدّي القيمة الافتراضية own لصف فاضي بينقل مواد مملوكة للعميل إلى الإنتاج تحت التشغيل ويرحّل قيودًا ما كانش المفروض توجد. |
| مالك السطر = ٠ | صفر رمز مقصود مش قيمة فاضية: null = تقسيم تلقائي · 0 = إجبار «مملوك» · >0 = عميل. جدول بيبعت ٠ لخانة رقمية فاضية بيجبر كل السطور على «مملوك» ويسرّب مواد العميل. |
| وحدة سطر الصرف | السيرفر بيتجاهل اللي الواجهة بعتته ويكتب وحدة المادة المخططة. إضافة منتقي وحدة للسطر بتكسر التطابق ده وتوجّه كل صرف لفرع التحويل — واللي بدوره بيأثّر على فواتير رسوم التصنيع. |
| التكاليف | محسوبة مش مُدخَلة — التكلفة المخططة بتتحسب من قائمة التصنيع والإجماليات بتتجمّع. عمود تكلفة قابل للتعديل بيكتب رقمًا السيرفر بيناقضه. |
مسار حفظ المواد اليدوي ما بيشغّلش محلّل الملكية ولا بيطبّق الهالك ولا نسبة الدفعة — ده بيحصل في مسار قائمة التصنيع بس.
النهاردة الشاشة ما بتبعتش مواد (تبويب المواد للقراءة)، فالفخ نايم.
وأي تحويل بيخلّي الشبكة دي قابلة للتعديل هيوقّظ مسارًا بلا حل للملكية — مصدر التوريد بياخد own، وكميات العميل تفضل صفر، وأوامر التصنيع للغير بترحّل موادها على الإنتاج تحت التشغيل.
| العيب | الأثر |
|---|---|
| التحجيم بيفشل جوّه النوافذ | المكوّن المشترك بيدوّر على العمود بطريقة بترجع فاضية جوّه نافذة منبثقة فالتحجيم ما بيعملش حاجة. النسخة التانية (أذون الصرف) صلّحت ده والإصلاح ما اتنقلش. يمسّ الـ١٢ شاشة اللي جداولها في نوافذ. |
| حفظ صامت الفشل | مستخدم معاه صلاحية عرض الإعدادات بس بيشوف المقابض ويسحب — والحفظ بيترفض ٤٠٣ والخطأ بيتبلع. الشكل بيتغيّر قدامه ويرجع بعد التحديث. |
| عمود مخفي بيضيع من الترتيب | سحب وأي عمود مخفي ⇒ مفتاحه بيتشال من الترتيب ويروح لآخر الصف لما يظهر. موثَّق في الكود كعيب قائم ومتصلَّح لعمود واحد بس. |
| # | المنتج | الكمية | الوحدة | الهالك % | نوع الصرف | مستوى الصرف | تسلسل | تكلفة/وحدة | مصدر التوريد | كمية العميل | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | باراسيتامول خام | 120 | كجم | 2 | يدوي | لكل أمر | 10 | 48.00 | مصنع | — | 🗑 |
| 2 | نشا ذرة | 15 | كجم | 1 | مرتجع | لكل أمر | 10 | 12.00 | عميل | 0.5 | 🗑 |
| # | ⣿المنتج | ⣿الكمية | ⣿الوحدة | ⣿الهالك % | ⣿مصدر التوريد | ⣿تكلفة/وحدة | نوع الصرف مخفي | |
|---|---|---|---|---|---|---|---|---|
| 1 | باراسيتامول خام أكتيو فارما | 120 | كجم | 2 | مصنع | 48.00 | — | 🗑 |
| 2 | نشا ذرة ميد وان | 15 | كجم | 1 | عميل | 12.00 | — | 🗑 |
| المنتج | الفترة | الكمية | المصدر | |
|---|---|---|---|---|
| أوجمنتين | 2026-09 | 500 | توقّع | 🗑 |
| بانادول | 2026-09 | 1200 | أمر بيع | 🗑 |
| ⣿المنتج | ⣿الفترة | ⣿الكمية | ⣿المصدر | |
|---|---|---|---|---|
| أوجمنتين ميد وان | 2026-09 | 500 | توقّع | 🗑 |
| بانادول جلاكسو | 2026-09 | 1200 | أمر بيع | 🗑 |
المرحلة صفر مش اختيارية. شغل الأعمدة فوق مسار حفظ مكسور هيبان إنه سبب عيبًا هو بس كشفه — والمنتقي اللي بيرجع فاضي هياخد اللوم على التوحيد.
| WP | النطاق | المستودع | الإثبات |
|---|---|---|---|
| WP1 | حفظ مكوّنات وعمليات قائمة التصنيع — إما توجيه الشاشة لمدخل المزامنة الموجود، أو إعلان المصفوفتين في طلب التعديل. ومعاها تحميل البدائل في show() وإلا الدورة الكاملة بتمسحهم. | BE+FE | أحمر قبل أخضر: اختبار يعدّل مكوّنًا ويثبت إنه ما اتغيّرش النهاردة، ثم يتغيّر بعد الإصلاح. |
| WP2 | صلاحية core.products.view لأدوار الإنتاج — مع migration جسر (السيدر مستثنى من التحديث، فالإضافة فيه بس بتفضل ميتة على كل العملاء). | BE | اختبار: دور إنتاج يفتح البحث ويرجّع نتايج. |
| WP | النطاق | المستودع | ملاحظات |
|---|---|---|---|
| WP3 | البحث والتطوير → البحث المشترك (موضعين). بيشيل تحميل الكتالوج كامل وبيقفل مصيدة الحجم، وبيخلّي الادعاء «كل الإنتاج على البحث المشترك» صحيحًا ١٠٠٪. | FE | أرخص مكسب في الخطة |
| WP4 | نقل إصلاح التحجيم داخل النوافذ من النسخة التانية للمكوّن المشترك. | FE | يمسّ ١٢ شاشة شغّالة — بره الإنتاج |
| WP5 | إصلاح الحفظ الصامت الفشل — مستخدم بلا صلاحية تعديل ما يشوفش المقابض، أو الفشل يترفع كرسالة. | FE | يمسّ ١٤ شاشة |
| WP | النطاق | المستودع | ملاحظات |
|---|---|---|---|
| WP6 | قوائم التصنيع — المكوّنات تاخد آلية الأعمدة فوق جدولها (مش المكوّن المشترك). أوسع وأكثر جدول استخدامًا، وفيه ٣ أعمدة ما بيحتاجهاش غير المستخدم المتقدّم. | FE | ده اللي طلبته بالظبط |
| WP7 | الخطة الرئيسية → المكوّن المشترك (تحويل من إشارات لـFormArray). إثبات المفهوم — أرخص جدول شكله مستند. | FE | |
| WP8 | الأمانات — الاستلام → المكوّن المشترك. | FE | |
| WP9 | التوجيه · شهادات التحليل · صرف مواد الأوامر → آلية الأعمدة فوق جداولها. | FE | التوجيه محتاج نوع خلية منطقية لو اتحوّل بالكامل — مش مطلوب هنا |
توصيتي: المرحلة صفر أولًا. تعديل مكوّنات قائمة التصنيع مش بيتحفظ النهاردة، والمنتقي بيرجع فاضي لكل أدوار الإنتاج. لو عملنا الأعمدة فوق ده، أول ما تجرّب هتقول «التعديل بوّظ الشاشة» — وهو كان بايظ قبلها.
توصيتي: آلية الأعمدة فوق جدولها. المكوّن المشترك مبني حوالي سعر وضريبة وإجمالي — وقائمة التصنيع مالهاش ولا واحد فيهم — وفيها صف بدائل موسَّع والمكوّن مالوش دعم توسيع. إضافة الدعم ده هتغيّر قالبًا بتستخدمه ١٢ شاشة شغّالة. والنتيجة للمستخدم واحدة بالظبط: نفس السحب ونفس التحجيم ونفس الحفظ.
خطة يونيو قرّرت الشركة للمستندات — منطقي لأن كتبة كتير بيدخلوا نفس الفاتورة. لكن قائمة التصنيع بيانات أساسية بيعدّلها ٢–٣ مهندسين، والترتيب المفضّل شخصي أكتر. توصيتي: نفضل على «الشركة» — الاتساق أهم، والحفظ لكل مستخدم مش موجود في النظام أصلًا وبناؤه شغل مستقل.
توصيتي: أيوه، وقبل شغل الإنتاج. التحجيم على الأرجح مش شغّال في أي جدول جوّه نافذة النهاردة، والحفظ بيفشل صامتًا لمستخدم صلاحياته عرض بس. لو دخلنا الإنتاج قبلهم، هنبني فوق آلية فيها عيبين معروفين.
توصيتي: لأ، مش في النطاق ده. هي للقراءة النهاردة، ومسار الحفظ اليدوي بتاعها ما بيحلّش الملكية ولا بيطبّق الهالك. تخليتها قابلة للتعديل بتوقّظ مسارًا نايمًا بيرحّل مواد العميل على حساب المصنع. لو محتاجها فعلًا، تبقى تحليلًا مستقلًا مالي.
اللي طلبته موجود ومجرَّب على ١٤ شاشة — سحب وتحجيم وإخفاء، محفوظين على مستوى الشركة. والإنتاج برّه لأن خطة يونيو أجّلته صراحةً وقالت «يُقيَّم منفصل» — وده التقييم. والتكلفة أقل مما تتصور: الشاشة بتاخد السحب والتحجيم بمجرد تمرير مفتاح مستند — التسجيل مطلوب للإخفاء بس.
لكن الشاشة اللي سمّيتها مكسورة من تحت: تعديل المكوّنات ما بيتحفظش إطلاقًا — الواجهة بتبعت للمدخل الغلط والسيرفر بيرمي المصفوفتين في صمت، ومفيش اختبار بيغطّي ده. ومنتقي المنتجات بيرجع فاضي لكل أدوار الإنتاج لأن ولا دور فيهم معاه صلاحية عرض المنتجات — والرفض ٤٠٣ بيتبلع بلا رسالة.
فالترتيب اللي أوصي بيه: صلّح الحفظ والصلاحية (مرحلة ٠) → وحّد البحث في الشاشة الشاذّة وانقل إصلاحين في الطبقة المشتركة (مرحلة ١) → وبعدين التحكم في الأعمدة (مرحلة ٢)، وأولها قائمة التصنيع اللي إنت طلبتها.
تحليل المرحلة ١ — مفيش كود ولا migration اتكتب · تلات مسارات تدقيق متوازية · ٤ أغسطس ٢٠٢٦ · moonui2 · hazemdev2
مستنّي موافقتك على النطاق والترتيب قبل أي تنفيذ.