تحليل الشق المحاسبي والمدفوعات في الـ Request

فحص دقيق للوضع الحالي + المشاكل المكتشفة + المتطلبات الجديدة. لسه مفيش كود اتنفّذ.

١. المطلوب (بكلامك)

  1. فحص دقيق للشق المحاسبي: طرق الدفع بتشتغل إزاي وإيه اللي بيحصل فعلاً.
  2. نخلي كارت الفيزا هو الافتراضي.
  3. العميل ممكن يدفع دفعة جزئية ويكمّل بعدين.
  4. العميل ممكن يدفع بـ طريقتين دفع في الفاتورة الواحدة (split payment).
  5. لو العميل عليه فلوس، ما ينفعش يعمل Release للتحاليل ويتبعت — على الأقل يحتاج كونفيرم من الأدمن.

٢. الوضع الحالي (الفحص الدقيق)

✓ دورة الفاتورة + الدفع على مستوى الـ Backend سليمة

BE: LabPaymentController::store() · PostLabPayment · LabInvoice (balance_due)

✓ شاشة المدفوعات (/lab/payments) بتسجّل دفعات لاحقة صح

بتبعت lab_invoice_id + payment_method بقيمها الصح (cash / visa / bank_transfer)، فالدفع المتأخّر على فاتورة قائمة شغّال.

FE: features/lis/payments/lis-payments.component.ts

✗✗ خطأ حرج: الدفع من شاشة الـ Request (الـ wizard) مكسور CRITICAL

الـ wizard وقت إنشاء الطلب بيحاول يسجّل دفعة لكن بيبعت أسماء/قيم حقول غلط، فالطلب الـ BE بيرفض الدفعة (422) والكود بيبلع الخطأ ويكمّل (error: () => this.onOrderSuccess()) — يعني الطلب بيتعمل والدفعة مش بتتسجّل والمتبقّي بيفضل كامل من غير ما حد يلاحظ.

الحقل اللي الـ wizard بيبعتهاللي الـ BE متوقّعهالنتيجة
invoice_idlab_invoice_id (required)الدفعة مرفوضة
date (required)ناقص → مرفوضة
payment_method: 'card'enum: 'visa'قيمة غير صالحة
bank_account_id = ba.idexists:accounts,idid غلط
receiving_account_idrequired ✓تمام

FE: request-wizard-v2.component.ts → recordPayment() (≈ سطر 1051-1082)

BE: StoreLabPaymentRequest.php (الحقول الصح)

✗ مفيش أي منع للـ Release لو عليه فلوس BACKEND

LabResultController::release() و bulkRelease() بيفحصوا حالة النتيجة بس (canRelease()) — مفيش أي فحص لـ balance_due بتاع فاتورة الطلب. يعني أي حد يقدر يعمل Release ويبعت النتيجة حتى لو الفاتورة متبقّي عليها مبلغ.

BE: LabResultController.php:448 release() · :953 bulkRelease()

✗ الافتراضي دلوقتي Cash مش Visa FRONTEND

paymentMethod = signal<'cash' | 'card' | 'bank_transfer'>('cash');

القيمة 'card' أصلاً غلط (المفروض 'visa')، والافتراضي 'cash'.

FE: request-wizard-v2.component.ts:198

٣. الحلول المقترحة (أهداف — لسه مفيش كود)

حل ١ — إصلاح دفع الـ wizard + Visa افتراضي FRONTEND

حل ٢ — دفع جزئي + إكمال لاحقًا FRONTEND

حل ٣ — دفع بطريقتين في فاتورة واحدة (Split) FRONTEND

حل ٤ — منع الـ Release لو عليه فلوس (بموافقة أدمن) BACKEND FRONTEND

٤. أسئلة محتاجة قرارك

س١ آلية موافقة الأدمن على الـ Release

(أ) صلاحية على الدور (الأدمن عنده lis.results.release_unpaid فيعمل Release عادي) · (ب) كونفيرم بباسوورد الأدمن وقت كل Release متبقّي · (ج) الاتنين. — اقتراحي: (أ) صلاحية أبسط وأوضح للأودِت.

س٢ فواتير المعمل الخارجي B2B

تتستثنى من منع الـ Release (لأن الدفع آجل بمطالبة شهرية)؟ — اقتراحي: نعم تتستثنى.

س٣ الدفع المقسّم — كام طريقة كحد أقصى؟

طريقتين بس كفاية ولا عدد مفتوح؟ — اقتراحي: مفتوح (واجهة تضيف صفوف دفع)، نبدأ بطريقتين عمليًا.

س٤ الدفع الجزئي وقت إنشاء الطلب

نسمح بـ "بدون دفع" (آجل) من الـ wizard للعميل العادي كمان، ولا الدفع إجباري؟ — اقتراحي: نسمح بالجزئي/الآجل والباقي balance_due.

٥. ترتيب التنفيذ المقترح

  1. FE حل ١ — إصلاح دفع الـ wizard (حرج، بيخلي الفلوس تتسجّل صح) + Visa افتراضي.
  2. BE حل ٤ — منع الـ Release على المتبقّي + صلاحية override.
  3. FE حل ٤ — dialog موافقة الأدمن في الـ validation/results.
  4. FE حل ٣ — واجهة الدفع المقسّم في الـ wizard.
  5. حل ٢ موجود أساسًا؛ نضيف زرّ "تحصيل" سريع للفواتير المتبقّية لو حبيت.