دراسة domain-model مرجعية

دراسة موديل نظام معلومات المستشفيات (HIS) لتصميم ERP النساء والتوليد

تحليل تنظيم موديل GNU Health مفتوح المصدر، وربطه بنظامك الحالي لاستخلاص أنماط تصميم مُجرّبة — مرجع مرافق لـ obgy-erp-analysis.md.

2026-06-15 · المرجع: GNU Health 5.0.5 (Tryton) · إعادة بناء مفاهيم، لا نسخ كود
55+موديول إكلينيكي في GNU Health
3 → 1توحيد stacks الـ antenatal
8أنماط تصميم تحل ديونك التقنية
0سطر كود منسوخ (آمن قانونياً)
🧩

١ — الأنماط الـ ٨ اللي بتحل أكبر مشاكلك

كل دَيْن تقني في نظامك القديم بيقابله نمط تصميم محدد في GNU Health. الجدول ده هو الخلاصة.
المشكلة عندكنمط GNU Healthاللي تبنيه في الـ ERP
الزوجين في صف واحد (wifename+husdandname)فصل Party / Roleجدول party = أي شخص. جداول دور رفيعة: patient, health_professional كلها → party_id. الزوج = علاقة، مش عمود.
مفيش FKs (٣٠٠+ علاقة ضمنية)كل علاقة Many2One مُعلنةقيود FOREIGN KEY حقيقية + ON DELETE. التكامل في الـ DB، مش في PHP.
٣ stacks متوازية للـ antenatalaggregate حمل واحد (pregnancy)master pregnancy واحد + صفوف prenatal_visit. احذف الـ stacks التانية.
GPA متخزّن ومتضارب (pno/ab/ectopic)GPA محسوب من قائمة الحملماتخزنش Gravida/Para. احسبهم من COUNT(pregnancy) + عدّ النتايج.
١٩٠ جدول dropdown (٦١٪ من الجداول)Selection enums + كتالوجات قليلةجدول واحد lookups(type,code,label) يستبدل ~١٥٠ جدول صغير.
فصل الزيارة عن الإكلينيكي (مفيش visit_id)Encounter هو جذر كل سجل إكلينيكيكل sheet → encounter_id. الـ encounter يربط المريض + الطبيب + الحجز + التشخيص.
EAV + جداول semen/hormon متوازيةبنية lab عامة: كتالوج→طلب→نتيجة→سطرlab_test_type واحد + lab_request + lab_result + lab_result_line. السائل المنوي والهرمونات = أنواع تحاليل، مش جداول.
الدفع inline على visits (cash/visa/debt)Service → Invoice؛ كل مفوتر = productمستند service منفصل + invoice. الرسوم والتحاليل والأدوية كلها تشاور product.
👤

٢ — طبقة الهوية (the Party pattern)

مصدر واحد لكل شخص؛ الأدوار (مريض/طبيب/منشأة) مجرد أغلفة رفيعة عليه.
party (شخص أو منشأة؛ أعلام دور: is_patient, is_healthprof, is_institution, is_pharmacy)
  ├─ ref (PUID — معرّف شخص فريد)
  ├─ dob, gender, marital_status            ← الديموغرافيا هنا، مرة واحدة
  ├─ person_name[] , alternative_ids[]       (تاريخ الأسماء، الباسبور/الرقم القومي)
  └─ du (وحدة سكنية / أسرة)
       ▲
   ┌───┴────────────┬─────────────────┐
patient        health_professional   institution
(سمات إكلينيكية)  (رخصة، تخصص)         (نوع، أسرّة، أجنحة)
ليه ده مهم ليك: مشكلة الزوج/الزوجة بتختفي. الاتنين صفوف party؛ المريضة غلاف patient؛ الزوج party مربوط بصف علاقة (family_member دوره "husband"). والشخص اللي هو مريض وموظف في نفس الوقت = سجل واحد.
🩺

٣ — طبقة الزيارة (appointment vs evaluation)

GNU Health بيفصل التلات حاجات اللي جدول visits بتاعك بيخلطهم.
الغرضكيان GNU Healthعمود visits عندك دلوقتي
الحجز / الطابورappointment free→confirmed→checked_in→done→no_showvisitdate, visitorder, visit_period
الكشف الإكلينيكيpatient.evaluation in_progress→done→signed(مفقود — الداتا الإكلينيكية سايبة)
الفلوسhealth_serviceinvoicedetectionvalue_cash/_visa/...
الـ Encounter هو المحور: يربط المريض + الحجز + الطبيب + الشكوى + العلامات الحيوية + التشخيص + صفوف فرعية (أعراض/إجراءات)، وعند التوقيع (sign) يتقفل للقراءة فقط — نمط تدقيق (audit) ناقص عندك حالياً.
🤰

٤ — موديل النساء والتوليد (the crown jewel)

