الورك ليست — تشخيص شامل + خطة الاعتماد على الباك

توقّفنا عن التجربة على المباشر. الملف ده بيوثّق بالظبط ليه الورك ليست طلعت فاضية (أو طلب واحد)، الأسباب الجذرية بالأدلة، اللي اتصلح فعلاً، والخطة الآمنة عشان الورك ليست تعتمد على الباك إند بالكامل بدل منطق الفرونت — من غير ما نكسر الشاشة اليومية تاني.

🗓️ 2026-06-08🧬 LIS — dept-worklist + validation🛡️ الحالة الآن: الـlab على المسار القديم المثبّت (آمن)

0 الوضع الآن — مهم

🟢 الـlab شغّال ومستقر

المسار الجديد (الباك) مقفول قطعياً للكل (kill-switch بيمسح أي flag متخزّن). الصفحتين على المنطق القديم المثبّت. كل التحاليل بتظهر. مفيش حاجة مكسورة دلوقتي.

يعني نقدر نخطّط بهدوء — أي تنفيذ جاي هيكون متحقَّق offline الأول، وبعدين opt-in تجرّبه إنت، وبعدين أساسي. مش هنفعّل حاجة live من غير تأكيدك.

1 ليه الورك ليست طلعت فاضية (أو طلب واحد)؟

السبب الجذري الأساسي — مفاجأة في الـAPI القديم:

🎯 الـAPI القديم كان بيتجاهل فلتر الحالة تماماً

صفحة الورك ليست القديمة بتنادي:

GET /lis/results?statuses=pending,entered,validated,approved&date_from=…&date_to=…

بس الكنترولر القديم (LabResultController) بيتعامل مع status (مفرد) بس — مفيش معالجة لـstatuses (جمع). فالفلتر بيتجاهَل بالكامل، والـAPI بيرجّع كل تحاليل اليوم (المكتمل + الناقص).

الدليل: ?statuses=released و?statuses=pending رجّعوا نفس النتيجة بالظبط (52 نتيجة: 36 released + 16 entered).

النتيجة: سوء فهم بنينا عليه

الورك ليست القديمة (فعلياً)الورك ليست الجديدة (أول محاولة)
بتعرض إيهكل طلبات اليوم (لأن الفلتر متجاهَل)الناقص بس (incomplete)
طلبات النهاردة12 طلب0 ثم 1
ليه الفرقالنهاردة معظم الشغل اتعمل (released). القديمة بتعرضهم؛ الجديدة بتخفيهم لأنها فلترت "الناقص" — اللي فاكرين إنه سلوك القديمة، لكنه مكنش.

الخلاصة

المشكلة مكانتش "بيانات ضايعة" ولا "render مكسور" — كانت تعريف غلط لإيه اللي الورك ليست المفروض تعرضه، مبني على فلتر API كان متعطّل من الأساس في القديم.

2 كل الأسباب الجذرية اللي ظهرت (بالأدلة)

رحلة التشخيص كشفت 5 فجوات. دي كلها دلوقتي مفهومة، وأغلبها اتصلح:

1) فلتر الحالة — statuses متجاهَل في القديماتصلح

القديم بيعرض كل طلبات اليوم. أضفت status_filter=worklist في الباك = كل طلبات اليوم (أي حالة) + ما-قبل-الـbench. تحقّق: 12 = 12 النهاردة، نفس مجموعة الـids بالظبط.

2) الفلترة بالقسم (lab_section_id) مش مدعومةاتصلح

dept مقسّم بالأقسام، بس الـendpoints الجديدة كانت بتتجاهل القسم → بتسقّط تحاليل. أضفت دعم lab_section_id في cards + rows. تحقّق: طلب 79 (21 تحليل) بيتقسّم بالظبط: قسم1=16 + قسم2=4 + قسم5=1، صفر ضياع.

3) كروت ما-قبل-الـbench مش بتظهراتصلح

الطلبات اللي اتجمّعت عيناتها بس لسه مالهاش نتيجة كانت بتختفي. أضفت prebenchCards() بتظهرهم تحت worklist/incomplete.

4) إعدادات النتائج الخاصة (file/culture/histopath) ناقصة في الـpayloadجزئي

العرض وأمان البيانات تمام (النوع محفوظ، مفيش تحويل لـnumeric)، بس إعدادات إدخال النتائج الخاصة (قواعد الرفع، قالب الهيستوباث، requires_peer_review/grossing) مش جاية في الصف. ضفت جزء من الحقول؛ محتاج أكمّلها.

5) (المحاولة الأولى) تفعيل default + حذف القديم قبل دعم الأقساماترجع

