تحصيل دفعة معمل خارجي — مع اختيار الفواتير (Collect)

المعمل يبعت مبلغ (مثلاً 5000)، والمستخدم يختار أنهي فواتير المبلغ ده بيسدّدها — بدل التوزيع التلقائي. دراسة الوضع وخطة التنفيذ للموافقة قبل البدء.

الصفحة: /lab/external-labs  •  الموديول: LIS B2B Payments  •  دراسة — لا تنفيذ بعد

1 الوضع الحالي

دلوقتي في صفحة المعامل الخارجية فيه dialog دفع — المستخدم بيدخل المبلغ + طريقة الدفع + حساب الاستلام بس.

التوزيع تلقائي (FIFO) — مفيش اختيار

RecordExternalLabPayment بياخد المبلغ ويوزّعه تلقائياً على الفواتير الأقدم أولاً (FIFO) لحد ما يخلص. المستخدم مش بيشوف ولا بيختار أنهي فواتير اتسدّدت. التوزيع بيتسجّل في lab_external_lab_payment_allocations، والقيد: DR حساب الاستلام / CR ذمم المعمل.

2 المطلوب

زرار «Collect / تحصيل» → المستخدم يدخل المبلغ، وبعدين يختار من قائمة الفواتير المفتوحة أنهي فواتير المبلغ ده بيسدّدها (كل أو جزء).

💰 تحصيل من: dr.wafaa tolba clinic — المبلغ: 5000 · المستحق: 7200
LI-2026-00281 · 01-06 · رصيد 172.50172.50
LI-2026-00284 · 03-06 · رصيد 3000.003000.00
LI-2026-00290 · 05-06 · رصيد 2000.00 (جزئي)1827.50
LI-2026-00295 · 06-06 · رصيد 2200.000.00
المخصّص5000.00 ✓

المستخدم يحدّد الفواتير، والمبلغ المخصّص لازم يساوي مبلغ الدفعة (مع سماح بسداد جزئي لآخر فاتورة).

3 الحل المقترح

① زرار Collectيدخل المبلغ + طريقة الدفع
② قائمة الفواتير المفتوحةرقم/تاريخ/رصيد لكل فاتورة
③ يختار + يوزّعتحديد + مبلغ لكل فاتورة
④ تحصيلقيد + الفواتير تتقفل

الباك إند (BE)

الفرونت (FE)

4 القيد المحاسبي (مش بيتغيّر)

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

الحسابمديندائن
الخزينة / البنك (حساب الاستلام)5000
ذمم معمل خارجي — dr.wafaa5000

والفواتير المختارة balance_due بتاعها بيقلّ بالمبلغ المخصّص، واللي تتسدّد بالكامل حالتها تبقى «مدفوعة».

5 قرارات محتاجينها قبل البدء

  1. الافتراضي: الـdialog يفتح بـالتوزيع التلقائي (FIFO) جاهز والمستخدم يعدّل، ولا يفتح فاضي ويختار من الأول؟
  2. سداد جزئي: نسمح يخصّص مبلغ أقل من رصيد فاتورة (سداد جزئي)، ولا لازم فاتورة كاملة بس؟
  3. الفواتير ولا المطالبات الشهرية: يختار من الفواتير المفردة، ولا من المطالبات الشهرية (الـB2B بيجمّع شهري)؟
  4. لو المبلغ أكبر من المستحق: نرفض، ولا نسجّل الزيادة كـ«رصيد دائن» للمعمل؟ (دلوقتي بيرفض الزيادة.)

6 خطة التنفيذ

  1. 1BE — قائمة الفواتير المفتوحة. endpoint يرجّع فواتير المعمل المفتوحة (رقم/تاريخ/إجمالي/رصيد).
  2. 2BE — التوزيع اليدوي. RecordExternalLabPayment يقبل allocations[] + تحقّق، مع الحفاظ على FIFO كـافتراضي لو مفيش اختيار.
  3. 3FE — Dialog التحصيل. زرار Collect + جدول الفواتير بـcheckbox/مبلغ + عدّاد + زرار «وزّع تلقائي».
  4. 4اختبار. دفعة 5000 على 3 فواتير (واحدة جزئية) → القيد صح + الأرصدة + الحالات تتحدّث.

المكسب

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