تحليل المرحلة ١ — بلا كود · implement-research

أرصدة المخزون · كارت الصنف · فلاتر المنتجات

أربع نقاط طلبتها: عمود اسم العميل صاحب المنتج في الأرصدة (مع بحث وفلتر) · طباعة حركات كارت الصنف · عمود يوصّل من الحركة لأمر الإنتاج أو تاج التشغيل مباشرة بدل إذن الصرف · وإصلاح فلاتر شاشة المنتجات.
التلاتة الأولانية كلها ممكنة والبيانات موجودة فعلًا — والرابعة عيب سببه سطر ناقص واحد، لقيته ومؤكَّد. فيه اشتباك تسمية واحد لازم تحسمه قبل ما نبدأ.

٤ نقاط · ٦ حزم أنواع مصدر الحركة: ~٢٨ ٦ أغسطس ٢٠٢٦ · moonui2 · hazemdev2 الحالة: مستنّي موافقتك

١ المشكلة

  1. أرصدة المخزون — لما يكون للصنف «عميل صاحب المنتج» (عميل تصنيع)، مفيش عمود بيوريه، ولا بحث عليه ولا فلتر بيه.
  2. كارت الصنف (/core/stock-card/{id}) — الحركات مش ممكن تتطبع.
  3. عمود المصدر في الحركات — لما الصرف يكون على أمر إنتاج أو تاج تشغيل، الشاشة بتوريك إذن الصرف وبتوصّلك لشاشة أذون الصرف. إنت عايز اسم أمر الإنتاج / التاج نفسه ولينك يوديك عليه مباشرة.
  4. فلاتر شاشة المنتجات مش شغّالة — الفلتر بالعميل تحديدًا.

٢ الوضع الحالي — بالكود والبيانات

٢-١ الخبر الحلو: سلسلة المصدر موجودة في البيانات بالفعل

قرأت moonui2_dev_be مباشرة. الصنف اللي إنت ضربته مثال (17139 — خام بودرة ميلامين):

نوع المصدر على الحركةالعددوبعدين؟
inventory_issue7السبعة كلهم على أوامر إنتاج (GDN-000014 → أمر 16، GDN-000016 → أمر 28 … إلخ)
sales_invoice8فاتورة بيع
inventory_receipt2إذن استلام
opening1رصيد افتتاحي

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

وعلى مستوى الشركة كلها، inventory_issues.reference_type بياخد ٣ قيم فعليًا:

أمر إنتاج
20
بيع
20
تاج تشغيل
3

٢-٢ «تاج التشغيل» كيان حقيقي — ومش أمر إنتاج

جدول inventory_issue_tags. عندك دلوقتي تاجين: «امر انتاح111» و«اورد 1». وتعليق الكود صريح جدًا في وصفه: لافتة تشغيلية بحتة — مش أمر إنتاج ومش مركز تكلفة؛ مالوش حساب ولا قيمة ولا أي ربط بالقيود. والدليل السلوكي: إذن صرف على تاج ما بيعملش MfgMaterialIssue، وما بيرحّلش على الإنتاج تحت التشغيل، وما بيفكّش أي حجز.

يعني الاتنين لازم يتعاملوا مختلف: أمر الإنتاج ليه رقم (order_number) وشاشة يروح لها؛ التاج ليه اسم بس وشاشة قايمة.

ولاحظ: ProductionOrder مالوش عمود اسم — المعرّف الوحيد هو order_number (زائد اسم المنتج المُنتَج اختياريًا). فـ«الاسم» اللي هيظهر لأمر الإنتاج = رقمه.

ومفيش كيان «أمر شغل» تصنيعي أصلًا — الـWorkOrder الوحيد في النظام بتاع الصيانة (CMMS) وما بيعملش أي حركة مخزون.

٢-٣ عمود المصدر موجود في كارت الصنف — بس بيوقف عند المستند

الشاشة فيها عمود «المصدر» فعلًا، بيترجم reference_type عبر خريطة ثابتة (stock-card.component.ts:56-66) ويعمل router.navigate([route], {queryParams:{viewId}}). فالحركة اللي مصدرها inventory_issue بتوديك على شاشة أذون الصرف — وده بالظبط اللي إنت مش عايزه.

وكمان اللينك مبني كـ<a (click)=…> مش routerLink — يعني مش ممكن تفتحه في تبويب جديد ولا تنسخ رابطه.

