تقرير فني سرّي — للإدارة العليا

التحليل الشامل لنظام إدارة عيادات النساء والتوليد
وخطة دمجه كموديول في منظومة Moon ERP

تحليل معماري وقاعدي كامل لنظام العيادات الحالي (OB/GYN Clinic System) أُجري على الكود المصدري الفعلي ومخطط قاعدة البيانات الكامل، بهدف استخراج نماذج البيانات (Models) وعلاقاتها وسير العمل الإكلينيكي، تمهيداً لبناء موديول العيادات الجديد داخل نظام تخطيط موارد الشركة.

📅 تاريخ الإعداد: 10 يونيو 2026 🤖 أُعدّ بواسطة: Claude Code — 21 وكيل تحليل متوازٍ 📂 المصدر: الكود الكامل + obgy_12-7-2024.sql ✅ التغطية: 312 / 312 جدول
312جدول قاعدة بيانات
18موديول وظيفي
81كنترولر PHP
4تطبيقات فرعية
~38ألف سطر كود (core)
312 ← 85جدول بعد إعادة الهيكلة
📊

الملخص التنفيذي (Executive Summary)

خلاصة ما توصّل إليه التحليل في صفحة واحدة — التفاصيل الكاملة في الأقسام الجانبية، قسم لكل موديول.

ما هو النظام؟

نظام متكامل لإدارة مراكز وعيادات أمراض النساء والتوليد والعقم، يعمل منذ ما يقارب عام 2015، ويغطي رحلة المريضة كاملة: التسجيل والحجز والطابور، ثم الشيتات الإكلينيكية المتخصصة (متابعة الحمل ANC، أمراض النساء، العقم وتأخر الإنجاب، الحقن المجهري IVF/ICSI/IUI مع شيت متابعة التنشيط، تحاليل الزوج والسائل المنوي)، مروراً بالموجات الصوتية والأشعة والمناظير والعمليات والولادات، وانتهاءً بالروشتات والتحاليل والماليات. ويُلحق به ثلاثة تطبيقات مساندة: صيدلية بمخزون وفواتير شراء وبيع، وبورد تعليمي لمناقشة الحالات بين الأطباء، وشاشة انتظار لعرض الطابور.

أهم الاستنتاجات

التوصية

بناء موديول Modules/Obgy داخل Moon ERP (بنية Laravel Modules + واجهة Angular) بإجمالي ~85 جدولاً منظّماً بدلاً من 312، مع إعادة استخدام مكونات الـ ERP القائمة: ملف المريض الموحد، موديول المعامل LIS للتحاليل، المخزون للصيدلية، والحسابات للماليات. خطة التنفيذ المرحلية الكاملة وخريطة نقل كل جدول قديم إلى الموديل الجديد في قسم خطة النقل إلى ERP، وخريطة العلاقات الكاملة في قسم ERD.

كيف تقرأ هذا التقرير؟

  1. القائمة الجانبية تنقلك لأي موديول مباشرة — كل قسم مستقل وقابل للقراءة منفرداً.
  2. كل موديول يعرض: الغرض، الوظائف، جدولاً يوثّق كل جداول قاعدة البيانات التابعة له بحقولها وعلاقاتها، سير العمل الفعلي كما استُخرج من الكود، ثم توصيات النقل.
  3. الملحق الفني obgy-erp-analysis.md (مرفق مع التقرير) يحتوي النسخة التقنية الكاملة بالإنجليزية — بنية كل جدول بكل أعمدته وقيم جداول الترميز المزروعة — وهو مُعدّ ليُغذّى مباشرة إلى Claude Code عند بدء تنفيذ الموديول.

تحديث (11 يونيو): اكتشاف النسخة الثانية

بعد إصدار هذا التقرير اكتُشفت نسخة ثانية عاملة من البرنامج لدى مستشفى Green Nature (السعودية) تبيّن أنها نسخة أحدث متشعبة (Fork) وليست مجرد إعدادات مختلفة: ~70 كنترولر إضافي و178 جدولاً جديداً تغطي الإقامة الداخلية وغرف العمليات ومعمل الأجنة والتجميد وقسم الأشعة وعيادة الذكورة وتعدد الفروع. التحليل الكامل في ملحق النسخة الثانية آخر التقرير، وتعديلات خطة النقل المترتبة عليه في قسم تعديلات الخطة.

🏗️

المعمارية التقنية للنظام (Technical Architecture)

النظام مبني على إطار عمل PHP مخصص يُسمى "aw framework" (تطوير داخلي يعود لحوالي عام 2015)، بدون أي إطار عمل قياسي معروف. يتكون من أربعة تطبيقات فرعية تتشارك قاعدة بيانات MySQL واحدة (312 جدولًا) ومكتبات مشتركة في مجلد _library. طبقة العرض تعتمد على قوالب Smarty، وطبقة البيانات على RedBeanPHP، والتوجيه يتم بالوصول المباشر لملفات الكنترولر دون نقطة دخول موحدة. هذا القسم يشرح البنية وطريقة العمل والوضع الأمني والديون التقنية بصراحة مهنية لدعم قرار الترحيل إلى منظومة Laravel + Angular.

4تطبيقات فرعية
81ملف كنترولر
312جدول قاعدة بيانات
~38ألف سطر كود (كنترولرات core فقط)
PHP 5.6إصدار منتهي الدعم منذ 2018

نظرة عامة على البنية

مكونات النظام الأربعة

التطبيقالمسارالغرضالحجم التقريبي
العيادة الرئيسية (core)obgy/core/قلب النظام: المرضى، الزيارات، الشيتات الإكلينيكية (حمل/نساء/عقم/حقن مجهري)، التقارير المالية، الإعدادات، النسخ الاحتياطي، وخدمات الموبايل mobileservices.php70 كنترولر / ~37,900 سطر
الصيدلية (pharmacy)obgy/pharmacy/الأدوية، المشتريات، المخزن، الفواتير (receipt)، الموظفون6 كنترولرات
البورد التعليمي (board)obgy/board/جلسات وطلبات البورد والموظفون4 كنترولرات
شاشة الانتظار (screen)obgy/screen/شاشة عرض دور المرضى في الاستقبال — يعيد استخدام ملفات core مباشرة (require core/controllers/imp/)كنترولر واحد

الـ Framework المخصص (aw framework) وطريقة عمله

طبقة البيانات

العنصرالتفاصيلالملاحظات
المكتبة (ORM)RedBeanPHP إصدار 4.3 — ملف واحد _library/db_main/rb.php (12,380 سطرًا)إصدار قديم (~2016)؛ الإصدار الحالي 5.x
قاعدة البياناتMySQL — قاعدة amrtechogate_obgy بـ312 جدولًا (307 InnoDB، 5 MyISAM منها جدول المستخدمين awusers)جدول المستخدمين MyISAM لا يدعم المعاملات
الترميز (Charset)الاتصال يفرض SET NAMES latin1 بينما الجداول utf8 وتحوي بيانات عربيةاعتماد على "ازدواج ترميز" هش — أي ترحيل بيانات يتطلب معالجة ترميز دقيقة
وضع التشغيلR::freeze(FALSE) — الوضع "السائل" (Fluid Mode) مفعّل في الإنتاجالمكتبة قادرة على تعديل بنية الجداول تلقائيًا أثناء التشغيل — مخاطرة على سلامة المخطط
أسلوب الاستعلامخليط: ORM (R::find/load/store/trash) باستعلامات مُعاملة آمنة، بجانب SQL خام عبر R::getAll/getRow/exec كثير منه مبني بدمج نصوص مباشرالجزء الخام هو مصدر ثغرات حقن SQL (انظر الأمان)
المعاملات (Transactions)R::begin/commit/rollback تُستخدم في عمليات الإدخال المركبةممارسة جيدة، لكنها بلا أثر على الجداول الـMyISAM

المصادقة وواجهات الـ API

الأمان — نقاط القوة

الأمان — نقاط الضعف (بصراحة مهنية)

