تحليل وخطة تعديل شاشة "إضافة طبيب"

وحدة: المختبر (LIS) — Moon ERP  |  التاريخ: 2026-05-25  |  المسؤول: حازم  |  الفرع: hotfix/features (BE) + fix/doctor-revamp (FE)
6
متطلبات
11
تاسكات مطلوبة
7
باك اند
4
فرونت اند
~3
أيام عمل تقديرية

الملاحظات الأصلية من العميل

١) كود الطبيب حرج باك + فرونت

يجب أن يكون الكود تسلسلياً تلقائياً، قابلاً للتعديل، ولا يُسمح بتكراره أبداً.

٢) الحقول الإجبارية عالٍ باك + فرونت

الحقول الإجبارية فقط: الكود + رقم الهاتف + القسم. باقي الحقول اختيارية.

٣) منع تكرار رقم الهاتف حرج باك + فرونت

منع تسجيل أكثر من طبيب بنفس رقم الهاتف. عند الإدخال المكرر، تظهر أيقونة/رابط لعرض ملف الطبيب الموجود.

٤) قائمة الأسعار المفضلة متوسط باك + فرونت

إضافة حقل اختيار قائمة الأسعار المفضلة على الطبيب. عند اختياره في شاشة "إضافة زيارة" تُطبق قائمة أسعاره تلقائياً.

٥) إدارة التخصصات (Specialties) عالٍ باك + فرونت

توفير شاشة لإدارة التخصصات (قائمة CRUD)، واستبدال الحقل النصي الحر بقائمة منسدلة تختار منها التخصص.

٦) إصلاح قائمة أنواع العمولة متوسط فرونت فقط

القائمة المنسدلة لأنواع العمولة تفتح لكن الخيارات لا تظهر بشكل صحيح أو تبدو معلقة.

الوضع الحالي في الكود (ما تم اكتشافه)

اكتشافات إيجابية تختصر العمل:
مشاكل في الوضع الحالي تحتاج إصلاح:

التغييرات المطلوبة على الباك اند

BE-1 — تسلسل تلقائي لكود الطبيب (Auto Code)

البندالتفاصيل
تأثيركنترولر فقط — لا تعديل قاعدة بيانات
ملفModules/LIS/app/Http/Controllers/LabDoctorController.php
المنطقفي دالة store(): لو code فارغ، استدعِ SequenceService::generateNext($companyId, 'core', 'doctor') وحقن الناتج قبل التحقق. لو المستخدم أدخل كوداً يدوياً، يُحترم ويُتحقق من فرادته.
إندبوينت جديدGET /api/lis/doctors/next-code — يرجع الكود التالي بدون استهلاك العداد (preview فقط)، لعرضه في النموذج عند فتحه.

BE-2 — منع تكرار رقم الهاتف

البندالتفاصيل
مهاجرةملف جديد: 2026_XX_XX_add_unique_phone_to_lab_doctors.php
التحقق من التكرارقبل إضافة الفهرس، نفحص التكرارات الموجودة. لو وُجد، نوقف بـ RuntimeException ونعرض قائمة الـ IDs المكررة (نفس نمط مهاجرة المرضى).
الفهرسUNIQUE(company_id, phone) — multi-tenant scoped
تحديث الـ RequestStoreLabDoctorRequest: phone → required + unique scoped + رسالة مخصصة. UpdateLabDoctorRequest: ignore الـ id الحالي.
إندبوينت جديدGET /api/lis/doctors/by-phone/{phone} — يرجع تفاصيل الطبيب المسجل بهذا الرقم (للزر "عرض الطبيب الموجود").

BE-3 — تعديل الحقول الإجبارية

قبلبعد
name requiredname nullable
name_en requiredname_en nullable
code nullablecode required (يأتي من التسلسل تلقائياً)
phone nullablephone required + unique
department_id nullabledepartment_id required

BE-4 — جدول التخصصات الجديد

البندالتفاصيل
مهاجرة جديدة2026_XX_XX_create_lab_doctor_specialties_table.php
الأعمدةid, company_id, name, name_ar, name_en, code, is_active, created_by, updated_by, timestamps, softDeletes
الفهارسUNIQUE(company_id, code), UNIQUE(company_id, name)
FK في جدول الأطباءإضافة عمود specialty_id nullable على lab_doctors + FK
الحقل القديمالإبقاء على specialization (نصي) في الموديل للتوافق العكسي، لكن يصبح للقراءة فقط (مدفوع من اسم التخصص).
موديل + ريسورس + ريكويست + كنترولرLabDoctorSpecialty model, StoreLabDoctorSpecialtyRequest, UpdateLabDoctorSpecialtyRequest, LabDoctorSpecialtyController, LabDoctorSpecialtyResource
المساراتGET /api/lis/doctor-specialties, POST, PUT /:id, DELETE /:id
سيدرإضافة سيدر بأسماء تخصصات افتراضية (طب أطفال، باطنة، نسا وتوليد، أعصاب، جلدية...) باللغتين.