٢-٤ الحركة نفسها «مرجع بالاتفاق» مش علاقة

inventory_movements فيه reference_type (نص عادي) وreference_id (رقم) — من غير مفتاح أجنبي، ومن غير أي علاقة معرّفة على الموديل، ومن غير enum ولا خريطة تسميات (بعكس أنواع الإذن والاستلام اللي ليهم enum مترجَم).

وأخطر تفصيلة: مجموعة الأنواع ~٢٨ قيمة، ومعنى الرقم مش موحّد:

النوعالرقم بيشاور على
inventory_issue / receipt / adjustment / transfer …معرّف المستند (الأغلبية)
production_order · production_stagingمعرّف أمر الإنتاج مباشرة — خطوة واحدة بس!
consignment_receipt · consignment_returnمعرّف العميل (شريك تجاري) — مش مستند
*_cancelمعرّف المستند الأصلي، مش مستند إلغاء

النتيجة: أي حلّ عام لازم يتعامل مع كل نوع على حدة. اللي يفترض «الرقم ده مستند» هيوصّل المستخدم لصفحة غلط في حالة الأمانات.

وفيه مسار قصير موجود خلاص

مش كل استهلاك إنتاج بياخد خطوتين: الـbackflush بيكتب الحركة مباشرة بـreference_type='production_order' وreference_id = معرّف الأمرخطوة واحدة. وكذلك production_staging. فالسلسلة الطويلة (خطوتين) هي حالة الصرف اليدوي بس.

٢-٥ أرصدة المخزون — واشتباك التسمية

⚠️ الشاشة فيها «مالك» بالفعل — بس مالك تاني خالص

المفهوممصدرهمعناه
عدسة المالك (الموجودة)inventory_lot_balances.owner_partner_idمالك الكمية الفعلية — بضاعة أمانة محفوظة لعميل، خارج دفاتر الشركة
عميل التصنيع (المطلوب)products.toll_customer_idالعميل صاحب تعريف الصنف في الكتالوج

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

يعني لو حطّينا عمود اسمه «العميل» جنب عدسة «المالك»، هيبقى في الشاشة مفهومين مختلفين بنفس الكلمة. ده قرار رقم ١ في §٩.

وباقي الوضع في شاشة الأرصدة: الاستعلام مش بيمرّ على ProductService::search() إطلاقًا — الكنترولر بيبني استعلامه بنفسه. والبحث بيغطي ٤ أعمدة بس (name, name_ar, code, sku). والـResource مافيهوش toll_customer_id ولا اسم العميل. والشاشة مالهاش تحكم في الأعمدة (لا سحب ولا تحجيم).

٢-٦ الطباعة — مفيش، لكن فيه ٣ أنماط جاهزة في النظام

النمطمستخدم فيمناسب لكارت الصنف؟
PrintService + قوالب~٣٠ شاشة مستندات (فواتير، أذون، سندات)لأ — ده لطباعة مستند بقالب وشعار، والكارت تقرير
window.print() + @media printكشف حساب عميل · كشف مورّد · حركة النقدية · BMR · إشعار إرجاع الأماناتأيوه — ده النمط المطابق، ومستخدم في كل شاشات الكشوف
ExportService (Excel/PDF)تقارير المخزون · جداول app-data-tableإضافة كويسة، بس مش «طباعة»