أول cutover خلّى الجديد أساسي وحذف القديم وقت ما الباك لسه مش بيدعم الأقسام → كسر → رجعنا بـgit. الدرس: الباك يكمل الأول، التحقّق الأول، الحذف آخر حاجة.

3 اللي اتبنى في الباك واتحقّق فعلاً

✅ مصدر حقيقة واحد

WorklistContextService — كل منطق التجميع (dedup، النَسب، البنلات، sub-sections، locked، الترتيب، رولأب، الملخّص، flag، التوقيت) في الباك.

✅ 3 endpoints

/lis/worklist/cards + /requests/{id}/rows + /search — بتدعم lab_section_id + status_filter.

✅ مطابقة الكروت

النهاردة: worklist = 12 = القديم (12)، نفس الـids بالظبط.

✅ مطابقة الصفوف

كل الـ12 طلب: عدد تحاليل كل طلب في الجديد = القديم (16,1,2,2,2,1,2,2,2,5,1,16).

✅ البنلات

HBA1C602 (عضوين بدون تكرار) + CBC (sub-sections) صح.

✅ الأنواع الخاصة

histopath مابتتحوّلش لـnumeric — صفر فساد بيانات.

4 الخطة — اعتماد كامل على الباك، بأمان

مرحلة 1

إكمال تطابق الباك Backend شبه مكتمل

الهدف: الباك يرجّع نفس اللي القديم بيعرضه، 1:1.
  • status_filter=worklist (dept) — كل طلبات اليوم + ما-قبل-الـbench.
  • ✅ دعم lab_section_id (cards + rows).
  • ⬜ إكمال حقول النتائج الخاصة (file_settings/culture_config/histopath/requires_peer_review/requires_grossing) في صف الـrows.
مرحلة 2

هارنس تطابق آلي (Parity Harness) Backend سلامة

الهدف: نثبت التطابق بالأرقام، مش بالانطباع — قبل أي لمسة فرونت.
  • سكربت يقارن — لكل طلب على الشاشة — مخرجات الباك الجديد مع /lis/results القديم: نفس الطلبات؟ نفس التحاليل لكل طلب؟ نفس الحالات؟ نفس القيم/الفلاج؟
  • يشتغل على عدة أيام + كل الأقسام + All-Departments (مش يوم واحد).
  • لازم 100% تطابق قبل ما نلمس الفرونت. أي فرق = نوقف ونصلّح الباك.
مرحلة 3

الفرونت خلف toggle (opt-in) — إنت تجرّب Frontend سلامة

الهدف: تشوفه بعينك على بياناتك قبل ما يبقى أساسي.
  • dept يستخدم status_filter=worklist (مش incomplete).
  • المسار الجديد خلف ?serverWorklist=1 (الافتراضي قديم → الـlab مايتأثرش).
  • إنت تجرّب: أيام مختلفة + أقسام + All-Departments + إدخال نتيجة + الأنواع الخاصة وتأكّد.
مرحلة 4

تفعيل أساسي (بعد تأكيدك) Frontend

الهدف: الباك يبقى المصدر الأساسي.
  • لما تأكّد إن الاتنين مطابقين → أخلّي المسار الجديد أساسي.
  • القديم يفضل fallback (?serverWorklist=0) — مش هنحذفه في الخطوة دي.
مرحلة 5

حذف التكرار (آخر خطوة، بعد فترة استقرار) Frontend

الهدف: نشيل منطق الفرونت المكرر — بعد ما الجديد يثبت live.
  • بعد أيام من الاستقرار بدون مشاكل → نحذف منطق التجميع القديم من الصفحتين (−٥٠٪+ كود).

5 ضمانات إننا منكسرش الشاشة تاني

1) تطابق آلي أولاً

مفيش لمسة فرونت قبل ما الهارنس يثبت 100% تطابق على عدة أيام وأقسام.

2) opt-in قبل default

إنت تجرّب بـ?serverWorklist=1 الأول. الـlab على القديم لحد ما تأكّد.

3) fallback + kill-switch

القديم يفضل موجود؛ ?serverWorklist=0 رجوع فوري؛ وفيه kill-switch قطعي لو لزم.

4) git = رجوع

كل خطوة commit منفصل؛ رجوع كامل في ثواني.

القرار المطلوب

الخطة دي بتحقّق طلبك (الاعتماد على الباك بدل الفرونت) بأمان. أنا جاهز أبدأ بـمرحلة 1 (إكمال حقول النتائج الخاصة) + مرحلة 2 (الهارنس) — كلها offline، الـlab مايتأثرش — وأرجّعلك نتيجة التطابق بالأرقام قبل أي لمسة فرونت. توافق على المسار ده؟