الثغرةالدليل (مسار الملف)الخطورة
حقن SQL — مدخلات المستخدم تُدمج نصيًا في الاستعلامات (شاشة بحث المرضى: الاسم/العنوان/الهاتف...، التقارير المالية، الزيارات، السونار)core/controllers/patients.php (بناء $q1..$q8 بصيغة LIKE '%$input%'financialreport.php (executeSqlvisits.php، sonar.php (R::exec('... WHERE id = ' . $id))حرجة — قاعدة البيانات تحوي بيانات طبية حساسة
API الموبايل بلا أي مصادقة + CORS مفتوح للجميع، يتيح إنشاء/تعديل سجلات مرضى وقراءة بياناتهمcore/controllers/mobileservices.php (فحوصات autho معلّقة، Access-Control-Allow-Origin: *)حرجة
بيانات اعتماد مكتوبة نصًا داخل الكود: كلمة مرور قاعدة البيانات مكررة في 5 ملفات إعدادات، مفاتيح API خارجية، ومفتاح سري للكوكيز ثابت_public/aw_config.php، _public/api_config.php، ونسخ core/pharmacy/board/screen/public/aw_config.phpعالية
النسخ الاحتياطية لقاعدة البيانات (ببيانات المرضى كاملة) مخزنة داخل مجلد الويب العام، وتُنشأ بأمر نظام يمرر كلمة المرور في سطر الأوامرcore/db_backups/ (1.6 جيجابايت، 39 نسخة)، _db/*.sql، الكود في core/controllers/index.php (دالة takeackup عبر system())عالية
لا توجد حماية CSRF في أي نموذج، ولا قائمة سماح للأكشنات القابلة للاستدعاء من الرابطنمط imp/_imp.php العام في كل الكنترولراتعالية
أكشنات إدارية خطرة قابلة للاستدعاء بمجرد تسجيل الدخول دون فحص صلاحيات (مثل onesetup الذي يحذف قوائم وأدوارًا)core/controllers/index.php (دالة onesetup — فحص الدخول فقط دون فحص الدور)متوسطة إلى عالية
display_errors = on في إعدادات الـ API (تسريب تفاصيل تقنية)، واتصال خارجي بخدمة SMS عبر HTTP غير مشفر_public/api_config.php، $hosturlApi = 'http://api.gt4it.com' في aw_config.phpمتوسطة
وضع ORM "السائل" مفعّل في الإنتاج (يسمح بتعديل بنية الجداول تلقائيًا)R::freeze(FALSE) في _public/aw_config.phpمتوسطة

الديون التقنية (Tech Debt)

البندالوضع الحاليالأثر
إصدار PHPالخادم يعمل بـ PHP 5.6.40 — انتهى دعمه الأمني نهائيًا في ديسمبر 2018لا تصلح أمنية منذ 7+ سنوات؛ عائق أمام أي مكتبات حديثة
Smartyالإصدار 3.1.11 (صدر 2012)ثغرات معروفة في إصدارات Smarty القديمة، ولا هروب تلقائي للمخرجات افتراضيًا
RedBeanPHPالإصدار 4.3 (~2016) كملف وحيد منسوخ يدويًالا إدارة تبعيات (لا Composer إطلاقًا في المشروع)
تكرار الكود~60 سطرًا من كود التهيئة منسوخة في كل كنترولر من الـ81؛ ملفات إعدادات مكررة بنفس كلمة المرور في كل تطبيق فرعي؛ كنترولرات عملاقة (patients.php = 2,259 سطرًا، visits.php = 1,946)أي تعديل عرضي مكلف وعرضة للأخطاء؛ صعوبة الصيانة هي المحرك الأساسي لقرار الترحيل
ملفات الرفعمجلد upload/ بحجم ~3.2 جيجابايت (السونار وحده 3.1) داخل مجلد الويب، يُقرأ من نظام الملفات مباشرة دون فهرسة كاملة في قاعدة البياناتصعوبة النسخ الاحتياطي والترحيل؛ مخاطر وصول مباشر للملفات
استراتيجية النسخ الاحتياطيتُنفذ داخل طلب الصفحة الرئيسية: أول زيارة يومية للصفحة الرئيسية تشغّل mysqldump بشكل متزامن وتكتب في core/db_backups/ (39 نسخة متراكمة، 1.6 جيجابايت) دون تدوير أو نقل خارج الخادم؛ نسخ Excel في core/excel_backups/بطء عشوائي للمستخدم الأول صباحًا؛ النسخ على نفس القرص = لا حماية من فقد الخادم
اتساق البيئةتوقيتان مختلفان في الإعدادات (لوس أنجلوس في aw_config مقابل القاهرة في الكود والـ API)؛ ترميز latin1/utf8 مزدوج؛ كود ميت (php-jwt، جداول مهجورة، كتل معلّقة كثيرة)أخطاء تواريخ محتملة؛ تعقيد إضافي عند ترحيل البيانات
الاختبارات والتحكم بالإصداراتلا توجد أي اختبارات آلية، ولا مستودع Git، وملفات error_log وملفات تجريبية متناثرة داخل مجلدات الكنترولراتأي تعديل = مخاطرة غير مقيسة؛ يصعّب التطوير المتوازي

الخلاصة الإدارية

🧑‍⚕️

إدارة المرضى والتسجيل (Patients & Registration)

هذا الموديول هو قلب النظام بأكمله؛ فجدول patients هو المحور الذي ترتبط به جميع الموديولات الأخرى تقريبًا (الزيارات، الفحوصات، التاريخ المرضي، الشيتات الإكلينيكية، الفواتير) عبر العمود patientid. يتولى الموديول تسجيل بيانات المريضة الديموغرافية الكاملة (الزوجة) وبيانات الزوج في نفس السجل، مع رقم ملف تسلسلي للعيادة، وإدارة قوائم الترميز المساعدة (الوظائف، التعليم، فصائل الدم، الحالة الاجتماعية، الألقاب)، والبحث متعدد المعايير، والسجل الطبي السريع، وملفات المريضة المرفوعة، مع مزامنة فورية لبيانات المريضة كعميل في نظام ERP خارجي عبر cURL.

17جدول
5كنترولر
14علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
patientsالجدول المحوري للنظام: سجل واحد لكل مريضة يضم بيانات الزوجة والزوج معًا، مع أرصدة افتتاحية للصيغة التوليدية وأعلام الحذف والاعتمادid, statusno, wifename, wiftypeid, dateofbirth, wifeage, wifeeducation, wifejob, wifebl, wifenationalid, statuesid, mirragefrom, mirragefromdate, boyson, girlson, husdandname, husbandtypeid, husbanddateofbirth, husbandjob, husbandbl, husbandnationalid, husband_habbits, address, phone, mobile, risk, risktype, pno, ab, ectopic, vmodel, svd, cs, done, deleted, userid, doctorid, patient_password_hashwifetypes عبر wiftypeid، wifestatus عبر statuesid، education عبر wifeeducation/husbandeducation، wifejobs عبر wifejob، husbandjobs عبر husbandjob، bloodtypes عبر wifebl/husbandbl، husbandtypes عبر husbandtypeid، risktype عبر risktype، awusers عبر userid/doctorid
patients_updatesنسخة كاملة من بنية patients مضافًا إليها أعمدة تدقيق (userid_edit, date_edit, patientid_edit) — يبدو أنها سجل تاريخي لتعديلات بيانات المرضى، ولا يوجد كود فعّال يكتب فيها حاليًا (استنتاج)نفس أعمدة patients + userid_edit, date_edit, patientid_editpatients عبر patientid_edit (استنتاج)، awusers عبر userid_edit
patients_tmpجدول مؤقت مهجور (اسم فقط) لا يُستخدم في أي كنترولر — مخلفات تطويرpit_id, pit_nameلا توجد
patientfilesمُعدّ لفهرسة ملفات المريضة المرفوعة، لكن الكود الحالي يقرأ الملفات من مجلد upload/patientfiles/{patientid} مباشرة دون استخدام الجدول (جدول غير مفعّل)id, patientid, filepatients عبر patientid
registerationصفوف "حجز/تسجيل الولادة" المرتبطة بشيت متابعة الحمل: مكان الولادة، المنشأ، النوع، التكلفة — تُنشأ من شاشة ANC Sheet وتُقرأ في تقارير الولاداتid, ancsheetid, place2, origin, type, awifep, coast, rplaceancsheet عبر ancsheetid، origin عبر origin
recordsالسجل الطبي السريع: سطر تشخيص وعلاج نصي لكل تاريخ لكل مريضة (شاشة Record) مع حذف منطقيid, patientid, date, diagnosis, ttt, delpatients عبر patientid، وترتبط وظيفيًا بـ recorddrugs عبر patientid + date
originقائمة ترميز "منشأ/جهة الولادة" المستخدمة في صفوف registeration وتقارير الولاداتid, title, delتُقرأ من registeration عبر origin
educationقائمة ترميز المستوى التعليمي (تستخدم للزوجة والزوج معًا) وتُدار من شاشة المريضid, title, delpatients عبر wifeeducation وhusbandeducation
bloodtypesقائمة ترميز فصائل الدم (للزوجة والزوج)id, title, delpatients عبر wifebl وhusbandbl
wifejobsقائمة ترميز وظائف الزوجة، وتدخل في البحث المتقدمid, title, delpatients عبر wifejob
husbandjobsقائمة ترميز وظائف الزوج، وتدخل في البحث المتقدمid, title, delpatients عبر husbandjob
wifestatusقائمة الحالة الاجتماعية للزوجة — القيم المزروعة: آنسة، متزوجة، مطلقة، متزوجة للمرة الثانية، أرملةid, title, delpatients عبر statuesid
wifetypesقائمة ألقاب/تصنيفات الزوجة، وتُطبع كلقب قبل الاسم في الروشتةid, title, delpatients عبر wiftypeid
husbandtypesقائمة ألقاب/تصنيفات الزوج، وتُطبع كلقب قبل الاسم في روشتة الزوجid, title, delpatients عبر husbandtypeid
complaintقائمة الشكاوى الرئيسية المستخدمة في شيتات أمراض النساء والعقم (gyna / gynasheet / infertilitysheet / ancsheet00)id, name, conditions (علم حذف منطقي)تُقرأ من شيتات gyna وinfertility (ربط بالقيمة المختارة)
complaintantقائمة الشكاوى الخاصة بزيارات متابعة الحمل (antenatal) — نسخة موازية لجدول complaintid, name, conditionsتُقرأ من antenalvisit وcompletereport
locationsقائمة أماكن (اسم + حذف منطقي) لا يوجد لها أي استخدام في الكنترولرات الحالية — جدول مهجور (استنتاج)id, name, deletedلا توجد علاقات مستخدمة

سير العمل (Workflow)

  1. يفتح موظف الاستقبال شاشة التسجيل patients.php?ac=index؛ يبحث النظام عن مسودة غير معتمدة (done=0) لنفس المستخدم فيستكملها، أو ينشئ سجلًا جديدًا فورًا في قاعدة البيانات برقم ملف تلقائي statusno.
  2. عند إدخال الرقم القومي يتحقق النظام من صحته بتعبير نمطي ويستخرج منه تاريخ الميلاد ويحسب العمر تلقائيًا؛ كما تُجرى فحوص تكرار فورية (الاسم، رقم الملف، الرقم القومي، الهاتف) عبر AJAX.
  3. تُحفظ الحقول حقلًا بحقل عبر AJAX (updateajax) أثناء الإدخال، وتُملأ القوائم المنسدلة من جداول الترميز (الألقاب، التعليم، الوظائف، الحالة، فصائل الدم) مع إمكانية إضافة قيم جديدة لهذه القوائم من نفس الشاشة.
  4. عند الضغط على "إنهاء" (addfinish) يُعتمد السجل (done=1) وتُسجَّل بيانات الزوجة والزوج كاملة وتُشفَّر كلمة مرور المريضة، وإذا طُلبت زيارة تُنشأ في جدول visits (نوع الكشف، نقدي/فيزا، خصم، ترتيب الدخول) داخل معاملة واحدة، ثم يُحوَّل المستخدم لشاشة تاريخ المريضة أو شاشة الاستقبال حسب صلاحيته.
  5. تُزامَن بيانات المريضة تلقائيًا كعميل في قاعدة ERP الخارجية (إضافة أو تحديث عبر curlAddClient/curlUpdateClient) إذا كانت قاعدة ERP معرّفة في الإعدادات.
  6. البحث عن مريضة قائمة من شاشة البحث متعدد المعايير؛ النتائج محدودة بـ60 سجلًا، ويوجّه الرابط لآخر شاشة إكلينيكية زارتها المريضة من جدول lastvisit، وفي وضع المستشفى يُبحث بالقسم عبر visits.detectionid مع استبعاد من انتهت متابعتهم في endvisitreports.
  7. في كل شاشة إكلينيكية يُعرض شريط بيانات المريضة (_patientdata.php) الذي يفك ترميز القوائم ويحسب الأعمار ومدة الزواج والصيغة التوليدية (P/CS/AB/Ectopic/VM/SVD) من phobstetric + الأرصدة الافتتاحية، ويعرض ملخصات التاريخ الطبي والجراحي والنسائي والعائلي — وينشئ تلقائيًا سجل فحص examination فارغًا إن لم يوجد.
  8. من شاشة السجل الطبي (record.php) يضيف الطبيب صفوف تشخيص/علاج بالتاريخ، ويكتب روشتات للزوجة أو الزوج من كتالوج الأدوية (recorddrugs/drugs) ويطبعها بلقب واسم المريض من جداول الألقاب.
  9. تُرفع ملفات وصور المريضة إلى مجلد upload/patientfiles/{id} عبر إضافة الرفع المتعدد، وتُعرض وتُحمَّل من نظام الملفات مباشرة.
  10. أثناء متابعة الحمل تُسجَّل بيانات حجز الولادة في صفوف registeration المرتبطة بشيت ancsheet (المكان، المنشأ، النوع، التكلفة) وتُقرأ لاحقًا في تقارير الولادات.
  11. عند انتهاء فترة العلاج/المتابعة يُسجَّل تقرير إنهاء في endvisitreports، ويمكن حذف المريضة حذفًا منطقيًا (deleted=1) مع حذف العميل المقابل في ERP.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

📅

الزيارات والمواعيد (Visits & Appointments)

يُعد هذا الموديول العمود الفقري التشغيلي للعيادة؛ فهو يدير حجز الزيارات من الاستقبال ومن تطبيق الموبايل، وتنظيم طابور الانتظار اليومي للطبيب، وتقسيم اليوم إلى فترات زمنية بسعة محددة، كما يسجل في الجدول ذاته الحركة المالية للزيارة (قيمة الكشف نقدًا/فيزا، الخصم، المتبقي، سداد المتبقي، المرتجعات، الأقساط)، ويوجّه الطبيب تلقائيًا إلى آخر شيت إكلينيكي فتحه للمريضة، وينتهي بتقرير إنهاء العلاج.

9جدول
4كنترولر
10علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
visitsالجدول المركزي: الزيارة/الموعد + الحركة المالية المرتبطة بها (كشف، سداد متبقٍ، مرتجع، قسط)patientid, visitdate, visittime, detectionid, totaldetectionvalue, discount, detectionvalue_cash, detectionvalue_visa, restdetectionvalue, visitorder, enterordered, view, visit_period, urgent, payedflag, mobileappvisit, approx_time, visitid, user_id, end, enddate, branch_idpatients عبر patientid، detections عبر detectionid، visit_periods عبر visit_period، awusers عبر user_id وenddoctorid، الزيارة الأصلية ذاتيًا عبر visitid
visits_updatesنسخة ظل من جدول الزيارات بحقول تدقيق إضافية لتتبع التعديلات (غير مستخدم في أي كود تم العثور عليه — مهجور أو محجوز) (استنتاج)نفس حقول visits + userid_edit, date_edit, patientid_edit, clinic_idpatients عبر patientid، awusers عبر userid_edit (استنتاج)
visit_periodsتعريف فترات اليوم (صباحية/مسائية...) بسعة قصوى لكل فترةname, timing, max_no, deletedvisits عبر visit_period
newvisitزيارات المتابعة الإكلينيكية داخل شيت العقم (تاريخ، آخر دورة، وزن، رحم، مبايض، علاج)infertilitysheetid, newvisitcycles, date, lmp, bw, ut, ov, tttinfertilitysheet عبر infertilitysheetid، newvisitcycles عبر newvisitcycles
newvisitcyclesقاموس أنواع الدورات/السيكلات لزيارات متابعة العقم (لا توجد بيانات مزروعة في النسخة الاحتياطية)title, delnewvisit عبر newvisitcycles، وكذلك newvisitg في شيت النساء
lastvisitمؤشر لكل مريضة يخزن اسم آخر كنترولر شيت إكلينيكي فُتح لها، لتوجيه الطبيب من الطابور مباشرة إلى الشيت الصحيحpatientid, controlpatients عبر patientid؛ قيمة control تشير إلى كنترولر (antenalvisit / ancsheet / gynasheet / iui / infertilitysheet)
old_visitsأرشيف للبنية القديمة لجدول الزيارات (قيمة كشف واحدة قبل فصل النقدي/الفيزا)، استُخدم مرة واحدة في سكربت ترحيل fixOldVisits()patientid, visitdate, detectionid, detectionvalue, visitorder, enterordered, end, enddatepatients عبر patientid، detections عبر detectionid، يطابق visits.id بنفس id (استنتاج من سكربت الترحيل)
endvisitreportsتقرير إنهاء فترة العلاج للمريضة (السبب، التاريخ، الملاحظات، الطبيب)patientid, reason, enddate, notes, doctorid, statuspatients عبر patientid، awusers عبر doctorid
vacationsأيام إجازات العيادة بتاريخ وسبب وحقول تدقيق بنمط Laravel (غير مستخدم في أي كود تم العثور عليه) (استنتاج)vacation_date, vacation_reason, created_at, updated_at, created_by, updated_byawusers عبر created_by وupdated_by (استنتاج)

سير العمل (Workflow)

  1. يبحث موظف الاستقبال عن المريضة برقم الملف (statusno) أو بالاسم (بحث تلقائي بالإكمال)، ثم يفتح شاشة إضافة زيارة (visits.php?ac=index).
  2. يختار نوع الكشف من قاموس detections (الذي يحمل السعر)، ويحدد التاريخ والفترة الزمنية والقيمة المدفوعة نقدًا/فيزا والخصم والمتبقي والملاحظات والوقت التقريبي، ثم تُحفظ الزيارة بـ payedflag=1 ويُحتسب ترتيب الدخول enterordered تلقائيًا.
  3. عند تفعيل نظام الفترات (programesetting.visit_period=1) يتحقق النظام من عدد المحجوزين في الفترة مقابل max_no قبل الحجز.
  4. بديلًا، تحجز المريضة من تطبيق الموبايل (mobileservices.php?ac=addVisit) فتُسجَّل الزيارة بـ mobileappvisit=1 وpayedflag=0، وعند الحضور والدفع يستدعي الاستقبال payvisit فيتحول العلم إلى مدفوع وتُنشأ فاتورة بيع في الـ ERP الخارجي.
  5. كل زيارة مدفوعة تُرسل فورًا عبر cURL إلى نظام ERP خارجي (sellbillController.php?do=addObgyVisit) لإنشاء فاتورة بيع مرتبطة بالزيارة، ويُحدَّث/يُحذف معها عند تعديل أو حذف الزيارة.
  6. تظهر زيارات اليوم في الشاشة الرئيسية (index.php) كطابور انتظار؛ في وضع المستشفى ينقسم الطابور إلى منتظرين وداخلين، ويضغط المستخدم "دخول" فتُعلَّم الزيارة view=1 وتنتقل لقائمة الداخلين، مع إمكانية إعادة الترتيب بالسحب.
  7. من الطابور ينتقل الطبيب إلى الشيت الإكلينيكي؛ ويستخدم النظام جدول lastvisit لمعرفة آخر شيت فُتح للمريضة (متابعة حمل/نساء/عقم/حقن مجهري) فيوجهها مباشرة، ويُحدَّث هذا السجل تلقائيًا عند فتح أي شيت.
  8. داخل شيت العقم يضيف الطبيب صفوف زيارات متابعة (newvisit) عبر حفظ خلوي فوري بالأجاكس، مع اختيار نوع السيكل من قاموس newvisitcycles.
  9. المعاملات المالية اللاحقة تُسجَّل كصفوف جديدة في visits مرتبطة بالزيارة الأصلية عبر visitid: سداد متبقٍ (detectionid=999) أو مرتجع (detectionid=9999) بعد التحقق من أن المرتجع لا يتجاوز المدفوع، أو دفع قسط (detectionid=-99) يخصم من رصيد totalbalance.
  10. عند انتهاء خطة العلاج يُنشأ تقرير إنهاء (endvisitreports) بالسبب والتاريخ واسم الطبيب من شاشة المريضة، أو إغلاق جماعي لكل مرضى قسم معين عبر emptydeptvisit.
  11. الزيارات المستقبلية العاجلة (urgent=1) تظهر في قائمة الانتظار (waitingList) ليُقرَّر ترحيلها إلى اليوم أو إلغاؤها.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🤰

متابعة الحمل (ANC) (Antenatal Care)

موديول متابعة الحمل هو المسؤول عن إدارة ملف الحمل الكامل للمريضة: حساب ميعاد الولادة المتوقع (EDD) من تاريخ آخر دورة (LMP)، تسجيل زيارات المتابعة الدورية (الوزن، الضغط، عمر الحمل بالأسابيع)، أشعة الموجات فوق الصوتية للحمل، صرف الأدوية وطلب التحاليل لكل زيارة، تسجيل تاريخ فقدان الحمل السابق (EPC)، وتقارير الولادات المتوقعة وحالات الخطورة. يحتوي النظام الحالي على مسارين متوازيين ومكررين لنفس الوظيفة: مسار "ANC Sheet" ومسار "Antenatal Visit".

21جدول
8كنترولر
14علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
ancsheetملف الحمل الرئيسي للمريضة (مسار ANC Sheet): LMP/EDD، المشيمة، فحوصات T/TT-scan، لقطة G/P/EPC عند إنهاء الحملpatientid, endpreg, sheetlmp, sheetedd, placenta, tscandate, ttscandate, obstgn, obstpn, obstepc, 4d_list_idpatients عبر patientid، op_4d_list عبر 4d_list_id
ancnewvisitزيارة متابعة داخل ملف ANC: التاريخ، عمر الحمل، الوزن، الضغط، بيانات أشعة مختصرة، الخطةancsheetid, newvisitdate, newvisitw, newvisitbw, newvisitbp, usn, usplace, usaf, usefw, usbiom, planancsheet عبر ancsheetid
ancsheetdrugsأدوية/روشتات مرتبطة بملف ANC بتاريخ معين، للزوجة أو الزوجpatientid, ancsheetid, date, drugid, drugname, drugdos, forhusband, doctorid, recepittmpid, deletedancsheet عبر ancsheetid، drugs عبر drugid، awusers عبر doctorid
ancsheetinvestتحاليل واستقصاءات مطلوبة من ملف ANC مع النتيجةpatientid, ancsheetid, date, investid, investresult, forhusband, doctorid, deletedancsheet عبر ancsheetid، invests عبر investid
mainantenentalملف الحمل الرئيسي للمسار الموازي (Antenatal Visit): LMP/EDD/IVF date، عدد مرات الحمل G، الهيموجلوبين، جنس الجنينpatientid, doctorid, lmp, eed, ivf, g, done, hb, sex, sysdatepatients عبر patientid، awusers عبر doctorid
antenalvisitزيارة متابعة في المسار الموازي: شكوى، وزن، ضغط، نبض، تشخيصات وشكاوى متعددة (CSV)patientid, mainantenentalid, antenaldate, complaint, wt, bp, pulse, diagnosisid, complaintid, conditionsmainantenental عبر mainantenentalid، diagnosisant/complaintant عبر قوائم CSV (استنتاج)
mainantenentaldrugsأدوية المسار الموازي (نسخة مكررة من ancsheetdrugs بنفس البنية)patientid, mainantenatalid, date, drugid, drugname, drugdos, forhusband, doctorid, deletedmainantenental عبر mainantenatalid، drugs عبر drugid
mainantenentalinvestتحاليل المسار الموازي (نسخة مكررة من ancsheetinvest)patientid, mainantenatalid, date, investid, investresult, forhusband, doctorid, deletedmainantenental عبر mainantenatalid، invests عبر investid
mainantenentalusسجل أشعة الموجات فوق الصوتية للحمل: قياسات الجنين والمشيمة والسائل الأمنيوسيmainantenatalid, patientid, date, nga, gs, crl, fhr, bpd, fl, placenta, ai, fwt, doctoridmainantenental عبر mainantenatalid، awusers عبر doctorid
placentaقائمة اختيار لمواضع المشيمة (ant, post high, fundal, ant low lying...) تُستخدم في حقل ancsheet.placentaid, title, delتُقرأ من شاشة ancsheet عبر data-celtable
pla2cenقائمة اختيار "مكان إجراء الحقن المجهري" تخص فعليًا موديول IVF وليس متابعة الحمل (حقل ivfsheet.pla2cen)id, title (نوعه int خطأً), delivfsheet عبر pla2cen (موديول IVF)
anprotocolقائمة بروتوكولات التنشيط (long ag / antag / short ag) — جدول قديم؛ الكود الحالي يستخدم جدول icsiprotocol بدلًا منهid, title, delغير مستخدم فعليًا (استنتاج: مهجور لصالح icsiprotocol)
antypeقائمة نوع العقم (1ry / 2ry / sex selection) — تخص موديول IVF (حقل ivfsheet.antype)id, title, delivfsheet عبر antype (موديول IVF)
antypesقائمة نوع الدورة (fresh / frozen) — تخص موديول IVF (حقل ivfsheet.antypes)id, title, delivfsheet عبر antypes (موديول IVF)
wifeepcسجل فقدان الحمل السابق EPC للمريضة: النوع، أسبوع الحمل، العلاج، الطبيب، الباثولوجي، التكلفةinfertilitysheetid, wifeepcdate, wifeepctype, wifeepcw, wifeepcttt, wifeepcobst, histopath, coast, wifeepcp, wifeepcepcinfertilitysheet عبر infertilitysheetid، قوائم wifeepctype/wifeepcttt/wifeepcobst
wifeepctypeقائمة أنواع فقدان الحمل: EPL، A T1، A T2، C VM، P VM، EP (حمل خارج الرحم)id, title, delwifeepc عبر wifeepctype
wifeepctttقائمة طرق علاج فقدان الحمل: conservative، medical (miso/MTX)، D&C، laparoscopy/laparotomyid, title, delwifeepc عبر wifeepcttt
wifeepcobstقائمة الأطباء/المراكز التي تعاملت مع حالة فقدان الحمل (أسماء أطباء بالعربية)id, title, delwifeepc عبر wifeepcobst
wifeobstقائمة الأطباء/المستشفيات التي أجرت الولادات السابقة لأطفال المريضة (اختيار متعدد)id, title, delawifep عبر wifeobst (قائمة CSV)
wifemodeofdقائمة طريقة الولادة: CS (قيصرية)، sVD، nVD (طبيعية)id, title, delawifep عبر wifemodeofd
wifetypeofdقائمة توقيت الولادة: FT (مكتملة) / PT (مبتسرة)id, title, delawifep عبر wifetypeofd

سير العمل (Workflow)

  1. عند فتح شاشة ANC للمريضة (ancsheet.php?ac=index) يبحث النظام عن ملف حمل نشط (endpreg=0)؛ إن لم يوجد يُنشأ تلقائيًا، ويُنشأ كذلك ملف infertilitysheet إن لم يوجد، ويُسجل الدخول في lastvisit.
  2. يُدخل الطبيب تاريخ آخر دورة LMP فيحسب النظام EDD تلقائيًا (LMP + 9 أشهر + 7 أيام) عبر دالة eedlmp()، وبمجرد وجود EDD يُضاف صف تلقائي في قائمة انتظار أشعة 4D (op_4d_list) ويُربط بالملف عبر 4d_list_id.
  3. تُسجل بيانات فحص الثلث الأول (T-scan) ومسح التشوهات (TT-scan)؛ إدخال التاريخ يُحدّث حالة الحجز في op_4d_list (الأعمدة t11/t21).
  4. في كل حضور يضيف الطبيب "New Visit" فيُنشأ صف ancnewvisit بتاريخ اليوم ويحسب عمر الحمل بالأسابيع والأيام من LMP تلقائيًا، ثم تُملأ الحقول (وزن، ضغط، ملاحظات، خطة، بيانات أشعة) بحفظ فوري حقلًا بحقل عبر AJAX.
  5. من نفس الشاشة تُكتب روشتة اليوم (ancsheetdrugs) من كتالوج الأدوية، للزوجة أو الزوج، مع إمكانية الطباعة وعرض روشتات التواريخ السابقة وتعديلها.
  6. تُطلب التحاليل بتحديد بنود من كتالوج التحاليل المصنف فتُحفظ دفعة واحدة في ancsheetinvest وتُطبع، وتُسجل النتائج لاحقًا في نفس الصفوف.
  7. تُعرض في الملف أيضًا بيانات التاريخ التوليدي من موديول العقم: الأطفال السابقون (awifep مع قوائم طريقة/توقيت/مكان الولادة) وحالات فقدان الحمل (wifeepc مع قوائم النوع/العلاج/الطبيب)، وتُحرر من هنا مباشرة.
  8. عند انتهاء الحمل يضغط المستخدم "End Pregnancy" فيتحول endpreg=1 وتُلتقط قيم G/P/EPC من ملف العقم وتُحفظ في الملف، ويصبح الملف أرشيفًا يُستعرض من شاشة archive/historys.
  9. بالتوازي، شاشة antenalvisit.php تدير نفس الحمل بجداول أخرى: تُنشئ/تحمّل mainantenental (مع حساب G تلقائيًا من phobstetric وعدادات المريضة)، وتسجل زيارات antenalvisit وأشعة mainantenentalus وأدوية وتحاليل خاصة بها، وتُنهى بـ done=1 ويُستعرض أرشيفها برقم الحمل g.
  10. التقارير: edd.php يعرض من ولادتهن المتوقعة اليوم أو في مدى تاريخي من ancsheet.sheetedd، وexpected.php يعرض نفس التقرير من mainantenental.eed، وepc.php يعرض حالات فقدان الحمل بالتاريخ، وrisktype.php يصنف المرضى حسب patients.risktype، وtermination.php يعرض الحالات حسب نوع إنهاء الحمل من phobstetric.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🌸

أمراض النساء (Gynecology)

يُغطي هذا الموديول العيادة النسائية الكاملة: تسجيل زيارات المريضة (الشكوى، التشخيص، تاريخ آخر دورة)، صرف الروشتات وطلب الفحوصات للزوجة أو الزوج، سونار النساء مع قياسات الرحم والمبيضين والحويصلات، بالإضافة إلى «شيت النساء» الملخّص الذي يجمع التاريخ الحيضي والفحص الموضعي وزيارات المتابعة، وملف مبدئي لتقييم تأخر الإنجاب (Infertility) داخل شاشة النساء نفسها.

22جدول
4كنترولر
12علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
gynaسجل زيارة أمراض النساء: الشكوى والتشخيص والملاحظات وLMP، مع حقول ملخّص العقم (inf_*)patientid, gynadate, complaint, complaintid (CSV), diagnosisid (CSV), diagnosistxt, notes, gynalmp, conditions, doctorid, inf_type, inf_fsh...inf_hsg, inf_notepatients عبر patientid، awusers عبر doctorid، diagnosis/complaint عبر CSV في diagnosisid/complaintid
gynadrugsأدوية الروشتة في شاشة النساء (للزوجة أو الزوج) بتاريخ محددpatientid, date, drugid, drugname, drugtype, drugdos, forhusband, deleted, doctorid, recepittmpid, recepitdrugidpatients عبر patientid، drugs عبر drugid، awusers عبر doctorid
gynainvestigationطلبات الفحوصات من شاشة النساء ونتائجهاpatientid, date, investid, investresult, forhusband, deleted, doctoridpatients عبر patientid، invests عبر investid
gynasheetرأس «شيت النساء»: سجل واحد لكل مريضة يحمل البيانات الحرجةpatientid, importantnote, usvsdtvpatients عبر patientid، تتبعه زيارات newvisitg
gynasheetdrugsأدوية روشتة «شيت النساء» (بنية مطابقة تماماً لـ gynadrugs)patientid, date, drugid, drugname, drugtype, drugdos, forhusband, deleted, doctoridpatients عبر patientid، drugs عبر drugid
gynasheetinvestفحوصات «شيت النساء» (بنية مطابقة لـ gynainvestigation)patientid, date, investid, investresult, forhusband, deleted, doctoridpatients عبر patientid، invests عبر investid
gynausسونار زيارات النساء: يوم الدورة، البطانة، قياسات المبيضين والرحم وعنق الرحم وعدد الحويصلاتpatientid, date, day, endo, ovrayll/lw/lv/lno/lsize, ovrayrl/rw/rv/rno/rsize, uterusl/w/v, cervixl/w/v, lfolliclesno, rfolliclesno, notes, doctorid, deleted, mainantenatalidpatients عبر patientid، awusers عبر doctorid، mainantenatal عبر mainantenatalid (استنتاج)
gynausficilsتفاصيل قياس كل حويصلة (طول/عرض/حجم) لكل جهة في سونار معيّنgynausid, name, length, width, volume, type (0=أيسر،1=أيمن), sysdategynaus عبر gynausid
gynainfertilityملخّص تقييم العقم: سجل واحد لكل مريضة (نوع، مدد، هرمونات، سائل منوي، HSG)patientid, date, type, since_y/m, stay_y/m, stay_hus, abortion, semen, fsh, lh, tsh, prl, amh, hsg, notepatients عبر patientid، gynainfertilitytype عبر type
gynainfertilityplanسطور خطة علاج العقم المتعددة لكل مريضةpatientid, plan, itr, deletedpatients عبر patientid
gynainfertilitytypeقاموس أنواع العقم (Primary/Secondary...) قابل للإضافة من الشاشةname, deletedتُشير إليه gynainfertility.type
infertilitygynaسجل الفحص النسائي داخل ملف موديول العقم (Vagina / Exam / Sounding / Adnexae)infertid, date, vagina, exam, sounding, adenxaeinfertility عبر infertid
maingynaملاحظات وخطة عامة أعلى شاشة النساء؛ سجل واحد لكل مريضة يُنشأ تلقائياًpatientid, create_date, notes, planpatients عبر patientid
newvisitgزيارات المتابعة داخل «شيت النساء» (دورة، LMP، وزن، رحم/مبيض، نوع الموجات، شكوى وتشخيص)gynasheetid, date (varchar), newvisitcycles, lmp, bw, ut, ov, newvisitgco (CSV), newvisitgdiag (CSV), usvsdtv, noteg, plangynasheet عبر gynasheetid، newvisitgco/newvisitgdiag عبر CSV
newvisitgcoقاموس شكاوى (C/O) زيارات الشيت — يضيفه المستخدم أثناء العملtitle, delتُشير إليه newvisitg.newvisitgco (CSV)
newvisitgdiagقاموس تشخيصات زيارات الشيتtitle, delتُشير إليه newvisitg.newvisitgdiag (CSV)
menstrualamountقاموس كمية الدورة الشهرية (التاريخ الحيضي)title, delتُشير إليه infertilitysheet.menstrualamount
menstrualdysmقاموس عسر الطمث (Dysmenorrhea)title, delتُشير إليه infertilitysheet.menstrualdysm
menstrualregقاموس انتظام الدورة الشهريةtitle, delتُشير إليه infertilitysheet.menstrualreg
localcxقاموس نتائج فحص عنق الرحم في الفحص الموضعيtitle, delتُشير إليه infertilitysheet.localcx (CSV)
localvaginaقاموس نتائج فحص المهبل في الفحص الموضعيtitle, delتُشير إليه infertilitysheet.localvagina (CSV)
localvulvaقاموس نتائج فحص الفرج في الفحص الموضعيtitle, delتُشير إليه infertilitysheet.localvulva (CSV)

سير العمل (Workflow)

  1. يفتح الطبيب شاشة «Gyna» للمريضة (gyna.php?patientid=) فيُسجَّل الدخول في lastvisit ويُنشأ تلقائياً سجل maingyna (ملاحظات/خطة) إن لم يوجد، وتُعرض كل الزيارات السابقة مرتبة تنازلياً.
  2. يضيف الطبيب زيارة جديدة (AJAX newrow) فتُنشأ صفّاً فارغاً بتاريخ اليوم في gyna، ثم يُحرَّر كل حقل (الشكوى، التشخيصات المتعددة، LMP، الملاحظات) فورياً عبر update الذي يحفظ عموداً واحداً في كل نداء.
  3. تُختار الشكاوى والتشخيصات من قاموسَي complaint وdiagnosis المشتركَين وتُخزَّن كسلسلة معرّفات مفصولة بفواصل؛ ويمكن إضافة مصطلح جديد للقاموس مباشرة (adddiagnosis).
  4. للروشتة: يفتح الطبيب نافذة الأدوية فتُنشأ صفوف gynadrugs بتاريخ اليوم (للزوجة forhusband=0 أو الزوج forhusband=1) ويختار الدواء بتسلسل تصنيف/اسم/شكل/جرعة، ثم يطبع الروشتة (مع التشخيص الأخير إذا فُعّل print_diag في الإعدادات).
  5. للفحوصات: نافذة Checkbox مجمّعة حسب investcats تحفظ صفوف gynainvestigation وتطبع طلب الفحص؛ وتُسجَّل النتائج لاحقاً في investresult.
  6. للسونار: زر إضافة يُنشئ صفّاً في gynaus (نموذج مبسّط أو كامل حسب programesetting.ultrasound)، وتفتح نافذة الحويصلات لكل مبيض لتحفظ القياسات في gynausficils وتحدّث lfolliclesno/rfolliclesno داخل معاملة واحدة، مع إمكانية طباعة تقارير سونار مختارة.
  7. نافذة العقم (getInfdata): تُنشأ تلقائياً سجل gynainfertility وسطر خطة gynainfertilityplan إن لم يوجدا، وتُعبّأ بيانات النوع والمدد والهرمونات، مع إضافة أنواع جديدة إلى gynainfertilitytype.
  8. شاشة «شيت النساء» (gynasheet.php): تُنشأ تلقائياً سجلا gynasheet وinfertilitysheet للمريضة؛ يدوَّن التاريخ الحيضي والفحص الموضعي عبر قوائم منسدلة تُحفظ في أعمدة infertilitysheet، وتُضاف زيارات متابعة newvisitg (إجراء append) بشكواها وتشخيصها وروشتتها (gynasheetdrugs) وفحوصاتها (gynasheetinvest).
  9. القوائم المنسدلة (الحيضية والموضعية وC/O والتشخيص) قابلة للإثراء أثناء العمل: getselectajax يضيف عنواناً جديداً للجدول المرجعي، وgetdataselect/deldataselect يديران حذف القيم منطقياً.
  10. gynasheet00.php نسخة قديمة بديلة تعرض الشيت مدموجاً مع زيارات gyna وسونار gynaus في صفحة واحدة (منطق مكرر).
  11. في موديول العقم، عند إنشاء ملف infertility تُنشأ معه تلقائياً صفوف فحص نسائي infertilitygyna ضمن مجموعة جداول الملف، وتُحرَّر حقولها (Vagina/Exam/Sounding/Adnexae) موضعياً.
  12. أخصائي السونار يستخدم ultrasoundgyna.php لإنشاء تقرير سونار نسائي رسمي مسوّدة (done=0) ثم اعتماده بالطباعة (done=1) — في جدول ultrasoundgyna التابع لموديول السونار.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🧬

العقم وتأخر الإنجاب (Infertility)

موديول متكامل لمتابعة حالات العقم وتأخر الإنجاب على مستوى الزوجين معاً (الزوجة والزوج)، ويشمل ملف العقم السريع القديم، و«شيت العقم» الشامل الحديث الذي يوثّق التاريخ المرضي والجراحي والإنجابي والدورة الشهرية وتشخيص عامل الزوج والزوجة والعلاجات السابقة واستجابتها، مع إصدار روشتات وطلبات تحاليل منفصلة لكل من الزوج والزوجة، وحساب الصيغة التوليدية (Gravida/Para) آلياً من سجل الحمول السابقة.

28جدول
3كنترولر
20علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
infertilityالملف السريع القديم للعقم (سجل واحد لكل مريضة)patientid, marriage, menstr, operations, sexualhistory, breast, hirsuitism, obesitypatients عبر patientid
infertilitydiagnosisتشخيصات مؤرخة للزوجة والزوج داخل الملف القديمinfertid, date, diagnosiswife, diagnosishusband, delinfertility عبر infertid
infertilitylmpسجل تواريخ آخر دورة شهريةinfertid, dateinfertility عبر infertid
infertilityinvestنتائج استقصاءات العقم (سائل منوي، أشعة بالصبغة، هرمونات، منظار)infertid, date, semen, peg, hsg, pct, us, prolactin, thyr, fsh, lh, laparoscopyinfertility عبر infertid
infertilitynotesملاحظات مؤرخة على ملف العقمinfertid, date, note, delinfertility عبر infertid
infertilitydrugsروشتات الملف القديم (دواء لكل صف، زوج أو زوجة)patientid, date, drugid, drugdos, forhusband, doctorid, deletedpatients عبر patientid، drugs عبر drugid، awusers عبر doctorid
infertilitysheetشيت العقم الشامل الحديث (سجل واحد لكل مريضة، ~64 حقلاً)patientid, sheettype, historyduration, husbndiagnosis1..3, tttda, tttmetformin, ttttype, tttresponse, obstg/obstp/obstft/obstpt/obstepc/obstliving, menstrualreg, wmenstruallmp, sheethusband, sheetwife, sheetlocationpatients عبر patientid، وقوائم typeinf / sheetlocation / husbndiagnosis1-3 / ttt* / sheethusband / sheetwife عبر معرفات مخزنة نصياً
infertilitysheetdrugsروشتات شيت العقم (منفصلة للزوج والزوجة بالتاريخ)patientid, date, drugid, drugname, drugdos, forhusband, doctorid, deletedpatients عبر patientid، drugs عبر drugid، awusers عبر doctorid
infertilitysheetinvestطلبات التحاليل ونتائجها من شيت العقمpatientid, date, investid, investresult, forhusband, doctorid, deletedpatients عبر patientid، invests عبر investid، awusers عبر doctorid
typeinfقائمة نوع العقم (أولي/ثانوي) (استنتاج) لحقل sheettypetitle, delinfertilitysheet عبر sheettype
typeقائمة عامة مرتبطة فعلياً بجدول تسجيل شيت الحمل (registeration.type) وليست خاصة بالعقمtitle, delregisteration (موديول متابعة الحمل) عبر type
sheethusbandقائمة أسباب/عوامل العقم المنسوبة للزوج (اختيار متعدد)title, delinfertilitysheet عبر sheethusband (قائمة معرفات بفواصل)
sheetwifeقائمة أسباب/عوامل العقم المنسوبة للزوجة (اختيار متعدد)title, delinfertilitysheet عبر sheetwife (قائمة معرفات بفواصل)
sheetlocationقائمة مكان/جهة الفحص أو المتابعة في الشيتtitle, delinfertilitysheet عبر sheetlocation
previous_marriageالزيجات السابقة للزوجة (المدة وعدد الذكور والإناث وسن آخر طفل)patientid, period, males, females, last_age, deletedpatients عبر patientid
hus_previous_marriageالزيجات السابقة للزوج (نفس البنية)patientid, period, males, females, last_age, deletedpatients عبر patientid
husbndiagnosis1قائمة تشخيص الزوج — المستوى الأول (تحليل السائل المنوي غالباً) (استنتاج)title, delinfertilitysheet عبر husbndiagnosis1
husbndiagnosis2قائمة تشخيص الزوج — المستوى الثانيtitle, delinfertilitysheet عبر husbndiagnosis2
husbndiagnosis3قائمة تشخيص الزوج — المستوى الثالثtitle, delinfertilitysheet عبر husbndiagnosis3
wifepسجل الحمول السابقة للزوجة — نسخة قديمة مهجورة جزئياً (لا تزال تُقرأ في شاشة تاريخ الحقن المجهري)infertilitysheetid, wifesex, wifemodeofd, wifetypeofd, wifepmethod, awifepmethod, name, date, duration, wifelinfertilitysheet عبر infertilitysheetid، wifesex/wifepmethod/awifepmethod عبر المعرفات
wifepmethodقائمة وسيلة منع الحمل بعد الولادة — النسخة القديمة المرتبطة بـwifeptitle, delwifep عبر wifepmethod
awifepسجل الحمول السابقة للزوجة — النسخة الفعّالة المستخدمة في شيت العقم وشيت الحقن المجهري (صف لكل حمل/ولادة)infertilitysheetid, wifesex, wifemodeofd, wifetypeofd, wifew (الوزن), wifel (حي), date, awifepmethod, duration, stopped, comment, wifeageinfertilitysheet عبر infertilitysheetid، wifesex عبر wifesex، awifepmethod عبر awifepmethod، wifemodeofd/wifetypeofd (قوائم خارج النطاق)
awifepmethodقائمة وسيلة منع الحمل بعد الولادة — النسخة الفعّالة (اختيار متعدد في صف الحمل)title, delawifep عبر awifepmethod (قائمة معرفات بفواصل)
wifesexقائمة نوع المولود (ذكر/أنثى) (استنتاج)title, delawifep و wifep عبر wifesex
tttdaقائمة علاجات سابقة — محفزات الدوبامين/منشطات التبويض (استنتاج من الاسم D.A.)title, delinfertilitysheet عبر tttda
tttmetforminقائمة استخدام الميتفورمين في العلاج السابقtitle, delinfertilitysheet عبر tttmetformin
tttresponseقائمة الاستجابة للعلاج السابقtitle, delinfertilitysheet عبر tttresponse
ttttypeقائمة نوع العلاج/التنشيط السابق (اختيار متعدد)title, delinfertilitysheet عبر ttttype (قائمة معرفات بفواصل)

سير العمل (Workflow)

  1. تُختار المريضة من شاشة البحث، ثم يفتح الطبيب شاشة «شيت العقم» (infertilitysheet.php?patientid=N)؛ إذا لم يوجد شيت يُنشأ سجل فارغ تلقائياً في infertilitysheet، ويُنشأ كذلك gynasheet مرافق، ويُسجَّل الدخول في lastvisit.
  2. يملأ الطبيب بنود الشيت حقلاً حقلاً؛ كل حقل يُحفظ فوراً عبر AJAX (دالة Add/update تستقبل اسم الجدول والعمود والقيمة وتحفظ مباشرة).
  3. القوائم السريرية (نوع العقم، تشخيصات الزوج، العلاجات ttt*، عوامل الزوج/الزوجة، المكان...) تُحمَّل عبر getselect من جداول القوائم، ويمكن للطبيب إضافة قيمة جديدة فورياً عبر getselectajax أو حذفها عبر deldataselect.
  4. يضيف الطبيب صفوف التاريخ الإنجابي عبر append الذي يُدرج صفاً جديداً في awifep مرتبطاً بـinfertilitysheetid، ثم يكمل بياناته (نوع المولود، تاريخ وطريقة الولادة، الوزن، حي/متوفى، وسيلة منع الحمل بعده).
  5. عند الضغط على زر الصيغة التوليدية تُنفَّذ دالة obstetric() فتعدّ الولادات المكتملة والمبتسرة من awifep والإجهاضات من wifeepc والحمل الجاري من ancsheet النشط، وتحفظ النتائج في حقول obst* بالشيت.
  6. تُكتب روشتة لكل من الزوجة (forhusband=0) والزوج (forhusband=1) في infertilitysheetdrugs من كتالوج drugs، مع إمكانية عرض الروشتات السابقة بالتاريخ وتعديلها وطباعتها (قالب طباعة مشترك مع موديول النساء).
  7. تُطلب التحاليل من كتالوج invests المصنّف بـinvestcats وتُحفظ في infertilitysheetinvest لكل من الزوجين، وتُسجَّل النتائج لاحقاً في حقل investresult وتُطبع.
  8. تكمل المتابعة في جداول الفحوصات المتقدمة المرتبطة بالشيت نفسه (سائل منوي، هرمونات، موجات صوتية، مناظير، متابعة تبويض، حقن مجهري) — وهي ضمن موديولات أخرى لكنها كلها تُفتح بمفتاح infertilitysheetid.
  9. الشاشة القديمة (infertility.php) ما زالت متاحة كملف سريع: تُنشئ سجل infertility مع صفوف أولية للتشخيص وآخر دورة والفحص والتحاليل والملاحظات، وتدار صفوفها بنفس أسلوب الإضافة/التعديل/الحذف الناعم.
  10. الزيجات السابقة للزوجين تُسجَّل من شاشة بيانات المريضة (موديول المرضى) وتظهر في ترويسة كل الشاشات حسب إعداد programesetting.previous_marriage.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🔬

الحقن المجهري وأطفال الأنابيب (IVF/ICSI/IUI) (IVF / ICSI / IUI & Cycle Monitoring)

يغطي هذا الموديول الرحلة العلاجية الكاملة لمحاولات الإخصاب المساعد: ورقة الـ IVF/ICSI النشطة لكل مريضة (بروتوكول التنشيط، متابعة التحفيز اليومي للمبايض، سحب البويضات OPU، تحليل السائل المنوي، نقل الأجنة الطازج والمجمد، تحضير بطانة الرحم للأجنة المجمدة، والنتيجة النهائية)، إضافة إلى «ورقة المتابعة» (Monitoring Sheet) المستقلة لمتابعة دورات التنشيط بالزيارات اليومية (HMG، سمك البطانة، حويصلات المبيضين، E2)، مع وصفات وتحاليل خاصة بالزوجة والزوج، وأرشفة المحاولات السابقة، وتقارير إحصائية لنتائج الـ IVF وتقرير يومي لحالات الـ IUI.

24جدول
5كنترولر
15علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
ivfsheetالورقة الرئيسية لمحاولة IVF/ICSI النشطة: تقييم، TOO، OPU، سائل منوي، إخصاب، نقل طازج ومجمد، نتائج (حمل كيميائي/كيس حمل/ولادة)patientid, endpreg, anamh, annn, anprotocol, lmpfresh, lmpfrozen, toocd, opun, opumll, fefn, ettn, frren, etn, outcomehsgn, frozenor, bmi, historytodaypatients عبر patientid، icsiprotocol عبر anprotocol، icsisemen عبر sseemmen، pla2cen عبر pla2cen، antype عبر antype
ovstشبكة متابعة تنشيط المبايض: صف لكل زيارة بقيم الحويصلات حسب القطر (10–20 مم) والبطانة وE2ivfsheetid, ovstcdfh, ovstdate, ovstag, ovsthmg, ovstfrovstffffff (أعمدة الحويصلات), eovst, eeovst, noteovstivfsheet عبر ivfsheetid
eprepتحضير بطانة الرحم لدورات النقل المجمد: LMP، العلاج، سمك البطانة، الإذابة والنقلivfsheetid, epreplps, eprepcd, lmpfrozen, eprepttt, eprepe, eprepro, epreplo, thawingdate, thawingstn, thawingen, eprepcancelivfsheet عبر ivfsheetid، epreplps عبر epreplps
epreplpsقائمة منسدلة لأنظمة الدعم الأصفري (LPS) في تحضير البطانة — تُدار من الشاشة (فارغة في النسخة الاحتياطية)title, delتُرجع من eprep عبر epreplps
icsiالسجل التاريخي الملخّص لمحاولات ICSI المنتهية (يُولَّد آلياً عند الأرشفة) ويُعرض في ورقة العقم — قيم نصية منسوخة وليست مفاتيحinfertilitysheetid, date, icsiprotocol, icsiplace, icsisemen, opu, fert, et, fr, refr, icsiss, icsiresult, vd, e2d2infertilitysheet عبر infertilitysheetid، sefo عبر sefoid (استنتاج)
icsiplaceقائمة منسدلة لأماكن إجراء الـ ICSI (مراكز/معامل)title, delتُستخدم نصاً في icsi وتُعرض في تقارير ورقة العقم
icsiprotocolقائمة منسدلة لبروتوكولات التنشيط (Long/Short/Antagonist…)title, delivfsheet عبر anprotocol
icsiresultقائمة منسدلة لنتائج محاولة الـ ICSItitle, delتُستخدم نصاً في icsi.icsiresult
icsisemenقائمة منسدلة لمصدر/حالة العينة المنوية المستخدمةtitle, delivfsheet عبر sseemmen
icsissقائمة منسدلة مساندة لبيانات اختبار الحمل/متابعة ما بعد النقل (تُخزَّن قيمتها في icsi.icsiss)title, delتُستخدم نصاً في icsi.icsiss
mointoringsheetرأس ورقة متابعة دورة التنشيط: المحاولة، الإجراء، البروتوكول، مصدر العينة، أدوية التحفيز، نتائج OPU/ET/Cryo والمحصلةpatientid, doctorid, monitordate, lmp, attempno, procedure, protocol, ejac, pesa, tese, sryo, hmg, agonist, hcg, oocytestotal, ettotal, cyroday, p4, outcome, statuspatients عبر patientid، awusers عبر doctorid، وجداول القوائم التسعة عبر أعمدتها
mointoringsheetvisitsالزيارات اليومية داخل ورقة المتابعة: يوم الدورة، HMG، البطانة، حويصلات يمين/يسار، E2mointoringsheetid, visitdate, cycleday, hmg, endo, follicright, follicleft, e2mointoringsheet عبر mointoringsheetid
mointoringsheetdrugsالوصفات الدوائية داخل المتابعة للزوجة أو الزوج مع ربط اختياري بإيصالات الصيدليةpatientid, date, drugid, drugdos, forhusband, doctorid, recepittmpid, recepitdrugid, mointoringsheetidpatients عبر patientid، drugs عبر drugid، mointoringsheet عبر mointoringsheetid
mointoringsheetinvestigationالتحاليل المطلوبة داخل المتابعة للزوجة أو الزوج مع النتيجةpatientid, date, investid, investresult, forhusband, doctorid, mointoringsheetidinvests عبر investid، patients عبر patientid، mointoringsheet عبر mointoringsheetid
mointoringsheetprocedureقائمة منسدلة لنوع الإجراء (IVF/ICSI/IUI…)name, deletedmointoringsheet عبر procedure
mointoringsheetprotocolقائمة منسدلة لبروتوكول التنشيط في ورقة المتابعةname, deletedmointoringsheet عبر protocol
mointoringsheetejacقائمة منسدلة لحالة العينة بالقذف (Ejaculate)name, deletedmointoringsheet عبر ejac
mointoringsheetpesaقائمة منسدلة لخيارات سحب الحيوانات المنوية PESAname, deletedmointoringsheet عبر pesa
mointoringsheetteseقائمة منسدلة لخيارات استخراج الحيوانات المنوية TESEname, deletedmointoringsheet عبر tese
mointoringsheetsryoقائمة منسدلة لخيارات العينات المجمدة (Cryo — مكتوبة sryo)name, deletedmointoringsheet عبر sryo
mointoringsheethmgقائمة منسدلة لأدوية الـ HMG (الجونادوتروبين)name, deletedmointoringsheet عبر hmg
mointoringsheetagonistقائمة منسدلة لأدوية الـ Agonist/Antagonistname, deletedmointoringsheet عبر agonist
mointoringsheethcgقائمة منسدلة لأدوية إبرة التفجير HCGname, deletedmointoringsheet عبر hcg
folliculomمتابعة التبويض البسيطة (Folliculometry) داخل ورقة العقم: قياس الحويصلات والبطانة والتفجير والنتيجةinfertilitysheetid, lmp, ttt, cd, date, ro, lo, endo, pelvis, too, resultinfertilitysheet عبر infertilitysheetid

سير العمل (Workflow)

  1. يدخل الطبيب على المريضة من شاشة المرضى ويفتح «IVF Sheet» (ivfsheet.php?ac=index&patientid=…)؛ يبحث النظام عن ورقة نشطة (endpreg = 0) وإن لم توجد ينشئها فوراً، وينشئ معها infertilitysheet وgynasheet إن لم تكونا موجودتين، ويسجل الدخول في lastvisit.
  2. تُحفظ كل خانة في الشاشة لحظياً عبر AJAX (دالة Add() تستقبل اسم الجدول والعمود والقيمة وتحدّث مباشرة) — لا يوجد زر حفظ مركزي.
  3. يضيف الطبيب صفوف متابعة التنشيط بالزر «append» الذي ينشئ سجل ovst مرتبطاً بالورقة، ثم يُدخل يوم الدورة فيحسب النظام التاريخ آلياً من lmpfresh (دالتا ovstcdfh وnewcd)، ويُسجل Ag/HMG وعدّ الحويصلات حسب القطر والبطانة وE2.
  4. عند النضج تُسجل بيانات التفجير (TOO) ثم سحب البويضات (OPU) وبيانات السائل المنوي والإخصاب، ثم نقل الأجنة الطازج (وصفوف نقل إضافية في جدول sefo) أو التجميد.
  5. في دورات النقل المجمد تُضاف صفوف eprep لتحضير البطانة (LMP المجمد، العلاج، السمك، نظام LPS من قائمة epreplps) ثم بيانات الإذابة والنقل والنتيجة.
  6. عند انتهاء المحاولة يضغط الطبيب «إنهاء» محدداً النوع (fresh/frozen)؛ فتُؤرشف الورقة (endpreg = 1، frozenor، historytoday، نسخ bmi من آخر examination) ويُولَّد سطر/أسطر ملخصة في icsi بقيم نصية منسوخة من القوائم (البروتوكول، المكان، السائل المنوي) مرتبطة بـ infertilitysheetid لتظهر في تاريخ ورقة العقم.
  7. يمكن استعراض المحاولات المؤرشفة من ac=archive وفتح أي محاولة للقراءة من ac=historys.
  8. بالتوازي توجد شاشة «Monitoring Sheet» (monitoring.php): تُفتح ورقة متابعة مفتوحة واحدة لكل مريضة (status = 0) وتُنشأ تلقائياً، ويُختار الإجراء والبروتوكول ومصدر العينة وأدوية التحفيز من قوائم قابلة للإضافة الفورية (addNewItem) والتعديل (editselect).
  9. كل زيارة متابعة تُضاف بصف جديد (addNewVisit) بيوم دورة محسوب آلياً من monitordate، وتُحدَّث خاناته (HMG/Endo/حويصلات يمين-يسار/E2) لحظياً عبر update().
  10. من نفس الشاشة تُكتب وصفات للزوجة أو الزوج (mointoringsheetdrugs من كتالوج drugs) وتُطلب تحاليل (mointoringsheetinvestigation من كتالوج invests) مع شاشات عرض وطباعة بالتواريخ.
  11. بعد تسجيل نتائج OPU والأجنة والتجميد والمحصلة تُؤرشف الورقة (trigSheetstatus = 1)، وتُستعرض المحاولات السابقة من trials وتفاصيل كل محاولة من trialdetail عبر استعلام JOIN مع جداول القوائم التسعة.
  12. تقرير «IVF Statistics» يبحث في ivfsheet بفترة LMP (طازج أو مجمد) أو بالمريضة، ويحسب عمر الزوجة وقت المحاولة من patients.dateofbirth، ويعرض أول وآخر صف تنشيط وعدد دورات تحضير البطانة؛ وتقرير «IUI» يعرض حالات اليوم ويبحث بفترة على infertilitysheet.sheetdate وsheetresult مع الطباعة.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

👨‍🔬

تحاليل الزوج والسائل المنوي (Andrology & Semen Analysis)

يغطي هذا الموديول الجانب الذكوري من تقييم العقم في العيادة: تسجيل تحاليل السائل المنوي (العدد، الحركة، الأشكال الطبيعية، الحيوية... إلخ)، والفحوصات الأندرولوجية المتقدمة (الموجات فوق الصوتية على كيس الصفن، الخريطة الكروموسومية Karyotyping، حذف كروموسوم Y الدقيق، تفتت الحمض النووي للحيوانات المنوية SDF، عينة الخصية TESE)، إضافة إلى ملفات الهرمونات للزوج والزوجة. تُسجَّل البيانات من مسارين متوازيين: شاشة الفحوصات العامة للمريض (جدولا semen وhormon) وشيت العقم المفصّل (جداول semeninfertility وsemen2 وhormonalprofile/hormonalprofile2).

19جدول
7كنترولر
8علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
semenتحليل سائل منوي سريع لكل مريض من شاشة الفحوصات، مع تصنيف الحالة (Oligo/Astheno/Terato/Normal)sdate, patientid, count, motilitya, motilityab, normal, puscell, normaltype, oligo, astheno, tetrato, doctorid, delpatients عبر patientid، awusers عبر doctorid
semeninfertilityصفوف تحاليل السائل المنوي داخل شيت العقم (معايير WHO)infertilitysheetid, semenplace, sementype, date, nc, prm, tm, af, vit, vol, tzi, sdiinfertilitysheet عبر infertilitysheetid، semenplace عبر semenplace، sementype عبر sementype
semen2الفحوصات الأندرولوجية المتقدمة لكل شيت عقم: سونار الصفن، TRUE، Karyotype، Yq Micro، SDF، Semen Fr، TESE — تاريخ ومكان ونتيجة لكل فحص (جدول عريض)infertilitysheetid, detescrotal/placescrotal/semen2resultscrotal, detekaryo/semen2resultkaryo, deteyqmicro/semen2resultyqmicro, detesdf/semen2resultsdf, detetese/semen2placetese/resulttese, detesemenfr/semen2placesemenfr/resultsemenfraf/resultsemenfrm/resultsemenfrc, deteother/placeother/resultotherinfertilitysheet عبر infertilitysheetid، وسبعة جداول lookup عبر أعمدة semen2result* وsemen2place* (نتيجة السونار قيم متعددة مفصولة بفواصل)
semenplaceقائمة مرجعية: أماكن/معامل إجراء تحليل السائل المنوي (تُملأ من المستخدم — فارغة في النسخة)id, title, delتُقرأ من semeninfertility.semenplace
sementypeقائمة مرجعية: أنواع تحليل السائل المنويid, title, delتُقرأ من semeninfertility.sementype
semen2placesemenfrقائمة مرجعية: مكان إجراء فحص Semen Frid, title, delتُقرأ من semen2.semen2placesemenfr
semen2placeteseقائمة مرجعية: مكان إجراء عينة الخصية TESEid, title, delتُقرأ من semen2.semen2placetese
semen2resultkaryoقائمة مرجعية: نتائج الخريطة الكروموسومية Karyotypingid, title, delتُقرأ من semen2.semen2resultkaryo
semen2resultscrotalقائمة مرجعية: نتائج سونار كيس الصفن (اختيار متعدد)id, title, delتُقرأ من semen2.semen2resultscrotal (CSV)
semen2resultsdfقائمة مرجعية: نتائج فحص تفتت DNA الحيوانات المنوية SDFid, title, delتُقرأ من semen2.semen2resultsdf
semen2resulttrueقائمة مرجعية: نتائج فحص TRUE (استنتاج: TRUS سونار عبر المستقيم)id, title, delتُقرأ من semen2.semen2resulttrue
semen2resultyqmicroقائمة مرجعية: نتائج فحص حذف كروموسوم Y الدقيقid, title, delتُقرأ من semen2.semen2resultyqmicro
ssemenقائمة مرجعية لأول قائمة منسدلة بعمود "Semen" في جدول دورة IVF (اسم جدول مشوّه إملائيًا)id, title, delتُقرأ من ivfsheet.ssemen
sseemenقائمة مرجعية للقائمة الثانية بعمود "Semen" في شيت IVFid, title, delتُقرأ من ivfsheet.sseemen
sseemmenجدول يتيم غير مستخدم: العمود ivfsheet.sseemmen يقرأ خياراته فعليًا من جدول icsisemen وليس من هذا الجدولid, title, delلا توجد قراءة من الكود (مرشّح للحذف)
sseemmeenقائمة مرجعية للقائمة الرابعة بعمود "Semen" في شيت IVFid, title, delتُقرأ من ivfsheet.sseemmeen
hormonلوحة هرمونات معملية شاملة لكل مريض من شاشة الفحوصات، تشمل هرمونات الخصوبة ودلالات الأورامsdate, patientid, lh, fsh, prl, etwo, amh, freet, totalt, pfour, tsh, tthree, tfour, dht, bhcg, inhibinb, asd, dheas, ca125, cea, ldh, doctorid, delpatients عبر patientid، awusers عبر doctorid
hormonalprofileالملف الهرموني للزوج داخل شيت العقم: FSH، LH، TT، PRL، E2، Inhibin + خانتان إضافيتان (تاريخ/نتيجة لكل هرمون)infertilitysheetid, datefsh/resultfsh, datelh/resultlh, datett/resulttt, dateprl/resultprl, datee2/resulte2, dateinhibin/resultinhibin, dateother/resultotherinfertilitysheet عبر infertilitysheetid
hormonalprofile2الملف الهرموني الثاني بشيت العقم ويضم AMH وTSH وP4 (للزوجة — استنتاج)infertilitysheetid, date, dateamh/resultamh, datetsh/resulttsh, datefsh/resultfsh, datelh/resultlh, datee2/resulte2, datep4/resultp4, dateprl/resultprl, dateother/resultotherinfertilitysheet عبر infertilitysheetid

سير العمل (Workflow)

  1. يفتح الطبيب شاشة الفحوصات (investigation.php) لمريض محدد؛ إذا لم يوجد سجل سائل منوي، يُنشئ النظام تلقائيًا صفًا فارغًا في semen بتاريخ اليوم ومعرّف الطبيب الحالي.
  2. تُحرَّر القيم خانةً بخانة عبر AJAX (دالة update العامة التي تستقبل اسم الجدول والعمود والقيمة)، وتُضاف صفوف جديدة بزر "Add" (دالة addRow العامة لجداول semen وhormon وغيرها)، ويتم الحذف منطقيًا بوضع del = 1.
  3. في مسار العقم، يفتح الطبيب شيت العقم (infertilitysheet.php) فيُنشأ infertilitysheet تلقائيًا للمريض إن لم يوجد، وتُحمَّل صفوف semeninfertility وsemen2 وhormonalprofile وhormonalprofile2 المرتبطة به.
  4. يضيف الطبيب صف تحليل سائل منوي أو فحص أندرولوجي أو ملف هرموني بالنقر على رابط الإضافة (دالة append العامة التي تُنشئ صفًا بربط infertilitysheetid)، ثم يملأ الخلايا التي تُحفظ فورًا حقلًا بحقل.
  5. عند اختيار مكان التحليل أو نتيجته، تُحمَّل الخيارات من جداول الـ lookup عبر AJAX، ويمكن للطبيب إضافة قيمة جديدة فورًا (دالة getselectajax تُدخل سطرًا جديدًا في جدول الـ lookup المعني)؛ نتيجة سونار الصفن تُحفظ كقائمة معرّفات مفصولة بفواصل.
  6. في شيت أطفال الأنابيب (ivfsheet.php) يسجّل الطبيب خصائص العينة المنوية المستخدمة في الدورة من أربع قوائم منسدلة تُخزَّن قيمها في أعمدة ssemen/sseemen/sseemmen/sseemmeen بجدول ivfsheet.
  7. عند المراجعة أو الطباعة، يعرض كنترولر sh.php الشيت كاملًا للقراءة: يجلب صفوف السائل المنوي والفحوصات الأندرولوجية والملفات الهرمونية ويفك ترميز كل القوائم المرجعية إلى نصوصها، ويسجّل آخر زيارة للمريض في lastvisit.
  8. تظهر بيانات الموديول أيضًا في التقارير المجمعة (completereport.php وfullreport.php وغيرها) ضمن التقرير الشامل للمريضة.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🩻

الموجات الصوتية والأشعة (Ultrasound & Imaging)

يغطي هذا الموديول كافة أنشطة التصوير التشخيصي بالعيادة: تقارير الموجات الصوتية للحمل (مسح تشريحي وقياسات حيوية لكل جنين على حدة)، وتقارير الموجات الصوتية النسائية، والموجات المهبلية (TVS) والدوبلر و(SIS) داخل ملف العقم، وأشعة الصبغة على الرحم (HSG)، ونتائج الرنين المغناطيسي والأشعة المقطعية، وقوائم حجز فحص الـ 4D المرتبطة بملف متابعة الحمل، إضافة إلى أرشيف الصور والفيديوهات المرفوعة لكل مريضة، وأداة الرسم التوضيحي التفاعلي (GT Image) لوضع علامات على مخطط تشريحي.

32جدول
5كنترولر
20علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
ultrasoundرأس تقرير الموجات الصوتية للحمل (النسخة القديمة)patientid, edate, stype, based, babyno, sid, indication, gage, done, delpatients عبر patientid، awusers (فني الموجات) عبر sid
ultrasounddetailتفاصيل كل جنين في التقرير القديم (مسح تشريحي + قياسات)ultrasoundid, heart, spine, kidney, gender, diameterm/p, headcm/p, abdominalm/p, lengthm/p, conclusion, weeksultrasound عبر ultrasoundid
ultrasoundobstرأس تقرير الموجات الصوتية للحمل (النسخة الأحدث)patientid, edate, stype, babyno, sid, indication, limit, donepatients عبر patientid، awusers عبر sid
ultrasoundobstdetailتفاصيل كل جنين (يشمل قياسات الثلث الأول CRL وNT)ultrasoundobstid, crownm/mc, nuchalm/c, diameterm/c, headcm/cc, flengthm/c, anomaly, gaestimatew/d, genderultrasoundobst عبر ultrasoundobstid
ultrasoundgynaتقرير الموجات الصوتية النسائي (سجل مسطح واحد)patientid, edate, etype, position, thickness, rtsize, ltsize, rtfolicles, pmass, rtarteries, conclusion, donepatients عبر patientid، awusers عبر sid
sonarأرشيف صور وفيديوهات الموجات المرفوعة (الملفات على القرص)patientid, sonardate, imagename, vediourl, originalname, notes, type (0 صورة / 1 فيديو), tempdeletepatients عبر patientid؛ ملفات في upload/sonar وupload/sonarvedio/1
tvsفحص TVS داخل ملف العقم (اختيارات متعددة كنص CSV)infertilitysheetid, tvsut, tvsro, tvslo, tvscx, tvspelvis, dtvsplace, comment, dateinfertilitysheet عبر infertilitysheetid؛ قوائم tvs* عبر معرفات CSV
tvscxقائمة مفردات: نتائج عنق الرحم في TVStitle, deltvs عبر tvscx (CSV)
tvsloقائمة مفردات: نتائج المبيض الأيسر في TVStitle, deltvs عبر tvslo (CSV)
tvspelvisقائمة مفردات: نتائج الحوض في TVStitle, deltvs عبر tvspelvis (CSV)
tvsroقائمة مفردات: نتائج المبيض الأيمن في TVStitle, deltvs عبر tvsro (CSV)
tvsutقائمة مفردات: نتائج الرحم في TVStitle, deltvs عبر tvsut (CSV)
dtvsفحص الدوبلر المهبلي داخل ملف العقمinfertilitysheetid, dtvsresult (CSV), dateinfertilitysheet عبر infertilitysheetid؛ dtvsresult عبر CSV
dtvsplaceقائمة مفردات: موضع الدوبلر المهبليtitle, deltvs عبر dtvsplace (CSV)
dtvsresultقائمة مفردات: نتيجة الدوبلر المهبليtitle, deldtvs عبر dtvsresult (CSV)
ustvسجل نتائج الموجات المهبلية من شاشة الفحوصات (نص حر)patientid (varchar!), sdate, uterus, radnexa, ladnexa, pelvis, notes, doctoridpatients عبر patientid، awusers عبر doctorid
usnقائمة مفردات: ملاحظة الموجات في زيارة متابعة الحمل (استنتاج)title, delancnewvisit عبر usn
usafقائمة مفردات: السائل الأمنيوسي بالموجات (استنتاج)title, delancnewvisit عبر usaf
usplaceقائمة مفردات: موضع المشيمة بالموجات (استنتاج)title, delancnewvisit عبر usplace
four_dقائمة مفردات: بنود خدمة فحص 4Dtitle, name, delop_4d_list عبر four_d (CSV)
op_4d_listقائمة حجز ومتابعة تنفيذ فحوص 4Dpatientid, ancsheetid, opdate, four_d (CSV), place, t1/t11/t12/t2/t21/t22, done, confirm, t1_userid, t2_useridpatients عبر patientid، ancsheet عبر ancsheetid، place عبر place، awusers عبر user_id
gtimageجلسة الرسم التوضيحي التفاعلي (صورة الأساس + التعليق)gdate, patientid, doctorid, pic, comment, programview, delpatients عبر patientid، awusers عبر doctorid
gtdetailالعلامات الموضوعة على الرسم (إحداثيات + تعليق)gtid, posx, posy, width, height, imgno, comment, delgtimage عبر gtid
mrictسجل نتائج الرنين المغناطيسي / الأشعة المقطعية (نص حر)patientid (varchar!), sdate, uterus, radnexa, ladnexa, pelvis, notes, doctoridpatients عبر patientid، awusers عبر doctorid
sisفحص SIS (موجات بمحلول ملحي) داخل ملف العقمinfertilitysheetid, sisresult (CSV), dateinfertilitysheet عبر infertilitysheetid؛ قائمة sisresult (موديول العقم) عبر CSV
hsgسجل نتائج أشعة الصبغة من شاشة الفحوصات (نص حر)patientid (varchar!), sdate, uterus, rtube, ltube, smear, notes, doctoridpatients عبر patientid، awusers عبر doctorid
hsginfertilityفحص HSG داخل ملف العقم (اختيارات من قوائم)infertilitysheetid, hsgut, hsgplace, hsgrt (CSV), hsglt (CSV), hsgpelvis, dateinfertilitysheet عبر infertilitysheetid؛ قوائم hsg*
hsgltقائمة مفردات: الأنبوب الأيسر في HSGtitle, delhsginfertility عبر hsglt (CSV)
hsgpelvisقائمة مفردات: الحوض في HSGtitle, delhsginfertility عبر hsgpelvis
hsgplaceقائمة مفردات: مكان إجراء HSGtitle, delhsginfertility عبر hsgplace
hsgrtقائمة مفردات: الأنبوب الأيمن في HSGtitle, delhsginfertility عبر hsgrt (CSV)
hsgutقائمة مفردات: الرحم في HSGtitle, delhsginfertility عبر hsgut

سير العمل (Workflow)

  1. يفتح الطبيب أو فني الموجات شاشة التقرير من ملف المريضة؛ إذا لم يوجد تقرير مفتوح يُنشأ تلقائياً سجل رأس جديد (ultrasound أو ultrasoundobst أو ultrasoundgyna) بتاريخ اليوم مع سطر تفاصيل افتراضي لجنين واحد.
  2. تُملأ بيانات الفحص حقلاً بحقل (نوع الفحص، دواعي الإجراء، فني الموجات من مستخدمي النظام ذوي الوظيفة 4) ويُحفظ كل حقل فور تعديله عبر AJAX.
  3. في حالة الحمل المتعدد يضيف المستخدم سطر تفاصيل لكل جنين، ويستكمل المسح التشريحي (أكواد عددية) والقياسات الحيوية، وعند حذف جنين يُخفض عداد babyno.
  4. عند الطباعة يُعتمد التقرير نهائياً (done = 1) ويظهر بعدها في قائمة التقارير المنجزة للمريضة، مع إمكانية الحذف المنطقي (del = 1).
  5. من شاشة الفحوصات (investigation.php) تُنشأ تلقائياً سجلات فارغة لـ hsg وustv وmrict عند أول فتح، وتُسجل النتائج نصياً مع تاريخ الفحص واسم الطبيب.
  6. داخل ملف العقم تُسجل فحوص TVS والدوبلر وSIS وHSG كصفوف مرتبطة بـ infertilitysheetid، وتُختار النتائج من قوائم المفردات وتُخزن كمعرفات مفصولة بفواصل، وتظهر مجمعة في التقارير الشاملة (sh.php، Completesreport.php).
  7. عند إدخال تاريخ الولادة المتوقع في ملف متابعة الحمل يُنشأ تلقائياً حجز 4D في op_4d_list ويُربط بالملف عبر ancsheet.4d_list_id؛ ويدير قسم العمليات قائمة الحجوزات (الخدمات، المكان، علامات تنفيذ الفحص الأول والثاني والتأكيد).
  8. تُرفع صور الفحص دفعة واحدة إلى upload/sonar بأسماء عشوائية (md5) والفيديوهات إلى upload/sonarvedio/1 مع حفظ الاسم الأصلي، وتُعرض في معرض زمني لكل مريضة مع الطباعة والتنزيل، والحذف منطقي فقط (tempdelete).
  9. في أداة GT Image يُنشأ سجل جلسة جديد عند كل دخول، ويسحب المستخدم علامات مرقمة على الصورة التشريحية وتُحفظ إحداثياتها وتعليقاتها في gtdetail.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🔭

المناظير (لاباروسكوبي/هيستيروسكوبي) (Laparoscopy & Hysteroscopy)

موديول توثيق عمليات المناظير النسائية: منظار البطن (Laparoscopy) لفحص الرحم والأنابيب والمبايض والحوض، ومنظار الرحم (Hysteroscopy) لفحص عنق الرحم وتجويف الرحم وفتحتي الأنابيب. يعمل الموديول بنمطين متوازيين: نمط حر نصّي داخل شاشة الفحوصات (Investigations) لأي مريضة، ونمط منظّم بقوائم اختيار قابلة للتوسيع داخل شيت العقم (Infertility Sheet) يسجّل النتائج لكل عضو على حدة مع التدخل الجراحي والتكلفة، وتُستخدم البيانات في تقارير العمليات والتقارير الشاملة للمريضة.

30جدول
12كنترولر
6علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
laparoscopyتقرير منظار بطن نصّي حر لكل مريضة (شاشة الفحوصات)sdate, patientid, uterus, radnexa, ladnexa, pelvis, notes, doctorid, delpatients عبر patientid، awusers عبر doctorid
hysteroscopyتقرير منظار رحم نصّي حر لكل مريضة (شاشة الفحوصات)sdate, patientid, cervix, uterine, rostium, lostium, notes, doctorid, delpatients عبر patientid، awusers عبر doctorid
laparoscopyinfertilityسجل منظار بطن منظّم داخل شيت العقم: نتائج وتدخل لكل عضو + التكلفةinfertilitysheetid, date, laparplace, laparul, laparrt, laparlt, laparro, laparlo, laparpelvis, laparmut, laparmrt, laparmlt, laparmro, laparmlo, laparmpelvis, lapintervention, coastinfertilitysheet عبر infertilitysheetid، وجداول lapar* عبر معرّفات CSV
hysteroscopyinfertilityسجل منظار رحم منظّم داخل شيت العقم: نتائج وإدارة علاجية + التكلفةinfertilitysheetid, date, copyplace, copydil, copyintrod, copycx, copycavity, copyrostium, copylostium, copymcx, copymcavity, copymrostium, copymlostium, hysintervention, coastinfertilitysheet عبر infertilitysheetid، وجداول copy* عبر معرّفات CSV
laparplaceقائمة أماكن إجراء منظار البطن (مستشفى/مركز)id, title, delتُرجَع من laparoscopyinfertility.laparplace
laparulقائمة نتائج الرحم (UT) في منظار البطنid, title, delتُرجَع من laparoscopyinfertility.laparul (CSV)
laparrtقائمة نتائج الأنبوب الأيمن (RT)id, title, delتُرجَع من laparoscopyinfertility.laparrt (CSV)
laparltقائمة نتائج الأنبوب الأيسر (LT)id, title, delتُرجَع من laparoscopyinfertility.laparlt (CSV)
laparroقائمة نتائج المبيض الأيمن (RO)id, title, delتُرجَع من laparoscopyinfertility.laparro (CSV)
laparloقائمة نتائج المبيض الأيسر (LO)id, title, delتُرجَع من laparoscopyinfertility.laparlo (CSV)
laparpelvisقائمة نتائج الحوض في منظار البطنid, title, delتُرجَع من laparoscopyinfertility.laparpelvis (CSV)
laparmutقائمة التدخلات/الإدارة العلاجية للرحم (Management UT)id, title, delتُرجَع من laparoscopyinfertility.laparmut (CSV)
laparmrtقائمة تدخلات الأنبوب الأيمن (Management RT)id, title, delتُرجَع من laparoscopyinfertility.laparmrt (CSV)
laparmltقائمة تدخلات الأنبوب الأيسر (Management LT)id, title, delتُرجَع من laparoscopyinfertility.laparmlt (CSV)
laparmroقائمة تدخلات المبيض الأيمن (Management RO)id, title, delتُرجَع من laparoscopyinfertility.laparmro (CSV)
laparmloقائمة تدخلات المبيض الأيسر (Management LO)id, title, delتُرجَع من laparoscopyinfertility.laparmlo (CSV)
laparmpelvisقائمة تدخلات الحوض (Management Pelvis)id, title, delتُرجَع من laparoscopyinfertility.laparmpelvis (CSV)
copyplaceقائمة أماكن إجراء منظار الرحمid, title, delتُرجَع من hysteroscopyinfertility.copyplace
copydilقائمة نتائج توسيع عنق الرحم (Dilatation)id, title, delتُرجَع من hysteroscopyinfertility.copydil
copyintrodقائمة نتائج إدخال المنظار (Introduction)id, title, delتُرجَع من hysteroscopyinfertility.copyintrod
copycxقائمة نتائج عنق الرحم (Cervix) في منظار الرحمid, title, delتُرجَع من hysteroscopyinfertility.copycx (CSV)
copycavityقائمة نتائج التجويف الرحمي والقاع (Cavity-Fundus)id, title, delتُرجَع من hysteroscopyinfertility.copycavity (CSV)
copyrostiumقائمة نتائج فتحة الأنبوب اليمنى (R-Ostium)id, title, delتُرجَع من hysteroscopyinfertility.copyrostium
copylostiumقائمة نتائج فتحة الأنبوب اليسرى (L-Ostium)id, title, delتُرجَع من hysteroscopyinfertility.copylostium
copymcxقائمة الإدارة العلاجية لعنق الرحم (Management Cervix)id, title, delتُرجَع من hysteroscopyinfertility.copymcx (CSV)
copymcavityقائمة الإدارة العلاجية للتجويف الرحميid, title, delتُرجَع من hysteroscopyinfertility.copymcavity (CSV)
copymrostiumقائمة الإدارة العلاجية للفتحة اليمنىid, title, delتُرجَع من hysteroscopyinfertility.copymrostium (CSV)
copymlostiumقائمة الإدارة العلاجية للفتحة اليسرىid, title, delتُرجَع من hysteroscopyinfertility.copymlostium (CSV)
jncisionقائمة أنواع الشق الجراحي (midline / transverse / paramedian / Pfannenstiel)id, name, delأب لـ midlinejncision؛ تُستخدم في operativedetails عبر jncisionid
midlinejncisionقائمة الأنواع الفرعية للشق التابعة لكل نوع رئيسي (upper / lower / joel cohen...)id, name, jncisionid, deljncision عبر jncisionid؛ operativedetails عبر midlineid

سير العمل (Workflow)

  1. المسار الأول (شاشة الفحوصات – investigation.php): عند فتح ملف فحوصات المريضة، إن لم يوجد سجل منظار سابق يُنشأ تلقائيًا سجل فارغ في laparoscopy وآخر في hysteroscopy بتاريخ اليوم ومعرّف الطبيب الحالي.
  2. يدوّن الطبيب النتائج نصيًا في تبويبي LAPAROSCOPY وHYSTEROSCOPY، ويُحفظ كل حقل فور تعديله عبر AJAX (updateElement → أكشن update)، مع إمكانية إضافة سجلات بتواريخ جديدة أو حذف سجل (حذف منطقي del=1).
  3. المسار الثاني (شيت العقم – infertilitysheet.php): من قسم Investigations في الشيت يضغط الطبيب «Hysteroscopy» أو «Laparoscopy» فيُنشأ صف جديد عبر أكشن append مربوط بـinfertilitysheetid وبتاريخ اليوم.
  4. يختار الطبيب النتائج لكل عضو من قوائم منسدلة (بعضها متعدد الاختيار)، وتُحمَّل القوائم من جداول lapar*/copy* عبر getselect، ويمكنه إضافة مصطلح جديد للقائمة فورًا عبر getselectajax أو حذف مصطلح عبر deldataselect.
  5. في الصف الثاني لكل منظار يسجّل الطبيب التدخل الجراحي النصّي (lapintervention/hysintervention) والإدارة العلاجية لكل عضو (قوائم laparm*/copym*) والتكلفة (coast).
  6. شاشة العمليات (operations.php) تعرض مناظير اليوم أو نتائج بحث بفترة/مريضة، بالربط بين laparoscopyinfertility/hysteroscopyinfertility وجدول infertilitysheet لجلب بيانات المريضة، وتسجّل آخر زيارة في lastvisit.
  7. عند الطباعة أو التقارير: sh.php وCompletesreport.php يفكّان معرّفات CSV إلى نصوصها من جداول القوائم، وcompletereport.php يضم سجلات المناظير الحرة (غير الفارغة فقط) مع اسم الطبيب من awusers، وfullreport.php يفحص وجود مناظير في الفترة المطلوبة.
  8. في موديول تفاصيل العمليات (operativedetails.php) تُستخدم قائمتا jncision وmidlinejncision كقائمتين متسلسلتين (اختيار نوع الشق يحمّل أنواعه الفرعية عبر loadjncision)، مع إمكانية إضافة أنواع جديدة من الشاشة نفسها.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🏥

العمليات والولادات (Operations & Deliveries)

يغطي هذا الموديول الدورة الجراحية الكاملة في العيادة: حجز العمليات عبر قائمة انتظار يومية، وتسجيل المذكرة الجراحية التفصيلية (Operative Note) لكل مريضة شاملة التخدير ونوع الشق الجراحي والفريق الطبي والأدوية المستخدمة أثناء العملية مع ربطها بالصيدلية للصرف والمحاسبة، بالإضافة إلى تقارير يومية للعمليات والولادات ونتائج الباثولوجيا والأنسجة (Histopathology)، وخطابات التحويل إلى المستشفيات، وتقرير إنهاء الحمل (الولادة الطبيعية / القيصرية / الإجهاض).

14جدول
4كنترولر
15علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
operationقائمة مرجعية بأسماء العمليات الجراحية (تُستخدم في قائمة الانتظار والمذكرة الجراحية)id, title, name, delتُشار إليها من op_wait_list.operation وoperativedetails.operationid وoperations.operation
operationidsجدول ربط قديم بين العملية والطبيب والمساعد — غير مستخدم في الكود الحالي (استنتاج: جدول مهجور)doctorid, assistantid, operationidawusers عبر doctorid/assistantid و operation عبر operationid (استنتاج)
operationsسجل العمليات الموجزة المرتبط بشيت العقم (التاريخ، المكان، نتيجة الأنسجة، التكلفة)infertilitysheetid, operation (قائمة IDs مفصولة بفواصل), date, place, histopath (CSV), cost, noteinfertilitysheet عبر infertilitysheetid، operation و histopath و place عبر القيم المخزنة
operativedetailsالمذكرة الجراحية التفصيلية الكاملة لكل عملية (الجدول المحوري في الموديول)patientid, operationid, date, timestart, timeend, indication, anasthesaid, generalid, anasthetstsid, assistantid, jncisionid, midlineid, peritonealwash, opsteps, layers, drains, suture, bloodtransfusion, complications, recommendation, delpatients عبر patientid، operation عبر operationid، anasthesa عبر anasthesaid، generalanasthesa عبر generalid، jncision/midlinejncision عبر jncisionid/midlineid، awusers عبر حقول الفريق (CSV)
operativedetailsdrugsأدوية العملية المعطاة أثناء الجراحة مع ربطها بروشتة الصيدليةoperationid, drugid, drugtype, drugdos, drugname, doctorid, recepittmpid, recepitdrugid, deletedoperativedetails عبر operationid، drugs عبر drugid، recepittmp عبر recepittmpid، receiptdrugs عبر recepitdrugid، awusers عبر doctorid
op_wait_listقائمة انتظار/حجز العمليات اليوميةpatientid, opdate, operation (CSV), place, notes, deleted, user_id, createdatepatients عبر patientid، place عبر place، operation عبر القائمة المخزنة، awusers عبر user_id
anasthesaقائمة مرجعية لأنواع التخدير الرئيسيةid, name, delتُشار إليها من operativedetails.anasthesaid وgeneralanasthesa.anasthesaid
generalanasthesaالأنواع الفرعية للتخدير (قائمة متسلسلة تابعة لنوع التخدير الرئيسي)id, name, anasthesaid, delanasthesa عبر anasthesaid، وتُشار إليها من operativedetails.generalid
hospitalnamesقائمة مرجعية بأسماء المستشفيات لخطابات التحويلid, nameتُستخدم في شاشة التحويل instruction.php (اختيار بالمعرّف دون تخزين دائم)
histopathقائمة مرجعية لنتائج فحص الأنسجة (Histopathology)id, title, delتُشار إليها من operations.histopath (قائمة IDs مفصولة بفواصل)
pathologyنتائج الباثولوجيا للمريضة (خلايا وأنسجة) تُسجل من شاشة الفحوصاتsdate, patientid, cytology, histopathology, doctorid, delpatients عبر patientid، awusers عبر doctorid
detectionsكتالوج أنواع الكشوفات/الخدمات وأسعارها (يُستخدم هنا لتسعير زيارة سونار 4D عند الإرسال لقائمة الزيارات)id, title, detectionval, delتُشار إليها من visits.detectionid؛ معرّف الخدمة 36 ثابت في الكود لرسوم 4D
placeقائمة مرجعية لأماكن إجراء العملياتid, title, delتُشار إليها من op_wait_list.place وoperations.place
place2قائمة مرجعية لأماكن الولادة (مكررة وظيفيًا مع place)id, title, delتُشار إليها من registeration.place2 في تقرير الولادات

سير العمل (Workflow)

  1. تُضاف المريضة إلى قائمة انتظار العمليات من شاشة operations.php?ac=waiting_list: يُحدد تاريخ العملية ونوع/أنواع العملية (تُخزن كمعرّفات مفصولة بفواصل في op_wait_list.operation) ومكان الإجراء من place مع الملاحظات، ويُسجل المستخدم وتاريخ الإدخال.
  2. تُعرض قائمة الانتظار مجمعة باليوم (بأسماء الأيام العربية) خلال فترة محددة، أو قائمة العمليات المستقبلية لمريضة بعينها، مع إمكانية التعديل أو الحذف المنطقي (deleted = 1).
  3. يوم العملية تُفتح شاشة المذكرة الجراحية operativedetails.php?ac=showdata للمريضة؛ يُنشئ النظام سجلًا فارغًا في operativedetails فور فتح الشاشة، ثم تُحفظ كل خانة عبر AJAX حقلًا بحقل (نمط Inline Edit).
  4. يُختار نوع التخدير من anasthesa فتُحمَّل الأنواع الفرعية من generalanasthesa ديناميكيًا، وكذلك نوع الشق الجراحي من jncision ثم نوعه الفرعي من midlinejncision، ويُختار أطباء التخدير والمساعدون من مستخدمي النظام (awusers) حسب الدور والتخصص.
  5. تُضاف أدوية العملية صفًا صفًا في operativedetailsdrugs؛ عند اختيار الدواء يُنشئ النظام تلقائيًا روشتة مؤقتة (recepittmp) وبنود صرف (receiptdrugs) في موديول الصيدلية، فإذا كانت الروشتة محصّلة (status=1) تُفتح روشتة جديدة.
  6. تظهر العمليات الموجزة المسجلة في شيت العقم (operations المرتبط بـ infertilitysheet) في تقرير العمليات اليومي مع المنظار الرحمي والبطني، ويُبحث فيها بالفترة أو المريضة وتُطبع.
  7. تقرير الولادات (Deliveries.php) يعرض ولادات اليوم من سجل awifep مع طريقة الولادة وبيانات التسجيل ومكان الولادة من place2، مع البحث والطباعة.
  8. تقرير الإنهاء (termination.php) يستعلم عن سجل الولادات السابقة phobstetric حسب نوع إنهاء الحمل المختار ويعرض بيانات المريضات.
  9. عند الحاجة لتحويل المريضة لمستشفى تُستخدم شاشة التحويل في instruction.php: اختيار المستشفى من hospitalnames وتعليمات العملية، ويُطبع خطاب يتضمن الصيغة التوليدية المحسوبة من سجلات الولادة.
  10. تُسجل نتيجة الباثولوجيا بعد العملية في جدول pathology من شاشة الفحوصات (investigation.php) بتاريخ وطبيب.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🩺

الفحص الإكلينيكي والتشخيص (Clinical Examination & Diagnosis)

يغطي هذا الموديول تسجيل الفحص العام للمريضة (الوزن، الطول، مؤشر كتلة الجسم، ضغط الدم، النبض، سكر الدم العشوائي) مع نتائج الفحص لكل جهاز من أجهزة الجسم (الرأس والرقبة، الصدر والقلب، البطن، الحوض، الأطراف)، بالإضافة إلى قوائم نتائج الفحص الموضعي والعام (الثدي، الشعرانية، الغدة الدرقية)، ومحرك أسئلة وأجوبة قابل للتهيئة للتاريخ المرضي الحالي (Present History)، وكتالوجَي التشخيصات لعيادتي النساء ومتابعة الحمل.

15جدول
2كنترولر
9علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
examinationسجل الفحص العام للمريضة (علامات حيوية + ملخص فحص الأجهزة)patientid, doctorid, examinationdate, weight, height, bmi, b_p, bp2, pulse, rgb, headandneck, chestandheart, abdomen, pelvis, extremitis, delpatients عبر patientid، awusers عبر doctorid
examinationheadقائمة نتائج فحص الرأس والرقبةid, name, delexamination عبر headandneck (استنتاج: يُخزن المعرف أو النص)
examinationchestقائمة نتائج فحص الصدر والقلبid, name, delexamination عبر chestandheart
examinationabdomenقائمة نتائج فحص البطنid, name, delexamination عبر abdomen
examinationpelvisقائمة نتائج فحص الحوضid, name, delexamination عبر pelvis
examinationextremitisقائمة نتائج فحص الأطرافid, name, delexamination عبر extremitis
examinationlocalseقائمة نتائج الفحص الموضعي (النسائي) — اختيار متعددid, title, delinfertilitysheet عبر examinationlocalse (قائمة معرفات بفواصل)
generalbreastقائمة نتائج فحص الثدي — اختيار متعددid, title, delinfertilitysheet عبر generalbreast (قائمة معرفات بفواصل)
generalhirsutismقائمة درجات الشعرانية (Hirsutism)id, title, delinfertilitysheet عبر generalhirsutism
generalthyroidقائمة نتائج فحص الغدة الدرقيةid, title, delinfertilitysheet عبر generalthyroid
generalanasthesaتفاصيل/أنواع فرعية للتخدير العام تابعة لنوع التخدير الرئيسيid, name, anasthesaid, delanasthesa عبر anasthesaid، operativedetails عبر anasthesaid (موديول العمليات)
diagnosisكتالوج تشخيصات زيارات النساء (الجيناكولوجي)id, name, conditions (يُستخدم كحذف منطقي), title, delgyna عبر diagnosisid (قائمة معرفات بفواصل)
diagnosisantكتالوج تشخيصات زيارات متابعة الحمل (Antenatal)id, name, conditions (حذف منطقي)antenalvisit عبر diagnosisid (قائمة معرفات بفواصل)
presenthistoryquestionsبنك أسئلة التاريخ المرضي الحالي (فئات)id, name, displayorder, deletedpresenthistoryanswers عبر presenthistorycatid، gynaph عبر catid
presenthistoryanswersالإجابات المعرفة مسبقًا لكل سؤال تاريخ مرضيid, presenthistorycatid, name, favorite, deletedpresenthistoryquestions عبر presenthistorycatid، gynaph عبر answerid

سير العمل (Workflow)

  1. يفتح الطبيب ملف المريضة ثم تبويب الفحص (examination.php?ac=index)؛ تُعرض جميع سجلات الفحص السابقة (غير المحذوفة) مرتبة بالتاريخ تنازليًا مع اسم الطبيب لكل سجل.
  2. تقرأ الشاشة إعدادات programesetting؛ فإذا كان علم الجهاز (رأس/صدر/بطن/حوض/أطراف) لا يساوي 1 تُحمَّل قائمته المنسدلة من جدول اللوكب المقابل، وإلا يظهر حقل نص حر.
  3. عند الضغط على "إضافة" يُنشأ صف فحص فارغ فورًا في قاعدة البيانات (addNewRow) بتاريخ اليوم ومعرف الطبيب من الجلسة، ويُعاد جزء HTML للصف الجديد.
  4. تُحفظ كل خلية (وزن، طول، ضغط، نبض، نتيجة كل جهاز...) تلقائيًا عند مغادرتها عبر دالة update العامة التي تستقبل اسم الجدول والعمود والقيمة من الواجهة، ويُحسب الـ BMI تلقائيًا في المتصفح.
  5. يمكن إضافة قيمة جديدة لأي قائمة نتائج أثناء الفحص (addexitem)؛ تُدرج في جدول اللوكب ثم يُحدَّث عمود سجل الفحص بمعرف القيمة الجديدة.
  6. الحذف يتم منطقيًا بوضع del = 1 (delData).
  7. في شاشة الإعداد addpresenthistory.php يُدير المسؤول أسئلة التاريخ المرضي الحالي وإجاباتها: إضافة سؤال (يأخذ ترتيب عرض تاليًا تلقائيًا)، إضافة إجابات لكل سؤال، تمييز مفضلة، وحذف منطقي.
  8. أثناء زيارة الجيناكولوجي (كنترولر gyna.php) تُعرض الأسئلة في أعمدة حسب displayorder (مجموعات 1-3، 4-6، 7-9، 10-12، أكبر من 12، وصفر = أخرى)، وتُحفظ الإجابات المختارة لكل تاريخ في جدول gynaph مع معرف المريضة والطبيب، مع إمكانية الطباعة والحذف حسب التاريخ.
  9. في زيارة النساء يختار الطبيب تشخيصات متعددة من كتالوج diagnosis فتُخزن معرفاتها كنص مفصول بفواصل في gyna.diagnosisid؛ وبنفس الآلية تُخزن تشخيصات diagnosisant في antenalvisit.diagnosisid لزيارات الحمل، مع إمكانية إضافة تشخيص جديد للكتالوج أثناء الزيارة.
  10. في شيتات العقم والجيناكولوجي تُختار نتائج فحص الثدي والشعرانية والدرقية والفحص الموضعي من قوائم generalbreast وgeneralhirsutism وgeneralthyroid وexaminationlocalse وتُخزن في أعمدة جدول infertilitysheet، وتُفك ترميزها عند طباعة التقارير الكاملة (sh.php, Completesreport.php).

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

📋

التاريخ المرضي الشامل (Patient Medical History)

موديول مركزي لتوثيق التاريخ المرضي الكامل لمريضة النساء والتوليد على مستوى المريضة (وليس الزيارة): تاريخ الدورة الشهرية، وسائل منع الحمل السابقة، تاريخ الولادات والحمل السابق، الأمراض الطبية السابقة، العمليات الجراحية والنسائية السابقة، محاولات الإخصاب المساعد السابقة (IUI/IVF/ICSI) بتفاصيلها المعملية، والتاريخ العائلي للأمراض. تظهر هذه البيانات كملخص في رأس صفحة المريضة وتُستهلك في جميع الشيتات الطبية والتقارير.

27جدول
2كنترولر
12علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
phmenstrualسجلات تاريخ الدورة الشهرية لكل مريضة (آخر دورة LMP، البلوغ، المدة، الانتظام...)patientid, menarche, duration, length, phregularity, phamount, phdysmenorrhoea, phl_mp, doctorid, delpatients عبر patientid، awusers عبر doctorid، phregularity/phamount/phdysmenorrhoea عبر الأعمدة المسماة بنفس الاسم
phregularityقائمة اختيار: انتظام الدورة (regular, irregular, menopause...)name, delتُرجع من phmenstrual.phregularity
phamountقائمة اختيار: كمية دم الطمث (مثل excessive) — وليس مبلغاً مالياًname, delتُرجع من phmenstrual.phamount
phdysmenorrhoeaقائمة اختيار: عسر الطمثname, delتُرجع من phmenstrual.phdysmenorrhoea
phcontraceptionسجلات وسائل منع الحمل السابقة للمريضةpatientid, contype, contduration, contstopped, contranote, doctorid, delpatients عبر patientid، phcontracttype عبر contype، awusers عبر doctorid
phcontracttypeقائمة اختيار: أنواع وسائل منع الحمل (IUD, OC, DMPA, Mirena, Condom...)name, delتُرجع من phcontraception.contype
phobstetricسجل الولادات/حالات الحمل السابقة، صف لكل حمل مع بيانات حتى 3 أطفال (توائم)patientid, obstrduration, obstermination, obsplace, obsdate, outcomeid, babytype/babygendernew/babyweight/babyname (+ مكررة 1 و2), doctorid, delpatients عبر patientid، phobstericterminate عبر obstermination، phobstericterplace عبر obsplace، awusers عبر doctorid
phobstericterminateقائمة اختيار: طريقة انتهاء الحمل (SVD, CS, Ectopic, Abortion, V.mole)name, delتُرجع من phobstetric.obstermination؛ تُستخدم بمعرّفات ثابتة في حساب الصيغة التوليدية
phobstericterplaceقائمة اختيار: مكان الولادة/انتهاء الحملname, del, patientid (عمود شاذ غير مستخدم — استنتاج)تُرجع من phobstetric.obsplace
phpastmedicalالأمراض الطبية السابقة للمريضة (مع علم للزوج)patientid, medicaldisease, medicalnote, for_husband, doctorid, delpatients عبر patientid، phpastmedicaldisease عبر medicaldisease
phpastmedicaldiseaseقائمة اختيار: أسماء الأمراض الطبية السابقةname, delتُرجع من phpastmedical.medicaldisease
phpastsurgicalالعمليات الجراحية العامة السابقة (مع السنة والجرّاح وعلم للزوج)patientid, surgicaloperation, phsurgicalyear, phsurgicalsurgeon, surgicalnote, for_husband, doctorid, delpatients عبر patientid، phpastsurgicaloperation عبر surgicaloperation
phpastsurgicaloperationقائمة اختيار: أسماء العمليات الجراحيةname, delتُرجع من phpastsurgical.surgicaloperation
phpastgynecologicalالعمليات النسائية السابقة (مع السنة والجرّاح)patientid, gynecologicaloperation, gynecologicalyear, gynecologicalsurgeon, gynecologicalnote, doctorid, delpatients عبر patientid، phpastgynecologicaloperation عبر gynecologicaloperation
phpastgynecologicaloperationقائمة اختيار: أسماء العمليات النسائيةname, delتُرجع من phpastgynecological.gynecologicaloperation
phpastartمحاولات الإخصاب المساعد السابقة (IUI/IVF/ICSI/Cryo) بالمركز والسنة وبيانات تجميد الأجنةpatientid, arttype, artcenter, artyear, artnote, emdate, emembryos, straw1, doctorid, delpatients عبر patientid، phpastarttype عبر arttype، phpastartcenter عبر artcenter
phpastarttypeقائمة اختيار: نوع المحاولة (IUI, IVF, ICSI, cryo, failed)name, delتُرجع من phpastart.arttype (القيم 2 و3 = IVF/ICSI مُعاملة بمنطق خاص في الكود)
phpastartcenterقائمة اختيار: مراكز الإخصاب التي أجريت بها المحاولات السابقةname, delتُرجع من phpastart.artcenter
phpasticsiالتفاصيل المعملية لمحاولة ICSI/IVF سابقة (سجل ابن لكل صف في phpastart)partentid, patientid, opu, gi, gii, gv, et, etf, frozen, bhcg, fhrphpastart عبر partentid، patients عبر patientid
phfamilyالتاريخ العائلي للمريضة (مرض + صلة قرابة + ملاحظة)patientid, family_disease, family_relative, familynote, doctorid, delpatients عبر patientid، phfamilydisease عبر family_disease، phfamilyrelative عبر family_relative
phfamilydiseaseقائمة اختيار: الأمراض العائليةname, delتُرجع من phfamily.family_disease
phfamilyrelativeقائمة اختيار: صلة القرابةname, delتُرجع من phfamily.family_relative
medicalhistoryقائمة اختيار: أمراض طبية للزوجة تُستخدم في شيت العقم (DM, HTN, SLE...) — كتالوج موازٍ منفصل عن phpastmedicaldiseasetitle, delinfertilitysheet عبر العمود النصي medicalhistory (قائمة معرفات مفصولة بفواصل)
medicalhistorydmقائمة اختيار: أمراض طبية للزوج في شيت العقم (varicocele, smoking, STD...) — اللاحقة dm تعني الزوج/الذكر (استنتاج من القيم)title, delinfertilitysheet عبر medicalhistorydm (قائمة مفصولة بفواصل)
surgicalhistoryقائمة اختيار: عمليات جراحية للزوجة في شيت العقم (myomectomy, ov cystectomy...)title, delinfertilitysheet عبر surgicalhistory (قائمة مفصولة بفواصل)
surgicalhistorydmقائمة اختيار: عمليات جراحية للزوج في شيت العقم (varicocelectomy, herniorrhaphy...)title, delinfertilitysheet عبر surgicalhistorydm (قائمة مفصولة بفواصل)
familyhistoryقائمة اختيار: التاريخ العائلي في شيت العقم (DM, HTN, cancer...) — كتالوج موازٍ منفصل عن phfamilydiseasetitle, delinfertilitysheet عبر familyhistory (قائمة مفصولة بفواصل)

سير العمل (Workflow)

  1. يفتح الطبيب صفحة «Patient History» (patienthistory.php) بعد اختيار المريضة؛ إذا لم تُحدد مريضة يُعاد التوجيه للصفحة الرئيسية.
  2. حسب إعداد programesetting.simpleview يُعرض إما نموذج مبسّط (تشخيصات بسيطة) أو النموذج الكامل بسبعة أقسام: الدورة الشهرية، منع الحمل، الولادات، الأمراض السابقة، الجراحات، العمليات النسائية، محاولات ART، والتاريخ العائلي، مع تحميل كل قوائم الاختيار وسجلات المريضة السابقة لكل قسم.
  3. عند الضغط على «إضافة صف» في أي قسم تُستدعى دالة AJAX (مثل addnewmenstural, addnewobstetric, addnewpastart...) تنشئ فوراً سجلاً فارغاً في قاعدة البيانات مرتبطاً بالمريضة والطبيب الحالي بتاريخ اليوم، وتُعيد صف HTML جديداً (قالب Smarty جزئي مثل newMenstrualRow.html).
  4. يملأ الطبيب الحقول مباشرة داخل الجدول؛ كل تغيير في خلية يستدعي الدالة العامة update التي تستقبل اسم الجدول والعمود والقيمة وتحفظ مباشرة (حفظ خلوي لحظي بدون زر حفظ).
  5. في قسم ART، عند إدخال تفاصيل معملية لمحاولة IVF/ICSI تُنشأ/تُحدّث تلقائياً سجلة ابنة في phpasticsi مربوطة بـpartentid، كما تُعرض دورات التنشيط الداخلية المكتملة من mointoringsheet ضمن نفس القسم.
  6. إذا لم تكن القيمة المطلوبة موجودة في قائمة الاختيار، يضيفها المستخدم من نفس الشاشة فتُحفظ في جدول القائمة (مثل phcontracttype) ويُحدَّث سجل المريضة فوراً بالمعرف الجديد؛ ويمكن أيضاً تعديل اسم عنصر قائمة عبر editselect/updateselect.
  7. الحذف يتم منطقياً برفع العلم del=1 عبر delRows.
  8. عند فتح الصفحة تُسجَّل المريضة في قائمة تصدير Excel (excelinfopatients) ويُشغَّل سكربت excel.php في الخلفية لتصدير بياناتها.
  9. ملخص التاريخ (آخر دورة LMP، الصيغة التوليدية المحسوبة من phobstetric بمعرّفات ثابتة للقيصرية/الطبيعي/الإجهاض...) يُعرض في رأس بيانات المريضة (_patientdata.php/_phmain.php) في كل شاشات الكشف والشيتات.
  10. بشكل منفصل، شاشة addpresenthistory.php تُدير بنك أسئلة «الشكوى الحالية» (presenthistoryquestions/presenthistoryanswers) بترتيب عرض ومفضلة، وتُستهلك إجاباتها في شيتات الكشف.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🔄

المتابعة وكروت المتابعة (Follow-up & Follow-up Cards)

يدير هذا الموديول متابعة الحمل للمريضة عبر "ملف متابعة" واحد نشط لكل حمل (تاريخ آخر دورة LMP، تاريخ الولادة المتوقع EDD، تاريخ IVF، عدد مرات الحمل والولادة G/P)، مع سجلات زمنية للزيارات والتشخيصات والفحوصات والتحاليل، إضافة إلى "كروت متابعة" قابلة للطباعة لكل زيارة عيادة تتضمن التشخيص والأدوية الموصوفة وترتبط بالصيدلية، وأخيراً مكتبة تعليمات نصية للمريضات تُطبع عند الطلب مع خطابات تحويل للمستشفيات.

8جدول
3كنترولر
12علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
followupملف متابعة الحمل الرئيسي (ملف واحد نشط لكل مريضة، ويؤرشف عند انتهاء الحمل)patientid, history, lmp, eed, ivf, g, p, statuspatients عبر patientid
followupvisitزيارة متابعة دورية (وزن، ضغط، عمر الحمل، سونار، ملاحظات)followid, date, wt, bp, ga, us, notes, delfollowup عبر followid
followupdiagnosisسطر تشخيص مؤرخ داخل ملف المتابعةfollowid, date, diagnosis, delfollowup عبر followid
followupexamسطر فحص إكلينيكي مؤرخ داخل ملف المتابعةfollowid, date, exam, delfollowup عبر followid
followupinvestسطر تحاليل/أشعات مطلوبة مؤرخ داخل ملف المتابعة (نص حر)followid, date, invest, delfollowup عبر followid
followupcardكارت متابعة الزيارة القابل للطباعة (تشخيص + فترة الزيارة + الطبيب + القسم)patientid, doctorid, enterdate, exitdate, date, diagnosis, status, deleted, deptidpatients عبر patientid، awusers عبر doctorid، detections عبر deptid (مأخوذ من visits.detectionid)
followupcarddrugsأدوية كارت المتابعة (الدواء، النوع، الجرعة) وربطها بروشتة الصيدليةcardid, drugid, drugtype, drugdos, recepittmpidfollowupcard عبر cardid، drugs عبر drugid، recepittmp عبر recepittmpid
instructionمكتبة تعليمات نصية للمريضات قابلة للطباعةpatientid, name, content, tempdeletepatients عبر patientid (نظرياً فقط — القيمة ثابتة بـ 1 في الكود، فهي عملياً مكتبة عامة)

سير العمل (Workflow)

  1. تدخل الممرضة/الطبيب شاشة المتابعة من ملف المريضة (followup.php?patientid=N)؛ إن لم يوجد ملف متابعة نشط (status = 0) يُنشأ تلقائياً بسجل followup جديد بقيمة LMP = اليوم، وتُحسب EDD وIVF، وتُضاف أول زيارة فارغة في followupvisit.
  2. تُعرض الشاشة أربع قوائم مؤرخة (زيارات، تشخيصات، فحوصات، تحاليل) تنازلياً، ويُحسب عمر الحمل لكل زيارة بالأسابيع من LMP، مع تعليم الزيارات الأقدم من LMP كغير منطقية.
  3. يضيف الطبيب صفوفاً جديدة عبر AJAX (newvisit/newdiag/newexam/newinv) ثم يحرر القيم خلية بخلية عبر دالة update العامة (اسم الجدول والعمود والقيمة تُرسل من المتصفح)، وتعديل LMP يعيد حساب EDD وIVF فوراً.
  4. يكتب الطبيب روشتة اليوم من نفس الشاشة (تُحفظ في جدول followupdrugs غير الموجود بالـ dump — يُنشأ وقت التشغيل)، ويمكن عرض أرشيف الروشتات بالتواريخ منفصلة للزوجة والزوج وطباعة أي منها بقالب gyna/print.html.
  5. عند انتهاء الحمل يُغلق الملف (status = 1) ويظهر في شاشة الأرشيف (archive)، ومن هناك تُفتح تفاصيل أي حمل سابق للقراءة عبر pregdetail.
  6. بالتوازي، في كل زيارة عيادة يفتح الطبيب شاشة كارت المتابعة (followupcard.php?ac=addit)؛ يُنشأ كارت جديد (status = 0) يلتقط تاريخ آخر زيارة من visits وقسمها (detectionid)، ويُسجل التشخيص ويضاف الدواء سطراً سطراً من كتالوج drugs.
  7. عند الحفظ/الطباعة (printit) يُعتمد الكارت (status = 1)، وتُحفظ الأدوية في followupcarddrugs، وتُنشأ روشتة مؤقتة في الصيدلية (recepittmp بمصدر drugstablename = followupcarddrugs) مع سطور receiptdrugs ليتم تحصيلها وصرفها من موديول الصيدلية، ثم يُطبع الكارت.
  8. شاشة عرض الكروت (index) تُظهر كل الكروت المعتمدة للمريضة مع اسم الطبيب وقائمة الأدوية مجمعة، مع إمكانية إعادة الطباعة فقط (yesOnly) أو الحذف المنطقي.
  9. في موديول التعليمات: تُدار مكتبة التعليمات (إضافة/تعديل/حذف منطقي عبر tempdelete)، ويختار المستخدم مجموعة تعليمات لطباعتها باسم المريضة ولقبها (من wifetypes) وتاريخ اليوم.
  10. من نفس كنترولر التعليمات تُصدر خطابات التحويل للمستشفيات: تُجمع بيانات الحمل الحالي من mainantenental وآخر سونار من mainantenentalus والتاريخ المرضي/الجراحي/النسائي من جداول ph*، ويُختار المستشفى من hospitalnames وتعليمات العمليات من operationinstructions ثم يُطبع الخطاب.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🧪

التحاليل والفحوصات (Investigations & Lab Orders)

يدير هذا الموديول كتالوج التحاليل المعملية والفحوصات (مصنّفة في فئات إكلينيكية مثل أمراض الدم، الكيمياء، الهرمونات، الفيروسات...)، وطلب التحاليل للمريضة أو الزوج من داخل شيتات متابعة الحمل وأمراض النساء والعقم، إضافة إلى شاشة فحوصات مرنة (Other Investigations) تتيح للطبيب تعريف أعمدة فحوصات خاصة وتسجيل قيمها لكل مريضة بنمط EAV، كما يتضمن آلية تصدير الملف الكامل للمريضة إلى ملفات Excel كنسخ احتياطية.

8جدول
3كنترولر
9علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
investcatsفئات كتالوج التحاليل (22 فئة مزروعة: Hematology, Chemistry, Hormonal profile, Virology, Tumor markers, Genetics, Radiological, ANC booking...) ويُستخدم displayorder لتجميع الفئات في أعمدة شاشة طلب التحاليل.id, name, displayorder, deletedأب لجدول invests عبر investcatid
investsكتالوج بنود التحاليل نفسها (276 بنداً مزروعاً مثل CBC, FSH, AMH, HBs Ag, CA 125, Karyotyping...) مع إمكانية التفضيل والحذف المنطقي.id, investcatid, name, favorite, deletedinvestcats عبر investcatid؛ يُشار إليه من ancsheetinvest وgynasheetinvest وinfertilitysheetinvest عبر investid
investigationsجدول قديم بأعمدة ثابتة لنتائج تحاليل حجز متابعة الحمل (Hb, Platelets, FBS, OGTT, HBsAg, HCV, CUA, Ferritin) بزوجي عمودين لكل تحليل: تاريخ (invesd*) ونتيجة (invest*). فارغ في النسخة الحالية ويُقرأ فقط في ancsheet00.php وCompletesreport.php.id, ancsheetid, invesdhb/investhb, invesdplat/investplat, invesdogtt, invesdhbs, invesdhcv, invesdcua, invesdferrشيت متابعة الحمل عبر ancsheetid (استنتاج)
otherinvestigationsتعريفات الفحوصات المخصصة التي يضيفها الطبيب (تمثل أعمدة الشبكة الديناميكية في شاشة الفحوصات).id, name, deletedأب لجدول otherinvestigationsvalues عبر investid
otherinvestigationsrowsصف فحوصات مخصصة لمريضة بتاريخ معين (رأس السجل في نمط EAV).id, date, patientid, doctorid, deletedpatients عبر patientid؛ awusers عبر doctorid
otherinvestigationsvaluesقيم الفحوصات المخصصة (تفاصيل نمط EAV): قيمة واحدة لكل تقاطع صفّ × تعريف فحص؛ تُنشأ تلقائياً لكل التعريفات عند إضافة صف جديد.id, investrowid, investid, value, dateotherinvestigationsrows عبر investrowid؛ otherinvestigations عبر investid
excelinfoاسم مضلِّل: يخزّن الرقم التسلسلي لترخيص البرنامج (hash SHA-512 مرتبط بجهاز الخادم) وتاريخ التفعيل، ويُفحص في login.php عند الدخول والتفعيل. صف واحد فقط.id, time, serialلا علاقات (جدول إعدادات مستقل)
excelinfopatientsقائمة انتظار للمرضى المطلوب توليد ملف Excel لهم؛ تُملأ من patienthistory.php وcompletereport.php وتُفرَّغ بالكامل (TRUNCATE) بعد كل تشغيل لـ excel.php.id, patientid, statusnopatients عبر patientid؛ statusno منسوخ من patients.statusno ويحدد مجلد الحفظ

سير العمل (Workflow)

  1. يقوم مدير النظام/الطبيب من شاشة إدارة التحاليل (addinvestigation.php) بإنشاء فئات التحاليل وبنودها، وتحريرها مباشرة عبر AJAX، وتمييز المفضلة، والحذف المنطقي (deleted = 1).
  2. داخل شيت متابعة الحمل أو أمراض النساء أو العقم، تُعرض الفئات مجمّعة حسب نطاقات displayorder (مكوّدة يدوياً: 1-2، 3، 4-5، 6-11، أكبر من 11) مع قائمة المفضلة، ويختار الطبيب التحاليل المطلوبة (checkboxes) ويحدد التاريخ وهل هي للزوجة أم للزوج.
  3. عند الحفظ يُنشأ سجل لكل بند مختار في جدول الأوامر الخاص بالشيت (ancsheetinvest أو gynasheetinvest أو infertilitysheetinvest) حاملاً patientid وinvestid وdate وdoctorid وforhusband، ثم يُعرض أمر التحاليل للطباعة باسم المريضة أو الزوج.
  4. لاحقاً تُسجَّل النتائج في حقل investresult لكل سجل، وتُعرض التحاليل مجمّعة حسب التاريخ (زوجة/زوج) داخل الشيت وفي التقرير المجمع (completereport.php) الذي يجلب اسم التحليل من الكتالوج invests.
  5. شاشة الفحوصات العامة (investigation.php?patientid=...) تعرض لكل مريضة جداول السائل المنوي وHSG وUS/TVS والمنظارين وMRI/CT والهرمونات والباثولوجي، وتُنشئ تلقائياً صفاً فارغاً بتاريخ اليوم إن لم يوجد، مع تحرير أي خلية مباشرة عبر update().
  6. في قسم الفحوصات الأخرى: إضافة تعريف فحص جديد (otherinvestsAdd) ينشئ عموداً جديداً، وإضافة صف للمريضة (otherinvestsRow) ينشئ سجلاً في otherinvestigationsrows وقيماً فارغة في otherinvestigationsvalues لكل تعريف نشط داخل معاملة واحدة، ثم تُملأ القيم بالتحرير المباشر.
  7. عند فتح ملف المريضة في patienthistory.php أو completereport.php تُضاف المريضة تلقائياً إلى قائمة excelinfopatients إن لم تكن موجودة.
  8. يعمل السكريبت excel.php (يُشغَّل مباشرة، على الأرجح بمجدولة cron - استنتاج) فيقرأ القائمة، ويفرّغها، ويبني لكل مريضة جدول HTML شاملاً (تاريخ مرضي، فحص، تحاليل، زيارات، متابعة حمل) ويحوّله إلى ملف .xlsx منسّق يُحفظ في excel_backups/{statusno}/{date}.xlsx.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

💊

الصيدلية والأدوية (Pharmacy & Drugs)

تطبيق فرعي مستقل داخل النظام (مجلد pharmacy/) يدير كتالوج الأدوية الموحّد للعيادة (نحو 2,000 صنف دوائي مع التصنيف والشكل الصيدلي والجرعة بالعربية)، ومخزون الصيدلية بنظام دفتر حركات (Ledger) يسجل كل عملية إدخال وصرف، وفواتير الشراء من الموردين، وصرف الروشتات (Receipts) القادمة آليًا من الشيتات الإكلينيكية (متابعة الحمل، النساء، العمليات) — أي أنه حلقة الوصل بين الوصف الطبي داخل العيادة وصرف الدواء الفعلي من المخزن.

8جدول
5كنترولر
9علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
drugsكتالوج الأدوية الرئيسي (~2,000 صنف مزروع مسبقًا) مع رصيد المخزون الجاري لكل صنفid, drugcat, drugname, drugtype, drugdos, initialbalance, currentbalanceيُشار إليه من importdetails.drug_id، pharmacystore.drug_id، receiptdrugs.drugs_id، وجداول الوصفات الإكلينيكية عبر drugid
drugdosجدول مرجعي للجرعات — فارغ وغير مستخدم في أي كود؛ حقل name معرّف خطأً كرقم (int) بدل نص، والجرعات تُخزَّن فعليًا كنص حر في drugs.drugdosid, name, deletedلا توجد (جدول ميت)
pharmacystoreدفتر حركات المخزون: سجل لكل عملية على رصيد دواء (قبل/بعد/الفرق) بطابع زمني ونوع عمليةdrug_id, amountbefore, amountafter, amountvary, opdate, optypedrugs عبر drug_id
recepittmpرأس الروشتة (Receipt header) المُنشأ آليًا من الشيتات الإكلينيكية وينتظر الصرف في الصيدلية؛ status: 0 = معلّقة، 1 = تم الصرفdoctor_id, patient_id, rect_date, drugstablename, statusawusers عبر doctor_id، patients عبر patient_id، ارتباط متعدد الأشكال (Polymorphic) بجدول الوصفة المصدر عبر drugstablename
receiptdrugsبنود الروشتة: دواء وكمية لكل سطر في الروشتة المعلّقةreceipt_id, drugs_id, amountrecepittmp عبر receipt_id، drugs عبر drugs_id، وتُشير إليه جداول الوصفات الإكلينيكية عبر recepitdrugid
importbillرأس فاتورة الشراء من المورد (اسم المورد نص حر بلا جدول موردين)invoicenum, invoicedate, suppliers, receiveuserawusers عبر receiveuser
importdetailsبنود فاتورة الشراء (دواء + كمية)؛ الجدول الوحيد في الموديول الذي يملك فهرسًا على المفتاح الأجنبيbill_id, drug_id, amountimportbill عبر bill_id، drugs عبر drug_id
importtdetailsنسخة مكررة من importdetails (نفس الأعمدة بترميز utf8mb4) — فارغة وغير مستخدمة في أي كنترولر (جدول ميت/مهجور)bill_id, drug_id, amountنفس علاقات importdetails نظريًا (استنتاج)

سير العمل (Workflow)

  1. يُجهَّز كتالوج الأدوية مرة واحدة (بيانات مزروعة ~2,000 صنف) ويُضاف عليه من شاشة الأدوية؛ عند إضافة صنف جديد يُسجَّل رصيد افتتاحي يُنسخ إلى currentbalance.
  2. عند وصول توريد من مورد، يُدخل أمين المخزن فاتورة شراء (buys.php → addnew) داخل معاملة واحدة: سجل في importbill، ثم لكل بند سجل في importdetails + حركة توريد (optype=0) في pharmacystore + تحديث drugs.currentbalance.
  3. في العيادة، عند حفظ وصفة في كارت المتابعة أو تفاصيل العمليات (كنترولرات النواة followupcard.php / operativedetails.php) يُنشأ آليًا رأس روشتة في recepittmp بحالة 0 مع اسم جدول الوصفة المصدر، وتُنسخ الأدوية إلى receiptdrugs بكمية افتراضية 1، ويُحفظ رقما الروشتة والبند (recepittmpid / recepitdrugid) داخل سجل الوصفة الإكلينيكية نفسه.
  4. يفتح موظف الصيدلية شاشة الروشتات (receipt.php) فيرى الطابور باسم الطبيب والمريضة، ويدخل على التفاصيل حيث يُحذَّر تلقائيًا إن كان رصيد أي صنف أقل من الكمية المطلوبة.
  5. عند تأكيد الصرف (updatereceipt) تُسجَّل لكل صنف حركة صرف (optype=1) في pharmacystore ويُخصم من drugs.currentbalance — مع تخطّي الأصناف التي لا يكفي رصيدها — ثم تتحول حالة الروشتة إلى 1 (تم الصرف).
  6. تعديل فاتورة شراء (update) يعكس الكميات القديمة ويسجل حركات تصحيح (optype=2)؛ وحذف الفاتورة (del) يخصم الكميات ويسجل حركات (optype=3).
  7. تقرير المخزن (store.php → show) يعرض دفتر الحركات كاملًا باسم الدواء ونوع العملية والتاريخ كسجل تدقيق للمخزون.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

💰

الماليات والتقارير (Financial & Reports)

يغطي هذا الموديول الجانب المالي للعيادة ومنظومة التقارير بأكملها: تسجيل رسوم الكشف مع كل زيارة (نقدًا أو فيزا مع الخصم والمتبقي)، وإدارة رصيد إجمالي للمريضة يُسدَّد على أقساط، وتقارير الإيرادات اليومية والمديونيات، إضافة إلى التقارير السريرية المجمَّعة (التقرير الكامل، المدمج، الشامل، وإحصاءات الحقن المجهري)، وأدوات صيانة قاعدة البيانات (النسخ الاحتياطي، دمج قواعد قديمة، واستيراد ملفات SQL).

2جدول
9كنترولر
6علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
totalbalanceسجل إضافات الرصيد الإجمالي للمريضة (دائن يُسدَّد لاحقًا على أقساط)؛ يُضاف من شاشة الزيارات ويُحتسب المتبقي بخصم زيارات "دفع قسط"id, patientid, balance, deleted, userid, adddatepatients عبر patientid، awusers عبر userid (استنتاج)
totalbalancepaidsكان مخصصًا لتسجيل سداد دفعات الرصيد الإجمالي، لكنه جدول مهجور: لا يوجد أي كود يقرأ منه أو يكتب فيه؛ السداد الفعلي يُسجَّل كصفوف في visits بكود detectionid = -99id, patientid, paid, userid, paydatepatients عبر patientid (استنتاج)

سير العمل (Workflow)

  1. عند فتح زيارة جديدة من شاشة الاستقبال (visits.php) تختار الموظفة نوع الكشف من كتالوج detections، فتُسجَّل قيمته الإجمالية والمدفوع نقدًا/فيزا والخصم والمتبقي في صف الزيارة نفسه بجدول visits.
  2. إذا اشترت المريضة باقة/مبلغًا إجماليًا، تضيف الموظفة الرصيد عبر زر في شاشة الزيارات يستدعي visits.php?addbalance فيُخزَّن صف جديد في totalbalance باسم المستخدم وتاريخ اليوم، ويعرض النظام فورًا المتبقي (مجموع الأرصدة − مدفوعات الأقساط).
  3. سداد قسط من الرصيد يُسجَّل كزيارة بكود detectionid = -99، وسداد متبقي زيارة سابقة بكود 999 مع ربطها بالزيارة الأصلية عبر visits.visitid، والمرتجع بكود 9999.
  4. في نهاية اليوم تفتح الإدارة التقرير المالي (financialreport.php?index/search) لعرض حركة اليوم أو فترة: لكل زيارة النوع والقيمة والنقدي والفيزا والخصم والمتبقي والمرتجع، مع إجماليات وقائمة المرضى الجدد، ثم الطباعة من showprint.
  5. تقرير الأرصدة financialreport.php?balance (وبحثه عبر monitoring.php) يعرض حركة "إضافة للمبلغ الإجمالي" مقابل "دفع قسط" بصافي محسوب، وتقرير المتبقيات rest يحصر المديونيات القائمة.
  6. للتقارير السريرية: fullreport يحدد فترة ويستعرض نشاط كل مريضة في كل قسم، وcombinedreport يجري بحثًا إحصائيًا بمعايير تشخيصية، وcompletereport/Completesreport يولّدان ملفًا شاملًا لمريضة واحدة مع إمكانية تصدير Excel، وIvfstatistics يستخرج إحصاءات دورات الحقن المجهري.
  7. دوريًا يأخذ المدير نسخة احتياطية من backup.php?takeit (mysqldump ثم تنزيل)، وعند الانتقال من نظام قديم تُستخدم merge.php لدمج قاعدة قديمة أو newdb.php لتنفيذ ملف SQL مرفوع.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

👥

مجلس الأطباء والجلسات (Medical Board & Sessions)

موديول مستقل (تطبيق فرعي board) لإدارة مجلس الأطباء داخل العيادة: يتيح للأطباء رفع طلبات استشارة/مناقشة حالات سريرية إلى المجلس، ثم تنظيم جلسات دورية يحضرها أعضاء المجلس لمناقشة الطلبات المعلّقة، وتسجيل رأي كل عضو (قبول/رفض) على كل طلب، وتدوين القرار النهائي للمجلس، مع إمكانية تأجيل الطلبات لجلسة لاحقة وأرشفة الجلسات والطلبات المنتهية، إضافة إلى نظام تعليقات متداخل (تعليق ورد على تعليق) على كل طلب، وشاشة لتشكيل هيئة المجلس (رئيس، أمين، أعضاء).

6جدول
3كنترولر
8علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
brequestsطلبات عرض الحالات على المجلس؛ دورة الحياة: مسودة (0) ← مُرسل (1) ← مناقَش ومؤرشف (2)، مع علامة تأجيل وقرار نهائي نصيid, memberid, title, details, status, date, delay, decision, sessionidawusers عبر memberid، bsession عبر sessionid
bsessionجلسات المجلس؛ الحالة: مفتوحة (0) أو مغلقة/مؤرشفة (1)، مع تاريخ الإغلاق ومنشئ الجلسةid, date, status, memberidawusers عبر memberid (منشئ الجلسة)
bsessionmembersسجل حضور أعضاء المجلس في كل جلسة (جدول ربط جلسة × عضو)؛ وجود السجل يعني الحضور وحذفه يعني الغيابid, sessionid, memberidbsession عبر sessionid، awusers عبر memberid
bmemberopenionرأي كل عضو حاضر على كل طلب داخل الجلسة: قبول (1) أو رفض (2)؛ سجل واحد لكل (طلب × عضو جلسة) يُحدَّث عند تغيير الرأيid, requestid, sessionmemberid, openionbrequests عبر requestid، bsessionmembers عبر sessionmemberid
bcommentsتعليقات متداخلة على الطلبات: التعليق الرئيسي له relatedcommentid=0 والردود تشير إلى التعليق الأبid, memberid, requestid, comment, relatedcommentidawusers عبر memberid، brequests عبر requestid، bcomments (ذاتية) عبر relatedcommentid
councilstaffتشكيل هيئة المجلس: رئيس (0)، أمين (1)، عضو (2) — كل سجل يربط مستخدمًا بدوره في المجلسid, userid, statusawusers عبر userid

سير العمل (Workflow)

  1. يفتح الطبيب شاشة «إضافة طلب» (requests.php)؛ إن وُجدت مسودة طلب سابقة غير مرسلة تُحمَّل، وإلا يُنشأ سجل طلب جديد فارغ باسمه تلقائيًا.
  2. يكتب الطبيب عنوان الحالة وتفاصيلها، وتُحفظ القيم تلقائيًا أولًا بأول عبر دالة update() (AJAX).
  3. عند الضغط على «إرسال» (sendrequest) يتحول الطلب إلى status=1 ويُختم بتاريخ اليوم ويظهر في قائمة الطلبات المعلّقة.
  4. يتبادل الأطباء النقاش كتابيًا على الطلب عبر التعليقات والردود (addcomment / deletecomment).
  5. يفتح أمين المجلس شاشة الجلسات (sessions.php)؛ إن لم توجد جلسة مفتوحة تُنشأ جلسة جديدة ويُسجَّل تلقائيًا كل أعضاء المجلس (مستخدمو positionid 1–3) في bsessionmembers.
  6. يُحدَّث الحضور الفعلي بإزالة الغائبين وإعادة إضافة الحاضرين (addsessionmember / removesessionmember).
  7. تُعرض الطلبات المعلّقة واحدًا تلو الآخر (requestDetails)؛ يسجل كل عضو حاضر رأيه قبول/رفض (saveopinion)، ويُدوَّن قرار المجلس النهائي نصيًا (savedecision)، أو يُؤجَّل الطلب لجلسة قادمة (delay).
  8. عند إنهاء الجلسة (savesession): تُغلق الجلسة بتاريخ اليوم، وتُؤرشف الطلبات المناقشة (status=2) مع ربطها بالجلسة، وتُعاد الطلبات المؤجلة إلى قائمة الانتظار (داخل معاملة واحدة).
  9. يمكن لاحقًا استعراض أرشيف الجلسات وتفاصيل كل جلسة: الحضور، الطلبات المناقشة، آراء الأعضاء، والقرارات (archiveshowall / sessiondetails / requestDetailsArchive).
  10. بشكل مستقل، تُدار عضوية المجلس من شاشة stuff.php: تعيين الرئيس والأمين والأعضاء في جدول councilstaff.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

⚙️

النظام والصلاحيات والإعدادات (Platform, Auth, Roles & Settings)

هذا الموديول هو البنية التحتية للنظام بالكامل (إطار العمل المخصص "aw framework"): تسجيل دخول المستخدمين عبر مكتبة Login مدمجة، ومنظومة صلاحيات على أربعة مستويات (الدور ← الكنترولر ← الإجراء ← زر الواجهة، إضافةً إلى إظهار/إخفاء عناصر القائمة الجانبية لكل دور)، وسجل إعدادات البرنامج المركزي الذي يتحكم في معظم خصائص الشاشات الطبية والطباعة والترقيم، إلى جانب بنية الفروع والطوابق والأجهزة (غير مفعّلة عملياً)، وشاشة الانتظار للعرض في الاستقبال، وواجهة برمجية (API) لتطبيق موبايل للمريضات، وصفحات المساعدة، وعدد من الجداول التجريبية المهملة.

22جدول
12كنترولر
14علاقة رئيسية

الوظائف الرئيسية

الجداول وبنية البيانات (Data Models)

الجدولالغرضأهم الحقولالعلاقات
awcontrollسجل الكنترولرات الخاضعة لنظام الصلاحيات (81 صفاً مزروعاً يغطي كل شاشات النظام)id, label, nameأب لـ awcontrollprop عبر awcontroll_id
awcontrollpropالإجراءات (actions) المتاحة لكل كنترولر مع قيمة سماح افتراضية (index, addit, show, edit, updateit, del...)id, proplabel, checkval, awcontroll_idawcontroll عبر awcontroll_id
awmenuشجرة القائمة الجانبية (102 عنصر) بمستويين مع الترتيب والأيقونات ووضع العرض المبسّط/الكاملlabel, link, parent, sort, icon, form, withpatientذاتية عبر parent؛ awrolemenu عبر menu_id
awroleالأدوار الوظيفية (Management, pharmacist, reception, doctors, rays, assistants...)id, nameأب لجداول الصلاحيات والمستخدمين عبر role_id
awrolebtnصلاحيات أزرار الواجهة لكل دور؛ أربعة أزرار مثبّتة بالكود (1 إضافة مريضة، 2 إضافة زيارة، 3 تعديل زيارة، 4 حذف زيارة)role_id, btn_id, checkvalawrole عبر role_id
awrolecontrollpropمصفوفة منح/منع كل إجراء لكل دور (نحو 3000 صف)role_id, controllprop_id, checkvalawrole عبر role_id، awcontrollprop عبر controllprop_id
awrolemenuإظهار/إخفاء عناصر القائمة الجانبية لكل دورrole_id, menu_id, checkvalawrole عبر role_id، awmenu عبر menu_id
awrolepositionالوظائف داخل الدور (مثل: Council Head, Sonographer, Supervisor)id, roleid, nameawrole عبر roleid؛ awusers عبر positionid
awrolespecializeالتخصصات داخل الدور (Anasthests, operation للأطباء والمساعدين)id, roleid, nameawrole عبر roleid؛ awusers عبر specialid
awusersحسابات الموظفين: بيانات الدخول والتفعيل واستعادة كلمة المرور ومحاولات الدخول الفاشلة والدور والفرعuser_id, user_name, user_password_hash, role_id, specialid, positionid, branch_id, attendawrole عبر role_id؛ branches عبر branch_id (استنتاج، القيمة "-1" تعني كل الفروع)
programesettingسجل الإعدادات المركزي الوحيد (~75 عموداً): هوية المركز، الطباعة، مفاتيح تفعيل الخصائص، أقسام التاريخ المرضي، عدّادات الإيصالات، ربط ERP، بيانات بريد بنص صريحcentername, simpleview, erpdb, erpdbsave, serial_month, last_serial, last_refund_serial, branches, email, passwordقاعدة ERP خارجية عبر erpdb/erpdbsave
branchesفروع المركز — جدول فارغ وملف الكنترولر Branches.php غير موجود رغم تسجيله في القائمة والصلاحياتid, name, created_at, updated_atawusers عبر branch_id (استنتاج)
floorsطوابق المبنى — فارغ وغير مستخدم في الكودid, name, deleted, default_valuedevices عبر floor_no (استنتاج)
devicesالأجهزة/الغرف داخل الطوابق — فارغ، الكنترولر adddevices مسجّل في awcontroll لكن الملف غير موجودdevice_name, location, floor_no, deletedfloors عبر floor_no
device_trackingتتبّع حركة المريضة بين الأجهزة بإشارة متعددة الأشكال (polymorphic) لأي سجل سريري — ميزة مخطَّطة غير منفَّذة (استنتاج)patient_id, device_id, target_id, target_table, visit_date, visit_time, user_idpatients عبر patient_id، devices عبر device_id، awusers عبر user_id
messagesرسائل داخلية بين المستخدمين — فارغ ولا يوجد كود يستخدمه (دردشة المريضات تتم عبر جدول chat في موديول آخر)message, sender_id, receiver_id, created_atawusers عبر sender_id وreceiver_id
screen_sliderصور العرض الدوّار على شاشة الانتظار في الاستقبالid, image, create_dateتُقرأ في تطبيق screen/ مع جدولي visits وpatients
helpمقالات المساعدة داخل النظام مع حذف ناعمname, content, tempdeleteلا علاقات
table2جدول تجريبي مهمل — فارغ بلا أي استخدامid, name2لا علاقات
table3جدول تجريبي مهمل — فارغ بلا أي استخدامid, nameلا علاقات
tablenameبقايا قالب إنشاء جداول — فارغ ومهملid, delلا علاقات
testtbl1جدول اختبار مهمل — فارغid, name2لا علاقات
testtbl2جدول اختبار مهمل — فارغid, nameلا علاقات

سير العمل (Workflow)

  1. يفتح المستخدم login.php فتتحقق مكتبة Login من اسم المستخدم وكلمة المرور في awusers (bcrypt) وتكتب في الجلسة user_id وrole_id، مع إيقاف مؤقت بعد ثلاث محاولات فاشلة وخيار "تذكرني" بكوكي مؤمَّن.
  2. عند فتح أي شاشة، يستدعي الكنترولر autho::checkautho() للتأكد من تسجيل الدخول ثم autho::checkauthoize() التي تبحث عن الكنترولر في awcontroll والإجراء في awcontrollprop ثم قرار الدور في awrolecontrollprop، وعند الرفض يُحوَّل المستخدم إلى صفحة خطأ الصلاحية.
  3. تُبنى القائمة الجانبية من awmenu تكرارياً حسب parent وsort، مع تصفية حسب وضع العرض (programesetting.simpleview مقابل awmenu.form) وصلاحية الدور في awrolemenu، وإلحاق رقم المريضة الحالية بالروابط الموسومة withpatient.
  4. ينشئ مدير النظام دوراً جديداً في _role.php ثم يضبط مصفوفته: عناصر القائمة (إظهار/إخفاء)، وكل إجراء لكل كنترولر (سماح/منع)، والأزرار السريرية الأربعة في awrolebtn التي تُنشأ تلقائياً عند أول فتح.
  5. يضيف المدير المستخدمين في _member.php: فحص فوري لتفرّد اسم المستخدم، ثم إدراج مباشر في awusers مع الدور والوظيفة والتخصص المحمّلَين حسب الدور المختار.
  6. يضبط المدير إعدادات البرنامج في programesetting.php (شعار وخلفية وهوامش طباعة ومفاتيح تفعيل أقسام الملف الطبي...) فتُحدَّث الصف الوحيد رقم 1 الذي تقرأه كل الشاشات السريرية.
  7. من شاشة setup.php (كلمة مرور ثابتة 123456) يُربط النظام بقاعدة بيانات ERP خارجية وتُختار الخزينة الافتراضية من جدول save فيها، وتوجد أيضاً أداة تفريغ شامل للجداول للبدء من جديد.
  8. تعمل شاشة الانتظار screen/controllers/index.php دون تسجيل دخول: تعرض صور screen_slider واسم المريضة المُنادى عليها (زيارة اليوم ذات view=1 وend_visit=0) وقائمة الخمس التاليات، وتُحدَّث عبر AJAX من loadInfo.
  9. تطبيق الموبايل يستدعي mobileservices.php مباشرة (دون مصادقة): تسجيل مريضة، دخول بالموبايل وكلمة المرور، حجز زيارة (كشف/سونار/إعادة)، عرض الروشتات من gynadrugs وdrugs، وقراءة الدردشة، مع مزامنة بيانات العميلة مع نظام ERP عبر curl ومفتاح API مثبّت بالكود.

الارتباط بالموديولات الأخرى

ملاحظات فنية

توصيات النقل إلى ERP

🗺️

خريطة العلاقات الشاملة (ERD)

قاعدة البيانات تضم 312 جدولًا بدون أي مفتاح أجنبي مُعلن (Declared Foreign Key) على الإطلاق؛ جميع العلاقات «ضمنية» تُفهم من تسمية الأعمدة (patientid, doctorid, ancsheetid, ...) ومن جمل JOIN داخل الكنترولرات في core/controllers. هذا القسم يرسم الخريطة الكلية: الكيانات المحورية الأربعة (المريضة، الزيارة، المستخدم، الفرع)، والعلاقات الرئيسية بينها وبين الموديولات الإكلينيكية، وأنماط التصميم الثلاثة المتكررة (نمط الشيت الأب وأبنائه، نمط جداول الترميز الصغيرة، نمط EAV للتحاليل الحرة)، ثم قائمة الجداول المكررة والمهجورة المكتشفة في الـ dump.

312جدول
0مفتاح أجنبي مُعلن
73جدولًا يرتبط بـ patients
59جدولًا يرتبط بـ awusers
~190جدول ترميز/مساعد صغير

الكيانات المحورية (Hub Entities)

العلاقات الرئيسية

من (الجدول الابن)إلى (الجدول الأب)عمود الربطالنوع
visits, old_visits, endvisitreports, lastvisitpatientspatientid → patients.id1:N
الشيتات الأم: ancsheet, gynasheet, infertilitysheet, ivfsheet, mointoringsheet, followupcard, mainantenental, maingynapatientspatientid → patients.id1:N (عمليًا 1:1 في gynasheet/infertilitysheet)
التاريخ المرضي: phobstetric, phmenstrual, phfamily, phcontraception, phpastmedical, phpastsurgical, phpastgynecological, phpastart, phpasticsi, previous_marriage, hus_previous_marriagepatientspatientid → patients.id1:N
الأشعة والمناظير: ultrasound, ultrasoundgyna, ultrasoundobst, gynaus, ustv, sonar, gtimage, hsg, hysteroscopy, laparoscopy, mrict, pathology, semen, hormonpatientspatientid → patients.id1:N
visitsdetections / visit_periods / branches / awusersdetectionid → detections.id، visit_period → visit_periods.id، branch_id → branches.id، user_id / enddoctorid → awusers.user_idN:1
visits_updates, patients_updatesvisits, patientsvisitid → visits.id، patientid → patients.id (+ userid_edit)1:N (سجل تدقيق)
ancsheetdrugs, ancsheetinvest, ancnewvisit, investigations, registeration, op_4d_listancsheetancsheetid → ancsheet.id1:N
17 جدولًا منها: newvisit, tvs, dtvs, sis, folliculom, hormonalprofile, hormonalprofile2, semen2, semeninfertility, hsginfertility, hysteroscopyinfertility, laparoscopyinfertility, icsi, operations, wifep, awifep, wifeepcinfertilitysheetinfertilitysheetid → infertilitysheet.id1:N
newvisitggynasheetgynasheetid → gynasheet.id1:N
gynasheetdrugs, gynasheetinvest, infertilitysheetdrugs, infertilitysheetinvestgynasheet / infertilitysheet (عبر المريضة)patientid فقط — لا يوجد عمود sheetid (شيت واحد لكل مريضة)1:N غير مباشر
mointoringsheetdrugs, mointoringsheetinvestigation, mointoringsheetvisitsmointoringsheetmointoringsheetid → mointoringsheet.id1:N
mointoringsheet9 جداول ترميز: mointoringsheetprocedure/protocol/ejac/pesa/tese/sryo/hmg/agonist/hcgprocedure/protocol/... → {lookup}.id (مؤكدة بـ LEFT JOIN في الكنترولر)N:1
eprep, ovstivfsheetivfsheetid → ivfsheet.id1:N
followupcarddrugsfollowupcardcardid → followupcard.id1:N
followupvisit, followupinvest, followupexam, followupdiagnosisfollowupfollowid → followup.id1:N
13 جدول *drugs + pharmacystore + receiptdrugs + importdetailsdrugsdrugid / drug_id / drugs_id → drugs.idN:1
6 جداول *invest / *investigationinvestsinvestcatsinvestid → invests.id، invests.investcatid → investcats.idN:1
*drugsrecepittmprecepittmppatients/awusersrecepittmpid → recepittmp.id؛ recepittmp.patient_id/doctor_idN:1
otherinvestigationsvaluesotherinvestigationsrows + otherinvestigationsinvestrowid → rows.id، investid → otherinvestigations.idN:M (نمط EAV)
operativedetails, operativedetailsdrugs, operationidsoperations / awusersoperationid → operations.id؛ doctorid/assistantid/anasthetstsid → awusers.user_id1:N + N:M (فريق العملية)
gynausficilsgynausgynausid → gynaus.id (مؤكدة بـ JOIN)1:N
presenthistoryanswerspresenthistoryquestionscatid/answerid في جداول الشكوى (مؤكدة بـ JOIN)N:1
awusersawrole / branchesrole_id → awrole.id، branch_id → branches.idN:1
awrolemenu, awrolecontrollprop, awrolebtnawroleawmenu / awcontrollproprole_id + menu_id / ...N:M (صلاحيات)
bsession, bsessionmembers, bcomments, bmemberopenion, brequestsbsessionawuserssessionid + memberidN:M (بورد الأطباء)
totalbalance, totalbalancepaidspatients / awuserspatientid, userid1:N (مالية)
device_trackingpatients / awusers / أي جدولpatient_id, user_id, target_id + target_table (مرجع متعدد الأشكال Polymorphic)N:1

أنماط التصميم المتكررة

الجداول المكررة والمهجورة المكتشفة

المجموعةالجداولالملاحظة
جداول تجارب مهجورةtable2, table3, tablename, testtbl1, testtbl2, patients_tmpمخلفات تطوير بلا أي استخدام في الكود — آمنة الحذف بعد التحقق
استنساخ رباعي لنفس القائمةssemen, sseemen, sseemmen, sseemmeen4 جداول ترميز متطابقة البنية، أنشئ واحد لكل عمود من أعمدة السائل المنوي الأربعة في ivfsheet (ssemen/sseemen/sseemmen/sseemmeen) بدل جدول واحد بعمود نوع
أزواج شبه مكررةantype/antypes، place/place2، importdetails/importtdetails، hormonalprofile/hormonalprofile2، semen/semen2، excelinfo/excelinfopatientsأجيال متعاقبة من نفس الوظيفة بقيت جنبًا إلى جنب (الإصدار 2 هو المستخدم غالبًا)
عائلة copy*copycavity, copycx, copydil, copyintrod, copylostium, copyrostium, copyplace + نسخ copym* (mcavity, mcx, mlostium, mrostium)10 جداول ترميز لتقرير المنظار الرحمي بدأت كنسخ (copy) وأصبحت أصلية، مع نسخة m* ثانية لكل منها تقريبًا
بيانات تاريخيةold_visitsأرشيف زيارات بنية قديمة (قبل إضافة الفروع والفترات) — للقراءة فقط
موديولات ANC متوازيةancsheet+ancnewvisit مقابل mainantenental+antenalvisit مقابل followup+followupvisitثلاثة أجيال لمتابعة الحمل تعمل بالتوازي في الكود، لكل منها جداول أدوية/تحاليل خاصة
جداول معطلة/غير مفعلةpatientfiles, patients_updates (جزئيًا), help, messagesموجودة بالبنية لكن الكود الفعّال لا يكتب فيها أو يتجاوزها (استنتاج من مراجعة الكنترولرات)
🚀

خطة النقل إلى نظام الـ ERP (ERP Migration Blueprint)

الهدف هو استيعاب نظام عيادة النساء والتوليد القديم (PHP/Smarty — 312 جدولًا بلا أي مفاتيح أجنبية) كموديول جديد Modules/Obgy داخل منظومة Moon ERP القائمة (Laravel/nwidart + Angular)، مع الاستغناء نهائيًا عن مزامنة cURL مع قاعدة الـ ERP الخارجية: يصبح المريض هو نفسه عميل الـ ERP، وتتكامل التحاليل مع موديول المعمل LIS، والصيدلية مع المخازن، والماليات مع الحسابات، والمستخدمون مع نظام الصلاحيات الموحد. المحصلة: تتقلص 312 جدولًا قديمًا إلى نحو 85 جدولًا جديدًا (~55 موديل نطاق + جدول قواميس موحد + جداول Pivot ووسائط)، مع إسقاط ~40 جدولًا ميتًا أو مشتقًا.

312 ← ~85جدول قديم ← جدول جديد
~190جدول قوائم يُدمج في lookups واحد
18جدول روشتات/تحاليل مكرر ← جدولان
8مراحل تنفيذ

أولًا: أنماط الدمج العرضية (Cross-cutting Consolidation)

النمط القديمالحل المقترح
~190 جدول قوائم صغيرة بنفس البنية id + title + del (منها رباعية ssemen/sseemen/sseemmen/sseemmeen و24 جدول lapar*/copy* و9 جداول mointoringsheet*)جدول قواميس موحد obgy_lookups بأعمدة (domain, parent_id, title_ar, title_en, sort, is_active, deleted_at)، مع تحويل القوائم الطبية الثابتة (فصائل الدم، طريقة الولادة CS/SVD/NVD، توقيت الولادة FT/PT، أنواع فقدان الحمل) إلى Enums في الكود
10 جداول روشتات مستنسخة (ancsheetdrugs, mainantenentaldrugs, gynadrugs, gynasheetdrugs, infertilitydrugs, infertilitysheetdrugs, mointoringsheetdrugs, followupcarddrugs, operativedetailsdrugs, recorddrugs)جدولا visit_prescriptions + prescription_items بعلاقة Polymorphic نحو الشيت/الزيارة/الدورة، مع عمود المستفيد (زوجة/زوج) وكمية الصرف الفعلية
8 جداول تحاليل مستنسخة (ancsheetinvest, mainantenentalinvest, gynainvestigation, gynasheetinvest, infertilityinvest, infertilitysheetinvest, mointoringsheetinvestigation, followupinvest) + ثلاثية EAVجدولا visit_investigations (LabOrder) + lab_order_items بعلاقة Polymorphic، مرتبطان بكتالوج موديول المعمل LIS
~40 عمودًا يخزن معرفات مفصولة بفواصل (CSV) مثل gyna.diagnosisid وoperations.operationجداول Pivot حقيقية لكل علاقة، مع تسجيل المعرفات المعلقة في سجل أخطاء الترحيل
ثلاثة أنماط حذف منطقي متضاربة (del / deleted / conditions) + جداول تدقيق منسوخة (patients_updates, visits_updates)SoftDeletes (deleted_at) موحد + حزمة تدقيق قياسية laravel-auditing
نقاط AJAX عامة تستقبل اسم الجدول والعمود من المتصفح (ثغرة كتابة شاملة + حقن SQL) وواجهة موبايل بلا مصادقةلا يُنقل أي منها: REST APIs محددة الموارد بـ FormRequests وPolicies ومصادقة Sanctum

ثانيًا: خريطة الموديلات المقترحة حسب النطاق

1) المرضى والتسجيل

الموديل المقترحالجداول القديمةملاحظات الدمج
Patient + ObgyPatientProfilepatients (نصف الزوجة)المريضة تصبح هي سجل المريض/العميل في الـ ERP مباشرة؛ الملف الإضافي يحمل رقم الملف (بتسلسل معاملاتي بدل MAX+1) والرقم القومي والخطورة
Spouseأعمدة husband* في patientsفصل بيانات الزوج في جدول 1-1
PreviousMarriageprevious_marriage + hus_previous_marriageدمج بعمود تمييز (زوجة/زوج) مع إصلاح ترميز latin1
ObstetricBaselineأعمدة pno/cs/ab/ectopic/vmodel/svdأرصدة افتتاحية رقمية للصيغة التوليدية
MedicalRecord, DeliveryRegistration, MediaAttachmentrecords, registeration, patientfiles + مجلدات الرفعتصحيح coast → cost decimal؛ وسائط بجدول حقيقي وروابط موقعة
قواميس: JobTitle, PersonTitle, Complaint...wifejobs+husbandjobs، wifetypes+husbandtypes، complaint+complaintant، education، wifestatus، risktype، originتوحيد القوائم المزدوجة في obgy_lookups؛ فصائل الدم Enum؛ إسقاط patients_tmp وlocations وجداول التطوير

2) المواعيد والزيارات وجسر الماليات

