الرؤية الاستراتيجية: كيف تكتمل المنظومة الطبية؟
Moon ERP × LIS × HIS × OBGY
دراسة معمارية حاسمة تجيب على السؤال المصيري: ما العلاقة بين نظام الـ ERP القائم، وموديول المعامل LIS العامل بالإنتاج، ونظام معلومات المستشفيات HIS المخطط له، ونظام عيادات النساء OBGY الذي اكتمل تحليله — ومَن يُبنى على مَن؟ أُجريت الدراسة بمنهجية لجنة تحكيم: مسح أدلة كامل للكود الفعلي، ثم ثلاث معماريات متنافسة دافع كل مهندس عن واحدة بأقصى قوة، ثم ثلاثة محكّمين عدائيين، ثم توليف نهائي ملزم.
الملخص التنفيذي (Executive Summary)
الإجابات المباشرة على أسئلة الإدارة، ثم خلاصة المنطق — التفاصيل والأدلة الكاملة في الأقسام الجانبية.
الإجابات المباشرة
| السؤال | القرار | السبب في سطر |
|---|---|---|
| هل يكون OBGY هو نواة الـ HIS؟ | لا — بشكل قاطع | OBGY بلا مفهوم Encounter أصلاً (جداوله الإكلينيكية لا ترتبط بالزيارات)، بلا تنويم/طوارئ/أسرّة/تأمين، و~48% من محتواه خاص بطب النساء فقط، وكوده القديم غير قابل للنقل أمنياً — لكنه يظل أثمن أصل معرفي في المعادلة. |
| موديول واحد أم موديولات منفصلة؟ | منفصلان | Modules/HIS منصة إكلينيكية عامة لأي مستشفى + Modules/Obgy أول موديول تخصصي يركّب عليها — بنفس القاعدة الذهبية التي تُبقي LIS قابلاً للبيع منفرداً. |
| كيف يعمل الجميع معاً؟ | عمود فقري واحد | مريض واحد (lab_patients يرقّى ليصبح السجل الرئيسي MPI)، مواجهة واحدة (his_encounters)، حساب مالي واحد (his_folios) — وكل التخصصات (معمل، نساء، وغداً أي تخصص) تتصل بها بعقود أحداث ثابتة. |
| كيف نخدم أي مستشفى وليس مراكز النساء فقط؟ | منصة + إضافات | الـ HIS لا يذكر أي تخصص بالاسم أبداً؛ كل تخصص يسجّل نفسه عبر سجلات التوصيل — فيُباع المنتج بأربع باقات: معمل / عيادات / مركز نساء متكامل / مستشفى عام. |
دور OBGY الحقيقي — أربعة أدوار بلا سطر كود واحد
- متبرّع بالأنماط لنواة HIS: نحو ثلث أصوله (نموذج الزيارة والطابور وسعة الفترات، توحيد 18 جدول روشتات وتحاليل في 4 جداول، محرك أسئلة التاريخ المرضي القابل للتهيئة، الفحص لكل جهاز بالجسم، قائمة انتظار العمليات والتقرير الجراحي، محرك ~190 قائمة ترميز) يدخل تصميم النواة العامة نفسها.
- المحتوى التخصصي داخل
Modules/Obgy: نحو نصف أصوله (متابعة الحمل، دورات الحقن المجهري بجداول مراحلها، الأشعة النسائية، المناظير، ملفات العقم) — الشيتات المعقدة جداول حقيقية، والبسيطة محتوى لمحرك النماذج. - أول عميل تجريبي مدفوع وبروفة ترحيل: 10 سنوات بيانات حقيقية و~190 قاموس مفردات عربية منقّحة بالإنتاج — ميزة تنافسية لا يملكها أي منافس.
- إثبات السوق: يثبت أن منصة العيادات الخارجية (المرحلة الأولى) قابلة للبيع وحدها قبل اكتمال التنويم.
خريطة العلاقات في ست جمل
- ERP ↔ LIS: قائم اليوم — LIS يركب على قضبان المنصة (الفروع، الصلاحيات، الترقيم) ويرحّل قيوده عبر
CreateJournalEntryفقط. - ERP ↔ HIS: الـ HIS يستهلك الحسابات والموارد البشرية والمخزون والتأمين للأمام كخدمات جاهزة — لا يعيد بناء أي منها.
- HIS ↔ LIS: الـ HIS يطلب التحاليل عبر نقطة الدخول الجاهزة
CreateLabRequestبرقم المواجهة، والنتائج تعود عبر الأحداث (LabResultReleased) — الـ LIS لا يستورد من HIS أبداً ولا يتأثر إطلاقاً. - HIS ↔ OBGY: موديول Obgy يستورد من HIS (المواجهات، الفوترة، النماذج) ويسجّل نفسه في سجلات التوصيل — والـ HIS لا يعرف اسمه أصلاً.
- OBGY ↔ LIS: تحاليل الذكورة والهرمونات تصبح فحوصات في كتالوج LIS نفسه بمرجعيات WHO — بلا أي ازدواج.
- OBGY ↔ ERP: مرضى OBGY يصبحون سجلات في ملف المريض الموحد، أدويته في كتالوج المنتجات والمخزون، وأمواله عبر الـ Folio إلى الحسابات — ويُلغى ربط cURL القديم نهائياً.
كيف حُسم القرار؟
تنافست ثلاث معماريات حقيقية دافع عن كل منها مهندس مستقل: «المنصة أولاً» (HIS نواة عامة رقيقة + Obgy إضافة تخصصية)، «OBGY كبذرة» (بناء HIS بتعميم مخطط OBGY وبيع مستشفى النساء أولاً)، و«الحد الأدنى» (توثيق إكلينيكي كله بمحرك نماذج وصفي). حكم عليها ثلاثة محكّمون عدائيون من عدسات الهندسة والتشغيل الإكلينيكي والمنتج: فازت «المنصة أولاً» بعدستين (8/10 إكلينيكياً و8/10 تجارياً)، وفازت «OBGY كبذرة» بعدسة الهندسة (8/10) — فاعتُمدت «المنصة أولاً المخصّبة بـ OBGY»: معمارية المنصة، مع امتصاص أفضل أفكار المقترحين الخاسرين (الجداول النوعية للقياسات السريرية، تثبيت إصدارات النماذج، تحويل تحاليل الذكورة لكتالوج LIS، الانضباط في حواجز التعميم). التفاصيل الكاملة بجداول الدرجات في قسم القرار المعماري، وخمسة سيناريوهات تشغيلية كاملة في قسم السيناريوهات، والمراحل في خارطة الطريق.
الخلاصة للإدارة
المعادلة التي طلبتموها تتحقق هكذا: الـ ERP هو الأرض، والـ HIS هو الهيكل الإكلينيكي العام فوقها، والـ LIS وOBGY (وأي تخصص قادم) أجنحة متخصصة تركب على الهيكل نفسه. بهذا تبيعون لأي مستشفى منصة عامة كاملة، وتتميزون في سوق النساء والخصوبة بعمق إكلينيكي لا يملكه أحد، دون أن يعيق أي طرف الآخر — وكل قرار هنا ملتزم بالقرارات المعتمدة سابقاً (LIS لا يُمس، HIS موديول واحد، الاعتماديات للأمام فقط).
القرار المعماري: مَن يبني على مَن (The Architecture Verdict)
بعد مسح كامل للأدلة (تسعة أقسام موثقة من الشيفرة الفعلية)، وثلاثة مقترحات معمارية متنافسة، ومراجعة تحكيمية عدائية من ثلاث عدسات (الواقع الهندسي، التشغيل السريري، الأعمال والمنتج) — هذا هو القرار النهائي المسبب: مَن هو نواة الـ HIS، وأين يقف OBGY، وكيف يرتبط كل طرف بالآخر. القرار يحترم حرفياً كل القرارات الملزمة المعتمدة سابقاً: Modules/HIS موديول واحد، الاعتماديات أمامية فقط نحو LIS/Accounting/HRM، الرجوع بالأحداث فقط، LIS لا يُمس، ومرضى B2B يبقون في lab_patients.
أولاً: هل يكون OBGY هو نواة الـ HIS؟ — الجواب: لا، بإجماع الأدلة
القرار: OBGY ليس نواة الـ HIS ولن يكون. النواة هي Modules/HIS جديد يُبنى على منصة Moon ERP، ويُستخدم OBGY كـ«بذرة تصميم ومحتوى وأول عميل تجريبي». الأسباب الحاسمة، كلها موثقة من التحليل نفسه:
- OBGY يفتقد الكيان الأهم في أي HIS: لا يوجد مفهوم
Encounterأصلاً — السجلات السريرية في النظام القديم لا تشير إلى جدولvisitsإطلاقاً (القسم 90.1 من التحليل)، بل تُربط بالمريض والتاريخ فقط. العمود الفقري يجب أن يُصمَّم جديداً في كل الأحوال. - لا قدرة تنويم على الإطلاق: صفر ADT، صفر أسرّة/أجنحة، صفر طوارئ، صفر تمريض، صفر eMAR — أي أن 5 من 14 قدرة أساسية لأي مستشفى عام غائبة كلياً عن OBGY.
- لا دورة تأمين: النظام القديم نقدي/فيزا فقط؛ بينما دورة المطالبات السعودية الحرجة (
NPHIESFHIR) تعمل فعلياً في الإنتاج داخل Moon ERP اليوم. - ~48% من محتواه تخصص نسائي بحت (حمل، حقن مجهري، ذكورة، مناظير، عقم) — نظام نصفه محتوى تخصصي لا يصلح أساساً لـ HIS عام.
- صفر شيفرة قابلة للنقل: PHP 5.6 منتهي الدعم، ثغرات SQL Injection مؤكدة ومنتشرة، API موبايل بلا مصادقة — القاعدة الصارمة R12 في مخطط الترحيل نفسه تمنع نقل أي endpoint قديم.
- مخطط ترحيل OBGY نفسه يتبنى هذا الاتجاه: القسم §95 (2.6) صمّم
EncounterوOperativeNoteوSurgicalBookingوخدمة الطابور بشكل محايد للتخصص «حتى تستهلكها وحدة HMS» — أي أن واضع المخطط حسم الجدل مسبقاً.
في المقابل، قيمة OBGY الحقيقية لا تُهدر بل تُحصد في أربعة أشكال: (1) بذرة تصميم مُجرَّبة ميدانياً للنواة العامة (المواعيد/الطابور/فترات اليوم — حيث تسجل المنصة أضعف درجاتها 1/10، ونمط توحيد 18 جدولاً مستنسخاً في 4 جداول متعددة الأشكال، ومحرك الأسئلة والأجوبة، وسير العمليات الجراحية)؛ (2) حزمة محتوى تخصصية كاملة داخل Modules/Obgy؛ (3) أول عميل تجريبي مدفوع مع 10 سنوات بيانات حقيقية و~190 قائمة مصطلحات عربية منسّقة؛ (4) إثبات أن المرحلة الأولى الخارجية (العيادات) قابلة للبيع مستقلة.
ثانياً: موديول منفصل أم مدمج؟ — الجواب: موديولان منفصلان بقاعدة ذهبية
القرار: فصل تام. Modules/HIS موديول واحد (التزاماً بالقرار المعتمد D2) يحمل النواة السريرية المحايدة للتخصص، وModules/Obgy موديول تخصصي مستقل يركَّب فوقه. القاعدة الذهبية — وهي نفسها التي تُبقي LIS قابلاً للبيع مستقلاً اليوم — تطبَّق درجة أعلى: HIS لا يستورد Obgy أبداً، ولا يذكر اسم أي تخصص في شيفرته؛ Obgy يستورد HIS أمامياً فقط، ويُسجّل نفسه عبر نقاط امتداد (PermissionDependencyRegistry وEncounterContentRegistry). هذا هو ما يجعل باقة «Moon Clinic» قابلة للبيع لمستشفى عام بلا قسم نساء، ويجعل مفتاح ترخيص Obgy ذا معنى تجاري حقيقي.
ثالثاً: علاقة كل طرف بالآخر — جملة واحدة لكل علاقة
| العلاقة | الجملة الحاكمة |
|---|---|
| ERP ↔ LIS | LIS موديول تخصصي يركب على قضبان المنصة (BaseModel للتينانسي والتدقيق، DataScope للفروع، SequenceService للترقيم) ويرحّل مالياً حصراً عبر CreateJournalEntry — والمنصة لا تعرف شيئاً عن دواخله. |
| ERP ↔ HIS | HIS يستهلك خدمات المنصة أمامياً (Core وAccounting وHRM وInventory وNPHIES) عبر Actions وServices معلنة، والمنصة لا تتغير إلا بالترقيات المعتمدة في سجل التعميم (أبرزها استخراج ChargePostingService من PostLabInvoice). |
| HIS ↔ LIS | HIS يطلب التحاليل أمامياً عبر Modules\LIS\Actions\CreateLabRequest ممرراً encounter_id، وLIS لا يستورد HIS أبداً — المعلومات تعود خلفياً فقط عبر أحداثه القائمة LabResultReleased / LabRequestCompleted / CriticalResultDetected بصفر تعديل على LIS. |
| HIS ↔ OBGY | Obgy يستورد HIS أمامياً (يفتح his_encounters، يرحّل بنوده إلى his_folio_charges، يبني شيتاته على محرك النماذج والقواميس) ويسجّل صلاحياته وتبويباته عبر السجلات — وHIS لا يستورد Obgy ولا يسميه أبداً. |
| OBGY ↔ LIS | شيتات Obgy تطلب التحاليل عبر مسار HIS نفسه (CreateLabRequest + جدول الربط obgy_lis_test_map لـ276 فحصاً قديماً)، وتحاليل الذكورة والهرمونات تصبح فحوصات في كتالوج LIS نفسه بمدياتها المرجعية (WHO) — والنتائج تعود بالأحداث. |
| OBGY ↔ ERP | مريضة OBGY تصبح صفاً داخلياً في lab_patients مربوطاً مالياً عبر partner_id → AccBpExt (ما يلغي مزامنة cURL القديمة نهائياً)، ودواؤها في صنف Core Product ومخزون Inventory، ونقودها لا تمر إلا عبر his_folio_charges → ChargePostingService → CreateJournalEntry. |
رابعاً: مقارنة المقترحات الثلاثة ودرجات المحكمين
| المقترح | الفكرة | الواقع الهندسي | التشغيل السريري | الأعمال والمنتج | النتيجة |
|---|---|---|---|---|---|
| P-PLATFORM-FIRST الفائز — عدستان من ثلاث | نواة HIS رفيعة محايدة للتخصص + Obgy أول موديول تخصصي مركّب | 7 | 8 (فائز) | 8 (فائز) | يُعتمد — بعد امتصاص ضوابط التسلسل من المقترح الثاني |
| OBGY-AS-SEED وصيف قوي | توليد Modules/HIS مباشرة من مخطط OBGY §95 وإطلاق صحة المرأة أولاً | 8 (فائز) | 7 | 7 | تُمتص ضوابطه: العميل التجريبي من المرحلة صفر، قاعدة «كل جدول له مستهلك إنتاجي»، بوابة التخصص الثاني |
| Thin-HIS / ERP-Maximalist | ~17 جدولاً + محرك نماذج EAV/JSON يحمل التوثيق السريري كله | 4.5 | 4.5 | 6 | يُرفض كمعمارية (السجل السريري كـJSON غير مقبول طبياً-قانونياً) — وتُنهب أفضل أفكاره |
منطق الحسم: العدسة الهندسية فضّلت OBGY-AS-SEED لأن تصميمه مدفوع الثمن مسبقاً (مخطط §95)، لكن عدستي التشغيل السريري والأعمال رجّحتا P-PLATFORM-FIRST لأنه الوحيد الذي يصل لمستشفى عام بمسار غير مشروط، ويُطلق التعميم التأميني/NPHIES مع أول باقة جديدة لا في آخر المراحل، ويحافظ على مصفوفة الترخيص الرباعية نظيفة، وبصفر قرارات معاد فتحها. القرار النهائي: P-PLATFORM-FIRST معدَّلاً بتسلسل OBGY-AS-SEED — أي «المنصة أولاً، ببذرة OBGY وعميله».
خامساً: الأفكار الممتصة من المقترحين الخاسرين (ملزمة في التنفيذ)
- من OBGY-AS-SEED: توقيع عيادة OBGY كعميل تجريبي مدفوع أثناء المرحلة صفر (خدمات الترحيل تُفوتر وتموّل الطريق)؛ قاعدة «كل جدول في النواة له مستهلك إنتاجي في أول قطار إصدار» كشرط إطلاق صارم؛ بوابة «التخصص الثاني» الملزمة قبل تمويل التنويم لإثبات حياد النواة؛ نمط ETL الآمن سريرياً (الصفوف غير المطابقة تصبح مواجهات
source=migrationبدرجات ثقة وطوابير مراجعة طبية لا تخمينات صامتة)؛ أعمدةscheduled_atوالموارد فيhis_appointmentsمن اليوم الأول. - من ERP-Maximalist: جدول
his_observationsالمُنمَّط (سلاسل زمنية سريرية بنمطFHIR Observation— علامات حيوية، منحنيات الحمل، قياسات الجريبات)؛his_episodesكرأسEpisodeOfCareعام (الحمل = نوع حلقة)؛ إصدارات نماذج غير قابلة للتعديل مع سير توقيعdraft|signed|amendedلكل استجابة سريرية (متطلب طبي-قانوني)؛ تحويل تحاليل الذكورة والهرمونات إلى كتالوج LIS؛ حوكمة «مبرر كسر الميتاداتا» لأي جدول تخصصي صلب جديد؛ الحدث العامFormResponseSubmitted. - ضوابط هندسية مشتركة: بوابات CI آلية تمنع
use Modules\Obgyخارج موديوله وuse Modules\HISداخل LIS؛ تأجيل أي تعميم (نماذج/قواميس) إلى ما بعد وجود قوالب OBGY الحقيقية؛ القيد الفريدUNIQUE(source_type, source_id)على بنود الرسوم كضمانة قاعدة-بيانات ضد الترحيل المزدوج.
سادساً: خريطة الموديولات المعتمدة واتجاهات الاعتماد
| الموديول | الدور | أهم الجداول/المكونات | يستورد (أمامياً) ← | يُمنع عليه |
|---|---|---|---|---|
Modules/HIS جديد — موديول واحد | النواة السريرية المحايدة: المواجهة، الحساب المالي، المواعيد، الأوامر، النماذج، الملاحظات، الجراحة، ثم ADT لاحقاً | his_encounters، his_encounter_diagnoses، his_episodes، his_appointments، his_visit_periods، his_folios، his_folio_charges، his_folio_payments، his_deposits، his_prescriptions(+items)، his_service_orders(+items)، his_form_templates/versions/responses، his_observations، his_lookups، his_clinical_exams، his_patient_spouses، his_surgical_bookings، his_operative_notes؛ لاحقاً: his_wards/rooms/beds، his_bed_assignments | Core، LIS، Accounting، HRM، Inventory، NPHIES | استيراد Obgy أو تسمية أي تخصص |
Modules/Obgy جديد — تخصصي | عمق صحة المرأة: الشيتات المعقدة كجداول، البسيطة كمحتوى نماذج مُبذَّر | obgy_pregnancies، obgy_antenatal_visits، obgy_ivf_cycles + جداول المراحل (سحب بويضات، إرجاع أجنة، تجميد)، obgy_imaging_studies + موجودات الموجات، obgy_endoscopy_*، obgy_infertility_files، التواريخ التوليدية، obgy_lis_test_map؛ القياسات في his_observations والذكورة/الهرمونات في كتالوج LIS | HIS، Core، LIS | جداول مرضى/أطباء/أدوية/أسعار/خزائن خاصة، أو ترحيل GL مباشر |
Modules/LIS لا يُمس | المختبر كما هو — القيد الحاكم D5: صفر تأثير أداءً وسلوكاً | تغيير وحيد مؤجل: تفعيل FK على عموده الخامل lab_requests.encounter_id عند الانطلاق | (كما هو اليوم) | استيراد HIS نهائياً |
Core / Accounting / HRM / Inventory / NPHIES | العمود الفقري القائم | ترقيات معتمدة فقط: ChargePostingService في Core (تعميم PostLabInvoice ببادئة إعدادات his.*)، توسيع type-hints في NPHIES (FhirPatientBuilder) للمريض المشترك | — | أي اعتماد على موديول سريري |
سابعاً: عقود الأحداث (Event Contracts)
| الحدث | المُصدِر | المستهلكون | الحمولة الأساسية |
|---|---|---|---|
LabResultReleased قائم | LIS | HIS (إلحاق النتيجة بالمواجهة)، Obgy (عرضها في الشيت) | LabResult |
LabRequestCompleted / CriticalResultDetected قائم | LIS | HIS (إغلاق الأمر / صندوق إنذار الطبيب والتمريض) | LabRequest / النتيجة الحرجة |
BusinessPartnerCreated قائم | Core | Accounting (CreatePartnerAccounts — حسابات ذمم المريض آلياً) | الشريك التجاري |
EncounterOpened / EncounterClosed جديد | HIS | Obgy، التقارير، الإشعارات | encounter_id, patient_id, type |
AppointmentBooked / AppointmentCheckedIn جديد | HIS | شاشة الانتظار، البوابة، الإشعارات | appointment_id, period_id |
FolioChargePosted جديد — الخطاف المالي الموحد | HIS | أي موديول سريري حالي أو مستقبلي (أشعة/عمليات) — مع قيد UNIQUE(source_type, source_id) | folio_id, source_type, source_id, total |
FolioClosed جديد | HIS | توليد فواتير مقسومة حسب الدافع → ChargePostingService → CreateJournalEntry(source_type='his_invoice') → مطالبة NphiesClaimService::submit() | folio_id |
PatientAdmitted/Transferred/Discharged جديد — مرحلة التنويم | HIS | وظيفة يوم-السرير الليلية على الـ Folio، لوحة الأسرّة | encounter_id, bed_id |
PrescriptionDispensed جديد | HIS | Inventory (StockService::decreaseStock بمرجع الروشتة) + بند Folio | prescription_id, encounter_id |
FormResponseSubmitted جديد — ممتص | HIS | مستمعو التخصصات (مثال: Obgy يُقدّم مرحلة دورة الحقن المجهري عند توقيع نموذج السحب) | form_response_id, form_code, encounter_id |
PregnancyOpened/Closed، IvfCycleStageCompleted جديد | Obgy | داخل Obgy والتقارير فقط — HIS لا يستمع لأي تخصص | pregnancy_id / cycle_id, stage |
ثامناً: العمود الفقري للبيانات — قرار MPI / Encounter / Folio
- سجل المرضى الرئيسي (MPI):
lab_patientsمرقّى في مكانه (القرار المعتمد D1 — لا جدول مرضى ثانٍ أبداً، لا إعادة تسمية): HIS وObgy يستهلكانه عبر النطاق المسمّىLabPatient::internal()فقط؛ مرضى B2B معزولون بـexternal_lab_idوالفهرس الفريد؛ مرضى OBGY يُرحَّلون كصفوف داخلية (statusno → mrn) مع فصل بيانات الزوج إلىhis_patient_spouses؛ الجسر الماليpartner_id → AccBpExtيلغي مزامنة cURL القديمة. - المواجهة (Encounter):
his_encountersتحملtype(عيادات/تنويم/طوارئ/يوم واحد) وparent_encounter_idمن أول هجرة — فالتنويم لاحقاً إضافة لا إعادة بناء؛attending_doctor_id → lab_doctors → employees → usersتوحّد الهوية السريرية والوظيفية؛his_episodesفوقها للحلقات الطولية (الحمل، ملف العقم)؛ وعمودlab_requests.encounter_idالخامل (هجرة2026_06_10_160000) يحصل على مفتاحه الأجنبي عند الانطلاق. - الحساب المالي (Folio):
his_folios(دافع: نقدي/تأمين/حساب B2B) +his_folio_chargesمتعددة المصادر بقيدUNIQUE(source_type, source_id)— الفعل السريري يُفوتر مرة واحدة فقط، وفواتير المختبر تدخل بالمرجع ولا تُرحَّل ثانية (D4)؛ الإقفال يولّد الفواتير ويرحّل عبرChargePostingServiceالمستخرج منPostLabInvoiceالمجرَّب، وأعمدة المطالبة (nphies_claim_status...) تتبع نمطlab_invoicesالمثبت.
سيناريوهات تشغيلية: كيف يعمل الجميع معاً (Operational Scenarios)
خمسة مسارات تشغيلية كاملة من البداية للنهاية تُظهر المعمارية المعتمدة وهي تعمل: أي موديول يتحرك في كل خطوة، وأي جدول يُكتب، وأي حدث يُطلق، وأين يمر المال. السيناريوهات تغطي العيادة الخارجية، والتنويم والولادة، ودورة الحقن المجهري، ومستشفى عاماً بلا قسم نساء، واستمرار معامل B2B بلا أي تأثر — وكلها تسير على نفس العمود الفقري: lab_patients → his_encounters → his_folio_charges → CreateJournalEntry.
السيناريو 1: مريضة عيادة نساء خارجية — من الحجز إلى القيد المحاسبي
- الحجز: موظفة الاستقبال (أو بوابة المريض) تحجز موعداً في
Modules/HIS— صف فيhis_appointmentsمرتبط بفترة سعة فيhis_visit_periods، ويُطلق الحدثAppointmentBookedفتتحدّث شاشة الانتظار. - الوصول والطابور: عند تسجيل الحضور (
AppointmentCheckedIn) يفتح HIS مواجهةhis_encountersبنوعopdورقم تسلسلي منSequenceService، ويستمد المريضة منlab_patientsعبر النطاقinternal()، ويضبطqueue_position— ويُطلقEncounterOpened. - الشيت السريري: الطبيبة تفتح مساحة العمل
/clinic/*؛ تبويب الشيت النسائي يأتي منModules/Obgyالمسجّل فيEncounterContentRegistry: الشيت البسيط يُحفظ كاستجابة نموذجhis_form_responsesمثبتة على إصدار غير قابل للتعديل (his_form_versions) ثم تُوقَّع (draft → signed)، والعلامات الحيوية تُسجَّل صفوفاً منمّطة فيhis_observations. - الروشتة: وصفة في
his_prescriptions/his_prescription_itemsبأصناف منCore Product؛ عند الصرف من الصيدلية يُطلقPrescriptionDispensedفيخصمInventory StockService::decreaseStockالمخزون بمرجع الروشتة، ويُضاف بند إلىhis_folio_charges. - طلب التحاليل: الطبيبة تطلب تحليلاً من شاشة HIS التي تستدعي
Modules\LIS\Actions\CreateLabRequest(المسار المستخرج خصيصاً لهذا) ممررةًencounter_id— فيتولد طلبlab_requestsبتسعيره وفاتورته داخل LIS بلا أي تعديل عليه، ويظهر في worklists المختبر كأي طلب آخر. - النتيجة: المختبر يُدخل ويعتمد ويُصدر النتيجة بدورة عمله المعتادة؛ الحدث
LabResultReleasedيصل مستمعَ HIS فيُلحق النتيجة بالمواجهة وتظهر داخل شيت Obgy عبرobgy_lis_test_map؛ ولو كانت حرجة فالحدثCriticalResultDetectedينبّه الطبيبة فوراً. - الفوترة: كشف العيادة والسونار والصرف بنود في
his_folio_chargesبقيدUNIQUE(source_type, source_id)؛ فاتورة المختبر تدخل الـ Folio بالمرجع فقط ولا تُرحَّل ثانية. - القيد المحاسبي: إقفال الـ Folio (
FolioClosed) يولّد الفاتورة حسب الدافع، ثم يرحّلChargePostingServiceالقيد عبرModules\Accounting\Actions\CreateJournalEntry(مدين ذمم المريضة عبرAccBpExt.ar_account_id/ دائن إيراد وضريبة) بمصدرsource_type='his_invoice'— ولو كانت مؤمَّنة تنطلق المطالبة عبرNphiesClaimService::submit().
السيناريو 2: حالة ولادة وتنويم — ADT والعمليات ومطالبة التأمين
- الدخول (Admission): من الطوارئ أو بحجز مسبق، يفتح HIS مواجهة
his_encountersبنوعipd(وقد تكون ابنة مواجهة العيادة عبرparent_encounter_id)، ويُطلقPatientAdmitted. - السرير: تخصيص سرير في
his_bed_assignments(جناح → غرفة → سرير منhis_wards/his_rooms/his_beds)؛ كل نقلة داخلية تُسجَّل بحدثPatientTransferred، ووظيفة ليلية تضيف بند «يوم سرير» إلىhis_folio_chargesآلياً. - التحقق التأميني: عند مكتب الدخول يُستدعى
NphiesEligibilityService::check()(بعد توسيع مدخلاته للمريض المشترك)، ويُحصل على موافقة مسبقةNphiesPreauthتُربط بالـ Folio. - الأوامر أثناء الإقامة: تحاليل عبر
CreateLabRequest(encounter_id, source=in_patient)— قيمة الـ enum موجودة أصلاً في LIS؛ أدوية عبرhis_prescriptionsثم الصرف والخصم المخزني؛ كل بند يصل الـ Folio بحدثFolioChargePosted. - الولادة القيصرية: حجز في
his_surgical_bookings، ثم تقرير عمليات منمّط فيhis_operative_notes(فريق الجراحة فيhis_operative_note_staff، التخدير والشق من قواميسhis_lookups) — وتسجيل المولود حدثDeliveryRecordedفيModules/Obgy؛ مستلزمات العملية تُخصم من مخزن العمليات (Inventorywarehouse) وتتقيد كبنود Folio. - الخروج:
PatientDischargedيحرر السرير ويغلق المواجهة؛FolioClosedيقسم الفاتورة: حصة المريضة نقداً عبر خزائن وورديات الكاشير القائمة، وحصة التأمين فاتورة تحمل أعمدةnphies_claim_status / nphies_preauth_ref / nphies_covered_amountبنمطlab_invoicesالمثبت. - المطالبة:
NphiesClaimService::submit()يبني مطالبة FHIR (بالتشخيصات منhis_encounter_diagnosesوأكوادSBSعلى كتالوج الخدمات) ويسجّل كل شيء فيnphies_transactions، والرد يعود بالـ polling ويحدّث الفاتورة — ثم قيد التحصيل عبرCreateJournalEntry.
السيناريو 3: دورة حقن مجهري IVF — حلقة طولية عبر الموديولات
- فتح الملف: ملف عقم للزوجين: المريضة صف
lab_patientsداخلي، وبيانات الزوج فيhis_patient_spouses؛ تُفتح حلقة رعايةhis_episodesبنوع «دورة IVF» يملك تفاصيلهاobgy_ivf_cyclesفيModules/Obgy، ويُطلقIvfCycleOpened. - تحاليل ما قبل الدورة: الهرمونات وتحليل السائل المنوي فحوصات في كتالوج LIS نفسه (مُبذَّرة بمدياتها المرجعية WHO) تُطلب عبر
CreateLabRequest— فتحصل مجاناً على دورة التحقق والاعتماد وواجهات الأجهزة، وتعود النتائج بحدثLabResultReleasedإلى شيت العقم. - المتابعة والتنشيط: كل زيارة متابعة مواجهة
opdمرتبطة بالحلقة؛ قياسات الجريبات وسماكة البطانة تُسجَّل صفوفاً منمّطة فيhis_observationsوتُعرض في ودجة الشبكة الزمنية (observation grid) — لا JSON مدفوناً. - السحب والإرجاع: سحب البويضات إجراء جراحي يومي (
his_encounters type=daycase+his_surgical_bookings)؛ توقيع نموذج السحب يُطلقFormResponseSubmittedفيستمع Obgy ويقدّم مرحلة الدورة (IvfCycleStageCompleted): تخصيب →obgy_embryo_transfers→ تجميد الفائض فيobgy_cryopreservations. - المال والنتيجة: كل مرحلة ترحّل بنودها إلى
his_folio_charges(باقة الدورة أو بنوداً متدرجة) وتُفوتر عبر نفس مسارChargePostingService؛ ونتيجة الدورة (حمل إيجابي) تغلق الحلقة وتفتح تلقائياً ملف حملobgy_pregnanciesبحدثPregnancyOpened— فتبدأ متابعة الحمل على نفس العمود الفقري.
السيناريو 4: مستشفى عام بلا قسم نساء — نفس المنصة بمفتاح ترخيص مختلف
- التفعيل: عميل جديد (مستشفى باطنة وجراحة عامة) يُرخَّص له
Core + Accounting + HRM + Inventory + LIS + HISفقط؛Modules/Obgyغير مفعّل — والتحقق على مستوى الـ API (بند المرحلة صفر) لا الواجهة فقط. - لا أثر للتخصص: لأن HIS لا يستورد Obgy ولا يسميه، تعمل النواة كاملة: مواعيد وطوابير، مواجهات، تشخيصات ICD في
his_encounter_diagnoses، أوامر تحاليل وأدوية، تنويم وأسرّة، عمليات عامة فيhis_surgical_bookings/his_operative_notes— بلا جدول نسائي واحد في قاعدة بياناته. - محتوى تخصصاته: شيتات الباطنة والجراحة تُؤلَّف كمحتوى في محرك النماذج (
his_form_templates+ قواميسhis_lookupsبنطاقات خاصة) — وأي تخصص مستقبلي يحتاج جداول صلبة يمر بحوكمة «مبرر كسر الميتاداتا». - الإثبات المؤسسي: هذا السيناريو هو نفسه «بوابة التخصص الثاني» الملزمة قبل تمويل التنويم: تشغيل تخصص رفيع كمحتوى خالص يثبت للإدارة أن النواة ليست نظام نساء وتوليد متنكراً.
- نفس المال ونفس المختبر: الفوترة والمطالبات والمخزون والرواتب تمر بنفس المسارات (
FolioClosed → ChargePostingService → CreateJournalEntry → NPHIES) — أي أن باقة «Moon Hospital» منتج تركيب وترخيص، لا مشروع تطوير جديد لكل عميل.
السيناريو 5: معمل B2B الحالي يستمر — صفر تأثر بكل ما سبق
- العزل بالبيانات: مرضى المعامل الخارجية يبقون في
lab_patientsبمالكهمexternal_lab_idوالفهرس الفريد(company_id, ext_scope_key, national_id)— القرار المحسوم 37/40؛ وHIS لا يراهم أصلاً لأنه يقرأ عبرLabPatient::internal()حصراً، وبلا أيGlobal Scopeشامل (القيد المعتمد). - العزل بالاتجاه: LIS لا يستورد HIS بنص القرار D2؛ عموده
encounter_idيبقىNULLلكل طلبات B2B والمشي المباشر، فلا يتغير سلوك بوابة المعامل الخارجية ولا سلسلة المناديب (lab_external_lab_couriers) ولا الفوترة الشهرية للمعامل. - العزل بالأداء: القيد الحاكم D5 يسري على كل مرحلة: صفر استعلامات مضافة على المسارات الساخنة (worklist والاستقبال)، وبوابة قبول لكل بند = نجاح كل الاختبارات + قياس
curlقبل/بعد، وأي تدهور يُرجِع البند فوراً. - العزل بالأدوات: بوابات CI تمنع آلياً ظهور
use Modules\HISداخل LIS — حماية ميكانيكية لا تعتمد على الانضباط وحده، لأن nwidart لا يفرض اتجاهات الاعتماد بنفسه. - الخلاصة التجارية: باقة «Moon Lab» (Tier-1) تظل تُباع وتعمل مستقلة تماماً كما اليوم — وهي التي تموّل المراحل الأولى من خارطة الطريق.
Folio → ChargePostingService → CreateJournalEntryخارطة الطريق والمراحل (Roadmap & Phasing)
خطة تنفيذ متدرجة من اليوم: تبدأ بحزمة الجاهزية المعتمدة فعلاً (المرحلة صفر، ~7–10 أيام عمل)، وتسير بحيث تنتج كل مرحلة زيادة قابلة للبيع تموّل التي تليها — مختبر ← عيادات ← صحة المرأة ← مستشفى. القاعدتان الحاكمتان طوال الطريق: كل جدول في النواة له مستهلك إنتاجي في أول قطار إصدار له، وLIS لا يتأثر أداءً ولا سلوكاً (بوابة قياس قبل/بعد لكل بند).
تسلسل المراحل
| المرحلة | النطاق | الموديولات الملموسة | الزيادة القابلة للبيع | الحجم | الاعتماديات |
|---|---|---|---|---|---|
| المرحلة 0 — جاهزية المنصة معتمدة — لم تبدأ | بنود hms-phase0-spec.md الستة: W1-1 ترقية DataScope إلى Core، W1-2 عمود employee_id على lab_doctors، W1-3 استخراج CreateLabRequest + عمود encounter_id الخامل، W1-4 PermissionDependencyRegistry (يصلح انعكاس Core→LIS)، W2-1 تحصين B2B (نطاقات internal()/forLab())، W2-2 فرض تفعيل الموديولات على مستوى الـ API بوضع التسجيل أولاً |
Core، LIS (بنود خاملة فقط) |
لا منتج جديد — لكنها بوابة دخول إلزامية لكل ما بعدها، وتفتح طريق التسعير المتدرج (فرض الترخيص) | S ~7–10 أيام عمل | لا شيء — تبدأ فوراً |
| المرحلة 0-ب — مسار تشغيلي موازٍ ممتص من المقترح الوصيف | معالجة فورية لثغرات النظام القديم (SQLi، إغلاق mobileservices.php، إزالة نسخ القاعدة من جذر الويب)؛ تصدير إنتاجي حديث للقواميس (~190 قائمة) وجداول RedBean (بوابة حاجزة — خطر R7)؛ توقيع عيادة OBGY عميلاً تجريبياً مدفوعاً بعقد خدمات ترحيل يُفوتر من الآن |
النظام القديم فقط — صفر مساس بـ Moon ERP | إيراد خدمات الترحيل يبدأ قبل أول سطر شيفرة في HIS | S | موازية للمرحلة 0 — فريق تشغيل لا تطوير |
| المرحلة 1 — نواة HIS للعيادات الخارجية | سقالة Modules/HIS؛ العمود الفقري (his_encounters/his_episodes/his_folios/his_folio_charges بقيد الفوترة الأحادية)؛ محرك المواعيد والطابور (his_appointments بأعمدة scheduled_at والموارد من اليوم الأول)؛ استخراج ChargePostingService وتعميم قوائم الأسعار والتأمين وتوسيع FhirPatientBuilder (جاهزية NPHIES من أول باقة)؛ مساحة العمل /clinic/*؛ ثم — أخيراً لا أولاً — محرك النماذج والقواميس (his_form_templates/versions/responses بسير التوقيع، his_lookups، his_observations) مستخرجاً من قوالب OBGY الحقيقية |
Modules/HIS (جديد)، Core (الترقيات المعتمدة)، NPHIES (توسيع type-hints) |
Tier-2 باقة Moon Clinic — عيادات ومجمعات طبية (مصر والسعودية) بمواعيد وطوابير وفوترة ومطالبات؛ وشرط الإطلاق: العميل التجريبي يمارس فعلياً كل جدول في النواة | L 8–14 أسبوع-شخص | المرحلة 0 مكتملة؛ قرار إداري واحد (انظر جدول القرارات) |
المرحلة 2 — Modules/Obgy وإطلاق العميل التجريبي |
جداول التخصص المعقدة فقط (obgy_pregnancies، obgy_ivf_cycles ومراحلها، التصوير، المناظير، ملفات العقم) — والشيتات البسيطة محتوى نماذج مُبذَّر؛ الذكورة والهرمونات إلى كتالوج LIS؛ ترحيل البيانات: المرضى إلى lab_patients، فصل صفوف الدفع السحرية (detectionid −99/999/9999) عن المواجهات، الصفوف غير المطابقة كمواجهات source=migration بطوابير مراجعة طبية (خطر R2)؛ ترحيل الوسائط 4.8GB؛ الإطلاق الفعلي بالعيادة |
Modules/Obgy (جديد)، Modules/HIS (استهلاك)، LIS (بذور كتالوج فقط) |
Tier-3 باقة Moon Women's Health — مراكز نساء وتوليد وحقن مجهري، بميزة المحتوى العربي المنسّق وعمق IVF النادر في الأنظمة العامة (~22–34 أسبوع-شخص تراكمياً) | L 8–12 أسبوع-شخص (يتداخل ذيلها مع المرحلة 1) | المرحلة 1 + التصدير الإنتاجي للقواميس (0-ب) |
| المرحلة 3 — بوابة التخصص الثاني ملزمة | تشغيل تخصص رفيع (مثلاً باطنة عامة) كمحتوى خالص: نماذج + قواميس + كتالوج خدمات، بلا جدول صلب واحد — لإثبات أن محركات النواة (الفحص/التاريخ المرضي/القواميس/المواعيد) خالية من بصمة النساء والتوليد؛ أي جدول صلب جديد يمر بحوكمة «مبرر كسر الميتاداتا» بموافقة الإدارة | Modules/HIS (محتوى وبذور فقط) |
عرض بيعي حي: «أضف تخصصاً في أسابيع» — وتأمين مصداقية باقة المستشفى قبل تمويلها | S–M 2–4 أسابيع-شخص | المرحلة 1؛ شرط مسبق لتمويل المرحلة 4 |
| المرحلة 4 — التنويم وحركة المرضى (ADT) | الأجنحة والغرف والأسرّة (his_wards/rooms/beds/bed_assignments)، أحداث الدخول/النقل/الخروج، وظيفة يوم-السرير الليلية على الـ Folio، العربون والدفعات المقدمة على سندات القبض القائمة، تصميم الطوارئ والفرز (سلم ترياج + لوحة تتبع — تصميم جديد كلياً، لم يصممه أحد بعد)، أساسيات محطة التمريض |
Modules/HIS (امتداد داخلي)، Accounting (استهلاك) |
Tier-4 باقة Moon Hospital — مستشفيات عامة وخاصة بدورة تنويم كاملة ومطالبات تأمين | L 10–16 أسبوع-شخص | المرحلتان 1 و3؛ تموّلها إيرادات Tier-2/3 |
| المرحلة 5 — الامتدادات السريرية | الصيدلية السريرية وeMAR (طبقة «إعطاء الدواء» الغائبة في كل المقترحات — تُبنى فوق سلسلة الوصف/الصرف القائمة)؛ تعميم إدارة العمليات للمستشفيات العامة بعد التحقق منها على حالات OBGY الجراحية الحقيقية؛ الأشعة (RIS) بعقد «المنفّذ» نفسه D3 الذي يستعمله المختبر؛ سجل الحساسية وقائمة المشاكل | Modules/HIS، موديول أشعة مستقبلي |
ترقيات مسعّرة داخل باقتي Tier-3/4 | M–L لكل امتداد 4–10 أسابيع-شخص | المرحلة 4 لمعظمها؛ الأشعة قد تسبقها |
المخاطر والقرارات المطلوبة من الإدارة
| الخطر | الأثر | التخفيف | القرار المطلوب من الإدارة |
|---|---|---|---|
تعارض نطاق: العمق السريري في Modules/Obgy يسبق سقف «HIS v1 إداري-مالي» المعتمد (خطر تضخم EMR رقم 7) | توسع غير ممول وتأخر المرحلة 1 | العمق السريري محصور حصراً خلف مفتاح ترخيص Obgy الذي تموّله شريحته الدافعة — النواة تبقى إدارية-مالية | اعتماد تعديل صياغة رسمي واحد: «العمق السريري مسموح داخل الموديولات التخصصية المرخّصة فقط» — هذا هو القرار الوحيد المعاد فتحه جزئياً |
فرض الترخيص اليوم واجهة فقط (moduleGuard) — الخادم لا يتحقق | التسعير المتدرج بالباقات مستحيل تقنياً | بند المرحلة 0 (W2-2): فرض على مستوى الـ API بوضع تسجيل-فقط أولاً لأن إعدادات الشركات الحية قديمة | اعتماد موعد التحول من «تسجيل فقط» إلى «فرض فعلي» بعد أسبوعين من المراقبة |
| R7: القواميس المنسّقة (~190 قائمة) وجداول RedBean موجودة في الإنتاج فقط — نسخة 2024 فارغة | بذور his_lookups وكل الـ ETL محجوبة | تصدير إنتاجي حديث كبوابة حاجزة في المرحلة 0-ب قبل أي عمل بذور | تفويض الوصول للإنتاج القديم وجدولة التصدير فوراً |
| R2: السجلات السريرية القديمة لا تشير إلى الزيارات — الربط بالمواجهات اجتهادي (مريض+تاريخ) | بيانات تاريخية ملصوقة بمواجهات خاطئة = خطر سريري | الصفوف غير المؤكدة تُرحَّل كمواجهات source=migration بدرجات ثقة وطوابير مراجعة يعتمدها طبيب — لا تخمين صامت | اعتماد ميزانية وقت طبي للمراجعة ضمن عقد الترحيل المدفوع |
| انحياز نسائي يتحجر في النواة «العامة» (قوائم فحص الثدي/الغدة، نموذج فترات اليوم في الجدولة) | باقة المستشفى تُكشف كنظام نساء متنكر | بوابة التخصص الثاني الملزمة (المرحلة 3) + مراجعة حياد لكل مخطط نواة + أعمدة جدولة قابلة للترقية من اليوم الأول | اعتماد البوابة شرطاً مالياً ملزماً قبل صرف ميزانية المرحلة 4 |
| محرك النماذج بنية تحتية جديدة بلا سابقة في المنصة (درس «محركات الطباعة الأربعة») | تجريد بلا مستهلك يتعفن ويعاد بناؤه | يُبنى أخيراً في المرحلة 1 مستخرجاً من قوالب OBGY الحقيقية؛ قاعدة «كل جدول له مستهلك إنتاجي»؛ الشيتات المعقدة تتجاوزه إلى جداول صلبة | لا قرار — ضابط تنفيذي يُراقب في مراجعات المراحل |
| الطوارئ (ترياج) وeMAR وسجل الحساسية لم يصممها أي مقترح — فجوة مشتركة كشفها التحكيم | بيع باقة المستشفى بقدرات ناقصة سريرياً | مقيدة بنوداً مسماة في المرحلتين 4 و5 بتصميم جديد، لا وعود ضمنية | إقرار أن باقة Tier-4 لا تُسوَّق قبل اكتمال بنود الطوارئ والتمريض في المرحلة 4 |
| تركّز الإيراد المرجعي في عميل واحد (عيادة OBGY) | انكشاف تجاري وتصميم مفرط التخصيص | المرحلة 1 تستهدف شريحة العيادات الواسعة بالتوازي؛ NPHIES جاهز من أول باقة لفتح السوق السعودي | اعتماد هدف مبيعات: عميلا Tier-2 على الأقل خلال ربعين من إطلاق المرحلة 1 |
نواة Moon ERP والموديولات الخمسة عشر (Moon ERP Core & Modules)
منصة Laravel 12 مبنية على نظام موديولات nwidart/laravel-modules مع واجهة Angular، تعمل حالياً في الإنتاج بخمسة عشر موديولاً مفعّلاً بالكامل (modules_statuses.json). توفر النواة خدمات منصّة جاهزة — تعدد الشركات والفروع، الصلاحيات، التدقيق، الترقيم، الإعدادات، الموافقات، وناقل الأحداث — يرثها أي موديول جديد (HIS أو OBGY) دون أي تطوير إضافي.
نظرة رقمية سريعة
خدمات المنصة التي يرثها أي موديول جديد مجاناً
- تعدد الشركات كل نموذج يرث
App\Models\BaseModelفيحصل تلقائياً علىTenantAware(ختمcompany_idعند الإنشاء + نطاقscopeTenant)، وAuditable(سجل تدقيق كامل عبرspatie/laravel-activitylog)، وSoftDeletes، وHasArabicContent(ثنائية اللغةname/name_ar). - الفروع جدول
branchesمركزي (app/Models/Branch.php) بعلاقةbranch_userمع علمis_primary؛ كل عملية جديدة تُختم بفرع المستخدم الأساسي عبرDataScope::operatingBranchId(). - رؤية البيانات نمط
Modules/Core/app/Support/DataScope.php: لكل دورdata_scopeبقيمall / branch / ownتُطبَّق على استعلامات القوائم مع دعم فلتر?branch_id=ورأسX-Branch-Idمن واجهة Angular — صُمّم أصلاً لـ LIS وقابل للتطبيق المباشر على أي موديول إكلينيكي. - الصلاحيات
spatie/laravel-permissionمعModules\Core\Models\Role، وسجلّ تبعيات الصلاحياتPermissionDependencyRegistryالذي يسمح لكل موديول بتسجيل شجرة صلاحياته وحزم أدواره الجاهزة عند الإقلاع (LIS مسجَّل بالبادئةlisمنLISServiceProvider) — نفس النمط جاهز لبادئتيhisوobgy. - ناقل الأحداث أحداث نطاق حقيقية: النواة تبث
BusinessPartnerCreatedفيستمع موديول المحاسبة عبرCreatePartnerAccountsلإنشاء الحسابات تلقائياً؛ وLIS يملك 10 أحداث (مثلLabResultReleasedوCriticalResultDetected) مع 11 مستمعاً داخلياً. - الترقيم
SequenceServiceبترقيم لكل شركة/موديول/كيان مع خيارper_branchوإعادة تصفير حسب السنة المالية (sequences+sequence_counters). - الإعدادات
SettingsServiceبأربعة نطاقات (SettingScope:global / company / branch / user) مع تعريفاتsetting_definitions. - الموافقات محرك
ApprovalWorkflowServiceمتعدد المستويات (approval_workflows/approval_workflow_levels/approval_logs) — حالياً مقصور علىSalesوPurchasesفيApprovalModuleويحتاج توسعة للسياقات الإكلينيكية (استنتاج). - المرفقات مرفقات Polymorphic موحّدة:
attachments+ سمةHasAttachments(morphMany) — جاهزة لملفات الأشعة والتقارير الطبية. - الذكاء الاصطناعي طبقة AI جاهزة في النواة:
AiChatServiceمع جداولai_settingsوai_usage_logsوai_response_cache. - SaaS طبقة ترخيص وحصص على مستوى التطبيق:
MoonLicenseClientوQuotaTrackingServiceوسمةTracksQuota(مثلmax_usersوmax_branches) وCentralSyncQueue.
سجل الأطراف الموحّد: يوجد «شريك أعمال» ولا يوجد «مريض» في النواة
الكيان الرئيسي للأطراف في النواة هو Modules\Core\Models\BusinessPartner (جدول business_partners) بأعلام is_customer/is_supplier وعلاقات جهات اتصال وعناوين، وتُبنى فوقه امتدادات لكل موديول: المحاسبة عبر AccBpExt وCRM عبر crm_customer_ext (partner_id). أما المريض فلا وجود له على مستوى النواة إطلاقاً؛ الكيان الوحيد للمرضى هو Modules\LIS\Models\LabPatient (جدول lab_patients) داخل موديول المعمل، ويحمل mrn وبيانات التأمين ورموز بوابة المريض، ويرتبط بسجل الأطراف عبر partner_id. كذلك يرتبط الأطباء (LabDoctor) وشركات التأمين (LabInsuranceContract) والمعامل الخارجية (LabExternalLab) جميعاً بـBusinessPartner عبر partner_id. أي مشروع HIS سيتطلب ترقية «ملف المريض» إلى سجل رئيسي مشترك بدل بقائه حبيس موديول المعمل (استنتاج).
الموديولات الخمسة عشر وكياناتها الرئيسية
| الموديول | الغرض | الكيانات الرئيسية | Migrations / Models |
|---|---|---|---|
Core | البيانات الرئيسية وخدمات المنصة المشتركة | BusinessPartner, Product, Role, Sequence, Setting, ApprovalWorkflow, Attachment | 39 / 31 |
Accounting | دفتر أستاذ كامل وأصول وبنوك وموازنات | Account, JournalEntry, FiscalYear, BankReconciliation, FixedAsset, CostCenter | 51 / 44 |
LIS | نظام معلومات المعامل المكتمل (المرجع الإكلينيكي القائم) | LabPatient, LabRequest, LabSample, LabResult, LabInvoice, LabMachine, LabQcResult, LabInsuranceContract | 137 / 66 |
HRM | الموارد البشرية: حضور بيومتري وإجازات ورواتب وتوظيف | Employee, Attendance, Payroll, LeaveRequest, BiometricDevice, Shift | 47 / 40 |
Inventory | المخازن والحركات وطبقات التكلفة والجرد | Warehouse, StockBalance, InventoryMovement, InventoryCostLayer | 15 / 14 |
Sales | دورة البيع: عرض سعر ← أمر ← تسليم ← فاتورة ← تحصيل | SalesQuotation, SalesOrder, SalesInvoice, SalesPayment, SalesCommission | 16 / 14 |
Purchases | دورة الشراء: طلب ← أمر ← استلام ← فاتورة ← سداد | PurchaseRequest, PurchaseOrder, PurchaseGrn, PurchaseBill | 14 / 13 |
POS | نقاط البيع والجلسات النقدية | POSTerminal, POSSession, POSCoupon | 7 / 5 |
WebStore | متجر إلكتروني كامل بعملاء وسلال وطلبات | StoreCustomer, StoreOrder, StoreCart, StorePrescription | 25 / 29 |
CRM | امتداد علاقات العملاء فوق سجل الأطراف | CrmCustomerExt, CrmTicket, CrmSlaPolicy | 1 / 6 |
CMMS | صيانة الأصول وأوامر الشغل والصيانة الوقائية | CmmsAsset, CmmsWorkOrder, CmmsPmSchedule | 1 / 6 |
Production | التصنيع: قوائم مواد وأوامر إنتاج | BillOfMaterials, ProductionOrder, ProductionCenter | 3 / 7 |
QMS | إدارة الجودة: فحوص وعدم مطابقة وإجراءات تصحيحية | Inspection, NonConformance, CapaAction | 1 / 7 |
NPHIES | تكامل منصة التأمين الصحي السعودية «نفيس» | NphiesConfig, NphiesPreauth, NphiesTransaction | 6 / 3 |
EInvoicing | الفوترة الإلكترونية الرسمية وإرسالياتها | EInvoiceConfig, EInvoiceDocument, EInvoiceSubmission | 3 / 3 |
كيف يندمج موديول إكلينيكي في المنصة؟ (نموذج LIS العامل)
- التسجيل: مزوّد خدمة لكل موديول (مثل
CoreServiceProvider) يحمّل الهجرات والإعدادات والترجمات تلقائياً، والتفعيل عبرmodules_statuses.json. - الهوية: ربط الكيانات الخارجية (طبيب، شركة تأمين، معمل خارجي، مريض) بسجل
BusinessPartnerعبرpartner_id. - الصلاحيات: تسجيل شجرة صلاحيات الموديول في
PermissionDependencyRegistry::register()مع حزم أدوار جاهزة. - المالية: ترحيل مباشر إلى دفتر الأستاذ —
Modules/LIS/app/Actions/PostLabInvoice.phpيستدعيModules\Accounting\Actions\CreateJournalEntry(قيود عادية وقيود تأمين). - سير العمل: أحداث نطاق (
LabSampleReceived←GenerateResultsOnSampleReceived،LabResultReleased←PostInvoiceItemOnResultRelease) تفصل المراحل الإكلينيكية عن المالية.
الخلاصة الاستراتيجية: المنصة تقدّم لأي موديول HIS أو OBGY جديد البنية الإدارية والمالية والأمنية كاملةً؛ الفجوة الوحيدة الجوهرية هي غياب «سجل مريض موحّد» على مستوى النواة، وهي نقطة القرار المعمارية الأولى قبل بناء HIS (استنتاج).
موديول المعامل LIS — السطح التكاملي (LIS Module Integration Surface)
موديول المعامل هو الموديول الإكلينيكي الوحيد العامل فعلياً في الإنتاج داخل Moon ERP، وهو بذلك «القالب المُثبَت» الذي يجب أن يُبنى عليه أي موديول إكلينيكي قادم (HIS أو عيادات النساء والتوليد). هذا القسم يوثّق بنيته الفعلية كما قُرئت من الكود في Modules/LIS: خريطة الكيانات، دورة حياة الطلب، الأحداث التي يبثّها، التكامل المحاسبي، نمط الصلاحيات، ونطاق الفروع — بالإضافة إلى أعمدة «الجاهزية للمستشفى» التي أُضيفت بالفعل ولم تُستهلك بعد.
حجم الموديول بالأرقام
خريطة الكيانات الأساسية
جميع الجداول تحمل البادئة lab_ والموديول مكتفٍ ذاتياً مع جسور محسوبة نحو بقية الـ ERP:
lab_patients— سجل مرضى خاص بالمعمل (لا يوجد سجل مرضى مركزي في الـ ERP حتى الآن)، مربوط بشركاء الأعمال عبرpartner_id → Modules\Core\Models\BusinessPartner، مع توكن دائم لبوابة النتائجportal_link_tokenيُولَّد تلقائياً عند الإنشاء.lab_doctors— الأطباء المحوِّلون، مربوطون بقسم HRM عبرdepartment_idوبحسابات العمولات في المحاسبة عبرcommission_account_idوcommission_payable_account_id.lab_requests— رأس الطلب: ترقيم تسلسلي عبرSequenceService، أولوية، حالة، مصدرRequestSourceيتضمن أصلاً قيمin_patientوemergency(تحسّب مبكر لطلبات المستشفى)، وحقول تأمين وفرع وقائمة أسعار.lab_samples— العينات بسلسلة حيازة كاملة (جمع/استلام/رفض/معالجة بطوابع_at/_by)، وانقسام عينات عبرparent_id، والسجل الرسمي فيlab_sample_custody_logs.lab_results— النتائج بآلة حالاتpending → entered → validated → approved → releasedمع مسارات سحب وتصحيح وإبطال، ومصدر إدخالentry_source(يدوي/أجهزة/معمل خارجي)، وربط أجهزة التحاليل (lab_machinesوlab_machine_resultsوقواعد التحقق الآلي).lab_invoices— فواتير بأنواعstandard / insurance_invoice / external_lab_payable / external_lab_receivableوروابط قيودjournal_entry_idوcogs_journal_entry_idوحقول مطالباتnphies_*.- منظومة B2B كاملة:
lab_external_labsوتسعيرها وإحالاتها، وفوترة شهرية، ومناديب نقل العينات عبر الجدول المحوريlab_external_lab_couriers(هجرة2026_06_09_150000_add_b2b_courier_pickup_foundation.php: العينة تولدat_external_labثمin_transitثمcollected). - طبقات داعمة: تأمين وعقود، عمولات أطباء وتسوياتها، كواشف ومخزون، جودة QC بقواعد Westgard، وقوالب باثولوجي
lab_histopath_templates.
دورة حياة الطلب — من الاستقبال إلى الفاتورة
- الاستقبال: إنشاء الطلب عبر الأكشن
Modules\LIS\Actions\CreateLabRequest— وهو مستخرج نصياً من الكنترولر خصيصاً «لكي يستطيع HIS إنشاء طلبات معمل عبر نفس المسار» (تعليق موثق في الكود:HMS Phase-0 W1-3). شاشة الاستقبال تُنشئ الفاتورة وتحصّل الدفع في نفس الخطوة، وسلسلة تسعير واضحة: سعر صريح ← تسعير معمل خارجي ← قائمة أسعار الطبيب ← السعر الافتراضي. - سحب العينات: الجمع يبث
LabSampleCollected، والاستلام يبثLabSampleReceivedالذي يولّد صفوف النتائج المعلّقة، ويفتح معالجة الأقسام، ويُنشئ إحالات خارجية تلقائياً للفحوصات المُسنَدة للخارج. - قوائم العمل: كانبان أقسام، صندوق نتائج الأجهزة مع مطابقة آلية
MachineResultMatchingServiceوقواعد تحقق تلقائي. - إدخال النتائج: يبث
LabResultEntered(يستهلك الكواشف ويحدّث حالة الطلب) وCriticalResultDetectedللقيم الحرجة (إنذار فوري). - التحقق ← الاعتماد ← الإصدار: سلّم صلاحيات منفصل لكل خطوة (
lis.results.validate / approve / release) مع صلاحية استثنائية محروسةrelease_unpaid. - عند الإصدار: حدث
LabResultReleasedيشغّل سلسلة مستمعين مرتّبة عمداً فيEventServiceProvider: تجميع الباقات والمعادلات ← النشر التلقائي للبوابة ← ترحيل بند الفاتورة B2B محاسبياً ← قلب الطلب إلىcompletedوبثLabRequestCompleted. - بعد الإصدار: مسارات سحب وتصحيح من الدرجة الأولى بأحداث
LabResultRetractedوLabResultCorrectedوسجل تدقيق كامل فيlab_result_audit_logs.
الأحداث المبثوثة — نقطة استهلاك النتائج لأي موديول قادم
عشرة أحداث في Modules/LIS/app/Events تحمل النموذج كاملاً، وأهمها للتكامل: LabResultReleased (لكل فحص) وLabRequestCompleted (لكل طلب) — أي أن HIS أو موديول النساء والتوليد سيستقبل النتائج بالاشتراك في نفس ناقل الأحداث الذي يستخدمه LIS داخلياً للفوترة والنشر، دون أي تعديل على المعمل.
التكامل المحاسبي
قاعدة ثابتة: LIS يحتفظ بدفتر مساعد خاص به ويرحّل قيوداً ملخّصة فقط عبر موديول المحاسبة — لا يكتب في دفتر الأستاذ مباشرة. الترحيل في Modules\LIS\Actions\PostLabInvoice عبر Modules\Accounting\Actions\CreateJournalEntry، بحسابات من الإعدادات (lis.receivable_account_id، lis.revenue_account_id، lis.tax_payable_account_id) مع تفضيل حساب مدينين خاص بالشريك عبر AccBpExt، وقيد تكلفة مبيعات منفصل، واحتساب عمولات الأطباء تلقائياً عند الترحيل، وترحيل بنود B2B بنداً-ببند فور إصدار كل نتيجة (مستمع PostInvoiceItemOnResultRelease — idempotent).
الصلاحيات ونطاق الفروع
| الآلية | التنفيذ الفعلي | الجاهزية لإعادة الاستخدام في HIS/OBGY |
|---|---|---|
صلاحيات بنمط lis.{resource}.{action} | Middleware على مستوى الكنترولر، مثال موثق في LabRequestController | نمط قابل للنسخ مباشرة كـ his.* / obgy.* |
| خريطة اعتماديات الصلاحيات | LisPermissionDependencies: 36 حافة صريحة + قاعدة عامة (أي فعل يستلزم view)، تُوسَّع كإغلاق متعدٍّ عند حفظ الدور | سُجّلت في سجل مركزي Modules\Core\Support\PermissionDependencyRegistry (مرحلة HMS Phase-0 W1-4) — نقطة امتداد جاهزة لأي موديول |
| نطاق رؤية البيانات بالفرع | own / branch / all حسب دور المستخدم، مع فلترة X-Branch-Id وختم فرع التشغيل على كل سجل جديد | المنطق رُفع بالفعل من LIS إلى Modules\Core\Support\DataScope (مرحلة W1-1) وLisDataScope أصبح غلافاً متوافقاً فقط |
أعمدة الجاهزية للمستشفى — مضافة فعلاً وخاملة عمداً
lab_requests.encounter_id(هجرة2026_06_10_160000): عمود خامل لربط طلب المعمل بزيارة/إقامة المستشفى المستقبلية؛ التعليق الموثق نصاً: «جدول encounters الخاص بـ HIS غير موجود بعد — المفتاح الأجنبي والمستهلكون يصلون عند انطلاق HIS». تحققنا أنه غير موجود في$fillableولا يُقرأ في أي مكان بالكود.lab_doctors.employee_id(هجرة2026_06_10_150000): سلسلة هوية «طبيب ← موظف HRM ← مستخدم» (مرحلةW1-2)، بمفتاح أجنبي محروس بوجود جدولemployees.- الخلاصة: توجد خطة تنفيذية مُسمّاة
HMS Phase-0(خطواتW1-1إلىW1-4) شُحنت بالفعل داخل LIS لتجهيزه كمزوّد خدمات معملية لأي طبقة سريرية فوقه.
عقد التكامل المستقبلي: كيف يطلب HIS/OBGY تحليلاً ويستلم نتيجته
- إنشاء الطلب باستدعاء
CreateLabRequestبمصدرin_patientمع تعبئةencounter_id— فيحصل تلقائياً على التسعير والفوترة والتأمين وختم الفرع. - توحيد هوية المريض مؤقتاً عبر
lab_patients.partner_id(BusinessPartner) إلى حين حسم قرار سجل المرضى المركزي (استنتاج)، وهوية الطبيب عبرemployee_id. - استلام النتائج بالاشتراك في
LabResultReleasedوLabRequestCompletedوLabResultCorrected/LabResultRetractedللتعديلات. - اعتماد نفس «وصفة الموديول الإكلينيكي الجيد»: جداول ببادئة موحدة، Enums لكل آلة حالات، أحداث ومستمعون مرتّبون للآثار الجانبية، Actions كنقاط دخول بين الموديولات، ترحيل محاسبي عبر
CreateJournalEntryفقط، وصلاحيات ونطاق فروع من Core.
الأعمدة المساندة: الحسابات والموارد البشرية والمخزون والتأمين (Accounting, HRM, Inventory & NPHIES)
تمتلك منصة Moon ERP أربع وحدات تشغيلية ناضجة وعاملة في الإنتاج تشكّل العمود الفقري المالي والإداري لأي نظام مستشفيات قادم: وحدة Accounting (دفتر أستاذ كامل وقيود آلية)، ووحدة HRM (موظفون وورديات وحضور ورواتب)، ووحدة Inventory (مخازن وحركات مخزون بطرق تكلفة FIFO/متوسط مرجّح)، ووحدة NPHIES (أهلية التأمين والمطالبات السعودية بصيغة FHIR). الخلاصة الاستراتيجية: الفوترة المحاسبية، والرواتب، ومخزون الصيدلية والمستهلكات، والتكامل التأميني — كلها وظائف موجودة فعلاً ويجب ألا يُعاد بناؤها داخل وحدة HIS، بل تستهلكها HIS عبر عقود تكامل مثبتة يستخدمها مختبر LIS اليوم في الإنتاج.
AccountingHRMInventoryNPHIESأولاً: وحدة الحسابات (Accounting) — دفتر الأستاذ المركزي
الوحدة تغطي دورة محاسبية كاملة: شجرة حسابات هرمية ثنائية اللغة في جدول accounts (مستويات أب/ابن، تصنيف header/detail، تصنيف زكوي zakat_classification)، وقيود يومية في journal_entries وjournal_entry_lines بدورة حالات Draft → Approved → Posted / Cancelled، وسنوات وفترات مالية، وعملات وأسعار صرف، وسندات قبض وصرف (receipt_vouchers / payment_vouchers)، وشيكات وعُهد نقدية وتسويات بنكية وأصول ثابتة وموازنات وضرائب واستقطاع وزكاة.
- عقد التكامل الواجهة الرسمية
Modules/Accounting/app/Contracts/AccountingServiceInterface.phpتتيحcreateJournalEntry(JournalEntryDTO)وgetAccountBalance()وgetTrialBalance()لأي وحدة أخرى. - الترحيل الآلي كل القيود البرمجية تمر عبر
Modules/Accounting/app/Actions/CreateJournalEntry.phpالذي يتحقق من توازن المدين/الدائن، ويرفض الحسابات الرئيسية (header)، ويحلّ الفترة المالية تلقائياً عبرJournalEntryService::resolvePeriod()، ويعالج فروق العملات. - تتبّع المصدر حقلا
source_typeوsource_idفيjournal_entriesيربطان كل قيد بمستنده الأصلي (فاتورة مختبر، مسير رواتب، فاتورة مبيعات...) — وهي الفتحة الجاهزة لقيود HIS. - إنشاء حسابات تلقائي خدمة
AutoAccountService::createChildAccount()تنشئ حسابات فرعية تحت أي كود أب تلقائياً (تُستخدم لحسابات الشركاء والموظفين). - أحداث أحداث جاهزة للاستماع:
JournalEntryPosted،JournalEntryApproved،JournalEntryCancelled،PeriodClosed،FiscalYearClosed.
الدليل العملي أن هذا النمط يعمل مع وحدة طبية: مختبر LIS يرحّل فواتيره اليوم عبر Modules/LIS/app/Actions/PostLabInvoice.php الذي ينشئ قيد إيراد بقيمة entry_type = 'lab_invoice' وقيد تكلفة 'lab_cogs' ضمن معاملة واحدة، وكذلك تفعل وحدات Sales وPurchases وPOS وHRM.
ثانياً: وحدة الموارد البشرية (HRM) — الكادر الطبي والإداري
وحدة شاملة: ملف موظف كامل في جدول employees، أقسام هرمية في departments، مسميات وظيفية، ورديات وجداول مناوبات، حضور بأجهزة بصمة، إجازات، رواتب وقروض ومكافآت نهاية خدمة، توظيف وتقييم أداء وتدريب.
- سلسلة الهوية حقل
employees.user_idمفتاح أجنبي فريد إلى جدولusers(في تهجير2026_03_01_100003_create_employees_table.php) — أي مستخدم نظام يُربط بملفه الوظيفي مباشرة؛ وهذه هي السلسلة التي ستربط حساب الطبيب/الممرض في HIS بملفه الوظيفي وراتبه دون أي جداول جديدة. - ورديات متقدمة نموذج
Shiftيدعم الورديات الليلية وفترات السماح وحدود التأخير وعمولات الوقت الإضافي، بل ويتضمن حقولاً تمريضية جاهزة:nursing_extra_minutesوspecial_needs_extra_minutesوpresence_check_enabled— أي أن جدولة المناوبات الطبية مدعومة فعلاً. - حضور بالبصمة جداول
attendancesوbiometric_devicesوbiometric_employee_mappingsمع مصادر تسجيل دخول/خروج وتصحيحات. - رواتب مرحّلة آلياً خدمة
PayrollAccountingService::postPayroll()ترحّل مسير الرواتب إلى دفتر الأستاذ بقيدentry_type = 'payroll'، وتنشئ حساب ذمم فرعياً لكل موظف عبرEmployeeAccountServiceبصيغة كود{parent_code}-{employee_number}.
ثالثاً: وحدة المخزون (Inventory) — العمود الفقري للصيدلية والمستهلكات
محرك مخزون متعدد المخازن: جدول warehouses (هرمي، مرتبط بالفرع وبحساب محاسبي account_id)، وأرصدة لحظية في inventory_stock_balances (كمية، متوسط تكلفة، قيمة إجمالية لكل منتج/متغير/مخزن)، وسجل حركة كامل في inventory_movements، وطبقات تكلفة FIFO في inventory_cost_layers، ومستندات استلام وصرف وتحويل وجرد وتسوية.
- عقد التكامل خدمة
Modules/Inventory/app/Services/StockService.phpتوفرincreaseStock()وdecreaseStock()وgetIssueCost()وgetProductCost()مع دعم طريقتي تقييم (fifo/weighted_avg) حسب إعدادinventory.valuation_method. - مرجعية مفتوحة كل حركة تحمل
reference_typeوreference_id— أي أن صرف دواء من صيدلية HIS يُسجَّل كحركةissueبمرجع وصفة طبية دون تعديل المحرك. - سابقة طبية قائمة المختبر يستهلك المخزون فعلاً: نموذج
Modules/LIS/app/Models/LabReagent.phpيرتبط بـproduct_idويقرأ متوسط التكلفة منStockBalanceمباشرة لحساب تكلفة الفحص. - تعريف الأصناف نفسه (أدوية، مستلزمات) يقع في وحدة
Core(Product،ProductVariant،ProductUnit) — فالصيدلية في HIS هي «مخزن من نوع خاص» وليست نظام مخزون جديداً.
رابعاً: وحدة نفيس (NPHIES) — بوابة التأمين السعودية
تكامل FHIR كامل مع منصة نفيس: إعدادات المنشأة والشهادات في nphies_config، وسجل تدقيق لكل معاملة (طلب/استجابة JSON كاملة) في nphies_transactions، وموافقات مسبقة في nphies_preauths (مرجع الموافقة، المبلغ المعتمد، فترة الصلاحية، البنود المعتمدة).
- الأهلية
NphiesEligibilityService::check()تبني حزمةeligibility-requestوتعيد حالة التغطية والمنافع. - المطالبات
NphiesClaimService::submit()تبني المطالبة من بنود الفاتورة (مريض + مزود + مؤمِّن + تغطية + مطالبة) وتعيد المبلغ المغطى ومشاركة المريض، وتحدّث الفاتورة بحقولnphies_claim_statusوnphies_covered_amountوnphies_copay_amount. - بنية قابلة لإعادة الاستخدام بنّاءات FHIR منفصلة:
FhirPatientBuilderوFhirServiceItemBuilderوNphiesFhirClientوNphiesPollingServiceللاستعلام الدوري. - تنبيه معماري الخدمات الحالية مقترنة بنماذج المختبر تحديداً (
Modules\LIS\Models\LabPatientوLabInvoice)، والتهجيرات أضافت حقول نفيس إلى جدوليlab_invoicesوlab_patients— فوترة HIS التأمينية يجب أن تمر من هنا بعد تعميم مدخلات البنّاءات لتقبل «مريض المستشفى» و«فاتورة المستشفى» بدل نسخ الوحدة (استنتاج مبني على بنية الكود الحالية).
خريطة: ماذا تستهلك HIS من كل عمود؟
| الوظيفة المستشفوية | الوحدة المالكة | نقطة التكامل الفعلية | القرار |
|---|---|---|---|
| فوترة المرضى وقيود الإيراد والتكلفة | Accounting | CreateJournalEntry::execute() مع source_type خاص بـ HIS — بنفس نمط PostLabInvoice | تُستهلك — لا تُبنى |
| سندات القبض/الصرف والخزينة والشيكات | Accounting | receipt_vouchers / payment_vouchers / petty_cash | تُستهلك — لا تُبنى |
| ملفات الأطباء والتمريض ورواتبهم ومناوباتهم | HRM | employees.user_id → users + shift_schedules + PayrollAccountingService | تُستهلك — HIS يضيف فقط الملف المهني السريري |
| مخزون الصيدلية والمستهلكات الطبية | Inventory | StockService::decreaseStock() بمرجع وصفة/أمر طبي + مخازن من نوع صيدلية | تُستهلك — لا تُبنى |
| أهلية التأمين والموافقات والمطالبات | NPHIES | NphiesEligibilityService / NphiesPreauthService / NphiesClaimService | تُستهلك بعد تعميمها عن نماذج LIS |
| تعريف الخدمات والأصناف والشركاء والفروع | Core | Product / BusinessPartner / Branch / SettingsService | تُستهلك — لا تُبنى |
الخلاصة الإدارية
- أربع وظائف مستشفوية جوهرية — الفوترة المحاسبية، الرواتب والمناوبات، مخزون الصيدلية، التأمين الصحي — موجودة اليوم في الإنتاج ومثبتة بتكاملات حقيقية مع وحدة طبية (LIS).
- نمط التكامل المعتمد في المنصة واضح ومتكرر: الوحدة التخصصية تملك مستنداتها السريرية فقط، وتستدعي العمود المساند عبر Actions وServices وعقود رسمية — وهذا هو القالب الجاهز لـ HIS.
- الفجوة الوحيدة الجديرة بالاستثمار هي تعميم وحدة
NPHIESلتخدم مريض المستشفى كما تخدم مريض المختبر، وهي فجوة تعميم لا فجوة بناء. - أي تصميم لـ HIS (أو لاعتماد OBGY) يعيد بناء دفتر أستاذ أو محرك مخزون أو مسير رواتب داخله يجب رفضه معمارياً.
واجهة Angular وأنماط البناء (Angular Frontend Architecture)
واجهة Moon ERP مبنية على Angular 21 بمكوّنات مستقلة (Standalone Components) مع إدارة حالة NgRx 21 ومكتبة PrimeNG 21، وبدعم كامل للغة العربية (RTL) كلغة أولى. وحدة المختبر LIS تعمل إنتاجياً داخل هذه الواجهة بنمطين: مدمج داخل النظام (/core/lis/*) ومستقل بشاشة كاملة للمختبر (/lab/*)، وهو ما يشكّل المخطط المرجعي الجاهز لبناء واجهة HIS/OBGY.
src/app/features/core/services/lis-*.service.tscore/store/en.json / ar.jsonالتنظيم العام للمشروع
يتبع المشروع في /home/moonui/public_html/moon-erp/src/app فصلاً صارماً بين الطبقات:
core/— خدمات الـ API (services/)، شرائح NgRx (store/)، نماذج TypeScript (models/)، الحراس (guards/auth.guard.ts)، ومعترض المصادقة (interceptors/auth.interceptor.ts) الذي يضيف ترويسةX-Authorization: Bearer.features/— كل ميزة في مجلد مستقل يُحمَّل كسولاً (lazy-loaded) عبرloadComponentفيapp.routes.ts؛ لا توجد NgModules إطلاقاً.layout/— الهيكل العام:main-layoutوsidebarوtopbar.shared/— لبنات إعادة الاستخدام:data-tableوform-dialogوpage-headerوmodule-navومحرّك الطباعةshared/print/والتوجيه الهيكلي للصلاحياتcan.directive.ts.
نمط تدفق البيانات موحّد في كل شاشات CRUD: Component → Action → Effect → Service → API → Reducer → Selector مع شكل حالة ثابت لكل شريحة (loading / saving / error / loaded / meta) باستخدام @ngrx/entity.
شاشات المختبر LIS — النموذج العملي الناضج
وحدة LIS تضم أكثر من 60 شاشة في features/lis/ وتعمل بثلاثة سياقات توجيه: مدمج، ومستقل عبر lis-standalone.routes.ts بتخطيط خاص LisLayoutComponent، وبوابة عامة للمرضى برابط رمزي (/p/:token) دون تسجيل دخول. أهم الشاشات التشغيلية:
| الشاشة | الملف | الحجم (سطر) | الدور التشغيلي |
|---|---|---|---|
| قائمة عمل الأقسام | dept-worklist/dept-worklist.component.ts | 2,848 | إدخال النتائج لكل قسم (رقمي/نصي/اختياري/معادلة) مع أعلام LL/HH/L/H/N |
| قائمة عمل الاعتماد | validation-worklist/validation-worklist.component.ts | 3,727 | مراجعة واعتماد وإطلاق النتائج (validate / approve / release / print) |
| قائمة عمل السحب | collection-worklist/collection-worklist.component.ts | 1,646 | سحب العينات بالباركود وتجميع الأنابيب — تحلّ محل شاشة العينات القديمة على مسار /lab/samples |
| الاستقبال | reception/reception.component.ts | 574 | استلام العينات في المعمل (specimen receiving) |
| لوحة المتابعة | board/lis-board.component.ts | 315 | لوحة مراحل (6 مراحل) لكل طلب/قسم مع زمن الانتظار |
| كانبان (متقاعد) | kanban/lis-kanban.component.ts | 1,490 | أُحيل للتقاعد في النمط المستقل — المسار /lab/kanban يعيد التوجيه إلى worklist |
| معالج الطلبات v2 | request-wizard-v2/ | — | معالج من 4 خطوات: المريض ← الفحوصات ← الفوترة (فرد/تأمين/معمل خارجي) ← الدفع |
درس معماري مهم: المختبر تحوّل من نموذج الكانبان إلى نموذج Worklist مدفوع من الخادم عبر core/services/lis-worklist.service.ts (عقد WorklistCard / WorklistRow مع علم تشغيل USE_SERVER_WORKLIST) — أي أن منطق ترتيب العمل انتقل للباك-إند وبقيت الواجهة عارضاً ومنفّذاً للإجراءات.
الصلاحيات والحماية
authGuard— يتحقق من الجلسة ويعيد تحميل الملف الشخصي من/auth/meقبل السماح بأي مسار (مع معالجة الجلسات الملغاة).permissionGuard— يقرأ بادئات الصلاحيات من بيانات المسار مثلdata: { permissions: ['lis.results'] }بمطابقة على حدود النقطة، مع تجاوز كامل لدورsuper-admin.moduleGuard— يمنع الوصول لمسارات الوحدات المعطّلة من شاشةmodule-activation.- على مستوى الأزرار: التوجيه الهيكلي
*appCanفيshared/directives/can.directive.tsيخفي أي زر لا يملك المستخدم صلاحيته — حماية دفاعية والباك-إند يظل الحكم النهائي.
الترجمة والطباعة
- الترجمة عبر
ngx-translate v17بملفينsrc/assets/i18n/en.jsonوar.json(7,494 مفتاحاً، 85 نطاقاً علوياً) معfallbackLang: 'en'— المفاتيح إنجليزية بنمطLIS.RESULTS.APPROVEووحدة LIS لها نطاقLISبـ 48 نطاقاً فرعياً.LanguageServiceيضبطdir=rtlعلى مستوى المستند تلقائياً. - محرّك طباعة عام في
shared/print/: عقدGenericPrintData(يحملdir/langودالة ترجمةt)، قوالب جاهزة فيprint-templates.ts(GENERIC_TEMPLATESبقالب افتراضيclassic)، وقالب مخصص قابل للضبطCustomTemplateConfig(ألوان/خط/إظهار الشعار) من شاشة/core/print-settings. - محرّك تقارير مخبرية متخصص:
lis-report-pdf.service.ts(1,620 سطراً،jsPDF + jspdf-autotableمع طباعة عبر iframe) وlis-html-report.service.ts(1,311 سطراً، تقارير HTML بقوالب ترويسة قابلة للضبط منlab-info)، إضافة لخدمة ملصقات الباركودlis-barcode-label.service.tsوشاشة طباعة دفعيةprint-queue.
ما يجب أن تلتزم به واجهة HIS/OBGY الجديدة
- مجلد ميزة جديد
features/his/(أوfeatures/obgy/) على غرارfeatures/lis/، بمكوّنات Standalone وإشاراتsignal()لحالة الواجهة وخدماتhis-*.service.tsفيcore/services/بنمطprovidedIn: 'root'ودالةlistAll()للتقسيم التلقائي للصفحات. - مساران: مدمج
/core/his/*ومستقل بشاشة كاملة (مثل/clinic/*على غرار/lab/*) بتخطيط خاص يحاكيLisLayoutComponent— هذا النمط مجرَّب إنتاجياً. - صلاحيات ببادئة
his.في بيانات المسارات و*appCanعلى الأزرار، ونطاق ترجمةHISجديد في ملفي i18n بمفاتيح إنجليزية أولاً. - إعادة استخدام مباشرة:
data-table(تصدير Excel/PDF وتخصيص الأعمدة)،page-header،form-dialog، محرّك الطباعة العام، ونمط الـ Worklist المدفوع من الخادم لقوائم عمل العيادات (مواعيد اليوم، الكشوفات المعلّقة، السونار). - (استنتاج) نقطة القرار الوحيدة الجوهرية على مستوى الواجهة: نموذج المريض — الواجهة الحالية تستخدم
lis-patient.model.tsالخاص بالمختبر (mrn، تأمين)، وبناء HIS يستلزم شاشة سجل مرضى موحّد تستهلكه LIS وOBGY معاً بدل تكرار شاشات المرضى في كل وحدة.
قرارات HMS المعتمدة سابقاً (Settled HMS Decisions & Phase-0)
قبل أي رؤية جديدة لعلاقة ERP ↔ LIS ↔ HIS ↔ OBGY، يجب تثبيت ما اعتُمد فعلاً: دراسة الجدوى المعمارية لنظام المستشفيات (النسخة 2 بتاريخ 10 يونيو 2026، الملف /home/moonui/public_html/hms-feasibility-report.html) ومواصفة التنفيذ /home/moonui/hms-phase0-spec.md. هذه الوثائق تحمل قرارات معتمدة من المالك بصيغة «لا يُعاد فتحها» — أي أنها قيود مُلزِمة على أي طرح جديد بخصوص نظام عيادات النساء والتوليد (OBGY)، وحالتها التنفيذية: معتمدة ولم يبدأ تنفيذها بعد.
القرارات المعتمدة المُلزِمة (لا يُعاد فتحها)
وثّقت الدراسة أربعة قرارات حاكمة، وأكدتها مواصفة المرحلة 0 تحت عنوان صريح SETTLED DECISIONS (do not reopen):
- قرار 1 هوية المريض الموحّدة: ترقية جدول
lab_patientsنفسه ليصبح الكيان المشترك للمرضى — بلا جدول جديد وبلا إعادة تسمية. السبب المقاس: 8 مفاتيح FK صلبة و144 مرجعpatient_idفي 52 ملفاً داخل LIS، وتكامل NPHIES يبني مورد FHIRPatientمنه مباشرة. - قرار B2B مرضى معامل B2B يبقون في
lab_patients: حُسم بتحليل مخصص (37/40 للجدول الواحد مقابل 19/40 للفصل). عمودexternal_lab_idيلعب حرفياً دورPatient.managingOrganizationفي معيار FHIR. الأرقام: 11,769 مريض شركة مقابل 15 مريض B2B مرتبطين بصفوف إكلينيكية حية (15 طلباً، 18 عينة، 45 نتيجة، 16 فاتورة). الحراسة بـ named scopes اختياريةinternal()/forLab()— وممنوع صراحة أي Global Scope شامل على الجدول. - قرار 2 موديول واحد
Modules/HISلا عدة موديولات صغيرة، والتقسيم الداخلي بالمجلدات. قاعدة الاتجاه الذهبية: HIS يستورد منLISوAccountingوHRM(نداء مباشر للأمام)، وLIS لا يستورد HIS أبداً — رجوع المعلومات عبر الحدثين القائمينLabResultReleasedوLabRequestCompletedيستمع لهما HIS. - قرار 3 عقد «الاستقبال يطلب تحاليل»: استخراج
CreateLabRequestAction من الكونترولر (دالةLabRequestController::store~294 سطراً) بمطابقة بايت، + عمودencounter_idخامل علىlab_requests(بلا FK لأن جدول HIS غير موجود بعد). نفس العقد يصبح القالب للأشعة وأي منفّذ خدمة لاحق. - قرار 4 الفوليو والفوترة المركزية: كيان Encounter + بنود رسوم متعددة المصادر تُرحَّل بتعميم نمط الفوترة المرحلية القائم في B2B، مع قاعدة منع الازدواج المحاسبي: فاتورة المعمل تدخل الفوليو بالمرجع ولا يعاد ترحيل بنودها. تصميم Encounter/Folio اعتُمد لكن إنشاء الجداول مؤجَّل صراحة إلى انطلاق HIS.
- قيد حاكم قيد المالك المُلزِم لكل بند: «برنامج المعامل لا يتأثر — أداءً ولا سلوكاً». صفر استعلامات مضافة على المسارات الساخنة، وكل تغيير سلوكي مقصود يُسلَّم خادماً وواجهة في نشر واحد، وبوابة قبول لكل معلم: كل السويتات خضراء + مقارنة زمن استجابة قبل/بعد على قوائم العمل والاستقبال — أي تراجع يُرجِع البند.
مصفوفة التداخل المعتمدة — قدرات المستشفى مقابل الموجود
| قدرة HIS | الموجود اليوم | التقييم المعتمد | الاستراتيجية |
|---|---|---|---|
| ملف المريض + ربطه بالحسابات | lab_patients يغطي ~80% (MRN، تأمين، partner_id ← شريك أعمال بحسابات تلقائية) | جزئي قوي | ترقية في المكان (قرار 1) |
| الاستقبال يطلب تحاليل | POST /lis/requests يقبل المصدر in_patient/emergency منذ البداية | جاهز | تكامل عبر CreateLabRequest |
| الأطباء | سجل ناضج في LIS بعمولات وتواقيع — صفر ربط بـ HRM | جزئي | عمود employee_id يكمل سلسلة طبيب←موظف←مستخدم |
| الزيارة / Encounter | lab_visits غلاف رفيع 1:1 حول طلب معمل | بذرة | كيان Encounter جديد في HIS |
| المواعيد والحجوزات | لا محرك تقويم/حجز في الموديولات الـ15 إطلاقاً | غير موجود (1/10) | بناء جديد — أكبر بند |
| الفندقة: غرف/أسرّة + ADT | صفر جداول (بحث شامل مؤكَّد) | غير موجود (0–1/10) | بناء جديد كامل (مرحلة 2) |
| التسعير والتأمين | قوائم أسعار وتغطية تأمين في LIS مربوطة بالتحاليل فقط | انقسام | تعميم على بنود polymorphic |
| الصيدلية | المخزن جاهز (باتشات + POS)؛ الإكلينيكية غير موجودة | جزئي | مرحلة 3 فوق Inventory/POS |
| فوليو المريض والودائع | النمط المحاسبي قائم (فوترة مرحلية B2B + تخصيص FIFO)، الكيان غير موجود | نمط جاهز | قرار 4 |
| الكاشير والخزائن والتأمين/NPHIES | كامل ومجرّب في LIS (ورديات، تقرير Z، مطالبات FHIR) | جاهز (9/10 مالياً) | إعادة استخدام مباشرة |
خارطة الطريق المعتمدة (P0–P3)
- المرحلة 0 — التأسيس (تُنفَّذ الآن، ~7–10 أيام-مطوّر): حزمة «جاهزية المنصة» المستقلة الموصوفة أدناه — معتمدة من المالك قبل أي شغل HIS.
- المرحلة 1 — العيادات الخارجية (8–14 أسبوع-شخص): استقبال + ملف مريض 360° + محرك المواعيد (أكبر بناء جديد) + Encounter عيادة + فوليو وكاشير وتأمين.
- المرحلة 2 — التنويم والفندقة (10–16 أسبوع-شخص): أجنحة/غرف/أسرّة + ADT + رسوم إقامة بـ Job ليلي + ودائع + محطة تمريض أساسية.
- المرحلة 3 — الامتدادات (4–10 أسابيع-شخص لكل بند): صيدلية إكلينيكية، عمليات/أشعة بنفس عقد القرار 3، تغذية، بوابة مواعيد.
بنود المرحلة 0 وحالتها التنفيذية
المواصفة /home/moonui/hms-phase0-spec.md تنص: معتمدة من المالك، لم يبدأ أي بند (كل خانات الحالة فارغة حتى تاريخ قراءتها):
| البند | المضمون | الخطر على LIS | بوابة الإثبات | الحالة |
|---|---|---|---|---|
W1-1 | رفع نطاق الفروع: LisDataScope ← Modules/Core/app/Support/DataScope.php مع shim توافقي (14 موضع نداء بلا تغيير) | لا خطر | سويتات LIS القائمة | لم يبدأ |
W1-2 | عمود employee_id خامل على lab_doctors (ربط طبيب←موظف HRM) | صفر | LabDoctorApiTest (11) | لم يبدأ |
W1-3 | استخراج CreateLabRequest Action بمطابقة بايت + encounter_id خامل على lab_requests | منخفض | LabRequestApiTest (42) + سويتات B2B (74) | لم يبدأ |
W1-4 | سجل تبعيات الصلاحيات في Core (PermissionDependencyRegistry) — يصلح انعكاس RoleSaveService.php:10 ويجهّز تسجيل his.* | صفر (استجابات مطابقة بالبايت) | سويتات Role (47+) | لم يبدأ |
W2-1 | تحصين B2B (8 بنود: مؤشر اللوحة، 6 منتقيات واجهة، حارس الدمج، قيد فريد UNIQUE(company_id, ext_scope_key, national_id)، scopes مسماة…) + ترقية الكيان المشترك | منخفض — تغييرات مقصودة فقط | LabPatientApiTest (20) + اختبارات حراسة جديدة | لم يبدأ — البند 8 ينتظر قرار المالك |
W2-2 | فرض مفتاح الموديولات على API — وضع المراقبة فقط (القياس أثبت أن الفرض الفوري يكسر تدفقات شغّالة: إعداد شركة التطوير لا يذكر موديولات عليها بيانات حية) | لا حظر | مراجعة السجلات بعد أسبوعين | لم يبدأ |
مؤجَّل صراحة إلى انطلاق HIS: سقّالة Modules/HIS وصلاحيات his.*، جداول Encounter/Folio، رفع طرق الدفع/الخزائن، تعميم قوائم الأسعار/التأمين، خدمة ترحيل الرسوم الموحدة (سجل التعميم — القسم 5+ من الدراسة).
الأسئلة التي تركتها الوثائق مفتوحة
- سياسة روابط بوابة المريض لمرضى B2B (
W2-1بند 8):LabPatient.php:60-65يصدر توكن بورتال لكل مريض — هل يستمر ذلك لصفوف B2B؟ ينتظر قرار المالك. - قرار فرض مفتاح الموديولات: مؤجل لما بعد أسبوعين من المراقبة + تنظيف إعدادات الشركات.
- التصميم التفصيلي لـ Encounter/Folio: المبدأ معتمد، لكن الجداول والحقول لم تُصمَّم بعد (مؤجلة لانطلاق HIS).
- حدود النطاق الإكلينيكي: النسخة الأولى «إداري-مالي صراحةً»؛ التوثيق السريري العميق (EMR كامل) قرارٌ منفصل لاحق — الخطر رقم 7 في سجل المخاطر.
- الرفع الكامل لسجل الممارسين إلى Core: يُقيَّم فقط لو احتاجته موديولات غير صحية.
أين يلمس استحواذ OBGY هذه القرارات؟
الوثيقتان لا تذكران OBGY إطلاقاً — فكل ما يلي مواضع تقاطع نحددها نحن (استنتاج) بناءً على ما قرأناه في الوثيقتين وتحليل OBGY (/home/amrtechogate/public_html/obgy-erp-analysis.md):
- أكبر فجوتين في الدراسة هما أقوى ما لدى OBGY معرفياً: محرك المواعيد (درجة 1/10) والمحتوى الإكلينيكي للعيادات — OBGY يدير زيارات ومواعيد عيادة فعلية (
visits،visit_periods) وملفات إكلينيكية تخصصية كاملة (متابعة حملancsheet، عقم/حقن مجهري، سونار) يمكن أن تُثري تصميم Encounter ومحرك مواعيد المرحلة 1 كنموذج نطاق — لا ككود (استنتاج). - OBGY لا يصلح نواةً لـ HIS كودياً: تحليل OBGY يوثّق إطاراً قديماً (aw framework) بثغرات SQL injection مؤكدة وواسعة وبلا أي مفاتيح FK معلنة — بينما قرارات HMS تفرض موديول Laravel واحد
Modules/HISفوق منصة Moon. القيمة قيمة نموذج بيانات وسير عمل وترحيل بيانات، لا قيمة منصة (استنتاج مدعوم بقسم Migration-Relevant Conclusions في تحليل OBGY). - قرار هوية المريض يستوعب مرضى OBGY بلا تعديل: الكيان المشترك المرقّى من
lab_patientsهو الوجهة الطبيعية لترحيل جدولpatientsفي OBGY، ولا شيء في OBGY يستدعي إعادة فتح قرار B2B أو قرار الجدول الواحد (استنتاج). - عقد القرار 3 قابل للتعميم على OBGY: نمط «منفّذ خدمة يُستدعى عبر Action +
encounter_id» الذي صُمم للمعمل والأشعة يصلح نفسه لطلبات السونار والإجراءات النسائية (استنتاج). - سؤال جديد تطرحه OBGY ولم تُجب عنه الوثائق: هل تكون عيادة النساء والتوليد «تخصصاً» داخل عيادات المرحلة 1 (طبقة إكلينيكية فوق Encounter العام) أم موديولاً تخصصياً منفصلاً؟ الدراسة حذّرت من زحف نطاق EMR (الخطر 7) ومن تعدد الموديولات الصغيرة (قرار 2) — وكلاهما يرجّح كفة الدمج داخل HIS مع تأجيل العمق الإكلينيكي، لكن القرار نفسه غير محسوم في هذه الوثائق (استنتاج).
أصول OBGY القابلة لإعادة الاستخدام (OBGY Reusable Assets)
تصنيف استراتيجي لأصول نظام عيادات النساء والتوليد القديم (312 جدولاً، 18 وحدة وظيفية، موثَّقة بالكامل في obgy-erp-analysis.md) إلى ثلاث فئات: أصول عامة تصلح نواةً لأي وحدة مستشفيات (HIS)، وأصول تخصصية تخص طب النساء فقط، وأصول يجب التخلص منها نهائياً. هذا التصنيف هو المدخل الرئيسي لقرار مجلس الإدارة: هل يصبح OBGY هو قلب وحدة HIS أم وحدة تخصصية فوقها؟
نظرة كمية سريعة
النسب الثلاث الأخيرة تقدير تحليلي (استنتاج) مبني على أرقام موثقة في التحليل: ~190 جدول قوائم من 312 (61%)، وخطة الترحيل 312 → ~85 جدولاً مع إسقاط ~40 جدولاً ميتاً/مشتقاً مباشرة، واستبدال ~17 جدول منصة (aw*) بنواة الـ ERP الحالية.
الفئة (أ) — أصول عامة تصلح لأي تخصص طبي نواة HIS محتملة
هذه ليست أكواداً قابلة للنقل (الكود القديم PHP 5.6 / Smarty / RedBeanPHP غير قابل للإنقاذ)، بل نماذج بيانات وتدفقات عمل مجرَّبة سريرياً لسنوات يعاد بناؤها في Laravel داخل نواة HIS:
| الأصل | المصدر القديم (جداول/ملفات) | ماذا يصبح في Laravel |
|---|---|---|
| نموذج الزيارة + طابور الانتظار | visits (حجز + طابور + دفع في جدول واحد)، visit_periods (سعة الفترات)، endvisitreports، detections (كتالوج الخدمات)، شاشة الطابور core/controllers/index.php وتطبيق شاشة الانتظار obgy/screen/ | Appointment + Encounter (queue_no, drag-sort) + Service + VisitPeriod + PatientLedgerEntry — مع إصلاح العيب الجوهري: ربط كل سجل سريري بـ encounter_id |
| نمط «الشيت السريري» + أبناؤه | 10 جداول وصفات متطابقة (ancsheetdrugs, gynadrugs, infertilitysheetdrugs, mointoringsheetdrugs, operativedetailsdrugs…) و8 جداول تحاليل (ancsheetinvest, gynainvestigation, infertilitysheetinvest…) | Prescription/PrescriptionItem (علاقة prescribable متعددة الأشكال) وLabOrder/LabOrderItem مرتبطة بكتالوج LIS — أربعة جداول بدل 18 |
| محرك أسئلة وأجوبة التاريخ المرضي القابل للتهيئة | presenthistoryquestions, presenthistoryanswers, جدول الإجابات الفعلية gynaph (يُنشأ وقت التشغيل — يجب تصديره من الإنتاج) | HistoryQuestion / HistoryAnswerOption / PatientHistoryAnswer — محرك استبيانات سريرية عام لأي عيادة |
| الفحص السريري لكل جهاز عضوي | examination (علامات حيوية + 5 أعمدة أجهزة) + 9 قوائم نتائج (examinationhead/chest/abdomen/pelvis/extremitis, examinationlocalse, generalbreast/hirsutism/thyroid) | ClinicalExamination + ExaminationFinding + خيارات في obgy_lookups(domain=exam.*) مع body_system enum |
| سير عمل العمليات وقائمة الانتظار الجراحية | op_wait_list, operativedetails (المذكرة الجراحية الكاملة: تخدير، شق جراحي، فريق، أدوية أثناء العملية), anasthesa/generalanasthesa, jncision/midlinejncision, hospitalnames, pathology/histopath | SurgicalBooking + OperativeNote + operative_note_staff + AnesthesiaType + incision_types + Hospital — مصممة صراحةً في المخطط (بند 2.6) لتستهلكها وحدة HIS/HMS |
| كروت المتابعة والتعليمات | followupcard + followupcarddrugs (تأكيد الكارت يدفع الوصفة للصيدلية عبر recepittmp/receiptdrugs)، مكتبة instruction | كارت لقاء مربوط بـ Encounter + حدث PrescriptionDispensed للصيدلية + InstructionTemplate وReferral |
| مرفقات الوسائط الطبية | sonar (صور/فيديو، MyISAM)، patientfiles، gtimage/gtdetail (رسوم تخطيطية معلَّمة)، مجلد obgy/upload/ بحجم 3.2GB (منها upload/sonar 3.1GB / 1,846 ملفاً داخل web root!) | MediaAttachment عبر spatie medialibrary بروابط موقعة + AnnotatedDiagram/DiagramMarker بإحداثيات نسبية |
| محرك المفردات السريرية الموحَّد | ~190 جدول قوائم بنفس الشكل id + title + del — قيمتها الحقيقية في المحتوى المنسَّق سريرياً الموجود في قاعدة الإنتاج (القوائم فارغة في dump 2024) | جدول واحد obgy_lookups (domain, parent_id, title_ar, title_en, sort, is_active) + PHP Enums للقيم الثابتة سريرياً |
| طلبات التحاليل الحرة (EAV) | otherinvestigations / otherinvestigationsrows / otherinvestigationsvalues + كتالوج invests (276 تحليلاً) وinvestcats (22 فئة) | طبقة ربط obgy_lis_test_map على كتالوج LIS القائم؛ التحاليل الحرة تصبح ad-hoc tests في LIS |
| مجلس الأطباء والصلاحيات الدقيقة | جداول b* (جلسات مناقشة الحالات) + نموذج RBAC awcontroll/awcontrollprop/awrolecontrollprop (~590 إجراء / ~3000 منحة) | BoardRequest/BoardSession/BoardMemberOpinion (يعاد بناؤها) + خريطة صلاحيات إلى spatie/laravel-permission |
الفئة (ب) — أصول تخصصية: قيمتها داخل وحدة «صحة المرأة» فقط
- متابعة الحمل (ANC): ثلاثة أجيال متوازية (
ancsheet+ancnewvisit،mainantenental+antenalvisit،followup+followupvisit) تُدمج فيPregnancy+AntenatalVisitمع حساب EDD/GA كـ accessors، وwifeepc→PregnancyLoss، وregisteration→DeliveryRegistration، وop_4d_list→FourDScanBooking. - أطفال الأنابيب ومراقبة الدورات (IVF/ICSI/IUI):
ivfsheet+mointoringsheet(وأبناؤها العشرة) →IvfCycle+IvfCycleVisit+FollicleMeasurement(يستبدل 26 عموداً مبهماً فيovst) + جداول مراحلOocyteRetrieval/EmbryoTransfer/Cryopreservation/CycleOutcome+EndometrialPrepمنeprep. - الذكورة وتحليل السائل المنوي:
semen/semen2/semeninfertility→SemenAnalysisوAndrologyInvestigation، وhormon+hormonalprofile+hormonalprofile2→HormoneResultمرتبطة بمرجعيات LIS. - قوالب الموجات فوق الصوتية النسائية:
ultrasound/ultrasoundobst+ تفاصيل لكل جنين،gynaus+gynausficils،tvs/dtvs/sis/hsg→ImagingStudy+FetalScanFinding. - المناظير:
laparoscopy/hysteroscopy+ نسخ*infertilityالمهيكلة →EndoscopyProcedure+EndoscopyFinding، مع استبدال 24 جدول مفردات (lapar*/copy*) بقاموسEndoscopyTerm. - ملف العقم الزوجي:
infertility+infertilitysheet(64 عموداً، 17 جدولاً يشير إليه) →InfertilityFile؛ نمط «الزوج/الزوجة» (forhusband/subject) أصل شبه عام يفيد أي تخصص يتعامل مع مرافقين (استنتاج). - المحتوى السريري للقوائم: معظم الـ 190 قائمة (بروتوكولات تنشيط، أنواع نقل الأجنة، نتائج TVS/HSG…) محتوى نسائي تخصصي يُزرع في
obgy_lookupsمن قاعدة الإنتاج.
الفئة (ج) — للإسقاط النهائي: لا يُرحَّل ولا يُحاكى
- الإطار البرمجي بالكامل:
aw frameworkبلا front controller (مُوزِّع?ac=فيcore/controllers/imp/_imp.php— 23 سطراً)،PHP 5.6.40(منتهي الدعم منذ 2018)،Smarty 3.1.11(2012)،RedBeanPHP 4.3بوضع fluid في الإنتاج، صفر اختبارات وصفر git. - الثغرات الأمنية (تُصلح فوراً على القديم ولا تنتقل): حقن SQL واسع ومؤكَّد (
patients.php,financialreport.php,visits.php,sonar.php)، واجهة موبايل بلا مصادقة معCORS *(mobileservices.php— فحوص الصلاحية كلها مُعلَّقة)، لا CSRF إطلاقاً، نقاط AJAX عامة تقبل اسم الجدول/العمود من العميل، نسخ قاعدة البيانات كاملة داخل web root (core/db_backups— 1.6GB)، كلمات مرور وأسرار مكتوبة في الكود. - الجداول الميتة والمكررة (~40 جدولاً): بقايا تطوير (
table2/table3/tablename/testtbl1/testtbl2/patients_tmp)، رباعية الاستنساخssemen/sseemen/sseemmen/sseemmeen، أرشيفات (old_visits,visits_updates,patients_updates→ تستبدل بـ auditing)، جداول مشتقة (icsi,lastvisit)، يتائم (operationids,anprotocol,drugdos,importtdetails,excelinfo)، ومكتبةphp-jwtغير المستخدمة. - منصة تُستبدل لا تُرحَّل: جداول
aw*العشرة +programesetting+devices/floors/device_tracking/messages— تحل محلها نواة Moon ERP (مستخدمون، صلاحيات spatie، إعدادات، Sanctum).
ماذا يعني هذا لقرار «نواة HIS أم وحدة تخصصية؟»
- الأصول العامة (الفئة أ) أنماط تصميم مجرّبة وليست نظاماً جاهزاً: النظام القديم نفسه يعاني عيباً معمارياً قاتلاً موثقاً في القسم 90 — السجلات السريرية لا تشير أبداً إلى الزيارة (
patientid+ تاريخ فقط)، أي أن نموذج «اللقاء/Encounter» الذي تحتاجه HIS غير موجود أصلاً في OBGY ويجب بناؤه جديداً. - ~48% من الجداول محتوى نسائي بحت، والكود غير قابل للنقل بالكامل؛ ما يُنقل فعلياً هو: نموذج Encounter/Queue، نمط الشيت + الوصفات + طلبات المعمل، محرك Q&A، الفحص لكل جهاز، سير العمليات، ومحرك القوائم — وكلها مصممة في مخطط القسم 95 (بند 2.6) لتكون module-agnostic تستهلكها HIS.
- التكاملات محسومة في المخطط: المريض هو مريض الـ ERP نفسه، المعمل عبر أحداث
LabOrderPlaced/LabResultReceivedإلى LIS، والصرف عبرPrescriptionDispensedإلى المخزون، والفوترة عبرVisitInvoicedإلى الحسابات. - الخلاصة التحليلية (استنتاج): تُستخرج أصول الفئة (أ) لتؤسس نواة HIS العامة، ويُبنى OBGY كوحدة تخصصية (الفئة ب) فوق تلك النواة — لا أن يكون OBGY ذاته نواة HIS.
نطاق الـ HIS المستهدف لأي مستشفى (Target HIS Scope (Any Hospital))
يحدد هذا القسم النطاق المرجعي الكامل لنظام معلومات المستشفيات (HIS) الذي تستهدف الشركة بيعه لأي مستشفى عام — وليس فقط مراكز النساء والخصوبة — ثم يصنّف كل قدرة وظيفية حسب مصدر بنائها: هل تغطيها وحدات Moon ERP القائمة (المحاسبة، المخزون، الموارد البشرية، LIS، NPHIES)؟ أم تمنحنا تحليلات نظام OBGY الموروث بذرة تصميمية جاهزة؟ أم أنها بناء جديد بالكامل؟ مع محاذاة كل قدرة لموارد FHIR القياسية التي تعتمدها تقاريرنا الحالية.
منهجية التصنيف ومحاذاة FHIR
أسماء القدرات مُحاذاة لموارد FHIR R4 لأن تقرير التحليل القائم في /home/amrtechogate/public_html/obgy-erp-analysis.md يستخدم النمط ذاته بالفعل: نموذج Appointment وEncounter من جدول visits، واقتراح نمذجة إنهاء العلاج (endvisitreports) كحالة على EpisodeOfCare، وأوامر المعمل كـ ServiceRequest عبر أحداث LabOrderPlaced وLabResultReceived، والوصفات بدلالة MedicationRequest عبر حدث PrescriptionDispensed، والعمليات كـ Procedure. تصنيف المصادر ثلاثي:
- ERP القدرة موجودة في وحدات Moon ERP القائمة — وفق معطيات الدراسة (المحاسبة، المخزون، HRM، LIS، NPHIES)؛ كود الـ ERP غير متاح في بيئة الفحص، فالاعتماد هنا على معطيات التكليف.
- بذرة OBGY التحليل أنتج تصميمًا مستهدفًا جاهزًا (جداول/نماذج/أحداث) يصلح أساسًا للبناء — مع قاعدة صارمة في سجل المخاطر (R12):
no legacy endpoint ported؛ أي أن البذرة هي نموذج البيانات وسير العمل فقط، وليست الكود الموروث (حقن SQL مؤكد ومنتشر — القسم 00 §5.1). - بناء جديد لا يوجد أي أصل قابل لإعادة الاستخدام؛ تصميم وتنفيذ من الصفر.
مصفوفة القدرات: القدرة × المصدر × أولوية الإصدار الأول القابل للبيع
| # | القدرة | محاذاة FHIR | موجودة في Moon ERP | تبذرها تحليلات OBGY | بناء جديد | أولوية v1 |
|---|---|---|---|---|---|---|
| 1 | الفهرس الرئيسي للمرضى (MPI) | Patient | جزئيًا — سجل المريض/العميل في الـ ERP؛ والمخطط ينص: المريض الموروث «يصبح» مريض الـ ERP (§1.1) | نعم — متطلبات إزالة التكرار موثقة (المخاطرة R10: أرقام ملفات MAX+1 وهويات وطنية مكررة) ونمط obgy_patient_profiles | سير عمل دمج/مراجعة التكرارات، وإصدار رقم ملف MRN لكل منشأة | P0 حرجة |
| 2 | المواعيد والجدولة | Appointment, Schedule, Slot | لا | قوية — visits (شق الحجز)، فترات بسعة قصوى visit_periods.max_no، قائمة انتظار urgent=1، حجز موبايل، vacations → ClinicClosure | جدولة متعددة الموارد (طبيب + غرفة + جهاز) | P0 حرجة |
| 3 | العيادات الخارجية وطابور الاستقبال (OPD) | Encounter (ambulatory), EpisodeOfCare | لا | قوية — نموذج Encounter من شق الطابور في visits + followupcard (§1.2)؛ آليات الطابور visitorder/enterordered/view، توجيه الشيتات عبر lastvisit، شاشة الانتظار screen_slider مع خدمة طابور (§1.6) | تهيئة عيادات متعددة التخصصات ونموذج أقسام عام | P0 حرجة |
| 4 | الدخول والخروج والتحويل (ADT) | Encounter (inpatient), EpisodeOfCare, Location | لا | ضعيفة جدًا — دليل مستشفيات hospitalnames وخطابات تحويل طباعية فقط (instruction.php::printtransfer)؛ جداول floors/devices/device_tracking ميزة غير مكتملة قرر المخطط إسقاطها (§1.16) | نعم — دورة التنويم كاملة: أمر دخول، تحويل، ملخص خروج، آلة حالات EpisodeOfCare | P0 حرجة |
| 5 | إدارة الأسرّة والأجنحة | Location (جناح/غرفة/سرير) | لا | لا | نعم — شجرة مواقع، حالات السرير (مشغول/محجوز/تنظيف)، لوحة إشغال | P0 حرجة |
| 6 | الطوارئ (ER) | Encounter (emergency) + فرز كـ Observation | لا | ضعيفة — علم الأولوية urgent=1 ليس نظام فرز (استنتاج) | نعم — مقاييس فرز، لوحة تتبع طوارئ، قرار المصير | P1 عالية |
| 7 | أوامر الطبيب الموحدة (CPOE) | ServiceRequest, MedicationRequest | جانب تنفيذ المعمل عبر LIS | قوية الشكل — توحيد 8 جداول *invest في visit_investigations/lab_order_items و10 جداول *drugs في visit_prescriptions/prescription_items بعلاقات متعددة الأشكال، وأحداث LabOrderPlaced/PrescriptionDispensed | محور أوامر موحّد (ServiceRequest واحد)، أوامر أشعة، حزم أوامر، دورة حالة الأمر | P0 حرجة |
| 8 | التوثيق الإكلينيكي (ملاحظات/نماذج) | Condition, Observation, QuestionnaireResponse | لا | قوية — ClinicalExamination (علامات حيوية)، محرك أسئلة وأجوبة قابل للتهيئة presenthistoryquestions/presenthistoryanswers، ClinicalNote بأنواع، تشخيصات عبر pivot encounter_diagnoses | باني نماذج عام لأي تخصص، ترميز ICD-10، اعتماد وتعديل الملاحظات | P0 حرجة |
| 9 | سجل إعطاء الدواء وصيدلية التنويم (eMAR) | MedicationRequest, MedicationAdministration | المخزون وكتالوج الأصناف في الـ ERP؛ المخطط §1.14: الكتالوج والرصيد يُفوَّضان لـ ERP inventory item master | جزئيًا — سلسلة الصرف الخارجي (recepittmp/receiptdrugs → حدث PrescriptionDispensed) وأدوية أثناء العمليات (operativedetailsdrugs) | نعم — طبقة الإعطاء: جرعات مجدولة، توثيق تمريضي للإعطاء، مخزون الجناح | P0 حرجة (نسخة مبسطة في v1) |
| 10 | إدارة غرف العمليات (OR) | Procedure, ServiceRequest | لا | قوية — SurgicalBooking من op_wait_list، OperativeNote من operativedetails مع pivot operative_note_staff، تخدير متدرج anasthesa→generalanasthesa، incision_types، نتائج باثولوجي pathology؛ والمخطط §2.6 ينص أنها مصممة module-agnostic لاستهلاك وحدة HMS لها | لوحة جدولة غرف العمليات، قائمة فحص ما قبل الجراحة، الإفاقة (PACU) | P1 عالية |
| 11 | محطة التمريض | Observation, Task, CarePlan | لا | ضعيفة — حقول العلامات الحيوية في examination وخدمة الطابور (استنتاج لإعادة الاستخدام) | نعم — تقييمات تمريضية، خطط رعاية، مهام ومناوبات، ميزان سوائل | P1 عالية |
| 12 | الفوترة وملف الحساب + دورة التأمين | Account, ChargeItem, Claim, Coverage | نعم (العمود الفقري) — المحاسبة + NPHIES للتأمين السعودي | جسر قوي — PatientLedgerEntry من totalbalance والأكواد السحرية detectionid (-99/999/9999)، أحداث VisitInvoiced/PaymentReceived/RefundIssued (§2.4)، كتالوج خدمات من detections | ملف حساب التنويم (تجميع الرسوم من CPOE/eMAR/OR)، تسعير الباقات، الموافقات المسبقة لكل Encounter | P0 حرجة |
| 13 | أوامر المعمل → LIS | ServiceRequest, DiagnosticReport | نعم — وحدة LIS ناضجة وتعمل إنتاجيًا | نعم — طبقة ربط الكتالوج obgy_lis_test_map (§2.2)؛ investcats 22 تصنيفًا وinvests 276 فحصًا | طفيف — الـ HIS يستهلك العقد نفسه | P0 (إعادة استخدام) |
| 14 | الأشعة (RIS/PACS) | ImagingStudy, DiagnosticReport | لا | جزئيًا — تصميم رأس موحد ImagingStudy (توحيد ultrasound*/tvs/hsg/mrict/sonar) مع MediaAttachment | نعم — قائمة عمل الأجهزة، تكامل DICOM/PACS، طابور تقارير أخصائي الأشعة | P2 متوسطة (تقارير فقط في v1) |
ما تقدمه تحليلات OBGY فعليًا — وما لا تقدمه
- نص صريح في المخطط (§2.6): «
Encounter,OperativeNote,SurgicalBooking,Hospital,incision_typesوخدمة طابور الانتظار مصممةmodule-agnosticكي تستهلكها وحدة HMS» — أي أن نواة المواعيد/المقابلات/العمليات قابلة للمشاركة مع الـ HIS بحكم التصميم. - إصلاح ربط السجلات بالمقابلة: المخاطرة R2 توثق أن السجلات الإكلينيكية الموروثة لا ترتبط بالزيارات إطلاقًا؛ التصميم الجديد يفرض
encounter_idإلزاميًا — وهو الانضباط الذي يحتاجه أي مستشفى عام. - دفتر مالي للمريض جاهز التصميم: تحويل الأكواد السحرية في
visits.detectionidإلى أنواع قيود صريحة (رسم/سداد/مرتجع/قسط/رصيد باقة) مع ترحيل محاسبي بالأحداث — أساس مباشر لملف حساب المريض في الـ HIS. - لكن لا يوجد تنويم على الإطلاق: كل مقابلة في OBGY نهارية؛
visits.viewيعني منتظر/داخل وليس منوَّمًا، وجداولfloors/device_trackingميزة غير مكتملة أسقطها المخطط (§1.16) — فقدرات ADT والأسرّة والطوارئ وeMAR والتمريض الخمس بناء جديد كامل. - ولا يوجد تأمين: النظام الموروث نقدي/فيزا فقط (
detectionvalue_cash/detectionvalue_visa)؛ دورة الدافعين والمطالبات تعتمد كليًا علىNPHIESفي Moon ERP. - وثلثا محتواه تخصصي بحت: نحو 9 من 19 موديولًا محللًا (متابعة حمل، نساء، عقم، حقن مجهري، ذكورة، مناظير، سجل ولادي…) محتوى نسائي لا يُعاد استخدامه في مستشفى عام (استنتاج من أغراض الموديولات الموثقة).
- وصفر إعادة استخدام للكود: قاعدة R12 الصارمة
no legacy endpoint portedبسبب حقن SQL المؤكد (القسم 00 §5.1) ونقاط الكتابة العامة وواجهة الموبايل بلا مصادقة — البذور تصاميم وبيانات مُرحَّلة فقط.
قطع الإصدار الأول القابل للبيع (Sellable v1)
- v1 (P0): MPI + المواعيد + مقابلات العيادات الخارجية والطابور + ADT + الأسرّة والأجنحة + CPOE (معمل/صيدلية/إجراءات) + التوثيق الإكلينيكي + eMAR مبسط + ملف الحساب وجسر
NPHIES+ إعادة استخدامLIS— لا يشتري أي مستشفى نظامًا بلا عمود تنويم، رغم أن OBGY لا يسهم فيه (استنتاج منتجي فوق الحقائق الموثقة). - v1.5 (P1): الطوارئ والفرز، إدارة غرف العمليات (مبذورة بقوة من OBGY)، محطة التمريض.
- v2 (P2): الأشعة
RIS/PACS، eMAR كامل مع المحاليل، خطط الرعاية.
الخلاصة المعمارية لمدخلات قرار المجلس: البذور المشتركة (Encounter، أشكال CPOE، الدفتر المالي، خدمة الطابور) موضعها الطبيعي نواة إكلينيكية مشتركة يستهلكها الـ HIS وتستهلكها وحدة Modules/Obgy التخصصية معًا — وهو الاتجاه الذي يشير إليه §2.6 من المخطط نصًا؛ أما اعتبار OBGY ذاته «نواة الـ HIS» فتعارضه حقيقة أن خمس قدرات التنويم الجوهرية ودورة التأمين غائبة عنه تمامًا.
العمود الفقري للبيانات: المريض والمواجهة والفوترة (Patient/Encounter/Billing Data Spine)
أصعب سؤال تكاملي في البرنامج كله: كيف تتشارك وحدات ERP و LIS و HIS و OBGY هويةَ المريض الواحدة، وخطَّ المواجهة السريرية (Encounter)، ومسارَ الفوترة من الخدمة إلى القيد المحاسبي إلى مطالبة NPHIES؟ هذا القسم يحسم مكان سجل المرضى الرئيسي (MPI)، ويقترح مخطط Encounter/Folio الذي تستند إليه كل الوحدات السريرية، ويعمّم مسار الترحيل المحاسبي المثبت فعلياً في المختبر — وكل ما يلي موثّق من ملفات الشيفرة الحقيقية.
أولاً: هوية المريض — أين يعيش سجل المرضى الرئيسي (MPI)؟
يوجد اليوم ثلاثة كيانات "شبيهة بالمريض" في المنظومة، بالإضافة إلى جدول مرضى النظام القديم لعيادة النساء والتوليد:
| الكيان | الموقع | طبيعته | أبرز الأعمدة |
|---|---|---|---|
lab_patients إنتاج فعلي | Modules/LIS/database/migrations/2026_03_01_000006 | سجل أشخاص سريري حي (~11,769 مريضاً داخلياً + 15 B2B) | mrn فريد، national_id، partner_id → business_partners، external_lab_id، insurance_info |
business_partners | Modules/Core/.../2026_02_16_200001 | كيان تجاري (عميل/مورّد) بلا أي حقول سريرية | is_customer، credit_limit، tax_number، payment_terms_days |
| عميل CRM | Modules/CRM/.../2026_03_31_100001 | امتداد لشريك الأعمال فقط (crm_customer_ext) — ليس سجل أشخاص مستقلاً | customer_type |
patients في OBGY نظام قديم | obgy/core/controllers/patients.php (تحليل القسم 01) | صف واحد = الزوجان معاً؛ بلا أي مفاتيح أجنبية معلنة في القاعدة كلها | statusno يولَّد بـ MAX+1، أعمدة الزوج مدمجة (husdandname بخطأ إملائي)، مزامنة cURL إلى client.obygyPatientId |
الأدلة على أن lab_patients أصبح فعلياً سجل المرضى الرئيسي وليس مجرد "مرضى مختبر":
- حوكمة B2B جاهزة: عمود المالك
external_lab_id(هجرة2026_05_23_000002) يطبّق نمطFHIR Patient.managingOrganization، مع فهرس فريد(company_id, external_lab_id, national_id)(هجرة2026_06_03_010000). - الهوية الوطنية للمطالبات: وحدة
NPHIESنفسها أضافتnational_id_typeوpassport_countryعلىlab_patients(هجرة2026_04_02_200001) — أي أن طبقة المطالبات الوطنية تعتبره مصدر المريض الرسمي. - جسر مالي قائم:
lab_patients.partner_idيربط المريض بحسابات الذمم عبرAccBpExt.ar_account_id— وهو بالضبط ما يحاول OBGY القديم تقليده بمزامنة cURL هشّة ومتزامنة. - قرار محسوم لا يُعاد فتحه: وثيقة
hms-phase0-spec.mdتنص: مرضى B2B يبقون فيlab_patients(نتيجة تقييم 37/40 مقابل 19/40 للفصل)، والترقية إلى "كيان مشترك" تكون بنقل مساحة الأسماء فقط بلا إعادة تسمية للجدول، مع نطاقات مسماةinternal()/forLab()يستهلك HIS أولها — وبدون أيGlobal Scopeشامل.
الخلاصة: سجل المرضى الرئيسي المستقبلي هو lab_patients مرقّى إلى ملكية مشتركة. مرضى OBGY يُرحَّلون إليه كصفوف داخلية (external_lab_id = NULL)، وتُفصل بيانات الزوج إلى جدول تخصصي مثل his_patient_spouses (استنتاج متوافق مع توصيات التحليل نفسه)، ويُلغى ازدواج cURL نهائياً لأن الربط المالي موجود أصلاً عبر partner_id.
lab_patientspatient_id في 52 ملف LISثانياً: خط المواجهة — مخطط Encounter + Folio المقترح
الوضع الحالي: عمود lab_requests.encounter_id أُضيف بالفعل (هجرة 2026_06_10_160000) لكنه خامل عمداً — بلا مفتاح أجنبي ولا قارئ — في انتظار انطلاق HIS، وجداول Encounter/Folio مؤجلة رسمياً بقرار معتمد. أما OBGY فيقدّم الدرس الأهم: جدول visits عنده يخلط الحجز والطابور والمواجهة السريرية ودفتر المدفوعات في جدول واحد، بقيم سحرية في detectionid (−99 قسط، 999 سداد متبقٍ، 9999 استرداد) — وهذا بالضبط ما يجب ألا يتكرر في HIS.
| الجدول المقترح | الدور | أهم الأعمدة (مقترح يتبع أعراف LIS القائمة) |
|---|---|---|
his_encounters | المرساة السريرية لكل زيارة/إقامة (مطابق لمفهوم FHIR Encounter) | encounter_number فريد، patient_id → lab_patients، type (عيادات/تنويم/طوارئ)، status، attending_doctor_id → lab_doctors (المرتبط بالموارد البشرية عبر employee_id)، queue_position (يستبدل ثلاثية OBGY visitorder/enterordered/view)، parent_encounter_id |
his_folios | حساب المريض المالي لكل مواجهة/إقامة — وعاء الرسوم قبل الفوترة | folio_number، encounter_id، payer_type (نقدي/تأمين/حساب B2B)، insurance_contract_id، total_charges/balance بدقة decimal(12,3) كما في lab_invoices |
his_folio_charges | كل وحدة سريرية ترحّل بنود خدماتها هنا (نقطة الالتقاء الموحدة) | source_type/source_id (مرجع متعدد الأشكال: فحص مختبر، خدمة نساء وتوليد، صرف دواء، يوم سرير)، service_code (نمط sbscs_code القائم على lab_investigations)، cost_center_id، فهرس فريد (source_type, source_id) يضمن أن الفعل السريري يُفوتر مرة واحدة فقط |
عقود الربط بين الوحدات (FK/Events) — مع احترام القاعدة المعتمدة: HIS يستورد LIS والمحاسبة والموارد البشرية للأمام، وLIS لا يستورد HIS أبداً:
- HIS → LIS (استدعاء أمامي): طلب التحاليل من داخل المواجهة عبر الإجراء المستخرج
Modules/LIS/app/Actions/CreateLabRequestمع تمريرencounter_id— دون أي تعديل على مسار المختبر المستقل (قيد المالك الحاكم: "LIS لا يتأثر"). - LIS → HIS (أحداث خلفية قائمة فعلاً):
LabResultReleasedوLabRequestCompletedوCriticalResultDetected(موجودة فيModules/LIS/app/Events/وتُطلق منLabResultController.php:516وLabWorkflowService.php:75) — يلتقطها HIS ليعلّق النتائج على المواجهة. - OBGY (كوحدة تخصصية لاحقاً): صفوف
visitsتُرحَّل بتفكيك واضح: شقّ الحجز/الطابور →his_encounters، والصفوف المالية ذات القيم السحرية → معاملات دفع علىhis_folios؛ والملفات السريرية (ancsheet،gynasheet،infertilitysheet) تشير إلىencounter_id. - أحداث مقترحة (استنتاج):
EncounterOpened،FolioChargePosted،FolioClosed— تُنشأ مع وحدةModules/HISعند الانطلاق.
ثالثاً: مسار الفوترة — من المختبر اليوم إلى المستشفى غداً
المسار المحاسبي مثبت ويعمل في الإنتاج داخل Modules/LIS/app/Actions/PostLabInvoice.php: مدين ذمم العميل (حساب الشريك من AccBpExt.ar_account_id أو إعداد lis.receivable_account_id) / دائن الإيراد والضريبة، مع تقسيم تلقائي بين حصة المريض patient_amount وحصة التأمين insurance_amount، وقيد تكلفة منفصل موزع على مراكز التكلفة، وكل ذلك عبر إجراء محاسبي محايد للوحدات هو Modules\Accounting\Actions\CreateJournalEntry بمرجعية source_type='lab_invoice'. والسداد عبر PostLabPayment.php بنفس سلسلة حسم الحسابات. ثم تكتمل الحلقة وطنياً: حقول المطالبة على الفاتورة نفسها (nphies_claim_status، nphies_covered_amount — هجرة 2026_04_03_000001) وخدمة NphiesClaimService::submit() تسجّل في nphies_transactions.
- فعل سريري في أي وحدة (تحليل، كشف، دواء، يوم سرير) ⇠ حدث
FolioChargePostedيضيف بنداً إلىhis_folio_charges. - إغلاق المواجهة/الخروج ⇠ حدث
FolioClosedيولّد الفواتير مقسمة حسب الدافع: فاتورة حصة المريض + فاتورة حصة التأمين (نفس منطق تقسيمinsurance_amount/patient_amountالقائم). - ترحيل الفاتورة ⇠ خدمة ترحيل موحّدة في النواة (تعميم
PostLabInvoiceببادئة إعداداتhis.*بدلlis.*) ⇠CreateJournalEntryبمرجعيةsource_type='his_invoice'+ قيد تكلفة بمراكز التكلفة. - السداد ⇠ تعميم
PostLabPayment(مدين الخزينة / دائن الذمم بنفس سلسلة الحسم). - المطالبة ⇠
NphiesClaimService::submit()على الفاتورة ⇠ تتبع فيnphies_transactionsوتحديثnphies_claim_status.
هذه "خدمة الترحيل الموحّدة" ليست فكرة جديدة: هي بالحرف أحد بنود سجل التعميم المؤجل في hms-phase0-spec.md ("unified charge-posting service")، والجزء الوحيد الخاص بالمختبر في الشيفرة الحالية هو بادئة مفاتيح الإعدادات وسلاسل الحسم — أي أن كلفة التعميم منخفضة والهيكل جاهز. كما يحل هذا المسار نهائياً محل اختراق erpSellbill بـ cURL في OBGY القديم.
ما يعنيه هذا لقرار مجلس الإدارة
- العمود الفقري (مريض/مواجهة/فوترة) يجب أن يُبنى داخل
Modules/HISفوق أصول قائمة:lab_patientsكسجل رئيسي، وencounter_idالخامل المزروع مسبقاً، ومسارPostLabInvoice → CreateJournalEntry → NPHIESالمثبت. - نموذج بيانات OBGY (زوجان في صف واحد، خلط المواجهة بالمدفوعات، قيم سحرية، صفر مفاتيح أجنبية) صالح كمصدر متطلبات وبيانات تاريخية تُرحَّل — لا كنواة معمارية لـ HIS.
- المكان الطبيعي لـ OBGY: حزمة تخصصية لصحة المرأة تستند بمفاتيح أجنبية إلى
his_encountersوhis_folios، وتساهم بملفاتها السريرية الغنية (متابعة الحمل، أمراض النساء، علاج العقم، الحقن المجهري) كتوثيق للمواجهة.
المنتج والسوق: ماذا نبيع ولمن (Product & Packaging View)
الشركة تملك اليوم أربعة أصول مكتملة الملامح: منصة ERP ناضجة (15 موديولاً على Laravel 12 / Angular)، ومعامل Modules/LIS في الإنتاج الفعلي (135 هجرة، ~311 مساراً، تكامل NPHIES)، وقرار معتمد ببناء Modules/HIS عام، وأصل إكلينيكي عميق في نساء وتوليد (النظام القديم OBGY: 312 جدولاً حُلّلت بالكامل في obgy-erp-analysis.md مع مخطط هجرة إلى Modules/Obgy). هذا القسم يجيب سؤال الإدارة التجاري: كيف تتحول هذه الأصول إلى خط منتجات واحد بأربع باقات قابلة للبيع المنفصل — ولماذا يفرض ذلك معمارياً أن يكون OBGY إضافة تخصصية فوق نواة HIS لا نواةً للـ HIS نفسه.
الباقات الأربع — نفس المنصة، مفاتيح مختلفة
كل باقة هي توليفة موديولات تُفعَّل بالترخيص، لا منتجاً منفصل الكود. القاعدة المعمارية المعتمدة في دراسة الجدوى (القرار 2): HIS يستورد من LIS/Accounting/HRM، وLIS لا يستورد HIS أبداً — وبذلك يبقى المعمل قابلاً للبيع منفرداً كما هو اليوم.
| الباقة | العميل المستهدف | الموديولات المفعّلة | الحالة / حجم البناء |
|---|---|---|---|
| 1. معمل فقط يُباع اليوم | معامل التحاليل المستقلة وسلاسلها، ومعامل B2B المرجعية | Core + Accounting + LIS (خزائن، ورديات كاشير بتقرير Z، عقود تأمين، بورتال B2B، NPHIES) |
إنتاج فعلي — لا بناء؛ هذا هو المموِّل الحالي للشركة |
| 2. عيادات / مجمع طبي مرحلة HIS 1 | العيادات الخارجية والمجمعات الطبية (الشريحة الأوسع عدداً في مصر والسعودية — استنتاج) | الباقة 1 + نواة Modules/HIS: مواعيد، Encounter، فوليو، كاشير استقبال، تأمين معمَّم |
8–14 أسبوع-شخص بعد تأسيس 3–5 (تقديرات دراسة HIS كما هي) |
| 3. مركز صحة المرأة التمايز الأقوى | عيادات نساء وتوليد، مراكز حقن مجهري وأطفال أنابيب IVF/ICSI/IUI | الباقة 2 + Modules/Obgy: حمل ومتابعة (Pregnancy)، عقم وأندرولوجيا (SemenAnalysis)، دورات IvfCycle بشبكة قياس الحويصلات FollicleMeasurement، أشعة وموجات (ImagingStudy)، مناظير وعمليات |
مراحل P1–P4 من مخطط الهجرة في obgy-erp-analysis.md §95؛ النموذج البياني جاهز كاملاً (لا تحليل متبقٍ) |
| 4. مستشفى عام آخر الطريق | مستشفيات صغيرة ومتوسطة (تنويم) | الباقة 2 + مرحلة HIS 2 (أسرّة/ADT/ودائع) + امتدادات المرحلة 3 (صيدلية إكلينيكية فوق Inventory/POS، عمليات وأشعة بنفس عقد CreateLabRequest) |
10–16 أسبوع-شخص إضافية للتنويم — وهنا فجوة المنصة الحقيقية (الفندقة 0–1/10 في بطاقة الجاهزية) |
كيف تخدم منصة واحدة الباقات الأربع
- هوية مريض واحدة: القرار 1 المعتمد يرقّي
lab_patients(بربطه القائم فعلاً بشريك الأعمالpartner_idوحساباته التلقائية) إلى الكيان المشترك — فالمريض الذي يدخل من المعمل أو العيادة أو قسم النساء أو التنويم سجلٌّ واحد بذمة مالية واحدة. - قضبان مالية واحدة: القيود والخزائن والورديات والتأمين وNPHIES (درجتها 9/10 في بطاقة الجاهزية) تخدم الباقات كلها بلا تكرار؛ فاتورة المعمل تدخل فوليو المستشفى بالمرجع لا بإعادة الترحيل (القرار 4).
- عقد تنفيذ خدمة واحد:
CreateLabRequest+ عمودencounter_idهو القالب: الاستقبال أو شيت الحمل أو جناح التنويم يطلب، والمعمل/الأشعة ينفّذ ويرجع بالأحداث القائمةLabResultReleased / LabRequestCompleted. مخطط OBGY يستهلك نفس العقد عبرLabOrderPlaced → obgy_lis_test_map(276 تحليلاً من كتالوجinvestsالقديم تُمَطّ على كتالوج LIS). - واجهة واحدة: نمط «تطبيق داخل تطبيق» مجرّب ثلاث مرات (POS/HR/Lab) — كل باقة تضيف تطبيقات لنفس الصدفة الواحدة.
- شرط ترخيصي يجب سداده أولاً: مفتاح
system.enabled_modulesتحترمه الواجهة فقط (moduleGuardفيauth.guard.ts) بينما الخادم لا يفرضه — بيع باقات متمايزة الأسعار يستلزم الفرض على مستوى API، وهو بند قائم في حزمة التأسيس (بوضع المراقبة أولاً لأن إعدادات شركات قائمة قديمة).
التمايز التنافسي في سوقي مصر والسعودية
- جاهزية NPHIES فعلية لا وعداً: أهلية وموافقات ومطالبات FHIR تعمل اليوم في LIS الإنتاجي — تعميمها على بنود HIS بند مخطط، بينما أغلب المنافسين المحليين يبنونها من الصفر (استنتاج تنافسي؛ جاهزيتنا نحن موثقة بالكود).
- قواميس إكلينيكية عربية-أولاً من OBGY: ~190 جدول مفردات إكلينيكية في النظام القديم (تشخيصات، شكاوى، بروتوكولات IVF، مفردات موجات TVS/HSG) تتوحد في
obgy_lookupsبعمودَيtitle_ar / title_en— حصيلة سنوات استخدام سريري حقيقي بالعربية، وهي أصعب ما يُشترى جاهزاً في السوق (استنتاج). - عمق IVF/حقن مجهري كامل: دورة
IvfCycleبمراحلها (سحب بويضات، نقل أجنة، تجميد، تحضير بطانة) وشبكة الحويصلات — عمق تخصصي نادر في أنظمة HIS العامة (استنتاج). - مالية بمستوى ERP داخل النظام الطبي: قيود محاسبية لحظية لكل بند، مريض=شريك أعمال بحسابات أستاذ — نقطة الضعف التقليدية في أنظمة العيادات المنافسة (استنتاج) ونقطة قوتنا الموثقة (9/10).
- شبكة معامل B2B قائمة: بورتال المعامل المرجعية يعمل اليوم بعملاء أحياء — قناة بيع متقاطعة طبيعية لباقتي العيادات والمستشفى.
- درس أمني يسوَّق بحذر: النظام القديم OBGY غير قابل للبيع بحالته (PHP 5.6 منتهي الدعم، حقن SQL مؤكد، API موبايل مفتوح بلا مصادقة في
mobileservices.php) — قيمة الأصل في نموذج البيانات والمفردات، والهجرة إلى المنصة هي نفسها عرض البيع لعملاء الأنظمة القديمة المماثلة.
انعكاس التغليف على القرار المعماري: نواة HIS + إضافات تخصصية
التغليف أعلاه غير قابل للتحقيق إلا إذا كانت التخصصات قابلة للفصل ترخيصياً: مستشفى عام لا يدفع ثمن شيتات الحقن المجهري، ومركز IVF لا يدفع ثمن ADT والأسرّة. لو صار OBGY هو نواة HIS لانهار هذا الفصل — كل عميل يحمل 85 جدولاً تخصصياً لا يحتاجها. القسمة الصحيحة:
| القدرة في مخطط OBGY | أين تستقر | السبب التجاري |
|---|---|---|
المواعيد والطوابير والفترات (Appointment / Encounter / VisitPeriod — وريث visits / visit_periods وكتالوج detections) | نواة Modules/HIS | أكبر فجوة في المنصة (محرك المواعيد 1/10) يملأها تصميمٌ مشتق من نظام شغّال بحجوزات موبايل وطوابير فعلية — وتحتاجه الباقات 2 و3 و4 جميعاً (استنتاج معماري؛ مخطط OBGY نفسه صمّم هذه الكيانات module-agnostic للـ HMS في §2.6) |
الروشتة والطلبات المعممة (visit_prescriptions / visit_investigations بنمط morphs) | نواة Modules/HIS | بدائل الجداول المستنسخة العشرة في النظام القديم هي بالضبط ما تحتاجه أي عيادة تخصصية قادمة (قلب، أسنان…) — تعميمها مرة واحدة (استنتاج) |
الشيتات التخصصية: Pregnancy / GynaSheet / InfertilityFile / IvfCycle / SemenAnalysis / EndoscopyProcedure / OperativeNote | إضافة Modules/Obgy | محتوى تخصصي يُسعَّر منفصلاً في الباقة 3؛ تفعيله بمفتاح ترخيص لا بنسخة كود |
الدفعة المالية للزيارة (VisitInvoiced / PaymentReceived بدل الأكواد السحرية في visits.detectionid وtotalbalance) | لا تُبنى إطلاقاً — تُستبدل بفوليو HIS والقيود القائمة | مصدر ترحيل واحد لكل بند (قاعدة القرار 4) |
تسلسل الطرح — أي شريحة تموّل أي مرحلة
- الآن: إيراد باقة «معمل فقط» القائم يموّل حزمة التأسيس (~7–10 أيام-مطوّر:
CreateLabRequest، تحصين B2B، فرض المفاتيح بوضع المراقبة) — وهي شرط الترخيص قبل أي بيع باقات. - الربعان التاليان: بناء نواة HIS مرحلة 1 (عيادات خارجية) وإطلاق باقة «عيادات» — التمويل من المعامل + أول عملاء العيادات.
- بالتوازي ثم تتويجاً: عيادة OBGY القديمة نفسها هي العميل المرجعي الأول لباقة «صحة المرأة» — لديها دافع اضطراري للهجرة (دين أمني موثق: حقن SQL، API مفتوح، نسخ قاعدة بيانات داخل web root) وبياناتها هي ذاتها اختبار الـ ETL (مراحل P0–P7 وسجل مخاطر R1–R12 جاهزة في المخطط). خدمات الهجرة نفسها بند إيراد (استنتاج).
- بعد إثبات باقتي 2 و3: إيرادهما يموّل مرحلة HIS 2 (التنويم والفندقة — أغلى بناء جديد) فتكتمل باقة «مستشفى عام»، وتُضاف امتدادات المرحلة 3 حسب طلب السوق بنداً بنداً.
الخلاصة للإدارة: نبيع منصة واحدة بأربع بوابات دخول؛ المعمل يموّل اليوم، والعيادات توسّع غداً، وصحة المرأة تميّزنا عن كل منافس عام، والمستشفى يأتي حين تكون النواة قد دفعت ثمن نفسها. ومعمارياً: OBGY يتفكك — عمومياته (مواعيد/زيارة/روشتة) ترفد نواة Modules/HIS، وتخصصه يبقى إضافة Modules/Obgy مرخّصة على حدة.