مفيش أي مدخل /inventory/*/print على السيرفر — الطباعة من جهة السيرفر موجودة لسندات ومستندات مبيعات بس.

٢-٧ فلاتر المنتجات — السبب الجذري

🔴 الفلتر بالعميل ما بيتبعتش للسيرفر أبدًا مؤكَّد

// products.component.ts:2573  buildFilters()
if (this.filterTollCustomer) f.toll_customer_id = this.filterTollCustomer;   // ✅ بيتحطّ

// product.service.ts:77  list()  — بتقرا ٦ مفاتيح بس:
search · type · status · product_category_id · is_active · track_inventory
//                          ❌ toll_customer_id مش واحد منهم — القيمة بتتبخّر

السيرفر مش هو المشكلة: ProductService::search() بيدعم toll_customer_id=<id>|own تمامًا، وtollCustomer محمّل مسبقًا فمفيش N+1، والـResource بيطلّع toll_customer_name خلاص.

يعني الفلتر بيبعت طلب مطابق حرفيًا لحالة «بدون فلتر» — عشان كده شكله بيشتغل والنتيجة ما بتتغيّرش، والعدّاد بيفضل بيقول العدد الكلي.

ومن كوميت الميزة نفسها: الديف ضاف الحقل للـinterface بس — جسم list() ما اتلمسش.

ولمّا فتحنا الشاشة لقينا مش فلتر واحد — ١٠ مشاكل

#المشكلةالأثر
1toll_customer_id ما بيتبعتشالفلتر ميّت تمامًا — ده اللي بلّغت عنه
2البحث بيطلب مع كل حرف — بلا تأخير وبلا switchMapطلب لكل حرف، وردّ قديم ممكن يوصل متأخر ويرسم نتيجة بحث سابق. شاشة الأرصدة بتأخّر ٤٠٠ms — دي الشاذّة
3تحميل مزدوج عند الفتحطلبين بدل واحد؛ شاشة الأرصدة عندها حارس لده والمنتجات لأ
4عرض الشجرة بيتجاهل كل الفلاترتحوّل للشجرة فتلاقي كل حاجة ظهرت من غير أي إشارة
5الطباعة/التصدير على الصفحة الظاهرة بس«اطبع كل أصناف العميل ده» = بيطبع ٢٥ صف عشوائي
6البحث جوّه القوائم بيدوّر في غير المعروضقايمة العميل بتعرض display_label وبتدوّر في name,name_ar,prefix — تكتب اللي شايفه فما يطلعش. ونفس الحاجة في قايمة التصنيفات
7مفيش حفظ للفلاترتحديث الصفحة = كل الفلاتر اتصفّرت. ولا لينك بيتنسخ
8آلية بحث موازية ميتة لسه في الكودلو حد ربطها بأي مربع بحث هتتجاهل ٣ فلاتر في صمت وتستبدل الجدول كله. لغم نايم
9حراسة القيم بالـ«صدق» مش بالوجودأي قيمة تساوي صفر بتتشال. مش قابلة للحصول دلوقتي، بس مختلفة عن شاشة الأرصدة اللي بتستخدم != null عمدًا
10brand_id مدعوم على السيرفر وغير مستخدَمفلتر ماركة مجاني لو حبيت

٣ المطلوب

  1. عمود اسم العميل صاحب المنتج في أرصدة المخزون + البحث عليه + الفلتر بيه.
  2. طباعة حركات كارت الصنف.
  3. عمود يعرض اسم أمر الإنتاج / تاج التشغيل ويوصّل عليه مباشرة، مش على إذن الصرف.
  4. فلاتر شاشة المنتجات تشتغل — خصوصًا الفلتر بالعميل.

٤ الفجوة

الطلبالموجودالناقصالحكم
عمود العميل في الأرصدة العلاقة موجودة على المنتج · الـResource بتاع المنتجات بيطلّع الاسم خلاص تحميل مسبق + حقلين في StockBalanceResource + فلتر + إضافة العميل لجملة البحث سهل — مع حسم اسم العمود (قرار ١)
طباعة الحركات مفيش أي طباعة على الكارت · نمط الكشوف جاهز ومستخدم في ٥ شاشات زرار + كتلة @media print + قرار «نطبع إيه بالظبط» سهل — نتبع نمط كشف الحساب
لينك المصدر المباشر البيانات كاملة · عمود المصدر موجود · نمط الحلّ المجمّع بلا N+1 موجود على نفس المدخل (كتلة التشغيلات) مُحلِّل مصدر على السيرفر يقطع الخطوة التانية ويرجّع (نوع · اسم · رقم · وجهة) + تعديل العمود في الواجهة متوسط — التعقيد في تعدّد الأنواع مش في الإنتاج
فلاتر المنتجات السيرفر بيدعم كل حاجة ومحمّل مسبقًا سطر واحد في list() — زائد ٩ مشاكل تانية مكتشفة الإصلاح الأساسي سطر واحد

٥ الملفات والاعتماديات

الباك-إند

  • Inventory/…/StockBalanceController.php index · companyTotals
  • Inventory/…/Resources/StockBalanceResource.php
  • Inventory/…/StockCardController.php نمط الحلّ المجمّع هنا
  • Inventory/…/Resources/InventoryMovementResource.php
  • Inventory/…/Models/InventoryMovement.php بلا علاقات مصدر
  • Inventory/…/Models/InventoryIssue.php jobTag() موجودة
  • Inventory/…/Resources/InventoryIssueResource.php السابقة تُحتذى
  • Inventory/…/Enums/IssueReferenceType.php
  • Inventory/lang/{en,ar}/inventory.php مفاتيح ترجمة جديدة
  • Core/…/Models/Product.php tollCustomer()

الفرونت-إند

  • features/stock-balances/stock-balances.component.{ts,html}
  • features/stock-card/stock-card.component.{ts,html,scss}
  • features/products/products.component.{ts,html}
  • core/services/product.service.ts سطر العيب
  • core/services/stock-balance.service.ts
  • core/models/inventory.model.ts StockBalance · StockCardEntry
  • assets/i18n/{ar,en}.json ⛔ إضافة فقط

اعتماديات لازم تتحسب:

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

الحالةالمعالجة
صنف بلا عميل تصنيع (الأغلبية الساحقة)الخلية شرطة «—». على moonui2 فيه منتجين بس من ١٧١٦٦ عندهم عميل — والصنف اللي ضربته مثال مش منهم. العمود هيبان فاضي هنا؛ البيانات المليانة على prod.
حركة أمانات (consignment_receipt/return)رقم المرجع = عميل مش مستند. المُحلِّل لازم يعرض اسم العميل ولا يحاول يفتح مستند.
حركة إلغاء (*_cancel)الرقم بيشاور على المستند الأصلي — يتعرض بعلامة «ملغي» ويوصّل للأصل.
backflush / stagingأمر الإنتاج مباشرة بخطوة واحدة — المُحلِّل لازم يمسك الحالتين (خطوة وخطوتين).
إذن صرف على تاج تشغيليعرض اسم التاج، ويوصّل لشاشة التاجات. مايتعرضش كأمر إنتاج — مالوش قيود ولا إنتاج تحت التشغيل.
الجردما بيعملش حركة بنفسه — بيظهر كتسوية. أمر الجرد على بُعد ٣ خطوات. أنصح نقف عند التسوية في المرحلة دي.
مستند اتمسح (soft delete)مفيش مفتاح أجنبي على المرجع — المُحلِّل لازم يتحمّل مرجع ميّت ويرجّع الرقم الخام بدل ما يقع.
مرجع من شركة تانيةالمرجع بالاتفاق مش بيعبّر عن نطاق الشركة — كل حلّ لازم يفلتر بالشركة صراحةً (السابقة الموجودة بتعمل كده في الذاكرة).
الطباعة والفترةالكارت بيفتح على الأسبوع الحالي افتراضيًا والجدول مقسّم ٢٥ صف. الطباعة لازم تطبع كل الحركات المحمّلة والفترة تتكتب في الترويسة — وإلا هتطبع أسبوع وإنت فاكرها كل التاريخ.
الاتجاه والطباعةالصفحة RTL — قوالب الطباعة الموجودة بتتعامل مع ده؛ نتبعها ولا نخترع.
N+1التحميل المسبق للعميل = استعلام واحد إضافي للصفحة. ومُحلِّل المصدر يتعمل مجمّع للصفحة كلها على نمط كتلة التشغيلات الموجودة على نفس المدخل.

٧ معاينة الواجهة — قبل / بعد

٧-١ كارت الصنف — عمود المصدر (قلب الطلب)

قبل المصدر = إذن الصرف، واللينك بيودّي على شاشة أذون الصرف
كارت صنف — خام بودرة ميلامين (PRD-17137)الأسبوع الحالي ▾
التاريخالحركةالمخزنواردمنصرفالرصيدالمصدر
2026-07-28صرفالخام1201,880GDN-000014
2026-07-29صرفالخام801,800GDN-000016
2026-07-30واردالخام5002,300GRN-000009
⚠ مفيش زرار طباعة · واللينك بيودّي على أذون الصرف مش على أمر الإنتاج
بعد عمود «المصدر المباشر» جديد + زرار طباعة — والعمود القديم يفضل للمستند
كارت صنف — خام بودرة ميلامين (PRD-17137) 🖨 طباعة الحركات الأسبوع الحالي ▾
التاريخالحركةالمخزنواردمنصرفالرصيد المصدر المباشر ★المستند
2026-07-28صرفالخام1201,880 أمر إنتاج MO-000016GDN-000014
2026-07-29صرفالخام801,800 أمر إنتاج MO-000028GDN-000016
2026-07-31صرفالخام401,760 تاج تشغيل امر انتاح111GDN-000046
2026-07-30واردالخام5002,300 GRN-000009
أمر إنتاج → يفتح الأمر · تاج تشغيل → يفتح التاج بالاسم · أمانة → يعرض اسم العميل بلا لينك مستند
اللينكات بقت routerLink — تنفع تتفتح في تبويب جديد وتتنسخ

٧-٢ أرصدة المخزون — عمود العميل

قبل مفيش أي إشارة لصاحب الصنف
أرصدة المخزون🔍 بحث · المخزن ▾ · التصنيف ▾ · المالك ▾
الكودالصنفالمخزنالوحدةالرصيدمتوسط التكلفةالقيمة
RXP-00015Rxobronex Labelالخامقطعة4,0000.8503,400
PRD-17137خام بودرة ميلامينالخامكجم1,76012.40021,824
بعد عمود «عميل التصنيع» + الفلتر بيه + البحث بيطابق عليه
أرصدة المخزون 🔍 ميد وان · المخزن ▾ · التصنيف ▾ · المالك (أمانة) ▾ · عميل التصنيع ▾
الكودالصنفعميل التصنيع ★المخزنالوحدةالرصيدمتوسط التكلفةالقيمة
RXP-00015Rxobronex Labelميد وان فارماالخامقطعة4,0000.8503,400
PRD-17137خام بودرة ميلامينالخامكجم1,76012.40021,824
لاحظ الفلترين المنفصلين: «المالك (أمانة)» = مين مالك الكمية فعليًا · «عميل التصنيع» = مين صاحب تعريف الصنف. مفهومين مختلفين — قرار ١

٧-٣ طباعة الحركات

جديد نفس نمط كشف حساب العميل — الفلاتر بتختفي، الترويسة بتوضّح الفترة
كارت صنف — خام بودرة ميلامين (PRD-17137)
الفترة: 2026-07-28 → 2026-08-04 · المخزن: كل المخازن · الرصيد الافتتاحي: 2,300
التاريخالحركةالمصدر المباشرواردمنصرفالرصيد
2026-07-28صرفأمر إنتاج MO-0000161201,880
2026-07-31صرفتاج تشغيل — امر انتاح111401,760
إجمالي الوارد 500 · إجمالي المنصرف 240 · الرصيد الختامي 1,760

٧-٤ فلاتر المنتجات — نفس الشكل، بس بتشتغل

قبل تختار العميل ومفيش حاجة بتحصل
🔍   · التصنيف ▾ · النوع ▾ · ميد وان فارما ▾ · الحالة ▾
النتائج: 17,166 — نفس الرقم بالظبط قبل وبعد اختيار العميل
بعد الفلتر بيوصل للسيرفر
🔍   · التصنيف ▾ · النوع ▾ · ميد وان فارما ▾ · الحالة ▾
النتائج: 478 — أصناف العميل ده بس، والعدّاد والصفحات متسقين معاها

٨ خطة التنفيذ

WPالنطاقالمستودعالإثبات
WP1
أولًا
إصلاح فلتر العميل في المنتجات — تمرير toll_customer_id في list(). أرخص وأوضح مكسب في الخطة. FEأحمر قبل أخضر: إثبات إن الطلب النهاردة بيخرج بلا الوسيط، وبيخرج بيه بعد الإصلاح.
WP2 باقي فلاتر المنتجات — تأخير + switchMap للبحث · منع التحميل المزدوج · filterBy يطابق المعروض · تمرير الفلاتر لعرض الشجرة أو تعطيلها بوضوح · حذف آلية البحث الميتة (اللغم). FEلكل بند: قبل/بعد بعدد الطلبات أو النتيجة.
WP3 مُحلِّل مصدر الحركة (سيرفر) — يرجّع لكل حركة {type, label, name, number, target}، مجمّع للصفحة على نمط كتلة التشغيلات الموجودة، بترجمة عربي/إنجليزي، ويغطي كل الأنواع الـ٢٨ مش الإنتاج بس. لازم يفلتر بالشركة صراحةً ويتحمّل مرجع ميّت. BEاختبارات لكل نوع: أمر إنتاج (خطوتين) · backflush (خطوة) · تاج · أمانة (عميل مش مستند) · إلغاء · مرجع ميّت.
WP4 عمود المصدر المباشر (واجهة) — يعرض النوع والاسم/الرقم ويوصّل بـrouterLink حقيقي (يفتح في تبويب). العمود القديم يفضل للمستند. FEيعتمد على WP3.
WP5 عمود عميل التصنيع في الأرصدة — تحميل مسبق + حقلين في الـResource + فلتر + إضافة العميل لجملة البحث + نفس الفلتر على بطاقة الإجماليات. BE+FEاختبار: البحث باسم العميل بيرجّع أصنافه · الإجمالي بيساوي مجموع القايمة المفلترة.
WP6 طباعة كارت الصنف — نمط كشف الحساب: زرار + @media print. الترويسة تكتب الصنف والفترة والمخزن، والطباعة تشمل كل الحركات المحمّلة مش الصفحة الظاهرة، وتحت إجماليات وارد/منصرف/ختامي. FEمعاينة طباعة على فترة فيها أكتر من ٢٥ حركة.

الترتيب مقصود: WP1 لوحده بيحلّ الشكوى الرابعة في جلسة قصيرة. وWP3 هو أثقل حزمة وكل قيمة الطلب التالت متوقفة عليها، فالأحسن تيجي بعد المكاسب السريعة.

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

١. الشاشة فيها «مالك» بالفعل — نسمّي الجديد إيه؟ لازم يتحسم قبل WP5

أرصدة المخزون فيها عدسة «المالك» = مالك الكمية (بضاعة أمانة). والمطلوب مالك تعريف الصنف (عميل التصنيع). مفهومين مختلفين وممكن يختلفوا في نفس الصف.

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

٢. عمود المصدر: نضيف عمود جديد ولا نغيّر الموجود؟

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

٣. الطباعة: صفحة طباعة، ولا تصدير Excel/PDF كمان؟

توصيتي: نبدأ بالطباعة (نمط كشف الحساب) في WP6. هي اللي طلبتها بالظبط، ونمطها موجود في ٥ شاشات. وتصدير Excel له آلية جاهزة في النظام لو حبيت نضيفه بعدين — بس ما نعملش الاتنين في نفس الحزمة.

٤. أمر الجرد على بُعد ٣ خطوات — نلاحقه؟

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

٥. الأرصدة مالهاش تحكم في الأعمدة — نضيفه؟

شاشة الأرصدة مش من الـ١٤ شاشة اللي عندها سحب/تحجيم الأعمدة اللي خلّصناها الأسبوع ده.

توصيتي: مش في الطلب ده. إنت طلبت عمود وبحث وفلتر — والتحكم في الأعمدة شغل مستقل بحجمه. لو عايزه، يتحط في الباك-لوج جنب باقي البنود.

الخلاصة

التلات طلبات الأولانية كلهم البيانات بتاعتهم موجودة فعلًا — العلاقة على المنتج، وسلسلة المصدر في الجداول، ونمط الطباعة في ٥ شاشات. مفيش حاجة محتاجة جدول جديد ولا عمود جديد في قاعدة البيانات.

وأثبتنا الطلب التالت بالبيانات نفسها: الصنف اللي ضربته مثال عنده ٧ حركات صرف — السبعة كلهم على أوامر إنتاج. الشاشة بتوريك ٧ أذون صرف بدل كده.

والرابع عيب سببه سطر واحد: الشاشة بتجهّز toll_customer_id والخدمة اللي بتبني الطلب ما بتقراهوش — فالفلتر بيبعت طلب مطابق لحالة «بدون فلتر». ولمّا فتحنا الشاشة لقينا ٩ مشاكل تانية في نفس الفلاتر، أخطرهم بحث بيطلب مع كل حرف من غير ترتيب للردود، وآلية بحث ميتة لو اترجعت هتلغي ٣ فلاتر في صمت.

وقرار واحد لازم تحسمه قبل ما نبدأ: شاشة الأرصدة فيها كلمة «مالك» مستخدمة خلاص لمعنى تاني (مالك بضاعة الأمانة). لو حطّينا «العميل» جنبها من غير تسمية صريحة، هنخلق التباس في شاشة أمين المخزن.

تحليل المرحلة ١ — مفيش كود ولا migration اتكتب · مسارَي تتبّع متوازيين + قراءة مباشرة لقاعدة البيانات · ٦ أغسطس ٢٠٢٦ · moonui2 · hazemdev2
مستنّي موافقتك على النطاق والترتيب والقرار الأول قبل أي تنفيذ.