الموديل المقترحالجداول القديمةملاحظات الدمج
Appointment + Encountervisits (الحجز + الطابور) وfollowupcardتفكيك الجدول المركب؛ ربط السجلات الإكلينيكية بـ encounter_id يعالج العيب البنيوي (لا يوجد ربط زيارة في أي جدول إكلينيكي)
Service, VisitPeriod, ClinicClosure, TreatmentClosuredetections, visit_periods, vacations, endvisitreportsسعة الفترات تُفحص بمعاملة قاعدة بيانات؛ تفعيل الإجازات فعليًا في منع الحجز
PatientLedgerEntry + Invoice + Paymenttotalbalance + الأكواد السحرية في visits (‎-99 قسط / 999 سداد / 9999 مرتجع)دفتر حساب بأنواع حركات Enum صريحة ورصيد محسوب؛ الترحيل للحسابات عبر Events
old_visits, visits_updates, lastvisit, totalbalancepaidsتُسقط: أرشيف ميت / تدقيق مهجور / مؤشر يُشتق بالاستعلام / جدول ميت

3) النواة الإكلينيكية المشتركة والتاريخ المرضي

الموديل المقترحالجداول القديمةملاحظات الدمج
ClinicalExamination + ExaminationFindingexamination + 9 جداول نتائج فحص متطابقة البنيةكتالوج نتائج موحد بعمود جهاز الجسم؛ إلغاء الإنشاء التلقائي عند العرض
Diagnosis + Pivotdiagnosis + diagnosisantدمج بعمود تخصص وجدول وسيط بدل CSV
HistoryQuestion / HistoryAnswerOption / PatientHistoryAnswerpresenthistoryquestions/answers + جدول gynaph (وقت تشغيل)gynaph غير موجود في النسخة الاحتياطية — يجب تصديره من الإنتاج
Prescription/Item + LabOrder/Item18 جدول الروشتات/التحاليل المستنسخة + ثلاثية EAVراجع جدول الأنماط العرضية أعلاه
نماذج التاريخ المرضي: MenstrualHistory, ObstetricHistory+ObstetricBaby, ContraceptionHistory, PastMedical/Surgical/GynecologicalHistory, PastArtCycle+تفاصيل ICSI, FamilyHistoryجداول ph* التسعة + wifep/awifep + الكتالوجات المزدوجة و*dmتوحيد سجل الحمول السابقة في مصدر واحد وحساب الصيغة التوليدية كخدمة/Accessor؛ طريقة انتهاء الحمل Enum ثابت

