تصميم أول Feature في الـ HIS — مبني على فكرتك

ملف المريض + الحجز + الخدمات والتسعير وعمولات الأطباء

تحويل فكرتك لتصميم ملموس: ملف مريض كبير قابل للإخفاء لكل مركز، وشاشة حجز تبدأ بالمريض ثم الخدمات (كشف → تخصص → دكتور → قيمة)، مع محرّك تسعير وعمولات أطباء.

2026-06-15 · Feature 1 of Moon ERP HIS · يكمّل his-module-blueprint.html
💡

٠ — الفكرة كما وصفتها (تأكيد الفهم)

ملخّص فكرتك قبل التصميم — عشان نتأكد إننا متفقين.
🏥

١ — وضع المركز (عيادة واحدة / عدة عيادات / مستشفى)

نفس الكود، إعدادات لكل مركز (tenant) تحدّد الحجم والميزات الظاهرة.

كل مركز = company_id (multi-tenant موجود أصلاً في Moon ERP) + جدول إعدادات his_center_settings يحدّد الوضع والميزات المفعّلة. ده اللي بيخلّي نفس النظام يخدم عيادة صغيرة أو مستشفى.

الإعدادالقيم / المثال
modesingle_clinic multi_clinic hospital
features (JSON){opd:true, ipd:false, or:false, pharmacy:true, lab:true, insurance:true} — يظهر/يخفي موديولات كاملة
branchesmulti_clinic/hospital → عيادات/فروع متعددة تحت نفس المركز
patient_profile_configأي حقول في ملف المريض ظاهرة/مطلوبة (القسم التالي)
👤

٢ — ملف المريض القابل للتهيئة (كبير + إخفاء لكل مركز)

حقول شاملة مجمّعة في أقسام، وكل حقل ظهوره/إلزامه يتحكّم فيه لكل مركز عبر إعدادات.

ملف المريض فيه كل الحقول الممكنة مجمّعة في أقسام، لكن العرض metadata-driven: جدول his_field_configs لكل مركز يقول كل حقل ظاهر؟ مطلوب؟ ترتيبه؟ اسمه المخصّص؟ — فالمركز يقدر يخلّي الملف بسيط أو شامل.

قسم الحقولأمثلة (كلها قابلة للإخفاء لكل مركز)
الهوية الأساسية (دايماً ظاهر)الاسم (ع/EN)، النوع، تاريخ الميلاد/العمر، الموبايل، MRN
الهوية الرسميةالرقم القومي/الإقامة، الجنسية، نوع الإثبات
التواصل والعنوانعناوين، مدينة، منطقة، إيميل، تواصل طوارئ
اجتماعيالحالة الاجتماعية، المهنة، التعليم، بيانات الزوج/الزوجة (للنساء والتوليد)
طبي أساسيفصيلة الدم، الحساسيات، الأمراض المزمنة، الأدوية الحالية
نساء وتوليد (اختياري)تاريخ الطمث، G/P، تاريخ آخر دورة، الحمل الحالي
التأمين/الدافعشركة التأمين، رقم البوليصة، الفئة، نسبة التحمّل
التسويقمصدر المعرفة، الطبيب المحوِّل، ملاحظات
الآلية: الملف يقرأ his_field_configs(company_id, field_key) → {visible, required, order, label}. الـ frontend يرسم الأقسام والحقول الظاهرة فقط ديناميكياً. شاشة إعدادات بسيطة (toggle لكل حقل) للمركز. كده ملف واحد شامل يخدم كل المراكز.
🧾

٣ — كتالوج الخدمات وأنواعها (إعدادات الخدمات)