تلات stacks للـ antenatal + تاريخ التوليد بيتجمّعوا في aggregate واحد نظيف.
patient (الأم، biological_sex='f')
  │
  ├─ menstrual_history[]     (LMP، طول الدورة، منتظمة؟، عسر طمث، تكرار/كمية)
  ├─ pap_history[]           (نتيجة Bethesda: NILM/ASC-US/LSIL/HSIL/AIS…)
  ├─ mammography_history[]   (طبيعي/غير طبيعي + آخر تاريخ)
  ├─ colposcopy_history[]
  │
  └─ pregnancy[]  ◄── master واحد لكل حمل (توحيد ancsheet/mainantenental/followup)
        ├─ gravida (رقم # فريد لكل مريضة)
        ├─ current_pregnancy (bool — واحد بس مسموح، مُتحقَّق منه)
        ├─ lmp → pdd (EDD = LMP + 280 يوم)
        ├─ fetuses, monozygotic        (دعم الحمل المتعدد)
        ├─ pregnancy_end_result (live_birth/abortion/stillbirth) + end_date
        │
        ├─ prenatal_evaluation[]   ← زيارات المتابعة (antenatal)
        │     gestational_weeks = (visit_date − lmp)/7   [محسوب، مش متخزّن]
        │     fundal_height, fetus_heart_rate, EFW, BPD/AC/HC/FL,
        │     hypertension, preeclampsia, diabetes, placenta_previa, IUGR…
        │
        ├─ perinatal[]             ← حدث الولادة
        │     admission_date, delivery_mode (SVD/vacuum/forceps/CS),
        │     presentation, episiotomy, laceration, مضاعفات المشيمة
        │     └─ monitoring[]      ← صفوف partograph أثناء المخاض (ضغط، اتساع، نبض جنين)
        │
        ├─ puerperium_monitor[]    ← صفوف النفاس (lochia كمية/لون/رائحة، ارتجاع الرحم)
        │
        └─ pregnancy_result[]      ← نتيجة لكل جنين
              └─ newborn → party (المولود شخص حقيقي)
                    └─ سجل المولود (APGAR ١/٥، وزن/طول/HC، فحوصات، ردود أفعال)

اختيارات تصميم توليدية تستحق النقل (كمفاهيم)

الاختيارالفايدة عندك
EDD = LMP + 280 يوم، وعمر الحمل يُعاد حسابه عند الطلب — مايتخزّنش أبداًيحل منطق الـ EDD المكرر، ومفيش داتا قديمة بايتة
GPA مُشتق: Gravida = عدد الحمول؛ الإجهاض/الإملاص/المبتسر = عدّ حسب النتيجةيقتل أعمدة pno/ab/ectopic المبعثرة في كل sheet
إدخال أمامي vs "عكسي": حمل حالي (LMP) أو حمل سابق (تاريخ نهاية + أسابيع، ويُحسب LMP عكسياً)يطابق بالظبط فصلك بين "تاريخ" و"حمل نشط" — كيان واحد بعلم reverse
حمل نشط واحد ثابت كقاعدة (invariant)يمنع تكرار/تضارب سجلات الحمل
صف نتيجة لكل جنين → يربط المولود كـ شخص حقيقيكده registeration/حجز الولادة بيدخّل المولود في سجل المرضى
🧪

٥ — التحاليل والأدوية والفوترة

بنية واحدة عامة تقتل الـ EAV وجداول التحاليل المتوازية، وتوصّل كل مفوتر لفاتورة.

التحاليل (Investigations) — بديل الـ EAV وجداول semen/hormon

lab_test_type (كتالوج)        مثال: "Semen Analysis"، "Hormonal Profile"، "CBC"
  ├─ code, category, specimen_type
  ├─ product_id  → يخليه مفوتر
  └─ analyte_template[]   (سطور النتيجة المتوقعة: count, motility, morphology / FSH, LH, E2…)

lab_request   (الطبيب يطلب test_type لمريض؛ state draft→ordered→tested)
lab_result    (مستند النتيجة؛ state draft→done→validated؛ validated_by + وقت)
  └─ analyte_line[]   name, result(float) | result_text, units, lower/upper limit, WARNING لو بره المدى
ضربة مباشرة لديونك: semen/semen2/semeninfertility وhormon/hormonalprofile/hormonalprofile2 مش جداول جديدة — دول صفّين lab_test_type بقوالب analytes مختلفة. والـ otherinvestigations EAV بيبقى analyte_lines منظّمة بوحدات ومديات مرجعية وتنبيه آلي بره المدى.

الأدوية والصيدلية

medicament (كتالوج: يغلّف product؛ active_component, strength+unit, route, form,
            pregnancy_category A–X, pregnancy_warning)        ← أمان مهم لتخصصك
prescription_order (header: patient, prescriber, pharmacy؛ بوابة ACK لتحذير حساسية/حمل؛ state)
  └─ prescription_line[]  medicament, dose+unit, frequency, indication→pathology, refills
        └─ stock_move      (الصرف بيخصم من مخزون الصيدلية)

الخدمات والفوترة

health_service (header: patient, date)            ← كل المفوتر بيتجمّع هنا
  └─ service_line[]  product, qty, to_invoice  → invoice
المطابقة: drugs/recepittmp/receiptdrugs + currentbalance → كتالوج medicament + prescription_order/line + stock move (بدل تعديل عمود رصيد). وdetections + مدفوعات visitsproduct + health_service + invoice.
🗺️

٦ — خريطة التحويل: جداولك → الكيانات الهدف

كل جدول في نظامك القديم بيتحوّل لإيه.
القديم (نظامك)الكيان الهدفملاحظات
patients (زوجين)party (×٢) + patient + family_memberافصل الزوج المدمج
awusers (كأطباء)party + health_professionalالرخصة/التخصص على الغلاف
visitsappointment + encounter + serviceافصل التلات أغراض
detectionsproductكتالوج الرسوم
ancsheet/mainantenental/followuppregnancy (واحد)توحيد ٣ → ١
ancnewvisit/antenalvisit/followupvisitprenatal_visitجدول أبناء واحد
*us/ultrasoundobstحقول biometry في prenatal_visit (+ imaging_study)بيومتري منظّم
الولادات/operativedetailsperinatal (+ perinatal_monitor)حدث الولادة + partograph
داتا النفاسpuerperium_monitorlochia/ارتجاع
registeration/المولودpregnancy_resultpartynewbornالمولود يبقى مريض حقيقي
phmenstrualmenstrual_historyاربطه بالـ encounter
phobstetric/wifep/awifepمُشتق من pregnancy[]احسب GPA، ماتخزنش
infertility*/ivfsheet/mointoringsheetموديول ART مخصّص (قسم ٧)اعمله aggregate زي pregnancy
semen*/hormon*lab_test_type + lab_result + analyte_lineنوعين تحاليل، مش ٦ جداول
invests/otherinvestigations (EAV)lab_test_type/analyte_lineمنظّم بمديات
drugs/recepittmp/pharmacystoremedicament/prescription_*/stock_moveالمخزون عبر moves
totalbalance/التقارير الماليةhealth_serviceinvoice + مدفوعاتحسابات مدينة سليمة
~١٩٠ جدول id/title/dellookups(type,…) أو enumsتجميع
🔬

٧ — الـ IVF/ICSI = قيمتك الخاصة (where GNU Health is weak)

GNU Health ضعيف جداً في الإخصاب المساعد — وده بالظبط ملكيتك الفكرية.

مفيش في GNU Health موديل عميق لدورات IVF/ICSI/IUI، ولا folliculometry، ولا تقييم أجنّة، ولا بروتوكولات تنشيط. جداولك ivfsheet/mointoringsheet/folliculom وأبناء التنشيط والأجنّة دي قيمتك الحقيقية. التوصية: خليها موديول ART من الدرجة الأولى، بس ابنيها بنفس نمط الـ aggregate بتاع الحمل:

art_cycle (master: patient, cycle_type ICSI/IVF/IUI, protocol, start_date, outcome)
  ├─ stimulation_day[]    (folliculometry: تاريخ، أحجام جريبات، E2، سُمك البطانة)
  ├─ procedure (OPU/ET)   (بويضات، أجنّة، درجة، تاريخ نقل، عدد المنقول)
  └─ outcome → يربط بـ pregnancy[]   (β-hCG → حمل سريري → الـ aggregate فوق)
الفايدة الكبيرة: الدورة الناجحة تولّد سجل pregnancy — فيبقى عندك خط متصل: عقم → دورة → حمل → ولادة → مولود، وهو اللي تصميمك الحالي بالجداول المتوازية مش قادر يعبّر عنه.
🏗️

٨ — ترتيب البناء المقترح

من العمود الفقري للهوية والزيارة، وصولاً للموديولات المتخصصة.
  1. العمود الفقري للهوية + الزيارة أولاً: party / patient / health_professional / appointment / encounter. كل حاجة بتتعلّق بده.
  2. aggregate الحمل: pregnancy + prenatal_visit + perinatal + puerperium_monitor + pregnancy_result/newborn. رحّل الـ ٣ stacks لجواه.
  3. التحاليل + الصيدلية: lab_* وmedicament/prescription_* العامة. ادمج semen/hormon/EAV هنا.
  4. الفوترة: product + health_service + invoice بدل فلوس visits الـ inline.
  5. موديول ART (قيمتك الخاصة)، مربوط بالحمل.
  6. جمّع الـ lookups، وضيف قيود FK، وافرض UTF-8 في كل مكان، وparameterize كل الاستعلامات (يقتل فئة الـ SQL injection بالكامل).
📚

٩ — المصادر (GPL — studied, not copied)

مصدر GNU Healthhttps://codeberg.org/gnuhealth/his.git (مستقر 5.0.5)
الموديولات المحللةhealth, health_gyneco, health_pediatrics, health_lab, health_services, health_inpatient, health_stock
نظامكobgy-erp-analysis.md
النسخة النصية لهذا التقريرhis-gnuhealth-vs-obgy-analysis.md
دراسة domain-model مرجعية — GNU Health → ERP النساء والتوليد · إعادة بناء مفاهيم آمنة قانونياً · 2026-06-15