4) متابعة الحمل وأمراض النساء

الموديل المقترحالجداول القديمةملاحظات الدمج
Pregnancyancsheet + mainantenental + followupدمج ثلاثة أجيال متوازية لملف الحمل في كيان واحد؛ المطابقة بالمريضة + LMP وأعلام done/endpreg
AntenatalVisit, AntenatalUltrasound, FourDScanBooking, ClinicalNoteancnewvisit+antenalvisit+followupvisit، mainantenentalus+أعمدة T/TT-scan، op_4d_list، followupdiagnosis/exam/investعمر الحمل GA يُحسب ولا يُخزن؛ حالة 4D صريحة بدل أعلام البتات
PregnancyLoss + قوائمه, ExternalProviderwifeepc + wifeepctype/ttt، wifeobst+wifeepcobstإعادة الربط بالمريضة مباشرة بدل شيت العقم؛ إسقاط anprotocol اليتيم
GynaVisit, GynaSheet+GynaSheetVisit, GynaUltrasound+Follicle, InfertilityProfile+Plangyna، gynasheet+maingyna+newvisitg، gynaus+gynausficils، gynainfertility+أعمدة gyna.inf_*القواميس التسعة الفارغة ← obgy_lookups مع التصدير من الإنتاج؛ إهمال شاشة gynasheet00