الخدمة لها اسم + نوع. النوع بيحدّد سلوكها (كشف → تخصصات → أطباء).
الحقلالشرح
name_ar / name_enاسم الخدمة (كشف، استشارة، سونار، إجراء…)
service_typeconsultation (عيادات) procedure lab radiology package — النوع يحدّد السلوك
requires_specialtyلو النوع "عيادات" → true: يربط الخدمة بالتخصصات ويطلب اختيار تخصص ثم دكتور
requires_doctorهل الخدمة محتاجة اختيار دكتور (الكشف = نعم؛ بعض الإجراءات = لا)
pricing_modeflat (سعر موحّد) أو per_doctor (سعر لكل دكتور)
default_priceالسعر الافتراضي (يُستخدم في وضع flat، أو كمبدئي)
linked_modulelab→LIS، radiology→RIS (الخدمة تطلّق طلب في الموديول المتكامل)
منطق فكرتك بالظبط: الخدمة "كشف" نوعها consultation وrequires_specialty=true → في الحجز تطلّع التخصصات → اختيار تخصص يطلّع أطباءه → اختيار الدكتور يجيب القيمة (من pricing_mode).
💰

٤ — التسعير وعمولات الأطباء

سعر الخدمة (موحّد أو لكل دكتور) + ما يأخذه الدكتور (أساسي/مساعد/تحويل).

أ — سعر الخدمة

ب — عمولة الدكتور (للقيم المالية)

لكل (خدمة × دكتور) في نفس جدول التسعير، نحفظ ما يستحقه الدكتور — وده اللي يطلّع القيم المالية من الكشف:

الدورالحقلالمعنى
الطبيب الأساسيprimary_feeما يأخذه لو هو طبيب الكشف الأساسي
الطبيب المساعدassistant_feeما يأخذه لو هو مساعد
على التحويلreferral_feeما يأخذه الطبيب المحوِّل عند تحويل المريض
قابل للتوسّع: كل قيمة ممكن تكون مبلغ ثابت (زي ما وصفت) أو نسبة % من سعر الخدمة (fee_type: amount|percent) — عشان لو مركز يفضّل النسبة. الافتراضي مبلغ.
التكامل: سعر الخدمة → فاتورة في Accounting. عمولة الدكتور → نفس نمط LabDoctorCommission الموجود في موديول LIS (نعيد استخدام الفكرة) → تسوية عمولات دورية.
📅

٥ — شاشة الحجز/الزيارة (التدفّق)

المريض أولاً، ثم الخدمات — تدفّق سريع بالكيبورد.
#الخطوة
1المريض: بحث (اسم/موبايل/رقم قومي/MRN) → اختيار، أو "مريض جديد" (يفتح ملف المريض القابل للتهيئة)
2إضافة خدمة: ابحث/اختر خدمة. لو نوعها consultation:
  ↳ يظهر التخصص → اختياره يظهر قائمة الأطباء → اختيار الدكتور
  ↳ القيمة تتعبّى تلقائياً (per_doctor → سعر الدكتور، flat → سعر الخدمة) — قابلة للتعديل بصلاحية
  ↳ اختياري: طبيب مساعد + طبيب محوِّل (لحساب العمولات)
3كرّر: أضف عدة خدمات (سلّة الخدمات) — كل سطر بقيمته
4الإجمالي يتحسب، الدافع (نقدي/تأمين)، ثم حفظ الحجز
5الحفظ يولّد: فاتورة (Accounting) + سطور عمولة لكل دكتور + المريض يدخل طابور العيادة
🧮

٦ — كيف تتولّد القيم المالية من الكشف

سطر الحجز (كشف، تخصص=نساء، دكتور=د.أحمد، مساعد=د.سارة، محوِّل=د.خالد)
  ├─ سعر الخدمة      = 300  (per_doctor: سعر د.أحمد) ───────► فاتورة المريض (Accounting)
  └─ عمولات (snapshot وقت الحجز من جدول التسعير):
        د.أحمد  primary_fee   = 180  ─┐
        د.سارة  assistant_fee = 40   ─┼──► سطور عمولة أطباء ──► تسوية دورية
        د.خالد  referral_fee  = 30   ─┘                          (نمط LabDoctorCommission)
  صافي المركز = 300 − (180+40+30) = 50
مهم: القيم تتخزّن كـ snapshot وقت الحجز (مش reference حي) — عشان لو غيّرت الأسعار بعدين، الحجوزات القديمة تفضل بقيمها الصحيحة. (درس من تدقيق الموديولات: تجنّب الـ reference الحي للأسعار التاريخية).
🧬

٧ — الموديل (Data Model)

