📋 بوابة المعمل الخارجي العميل — السيناريوهان

تحديد المطلوب قبل البدء — سيناريو «المعمل يجهّز ويبعت» وسيناريو «المريض ييجي لنا»

خطة للمراجعة · 2026-05-23

المعمل الخارجي العميل يتعامل معانا بطريقتين. الفاتورة في الحالتين على حسابه بأسعار inbound، والاتنين بينتهوا بمطالبة شهرية.

القاعدة المشتركة: الفاتورة على حساب المعمل · التسعير من قائمة inbound · النتيجة تظهر له على البوابة عند الـ publish · مطالبة مالية شهرية.

① السيناريو الأول — المعمل يجهّز ويبعت

🔵 المعمل يسجّل ويجمّع العينات بنفسه — إحنا نبدأ من «الاستلام»
المعمل يدخل البوابة يدخّل بيانات المريض يطلب التحاليل/البانل (أسعاره) يطبع الباركود يجمّع العينات في الأنابيب ويلزق الباركود يبعت العينات لنا إحنا: استقبال العينات (Receive) kanban ← نتائج ← اعتماد ← publish المعمل يشوف النتيجة ويطبعها

اللي المعمل بيعمله بنفسه على البوابة

  1. تسجيل/اختيار مريض (مرضى المعمل).
  2. إنشاء طلب — اختيار التحاليل أو البانل المرتبط بيه، بأسعار قائمة inbound بتاعته.
  3. طباعة الباركود للعينات.
  4. (خارج النظام) يجمّع العينات في الأنابيب، يلزق الباركود، يبعتها لنا.

اللي بيحصل عندنا

  • الطلب يوصلنا وهو «مجمَّع بالفعل» — إحنا نبدأ من خطوة استقبال العينة (Receive/Specimen Receiving)، مش من التجميع.
  • بعد الاستلام: الفلو الداخلي عادي — kanban ← نتائج ← validation ← publish.
  • عند الـ publish → الطلب يرجع يظهر على بوابة المعمل.
نقطة مفتاحية: في السيناريو ده التجميع بيعمله المعمل — مش إحنا. الطلب يدخل فلونا عند «استقبال العينة» مباشرة (العينة موجودة + الباركود متلزق).

② السيناريو الثاني — المريض ييجي لنا

🟣 المريض ييجي لنا — إحنا نعمل كل حاجة — المعمل يتفرّج على النتيجة بس
المعمل يبعت المريض لنا ريسبشن: فاتورة تحليل + يختار المعمل إحنا نجمّع ونطبع ونستلم kanban ← نتائج ← اعتماد ← publish يظهر على بوابة المعمل

اللي بيحصل

  • المريض ييجي لنا فعلياً.
  • ريسبشن عندنا يفتح فاتورة التحليل ويختار المعمل الخارجي عليها (المعمل = الجهة الدافعة).
  • إحنا نعمل كل حاجة: تجميع + طباعة باركود + استلام + الفلو كامل.
  • عند الـ publish → الطلب يظهر على بوابة المعمل (عرض + طباعة فقط).
نقطة مفتاحية: هنا البوابة للعرض فقط — المعمل مايعملش طلب. الطلب بيتعمل من ريسبشن عندنا. دور البوابة = يشوف النتيجة ويطبعها + كشف الحساب.

③ الفرق بين السيناريوهين

النقطةالسيناريو ١السيناريو ٢
مين يدخّل الطلبالمعمل (من البوابة)ريسبشن عندنا
مين يجمّع العينةالمعملإحنا
مين يطبع الباركودالمعمل (من البوابة)إحنا
إحنا نبدأ مناستقبال العينة (Receive)التجميع (من الأول)
دور البوابةإنشاء طلب + متابعة + نتائجعرض نتائج فقط
الفوترة + المطالبة الشهريةمشترك — على حساب المعمل، بأسعار inbound

④ المطلوب بناؤه

أ) بوابة المعمل — أقسام جديدة

الشاشةالسيناريوالطبقة
إدارة مرضى المعمل (تسجيل/قائمة)١بوابة
إنشاء طلب (اختيار تحاليل/بانل + تسعير inbound)١بوابة
طباعة باركود العينات١بوابة
متابعة الطلبات وحالاتها١ + ٢بوابة
عرض وطباعة النتائج المُصدَرة١ + ٢بوابة
كشف حساب + الفواتير + المطالبة الشهرية١ + ٢بوابة

ب) جهة الموظفين

ج) الـ Backend — endpoints جديدة (الأهم)