5) العقم والحقن المجهري وتحاليل الزوج

الموديل المقترحالجداول القديمةملاحظات الدمج
InfertilityFileinfertility + جداوله الفرعية + infertilitysheet (64 عمودًا)دمج الجيلين في ملف واحد لكل مريضة بجداول فرعية مهيكلة وPivot بدل CSV
IvfCycleivfsheet + mointoringsheetتوحيد المسارين بقيد فهرس فريد جزئي = دورة نشطة واحدة لكل مريضة
IvfCycleVisit + FollicleMeasurementovst + mointoringsheetvisits + folliculomشبكة حويصلات مطبّعة (جانب/قطر/عدد) بدل 26 عمودًا مشفرًا
OocyteRetrieval, SemenSample, EmbryoTransfer, Cryopreservation, EndometrialPrep, CycleOutcomeأعمدة مراحل ivfsheet + eprep + جدول sefo (وقت تشغيل)نمذجة المراحل كجداول فرعية؛ إسقاط icsi المشتق واستبداله باستعلام
SemenAnalysis, AndrologyInvestigation, HormoneResult+HormoneDefinitionsemen+semeninfertility، semen2 العريض، hormon+hormonalprofile+hormonalprofile2تطبيع طولي (صف لكل فحص/هرمون) مع وحدة ومدى مرجعي وربط بـ LIS؛ حذف اليتيم sseemmeen وإعادة تسمية الرباعية المشوهة بعد مراجعة العيادة