على أعراف Moon ERP (Laravel، company_id، FK حقيقية).
— الهوية —
his_parties · his_patients(party_id, mrn) · his_practitioners(party_id, hrm_employee_id)
his_specialties(name_ar/en)
his_practitioner_specialty(practitioner_id, specialty_id)   — دكتور ← تخصص

— إعدادات المركز وملف المريض —
his_center_settings(company_id, mode, features json)
his_field_configs(company_id, entity, field_key, visible, required, sort, label_override)

— الخدمات والتسعير —
his_services(company_id, name_ar/en, service_type, requires_specialty,
             requires_doctor, pricing_mode[flat|per_doctor], default_price,
             specialty_id?, linked_module?)
his_service_doctor_pricing(service_id, practitioner_id, price,
             primary_fee, assistant_fee, referral_fee, fee_type[amount|percent])

— الحجز —
his_bookings(company_id, branch_id, patient_id, booking_date, status,
             payer_type[cash|insurance], total, created_by)
his_booking_services(booking_id, service_id, specialty_id?, practitioner_id?,
             assistant_id?, referring_doctor_id?, price,
             doctor_primary_fee, doctor_assistant_fee, referral_fee)   — snapshot
his_doctor_commissions(booking_service_id, practitioner_id, role, amount, settlement_id?)
ملاحظة: الحجز هنا = نقطة البداية اللي عند الـ check-in تتحوّل لـ encounter (الكشف الإكلينيكي) — زي ما في الـ blueprint الأساسي. فالـ booking-services بتغذّي الفوترة، والـ encounter بيغذّي السجل الطبي.
🖥️

٨ — تصميم الشاشات (UI)

شاشتين: الحجز، وإعدادات الخدمات/التسعير — بنفس مبادئ الـ blueprint (keyboard، worklist).

شاشة الحجز الجديد

حجز جديد / زيارةCtrl+S حفظ
🔍 المريض: بحث بالاسم/الموبايل/الرقم القومي… أو [+ مريض جديد]
المريض المختار: سارة محمد · ٢٨ سنة · MRN 10432 حساسية: بنسلين
+ إضافة خدمة: [كشف ▾]
التخصص: [نساء وتوليد ▾]
الدكتور: [د. أحمد ▾]
القيمة: 300
اختياري: مساعد [د. سارة ▾] · محوِّل [— ▾]
سلّة الخدمات:
١· كشف نساء — د. أحمد (مساعد: د.سارة)
300
٢· سونار توليدي — د. أحمد
200
الإجمالي · الدافع: نقدي
500

شاشة إعدادات الخدمة + تسعير الأطباء

خدمة: كشف نساءنوع: عيادات
النوع: عيادات (consultation)
التخصص: نساء وتوليد
نمط التسعير: لكل دكتور
الدكتور
السعر
أساسي
مساعد
تحويل
د. أحمد
300
180
40
30
د. منى
350
210
45
30
الشاشتين يستخدموا الـ primitives من الـ blueprint: PatientBanner (مع الحساسية)، WorklistGrid لسلّة الخدمات وجدول التسعير، ScanInput للبحث، OnPush + keyboard.
🚀

٩ — خطة تنفيذ أول Feature

الخطوةالشغل
١الأساس: parties/patients/practitioners/specialties + MPI (بحث/إضافة مريض) + ملف المريض القابل للتهيئة + field_configs
٢كتالوج الخدمات + إعداداتها + التخصصات + ربط الأطباء بالتخصصات
٣محرّك التسعير: service_doctor_pricing (سعر + عمولات) + شاشة الإعداد
٤شاشة الحجز: مريض → خدمات → تخصص → دكتور → قيمة → حفظ (snapshot)
٥التكامل: فاتورة → Accounting، عمولات → نمط LabDoctorCommission، المريض → طابور العيادة
الخطوة الجاية المقترحة: أعمل لك الـ migrations + Models + شاشة الحجز فعلياً (TDD) كأول feature شغّالة، أو نزوّد تفاصيل أكتر في أي جزء حابب.
HIS — أول Feature: ملف المريض + الحجز + الخدمات والتسعير · مبني على فكرتك · يكمّل his-module-blueprint.html · 2026-06-15