🧾

ملحق: المخازن والمالية الموسعة والأجهزة (MED: Stores, Extended Finance & Devices)

هذا الملحق يوثّق إصدار «المركز/المستشفى» المنشور على 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.

14وحدة تحكم مقروءة
28+جدول جديد مستنتج
1تكامل ERP حيّ عبر cURL
3سجلّات أجهزة منفصلة

1) المخازن والمستهلكات المعملية (Stores / Lab Supplies)

تُدير وحدة الفحوصات استهلاك المستهلكات لكل تحليل. الأصناف تُصنّف في suppliescats ثم تُسجّل في supplies، ويُربط كل صنف باستهلاكه الفعلي في جدول الوصل invests_supplies الذي يحمل supply_id وsupply_no (الكمية) وusedate. تقرير الاستهلاك في invsdept.php::suppliesPrint() يجمع الكميات بين تاريخين ويُفصّلها حسب الفئة والصنف. كما يربط كل تحليل بنوع العيّنة عبر sampletype.

2) باقات الفحوصات / العروض (invoffers)

يسمح invoffers.php بإنشاء باقة فحوصات (invoffer) تضم عدة تحاليل مسعّرة في invofferdetails (invoffer_id, inv_id, price). سعر الباقة يُحسب ديناميكياً بـ SUM(price) من التفاصيل. العرض يُستخدم لاحقاً في فاتورة الزيارة وفي التسعير التعاقدي للجهات.

  1. إنشاء العرض في addit()R::dispense('invoffer') ثم إدراج صفوف invofferdetails لكل تحليل.
  2. التعديل في updateit() يحذف نعومةً كل التفاصيل (set del=1) ثم يعيد إدراج المختار.
  3. الربط بنتائج الزيارة عبر investigationresults.offer_id، حيث يُجمَع سعر الباقة من contract_price - patient_hold.

3) التسعير التعاقدي للجهات (Organizations / Price Lists / Insurance)

إضافة محورية في إصدار المركز: نظام جهات تعاقدية كامل في 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.

4) إدارة الخدمات ومزامنة ERP الحيّة (Detections + erpProduct)

يُدير 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.

  1. حفظ الخدمة محلياً في detections.
  2. R::addDatabase('erpDB', ...) ثم R::selectDatabase('erpDB') واختبار الاتصال.
  3. البحث في product WHERE obygyDetectionId = detection.id.
  4. إن لم يوجد → curlAddProduct() (إنشاء)؛ وإن وُجد → curlupdateProduct() (تحديث)؛ والحذف عبر erpProductDel()/curlDelProduct().
  5. العودة إلى R::selectDatabase('default').

حرج للـ ERP هذا يعني أن قاعدة الخدمات في النظام الطبي هي «مصدر الحقيقة» ويُسقَط منها كتالوج المنتجات/الخدمات في الـ ERP المالي تلقائياً، مع ربط ثابت obygyDetectionId ↔ productId.

5) التقارير المالية وتحويل نقدية الأطباء (Financial Reports / Cash Transfer)

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 = مرتجع العملاء.

6) الصيدلية وصرف الوصفات (Pharmacy)

pharmacy.php يبحث في الوصفات (prescription) حسب التاريخ/الطبيب/المريض، ويتتبّع حالتي prepared وdelivered مع تدقيق المستخدم (prepared_userid, delivered_userid). الوصفة مرتبطة بـ patient_id وdoctor_id وpres_date وfor_husband.

7) سجلّات الأجهزة (Device Registries)

ثلاثة سجلّات أجهزة منفصلة الأغراض:

8) المعامل الخارجية والأرشيف الطبي (External Labs & Records Archive)

إضافة لإصدار المستشفى داخل adddevices.php: تحويل العيّنات للمعامل الخارجية (external_labs) مع تتبّع الحالة على نتيجة التحليل (investigationresults.external_lab, receive_userid, receive_date, delivered_userid, delivered_date)، ونتائج فحص البنوة (dna_results). كما يوفّر سير عمل طلب السجلات الطبية في archive_request بحالات متعددة وتدقيق كامل: request_userid/dateready_userid/datereceive_userid/datereturn_userid/date مع ملاحظات وإلغاء (cancel_userid). وmanual_operation للعمليات اليدوية.

جدول الكيانات المستنتجة

الجدولجديد/معروفالغرضأهم الحقول المستنتجةالعلاقات
suppliesجديدأصناف المستهلكات المعمليةname, catidcatid→suppliescats
suppliescatsجديدفئات المستهلكاتname
invests_suppliesجديداستهلاك المستهلكات لكل تحليلsupply_id, supply_no, usedate, deletedsupply_id→supplies
sampletypeجديدأنواع العيّناتnameinvests.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, activeinvestid→invests
programesettinglabجديدإعدادات المعمل(صف مفرد)
invofferجديدباقات/عروض الفحوصاتname, active, del1‑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_hashlist_id→price_lists, parent_id→organizations_parents
organizations_parentsجديدالمجموعات الأم للجهاتname, deleted1‑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, isserviceobygyDetectionId↔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, deletedvisit_id→visits
lab_devicesجديدسجل أجهزة المعملcompleted, user_id, deleted, delete_userid, delete_date1‑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_at1‑M مع votes
votesجديدأصوات/تقييمات الكشكvote_device_idvote_device_id→vote_devices
external_labsجديدالمعامل الخارجية المرجعيةname, deletedinvestigationresults.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, deleteddevices.location→ (استنتاج)
manual_operationجديدعمليات يدويةdeleted→patients (استنتاج)
devicesمعروفالأجهزة الطبية بالغرفdevice_name, location, deletedlocation→operations_rooms/locations

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