BE-5 — قائمة الأسعار المفضلة

الحقل price_list_id موجود فعلاً في القاعدة والـ Request. لا يوجد تغيير على الباك اند هنا. التعديل كله في الفرونت اند.

BE-6 — تطبيق قائمة الأسعار في شاشة الزيارة

البندالتفاصيل
المنطقعند إنشاء طلب مخبري أو زيارة لطبيب، نقرأ doctor.price_list_id ونستخدمه افتراضياً لتسعير الفحوصات إذا لم يتم اختيار قائمة أسعار يدوياً.
ملفLabRequestController أو LabRequestService
سلوك الواجهةالفرونت يقرأ القيمة من بيانات الطبيب ويملأ الحقل تلقائياً (مع إمكانية تغييره).

BE-7 — جزء التخصصات في الـ Doctor Resource

البندالتفاصيل
ملفLabDoctorResource
التعديلإضافة specialty ككائن {id, name, name_ar, name_en} بدلاً من نص حر. مع الإبقاء على specialization النصي للتوافق.

التغييرات المطلوبة على الفرونت اند

FE-1 — إصلاح قائمة "نوع العمولة" المعلقة

البندالتفاصيل
الملفlis-doctors.component.html (الأسطر 266, 462, 505, 619)
التشخيص المتوقعالمشكلة الأكثر احتمالاً: appendTo ناقص على p-select، فيظهر خلف الحوار (p-dialog) — تظهر القائمة بدون خيارات مرئية.
الإصلاحإضافة appendTo="body" على كل p-select داخل الحوار، والتأكد من optionLabel="label" optionValue="value"، وارتفاع كافٍ للقائمة.
اختبار يدويفتح حوار إضافة/تعديل طبيب → فتح قائمة نوع العمولة → التأكد من ظهور (نسبة مئوية، ثابت لكل إحالة، ثابت لكل تحليل).

FE-2 — تعديل نموذج إضافة/تعديل طبيب

التعديلالتفاصيل
كود الطبيبعند فتح الحوار (إضافة جديد فقط): استدعاء GET /lis/doctors/next-code وملء الحقل تلقائياً. الحقل قابل للتعديل اليدوي. تحذير عند التكرار.
الحقول المطلوبةإزالة required من name. إضافة required على code + phone + department_id.
منع تكرار الهاتفعند الكتابة في حقل الهاتف (debounce 500ms): استدعاء GET /lis/doctors/by-phone/{phone}. لو رد بطبيب موجود: عرض شريط تحذير برتقالي تحت الحقل + زر "عرض ملف الطبيب الموجود" يفتح صفحته في تبويب جديد أو modal.
التخصصاستبدال حقل النص الحر بـ p-select يقرأ من GET /lis/doctor-specialties. مع زر "+" بجواره لفتح حوار سريع لإضافة تخصص جديد بدون مغادرة النموذج.
قائمة الأسعار المفضلةإضافة p-select جديد بعنوان "قائمة الأسعار المفضلة" يقرأ من GET /lis/price-lists. اختياري. القيمة المختارة تُحفظ في price_list_id.

FE-3 — شاشة إدارة التخصصات الجديدة

البندالتفاصيل
المسار/lab/doctor-specialties + /core/lis/doctor-specialties
المكونfeatures/lis/doctor-specialties/lis-doctor-specialties.component.ts — جدول + حوار CRUD بنفس نمط lis-specimen-types.
الخدمةcore/services/lis-doctor-specialty.service.ts بنفس نمط الخدمات الأخرى (list/listAll/create/update/delete).
الـ Store(اختياري — يمكن استخدام Signals مباشرة بدون NgRx لأن الشاشة صغيرة).
الترجمةإضافة مفاتيح LIS.DOCTOR_SPECIALTIES.* في ملفات en.json و ar.json.
التنقلإضافة الرابط في الـ Sidebar الجانبي لشاشة المختبر (بعد التخصصات أو ضمن مجموعة "البيانات الأساسية").

FE-4 — تطبيق قائمة الأسعار في شاشة الزيارة

البندالتفاصيل
الملفlis-request-wizard-v2.component.ts + lis-visits.component.ts
المنطقعند اختيار طبيب: قراءة doctor.price_list_id. إذا وُجد، وحقل قائمة الأسعار في النموذج فارغ، يُملأ تلقائياً بقيمة قائمة الطبيب. (لو المستخدم اختار قائمة يدوياً قبل اختيار الطبيب: لا نطغى عليها).
إشارة بصريةعند الملء التلقائي: نص صغير تحت الحقل "🔵 من القائمة المفضلة للطبيب" يوضح للمستخدم سبب التعبئة.

