هذا الملحق يوثّق إصدار «المركز/المستشفى» المنشور على med.greennature.com.sa، وهو نسخة أحدث وأوسع من نظام النساء والولادة الذي تم تحليله سابقاً (312 جدولاً). يغطي هذا القسم وحدات المخازن والمستهلكات المعملية، باقات الفحوصات (العروض)، التسعير التعاقدي للجهات (التأمين/الشركات)، تقارير تحويل النقدية للأطباء وتقارير مالية المعمل، إدارة الخدمات (Detections) مع مزامنتها الحيّة مع نظام ERP خارجي، وسجلّات الأجهزة (أجهزة المعمل، أجهزة الكشك/التصويت، الأجهزة الطبية بالغرف). جميع الاستنتاجات مأخوذة من قراءة الكود فقط (استدعاءات RedBeanPHP وجُمل SQL الخام وقوالب Smarty) دون أي اتصال بقاعدة البيانات الحيّة.
تمت قراءة 14 وحدة تحكم بالكامل تحت /med/core/controllers/. أبرز المسارات: المخازن والفحوصات عبر invsdept.php (4061 سطراً) وinvsdept_common.php (4842 سطراً)؛ التطبيق المحمول للمعمل عبر invsdeptapp.php وinvsdeptapp_1.php؛ باقات العروض عبر invoffers.php؛ إدارة الخدمات والتسعير التعاقدي عبر detection.php (2297 سطراً)؛ تقارير المالية عبر financiallab.php وcashtransferdectorreport.php وfinancialreport_old.php وfinancialreport_new_old.php؛ الصيدلية عبر pharmacy.php؛ والأجهزة عبر labdevices.php وadddevices.php (3038 سطراً) وvote_devices.php.
تُدير وحدة الفحوصات استهلاك المستهلكات لكل تحليل. الأصناف تُصنّف في suppliescats ثم تُسجّل في supplies، ويُربط كل صنف باستهلاكه الفعلي في جدول الوصل invests_supplies الذي يحمل supply_id وsupply_no (الكمية) وusedate. تقرير الاستهلاك في invsdept.php::suppliesPrint() يجمع الكميات بين تاريخين ويُفصّلها حسب الفئة والصنف. كما يربط كل تحليل بنوع العيّنة عبر sampletype.
SELECT sum(invests_supplies.supply_no) ... WHERE usedate BETWEEN ? AND ? مع الحذف الناعم deleted = 0.investigationresults + جداول فرعية متخصصة (investigationresults_blood, _culture, _urine, _stool, _semen, _cross, _pt, _esr, _egfr, _lipid, _aborh, _custom, _times) بدلاً من جداول *sheet* القديمة.inv_ranges (حسب العمر/الجنس/الوحدة)، وإعدادات المعمل في programesettinglab منفصلة عن programesetting العام.createbarcode($statusno)، مع حقل investigationresults.sample_id للبحث بالعيّنة.يسمح invoffers.php بإنشاء باقة فحوصات (invoffer) تضم عدة تحاليل مسعّرة في invofferdetails (invoffer_id, inv_id, price). سعر الباقة يُحسب ديناميكياً بـ SUM(price) من التفاصيل. العرض يُستخدم لاحقاً في فاتورة الزيارة وفي التسعير التعاقدي للجهات.
addit() → R::dispense('invoffer') ثم إدراج صفوف invofferdetails لكل تحليل.updateit() يحذف نعومةً كل التفاصيل (set del=1) ثم يعيد إدراج المختار.investigationresults.offer_id، حيث يُجمَع سعر الباقة من contract_price - patient_hold.إضافة محورية في إصدار المركز: نظام جهات تعاقدية كامل في detection.php. تُعرّف قوائم الأسعار في price_lists، وتُسجَّل الجهات في organizations (مع credit_limit, vat_no, price_list/list_id, sales_persons, contract_start, وحتى بيانات دخول بوابة user_name/user_password_hash). الخصم/السعر التعاقدي لكل خدمة يُخزَّن في organization_discount حسب list_id وdetect_id وdetect_cat (1=كشف، 2=تحليل، 3=أشعة، 4=باقة) ويحمل contract_price وpatient_hold وdiscount_type. ربط المريض برقمه لدى الجهة في organizations_patient_no، والهيكل الهرمي للجهات في organizations_parents.
organization_discount عبر LEFT JOIN ... ON detections.id/invests.id/rays.id = organization_discount.detect_id.investigationresults) تحمل contract_price وpatient_hold وoffer_id لتقسيم القيمة بين الجهة والمريض. (استنتاج: patient_hold = الجزء الذي يتحمله المريض).credit_limit تدل على بُعد محاسبي/ضريبي صريح غير موجود في النسخة الأصلية.يُدير detection.php كتالوج الخدمات (detections: title, detectionval, create_date, del). أهم اكتشاف هو وجود تكامل ثنائي الاتجاه مع نظام ERP خارجي: عند إنشاء/تعديل أي خدمة تُستدعى erpProduct() التي تفتح اتصال قاعدة بيانات ثانٍ باسم erpDB المخزَّن في programesetting->erpdb، تبحث عن المنتج المقابل في جدول product الخارجي عبر product.obygyDetectionId، ثم تُنشئ/تُحدّث المنتج بنداء cURL إلى ملفات ERP (buyBillControllerAjax.php وproductControllerAjax.php على HOST_URL_ERP) مع تصنيف ثابت Services وisservice=1.
detections.R::addDatabase('erpDB', ...) ثم R::selectDatabase('erpDB') واختبار الاتصال.product WHERE obygyDetectionId = detection.id.curlAddProduct() (إنشاء)؛ وإن وُجد → curlupdateProduct() (تحديث)؛ والحذف عبر erpProductDel()/curlDelProduct().R::selectDatabase('default').حرج للـ ERP هذا يعني أن قاعدة الخدمات في النظام الطبي هي «مصدر الحقيقة» ويُسقَط منها كتالوج المنتجات/الخدمات في الـ ERP المالي تلقائياً، مع ربط ثابت obygyDetectionId ↔ productId.
cashtransferdectorreport.php وfinanciallab.php يبنيان تقريراً مالياً موحّداً عبر UNION ALL بين زيارات (visits) ومدفوعات الصيدلية (bill_paying). جدول visits يحمل الحقول المالية: detectionvalue_cash, detectionvalue_visa, totaldetectionvalue, restdetectionvalue, discount, detectionid, dr_salary, refer_doctor/refer_doctor_tb, contract_price, branch_id. تُستخدم قيم خاصة لـ detectionid: 999 = دفع متبقٍ، و9999 = مرتجع العملاء.
awrole.financial_visits (1=قصر على القسم، 2=قصر على الطبيب)، وawusers.financial_user / awusers.cashtransferdoctor_user.branch_id) والطبيب المُحوِّل (refer) مع تفصيل الفحوصات/الأشعة (investigationresults/raysresults) ومواعيد الحجز (visit_hours).bill_paying (مدفوعات الصيدلية): type, user_id, patient_id, pay_date, discount, printserial, branch_id؛ والنوع type=1 يُعامَل كمرتجع.financialreport_old.php نسخة قديمة تعتمد جداول الصلاحيات awcontroll/awmenu/awrole* ولا تضيف كياناً جديداً جوهرياً.pharmacy.php يبحث في الوصفات (prescription) حسب التاريخ/الطبيب/المريض، ويتتبّع حالتي prepared وdelivered مع تدقيق المستخدم (prepared_userid, delivered_userid). الوصفة مرتبطة بـ patient_id وdoctor_id وpres_date وfor_husband.
ثلاثة سجلّات أجهزة منفصلة الأغراض:
labdevices.php): lab_devices (completed, user_id, deleted, delete_userid, delete_date) مع نسخ المعدلات المرجعية لكل جهاز في lab_devices_ranges (مُشتقّة من inv_ranges: range_low/high, agefrom/ageto, gender, invest_units).vote_devices.php): vote_devices (name, local_ip, created_at, updated_at)، مرتبط بجدول votes عبر votes.vote_device_id (يمنع الحذف إن وُجدت أصوات).adddevices.php): devices (device_name, location, deleted) موزّعة على floors/locations/operations_rooms. (ملاحظة: devices/floors/locations موجودة مسبقاً في الـ 312 جدولاً.)إضافة لإصدار المستشفى داخل adddevices.php: تحويل العيّنات للمعامل الخارجية (external_labs) مع تتبّع الحالة على نتيجة التحليل (investigationresults.external_lab, receive_userid, receive_date, delivered_userid, delivered_date)، ونتائج فحص البنوة (dna_results). كما يوفّر سير عمل طلب السجلات الطبية في archive_request بحالات متعددة وتدقيق كامل: request_userid/date → ready_userid/date → receive_userid/date → return_userid/date مع ملاحظات وإلغاء (cancel_userid). وmanual_operation للعمليات اليدوية.
| الجدول | جديد/معروف | الغرض | أهم الحقول المستنتجة | العلاقات |
|---|---|---|---|---|
supplies | جديد | أصناف المستهلكات المعملية | name, catid | catid→suppliescats |
suppliescats | جديد | فئات المستهلكات | name | — |
invests_supplies | جديد | استهلاك المستهلكات لكل تحليل | supply_id, supply_no, usedate, deleted | supply_id→supplies |
sampletype | جديد | أنواع العيّنات | name | invests.sampletype→sampletype |
investigationresults | جديد | نتائج التحاليل (نموذج مُطبَّع بديل لـ *sheet*) | visitid, investid, offer_id, contract_price, patient_hold, sample_id, external_lab, receive/delivered_userid+date, deleted | →visits, →invests, →invoffer, →external_labs |
inv_ranges | جديد | المعدلات المرجعية للتحاليل | investid, range_low/high, agefrom/ageto, gender, invest_units, active | investid→invests |
programesettinglab | جديد | إعدادات المعمل | (صف مفرد) | — |
invoffer | جديد | باقات/عروض الفحوصات | name, active, del | 1‑M مع invofferdetails |
invofferdetails | جديد | تفاصيل تحاليل الباقة | invoffer_id, inv_id, price, del | →invoffer, →invests |
price_lists | جديد | قوائم أسعار الجهات | name, deleted | — |
organizations | جديد | الجهات التعاقدية/التأمين | organization_name, org_type, parent_id, list_id/price_list, sales_persons, contract_start, vat_no, credit_limit, user_name, user_password_hash | list_id→price_lists, parent_id→organizations_parents |
organizations_parents | جديد | المجموعات الأم للجهات | name, deleted | 1‑M مع organizations |
organizations_patient_no | جديد | رقم المريض لدى الجهة | patient_id, organization_id, patient_no, deleted | →patients, →organizations |
organization_discount | جديد | السعر/الخصم التعاقدي لكل خدمة | list_id, detect_id, detect_cat(1-4), offer_id, contract_price, patient_hold, discount_type, deleted | →price_lists, →detections/invests/rays/invoffer |
sales_persons | جديد | مندوبو المبيعات للجهات | name (استنتاج) | organizations.sales_persons→ |
detections | معروف | كتالوج الخدمات | title, detectionval, create_date, del | يُزامَن مع product (ERP) |
product | جديد (قاعدة ERP خارجية) | منتج/خدمة في الـ ERP المالي | productId, obygyDetectionId, productName, isservice | obygyDetectionId↔detections.id |
bill_paying | جديد | مدفوعات الصيدلية (POS) | type, user_id, patient_id, pay_date, discount, printserial, branch_id, notes | →patients, →branches |
prescription | جديد | الوصفات الدوائية وصرفها | patient_id, doctor_id, pres_date, for_husband, prepared(+_userid), delivered(+_userid) | →patients, →awusers |
visit_hours | جديد | مواعيد/ساعات حجز الزيارة | visit_id, visit_hour, deleted | visit_id→visits |
lab_devices | جديد | سجل أجهزة المعمل | completed, user_id, deleted, delete_userid, delete_date | 1‑M مع lab_devices_ranges |
lab_devices_ranges | جديد | معدلات الجهاز لكل تحليل | device_id, investid, range_low/high, agefrom/ageto, gender, invest_units, special_inv_type, deleted | →lab_devices, →invests |
vote_devices | جديد | أجهزة كشك تقييم/تصويت | name, local_ip, created_at, updated_at | 1‑M مع votes |
votes | جديد | أصوات/تقييمات الكشك | vote_device_id | vote_device_id→vote_devices |
external_labs | جديد | المعامل الخارجية المرجعية | name, deleted | investigationresults.external_lab→ |
dna_results | جديد | نتائج فحص البنوة (DNA) | receivername, delivered_userid+date | →patients/visits (استنتاج) |
archive_request | جديد | طلب السجلات الطبية | patient_id, doctor_id, visit_id, branch_id, request/ready/receive/return _userid+_date, request_note, receive_note, cancel_userid, deleted | →patients, →awusers, →visits |
operations_rooms | جديد | غرف العمليات/مواقع الأجهزة | name, deleted | devices.location→ (استنتاج) |
manual_operation | جديد | عمليات يدوية | deleted | →patients (استنتاج) |
devices | معروف | الأجهزة الطبية بالغرف | device_name, location, deleted | location→operations_rooms/locations |
obygyDetectionId ↔ product.productId؛ مخطط الترحيل يجب أن يعتمد كتالوج detections كمصدر للخدمات ويستبدل نداءات cURL القديمة بواجهة API نظيفة بدل الكتابة المباشرة في قاعدة الـ ERP.organizations + price_lists + organization_discount + organizations_patient_no + VAT/credit_limit) يوفّر أساس وحدة «العقود/التأمين» في الـ ERP الجديد ويجب ترحيله كوحدة مستقلة عن النساء والولادة.visits + bill_paying عبر UNION) يدل على غياب دفتر أستاذ مركزي؛ يُوصى ببناء جدول «حركات مالية» موحّد في الـ HIS بدل قيم detectionid=999/9999 السحرية للمتبقي والمرتجع.supplies/suppliescats/invests_supplies تمثّل استهلاكاً فقط دون أرصدة/توريد؛ خطة الـ ERP تحتاج طبقة مخزون كاملة (وارد/منصرف/رصيد/موردين) فوق هذا الاستهلاك.*sheet* القديم بـ investigationresults* + inv_ranges يبسّط ترحيل المختبر؛ يجب تحديث خرائط الجداول في تقرير الـ 312 لتعكس النموذج الجديد.lab_devices, vote_devices, devices) ينبغي توحيدها تحت سجل أصول/أجهزة واحد في الـ HIS مع تصنيف بالنوع.archive_request والمعامل الخارجية بحالات وتدقيق كامل (userid+date لكل مرحلة) نموذج جاهز لوحدة «تتبّع الطلبات/سير العمل» في الـ HIS.financial_visits, financial_user, cashtransferdoctor_user, external_lab) على awrole/awusers يجب تمثيلها في نموذج الأدوار الجديد بدل الأعلام المتناثرة.