6) التصوير والمناظير والعمليات

الموديل المقترحالجداول القديمةملاحظات الدمج
ImagingStudy + FetalScanFinding + GynaScanFindingultrasound(+detail), ultrasoundobst(+detail), ultrasoundgyna, tvs, dtvs, sis, hsg, hsginfertility, mrict, sonarرأس دراسة موحد بنوع وحالة اعتماد؛ 16 جدول مفردات ← obgy_lookups؛ صور وفيديو السونار ← وسائط قياسية
AnnotatedDiagram + DiagramMarkergtimage + gtdetailإحداثيات نسبية للعلامات
EndoscopyProcedure + EndoscopyFinding + EndoscopyTermlaparoscopy, hysteroscopy, laparoscopyinfertility, hysteroscopyinfertility + 24 قائمة lapar*/copy*نموذج واحد بحقل نوع + جدول نتائج (موضع/تصنيف) بدل 26 عمود CSV + معجم موحد
OperativeNote, SurgicalBooking, InfertilityOperation, Procedure, AnesthesiaType, IncisionType, Hospital, HistopathologyFinding, PathologyResult, Locationoperativedetails(+drugs), op_wait_list, operations, operation, anasthesa+generalanasthesa, jncision+midlinejncision, hospitalnames, histopath, pathology, place+place2فريق العملية CSV ← Pivot بأدوار؛ دمج الأماكن بعمود نوع؛ إسقاط operationids؛ أدوية العمليات ← نظام الروشتات الموحد

7) المعمل والصيدلية والمجلس والمنصة

الموديل المقترحالجداول القديمةملاحظات الدمج
LabTestCategory + LabTest (طبقة Mapping على LIS)investcats (22 فئة) + invests (276 بندًا) + EAV المخصصكل بند قديم يُربط ببند كتالوج LIS عبر obgy_lis_test_map؛ إسقاط investigations القديم وexcelinfo (ترخيص)
Drug, DrugCategory, DosageForm, Supplier, PurchaseInvoice/Item, StockMovementdrugs (~2000)، importbill+importdetails، pharmacystore، recepittmp+receiptdrugsكتالوج الأصناف والمخزون يُسند لاحقًا لموديول مخازن الـ ERP؛ دفتر حركات برصيد محسوب يمنع السالب؛ إسقاط drugdos وimporttdetails
BoardRequest, BoardSession, BoardSessionMember, BoardMemberOpinion, BoardCommentbrequests, bsession, bsessionmembers, bmemberopenion, bcomments, councilstaffإعادة بناء من الصفر (الجداول فارغة) مع إضافة patient_id الإلزامي وEnums للحالات ودمج العضوية في صلاحيات الـ ERP
منصة الـ ERP القياسيةawusers, awrole + 5 جداول صلاحيات, awmenu, programesetting, branches, mobileservicesSanctum + spatie/laravel-permission؛ تفكيك الإعدادات إلى مفتاح/قيمة و.env؛ فروع بـ Pivot بدل "-1"؛ إعادة كتابة واجهة الموبايل بمصادقة إلزامية

ثالثًا: نقاط التكامل مع منظومة Moon ERP

رابعًا: مراحل التنفيذ (Phased Rollout)

  1. المرحلة 0 — التأسيس (حجم M): هيكل الموديول، إطار obgy_lookups والـ Enums، حزمة التدقيق، عدة الترحيل ETL (محولات التواريخ والترميز وفاحص الأيتام)، وتصدير إلزامي من قاعدة الإنتاج (قيم القواميس + جداول وقت التشغيل sefo/gynaph/followupdrugs)، وربط المستخدمين والأدوار بمنظومة الصلاحيات.
  2. المرحلة 1 — المرضى والاستقبال (L): دمج المريضة في ملف الـ ERP، فصل الزوج، الأرصدة الافتتاحية، المواعيد والطابور والفترات والإجازات، كتالوج الخدمات، دفتر حساب المريض وجسر الحسابات. أول تشغيل فعلي للاستقبال.
  3. المرحلة 2 — النواة الإكلينيكية والكتالوجات (L): الفحص والتشخيص ومحرك التاريخ المرضي، جدولا الروشتات والتحاليل الموحدان، ربط كتالوج التحاليل بـ LIS، وتكامل الصيدلية مع المخازن.
  4. المرحلة 3 — الحمل والنساء (L): دمج أجيال ملف الحمل الثلاثة، زيارات ومتابعات وسونار الحمل وحجوزات 4D وفقدان الحمل، وزيارات وشيتات وسونار النساء — أعلى حجم بيانات وأصعب إزالة تكرار.
  5. المرحلة 4 — العقم والحقن المجهري والأندرولوجيا (L): توحيد ملف العقم ودورة IvfCycle وجداول المراحل وشبكة الحويصلات، وتطبيع السائل المنوي والهرمونات — الأغنى إكلينيكيًا ويتطلب اعتماد الأطباء لدلالات القوائم.
  6. المرحلة 5 — التصوير والمناظير والعمليات (M): توحيد دراسات التصوير ونتائجها، معجم المناظير، المذكرات الجراحية وقوائم الانتظار والباثولوجيا.
  7. المرحلة 6 — المجلس والكروت والتقارير والموبايل (M): إعادة بناء مجلس الأطباء، قوالب التعليمات والتحويل، طبقة التقارير الإحصائية كاستعلامات + لوحات Angular، وواجهة موبايل REST موثقة وموثَّقة الهوية.
  8. المرحلة 7 — الوسائط والتحول النهائي (M): ترحيل 4.8 جيجابايت وسائط (جرد بالبصمات ثم rsync مرحلي ثم سجلات وسائط)، تشغيل متوازٍ مع مطابقة، ترحيل الفرق الأخير، تجميد النظام القديم للقراءة فقط، وإيقاف مزامنة cURL والقاعدة القديمة نهائيًا.

خامسًا: سجل مخاطر ترحيل البيانات

🏥

ملحق: اكتشاف النسخة الثانية (مستشفى Green Nature) (MED Deployment Discovery)

أثناء استكمال العمل اكتُشفت نسخة ثانية عاملة من النظام القديم على نفس الخادم: med.greennature.com.sa في المسار /home/medgreennatureco/public_html/med. هي من نفس عائلة الكود، لكنها إصدار أحدث وأوسع مُهيّأ كـ«مركز/مستشفى» وليس عيادة نساء وتوليد فقط. هذا الملحق يلخّص حقائق النشر، وحجم الفروقات بالأرقام، والمجالات الوظيفية التسعة الجديدة، وأثر ذلك على خارطة الطريق. التحليل تم بقراءة الكود فقط (RedBeanPHP وSQL الخام وقوالب Smarty) دون أي تعديل على النسختين ودون لمس قاعدة البيانات الحيّة.

الإجابة المباشرة على سؤال الإدارة: هل أخذ التحليل الأصلي إعدادات المركز/المستشفى في الحسبان؟

لا — ولم يكن ذلك ممكنًا أصلًا. النسخة التي حُلِّلت في التقرير المنشور (/obgy، 312 جدولًا) لا تحتوي هذه القدرات إطلاقًا: لا كود تنويم، ولا معمل أجنة، ولا قسم أشعة، ولا عيادة ذكورة، ولا طبقة منظمات/تأمين. وما في MED ليس «إعدادات» لنفس البرنامج، بل نسخة أحدث متشعّبة (Fork) فيها كود إضافي ضخم: نعم توجد مفاتيح إعدادات كثيرة (programesetting أضافت 44 مفتاحًا جديدًا مثل system_type، branches، organizations، tanks_view)، لكن كل مفتاح يُفعّل مسارات كود غير موجودة في النسخة المُحلَّلة من الأساس. الدليل القاطع: MED تعتمد على تبعيات Composer (vendor/autoload.php، Monolog/Psr) لا وجود لها في OBGY — وتبعية Composer لا يمكن «تشغيلها بإعداد». الخلاصة: التقرير المنشور صحيح تمامًا لنطاق النسخة التي حلّلها، لكنه يغطي النواة العيادية فقط؛ وهذا الملحق يضيف النطاق المستشفوي المكتشف.

77 → 134عدد الكنترولرات (OBGY ← MED)
78كنترولر جديد أُضيف في MED
21كنترولر «أوراق» قديم أُزيل/استُبدل
36كنترولر مشترك لكنه مُعدَّل
~276جدول جديد مُشار إليه في الكود (غير موجود في الـ312)
9مجالات وظيفية جديدة كاملة

للمقارنة على مستوى الكود المشترك: من 57 ملفًا مشتركًا بالاسم، 21 متطابق تمامًا و36 مُعدَّل — وبعض التعديلات انفجارية (visits.php قفز من 1,946 إلى 9,660 سطرًا ومن 65 إلى 220 دالة). من إجمالي 413 جدولًا مُشارًا إليه في كود MED: 137 معروف من الـ312 الأصلية و~276 جديد، منها ~178 وُثّقت تفصيليًا في ملاحق المجالات (70–78).

حقائق النشر

البندالنسخة المُحلَّلة (OBGY)النسخة المكتشفة (MED)
المسار/home/amrtechogate/public_html/obgy (نسخة تحليل)/home/medgreennatureco/public_html/med (تشغيل حي)
الدومينmed.greennature.com.sa
قاعدة البياناتdump بتاريخ 2024-07-12 (312 جدولًا)medgreennatureco_med + اتحاد قواعد متعددة عبر R::addDatabase (erpDB/old/new/obor/royalDb)
نمط التشغيلعيادة نساء وتوليدمركز/مستشفى (system_type + فروع + مناطق + منظمات)
التطبيقات الفرعيةcore, board, pharmacycore, board, pharmacy, vote (كشك تقييم رضا المرضى)
سلسلة الأدواتبدون ComposerComposer + Monolog/Psr؛ منطقة زمنية وضبط R::freeze مختلفان
تكامل ERPلا يوجدجسر حي مع Moon ERP (فواتير بيع، أطباء، مديونية عملاء) عبر cURL وقاعدة erpDB

المجالات الوظيفية التسعة الجديدة (ملخص الملاحق 70–78)

الملحقالمجالجداول جديدةأبرز ما فيه
70التنويم وغرف العمليات (Inpatient & OR)9+غرف عمليات وإقامة على طوابق، محرّكا حجز متوازيان غير متزامنين (operations_main مقابل operations_rooms_cal)، لوحة إشغال حيّة؛ التنويم محمّل كأعمدة على جدول visits بلا كيان سرير/دخول مستقل
71معمل أطفال الأنابيب والأجنة (Embryology/IVF Lab)~40ورقة معمل كاملة، تدريج الأجنة يوم 2–6، تجميد/إذابة، خزانات نيتروجين بنموذجي تخزين متوازيين، سجل عهدة tankcellhistory — كل ذلك غائب كليًا عن الأصل (كان ivfsheet مسطّحًا فقط)
72وحدة مناظير موسّعة (Endoscopy Suite)14تضيف مناظير الجهاز الهضمي (معدة/قولون) خارج نطاق النساء أصلًا + 3 أنماط قوالب تقارير + أرشيف صور لكل منظار
73عيادة الذكورة + قسم الأشعة (Andrology + Rays)29عيادة ذكورة مستقلة كاملة (زيارات/تاريخ/فحص/سونار/وراثة) وقسم أشعة بنمط «طلب → قائمة عمل → تقرير → صور → أرشيف» مع كتالوج مُسعّر
74الفروع والمناطق والمنظمات وجسر ERP22نطاق فروع لكل مستخدم، تسلسل مناطق، منظمات متعاقدة (تأمين/شركات) بأرقام ملفات خاصة، جسر أجهزة مختبر ثنائي الاتجاه، تكامل مالي حي مع Moon ERP
75تشغيل العيادات وخدمة العملاء (Clinic Ops & CRM)27جدولة أسبوعية طبيب×غرفة، مؤشرات انتظار وأداء أطباء، شكاوى مرضى، رسائل SMS بقالبين ومزوّدين، إقرارات موقّعة، تتبّع حركة الملفات الورقية، كشك تقييم رضا
76المخزون المعملي والماليات (Inventory & Finance)~17قوائم أسعار وخصومات تعاقدية لكل منظمة، باقات فحوصات، نقطة بيع صيدلية bill_paying، معامل خارجية، نموذج نتائج مختبر مُطبَّع يستبدل نموذج «الأوراق»
77حكم «إعدادات أم نسخة أحدث؟» (Config vs Fork)الحكم بالأرقام: Fork حقيقي فوق نواة إطارية مشتركة؛ 21 كنترولر «أوراق» استُبدل بوحدات معيارية (ورقة IVF الواحدة → 6 وحدات معملية)
78إحصاء المخطط الكامل (Schema Census)276 (إجمالي)413 جدولًا في الكود: 137 معروف + 276 جديد؛ visit أصبح كيان «اللقاء» المركزي بـ60+ عمودًا (تسعير، تأمين، توجيه بين الأقسام)

الدلالة الاستراتيجية

🛏️

ملحق: الإقامة الداخلية وغرف العمليات (MED: Inpatient & OR Management)

هذه الوحدة هي «جوهرة» نسخة المركز/المستشفى (MED) المكتشفة على med.greennature.com.sa، وهي غير موجودة في النسخة الأصلية التي جرى تحليلها (312 جدولاً). تُدير غرف العمليات وغرف الإقامة الداخلية (التنويم) عبر طابقين منطقيين: حجز بالساعات (Hourly Reservation) وتقويم تفاعلي (FullCalendar) مع تتبّع إشغال الغرف لحظياً وتقارير تشغيلية للعمليات والإقامة. تمثّل دليلاً مباشراً على خارطة طريق التنويم في نظام معلومات المستشفى (HIS).

10كنترولر في النطاق
6جداول جديدة
2محركا حجز (ساعات + تقويم)
13قسم العمليات for_department

نظرة عامة على البنية

تنقسم الوحدة إلى ثلاث مناطق وظيفية مترابطة. الأولى: التعريفات الأساسية (غرف العمليات، غرف الإقامة، أنواع العمليات). الثانية: محركات الحجز وهي محركان متوازيان — محرّك «الساعات» القديم (operations_reserve) الذي يقسّم اليوم إلى خانات نصف/كامل الساعة ويخزّنها سطراً لكل ساعة، ومحرّك «التقويم» الأحدث (operations_calendar) المبني على FullCalendar بموارد (Resources) يخزّن العملية في صف واحد يحمل وقت بداية ونهاية. الثالثة: التقارير والإشغال اللحظي (تقارير العمليات والإقامة، تقرير الغرف، قائمة اليوم).

اكتشاف معماري مهم: توسعة جداول قائمة وليست جداول جديدة فقط

جدول الكيانات

الجدولجديد/معروفالغرضأهم الحقول المستنتجةالعلاقات
operations_roomsجديدغرف العمليات (OR) موزّعة على طوابقname, start_time, end_time, floor_no, branch_id, create_date, deletedfloor_nofloors.id، branch_idbranches
residence_roomsجديدغرف الإقامة الداخلية (التنويم)name, start_time, end_time, floor_no, create_date, deletedfloor_nofloors.id
operations_rooms_calجديدسجل العملية في محرك التقويم (صف واحد للعملية) — يجمع غرفة العملية وغرفة الإقامة معاًroom_id, res_room_id, patient_id, patient_name, doctor_id, assistant_id, operation_type_id, date, start_time, end_time, res_start_time, res_end_time, cost, cost_details, instructions, for_husband, vip, notes, contacted_patient, contacted_user_id, sms_message, created_by, updated_by, created_at, updated_atroom_idoperations_rooms، res_room_idresidence_rooms، patient_idpatients، doctor_id/assistant_idawusers، operation_type_iddetections
operations_mainجديدرأس الحجز في المحرك القديم (الساعات) — يربط العملية بساعاتها ونوعهاdoctor_id, the_date, operation_types_id, operation_hours, residence_hours, operations_rooms_id, residence_rooms_id, create_dateoperations_rooms، →residence_rooms، →detections، →awusers
doctors_reservesجديدسطر حجز لكل ساعة في غرفة عملية (المحرك القديم)doctor_id, operations_room_id, hour_text, the_date, operation_type, operation_main_idoperation_main_idoperations_main، operations_room_idoperations_rooms
residence_reservesجديدسطر حجز لكل ساعة في غرفة إقامة (المحرك القديم)doctor_id, residence_room_id, hour_text, the_date, operation_type, operation_main_idoperation_main_idoperations_main، residence_room_idresidence_rooms
operation_dataجديد«بورد» تفاصيل العملية المرتبط بالزيارة (طاقم تخدير/تمريض ونتائج)visit_id, deleted (+ أعمدة الطاقم — استنتاج)visit_idvisits
detections (موسّع)معروف+توسعةيُعاد استخدامه كـ «أنواع العمليات» عبر for_operation=1أضيف: for_operation, operation_time, residence_time, operations_rooms, cost_details, instructions, sortoperations_rooms = قائمة معرّفات غرف مفصولة بفواصل أو -1 (الكل)
visits (موسّع)معروف+توسعةالزيارة هي حامل بيانات الإقامة الفعلية ودخول/خروج المريض من الغرفأضيف (استنتاج): for_department, room_no, res_room_no, bed_no, enterance, p_exit, res_enterance_date, res_p_exit, op_card_add, today_list, today_list_dept, in_clinicres_room_noresidence_rooms، room_nooperations_rooms
floorsمعروفالطوابق (السادس/السابع/الثامن مستخدمة فعلياً)id, name, deletedمرجع لـ floor_no
clinic_rooms / clinic_reservesجديدغرف وحجوزات العيادات (تستخدمها قائمة اليوم لتوزيع الأقسام والطبيب الحالي)today_list, room_id, reserve_day_no, reserve_hour, doctor_id, is_activevisits.today_list_dept، →awusers

دورة حياة الحجز (محرك التقويم — الأحدث)

  1. تحميل التقويم: index() يجهّز غرف العمليات والإقامة وأنواع العمليات والأطباء (دور 13).
  2. الموارد: rooms() وresidenceRooms() تُرجعان قائمة الغرف كـ JSON resources مرتّبة بالطابق.
  3. الأحداث: events() يقرأ operations_rooms_cal ضمن نطاق تاريخ، ويلوّن الحدث حسب الطابق/VIP، ويكشف التعارض بفحص تقاطع الأوقات في نفس الغرفة (لون أحمر عند التعارض).
  4. اختيار المريض: searchPatients() بحث حي في patients بالاسم أو رقم الملف statusno.
  5. الحفظ: saveOperation() ينشئ صفاً واحداً في operations_rooms_cal يحمل غرفة العملية وغرفة الإقامة معاً مع أوقاتهما والتكلفة والتعليمات والطبيب والمساعد.
  6. التعديل/الحذف: getOperation()/updateOperation()/removeOperation() (حذف فعلي عبر R::trash).
  7. التعبئة التلقائية: getOperationTime() يجلب من نوع العملية مدّتها ومدّة الإقامة والتكلفة والتعليمات لملء النموذج.

دورة حياة الحجز (المحرك القديم — الساعات)

  1. index(): اختيار نوع العملية والتاريخ.
  2. search(): بناء شبكة ساعات (خانات نصف ساعة) لكل غرفة عملية ضمن طابقها؛ الأخضر متاح، الأحمر محجوز (موجود في doctors_reserves)، الرمادي خارج ساعات الغرفة.
  3. residence(): شبكة ساعات لغرف الإقامة بعد ساعة نهاية العملية مباشرة، مع فحص residence_reserves.
  4. reserve(): ينشئ رأساً في operations_main ثم سطراً لكل ساعة في doctors_reserves ولكل ساعة إقامة في residence_reserves مربوطة بـ operation_main_id.
  5. removeRoom(): تفريغ الساعات المحجوزة (R::trash).

الإشغال اللحظي والتقارير

التسعير

التسعير يُحمل من نوع العملية: detections.detectionval (التكلفة) مع cost_details النصية وoperation_time/residence_time (المدد). عند الحفظ في التقويم تُنسخ القيم إلى operations_rooms_cal.cost وcost_details. لا يوجد محرك فوترة مستقل داخل هذه الوحدة — التكلفة وصفية ومرتبطة بنوع العملية فقط (استنتاج).

ملاحظات أمنية وتقنية

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

🧫

ملحق: معمل الأجنة والتجميد (MED: Embryology Lab & Cryo)

يوثّق هذا الملحق منظومة معمل الأجنة الكاملة (Full IVF wet-lab) المكتشفة في نسخة المركز/المستشفى med.greennature.com.sa، والتي كانت غائبة تمامًا عن النسخة الأصلية المحلّلة (312 جدولًا). النسخة الأصلية اكتفت بورقة سريرية مسطّحة واحدة ivfsheet وجداول السائل المنوي semen/icsisemen، بينما تضيف نسخة المركز سلسلة عمليات معمليّة متكاملة: سحب البويضات، زراعة الأجنة وتقييمها (Grading يوم 2→6)، تجميد الأجنة والحيوانات المنوية وإذابتها، ومخزون خزّانات النيتروجين (Tanks/Canisters/Positions) مع سجل سلسلة عُهدة (Chain of Custody) وشهادة طرفين (Witnessing).

7وحدات تحكّم معمليّة جديدة
~50جدول جديد مستنتَج
3أنماط خزّانات (200/100/300 خلية)
2نموذجا تخزين كرايو متوازيان

نطاق الملف ومصادر التحليل (Source Controllers)

نموذج مخزون الخزّانات (Cryo Tank Inventory)

يوجد نموذجان متوازيان للتخزين الكرايو يتحكّم في اختيارهما الإعداد programesetting.tanks_view (القيمة 1 أو 2)؛ ويُظهر الإعداد awusers.tanks_settings أزرار الخزّان لكل مستخدم.

النموذج الأول: شبكة ثلاثية المستوى لكل خزّان (tanks / tankcells)

عند إنشاء خزّان في tanks.php يُولِّد النظام كل الخلايا مسبقًا داخل حلقة ثلاثية حسب tank_type:

tank_typeالمستوى الأول up_level_nameالمستوى الثاني cell_nameالموضع cell_part_nameإجمالي الخلايا
1 (Cane)1..101..201..51000 (يُعرض كـ 20)
21..101..201..51000 (يُعرض كـ 100)
31..101..301..103000 (يُعرض كـ 300)

كل خلية tankcells تحمل patient_id؛ القيمة 0 تعني خلية فارغة. الحجز يتم بـ saveTankLabCell() الذي يضبط patient_id ويُسجّل في سجل العُهدة. العرض في cells() يجمع الامتلاء على ثلاثة مستويات (Level → Canister → Position).

النموذج الثاني: مواقع ثابتة بالألوان (tanks_general / embryoslab_tank_cells)

نموذج بديل (عندما tanks_view = 1) يقسّم الخزّان إلى موقعين location = "A"/"B"، كل موقع 21 زرًّا btn_no، وكل زر شبكة row_no/col_no/cell_no. تُخزَّن الخلية المحجوزة في embryoslab_tank_cells بمعرّف نصّي مركّب tank_cell = location_btn_row_col_cell (مثال A_3_2_1_4). جدول tanks_general يحمل 9 ألوان لكل صف (row1_color..row9_color) مرتبطة بجدول colors (الاسم color_name والحرف color_letter) لترميز المرضى بصريًا.

سلسلة العُهدة والشهادة (Chain of Custody & Witnessing)

سير العمل من البداية للنهاية (End-to-End Workflows)

  1. سحب البويضات OPUovumpickup: التاريخ، الاستشاري consultant، طبيب التخدير anaesthetist، التمريض nurse، العملية، علاج ما بعد العملية، المضاعفات. يصاحبه تقرير متابعة followup_operation (ut_cx, avf_rvf, easy_difficult, postoperative, complications).
  2. تحليل/معالجة السائل المنويembryologyreport (count, motility, morphology, sperm_source) ومراجع sperum_source, semen_process.
  3. إنشاء الورقة المعمليّةembryoslab برأس واحد لكل مريض (not_confirm=0 مسودّة → 1 مؤكَّدة)، مع وسط الزراعة media/oil/incubator (قوائم مفصولة بفواصل) وvisit_id.
  4. التقييم اليومي Gradingembryoscoring صف لكل جنين (itr) وأعمدة لكل يوم 1..6: media1..6, oil1..6, incubator1..6, embrologist1..6 + المرحلة stage والدرجة grade. عدد الصفوف يُشتق من عدد المخصّبات fertilizedData().
  5. اختيار الجنس/الانتقاءembryoselection (مرتبط بـ embryoslab_id، مراجع embryo_result, embryo_emb).
  6. الإرجاع ETembryotransfer (صف واحد لكل ورقة): clinician_id, embryologist_id, et_day + قسطرة/صعوبة/دم/مكان (embryocathetertype, embryodifficulty, embryoblood, embryojetplace, embryolah, embryotype). كما يوجد إرجاع مستقل embryotransferovum.
  7. تجميد الأجنةembryofreezingreport (no_of_straws, no_of_embryos, day_of_freezing, kit, device, lot_no, location) + صفوف embryo (6 مراحل/درجات لكل قشّة) + إذابة embryothawing (recovered, lost, e_t_date, cathetr).
  8. تجميد الحيوانات المنويةspermfreezingreport (count, motility, a_plus_b, morphology_abn, samples_no, freezing_media_id, freezing_protocol_id, purpose_of_freezing, color_of_pen, embryologist1/2, location).
  9. الحجز في الخزّان — ربط أي تقرير بموقع كرايو عبر أحد نموذجي التخزين، وتسجيل الحركة في tankcellhistory.

جدول الكيانات المستنتَجة (Inferred Entities)

الجدولجديد/معروفالغرضأهم الحقول المستنتجةالعلاقات
tanksجديدخزّان نيتروجينname, tank_type (1/2/3)1→N tankcells
tankcellsجديدخلية تخزين مُولَّدة مسبقًاtank_id, up_level_name, cell_name, cell_part_name, patient_id, created_atN→1 tanks, → patients
tankcellhistoryجديدسجل عُهدة الخلاياtank_id, cell_id, patient_id, action_type, done_date, by_user_idtankcells, awusers
tanks_generalجديدمواقع الخزّان البديلة بالألوانlocation(A/B), btn_no, rows_letter, row1_color..row9_colorcolors
embryoslab_tank_cellsجديدحجز خلية لورقة معمليّةembryoslab_id, location, btn_no, row_no, col_no, cell_no, tank_cell, user_id, date_add, userid_edit, date_edit, deletedN→1 embryoslab, → tanks_general
colorsجديدترميز لوني للمرضىcolor_name, color_letterمرجع لـ tanks_general
embryoslabجديدالورقة المعمليّة الرئيسيةpatient_id, visit_id, not_confirm, clinician_id, referred_dr_id, media, oil, incubator, injection_embrologist, icsi_by, embryologist_id, freeze_embryologist_id, cancelled, cancelled_user, dateأب لمعظم جداول المعمل
embryoscoringجديدتقييم الجنين يوم2→يوم6embryoslab_id, itr, stage/grade, media1..6, oil1..6, incubator1..6, embrologist1..6, deletedN→1 embryoslab, → stage,grade
embryoselectionجديدانتقاء/اختيار الجنينembryoslab_id, deletedembryo_result, embryo_emb
embryotransferجديدإرجاع الأجنة ET (من الورقة)embryoslab_id, clinician_id, embryologist_id, embryologist_id_tb, et_day, catheter/difficulty/blood/jet1→1 embryoslab
embryotransferovumجديدإرجاع مستقل (OPU flow)patientid, date, day, consultant, nurse, embryologist, no_of_embryos, quality, notespatients
ovumpickupجديدسحب البويضات OPUpatientid, date, consultant, anaesthetist, nurse, operation, postoperative, complicationspatients
followup_operationجديدمتابعة عملية الـ OPUpatient_id, nurse_id, anaesthetist_id, clinician_id, embryologist_id, ut_cx, avf_rvf, easy_difficult, postoperative, complications, datepatients, awusers
embryofreezingreportجديدتقرير تجميد الأجنةpatient_id, date, embryologist, ref_by_prof_dr, no_of_straws, no_of_embryos, day_of_freezing, kit, device, lot_no, location, completed, deleted1→N embryo, embryothawing
embryoجديدقشّة جنين مُجمَّدةembryofreezing_id, stage1..6, grade1..6N→1 embryofreezingreport
embryothawingجديدإذابة الأجنةembryofreezing_id, no_of_embryos, thawing_date, recovered, lost, e_t_date, embryos, grades, embryol_oigist, clinician, cathetrN→1 embryofreezingreport
spermfreezingreportجديدتقرير تجميد الحيوانات المنويةpatient_id, date, sperm_source, count, motility, a_plus_b, morphology_abn, samples_no, freezing_media_id, freezing_protocol_id, purpose_of_freezing, color_of_pen, embryologist1, embryologist2, locationfreezingmedia, freezingprotocol
embryologyreportجديدتحليل السائل المنوي المعمليpatient_id, date, sperm_source, count, motility, morphologypatients
freezingmedia / freezingprotocolجديدقوائم وسط/بروتوكول التجميدmedia / protocolمرجع لـ spermfreezingreport
stage / gradeجديدمراحل ودرجات الجنينstage / grade, deletedمراجع للتقييم والتجميد
growthmedia, growthoil, growthincubator, growthco2جديدقوائم بيئة الزراعةname, deletedمراجع لـ embryoslab/embryoscoring
oocytequality, oocytezona, oocytecytoplasm, oocytepvs, oocyteotherجديدقوائم تقييم البويضةname, deletedمراجع لـ embryoslab
embryocathetertype, embryodifficulty, embryoblood, embryojetplace, embryolah, embryotypeجديدقوائم الإرجاع ETnameمراجع لـ embryotransfer
embryo_device, embryo_result, embryo_emb, embryo_lot_select, embryo_catheter_select, embryo_tank, embryo_kit_typeجديدقوائم مساعدة للمعملname, deletedمراجع متفرّقة
embryologistجديدأخصائيو أجنة خارج المستخدمينname, deletedيُدمج مع awusers role 11
sperum_source, semen_processجديدقوائم مصدر/معالجة السائل المنويname, deletedمراجع لـ embryoslab
kit, device, cathetrجديدمستهلكات التجميد/الإرجاعkit / device / cathetr, deletedمراجع للتقارير
detectionsجديدتصنيف زيارات الأجنة (for_embryo)for_embryo, delيربط embryoslab.visit_id
ivfsheet, semen, icsisemenمعروفأوراق IVF السريرية الأصلية المسطّحةبديلة/سابقة لمنظومة المعمل الجديدة

ملاحظات على جودة البيانات والأمان (Data Quality & Security)

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

🔬

ملحق: جناح المناظير الموسع (MED: Extended Endoscopy Suite)

يوثّق هذا الملحق وحدة المناظير في نسخة المركز/المستشفى المكتشفة على med.greennature.com.sa. هذه النسخة توسّع نطاق نظام النساء والولادة الأصلي ليشمل مناظير الجهاز الهضمي (تنظير المعدة endoscopy وتنظير القولون colonoscopy) إلى جانب مناظير النساء (تنظير الرحم hystroscopic وتنظير البطن laparoscopic). الأهم أنها تعتمد محرّك «قوالب تقارير» (Template Engine) جديد كلياً يحل محل أسلوب جداول البحث المجزّأة (lapar* / copy*) المستخدم في النسخة الأصلية.

نظرة عامة على المكوّنات (Controllers)

تتكوّن الوحدة من سبعة Controllers تنقسم إلى ثلاثة أنماط معمارية مختلفة، جميعها يبني على إطار awframework ومكتبة RedBeanPHP (نمط R::dispense / R::findAll / R::getRow) مع عرض عبر Smarty.

7Controllers
14جدول جديد (NEW)
3أنماط قوالب مختلفة
2تخصص (نساء + جهاز هضمي)
3جداول بحث ديناميكية

محرّك القوالب: كيف يختلف عن النسخة الأصلية

في النسخة الأصلية (obgy ذات الـ312 جدولاً) كان كل حقل تشريحي في تقرير المنظار مرتبطاً بجدول بحث مستقل صغير (مثل laparpelvis, laparro, laparrt, copycavity, copycx, copyrostium ... عشرات الجداول)؛ أي «جدول لكل قائمة منسدلة». نسخة المركز تستبدل هذا النهج بثلاث آليات قوالب أنظف:

  1. قالب افتراضي واحد (GI): الجدول endoscopy_template / colonoscopy_template يحوي صفاً واحداً (id = 1) فيه نص افتراضي لكل قسم تشريحي. عند فتح نموذج الإضافة يُمرَّر template_data إلى Smarty فتُملأ الحقول مسبقاً بالقيمة الطبيعية، ويعدّلها الطبيب عند الحاجة. القالب يدير أيضاً ترويسة/تذييل الطباعة (header_print, footer_print عبر uploadupdate).
  2. بنك قوالب مُسمّاة (Gyne): laparoscopic / hystroscopic يخزّنان عدة صفوف، كل صف قالب كامل باسم template_name. واجهة oscopic تعرضها في قائمة select؛ وعند تغيير الاختيار يستدعي oscopic.js الإجراء ac=render الذي ينفّذ R::getRow('select * from laparoscopic where id = ?') ويعيد JSON، فيُحقَن في حقول الفورم عبر jQuery .val().
  3. قوائم بحث ديناميكية بدلاً من جداول ثابتة: في oscopic.php توجد دوال عامة (addToTable, editModal, updateModal, deleteModelItem) تستقبل اسم الجدول كمعامل (table_name من POST) وتدير صفوف oscopic_operations / oscopic_required_examinations / oscopic_specimens مع حذف منطقي (deleted = 1). هذا يحوّل «عشرات جداول البحث الثابتة» إلى جداول قليلة قابلة للإدارة من الواجهة.

