تحليل إعادة بناء «تعديل الركوست» — Edit Request Revamp

LIS · مقارنة الإضافة (Wizard v2) مقابل التعديل الحالي (Legacy) · الأسباب الجذرية · الخطة المقترحة · القرارات المطلوبة

1 الخلاصة في سطرين

شاشة إضافة ركوست جديدة تستخدم الويزارد الحديث RequestWizardV2Component (كامل: عميل/معمل، تحاليل، باكدچات، تأمين، تسعير، دفع). أما تعديل ركوست موجود فيفتح ويزارد قديم منفصل LisRequestWizardComponent — وهو ناقص، والأهم أن الباك إند نفسه لا يحفظ معظم التعديلات. النتيجة: التعديل «مش صح».

يعمل ناقص مكسور / لا يُحفظ

2 الوضع الحالي — مَن يفتح ماذا

زر «جديد» /requests/new RequestWizardV2 ✔ حديث
زر «تعديل» ✏️ Dialog داخلي LisRequestWizard (Legacy) ✖
الويزارد الحديث v2 يُعرّف مدخلين @Input() editingRequest و @Input() dialogMode، لكنه لا يستخدم editingRequest نهائيًا — لا يوجد كود تعبئة، ويستدعي create() فقط. أي أن v2 لا يعرف التعديل أصلًا حتى الآن.

3 السبب الجذري — لماذا التعديل لا يُحفظ

نقطة الانهيار الأساسية في الباك إند. الـ endpoint:

PUT /api/lis/requests/{id}UpdateLabRequestRequest يقبل فقط:

الحقل المقبول في التعديلالحالة
doctor_idيُحفظ
priorityيُحفظ
clinical_info / notesيُحفظ
source / branch_idيُحفظ
patient_id (تغيير المريض)مُتجاهَل — لا يُحفظ
discount / التسعيرمُتجاهَل — لا يُحفظ
investigations[] (قائمة التحاليل)مُتجاهَل تمامًا
الويزارد القديم يسمح لك بتغيير المريض والتحاليل والخصم على الشاشة، ثم يرسلها داخل update() — لكن الباك إند يتجاهل كل ذلك ويحفظ فقط الطبيب/الأولوية/الملاحظات. لهذا تظهر التعديلات على الشاشة ثم «تختفي» بعد الـ refresh.

التحاليل تُدار عبر endpoints منفصلة (الويزارد القديم لا يستدعيها):

خطر: لا يوجد في الباك إند أي حارس يمنع حذف تحليل تم تجميع عينته أو دخلت له نتيجة. كل requestInvestigation له status، لذا يجب أن نمنع الحذف للتحاليل غير الـ pending (في الفرونت + يُفضّل حارس في الباك).

4 الويزارد القديم (التعديل الحالي) — ما الذي يفعله فعلًا

دالة populateFromRequest() تُعبّئ فقط: المريض، الطبيب، الأولوية، الملاحظات/المعلومات الإكلينيكية، الخصم، و IDs التحاليل. وهي لا تُعبّئ:

وعند الحفظ يستدعي update() فقط (الذي يتجاهل التحاليل والمريض والخصم كما سبق) — فلا فرق فعلي بين التحاليل قبل وبعد.

5 الخطة المقترحة — توحيد التعديل مع الإضافة

المبدأ: نُلغي الويزارد القديم تمامًا، ونضيف «وضع تعديل» حقيقي داخل RequestWizardV2 نفسه — نفس الشاشة، نفس الخطوات، نفس الجودة، مع منطق Diff للتحاليل واحترام حالة الجمع/النتائج.

أ) الفرونت إند (Angular — v2)

ب) الباك إند (Laravel) — حسب قراراتك أدناه

6 قرارات محتاج أأكدها منك قبل ما أبدأ

س1 — تغيير المريض في التعديل؟
هل نسمح بتغيير المريض على ركوست موجود؟ (المقترح: لا — نقفل المريض؛ لو غلط، يتلغى الركوست ويتعمل جديد). لو «نعم» محتاج تعديل في الباك إند.
س2 — تعديل الفوترة (قائمة أسعار / تأمين / خصم) في التعديل؟
هل الفوترة قابلة للتعديل بعد إنشاء الفاتورة؟ (المقترح: نعدّل التحاليل/الطبيب/الأولوية فقط؛ الفوترة تظل كما هي ما لم تُلغَ الفاتورة). لو «نعم» محتاج توسعة باك إند + إعادة حساب فاتورة.
س3 — التحاليل التي بدأ تجهيزها
نقفل أي تحليل تم تجميع عينته/دخلت له نتيجة من الحذف (يُعرض 🔒)، ونسمح فقط بحذف الـ pending. (المقترح: نعم).
س4 — الدفع داخل التعديل
نُخفي خطوة الدفع ونعرض رصيد الفاتورة للقراءة فقط؟ أم تريد زر «تحصيل دفعة إضافية» داخل شاشة التعديل؟ (المقترح: عرض الرصيد فقط، والتحصيل من شاشة المدفوعات).
س5 — شكل شاشة التعديل
صفحة كاملة مثل الإضافة (مسار /requests/{id}/edit) — أوضح وأنظف؟ أم Dialog داخلي مثل الحالي؟ (المقترح: صفحة كاملة مثل الإضافة للتوحيد الكامل).

اكتشافات حرجة بعد فحص الباك إند بعمق

1) حذف الـ Panel لا يحذف أعضاءه: removeInvestigation يحذف investigation_id واحد فقط ولا يمتد لأعضاء الـ panel. لو حذفنا panel بـ DELETE واحد ⇐ تبقى صفوف الأعضاء «يتيمة». لذلك Diff الحذف يجب أن يرسل DELETE للأب ولكل عضو. (وكذلك التعبئة يجب أن تستبعد الأعضاء وتتعامل مع الـ panel كوحدة واحدة).
2) الفاتورة لا تتزامن مع تغيير التحاليل: الفاتورة لها نسخة منفصلة من البنود (lab_invoice_items) تُنشأ وقت الإنشاء. تغيير التحاليل يعيد حساب إجمالي الركوست فقط ولا يلمس الفاتورة ⇐ «الرصيد» يصبح غير مطابق. هذا على الأرجح السبب الذي جعل هذه الميزة لا تكتمل سابقًا.
الحل المقترح (Option A): تعديل التحاليل مسموح فقط طالما الفاتورة غير مرحّلة/مدفوعة ولا توجد عينة مُجمَّعة. بعد تعديل التحاليل ⇐ نُلغي الفاتورة القديمة ونُعيد توليدها (generateFromRequest) فتبقى مطابقة. بمجرد ترحيل/دفع الفاتورة أو جمع عينة ⇐ تُقفل التحاليل ونعدّل الطبيب/الأولوية/الملاحظات فقط.

7 ملفات ستتأثر (للمرجعية)

الملفالتغيير
request-wizard-v2.component.ts/.htmlإضافة وضع التعديل: تعبئة + Diff تحاليل + قفل المجمَّع + ترويسة تعديل
requests/lis-requests.component.tsزر «تعديل» يفتح v2 بدل الويزارد القديم
lis-standalone.routes.ts / app.routes.tsمسار requests/:id/edit (لو اخترنا صفحة كاملة)
request-wizard/* (Legacy)يُحذف بعد التأكد من عدم وجود مستخدم آخر له
UpdateLabRequestRequest.php / LabRequestService.php(حسب س1/س2/س3) توسعة الحقول + حارس الحذف
Moon ERP · LIS · تحليل تعديل الركوست — جاهز للمراجعة. حدّد إجابات الأسئلة الخمسة وأبدأ التنفيذ فورًا.