المعمل الخارجي العميل يتعامل معانا بطريقتين. الفاتورة في الحالتين على حسابه بأسعار inbound، والاتنين بينتهوا بمطالبة شهرية.
القاعدة المشتركة: الفاتورة على حساب المعمل · التسعير من قائمة inbound · النتيجة تظهر له على البوابة عند الـ publish · مطالبة مالية شهرية.
① السيناريو الأول — المعمل يجهّز ويبعت
🔵 المعمل يسجّل ويجمّع العينات بنفسه — إحنا نبدأ من «الاستلام»
المعمل يدخل البوابة←
يدخّل بيانات المريض←
يطلب التحاليل/البانل (أسعاره)←
يطبع الباركود←
يجمّع العينات في الأنابيب ويلزق الباركود←
يبعت العينات لنا←
إحنا: استقبال العينات (Receive)←
kanban ← نتائج ← اعتماد ← publish←
المعمل يشوف النتيجة ويطبعها
اللي المعمل بيعمله بنفسه على البوابة
- تسجيل/اختيار مريض (مرضى المعمل).
- إنشاء طلب — اختيار التحاليل أو البانل المرتبط بيه، بأسعار قائمة inbound بتاعته.
- طباعة الباركود للعينات.
- (خارج النظام) يجمّع العينات في الأنابيب، يلزق الباركود، يبعتها لنا.
اللي بيحصل عندنا
- الطلب يوصلنا وهو «مجمَّع بالفعل» — إحنا نبدأ من خطوة استقبال العينة (Receive/Specimen Receiving)، مش من التجميع.
- بعد الاستلام: الفلو الداخلي عادي — kanban ← نتائج ← validation ← publish.
- عند الـ publish → الطلب يرجع يظهر على بوابة المعمل.
نقطة مفتاحية: في السيناريو ده التجميع بيعمله المعمل — مش إحنا. الطلب يدخل فلونا عند «استقبال العينة» مباشرة (العينة موجودة + الباركود متلزق).
② السيناريو الثاني — المريض ييجي لنا
🟣 المريض ييجي لنا — إحنا نعمل كل حاجة — المعمل يتفرّج على النتيجة بس
المعمل يبعت المريض لنا←
ريسبشن: فاتورة تحليل + يختار المعمل←
إحنا نجمّع ونطبع ونستلم←
kanban ← نتائج ← اعتماد ← publish←
يظهر على بوابة المعمل
اللي بيحصل
- المريض ييجي لنا فعلياً.
- ريسبشن عندنا يفتح فاتورة التحليل ويختار المعمل الخارجي عليها (المعمل = الجهة الدافعة).
- إحنا نعمل كل حاجة: تجميع + طباعة باركود + استلام + الفلو كامل.
- عند الـ publish → الطلب يظهر على بوابة المعمل (عرض + طباعة فقط).
نقطة مفتاحية: هنا البوابة للعرض فقط — المعمل مايعملش طلب. الطلب بيتعمل من ريسبشن عندنا. دور البوابة = يشوف النتيجة ويطبعها + كشف الحساب.
③ الفرق بين السيناريوهين
| النقطة | السيناريو ١ | السيناريو ٢ |
| مين يدخّل الطلب | المعمل (من البوابة) | ريسبشن عندنا |
| مين يجمّع العينة | المعمل | إحنا |
| مين يطبع الباركود | المعمل (من البوابة) | إحنا |
| إحنا نبدأ من | استقبال العينة (Receive) | التجميع (من الأول) |
| دور البوابة | إنشاء طلب + متابعة + نتائج | عرض نتائج فقط |
| الفوترة + المطالبة الشهرية | مشترك — على حساب المعمل، بأسعار inbound |
④ المطلوب بناؤه
أ) بوابة المعمل — أقسام جديدة
| الشاشة | السيناريو | الطبقة |
| إدارة مرضى المعمل (تسجيل/قائمة) | ١ | بوابة |
| إنشاء طلب (اختيار تحاليل/بانل + تسعير inbound) | ١ | بوابة |
| طباعة باركود العينات | ١ | بوابة |
| متابعة الطلبات وحالاتها | ١ + ٢ | بوابة |
| عرض وطباعة النتائج المُصدَرة | ١ + ٢ | بوابة |
| كشف حساب + الفواتير + المطالبة الشهرية | ١ + ٢ | بوابة |
ب) جهة الموظفين
- السيناريو ٢: فاتورة التحليل في الريسبشن تختار المعمل الخارجي — موجود جزئياً (المعالج بيدعم اختيار معمل خارجي).
- توليد المطالبة الشهرية للمعمل — شاشة موظفين (زي فواتير التأمين الشهرية).
ج) الـ Backend — endpoints جديدة (الأهم)
- endpoints بوابة العميل: إنشاء طلب · مرضى المعمل (CRUD) · طباعة باركود · قائمة طلبات · نتائج مُصدَرة · فواتير/كشف حساب — كلها محمية بتوكن المعمل ومقيّدة ببياناته.
- دعم بدء الطلب عند «استلام العينة» مباشرة (السيناريو ١ — التجميع تم خارجياً).
- المطالبة الشهرية — تجميع فواتير المعمل في فاتورة/كشف شهري.
⑤ القرارات المعتمَدة ✅
ق١ — المرضى: كل معمل له قائمة مرضاه الخاصة، منفصلة. مرضى المعمل لا يظهروا لغيره.
ق٢ — الكتالوج: كل معمل يشوف فقط التحاليل الموجودة في قائمة أسعاره (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/مُجمَّعة» — عشان يتخطّى خطوة التجميع عندنا ويظهر فوراً في شاشة استلام العينات.
ب) المطالبة الشهرية (تذكرة أحمد)
- تجميع فواتير المعمل خلال الشهر في مطالبة/فاتورة شهرية — على نمط فواتير التأمين الشهرية الموجودة.
- endpoint للموظفين لتوليد المطالبة + endpoint للمعمل لعرضها في كشف حسابه.
ج) الواجهة — بوابة المعمل العميل (نبنيها إحنا)
| الشاشة | السيناريو |
| مرضى المعمل — قائمة + تسجيل/تعديل | ١ |
| إنشاء طلب — اختيار مريض + بحث الكتالوج + تحاليل بأسعار inbound | ١ |
| طباعة الباركود بعد الطلب | ١ |
| قائمة الطلبات + متابعة الحالة | ١ + ٢ |
| تفاصيل الطلب + النتائج + طباعة التقرير | ١ + ٢ |
| كشف الحساب + المطالبات الشهرية | ١ + ٢ |
د) جهة الموظفين (نبنيها إحنا)
- شاشة توليد المطالبة الشهرية للمعامل الخارجية.
- (سيناريو ٢ موجود بالفعل — الريسبشن يختار المعمل في معالج الطلب.)
⑦ تسلسل التنفيذ
1تذكرة أحمد — endpoints بوابة العميل + المطالبة الشهرية + إنشاء الطلب بعينات مُجمَّعة.
2بعد جاهزية الـ backend — نبني واجهة البوابة: مرضى → إنشاء طلب → باركود → طلبات → نتائج → كشف حساب.
3شاشة المطالبة الشهرية (موظفين).
4اختبار السيناريوهين end-to-end.
القاعدة: backend أولاً (تذكرة أحمد) — الواجهة بعد جاهزيته.
⑧ الضريبة (VAT) وحد الائتمان
أ) الضريبة على الفاتورة
- الفاتورة العادية (مريض مباشر): عند عمل الفاتورة يكون فيه اختيار «مقيم» أو «سعودي»:
- مقيم → تُحسب ضريبة 15٪ على الفاتورة.
- سعودي → بدون ضريبة.
- فواتير الـ B2B (المعمل الخارجي): كلها عليها ضريبة 15٪ — بدون استثناء، بغضّ النظر عن المريض.
- نسبة الضريبة (15٪) تبقى إعداد قابل للتعديل، مش رقم ثابت في الكود.
محتاج تأكيد: «مقيم/سعودي» — هل هي خاصية على المريض (نوع الإقامة، تتحدد مرة)، ولا اختيار يدوي كل فاتورة؟ المقترح: خاصية على المريض تظهر افتراضياً في الفاتورة وممكن تعديلها.
ب) حد الائتمان للمعمل الخارجي
- كل معمل خارجي له حد ائتماني (credit limit) — مبلغ أقصى للمستحقات غير المسدّدة.
- لما رصيد المعمل غير المسدّد يوصل الحد → يتوقف عن إضافة طلبات/تحاليل جديدة.
- لازم يسدّد (يقلّل رصيده تحت الحد) عشان يقدر يضيف تاني — منع صارم.
- البوابة تعرض للمعمل: حده الائتماني · رصيده الحالي · المتاح له.
- تنبيه قبل الوصول للحد (مثلاً عند 80٪).
القرارات معتمَدة والخطة كاملة — التالي: إرسال تذكرة الـ backend لأحمد.