🌐

ملحق: الفروع والمناطق ومزامنة الـ ERP (MED: Branches, Regions & ERP Sync)

هذا الملحق يوثّق النسخة الأحدث (نمط "مركز/مستشفى") المكتشفة في موقع med.greennature.com.sa. النسخة الأصلية المنشورة (312 جدولاً) كانت عيادة نسائية مفردة؛ أمّا هذه النسخة فتُحوّل النظام إلى منظومة متعدّدة الفروع والمناطق، مع طبقة مزامنة قواعد بيانات (syncstructure)، وجسر ربط مع نظام Moon ERP (erp_common عبر localhost/erp/controllers/api_web.php)، وواجهة خارجية (api_web) تخدم أجهزة المعمل والجهات المتعاقدة (Organizations). كل ما يلي مُستخرَج من الكود قراءةً فقط (RedBeanPHP و SQL الخام) دون أي استعلام لقاعدة البيانات الحيّة.

10ملفات نطاق محلّلة
7كيانات جديدة (NEW)
5أعمدة جديدة على جداول معروفة
3جسور تكامل خارجية (ERP / NasLab / Site)

1. معمارية الفروع والمناطق (Multi-Branch / Multi-Region Core)

التفعيل يتم عبر ثلاثة مفاتيح في programesetting: branches (موجود أصلاً) وregions وorganizations (كلاهما عمودان جديدان أضيفا في programesetting.php). عند تفعيل الفروع تُحدَّد صلاحية المستخدم على الفروع عبر العمود الجديد awusers.related_branches (قائمة معرّفات مفصولة بفواصل).

2. الجهات المتعاقدة (Organizations)

كيان جديد كلياً يُمثّل الجهات/الشركات المتعاقدة (تأمين/مؤسسات). يُربط بالزيارة عبر العمود الجديد visits.organization_id، ويُحفظ رقم المريض الخاص بكل جهة في جدول الربط organizations_patient_no. وضع التفعيل programesetting.organizations له ثلاث درجات مستنتجة (1/2/3) تتحكّم بإلزامية ربط الجهة وكشف الديون.

3. جسر مزامنة بنية القاعدة (syncstructure)

أداة DBA لمواءمة بنية قاعدة قديمة مع قاعدة جديدة مع الحفاظ على البيانات (تشغيل وحيد، ليست مزامنة مستمرة). تضيف اتصالين R::addDatabase("old"/"new") وتمرّ على جداول القاعدة الجديدة: إن لم يوجد الجدول تُنشئه عبر SHOW CREATE TABLE، وإن اختلفت الأعمدة تُنشئ جدولاً مؤقتاً _temp وتنسخ البيانات عمودياً ثم تُعيد التسمية.

  1. قراءة جداول القاعدة الجديدة من information_schema.tables.
  2. checkTableExist() ⟶ موجود؟ compareTables() يكشف فروق الأعمدة عبر information_schema.columns.
  3. عند الفرق: copyTable() ينشئ {table}_temp LIKE new.{table}، يدرج الصفوف القديمة بالأعمدة المشتركة فقط، ثم DROP + RENAME.
  4. غير موجود: createTable() ينفّذ DDL الجديد على القاعدة القديمة.

تحذير تشغيلي الكود يحوي شرط if ($i == 203) الذي يقصُر التنفيذ على جدول واحد فقط (الترتيب 203) — أثر تصحيح يدوي، يجب إزالته قبل أي تشغيل فعلي. كما توجد دوال صيانة خام: check_missing()، check_auto_increment()، set_auto_increment()، calcBalanceAll() (إعادة حساب أرصدة المرضى)، improve() (نقل أعمدة محدّدة بين قاعدتين). جميعها تحتوي أسماء قواعد بيانات مكتوبة صراحةً (dr_app_old, obgy_app, obor_db, alielhad_obgy) تكشف بيئات نشر متعدّدة (استنتاج).

4. جسر Moon ERP (erp_common)

erp_common.php هو طبقة الربط مع نظام ERP منفصل عبر cURL إلى localhost/erp/controllers/api_web.php?do={endpoint} برأس مصادقة Open-Key (توكن JWT مكتوب صراحةً في الكود — مخاطرة أمنية). الاستدعاء الفعلي الوحيد المُفعَّل هو جلب ديون العميل من الـ ERP:

  1. في visits.php دالة getrestvaluesP() تتفرّع: إن كان programesetting.erpdb مضبوطاً ⟶ getrestvaluesPErp() تستدعي orderFromErp('clientdept&id=0&royalid='.$patientId)؛ وإلا تُحسب الديون محلياً من visits (getrestvaluesPRoyal()).
  2. الـ ERP المقصود هو "Moon ERP" بدلالة المسار localhost/erp/... ونمط clientdept (ديون العميل) — استنتاج.

