LIS · مقارنة الإضافة (Wizard v2) مقابل التعديل الحالي (Legacy) · الأسباب الجذرية · الخطة المقترحة · القرارات المطلوبة
شاشة إضافة ركوست جديدة تستخدم الويزارد الحديث RequestWizardV2Component (كامل: عميل/معمل، تحاليل، باكدچات، تأمين، تسعير، دفع).
أما تعديل ركوست موجود فيفتح ويزارد قديم منفصل LisRequestWizardComponent — وهو ناقص، والأهم أن الباك إند نفسه لا يحفظ معظم التعديلات.
النتيجة: التعديل «مش صح».
v2 يُعرّف مدخلين @Input() editingRequest و @Input() dialogMode، لكنه لا يستخدم editingRequest نهائيًا — لا يوجد كود تعبئة، ويستدعي create() فقط. أي أن v2 لا يعرف التعديل أصلًا حتى الآن.
نقطة الانهيار الأساسية في الباك إند. الـ endpoint:
PUT /api/lis/requests/{id} → UpdateLabRequestRequest يقبل فقط:
| الحقل المقبول في التعديل | الحالة |
|---|---|
doctor_id | يُحفظ |
priority | يُحفظ |
clinical_info / notes | يُحفظ |
source / branch_id | يُحفظ |
patient_id (تغيير المريض) | مُتجاهَل — لا يُحفظ |
discount / التسعير | مُتجاهَل — لا يُحفظ |
investigations[] (قائمة التحاليل) | مُتجاهَل تمامًا |
update() — لكن الباك إند يتجاهل كل ذلك ويحفظ فقط الطبيب/الأولوية/الملاحظات. لهذا تظهر التعديلات على الشاشة ثم «تختفي» بعد الـ refresh.
POST /lis/requests/{id}/investigations — إضافة تحليل واحد (مع السعر/الخصم، ويُوسّع أعضاء الـ panel تلقائيًا).DELETE /lis/requests/{id}/investigations/{invId} — حذف تحليل، ويعيد حساب الإجماليات.requestInvestigation له status، لذا يجب أن نمنع الحذف للتحاليل غير الـ pending (في الفرونت + يُفضّل حارس في الباك).
دالة populateFromRequest() تُعبّئ فقط: المريض، الطبيب، الأولوية، الملاحظات/المعلومات الإكلينيكية، الخصم، و IDs التحاليل. وهي لا تُعبّئ:
وعند الحفظ يستدعي update() فقط (الذي يتجاهل التحاليل والمريض والخصم كما سبق) — فلا فرق فعلي بين التحاليل قبل وبعد.
RequestWizardV2 نفسه — نفس الشاشة، نفس الخطوات، نفس الجودة، مع منطق Diff للتحاليل واحترام حالة الجمع/النتائج.
/requests/{id}/edit، أو inline عبر dialogMode — v2 يدعمه أصلًا). ترويسة واضحة «تعديل ركوست LR-xxxx».ngOnInit لو فيه editingRequest/id ⇐ نجلب الركوست كاملًا (getById مع investigations + doctor + patient + packages + billing) ونملأ كل الـ signals: العميل/المعمل، الطبيب، الأولوية، المعلومات الإكلينيكية، الملاحظات، التحاليل، الباكدچات، قائمة الأسعار/التأمين/الخصم.PUT /requests/{id} (طبيب، أولوية، إكلينيكي، ملاحظات).POST .../investigations لكل واحد.DELETE .../investigations/{id} — فقط للـ pending.UpdateLabRequestRequest ليقبل patient_id لو سمحنا بتغيير المريض.removeInvestigation يمنع حذف تحليل غير pending./requests/{id}/edit) — أوضح وأنظف؟ أم Dialog داخلي مثل الحالي؟ (المقترح: صفحة كاملة مثل الإضافة للتوحيد الكامل).
removeInvestigation يحذف investigation_id واحد فقط ولا يمتد لأعضاء الـ panel. لو حذفنا panel بـ DELETE واحد ⇐ تبقى صفوف الأعضاء «يتيمة». لذلك Diff الحذف يجب أن يرسل DELETE للأب ولكل عضو. (وكذلك التعبئة يجب أن تستبعد الأعضاء وتتعامل مع الـ panel كوحدة واحدة).
lab_invoice_items) تُنشأ وقت الإنشاء. تغيير التحاليل يعيد حساب إجمالي الركوست فقط ولا يلمس الفاتورة ⇐ «الرصيد» يصبح غير مطابق. هذا على الأرجح السبب الذي جعل هذه الميزة لا تكتمل سابقًا.
generateFromRequest) فتبقى مطابقة. بمجرد ترحيل/دفع الفاتورة أو جمع عينة ⇐ تُقفل التحاليل ونعدّل الطبيب/الأولوية/الملاحظات فقط.
| الملف | التغيير |
|---|---|
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) توسعة الحقول + حارس الحذف |