ملاحظة أمنية دوال addToTable / updateModal / deleteModelItem تمرّر اسم الجدول واسم العمود مباشرة من POST إلى RedBean دون قائمة بيضاء — يجب تقييدها عند الترحيل (خطر تعديل جداول غير مقصودة). خطأ مرصود في oscopic.js (السطور 19-20) يُملأ left_ovary وleft_ovary_procedures من response.right_ovary بدل القيم اليسرى (خطأ نسخ-لصق).

مسار العمل الكامل (تنظير المعدة كمثال) (end-to-end flow)

  1. إعداد القالب: المدير يفتح endoscopy_template.php?ac=index → يحرّر النصوص الافتراضية وترويسة/تذييل الطباعة → update() يخزّن في endoscopy_template (id=1).
  2. إنشاء تقرير: endoscopy.php?ac=index&patientid= يحمّل بيانات المريض + يحسب العمر من dateofbirth + يجلب الطبيب المُحوِّل من awusers + يمرّر template_data فتُملأ الحقول التشريحية مسبقاً.
  3. الحفظ: ac=addR::dispense('endoscopy') يخزّن كل الأقسام (esophagus, stomach, pylorus, duodenum ...) مع patient_id وexam_date.
  4. الصور: ac=uploadImage ثم ac=upload يرفع إلى upload/endoscopy/ ويخزّن في endoscopy_images (مرتبط بـ endoscopy_id + patient_id).
  5. العرض/التعديل/الحذف: show / edit / update / del على الجدول endoscopy.
  6. الطباعة: ac=printReport يدمج سجلّ المريض + بيانات القالب (ترويسة/تذييل) + الصور في print.html.tpl.

جدول الكيانات المستنتجة (inferred from RedBeanPHP & raw SQL)

الجدولجديد/معروفالغرضأهم الحقول المستنتجةالعلاقات
endoscopyجديدتقرير تنظير معدة لمريضpatient_id, exam_date, indication, anesthesia, procedure, esophagus, cardio_esophageal_junction, stomach, pylorus, duodenum, conclusion, signature, created_at, updated_atpatients (patient_id)
endoscopy_templateجديدقالب افتراضي واحد (id=1) لتنظير المعدة + ترويسة/تذييل طباعةنفس الأقسام التشريحية + header_print, footer_print, updated_atمصدر القيم المسبقة لـ endoscopy
endoscopy_imagesجديدصور المنظارimage, patient_id, endoscopy_id, create_dateendoscopy, patients
colonoscopyجديدتقرير تنظير قولون لمريضpatient_id, exam_date, indication, consent, preparation, instrument, anesthesia, procedure, preparation_2, withdrawal_time, dre, findings, plan, signature, created_at, updated_atpatients
colonoscopy_templateجديدقالب افتراضي واحد (id=1) لتنظير القولوننفس حقول colonoscopy (بلا patient) + header_print, footer_printمصدر القيم المسبقة لـ colonoscopy
colonoscopy_imagesجديدصور تنظير القولونimage, patient_id, colonoscopy_id, create_datecolonoscopy, patients
laparoscopicجديدبنك قوالب مُسمّاة لتنظير البطن (نساء)template_name, entry(_procedures), uterus(_procedures), right_tube(_procedures), left_tube(_procedures), right_ovary(_procedures), left_ovary(_procedures), uterosacrals(_procedures), peritoneum(_procedures), recommendationsقالب يُحقَن في patient_laparoscopic
hystroscopicجديدبنك قوالب مُسمّاة لتنظير الرحم (نساء)template_name, entry(_procedures), external_os, cervical_canal, internal_os, uterine_cavity, endometrium, right_ostium, left_ostium, other (+ *_procedures), recommendationsقالب يُحقَن في patient_hystroscopic
patient_laparoscopicجديدتقرير تنظير بطن مطبَّق على مريض فعليحقول laparoscopic + patient_id, created_at, template_id, diagnosis (CSV), diagnosis_textpatients, laparoscopic (template_id), diagnosis
patient_hystroscopicجديدتقرير تنظير رحم مطبَّق على مريض فعليحقول hystroscopic + patient_id, created_at, template_id, diagnosis (CSV), diagnosis_textpatients, hystroscopic, diagnosis
oscopic_reportجديدتقرير عمليات/منظار موحّد للمريض (يدعم الزوج أيضاً)patient_id, created_at, diagnosis (CSV), operation_id, operation_text, required_examination_id, required_examination_text, specimen_id, specimen_text, diagnosis_text, husbandpatients, diagnosis, جداول البحث الثلاثة
oscopic_operationsجديدقائمة بحث ديناميكية للعملياتname, deletedتُدار عبر addToTable/editModal
oscopic_required_examinationsجديدقائمة بحث ديناميكية للفحوص المطلوبةname, deletedتُدار عبر الدوال العامة
oscopic_specimensجديدقائمة بحث ديناميكية للعيّناتname, deletedتُدار عبر الدوال العامة
diagnosisمعروفقائمة التشخيصات المشتركة (تُفلتر بـ conditions = 0)name, conditionsمشترك مع باقي النظام
patients / awusersمعروفالمرضى والمستخدمون/الأطباءdateofbirth, refer_doctor, doctor1, h_doctor1, husbanddateofbirth / user_idمرجع لكل التقارير

مقارنة: النهج القديم مقابل نهج المركز

المحورالنسخة الأصلية (obgy)نسخة المركز (med)
تخزين القوائم التشريحيةجدول لكل حقل: laparpelvis, laparro, laparrt, copycavity, copycx, copyrostium ... (عشرات الجداول)صف قالب واحد كامل (template_*) أو بنك قوالب مُسمّاة + 3 جداول بحث ديناميكية
التخصصنساء وولادة فقط (laparoscopy, hysteroscopy)نساء + جهاز هضمي (معدة endoscopy، قولون colonoscopy)
تعبئة الفورمقوائم منسدلة من جداول بحث ثابتةتعبئة مسبقة من القالب (Smarty) أو حقن AJAX (ac=render → JSON)
الطباعةقوالب طباعة ثابتةترويسة/تذييل قابلة للرفع لكل نوع منظار (header_print/footer_print)

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

☢️

ملحق: عيادة الذكورة وقسم الأشعة (MED: Andrology Clinic & Radiology Dept.)

يوثّق هذا الملحق ما رصدناه في النسخة الأحدث المنشورة على med.greennature.com.sa (مجلد /med) والمهيّأة كمركز/مستشفى، وهي مكوّنات غير موجودة في النسخة الأصلية ذات الـ312 جدولًا. تُقدّم هذه النسخة عيادة ذكورة مستقلة بالكامل لها زياراتها وتاريخها المرضي وفحصها السريري الخاص (بخلاف النسخة الأصلية التي اقتصرت على تحاليل السائل المنوي والهرمونات داخل شيت العقم فقط)، إضافة إلى قسم أشعة مركزي يعمل بمسار طلب ← تنفيذ ← تقرير ورفع صور. كل أسماء الجداول المذكورة هنا تمّت مطابقتها مع قائمة الجداول الأصلية وتأكّد أنها جديدة ما لم يُذكر خلاف ذلك. كل ما لم نتمكّن من تأكيده من الكود مباشرة موسوم بـ«(استنتاج)».

6كنترولر مرصود
21+جدول جديد
2مسار عمل (Workflow)
3مستفيدون للطلب (زوج/زوجة/طفل)

أولًا: عيادة الذكورة المستقلة (Dedicated Andrology Clinic)

في النسخة الأصلية كان الجانب الذكوري مجرد جداول لتحاليل السائل المنوي (semen, semen2, icsisemen, ssemen) والهرمونات داخل شيت العقم. أما هنا فقد أصبحت عيادة ذكورة كاملة بثلاث شاشات سريرية مرتبطة بنفس المريض (patientid) عبر ثلاثة كنترولر: and_visits, and_history, and_examination، تُكتب جميعها عبر RedBeanPHP في جداول جديدة بادئتها and*.

مسار عمل زيارة الذكورة (نهاية لنهاية)

  1. اختيار المريض ثم فتح and_visits.php?patientid=… ← تحميل كل التشخيصات/الشكاوى والأشعة والتحاليل المرجعية.
  2. إضافة صف زيارة جديد (newrowR::dispense('andvisits')) ثم تحرير الحقول inline عبر update (تحديث عمود واحد لكل نداء).
  3. طلب أشعة (addray → صفوف في andvisitsrays) و/أو تحاليل (addinvestigationandvisitsinvestigation مع دعم باقات الفحوصات invoffer/invofferdetails) و/أو روشتة (andvisitsdrugs).
  4. إدخال سونار/سائل منوي/فحص جيني كصفوف منفصلة، ثم الطباعة لكل من الزوج/الزوجة حسب forhusband.
  5. حذف منطقي لأي سجل عبر del (تعيين deleted = 1).

ثانيًا: قسم الأشعة المركزي (Radiology Department Workflow)

كنترولر raysdept يمثّل قسم أشعة قائمًا بذاته (for_department = 5) يعمل بمنطق طابور عمل المستشفى عبر جدول visits المشترك. الطلب يُنشأ كزيارة موجّهة للقسم، ثم تُنشأ صفوف نتائج في الجدول الجديد raysresults، يُنفّذها فنّي القسم بإدخال النتيجة ورفع الصور، ثم تُؤرشَف.

  1. الطلب (Order): newvisitsavenewvisit يُنشئ صف visits بـfor_department = 5 ثم يستدعي sendToDept الذي يولّد صفًا في raysresults لكل أشعة مختارة (rayid, visitid, patientid, doctorid = 0, status = 0, forhusband). يدعم أيضًا «الطلب الداخلي» (raytype = 1) الذي يربط نتيجة الأشعة بسجل في جدول داخلي آخر عبر internaltable/internalrequestid.
  2. قائمة العمل (Worklist): index يجلب طلبات اليوم غير المنجَزة (status = 0) عبر JOIN بين raysresults وvisits وpatients وpatients_childs، ويميّز المستفيد: زوج/زوجة/طفل (for_husband = 1/0/2).
  3. التنفيذ والتقرير (Perform & Report): showdetails يعرض صفوف الأشعة للزيارة، وupdate يكتب نص التقرير في rayresult ويضبط تاريخ النتيجة وdoctorid؛ وإذا كان طلبًا داخليًا يُحدِّث الجدول الداخلي المرتبط أيضًا.
  4. الصور: upload (صورة واحدة في raysresults.rayimg) وuploadMulti (عدة صور في الجدول الجديد raysresults_img المرتبط بـraysresults_id)، مع حذف فعلي للملفات من upload/rayimg.
  5. الإنهاء والأرشفة: finishRequest يضبط status = 1 لكل صفوف الزيارة، وarchive يعرض المؤرشف، وprintresults يطبع التقرير النهائي مع تحديد الطبيب المُحوِّل (refer_doctor أو for_doctor من آخر زيارة).

ثالثًا: ملاحظة حول radiation.php

رغم اسمه، فإن كنترولر radiation.php ليس قسم علاج إشعاعي بل اسمه الداخلي instruction ويعمل على جدول instruction (معروف من النسخة الأصلية) لإدارة تعليمات المرضى وخطابات التحويل بين المستشفيات. يستخدم جداول operationinstructions (جديد) وhospitalnames (معروف) ويولّد خطاب تحويل يجمع التاريخ الولادي/المرضي/الجراحي للمريضة. أُدرج هنا للتوضيح أنه لا علاقة له بقسم الأشعة التشخيصية أعلاه.

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

الجدولجديد/معروفالغرضأهم الحقول المستنتجةالعلاقات
andvisitsجديدزيارة عيادة ذكورة (شكوى/تشخيص متعدد)patientid, doctorid, date, complaint, complaintid (CSV), diagnosisid (CSV), diagnosistxt, deletedpatients عبر patientid، awusers عبر doctorid، anddiagnosis/andcomplaint عبر CSV
andhistoryجديدالتاريخ العام لمريض الذكورةpatientid, doctorid, durationid, fertile, fertiletype, marriage, smoking, smokinglevel, inflammation, trauma, stopped, abortionno, notes, deletedpatients، infertileduration عبر durationid
andexaminationجديدالفحص السريري الثنائي الجانبpatientid, doctorid, date, testesl/testesr, epidl/epidr, cordl/cordr, vasl/vasr, notes, deletedpatients، awusers
andmedicalproblemsجديدالأمراض الطبية المصاحبةpatientid, diseaseid, date, deletedmedicaldisease (معروف) عبر diseaseid
anderectionجديدمشاكل الانتصابpatientid, diseaseid, date, deletederectiondisease عبر diseaseid
andejaculationجديدمشاكل القذفpatientid, diseaseid, date, deletedejaculationdisease عبر diseaseid
andcontraceptionجديدوسائل منع الحمل المستخدمةpatientid, typeid, date, deletedandcontratype عبر typeid
andcontratypeجديدقائمة مرجعية لأنواع منع الحملname, deletedتُقرأ من andcontraception.typeid
infertiledurationجديدقائمة مرجعية لمدد العقمname, deletedتُقرأ من andhistory.durationid
erectiondiseaseجديدقائمة مرجعية لأمراض الانتصابname, deletedتُقرأ من anderection.diseaseid
ejaculationdiseaseجديدقائمة مرجعية لأمراض القذفname, deletedتُقرأ من andejaculation.diseaseid
anddiagnosisجديدقائمة مرجعية لتشخيصات الذكورةname, deletedتُقرأ من andvisits.diagnosisid (CSV)
andcomplaintجديدقائمة مرجعية لشكاوى الذكورةname, deletedتُقرأ من andvisits.complaintid (CSV)
andvisitssemenجديدتحليل سائل منوي مرتبط بزيارة الذكورةpatientid, doctorid, date, conc, nf (حركة), ph, viscosity, aggl, vol, pus, deleted (استنتاج للأسماء من العرض)patients، awusers
andvisitsgenetictestingجديدفحص جيني (كروموسومي + AZF)patientid, doctorid, date, chromosome (1/2), azf (1/2), deletedpatients، awusers
andvisitsusجديدسونار ذكوريpatientid, doctorid, date, lfolliclesno/rfolliclesno, حقول الرحم/المبيض المُعاد استخدامها, deletedandvisitsficils عبر andvisitsusid
andvisitsficilsجديدبصيلات السونار الذكوريandvisitsusid, name, length, width, volume, type (0/1), sysdateandvisitsus عبر andvisitsusid
andvisitsdrugsجديدروشتة دوائية لزيارة الذكورةpatientid, doctorid, date, drugid, forhusband, deleteddrugs عبر drugid
andvisitsraysجديدطلب أشعة من زيارة الذكورةpatientid, doctorid, date, rayid, forhusband, deletedrays عبر rayid
andvisitsinvestigationجديدطلب تحاليل من زيارة الذكورةpatientid, doctorid, date, investid, offer_id, forhusband, deletedinvests، invoffer عبر offer_id
raysجديدكتالوج عناصر الأشعةname, rayscatid, price, range, favorite, deletedrayscats عبر rayscatid
rayscatsجديدفئات الأشعةname, displayorder, deletedأب لـ rays
raysresultsجديدسجل تنفيذ/تقرير طلب الأشعة (قلب طابور القسم)visitid, patientid, rayid, raytype, internaltable, internalrequestid, rayresult, rayimg, doctorid, status (0/1), forhusband, date, deletedvisits عبر visitid، rays عبر rayid، raysresults_img
raysresults_imgجديدصور متعددة لنتيجة الأشعةraysresults_id, rayimg, deletedraysresults عبر raysresults_id
investigationresultsجديدنظير raysresults لقسم التحاليل (department 12)visitid, patientid, investid, invtype, internaltable, internalrequestid, doctorid, forhusband, date, deletedvisits، invests
patients_childsجديدأبناء المريضة كمستفيد ثالث للطلبchild_name, gender (استنتاج)تُربط بـvisits.child
operationinstructionsجديدتعليمات العمليات لخطاب التحويلinsttext, deletedتُستخدم في radiation.php (instruction)
invoffer / invofferdetailsجديدباقات الفحوصات وتفاصيلهاactive, del / invoffer_id, inv_id, price, delinvests عبر inv_id
medicaldisease, instruction, hospitalnames, visits, invests, investcats, detectionsمعروفجداول أصلية أُعيد استخدامها (المرض المرجعي، التعليمات، المستشفيات، الزيارات، التحاليل، الكشوف)موجودة في النسخة الأصلية ذات الـ312 جدولًا

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

🌐

ملحق: الفروع والمناطق ومزامنة الـ 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

📞

ملحق: تشغيل العيادات وخدمة العملاء والرضا (MED: Clinic Ops, Customer Service & Vote)

هذا الملحق يوثّق وحدات لم تكن موجودة في النسخة المُحلَّلة (312 جدولاً) وظهرت في النسخة الأحدث المنشورة على med.greennature.com.sa والمُهيّأة كمركز/مستشفى متعدد العيادات والفروع. يغطّي: تشغيل العيادات (الغرف والجداول الأسبوعية وشاشة استقبال المرضى)، وحدة خدمة العملاء (قياس أداء الأطباء وزمن الانتظار والشكاوى)، حملات الرسائل النصية SMS والروابط المختصرة، إقرارات وموافقات المرضى، تتبّع الأرشيف بالأجهزة (دخول/خروج الملفات)، ملخّص الحالة، وتطبيق التصويت/قياس رضا العملاء عبر أكشاك بلوحة مفاتيح عربية. كل الاستنتاجات مبنية على قراءة الكود فقط (RedBeanPHP وعبارات SQL وقوالب Smarty) دون أي اتصال بقاعدة البيانات الحيّة.

نطاق الملف والتغيّر عن النسخة القديمة (Scope & delta)

النسخة الجديدة تحوي ~70 متحكّماً (controller) غير موجود في النسخة المُحلَّلة، وأُزيل منها ~20 متحكّم قديم من نوع «الشيتات» (sheet controllers). الوحدات المغطّاة هنا جديدة بالكامل وتعتمد على جداول لم ترد في الـ dump الأصلي. تظهر هذه الوحدات إضافة طبقة «تشغيل المركز» و«تجربة العميل» فوق نواة OB/GYN الأصلية.

9متحكّمات نطاق العيادات/الخدمة/SMS/الإقرارات/الأرشيف
+18جدول جديد (استنتاج) خارج الـ 312
6جداول لتطبيق التصويت vote
2مزوّدا SMS خارجيان (smsmisr + naslab)

١. تشغيل العيادات والحجز (Clinic Ops & Reservation)

المتحكّم reserve_clinic.php يبني جدولاً أسبوعياً (٧ أيام × ساعات بين programesetting.start_hour وend_hour) لربط الأطباء بالغرف. الغرف في clinic_rooms والحجوزات المتكرّرة أسبوعياً في clinic_reserves (يوم في الأسبوع reserve_day_no 1=السبت..7=الجمعة + ساعة reserve_hour + طبيب doctor_id). يدعم وضعَين أفقي/رأسي (h_version/v_version) وتعدّد الفروع branches حسب programesetting.branches/rooms. الإلغاء منطقي عبر cancel_date+deleted.

المتحكّم clinic_visits.php هو شاشة استقبال المريض داخل العيادة: لكل غرفة نشطة يعرض الأطباء المحجوزين لليوم وزياراتهم اليوم، ويسمح بتسجيل دخول المريض للعيادة (visits.clinic_entered=1) وخروجه (visits.clinic_out=1).

المتحكّم visits00.php هو نسخة موسّعة من تدفّق الزيارة: يوجّه الزيارة إلى قسم/طبيب (for_department/for_doctor) ويربطها بحجز عيادة (reserveId عند القسم 13)، ويرسلها لقوائم أقسام محدّدة (sendToDept/removeFromDept للأقسام 5 و12). هذه الحقول (clinic_entered, clinic_out, arrived_time, arrived_userid, enc_id, visit_order, visit_time, rfc, branch_id) أعمدة جديدة أُضيفت إلى جدول visits المعروف (استنتاج من الاستعلامات).

  1. الحجز الأسبوعي: تعيين طبيب لغرفة في يوم/ساعة عبر reserveClinic() ← صف في clinic_reserves.
  2. إنشاء زيارة وتوجيهها لقسم/طبيب (وربما حجز عيادة) عبر visits00.php.
  3. وصول المريض: تسجيل arrived_time (من خدمة العملاء) ثم دخول العيادة clinic_entered.
  4. الخروج: clinic_out ويُحتسب زمن الانتظار = الفرق بين arrived_time وkashf_enterance.

٢. خدمة العملاء (Customer Service)

المتحكّم customer_service.php يخدم ثلاث وظائف: (أ) عرض الأسعار (دمج detections+invests/investcats+rays/rayscats)؛ (ب) لوحة أداء الأطباء: عدّ الزيارات والمؤكَّدة (customer_add!=1) والمحضورة (view=1) لكل طبيب/قسم/فرع مع متوسّط زمن الانتظار؛ (ج) تسجيل وصول المريض arrivedHos() (arrived_time/arrived_userid). يدعم تقييد الطبيب المرتبط (related_dr للدور 19) وطباعة يومية مفصّلة.

إدارة الشكاوى عبر جدول جديد patients_complaints: نص الشكوى complaiv والرد reply ووقت الاتصال call_date_time والموظّف user_id والمريض patientid، مع حذف منطقي deleted وصلاحيات أزرار (awrolebtn btn 5/6).

٣. حملات الرسائل النصية والروابط المختصرة (SMS Campaigns & Short URLs)

المتحكّم sms_control.php يُعرّف قوالب الرسائل في جدول جديد sms_control (الاسم، نوع الرسالة message_type 1..5، مكان الإرسال message_place، اسم المرسِل sender_name، الرابط الثابت/الإنجليزي fixed_link/en_link، الأقسام المستهدَفة for_depts بقيمة -1 = الكل). الإعدادات العامة في sms_control_setting (server_type). المنطق الفعلي في visits_common.php:

  1. sendSms($sourceId, $messagePlace) يُستدعى من visits.php/patients.php/operations_reports.php عند أحداث (تسجيل مريض/حجز زيارة).
  2. يجلب هاتف المريض (patients.phone/mobile/hus_mobile) والقوالب المفعّلة لمكان الإرسال، ويتحقق من القسم المسموح به (allowedDept).
  3. يبني النص حسب النوع: رسالة فقط / + رابط / + اسم المريض / + رابط مختصر للزيارة (يولّد enc_id فريداً للزيارة وshort_urls).
  4. الإرسال عبر مزوّد sms.naslab.gt4it.com (دالة sendItSmsApi) أو القديم smsmisr.com (دالة sendItSms).
  5. عند server_type=1 يدفع تفاصيل الزيارة إلى موقع خارجي عبر prepareToSite/sendToSite (royal-fc.net/appv/visit_details).

تنبيه أمني الملف sms_sample.php يحوي بيانات اعتماد SMS مكتوبة بشكل ثابت (username/password/sender لـ smsmisr)، كما يوجد توكن Bearer ثابت لمزوّد naslab داخل visits_common.php. يجب نقلها إلى أسرار بيئية وتدويرها.

٤. الإقرارات وموافقات المرضى (Declarations & Consents)

decleration.php يدير قوالب الإقرارات/الموافقات (جدول جديد decleration: title, content, doctor_id/doctor_name, husband/wife/reception). وpatientdecleration.php يربط إقراراً موقَّعاً بمريض (جدول جديد patientdecleration: decleration_id, patientid, uploadfile = ملف ممسوح ضوئياً في upload/decleration_files, user_id, date) مع طباعة منسّقة لبيانات المريض والطبيب وإعدادات المركز.

٥. ملخّص الحالة (Case Summary)

المتحكّم case_summary.php هو مجمِّع للقراءة فقط: يدمج عشرات الجداول السريرية (سجلّ النساء/الولادة والتاريخ المرضي ph*) في تقرير حالة واحد. معظم مصادره جداول معروفة، لكنه يستدعي جداول جديدة في النسخة الموسّعة مثل obstetric_case/obstetric_case_ex, summary_obstetric/summary_obstetric_abortion, previous_pregnancies, previous_puerperium, pre_anaesthetic, blood_transfusion, complaint_analysis, recommend, symptoms (استنتاج — تنتمي لشيتات سريرية موسّعة خارج هذا النطاق).

٦. تتبّع الأرشيف بالأجهزة (Archive Tracking by Devices)

المتحكّم archive.php يستخدم دوال visits_common.php لتتبّع حركة ملفات/مرضى المركز عبر أجهزة قراءة موزّعة. عند مسح رقم المريض على جهاز (devices.location: 4=دخول، 5=خروج) يُسجَّل صف في جدول جديد archive_tracking (patient_id, in_date/in_time/in_device_id, out_date/out_time/out_device_id, receiver, notes, control) مع موقع الطابق من floors عبر devices.floor_no. يوازيه تتبّع عام في device_tracking (معروف). يوفّر بحثاً بالمريض أو بالتاريخ، وقائمة «خرج ولم يعد».

٧. تطبيق التصويت / رضا العملاء (Vote / Satisfaction Kiosk)

تطبيق مستقل تحت /med/vote يعمل كأكشاك رضا بلوحة مفاتيح عربية (kioskboard 2.2 + jQKeyboard). كل جهاز vote_devices (name, local_ip) مرتبط باستبيان votes، ويُنسَب التصويت إلى الموظّف المسجَّل دخوله من نفس الـ IP عبر login_tacking (جلب آخر user_id بـ login_ip وstatus=1). الإدارة في النواة عبر vote.php وvote_devices.php.

  1. تهيئة جهاز (vote_devices) ثم بناء استبيان (votes) بأسئلة (vote_questions) وإجابات (vote_answers تحمل وجهاً تعبيرياً face وعلَم send_mail).
  2. المريض/العميل على الكشك يفتح ?ac=vote&device=ID فيُتحقَّق من وجود الجهاز وتسجيل دخول الموظّف.
  3. يُدخِل اسمه/هاتفه (إن كان votes.voter_required) ويختار الوجوه/الإجابات.
  4. الحفظ في clients_votes (الجهاز، الاستبيان، الموظّف، اسم/هاتف المُصوِّت، IP المحلي/البعيد، user_agent) وتفاصيل كل إجابة في clients_votes_answers (question_id, answer_id, answer_face, answer_text).
  5. إعادة التوجيه إلى صفحة شكر thank_you.

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

الجدولجديد/معروفالغرضأهم الحقول المستنتجةالعلاقات
clinic_roomsجديدغرف/عيادات المركزname, clinic_no, today_list, branch_id, dept_id, is_active, deletedbranches
clinic_reservesجديدجدول حجز الأطباء أسبوعياً للغرفroom_id, doctor_id, reserve_day_no, reserve_hour, start_date, cancel_date, is_active, deletedclinic_rooms, awusers
visits (أعمدة جديدة)معروف+أعمدة تشغيل العيادة على جدول الزياراتclinic_entered, clinic_out, arrived_time, arrived_userid, kashf_enterance, enc_id, visit_order, visit_time, rfc, branch_id, customer_add, view, for_department, for_doctorpatients, awrole, awusers
patients_complaintsجديدشكاوى/ردود خدمة العملاءpatientid, complaiv, reply, call_date_time, user_id, deletedpatients, awusers
sms_controlجديدقوالب رسائل SMS وحملاتهاname, message, message_type, message_place, sender_name, fixed_link, en_link, for_depts, status, deletedawrole (for_depts)
sms_control_settingجديدإعدادات بوابة SMS العامةserver_type
short_urlsجديدروابط مختصرة لروابط الرسائلorigin_url, short_url, create_date← يُستخدم في رسائل الزيارة
visits_siteجديد (استنتاج)دفع تفاصيل الزيارة لموقع خارجيعبر API royal-fc.net (لا يُخزَّن محلياً غالباً)visits
declerationجديدقوالب الإقرارات/الموافقاتtitle, content, doctor_id, doctor_name, husband, wife, reception, dateawusers
patientdeclerationجديدإقرار موقَّع لمريضdecleration_id, patientid, uploadfile, user_id, datedecleration, patients
fastoptionsجديدروابط سريعة في الواجهةlabel, link
archive_trackingجديدتتبّع دخول/خروج ملف المريض بالأجهزةpatient_id, in_date/in_time/in_device_id, out_date/out_time/out_device_id, target_id, target_table, receiver, notes, control, user_id, deletedpatients, devicesfloors
vote_devicesجديدأجهزة أكشاك التصويتname, local_ip, created_at, updated_atlogin_tacking.login_ip
votesجديداستبيان رضا لكل جهازvote_device_id, voter_required, email, role_id, created_at, updated_atvote_devices, awrole
vote_questionsجديدأسئلة الاستبيانvote_id, question, created_at, updated_atvotes
vote_answersجديدخيارات الإجابة بوجوه تعبيريةvote_question_id, answer, face, send_mail, created_at, updated_atvote_questions
clients_votesجديدتصويت العميل المُسجَّلvote_device_id, vote_id, user_id, voter_name, voter_phone, ip/local_ip/remote_ip, user_agent, is_contact, reply, created_atvotes, vote_devices, awusers
clients_votes_answersجديدإجابات تصويت العميلclient_vote_id, question_id, answer_id, answer_face, answer_text, user_id, created_atclients_votes, vote_questions/vote_answers
login_tackingجديدتتبّع جلسات الدخول بالـ IP (لنسبة التصويت للموظّف)login_ip, user_id, status, idawusers

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

🧾