erp_common.php يضمّ أيضاً تكاملاً مع مختبر تشريحي خارجي NasLab (api.naslab.gt4it.com/api/patient) عبر getPatientLink() الذي يخزّن رابط النتيجة في patients.inv_link، إضافةً إلى مولّد PDF (TCPDF) ودالة رفع ملفات sendFileWithData().

5. الواجهة الخارجية (api_web) — جسر أجهزة المعمل

api_web.php واجهة JSON خارجية (مصادقة JWT مُعطّلة بالتعليق حالياً). تخدم محورين: تبادل نتائج أجهزة المعمل، وبوابة الجهات المتعاقدة. نتائج الأجهزة تمرّ عبر جدول جسر جديد lab_devices_ranges (يربط investiddevice_id برموز send_code/receive_code) وتُسجَّل كل عملية في saveresultslog.

6. استيراد Excel (excelread)

سكربت تحميل دفعي لمرة واحدة (excelread.php) يقرأ excel_backups/newcases.xlsx عبر PHPExcel ويُنشئ سجلات patients، مع إنشاء الأطباء تلقائياً في awusers (checkDrTable/addToDrTable) والجنسيات في nationality. عدد الصفوف مكتوب صراحةً (row <= 8789) — سكربت ترحيل لمرة واحدة وليس واجهة تشغيلية.

7. جدول الكيانات (Entities)

الجدولجديد/معروفالغرضأهم الحقول المستنتجةالعلاقات
branchesمعروف (مُوسَّع)الفروعالأصلية: id, name, created_at, updated_at + الجديدة: phone1, phone2, locationمرجع لـ visits.branch_id, patients.branch_id, bill_paying.branch_id
regionsجديدالمناطق الجغرافيةid, name, deletedأبٌ لـ sub_regions
sub_regionsجديدالمناطق الفرعيةid, name, region_id, deletedregion_id → regions.id
organizationsجديدالجهات المتعاقدةid, org_id, organization_name, user_name, user_password_hash, deletedمرجع لـ visits.organization_id وorganizations_patient_no
organizations_patient_noجديدرقم المريض لدى كل جهةid, organization_id, patient_id, patient_no, deletedجسر organizations ↔ patients
lab_devices_rangesجديدربط الفحص بجهاز المعمل ورموز التبادلid, investid, device_id, invest_child, special_inv_type, send_code, receive_code, deletedinvestid → invests.id, device_id → devices.id
saveresultslogجديدسجل نتائج الأجهزة الواردة عبر APIsample_id, device_id, device_name, result, receiving_code, sending_code, lab_devices_ranges_id, investigationresults_id, element_name, element_table_name, element_table_id, create_dateيشير إلى investigationresults وlab_devices_ranges
investigationresults_*جديدنتائج مفصّلة حسب نوع الفحص (blood/urine/stool/lipid/egfr/semen/pt/esr/...)أعمدة عناصر متخصّصة لكل نوع (مثل hgb, rbc, cholesterol, gfr, sperm_count...)investigationresults_id → investigationresults.id
bill_payingجديدسندات الدفع (تقارير مالية متعدّدة الفروع)id, branch_id, ... (استنتاج من billBranchSql)branch_id → branches.id
knownfromجديدمصادر معرفة المريض بالمركز (تقرير "Center's Knowledge")id, name, deletedمرجع لـ patients.knownfrom
nationalityجديدالجنسيات (يُنشأ تلقائياً عند الاستيراد)id, nameمرجع لـ patients.nationality
awusers.related_branchesعمود جديدتقييد صلاحية المستخدم على الفروعقائمة معرّفات CSV (0=الكل)قيم تشير إلى branches.id
awrole.custom_detections / is_doctorعمود جديدكشوف فحص مخصّصة للقسم + علامة طبيبcustom_detections CSV، is_doctor 0/1custom_detectionsdetections.id
programesetting.regions / organizationsعمود جديدمفاتيح تفعيل نمط المركزregions 0/1، organizations 1/2/3
visits.organization_idعمود جديدربط الزيارة بجهة متعاقدةorganization_idorganizations.id
patients.branch_id / inv_linkعمود جديدفرع المريض + رابط نتيجة NasLabbranch_id, inv_linkbranch_id → branches.id

8. التأثير على خطة الـ ERP/HIS