تصوّر قبل التنفيذ — قيد التطوير على dev

التحويل المخزني يأخذ الأمانات واللوطات في الحسبان

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

❌ المشكلة الحالية

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

مخزن امنه · أمانة العميل ◀── نقل ── مخزن رئيسي · شركة

مثال حقيقي على prod (TRF-000001، نقل 2 قطعة): لوت الأمانة في المصدر ما اتخصمش (فضل 200 والفعلي 198)، ماتعملش لوت في الوجهة، حركة النقل batch=NULL، وسجل الأمانة فضل 200 من غير سطر للمخزن الجديد ← قطعتان من بضاعة العميل بقوا بلا هوية ملكية.

🧭 السبب الجذري (سطر واحد)

إجراء الشحن ShipTransfer بيخصّص لوطات بملكية الشركة فقط:

'owner_partner_id' => InventoryLotBalance::OWNER_COMPANY

فلوطات الأمانة (owner ≠ 0) مبتتخصمش أبدًا، ومبيتكتبش أي تخصيص، وبالتالي إجراء الاستلام ReceiveTransfer — اللي أصلاً بيحفظ المالك عند إعادة بناء لوت الوجهة — مبيلاقيش حاجة يعيد بناءها.

✅ الحل — التصوّر

1
الشحن (ShipTransfer): يخصّص من كل الملّاك اللي عندهم لوطات في مخزن المصدر — الشركة أولًا ثم الأمانة — بالترتيب لحد ما يغطّي الكمية المطلوبة، ويحفظ مالك كل لوت في التخصيص. (منطق: نصرف مخزوننا قبل بضاعة العميل؛ ومخزن الأمانة الخالص بيشحن لوت العميل طبيعيًا.)
2
الاستلام (ReceiveTransfer): مش محتاج تعديل جوهري — هو أصلاً بيقرأ تخصيصات الشحن ويعيد بناء لوت الوجهة بنفس owner · batch · expiry · on_book. أول ما الشحن يخصّص لوطات الأمانة، الاستلام هيعيد بناءها في الوجهة بملكية العميل تلقائيًا.
3
سجل الأمانة: عند نقل لوطات أمانة، يتزامن سجل الأمانة — رصيد مخزن المصدر ينقص بالكمية، ورصيد مخزن الوجهة للعميل يزيد (يتعمل سطر جديد لو مش موجود). من غير أي قيد محاسبي (GL) — نقل بضاعة عميل مش عملية مالية. وتسوية «دفتر مقابل فعلي» تفضل مظبوطة.
4
الإلغاء (CancelTransfer): يعكس الاتنين — يرجّع لوطات المصدر لكل الملّاك ويعكس حركة سجل الأمانة. (التحويل المُستلَم مايتلغاش — بس المشحون-غير-المستلَم.)

🔁 قبل وبعد (على سيناريو TRF-000001: نقل 2 قطعة أمانة)

المؤشّرقبل التعديل (الحالي)بعد التعديل (المتوقّع)
لوت الأمانة في المصدر (wh2)200 (لم يُخصَم)198 (خُصم 2)
لوت أمانة للعميل في الوجهة (wh1)لا يوجدسطر جديد بـ2، نفس المالك/الدفعة/الصلاحية
تخصيص لوطات للتحويل0مسجّل بمالك = العميل
batch على حركة النقلNULLCONS-1-… (محفوظ)
سجل الأمانةwh2=200 فقط (خطأ)wh2 ينقص 2 · wh1 يزيد 2
ملكية العميلضاعتمحفوظة عبر المخازن

❌ دلوقتي

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

✅ بعد التعديل

بضاعة العميل تفضل «بضاعته» في أي مخزن تروح له — اللوت والملكية والدفعة والصلاحية محفوظين، والجرد والإرجاع والتقييم يطلعوا صح.

📐 النطاق

تصوّر قبل التنفيذ · التطوير جارٍ على dev · لم تُعدَّل أي بيانات إنتاج.