⑤ القرارات المعتمَدة ✅

ق١ — المرضى: كل معمل له قائمة مرضاه الخاصة، منفصلة. مرضى المعمل لا يظهروا لغيره.
ق٢ — الكتالوج: كل معمل يشوف فقط التحاليل الموجودة في قائمة أسعاره (inbound)، مع إمكانية البحث فيها. قائمة الأسعار = الكتالوج المتاح له.
ق٣ — الدفع: كله آجل — لا دفع وقت الطلب إطلاقاً. كل المستحقات تتجمّع على المطالبة الشهرية.
ق٤ — استلام العينة: طلب السيناريو ١ يدخل فلونا مباشرة عند شاشة استلام العينات (/lab/receiving) — يظهر هناك جاهز للاستلام، التجميع تم عند المعمل.
ق٥ — حساب الدخول: كل معمل له username + password خاص (مش إيميل). تُدار من شاشة الموظفين.
ق٦ — اللغة: اللغة الأساسية للبوابة الإنجليزية (مع إمكانية التبديل للعربية).
ق٧ — التصميم: التنسيق والتنفيذ احترافي من الأول — جودة تصميم عالية، مش MVP خام.

⑥ الخطة التفصيلية

أ) الـ Backend — endpoints بوابة العميل (تذكرة أحمد)

كلها تحت /lis/external-lab-portal/، محمية بتوكن المعمل، ومقيّدة ببيانات المعمل فقط:

endpointالوظيفة
GET /patientsقائمة مرضى المعمل (بحث + باجينيشن)
POST /patientsتسجيل مريض جديد — يُربط بالمعمل تلقائياً
PUT /patients/{id}تعديل مريض (لمرضى المعمل فقط)
GET /catalogالتحاليل المتاحة للمعمل = عناصر قائمة أسعاره inbound، بأسعارها، قابلة للبحث
POST /requestsإنشاء طلب — تحاليل مُسعّرة من inbound، الفاتورة على حساب المعمل (آجل)، العينات تُنشأ بحالة «مُجمَّعة» فيظهر الطلب مباشرة في /lab/receiving
GET /requests/{id}/barcodesبيانات الباركود لطباعتها من البوابة
GET /requestsقائمة طلبات المعمل + حالاتها (سيناريو ١ و ٢)
GET /requests/{id}تفاصيل الطلب + حالة كل تحليل
GET /requests/{id}/reportتقرير النتائج المُصدَرة (PDF / بيانات)
GET /statementكشف حساب المعمل + الفواتير + المطالبات الشهرية
نقطة حرجة (سيناريو ١): الطلب المُنشأ من البوابة لازم الـ backend يعمل عيناته بحالة «collected/مُجمَّعة» — عشان يتخطّى خطوة التجميع عندنا ويظهر فوراً في شاشة استلام العينات.

ب) المطالبة الشهرية (تذكرة أحمد)

ج) الواجهة — بوابة المعمل العميل (نبنيها إحنا)

الشاشةالسيناريو
مرضى المعمل — قائمة + تسجيل/تعديل١
إنشاء طلب — اختيار مريض + بحث الكتالوج + تحاليل بأسعار inbound١
طباعة الباركود بعد الطلب١
قائمة الطلبات + متابعة الحالة١ + ٢
تفاصيل الطلب + النتائج + طباعة التقرير١ + ٢
كشف الحساب + المطالبات الشهرية١ + ٢

د) جهة الموظفين (نبنيها إحنا)

⑦ تسلسل التنفيذ

1
تذكرة أحمد — endpoints بوابة العميل + المطالبة الشهرية + إنشاء الطلب بعينات مُجمَّعة.
2
بعد جاهزية الـ backend — نبني واجهة البوابة: مرضى → إنشاء طلب → باركود → طلبات → نتائج → كشف حساب.
3
شاشة المطالبة الشهرية (موظفين).
4
اختبار السيناريوهين end-to-end.
القاعدة: backend أولاً (تذكرة أحمد) — الواجهة بعد جاهزيته.

⑧ الضريبة (VAT) وحد الائتمان

أ) الضريبة على الفاتورة

محتاج تأكيد: «مقيم/سعودي» — هل هي خاصية على المريض (نوع الإقامة، تتحدد مرة)، ولا اختيار يدوي كل فاتورة؟ المقترح: خاصية على المريض تظهر افتراضياً في الفاتورة وممكن تعديلها.

ب) حد الائتمان للمعمل الخارجي

القرارات معتمَدة والخطة كاملة — التالي: إرسال تذكرة الـ backend لأحمد.