🧬

العمود الفقري للبيانات: المريض والمواجهة والفوترة (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_idbusiness_partners، external_lab_id، insurance_info
business_partnersModules/Core/.../2026_02_16_200001كيان تجاري (عميل/مورّد) بلا أي حقول سريريةis_customer، credit_limit، tax_number، payment_terms_days
عميل CRMModules/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 أصبح فعلياً سجل المرضى الرئيسي وليس مجرد "مرضى مختبر":

الخلاصة: سجل المرضى الرئيسي المستقبلي هو lab_patients مرقّى إلى ملكية مشتركة. مرضى OBGY يُرحَّلون إليه كصفوف داخلية (external_lab_id = NULL)، وتُفصل بيانات الزوج إلى جدول تخصصي مثل his_patient_spouses (استنتاج متوافق مع توصيات التحليل نفسه)، ويُلغى ازدواج cURL نهائياً لأن الربط المالي موجود أصلاً عبر partner_id.

11,769مريضاً داخلياً في lab_patients
37/40درجة قرار بقاء مرضى B2B في السجل الموحّد
8مفاتيح أجنبية صلبة + 144 إشارة patient_id في 52 ملف LIS
0مفاتيح أجنبية معلنة في قاعدة OBGY بأكملها

ثانياً: خط المواجهة — مخطط 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_idlab_patients، type (عيادات/تنويم/طوارئ)، status، attending_doctor_idlab_doctors (المرتبط بالموارد البشرية عبر employee_idqueue_position (يستبدل ثلاثية OBGY visitorder/enterordered/viewparent_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_investigationscost_center_id، فهرس فريد (source_type, source_id) يضمن أن الفعل السريري يُفوتر مرة واحدة فقط

عقود الربط بين الوحدات (FK/Events) — مع احترام القاعدة المعتمدة: HIS يستورد LIS والمحاسبة والموارد البشرية للأمام، وLIS لا يستورد 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.

  1. فعل سريري في أي وحدة (تحليل، كشف، دواء، يوم سرير) ⇠ حدث FolioChargePosted يضيف بنداً إلى his_folio_charges.
  2. إغلاق المواجهة/الخروج ⇠ حدث FolioClosed يولّد الفواتير مقسمة حسب الدافع: فاتورة حصة المريض + فاتورة حصة التأمين (نفس منطق تقسيم insurance_amount/patient_amount القائم).
  3. ترحيل الفاتورة ⇠ خدمة ترحيل موحّدة في النواة (تعميم PostLabInvoice ببادئة إعدادات his.* بدل lis.*) ⇠ CreateJournalEntry بمرجعية source_type='his_invoice' + قيد تكلفة بمراكز التكلفة.
  4. السداد ⇠ تعميم PostLabPayment (مدين الخزينة / دائن الذمم بنفس سلسلة الحسم).
  5. المطالبة ⇠ NphiesClaimService::submit() على الفاتورة ⇠ تتبع في nphies_transactions وتحديث nphies_claim_status.

هذه "خدمة الترحيل الموحّدة" ليست فكرة جديدة: هي بالحرف أحد بنود سجل التعميم المؤجل في hms-phase0-spec.md ("unified charge-posting service")، والجزء الوحيد الخاص بالمختبر في الشيفرة الحالية هو بادئة مفاتيح الإعدادات وسلاسل الحسم — أي أن كلفة التعميم منخفضة والهيكل جاهز. كما يحل هذا المسار نهائياً محل اختراق erpSellbill بـ cURL في OBGY القديم.

ما يعنيه هذا لقرار مجلس الإدارة