ملحق: المخازن والمالية الموسعة والأجهزة (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

⚖️

ملحق: ماذا تغيّر في النواة المشتركة — إعدادات أم نسخة أحدث؟ (MED: Shared-Core Diff — Settings or Fork?)

يجيب هذا الملحق على سؤال المالك المباشر: هل نسخة med.greennature.com.sa هي «نفس البرنامج بإعدادات مختلفة»، أم نسخة أحدث (Fork) فيها تباعد فعلي في الكود؟ تمت المقارنة آليًا عبر diff -qr بين obgy/core/controllers وmed/core/controllers، مع مقارنة تفصيلية لخمسة كنترولرات أساسية وفحص ملف الإعدادات aw_config.php ومنظومة programesetting والقوائم، لتحديد ما هو مدفوع بالإعدادات (config-driven) وما هو مكتوب صلبًا في الكود (hard-coded).

الحكم النهائي بالأرقام

النتيجة: نسخة أحدث (Fork) وليست مجرد إعدادات. نعم النواة الإطارية (framework core) واحدة، ونعم MED تعتمد بكثافة على مفاتيح إعدادات لإظهار/إخفاء الوظائف — لكن تلك المفاتيح تتحكم في مسارات كود جديدة كليًا غير موجودة في OBGY إطلاقًا. التباعد بنيوي وليس تجميليًا.

77 → 134عدد الكنترولرات (OBGY ← MED)
57ملف مشترك بالاسم
21مشترك ومتطابق تمامًا
36مشترك لكنه مُعدَّل (Differ)
21أُزيل في MED
78أُضيف في MED

دليل «نسخة أحدث» قاطع: تبعيات Composer جديدة

OBGY لا يحتوي إطلاقًا على composer.json ولا مجلد vendor/. أما MED فيبدأ ملف إعداداته بـ require_once __DIR__ . '/../vendor/autoload.php' ويستورد Monolog\Logger وPsr. هذه تبعيات مُدارة عبر Composer لا يمكن «تفعيلها بإعداد» — وجودها يثبت أن MED بُنيت على سلسلة أدوات (toolchain) أحدث. كما تغيّر R::freeze والمنطقة الزمنية (Cairo بدل Los Angeles) وقاعدة البيانات (medgreennatureco_med).

أين هو «نفس البرنامج» فعلًا (تطابق أو فروق تجميلية)؟

أين هو «التباعد الحقيقي» (Fork)؟

الملفات المشتركة الكبيرة تضخّمت ضِعفيًا إلى خمسة أضعاف، وهذا انفجار في حجم الكود لا يفسّره أي إعداد:

الملف المشتركOBGY أسطرMED أسطرأسطر مضافة / محذوفةالدلالة
visits.php19469660+8599 / -88565 → 220 دالة؛ +155 دالة جديدة (مختبر، باركود، فوترة PDF، تكامل ERP)
patients.php22594157+2332 / -43477 → 127 دالة (فروع، منظمات، أرقام ملفات تنظيمية)
_member.php3561018كبيرمزامنة الأطباء مع ERP (addAllDoctorsToERP, curlAddDoctor)
_role.php598991كبيرصلاحيات أوسع (قوائم مستخدم منفصلة)
antenalvisit.php13611756+395حقول/مسارات إضافية للزيارة قبل الولادة
_sidebar.php160361+241 / -40قائمة جانبية ثانية (userMenuSidebar) وفلترة بنمط النموذج
programesetting.php296376+177 / -97+44 مفتاح إعداد جديد + جدولا إعدادات جديدان
setup.php225354+149دوال ERP (geterpVisaAccounts, saveERPDBVisaAccount) وtablesToClean

الجزء «المدفوع بالإعدادات» — لكنه يقود كودًا جديدًا

منظومة programesetting في MED أصبحت مركز تحكّم بالميزات: أضافت 44 عمودًا/مفتاحًا جديدًا لم يكن لها أي أثر في OBGY، إضافة إلى جدولي إعدادات جديدين programesettingex وprogramesettinglab وجدول أعمدة ديناميكي programesetting2. أمثلة على المفاتيح: system_type، branches، regions، organizations، advance_payment، surgeon، rooms، ovum_tab، embro_tab، tanks_view، whatsapp_sms، national_id_req، barcode_print، refer_doctor، printserial. كل مفتاح يُظهر/يُخفي وظيفة، لكن الوظيفة نفسها كود جديد لا وجود له في النسخة المُحلَّلة. أي: «config-driven» نعم، لكن فوق قاعدة كود مُتفرّعة.

القوائم الجانبية تبقى مدفوعة من قاعدة البيانات عبر awmenu (مع فلترة بـ programesetting.simpleview ونمط النموذج form in (0,1,2))، أي إن البنية الإطارية للقوائم لم تتغيّر — لكن MED أضافت فوقها قائمة مستخدم ثانية.

الكنترولرات الـ21 المُزالة واستبدالاتها (تحوّل من «أوراق» إلى وحدات)

المنطق المعماري المُزال: استُبدلت «الأوراق» أحادية الصفحة (single-page clinical sheets) بكنترولرات وحدات مستقلة (modular controllers):

أُزيل من MEDالبديل في MEDالملاحظة
ancsheet / ancsheet00antenalvisit.php (مُوسَّع) + mainantenental*ورقة ANC ذابت في تدفق الزيارة
gynasheet / gynasheet00gyna.php + ultrasoundgyna.phpفُصلت أمراض النساء عن السونار
infertilitysheet / 00infertility.php
ivfsheet / ivfsheet00embryology.php, embryoslab.php, embryofreezing.php, spermfreezing.php, ovumpickupembryotrans.php, ivf_reports.phpورقة IVF واحدة → 6 وحدات معملية
iui, monitoring, edd, epcمدمجة في تدفق الزيارة/التقاريرأُلغيت ككنترولرات مستقلة
Deliveriesإشعارات الولادة عبر birth_notify + التقارير
operationsoperations_reserve.php, operations_calendar.php, operations_rooms.php, operations_reports.php, operation_types.phpوحدة عمليات/غرف كاملة
mobileservices, sh, addpresenthistory, Completesreport, Ivfstatisticsأُزيلت / استُبدلت بتقارير المركز

قدرات «المركز/المستشفى» الجديدة (لا توجد في OBGY)

الكيانات (الجداول) المستنتجة من النواة المشتركة المُعدَّلة

الجداول التالية مُشار إليها في الكنترولرات المشتركة المُعدَّلة في MED، وتمت مقارنتها بقائمة الـ312 جدولًا الأصلية. الأغلبية جديدة (استنتاج من استدعاءات RedBeanPHP والـ SQL الخام):

الجدولجديد/معروفالغرضأهم الحقول المستنتجةالعلاقات
programesettingexجديدإعدادات ميزات إضافية (أعمدة ديناميكية)revisioned + أعمدة من programesetting2 (استنتاج)يُملأ من programesetting2.colum_name
programesettinglabجديدإعدادات وحدة المختبرlab_style1:1 مع المنشأة
programesetting2معروفتعريف أعمدة الإعدادات الديناميكيةcolum_nameيُسقَط على programesettingex
organizationsجديدالجهات/الشركات المتعاقدةname, discount (استنتاج)organizations_patient_no, organization_discount
organizations_patient_noجديدأرقام ملفات المريض حسب الجهةpatient_id, org_id, no (استنتاج)patients, organizations
advance_paymentجديدالدفعات المقدمة للمريضpatient_id, amount (استنتاج)patients / visits
archive_requestجديدطلبات أرشفة الملفاتpatient_id, status (استنتاج)patients, archive_tracking
patients_childsجديدأبناء المريضة (ربط أسري)patient_id, child_id (استنتاج)patients
governorate / governorate_centers / regions / sub_regionsجديدالتقسيم الجغرافي/الفروعname, parent_id (استنتاج)هرمية مناطق ↔ فروع
operations_main / operation_room / operations_rooms / operationotherthجديدوحدة العمليات والغرفoperation_id, room_id, date (استنتاج)patients, residence_room
residence_room / residence_roomsجديدغرف الإقامة/التنويمroom_no, status (استنتاج)↔ العمليات والحجوزات
clinic_rooms / day_times / visit_hours / visit_periodجديدجدولة العيادات والمواعيدroom, start_hour, end_hour (استنتاج)visits, الأطباء
rays / raysresults / raysresults_img / gynarays / mainantenentalrays / andvisitsraysجديدقسم الأشعة ونتائجهvisit_id, result, img (استنتاج)visits, patients
investigationresults (+ سلالة _culture/_blood/_urine...)جديدنتائج التحاليل المخبرية المفصّلةvisit_id, value (استنتاج)visits, أنواع التحاليل
invoffer / invofferdetailsجديدباقات/عروض التحاليلname, price, items (استنتاج)↔ التحاليل
refer / refer_doctorجديدتحويل/إحالة الطبيبdoctor, patient_id (استنتاج)patients
sellbill / returnsellbill / bank / bankaccount / client / clientdebtchangeجديدجسور تكامل ERP (فواتير/عملاء/بنوك)عبر erp_common.php (استنتاج)مزامنة مع نظام ERP منفصل
and_visits / and_examination / and_history (andvisits*)جديدوحدة الذكورة (Andrology)visit_id, حقول إكلينيكية (استنتاج)patients
visits_follows / visit_hoursجديدمتابعات الزيارة والمواعيدvisit_id, date (استنتاج)visits
patients / visitsمعروفالكيانات الأساسية (نفسها بنيويًا)موسّعة بحقول فروع/جهاتقلب النظام

إجمالًا تشير قائمة setup.php → tablesToClean إلى نحو 171 كيانًا في عالم MED، منها ~91 كيانًا جديدًا غير موجود في تفريغ الـ312 جدولًا الأصلي.

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

🗄️

ملحق: الجداول الجديدة المستخرجة من الكود (MED: New Tables Extracted from Code)

تحليل النسخة الثانية المكتشفة من النظام (med.greennature.com.sa) المنشورة على المسار /home/medgreennatureco/public_html/med. هذه نسخة أحدث وأوسع مهيأة كـ«مركز/مستشفى» وليست عيادة نسائية واحدة. تم استخراج معرفة المخطط (الجداول والحقول) من الكود فقط — عبر استدعاءات RedBeanPHP (R::dispense / R::find / R::load / R::getAll) وجمل SQL الخام داخل المتحكمات والقوالب — دون أي اتصال بقاعدة البيانات الحية. تمت مقارنة كل جدول بقائمة الـ 312 جدولاً الأصلية في obgy_12-7-2024.sql لتصنيفه «جديد» أو «معروف».

الأرقام الإجمالية (Quantification)

413جدول مُشار إليه في كود MED
137معروف (ضمن الـ 312 الأصلية)
276جدول جديد (غير موجود بالنسخة الأصلية)
4وحدات تم مسحها: core / board / pharmacy / vote
6+قواعد بيانات مُتحدة (erpDB / old / new / obor / royalDb / default)

المصدر: مسح grep على المتحكمات والقوالب في المسارات med/{core,board,pharmacy,vote}/controllers وmed/core/views، ثم تطبيع الأسماء ومقارنتها بمخرجات grep CREATE TABLE من ملف obgy_12-7-2024.sql. ملاحظة: الوحدتان board (مجلس الإدارة) وpharmacy (الصيدلية) تستخدمان جداول معروفة بالكامل (bsession, brequests, councilstaff, drugs, importbill, pharmacystore…) — التوسّع الحقيقي يتركّز في وحدة core الخاصة بالمركز/المستشفى.

اكتشاف معماري: قاعدة بيانات ERP مخصّصة وربط متعدد القواعد (Multi-DB Federation)

الكود يربط عدة قواعد بيانات عبر R::addDatabase() وR::selectDatabase()، أبرزها قاعدة باسم erpDB يُقرأ اسمها من إعداد programesetting->erpdb (استنتاج: تكامل مالي/مخزني مع نظام ERP منفصل)، إضافة إلى قواعد old وnew وobor وroyalDb (استنتاج: ترحيل بيانات بين نشرات/فروع متعددة). هذا يؤكد أن MED ليست تطبيقاً بقاعدة واحدة بل طبقة موحِّدة فوق عدة قواعد.

الجداول الجديدة مجمّعة حسب النطاق (New Entities by Domain)

الجدولجديد/معروفالغرضأهم الحقول المستنتجةالعلاقات
التصويت / استبيان رضا العملاء (Kiosk Voting) — وحدة vote
votesجديدتعريف استبيان/تصويتid, title, status (استنتاج)vote_questions
vote_questionsجديدأسئلة الاستبيانvote_id, question_textvotesvote_answers
vote_answersجديدإجابات/خيارات السؤالquestion_id, answer_text, answer_facevote_questions
vote_devicesجديدأجهزة الكشك (Kiosk)id, name (استنتاج)clients_votes
clients_votes / client_votesجديدسجل تصويت العميلvote_id, vote_device_id, user_id, voter_name, voter_phone, ip, local_ip, remote_ip, user_agent, created_atvotes, vote_devices
clients_votes_answersجديدتفاصيل إجابات العميلclient_vote_id, question_id, answer_id, answer_text, answer_face, user_id, created_atclients_votes
الهيكل التنظيمي والجغرافي (Center / Organizations / Geo)
organizationsجديدالجهات/الشركات المتعاقدة (تأمين/شركات)id, name, deleted, patient_noorganization_discount, organizations_patient_no, visit
organization_discountجديدخصومات الجهة المتعاقدةorganization_id, discount_type, value (استنتاج)organizations
organizations_patient_noجديدأرقام منتسبي الجهةorganization_id, patient_noorganizations
governorate / governorate_centersجديدالمحافظات والمراكز التابعةid, nameregions / sub_regions
regions / sub_regionsجديدالمناطق والمناطق الفرعيةid, name, region_id, deletedvisit.subregion
nationality / hnationality / religion / hreligion / husstatusجديدقوائم مرجعية للمريضة والزوج (h = husband)id, name→ بيانات المريض
الزيارة المركزية والحجز (Visit / Reception / Reservation)
visitجديدسجل الزيارة المركزي للمركز (يحل محل أوراق العيادة القديمة)patientid, branch_id, branch_name, for_department, for_doctor, for_husband, visitdate, visit_time, original_price, contract_price, discount, organization_id, organization_discount, center_discount, detectionvalue_cash, detectionvalue_visa, dr_salary, is_redirect, enc_id, user_id, printserialorganizations, patients, branches
visit_servicesجديدخدمات الزيارة (بنود فاتورة)visit_id, service, price (استنتاج)visit
visit_hours / day_timesجديدساعات/أوقات العمل للحجزday_no, hour, room_id (استنتاج)clinic_rooms
clinic_reserves / doctors_reserves / reserve_clinicجديدحجوزات العيادات والأطباءvisit_id, doctor_id, room_id, reserve_day_no, reserve_hour, start_date, is_active, cancel_date, user_idclinic_rooms, visit
clinic_rooms / operation_roomجديدغرف العيادات والعملياتid, name, floor_no← الحجوزات
advance_paymentجديددفعات مقدّمةpatient_id, amount, date (استنتاج)patients/visit
التنويم والإقامة (Residence / Admission)
residence_rooms / residence_roomجديدغرف التنويم/الإقامةname, floor_no, start_time, end_time, create_date, deletedresidence_reserves
residence_reservesجديدحجوزات التنويمroom_id, patient_id, start, end (استنتاج)residence_rooms
exit_summaryجديدملخص الخروج (Discharge)visit_id/patient_id, summary (استنتاج)visit/patients
مختبر الأجنّة والحقن المجهري (IVF / Embryology Lab) — أكبر نطاق جديد
embryoslabجديددورة معمل الأجنةdate, visit_id, patient_id, clinician_id, embryologist_id_tb, referred_dr_id, create_dateembryo, tankcells
embryoجديدالجنين المفردembryoslab_id, embryologist_id_tb, icsi_by_tb, freeze_embryologist_id_tb, cancelled_userembryoslab, embryotype
embryofreezing / embryothawing / embryofreezingreportجديدتجميد/إذابة الأجنة والتقاريرembryofreezing_id, embryologist, date, protocolembryo, tankcells
embryotransfer / embryotransferovum / ovumpickupجديدالإرجاع وسحب البويضاتclinician_name, embryologist_name, dateembryoslab
embryologist / embryologyreport / embryoscoring / embryotype / embryodifficulty / embryojetplaceجديدقوائم مرجعية ودرجات الأجنةid, name, gradeembryo
oocytequality / oocytecytoplasm / oocytezona / oocytepvs / oocyteotherجديدتقييم جودة البويضاتid, nameovumpickup
tanks / tanks_general / tankcells / tankcellhistory / embryoslab_tank_cellsجديدخزانات النيتروجين وخلايا التخزين وسجل حركتهاembryoslab_id, tank_cell, cell_no, row_no, col_no, btn_no, color_name, location, date_add, user_id, deletedtanks, embryofreezing
growthmedia / growthincubator / growthco2 / growthoil / freezingmedia / freezingprotocolجديدقوائم مرجعية لبيئة الزراعة والتجميدid, nameembryoslab
ivf_records / ivf_reportجديدسجلات وتقارير دورات الحقن المجهريpatient_id, date (استنتاج)embryoslab
الحيوانات المنوية والذكورة (Andrology / Semen) — وحدة and*
andvisitsجديدزيارة عيادة الذكورةpatientid, doctorid, doctorname, date, complaintid, diagnosisidandvisits*
andvisitssemen / andvisitsus / andvisitsrays / andvisitsinvestigation / andvisitsficils / andvisitsgenetictesting / andvisitsdrugsجديدتفاصيل زيارة الذكورة (سائل منوي/سونار/أشعة/تحاليل/أدوية/فحص جيني)andvisitsusid, azf, chromosome, length, width, volume, name, type, sysdateandvisits
andexamination / andhistory / andejaculation / anderection / andcontraception / andmedicalproblems / anddiagnosis / andcomplaintجديدالفحص والتاريخ الذكوري وقوائمهid, name, deletedandvisits
andcontratype / erectiondisease / ejaculationdiseaseجديدقوائم مرجعية للذكورةid, nameقوائم
semen_analysis / semen_process / semen_processing / semen_cryopreservation / sperm_extract / spermfreezingreport / sperum_sourceجديدتحليل ومعالجة وتجميد السائل المنويpatient_id, source, date (استنتاج)andvisits/embryoslab
المنظار (Endoscopy / Colonoscopy)
endoscopy / colonoscopyجديدتقرير منظار علوي/سفليpatient_id, exam_date, indication, findings, conclusion, plan, esophagus, stomach, duodenum, pylorus, cardio_esophageal_junction, dre, anesthesia, instrument, preparation, consent, signature, created_at*_images, *_template
endoscopy_images / colonoscopy_imagesجديدصور المنظارendoscopy_id / colonoscopy_id, image→ التقرير الأب
endoscopy_template / colonoscopy_templateجديدقوالب جاهزة للتقاريرname, findings, conclusion (استنتاج)قوالب
oscopic_report / oscopic_operations / oscopic_specimens / oscopic_required_examinationsجديدتقارير وعمليات وعينات المنظار العامةpatient_id, specimen, date (استنتاج)→ التقارير
العمليات وغرفها والتخدير (Operations / OR / Anaesthesia)
operations_main / operation_data / operation_form / operationgynaجديدسجل العمليات وبياناتهاpatient_id, operation_type, date, room_id (استنتاج)operation_room, operations_rooms
operations_rooms / operations_rooms_calجديدغرف العمليات وتقويم حجزهاroom_id, date, status (استنتاج)operation_room
operationinstructions / operationotherth / followup_operation / manual_operation / manual_operation_updatesجديدتعليمات ومتابعة العملياتoperation_id, text (استنتاج)→ العمليات
pre_anaesthetic / intra_anaesthetic / anasthesaجديدتقييم التخدير قبل/أثناء العمليةoperation_id, notes (استنتاج)→ العمليات
نتائج المختبر التفصيلية (Lab Investigation Results)
investigationresultsجديدرأس نتيجة تحليلpatient_id, invest_id, sampletype, date, value (استنتاج)← الجداول الفرعية أدناه
investigationresults_blood / _urine / _stool / _semen / _culture / _cross / _cross_donners / _lipid / _egfr / _esr / _pt / _aborh / _custom / _timesجديدنتائج مفصّلة حسب نوع العينةinvestigationresults_id, parameter, value, normal_range (استنتاج)investigationresults
stool_rbc / stool_rbc2 / stool_wbc / stool_wbc2 / urine_pus / urine_pus2 / urine_pbcs / urine_pbcs2جديدقوائم خيارات نتائج البول والبراز (مجهري)id, nameقوائم
invest_elements / inv_ranges / sampletype / esr_جديدعناصر التحاليل والمعدلات الطبيعية وأنواع العيناتinvest_id, element, min, max, sampletype (استنتاج)investigationresults
lab_devices / lab_devices_ranges / saveresultslog / external_labsجديدأجهزة المختبر ومعدلاتها وسجل الحفظ والمختبرات الخارجيةdevice, range_min, range_max (استنتاج)→ النتائج
الأشعة (Radiology)
rays / rayscats / raysresults / raysresults_img / gynarays / mainantenentalraysجديدطلبات وفئات ونتائج وصور الأشعةname, patient_id, result, image (استنتاج)visit/patients
الصيدلية والوصفات والمخزن (Pharmacy / Prescriptions / Store)
prescription / prescription_detailsجديدوصفة طبية وتفاصيلهاpatient_id, drugname, drugtype, drugdospatients
prepared_prescriptions / prepared_prescriptions_drugsجديدالوصفات المُحضّرة بالصيدليةprescription_id, drug_id, qty (استنتاج)prescription, drugs
stores / storedrugs / storedrugsvalidationجديدالمخازن وأدويتها وصلاحياتهاstore_id, drug_id, qty, expiry (استنتاج)drugs
drugmovements / recorddrugs / importdrugs / followupdrugsجديدحركة وتوريد ومتابعة الأدويةdrug_id, amountbefore, amountafter, amountvary, optype, opdatedrugs, stores
drug_sensitivity / drug_therapy / antibiotic_sensitivityجديدحساسية الأدوية والمضادات والعلاجdrug_id, result (استنتاج)drugs
supplies / suppliescats / invests_supplies / invoffer / invofferdetailsجديدالمستلزمات والعروض المرتبطة بالتحاليلid, name, cat, price (استنتاج)→ المخزن/التحاليل
تاريخ المريض والنماذج العامة (Patient History / Forms / Misc)
pasthistorymedical / pasthistorysurgical / pasthistoryart / pasthistorygynencologicalجديدالتاريخ المرضي/الجراحي/المساعد على الإنجاب/النسائيpatient_id, text (استنتاج)patients
phpersonal / phsexual / phsexualtypes / phpasthx / phpasthxtypes / phpastartresult / phdrugsجديدملف العقم الشخصي/الجنسي/التاريخ السابقpatient_id, type, result (استنتاج)patients
obstetric_case / obstetric_case_ex / obstetrichistorydetails / summary_obstetric / summary_obstetric_abortion / previous_pregnancies / previous_puerperiumجديدالتاريخ الولادي وملخصاتهpatient_id, pregnancy_no, outcome (استنتاج)patients
menstural*: mensturalhistory / mensamount / mensdysmo / mensregularityجديدتاريخ الدورة الشهرية وقوائمهاpatient_id, amount, regularity (استنتاج)patients
patientinformation / patientdecleration / patients_childs / patients_complaints / patients_notify / relativeجديدبيانات وأقارب وأبناء وشكاوى وإشعارات المريضpatient_id, name, relation, complaint (استنتاج)patients
patient_hystroscopic / patient_laparoscopic / hystroscopic / laparoscopicجديدمناظير الرحم والبطن للمريضةpatient_id, findings (استنتاج)patients
vital_sign / fetal_pulse / blood_transfusion / bltype / dna_results / complaint_analysis / decleration / patientdeclerationجديدعلامات حيوية ونقل دم وفحوص متفرقة وإقراراتpatient_id, value, type, date (استنتاج)patients/visit
المتابعة والأرشيف والإعدادات والبنية التحتية (Follow-up / Archive / Settings / Infra)
follow_drugs / follow_drain / follow_post / follow_pre / follow_rout / follow_semen / follow_uop / follow_vpack / follow_instruction / visits_followsجديدبطاقات متابعة ما بعد العملية/الزيارةvisit_id/patient_id, note, date (استنتاج)visit
archive_request / archive_trackingجديدطلب وتتبّع ملفات الأرشيف الورقيpatient_id, in_date, out_date, in_time, out_time, deletedpatients
programesetting2 / programesettingex / programesettinglabجديدإعدادات إضافية للنظام والمختبر والـERP (erpdb, tanks_view, visit_phones…)key, value, erpdbإعدادات عامة
sms_control / sms_control_setting / login_tackingجديدتحكم الرسائل النصية وتتبّع تسجيلات الدخولuser_id, ip, date, sms_template (استنتاج)→ المستخدمين
short_urls / index_redirectجديداختصار الروابط وإعادة التوجيه (للروابط المرسلة بالرسائل)code, target_url (استنتاج)عام
awusermenu / device / visibility / colors / fastoptions / custom_select / doc_instruction / recommend / refer / knownfrom / symptoms / disease / diseasefamily / medicaldiseaseجديدقوائم مرجعية وإعدادات واجهة وقوائم تشخيصيةid, name, deletedقوائم/إعدادات
beauty_visitsجديدزيارات التجميل (وحدة beauty في المركز)patient_id, date (استنتاج)patients

ملاحظة منهجية: الحقول الموسومة «(استنتاج)» مُستنبطة من سياق الكود (أسماء الأعمدة في جمل SQL أو خصائص beans في RedBeanPHP) دون رؤية تعريف الجدول الفعلي، إذ لم يتم الاتصال بقاعدة البيانات الحية. القوائم المرجعية الكثيرة (id, name, deleted) موحّدة النمط في كامل النظام.

التأثير على خطة الـ ERP/HIS (Impact on ERP/HIS Plan)

🚀

ملحق: تعديلات مطلوبة على خطة النقل بعد اكتشاف MED (ERP Plan Amendments)

مخطط الهجرة المنشور (§95) بُني على النسخة العيادية ذات الـ312 جدولًا، وقرار المعمارية النهائي (Platform-First) صمّم Modules/HIS كمنصة سريرية عامة وModules/Obgy كأول تخصص. اكتشاف نسخة MED (~276 جدولًا جديدًا، 9 مجالات وظيفية) لا يقلب هذا القرار — بل يؤكده — لكنه يفرض تعديلات نطاق محددة: ما يذهب إلى HIS، وما يذهب إلى Obgy، وما يُغطّيه ERP القائم أصلًا، وما يُسحب ويُتقاعد. الجدول التالي هو قائمة التعديلات الملزمة على المخطط.

جدول التعديلات على مخطط §95

الإضافة المكتشفة في MEDالوجهة في الخطةالجداول المقترحة / آلية الاستيعابالحجم
التنويم وغرف العمليات (operations_rooms, residence_rooms, operations_rooms_cal, operations_main, أعمدة التنويم على visits) Modules/HIS — المرحلة 4 (تنويم) + جراحة P1 التصميم المعتمد يستوعبها كما هو: his_wards/his_rooms/his_beds/his_bed_assignments/his_encounter_movements + his_surgical_bookings. التعديل المطلوب: إضافة تقويم شرائح غرف العمليات (his_or_slots) بمنع تعارض على مستوى قاعدة البيانات (MED تكتشف التعارض في PHP فقط)، وترقية «نوع العملية» من جدول detections المشترك إلى كتالوج إجراءات حقيقي، وتوحيد محرّكي الحجز المتوازيين في كيان حجز واحد بحالة صريحة. لوحة الإشغال الحيّة وقوائم اليوم (today_list) تثبت الحاجة لشاشة أسرّة لحظية M
معمل الأجنة + خزانات النيتروجين (~40 جدولًا: embryoslab, embryoscoring, embryo, tanks/tankcells/tankcellhistory…) Modules/Obgy — توسعة كبرى للمرحلة 2 المخطط الأصلي خصّص obgy_cryopreservations واحدًا فقط؛ يلزم الآن نطاق فرعي كامل: obgy_embryology_sheets، obgy_embryo_records، obgy_embryo_scorings (يوم 2–6 كصفوف his_observations حيث أمكن)، obgy_cryo_tanks، obgy_cryo_positions، obgy_cryo_custody_events (سجل عهدة على نمط tankcellhistoryobgy_thaw_events. شرطان إلزاميان: توحيد نموذجي التخزين المتوازيين قبل الهجرة، وجعل الشاهد الثاني (double-witnessing) حقلًا إجباريًا على كل تجميد/إذابة/نقل. ~30 جدول قوائم مرجعية تذوب في his_lookups L
قوالب المناظير (14 جدولًا: معدة/قولون/بطن/رحم + قوالب + صور) Modules/Obgy + محرّك النماذج في HIS أنماط القوالب الثلاثة في MED تُستبدل بمحرّك النماذج المعتمد (his_form_templates/his_form_versions غير القابلة للتعديل/his_form_responses بحالة توقيع)؛ بنك القوالب المسمّاة يصبح محتوى نسخ نماذج. obgy_endoscopy_procedures المخطط يبقى للنساء؛ مناظير الجهاز الهضمي تُسجَّل كمحتوى نماذج عام (لا جداول صلبة) تمهيدًا لبوابة «التخصص الثاني». أرشيف الصور → مكتبة الوسائط الموحّدة. يُصحَّح عيب حقن «المبيض الأيسر» في oscopic.js ولا يُنقل M
عيادة الذكورة (~17 جدول and*) Modules/Obgy (عيادة رفيعة) + كتالوج LIS وفق قرار المجلس: تحاليل السائل المنوي والهرمونات تصبح فحوصات في كتالوج LIS بمدًى مرجعية WHO (andvisitssemen → نتائج LIS، لا جدول خاص). يبقى في Obgy: obgy_andrology_visits وobgy_andrology_exams (فحص سريري ثنائي الجانب) والتاريخ المرضي كمحتوى محرّك أسئلة؛ القوائم المرجعية (anddiagnosis، erectiondisease…) → his_lookups. الزيارة نفسها = his_encounters عادي M
قسم الأشعة (rays/rayscats/raysresults/raysresults_img) ملاحظة RIS مستقبلية — المرحلة 5 عبر عقد D3 لا جداول الآن. نمط MED (طلب → قائمة عمل → أداء → صور → إنهاء) يؤكد صلاحية عقد D3 المعتمد (Action + encounter_id + FolioChargePosted) للأشعة كما للمختبر. الكتالوج المُسعّر (rays) يدخل كتالوج الخدمات في Core عند التنفيذ؛ الصور → خدمة وسائط/PACS-lite. تنبيه توثيقي: radiation.php ليس أشعة بل خطابات تحويل/تعليمات — يُستثنى من نطاق RIS S الآن / L لاحقًا
الفروع والمناطق والمنظمات (regions/sub_regions, organizations* , awusers.related_branches) Modules/Core القائم + توليدة التأمين في HIS P1 الفروع أصلًا أولّية في المنصة (company_id/branch_id على BaseModel + DataScope) — يُستبدل نطاق CSV في related_branches بربط مستخدم↔فرع القائم. regions/sub_regions → قوائم جغرافية في Core. المنظمات المتعاقدة = وحدة التأمين/B2B القائمة: organizations → شركاء أعمال + عقود، organization_discount/price_lists → قواعد قوائم الأسعار المعتمدة في HIS P1، organizations_patient_no → أرقام مرضى لكل جهة على نمط ext_scope_key، وبوابة المنظمات الخارجية تُعاد كتابتها على Sanctum M
جسر أجهزة المختبر والنتائج التفصيلية (lab_devices, lab_devices_ranges, investigationresults_* ×13, saveresultslog) Modules/LIS القائم — تخطيط فقط لا جداول جديدة: LIS في Moon ERP يغطي واجهات الأجهزة وأنواع النتائج أصلًا. العمل = جدول تخطيط في الـETL يربط investid القديم وأكواد الإرسال/الاستقبال بكتالوج LIS، ويستوعب الأنواع الـ16 الخاصة (دهون/eGFR…) كنتائج محسوبة. saveresultslog → تدقيق LIS القائم. قاعدة D5 تبقى: لا تغيير في سلوك LIS S
كشك تقييم رضا المرضى (6 جداول vote* + clients_votes*) ملاحظة CRM/جودة — خارج HIS v1 لا يدخل نطاق الهجرة الأساسي؛ يُوثَّق كمتطلب لوحدة جودة/تجربة مريض مستقبلية (استبيانات لكل جهاز، إسناد للموظف، متابعة شكوى is_contact/reply). شكاوى المرضى (patients_complaints) ومؤشرات الانتظار تُشتق لاحقًا من طوابع his_encounters الزمنية ملاحظة
الرسائل النصية والروابط القصيرة (sms_control, short_urls, مزوّدا smsmisr/naslab) خدمة إشعارات موحّدة في Core قوالب الرسائل (أنواع 1–5 لكل قسم) → خدمة Notification واحدة متعددة القنوات (SMS/WhatsApp) ببيانات اعتماد في .env مع تدوير فوري للأسرار المكشوفة المكتوبة صلبًا في الكود الحالي. محرّك الروابط القصيرة يُستبدل بنمط بوابة المريض المعتمد /p/:token S
طبقة مزامنة ERP القديمة (erp_common.php, api_web.php, قاعدة erpDB, مزامنة فواتير/أطباء/مديونية عبر cURL وJWT صلب) تُسحب وتُتقاعد التكامل يصبح أصليًا بالكامل وفق العقود المعتمدة: المريض هو سجل lab_patients، والمال عبر his_folio_charges → ChargePostingService → CreateJournalEntry، والطبيب عبر سلسلة lab_doctors → employees → users. قيمة وحيدة تُحفظ من الطبقة القديمة: خرائط المعرّفات (obygyDetectionId/obygyVisitId/obygyPatientId) تُستخدم مرة واحدة في تسوية الـETL ثم تُهمل S (تفكيك)
الإقرارات والموافقات الموقّعة (decleration/patientdecleration + ملفات مرفوعة) محرّك نماذج HIS + مكتبة وسائط قوالب الإقرار → his_form_templates (نسخ غير قابلة للتعديل)، والإقرار الموقَّع → his_form_responses بحالة signed، والمسح الضوئي → مرفق وسائط موثّق S
جدولة العيادات وتتبّع الملفات (clinic_rooms/clinic_reserves, archive_tracking/archive_request) Modules/HIS P1 (جدولة) + ملاحظة سجلات طبية الجدولة الأسبوعية طبيب×غرفة×ساعة تؤكد صواب قرار «أعمدة الموارد من اليوم الأول» على his_appointments — تُستوعب دون جداول إضافية. تتبّع حركة الملفات الورقية بالماسحات يبقى ملاحظة تصميم لوحدة السجلات الطبية (كما كان مقررًا لجداول devices/floors)، مع الاحتفاظ بنمط سير العمل رباعي المراحل بتدقيق لكل مرحلة كقالب لوحدة تتبّع الطلبات S

ملاحظة ETL المنقّحة: قاعدتا إنتاج الآن، لا واحدة

كل خطة الـETL في §95 افترضت قاعدة إنتاج واحدة. أصبح لدينا نشرتان إنتاجيتان بمخططين متباعدين: قاعدة العيادة الأصلية (312 جدولًا) وقاعدة MED (medgreennatureco_med، +276 جدولًا وأعمدة إضافية كثيرة على الجداول المعروفة مثل visits الموسّع). التعديلات الملزمة:

  1. تشغيل خط الـETL لكل نشرة على حدة بعمودي تتبّع legacy_db إلى جانب legacy_id/legacy_table، مع قاموسي تخطيط أعمدة منفصلين (مخطط visits وحده يختلف جوهريًا بين النسختين).
  2. تمرير دمج فهرس مرضى رئيسي (MPI) عبر النشرتين قبل الإدخال في lab_patients: نفس المريض قد يوجد في القاعدتين (أداة syncstructure.php وأسماء القواعد المتعددة فيها تثبت تاريخ نقلٍ بين النسخ) — إلغاء التكرار بالهوية الوطنية/الهاتف/الاسم+الميلاد مع طابور مراجعة بشرية (توسعة R10).
  3. تصدير إنتاجي حديث من القاعدتين قبل كل بروفة ETL (توسعة بوابة R7)، لأن مخطط MED بأكمله مستنتج من الكود فقط ولم تُستعلم قاعدته الحيّة إطلاقًا.
  4. قواعد أسبقية أجيال إضافية داخل MED نفسها: محرّكا حجز العمليات المتوازيان، ونموذجا تخزين الخزانات، والنموذج المعملي القديم/المُطبَّع — كلها تحتاج قرارات دمج موقَّعة من الأطباء (توسعة R3).

سطور المخاطر المحدثة (تُضاف إلى سجل §95)

الخلاصة الإدارية: لا تغيير في المعمارية المعتمدة ولا في تسلسل المراحل — التغيير في النطاق والحجم: المرحلة 2 (Obgy) تكبر بمعمل الأجنة والذكورة، والمرحلة 4 (تنويم) تكتسب نموذجًا مرجعيًا حيًا من MED، والـETL يصبح ثنائي المستأجر. اكتشاف MED يرفع كلفة الترحيل قليلًا لكنه يرفع اليقين كثيرًا: المورّد القديم أثبت بالفعل أن طريق «العيادة → المستشفى» هو ما يطلبه السوق.