/lab/worklist و /lab/validation مع إضافة عمود Patient History جديد. كل الإيكونات تشتغل على مستوى التحليل أو على مستوى البنل كاملاً.
| الطبقة | الحالة |
|---|---|
BE — POST /lis/results/{id}/retest مع reuse_sample=true |
موجود بيعمل:
|
FE — openReturnDialog + confirmReturn |
موجود بيستدعي retestReread. الـ reason مطلوب (required) ✗ |
| FE — Previous column | موجود ومعمول clickable بيفتح openHistoryDialog ✓ |
| FE — History dialog | موجود لكن غلط بيجيب كل النتائج من كل الـ requests للمريض (يعني Patient History) مش history الـ rerun-chain للنتيجة دي. لازم يتفصل ✗ |
| الفجوة | الحل |
|---|---|
| الـ reason مطلوب حالياً، المستخدم عايزه اختياري | BE + FE BE: reason يبقى nullable في validate FE: dialog يقبل comment فاضي + ميسموش "reason" يبقى "comment" |
| الـ history dialog بيعرض كل النتائج بدل rerun-chain | BE + FE BE: endpoint جديد GET /lis/results/{id}/rerun-history بيرجع سلسلة الـ retest_of حتى الأصل: كل نسخة معاها (value, comment, entered_by, entered_at)FE: openRerunHistoryDialog بدل openHistoryDialog الحالي |
| الـ previousResult كحقل بيظهر القيمة الأخيرة بس، مش كل التاريخ | FE — العرض في الـ cell يبقى القيمة الأخيرة + Badge عدد المرات (مثلاً ×3) لو فيه أكتر من واحدة. Click يفتح Dialog كامل |
| الطبقة | الحالة |
|---|---|
BE — POST /lis/results/{id}/reset مع reason |
موجود بيرجع الـ result لـ status=pending ويصفّر القيمة |
| BE — flow الـ recollect من Reception | موجود الـ SampleInvestigationService::moveTo بيدعم رفض + إعادة تجميع، ولما الـ sample يتجمع تاني الـ listener بيعمل LabResult جديد فاضي |
| BE — قائمة Rejection Reasons | موجود GET /lis/rejection-reasons?is_active=true — مفيش شك |
| FE — Reject dialog | جزئي فيه dialog لكن بيكتب reason كنص حر — مفيش dropdown للأسباب المحفوظة |
| FE — locked row indicator | موجود الـ lockedGroupsForRequest section بتظهر التحاليل المرفوضة فوق الجدول |
| FE — منع إدخال نتيجة في صف rejected | موجود via isEditable + notReceivable |
| الفجوة | الحل |
|---|---|
| الـ reject dialog مفيهوش dropdown للأسباب المحفوظة | FE استخدام test-action-dialog الموجود (الـ shared component) بدل الـ dialog المحلي — هو فعلاً عنده reason picker + text box |
| لما الصف يكون مرفوض، التحاليل تظهر في "Locked" فوق الجدول مش جنب اسمه في الجدول نفسه | FE إضافة badge "Rejected" + lock icon على الصف نفسه في الجدول، مع تمييز بصري (خط بيشطب الـ value، خلفية رمادية) |
| لما الـ panel كله يترفض، الـ status بتعت البنل لازم تبقى Rejected | FE الـ rollupPanelStatus الحالي ميعرفش rejected — لازم يضاف للترتيب |
| الطبقة | الحالة |
|---|---|
BE — POST /lis/referrals | موجود بيعمل referral للتحليل |
BE — GET /lis/external-labs | موجود |
BE — GET /lis/external-labs/{id}/pricing | موجود بيرجع {investigation_id, price, tat_hours} |
| FE — Send Out dialog | جزئي dropdown للمعامل بس — بدون سعر أو TAT |
| FE — Send Out at panel-level | جزئي بيشتغل بس بيفتح dialog للعضو الأول فقط |
| FE — Result entry لـ external row | موجود الـ isExternalLab flag موجود ومش بيمنع الإدخال |
| الفجوة | الحل |
|---|---|
| الـ dialog بيعرض اسم المعمل بس، مفيش سعر أو TAT | FE الـ dialog يجيب external-labs/{id}/pricing لكل معمل مرة واحدة عند الفتح. يعرض جدول: اسم المعمل · السعر · TAT بالساعات · زرار "اختار"العرض كقائمة فيها radio button لكل معمل، اللي مالوش سعر للتحليل ده يظهر "—" بدل السعر |
| الـ panel-level send out بيبعت العضو الأول فقط | FE + BE اختياري الـ dialog يبقى فيه checkboxes للأعضاء (مفعّلين كلهم بشكل افتراضي)، والـ submit يبعت referral لكل عضو متشاك |
| الـ External badge على الصف مش واضح بصرياً | FE badge أصفر/برتقالي صغير "EXT · LabName" جنب الـ test code، مع tooltip فيه TAT والـ status |
| الطبقة | الحالة |
|---|---|
| BE — fetch previous results across requests | موجود ممكن يتجاب عبر GET /lis/results?patient_id=X&investigation_id=Y&statuses=released |
| FE — fetch logic | موجود لكن للسبب الغلط الـ fetchPreviousResultsForRows الحالي بيجيب previous results للمريض ويحطها في حقل previousResult — وده اللي بيظهر في عمود Previous حالياً. المنطق ده مكانه الـ Patient History الجديد، مش Previous |
| الفجوة | الحل |
|---|---|
| الـ Previous والـ Patient History مدموجين في حقل واحد | FE فصل المنطق: • previousResult: القيمة قبل آخر rerun داخل نفس الـ request (من الـ retest_of chain)• patientHistory: نتائج released للمريض في requests أخرىعمودين منفصلين في الجدول، كلاهما clickable يفتح dialog مختلف |
| الـ patient history بيتجاب صف بصف (N+1) | FE bulk fetch: قائمة (patient_id, investigation_id) فريدة → request واحد بيرجع كل الـ history → mapping محلي. اللي عمل بالفعل في fetchPreviousResultsForRows |
/lab/validation فيها كل اللي في /lab/worklist + إيكونات إضافية للـ approval workflow.
| الإيكونة | متى تظهر | الـ BE endpoint |
|---|---|---|
| Validate ✓ | status = entered | POST /lis/sample-investigations/{id}/validate — موجود |
| Approve | status = validated | POST /lis/sample-investigations/{id}/approve — موجود |
| Release | status = approved | POST /lis/sample-investigations/{id}/release — موجود |
| Print 🖨 | status = released | POST /lis/sample-investigations/{id}/print — موجود |
| Publish 📡 | status = printed أو released | POST /lis/sample-investigations/{id}/publish — موجود |
| Unpublish (Retract) | status = released/printed/published | POST /lis/sample-investigations/{id}/unpublish — موجود |
POST /lis/results/{id}/retest + resetGET /lis/results/{id}/rerun-history بيرجع سلسلة retest_of من الـ result الحالي لحد الأصل، كل عنصر فيه: {id, result_value, comment, entered_by_name, entered_at, status}POST /lis/referrals/bulk لإرسال أكتر من تحليل مرة واحدة لنفس المعمل — لو مش موجود×N جنب القيمةrerun-history-dialog بيعرض السلسلة مع كل التفاصيلtest-action-dialog (mode='reject') اللي موجودrejected للـ rollupPanelStatuspreviousResult (داخل الـ request) و patientHistory (cross-request)lab_result_audit_logs الموجود؟ الـ audit logs فيها كل التغييرات (مش بس rerun) فمحتاجة فلترة.
الملف ده مرجع للنقاش قبل البدء في التنفيذ. اقرأه وقولي:
1) الإجابة على التحذيرات الأربعة فوق
2) لو الترتيب يناسبك ولا تحب نبدأ بحاجة معينة
3) لو فيه فيتشر زودته