أول خدمة: العيادات الخارجية — تصميم تفصيلي
العيادات الخارجية: أنواع المؤسسات + محرّك التسعير متعدد الأبعاد
دمج فكرتك: المؤسسة (عيادة فردية / مركز / مستشفى) تحدّد التدفّق، والسعر يتحدّد بالقسم والدكتور ورتبته — بمحرّك تسعير مرن واحد. يكمّل his-feature1-booking-design.html.
2026-06-15 · Outpatient Consultation deep design · Moon ERP HIS
- عيادة فردية: دكتور واحد ثابت — بيختار الخدمة وينفّذها بس (مفيش اختيار قسم/دكتور).
- مركز فيه كذا عيادة في التخصص: تختار العيادة ← القسم ← تكتب السعر (سعر كشف البطنة مش زي الصدر).
- فرق بين دكتور ودكتور في نفس القسم: كل واحد ليه سعر — فلازم نسعّر كل الدكاترة في الخدمة دي.
- واجهة تسعير جماعي: اختار القسم + الخدمة ← كل الدكاترة يطلعوا ← سعّر كل واحد.
- التسعير ممكن يكون على رتبة الدكتور: ممارس ولا استشاري.
كل ده يتجمّع في فكرة واحدة: التسعير له عدة أبعاد (قسم، دكتور، رتبة)، ونوع المؤسسة يحدّد إزاي بنوصل للسعر. التصميم تحت بيغطّي كل الحالات بجدول تسعير مرن واحد.
توضيح مهم (تحديث): القسم بيتحدّد عند تعريف الخدمة — يعني تعمل خدمة "كشف بطنة" وتربطها بقسم الباطنة. فالقسم خاصية في الخدمة نفسها، بيخدم غرضين: (١) التسعير (بطنة ≠ صدر) و(٢) التوجيه — بعد الحجز المريض يروح غرفة/عيادة القسم (يدخل طابور القسم). فعند الحجز بتختار الخدمة (اللي حاملة قسمها) والطبيب بس — مش بتختار القسم تاني.
| نوع المؤسسة | الخصائص | تدفّق الكشف |
| عيادة فردية single_clinic | دكتور واحد ثابت، تخصص واحد غالباً | خدمة (كشف) ← الدكتور تلقائي ← السعر ← حفظ |
| مركز / عدة عيادات center | كذا قسم وكذا دكتور؛ الخدمة بتحمل قسمها | خدمة (كشف بطنة — تحمل قسمها) ← الدكتور ← السعر (محلول) ← حفظ ← 🚪 توجيه لغرفة القسم |
| مستشفى hospital | زي المركز + تنويم/عمليات/طوارئ | زي المركز + ربط بالـ encounter والتنويم |
المفتاح: his_center_settings.mode + إعداد الخدمة يحدّدوا الخطوات اللي تظهر في شاشة الحجز. العيادة الفردية تخفي اختيار العيادة/القسم/الدكتور وتثبّت الدكتور الوحيد تلقائياً.
التخصص (Specialty) مثال: باطنة · نساء وتوليد · جراحة
└─ القسم/الفرع (Department) مثال (تحت الباطنة): بطنة · صدر · قلب ← السعر بيختلف هنا
└─ العيادة (Clinic) غرفة/وحدة تشغيلية (في المركز كذا عيادة؛ الفردية = واحدة)
└─ الطبيب (Practitioner) له رتبة (rank)
رتبة الطبيب (rank): ممارس عام · اختصاصي · استشاري · أستاذ ← التسعير ممكن يعتمد عليها
| الكيان | الدور في التسعير/التدفّق |
| التخصص | المظلة العامة؛ الخدمة "كشف" ممكن تترتبط بتخصص |
| القسم (Department) | يتحدّد عند تعريف الخدمة. غرضان: تسعير (بطنة ≠ صدر) + توجيه المريض لغرفة القسم بعد الحجز |
| العيادة (Clinic) | وحدة تشغيلية/فرع؛ بُعد تسعير اختياري (فرع غالي/رخيص) |
| الطبيب + الرتبة | بُعدا تسعير: سعر الدكتور المحدّد، أو سعر حسب الرتبة |
| البُعد | المثال | الاستخدام |
| flat (الخدمة) | كشف = 150 | عيادة فردية بسيطة — سعر واحد |
| بالقسم (department) | بطنة = 200 · صدر = 250 | "السعر للبطنة مش زي الصدر" |
| بالعيادة/الفرع (clinic) | فرع التحرير = 300 · فرع المعادي = 250 | فروع بأسعار مختلفة (اختياري) |
| بالطبيب (doctor) | د.أحمد = 200 · د.منى = 300 | "فرق بين دكتور ودكتور في نفس القسم" |
| بالرتبة (rank) | ممارس = 150 · استشاري = 300 | "التسعير على رتبة الدكتور" |
كله مدعوم بجدول واحد مرن (مش 5 جداول): his_service_prices بأعمدة أبعاد قابلة للـ null. الصف اللي أعمدته متملّية أكتر = أكثر تحديداً. والتحليل بياخد الأكثر تحديداً (القسم التالي).
لكل (خدمة، عيادة، قسم، دكتور، رتبة) في الحجز، نبحث في his_service_prices ونأخذ أول صف مطابق بالترتيب ده (من الأخص للأعم):
- ١ سعر الطبيب المحدّد (practitioner_id مطابق) — يفوز على كل حاجة. "د.منى بطنة = 300"
- ٢ القسم + الرتبة (department_id + rank) — "استشاري بطنة = 280"
- ٣ القسم (department_id) — "كشف بطنة = 200"
- ٤ الرتبة (rank) — "استشاري = 300 (أي قسم)"
- ٥ سعر الخدمة الافتراضي (flat) — "كشف = 150"
العيادة (clinic_id) بُعد إضافي اختياري يقيّد أي مستوى (لفروع مختلفة). والسعر المحلول دايماً قابل للتعديل اليدوي في الحجز بصلاحية، ويتخزّن snapshot.
| الحالة | صفوف التسعير الموجودة | الحجز | السعر المحلول |
| عيادة فردية | كشف flat = 150 | كشف (د.أحمد تلقائي) | 150 (مستوى ٥) |
| بالقسم | بطنة=200 · صدر=250 | كشف · قسم بطنة | 200 (مستوى ٣) |
| فرق بين الدكاترة | بطنة=200 · د.منى بطنة=300 | كشف · بطنة · د.منى | 300 (مستوى ١ يفوز) |
| بالرتبة | ممارس=150 · استشاري=300 | كشف · استشاري | 300 (مستوى ٤) |
| قسم + رتبة | بطنة استشاري=280 · بطنة=200 | كشف · بطنة · استشاري | 280 (مستوى ٢) |
قاعدة واحدة بتحل كل السيناريوهات اللي وصفتها — والمركز يحط الصفوف اللي تناسب سياسته بس.
تسعير خدمةحفظ الكل
الخدمة: كشف ▾
التخصص: باطنة ▾
القسم: بطنة ▾
أساس التسعير: بالطبيب ▾
الطبيب
الرتبة
السعر
أساسي
مساعد
تحويل
💡 زر "تعبئة بالرتبة" يملأ السعر تلقائياً حسب رتبة كل دكتور لو أساس التسعير = بالرتبة
كل صف هنا بيتحوّل لصف في his_service_prices (practitioner_id مملّى = مستوى ١). لو أساس التسعير "بالقسم" → صف واحد للقسم؛ "بالرتبة" → صف لكل رتبة. نفس الشاشة، أعمدة مختلفة حسب الأساس.
دور القسم (توضيح أدق): إنت بتختار القسم عند تعريف الخدمة مش علشان تميّز الخدمة (إنت أصلاً كاتب اسمها "كشف بطنة")، لكن علشان النظام يعرف مين أطباء القسم فيوريهملك تسعّر الخدمة عند كل واحد (كل دكتور سعره) + التوجيه للغرفة.
مثالك بالظبط
| الخدمة (الاسم بيحمل القسم) | السعر الافتراضي | القسم المختار | النتيجة |
| كشف بطنة | 200 | بطنة | أطباء بطنة يطلعوا → تسعّر كل واحد |
| إعادة كشف بطنة | 100 | بطنة | نفس أطباء بطنة |
| كشف صدر | 250 | صدر | أطباء صدر يطلعوا |
| إعادة كشف صدر | 120 | صدر | نفس أطباء صدر |
مدخلان لنفس التسعير (اتجاهين)
| المدخل | الاستخدام |
| من الخدمة | افتح "كشف بطنة" → كل أطباء قسم بطنة → سعّر كل واحد (شاشة التسعير الجماعي فوق) |
| من الطبيب | افتح "د. خالد" → كل خدمات أقسامه → سعّر كل خدمة. ده حل "من مكان تاني أظبطها" |
مشكلة "إضافة دكتور بعد الخدمة" — ٤ حلول مدمجة
- شبكة أمان قاعدة الأولوية بترجع للسعر الافتراضي: دكتور جديد لسه ماتسعّرش → الحجز ياخد سعر القسم/الخدمة (200) → مبيقفش أبداً. تسعّره وقت ما تحب.
- مؤشر مؤشر النواقص: النظام يبيّن "٣ خدمات بدون سعر خاص لـ د.خالد" → تكملها بضغطة.
- auto-seed توليد تلقائي (اختياري): أول ما تضيف الطبيب للقسم، النظام يولّد صفوف تسعير بالسعر الافتراضي لكل خدمات القسم → تعدّل اللي عايزه بس.
- دفعة من شاشة الطبيب: زر "سعّر كل خدمات أقسامه" — تفتح الطبيب مرة واحدة وتسعّر كل خدماته، بدل ما تفتح كل خدمة لوحدها.
الخلاصة: مش محتاج تعيد فتح كل خدمة لما تضيف دكتور. الحجز شغّال على طول (شبكة الأمان)، والنظام بيوريك النواقص، وتسعّر الدكتور الجديد من شاشته مرة واحدة لكل خدماته.
تسعير من شاشة الطبيب: د. خالدسعّر كل خدماته
الطبيب: د. خالد · الرتبة: ممارس · أقسامه: بطنة
الخدمة
القسم
السعر
أساسي
الحالة
كشف بطنة
بطنة
—
—
بدون سعر (افتراضي 200)
إعادة كشف بطنة
بطنة
—
—
بدون سعر (افتراضي 100)
عيادة فرديةأبسط تدفّق
المريض
← خدمة: كشف
← د.أحمد (تلقائي)
← السعر 150
← حفظ
مركز / مستشفىتدفّق كامل
المريض
← خدمة: كشف بطنة (تحمل قسمها)
← الطبيب: د.منى
← السعر 300 (محلول)
← حفظ
← 🚪 غرفة الباطنة
في الحالتين: السعر المحلول قابل للتعديل بصلاحية، والعمولات (أساسي/مساعد/تحويل) بتتجاب snapshot من صف التسعير المطابق → تغذّي الفاتورة (Accounting) وعمولات الأطباء.
— الهيكل —
his_specialties(name) his_departments(specialty_id, name) — بطنة/صدر
his_rooms(department_id, name) — غرفة القسم (للتوجيه بعد الحجز)
his_services(..., service_type, department_id) — الخدمة "كشف بطنة" بتحمل قسمها (تسعير + توجيه)
his_clinics(company_id, branch_id, name, specialty_id?)
his_practitioners(party_id, hrm_employee_id, rank[gp|specialist|consultant|professor])
his_practitioner_assignments(practitioner_id, clinic_id, department_id)
— محرّك التسعير المرن (جدول واحد، أبعاد nullable) —
his_service_prices(
id, company_id, service_id,
clinic_id? — بُعد اختياري (فرع)
department_id? — بطنة/صدر
practitioner_id? — دكتور محدّد (الأخص)
doctor_rank? — ممارس/استشاري
price,
primary_fee, assistant_fee, referral_fee, fee_type[amount|percent]
)
القرار: ORDER BY specificity → أول مطابق (practitioner > dept+rank > dept > rank > flat)
— الحجز (snapshot وقت الحفظ) —
his_booking_services(booking_id, service_id, clinic_id?, department_id?,
practitioner_id?, assistant_id?, referring_doctor_id?,
resolved_price, doctor_primary_fee, doctor_assistant_fee, referral_fee)
الفرق عن feature1: استبدلنا service_doctor_pricing (دكتور فقط) بـ his_service_prices متعدد الأبعاد — يغطّي القسم والعيادة والدكتور والرتبة في جدول واحد بقاعدة أولوية. وأضفنا rank للطبيب وdepartments تحت التخصص.