قائمة التاسكات

الترتيبالتاسكالجانبالأولويةالتقديراعتمادية
T-1BE: إضافة جدول التخصصات + موديل + كنترولر + ريسورس + ريكوست + سيدرباك اندعالٍ4 س
T-2BE: مهاجرة phone unique + فحص التكرارات + تحديث Requestsباك اندحرج2 س
T-3BE: تعديل الحقول المطلوبة (name اختياري، code/phone/dept مطلوبين)باك اندعالٍ1 سT-2
T-4BE: توليد تلقائي للكود في store() + إندبوينت previewباك اندحرج1.5 س
T-5BE: إندبوينت by-phone للبحث عن الطبيب المسجل برقمباك اندعالٍ1 سT-2
T-6BE: تحديث Resource لإضافة specialty object + ربط FKباك اندمتوسط1 سT-1
T-7BE: تطبيق price_list_id افتراضياً عند إنشاء طلب/زيارةباك اندمتوسط1.5 س
T-8FE: إصلاح dropdown نوع العمولة + appendTo bodyفرونتمتوسط0.5 س
T-9FE: تعديل نموذج طبيب (كود تلقائي + required جديدة + فحص هاتف + price list + specialty dropdown)فرونتحرج4 سT-1 T-2 T-4 T-5
T-10FE: شاشة إدارة التخصصات الجديدة + خدمة + ترجمة + تنقلفرونتعالٍ3 سT-1
T-11FE: تطبيق قائمة الأسعار المفضلة في شاشة الزيارة/الطلبفرونتمتوسط1.5 سT-7

ترتيب التنفيذ المقترح

  1. اليوم الأول — الباك اند:
    • T-1 (التخصصات) → T-2 (الهاتف الفريد) → T-3 (الحقول المطلوبة) → T-4 (التسلسل) → T-5 (بحث الهاتف) → T-6 (Resource) → T-7 (سعر افتراضي).
    • تشغيل local-deploy.sh بعد كل تاسك للتأكد من شغل الكود.
    • اختبارات curl سريعة لكل إندبوينت قبل الانتقال للفرونت.
  2. اليوم الثاني — الفرونت اند:
    • T-8 (dropdown bug) → T-9 (نموذج طبيب) → T-10 (شاشة التخصصات) → T-11 (تطبيق السعر).
    • بناء ونشر بعد كل تاسك على moonui.elbaset.com/app/.
  3. اليوم الثالث — اختبار:
    • تكتب كل سيناريو وتختبر بنفسك على الواجهة.
    • بعد اعتمادك، نضم تعديلات هذه الخطة لفرع hotfix/features الذي يضم تعديلات شاشة المرضى.
    • عند انتهاء كل الـ hotfixes، نعمل PR واحد لأحمد لدمج hotfix/features في prod.

المخاطر والملاحظات

مخاطر مهمة:
القرارات النهائية (مؤكدة من العميل 2026-05-25):
  1. تكرار رقم الهاتف: منع كامل لإضافة الطبيب — لا يُحفظ السجل أبداً إذا كان الرقم مسجلاً مسبقاً. يُعرض رابط ملف الطبيب الموجود فقط.
  2. قائمة الأسعار المفضلة: اختيارية تماماً عند إضافة الطبيب. لكن إذا اختار المستخدم قائمة للطبيب، فعند اختيار هذا الطبيب لاحقاً في شاشة إضافة طلب/تحليل، يجب عرض أسعار الفحوصات من قائمته تلقائياً.
  3. الأطباء القدامى: لا نفعل أي شيء معهم. لا سكريبت تعبئة أكواد، لا هجرة تخصصات، لا تعديل أرقام هواتف. القواعد الجديدة تطبق فقط على الإضافة والتعديل من الآن.
  4. شاشة التخصصات: داخل وحدة المختبر (LIS) فقط — لا تظهر في إعدادات النظام العامة، لأنها مرتبطة بالمعمل تحديداً.
تأثير القرارات على خطة التنفيذ:
ملخص نهائي:

الخطة تتكون من ٧ تاسكات باك اند + ٤ تاسكات فرونت اند = ١١ تاسك إجمالي بتقدير ~٢١ ساعة عمل (~٣ أيام). كل التعديلات تذهب لفرعَين موجودَين فعلاً: hotfix/features (BE) و fix/doctor-revamp (FE جديد سننشئه عند البدء). لا PR لأحمد قبل اعتمادك الكامل.

Moon ERP — LIS Module  |  Add Doctor Revamp Plan  |  جاهز للمراجعة، في انتظار أمرك بالبدء.