بناء نظام إدارة عيادات كامل بكلود AI — Laravel + Filament من الصفر
نظام إدارة العيادة ليس مجرد "سجل مرضى" — هو منظومة متكاملة تتحكم في تجربة المريض من لحظة حجز الموعد حتى استلام الفاتورة ومتابعة نتائج المختبر. بناء هذا النظام يدوياً من الصفر كان يستلزم شهوراً وفريقاً متخصصاً. اليوم مع كلود AI وClaude Code، يمكن لمطور واحد بناء النظام الكامل في أسابيع قليلة بجودة إنتاجية حقيقية.
في هذا الدليل لن نتوقف عند "كيف تسأل كلود" — سنغطي البنية التقنية الكاملة: ERD قاعدة البيانات، نقاط API، صلاحيات المستخدمين، وتكامل الخدمات الخارجية. هذا هو الدليل الذي يريده المطور المحترف الذي يبني منتجاً حقيقياً.
معمارية النظام — نظرة شاملة قبل السطر الأول من الكود
قبل فتح Claude Code، يجب أن يكون لديك خريطة واضحة. نظام العيادة يتكون من طبقات متمايزة:
مخطط ERD — قاعدة البيانات الكاملة
هذا المخطط النصي يمثل العلاقات الجوهرية في النظام. أرسله مباشرة لكلود مع طلب إنشاء Migrations:
CLINIC MANAGEMENT SYSTEM — ERD (Text Notation)
================================================
[patients]
id (PK, UUID)
national_id (UNIQUE, encrypted)
full_name_ar / full_name_en
date_of_birth
gender (M/F)
blood_type
phone (encrypted)
email
address
emergency_contact_name
emergency_contact_phone
insurance_provider_id (FK)
insurance_policy_number (encrypted)
created_at / updated_at / deleted_at (SoftDelete)
[doctors]
id (PK)
user_id (FK → users)
specialty_id (FK)
license_number
consultation_duration_minutes (default: 30)
consultation_fee
available_days (JSON: ['Sun','Mon','Tue'...])
available_slots (JSON: time ranges)
[appointments]
id (PK, UUID)
patient_id (FK → patients)
doctor_id (FK → doctors)
appointment_date
appointment_time
status (pending/confirmed/in_progress/completed/cancelled/no_show)
type (first_visit/follow_up/emergency/teleconsult)
chief_complaint (text)
notes
reminder_24h_sent_at
reminder_1h_sent_at
cancelled_at / cancellation_reason
[medical_records]
id (PK, UUID)
patient_id (FK)
appointment_id (FK)
doctor_id (FK)
subjective (SOAP — encrypted text)
objective (SOAP — encrypted text)
assessment (SOAP — encrypted text)
plan (SOAP — encrypted text)
vitals_json (BP, HR, Temp, Weight, Height, O2Sat)
diagnosis_codes (JSON: ICD-10 array)
created_at
[prescriptions]
id (PK, UUID)
medical_record_id (FK)
patient_id (FK)
doctor_id (FK)
issued_at
valid_until
status (active/dispensed/expired/cancelled)
notes
[prescription_items]
id (PK)
prescription_id (FK)
drug_name
drug_generic_name
dosage
frequency
duration_days
route (oral/IV/topical...)
instructions_ar
[lab_orders]
id (PK, UUID)
medical_record_id (FK)
patient_id (FK)
ordered_by (doctor_id)
lab_provider_id (FK)
status (ordered/sample_collected/processing/results_ready/delivered)
ordered_at / resulted_at
[lab_results]
id (PK, UUID)
lab_order_id (FK)
result_data (JSON: {test_name, value, unit, reference_range, flag})
raw_file_path (PDF)
interpreted_by (doctor_id — nullable)
interpretation_notes
[invoices]
id (PK, UUID)
patient_id (FK)
appointment_id (FK)
subtotal / discount / insurance_covered / patient_due / tax / total
status (draft/sent/partially_paid/paid/overdue/cancelled)
due_date
paid_at
payment_method (cash/card/insurance/bank_transfer)
[insurance_providers]
id / name / code / contact_info / coverage_rules (JSON)
[specialties] [lab_providers] [drug_interactions]
البداية مع Claude Code — إعداد المشروع
الخطوة الأولى هي إنشاء مشروع Laravel وتزويد كلود بالسياق الكامل:
# في Terminal: composer create-project laravel/laravel clinic-system cd clinic-system # تثبيت الحزم الأساسية composer require filament/filament:"^3.0" composer require spatie/laravel-permission composer require spatie/laravel-activitylog composer require spatie/laravel-data composer require propaganistas/laravel-phone composer require defstudio/telegraph # للواتساب/تيليجرام # نشغّل Claude Code في مجلد المشروع: claude
ثم نعطي كلود هذا البرومبت الشامل لبناء الهيكل الكامل:
أنت مطور Laravel خبير. سأبني نظام إدارة عيادة طبية. هذا هو ERD الكامل: [الصق ERD من الأعلى] المطلوب الآن: 1. أنشئ جميع Migrations بالترتيب الصحيح مع Foreign Keys 2. أنشئ Models مع Relationships و$fillable و$casts المناسبة 3. أضف SoftDeletes لـ patients وappointments وprescriptions 4. شفّر الحقول الحساسة (national_id, phone, insurance_policy_number) باستخدام Encrypted cast من Laravel 5. أنشئ Factory وSeeder لكل Model ببيانات عربية واقعية ابدأ بـ Migrations أولاً، ثم Models، ثم Seeders.
وحدة تسجيل المرضى مع التحقق من الهوية الوطنية
التحقق من الهوية الوطنية يحتاج Validator مخصص. هذا ما يكتبه كلود عند طلبه:
// app/Rules/SaudiNationalId.php
// اطلب من كلود: "اكتب Validation Rule للهوية الوطنية السعودية
// تتحقق من: 10 أرقام، يبدأ بـ 1 (مواطن) أو 2 (مقيم)،
// خوارزمية Luhn المعدّلة"
class SaudiNationalId implements Rule
{
public function passes($attribute, $value): bool
{
if (!preg_match('/^[12]\d{9}$/', $value)) return false;
// خوارزمية التحقق من الرقم الوطني السعودي
$sum = 0;
for ($i = 0; $i < 10; $i++) {
if ($i % 2 === 0) {
$doubled = (int)$value[$i] * 2;
$sum += $doubled > 9 ? $doubled - 9 : $doubled;
} else {
$sum += (int)$value[$i];
}
}
return $sum % 10 === 0;
}
public function message(): string
{
return 'رقم الهوية الوطنية غير صحيح. يجب أن يكون 10 أرقام ويبدأ بـ 1 أو 2.';
}
}
Filament Resource لإدارة المواعيد مع تقويم الطبيب
الجزء الأصعب في نظام المواعيد هو منع التعارض وعرض الفترات المتاحة فعلاً. نطلب من كلود بناء هذا المنطق:
// البرومبت لكلود:
"اكتب AppointmentService يحتوي:
1. getAvailableSlots(Doctor $doctor, Carbon $date): array
- يأخذ available_days و available_slots للطبيب
- يستثني المواعيد المحجوزة فعلاً من DB
- يأخذ consultation_duration_minutes بالاعتبار
- يُرجع array من TimeSlot objects مع isAvailable flag
2. bookAppointment(array $data): Appointment
- يتحقق من عدم التعارض (Race Condition safe باستخدام DB::transaction + lockForUpdate)
- يُرسل تأكيد واتساب للمريض
- يُنشئ Reminder Jobs تلقائياً
3. cancelAppointment(Appointment $appointment, string $reason): bool
- يُحرر الموعد
- يُرسل إشعار إلغاء للمريض
- يُلغي Reminder Jobs المعلّقة"
// Filament Resource الناتج:
class AppointmentResource extends Resource
{
public static function form(Form $form): Form
{
return $form->schema([
Select::make('patient_id')
->label('المريض')
->relationship('patient', 'full_name_ar')
->searchable()
->preload()
->createOptionForm([...]) // نموذج إنشاء مريض جديد
->required(),
Select::make('doctor_id')
->label('الطبيب')
->relationship('doctor', 'user.name')
->searchable()
->live()
->afterStateUpdated(fn ($set) => $set('appointment_time', null)),
DatePicker::make('appointment_date')
->label('تاريخ الموعد')
->live()
->minDate(now())
->disabledDates(fn (Get $get) => // أيام إجازة الطبيب
AppointmentService::getUnavailableDates($get('doctor_id'))
),
Select::make('appointment_time')
->label('وقت الموعد')
->options(fn (Get $get) =>
AppointmentService::getAvailableSlots(
$get('doctor_id'),
$get('appointment_date')
)
)
->required(),
Select::make('type')->label('نوع الزيارة')
->options(['first_visit' => 'زيارة أولى', 'follow_up' => 'متابعة', 'emergency' => 'طارئ'])
->required(),
Textarea::make('chief_complaint')->label('الشكوى الرئيسية'),
]);
}
}
السجل الطبي الإلكتروني (EMR) — منهجية SOAP
منهجية SOAP (Subjective, Objective, Assessment, Plan) هي المعيار الطبي العالمي لتوثيق الزيارة. كلود يبني نموذج الإدخال كاملاً مع حفظ تلقائي:
// البرومبت لكلود:
"اكتب Filament Page مخصصة لتوثيق الزيارة الطبية تحتوي:
- SOAP Notes بأربعة حقول نصية منفصلة مع Auto-save كل 30 ثانية
- Vitals Grid: ضغط الدم، نبض، درجة حرارة، وزن، طول، تشبع الأكسجين
- ICD-10 Search: بحث عن رموز التشخيص بالاسم العربي والإنجليزي
- Drug Interaction Checker: عند إضافة دواء جديد للوصفة يتحقق
من التفاعلات مع الأدوية الأخرى في نفس الوصفة وأدوية المريض الحالية
- حقل الحساسية مع تنبيه تلقائي إذا الدواء الجديد يحتوي مادة من قائمة الحساسية"
// Drug Interaction Check:
class DrugInteractionChecker
{
public function check(array $currentDrugs, string $newDrug): array
{
// يستعلم من جدول drug_interactions
// أو يستدعي OpenFDA API للتحقق
$interactions = DrugInteraction::where(function($q) use ($newDrug, $currentDrugs) {
$q->where('drug_a', $newDrug)->whereIn('drug_b', $currentDrugs)
->orWhere('drug_b', $newDrug)->whereIn('drug_a', $currentDrugs);
})->get();
return $interactions->map(fn($i) => [
'severity' => $i->severity, // major/moderate/minor
'description_ar' => $i->description_ar,
'recommendation' => $i->recommendation_ar
])->toArray();
}
}
جدول نقاط API — REST Endpoints الكاملة
| Method | Endpoint | الوصف | الصلاحية المطلوبة |
|---|---|---|---|
| GET | /api/v1/patients | قائمة المرضى مع Pagination وSearch | doctor, nurse, admin |
| POST | /api/v1/patients | تسجيل مريض جديد | nurse, admin |
| GET | /api/v1/patients/{id}/medical-history | سجل طبي كامل للمريض | doctor (treating only) |
| GET | /api/v1/appointments/available-slots | الفترات المتاحة لطبيب في يوم محدد | public (patient portal) |
| POST | /api/v1/appointments | حجز موعد جديد | patient, nurse, admin |
| PATCH | /api/v1/appointments/{id}/status | تغيير حالة الموعد | doctor, nurse |
| POST | /api/v1/medical-records | إنشاء سجل طبي لزيارة | doctor only |
| POST | /api/v1/prescriptions | إصدار وصفة طبية | doctor only |
| GET | /api/v1/prescriptions/{id}/qr | QR Code للوصفة الرقمية | patient, pharmacist |
| POST | /api/v1/lab-orders | طلب تحاليل مختبر | doctor only |
| POST | /api/v1/lab-results/webhook | استقبال نتائج من المختبر | lab_provider (API Key) |
| GET | /api/v1/invoices/{id}/pdf | تحميل فاتورة PDF | patient, admin |
| GET | /api/v1/dashboard/kpis | مؤشرات الأداء للوحة القيادة | admin, manager |
| POST | /api/v1/drugs/interaction-check | فحص تفاعل دوائي فوري | doctor only |
مصفوفة صلاحيات RBAC — Role-Based Access Control
| الوحدة | Admin | Doctor | Nurse | Receptionist | Patient |
|---|---|---|---|---|---|
| بيانات المرضى الشخصية | كامل | قراءة | تعديل | قراءة | بياناته فقط |
| السجلات الطبية | قراءة | إنشاء + تعديل (مرضاه) | قراءة | لا | بياناته فقط |
| الوصفات الطبية | قراءة | إنشاء + إلغاء | قراءة | لا | بياناته فقط |
| المواعيد | كامل | تعديل حالة | إنشاء + تعديل | إنشاء + تعديل | حجز + إلغاء |
| الفواتير | كامل | قراءة | قراءة | إنشاء + تعديل | دفع فقط |
| نتائج المختبر | كامل | قراءة + تفسير | قراءة | لا | بياناته فقط |
| إعدادات النظام | كامل | لا | لا | لا | لا |
| تقارير KPIs | كامل | تقاريره فقط | لا | لا | لا |
// تطبيق RBAC مع Spatie Permission: // البرومبت لكلود: "استخدم spatie/laravel-permission لإنشاء: 1. الأدوار: super_admin, clinic_admin, doctor, nurse, receptionist, patient 2. الصلاحيات لكل وحدة: view_patients, create_patients, edit_patients... 3. RoleSeeder يُنشئ هذه الأدوار والصلاحيات تلقائياً 4. Policies لكل Model تتحقق من الدور والملكية (الطبيب يرى مرضاه فقط) 5. Middleware يتحقق من الصلاحية في كل Route"
نظام التذكيرات — WhatsApp + SMS + Email
نظام التذكيرات يعتمد على Laravel Queues وScheduler. كلود يبني هذا المنطق بدقة:
// app/Jobs/SendAppointmentReminder.php
// البرومبت لكلود:
"اكتب Job System كامل للتذكيرات:
1. عند حجز موعد: dispatch 2 Jobs مؤجلة:
- SendReminder24Hours: تُرسل قبل 24 ساعة من الموعد
- SendReminder1Hour: تُرسل قبل ساعة من الموعد
2. كل Job يتحقق أولاً أن الموعد لا يزال confirmed (لم يُلغَ)
3. رسالة واتساب تحتوي: اسم المريض، اسم الطبيب،
التاريخ والوقت، رابط إلغاء الموعد، رقم العيادة
4. في حالة فشل واتساب: يُرسل SMS بديلاً
في حالة فشل SMS: يُرسل بريد إلكتروني
5. يُسجّل في notifications_log: الوسيلة، الوقت، الحالة، رسالة الخطأ إن وجد"
// إلغاء تذكيرات موعد ملغي:
public function cancelReminders(Appointment $appointment): void
{
// يُلغي Jobs المعلّقة في Queue باستخدام Job ID المحفوظ
foreach (['24h_job_id', '1h_job_id'] as $jobField) {
if ($appointment->$jobField) {
Queue::connection()->deleteJob($appointment->$jobField);
}
}
}
لوحة KPIs التنفيذية — Dashboard Widgets بـ Filament
لوحة القيادة تعطي مدير العيادة نظرة 360 درجة فورية:
// البرومبت لكلود: "اكتب 6 Filament Dashboard Widgets: 1. StatsOverviewWidget: مواعيد اليوم / معدل الحضور / إيرادات الشهر / مرضى جدد هذا الأسبوع 2. AppointmentsTimelineWidget: جدول زمني لمواعيد اليوم مقسّم بالأطباء يُحدَّث كل 30 ثانية بـ polling 3. DoctorProductivityWidget: Chart يقارن عدد مرضى كل طبيب هذا الشهر 4. RevenueWidget: خط بياني للإيرادات اليومية 30 يوم الماضية مع مقارنة بنفس الفترة العام الماضي (% نمو) 5. PendingLabResultsWidget: قائمة تحاليل منتظرة أكثر من 48 ساعة 6. InsuranceClaimsWidget: مطالبات تأمين معلقة مع مجموع قيمتها"
بنية النشر — Deployment Architecture
DEPLOYMENT ARCHITECTURE
========================
[CDN / CloudFlare]
|
[Nginx Reverse Proxy] ← SSL Termination
|
[Laravel Application Servers]
├── PHP-FPM 8.3 (App Server #1)
└── PHP-FPM 8.3 (App Server #2 — للتوسع)
|
[Queue Workers — Laravel Horizon]
├── Worker: reminders (priority: high)
├── Worker: notifications (priority: medium)
└── Worker: reports (priority: low)
|
[Data Layer]
├── MySQL 8.0 (Primary — Write)
├── MySQL 8.0 (Replica — Read)
├── Redis (Cache + Sessions + Queues)
└── MinIO / S3 (ملفات PDF، صور، نتائج مختبر)
[External Services]
├── WhatsApp Business API (360dialog)
├── SMS Gateway (Unifonic / Msegat)
├── Payment Gateway (Moyasar / Tap)
└── Lab Integration API (HL7 FHIR)
[Monitoring]
├── Laravel Telescope (Development)
├── Sentry (Error Tracking)
└── Grafana + Prometheus (Infrastructure)
البرومبت الذهبي لإطلاق المشروع كاملاً
أرسل لكلود هذا في بداية الجلسة: "أنت مطور Laravel 11 متخصص في أنظمة الرعاية الصحية. ستساعدني في بناء نظام إدارة عيادة متكامل. سأعطيك ERD قاعدة البيانات كاملاً والمتطلبات الوظيفية لكل وحدة. تأكد من تطبيق: Soft Deletes لجميع الجداول الحيوية، تشفير الحقول الحساسة، Audit Log لكل تعديل، RBAC بـ Spatie Permission، والـ API Resources موثقة بـ OpenAPI spec."
أفضل الممارسات لبناء نظام العيادة مع كلود
ابدأ بـ ERD كامل قبل أي كود — أرسله لكلود مرة واحدة ثم اطلب جميع Migrations دفعة واحدة. هذا يضمن تناسق أسماء الجداول والحقول طوال المشروع.
اطلب من كلود كتابة Tests (Feature Tests) لكل Service مهم — خصوصاً منطق التحقق من تعارض المواعيد والتفاعلات الدوائية. هذه الوظائف الحساسة تحتاج اختباراً آلياً صارماً.
استخدم كلود لكتابة Factory بيانات واقعية عربية — أسماء سعودية ومصرية حقيقية، أرقام هواتف بتنسيق صحيح، تواريخ ميلاد منطقية. هذا يجعل التطوير والاختبار أكثر واقعية.
لكل Filament Resource معقد، اطلب من كلود إنشاء مخطط UI نصي أولاً: "ما الحقول التي يجب أن تظهر في نموذج الإنشاء؟ وما الأعمدة في الجدول؟ وما الفلاتر المطلوبة؟" قبل كتابة الكود.
فصّل Business Logic في Services — لا تضع منطق "التحقق من تعارض المواعيد" في Controller. اطلب من كلود إنشاء AppointmentService مستقل قابل للاختبار والإعادة.
احفظ Job IDs عند إنشاء Reminder Jobs لكل موعد. هذا يمكّنك من إلغاء التذكيرات عند إلغاء الموعد — ميزة يفتقر إليها كثير من الأنظمة التجارية.
استخدم Laravel Data (Spatie) بدل Form Requests المعقدة — كلود يكتب Data Classes بكفاءة عالية مع validation rules منظمة ويسهل إعادة استخدامها في API والـ Filament معاً.
قبل النشر، اطلب من كلود مراجعة أمنية صريحة: "راجع هذا الكود وحدد ثغرات OWASP الشائعة: SQL Injection, Mass Assignment, Insecure Direct Object Reference, Missing Authorization." كلود ممتاز في تدقيق الأمان.
جواهر خفية — ميزات متقدمة تُميّز النظام
تفسير نتائج المختبر بكلود AI
عند وصول نتائج التحاليل، أرسلها لـ Claude API مع بيانات المريض (عمر، جنس، أدوية حالية) واطلب تفسيراً طبياً مبسطاً للطبيب. كلود يُلخّص القيم غير الطبيعية ويُقترح نقاط المناقشة في الزيارة القادمة — يوفر على الطبيب 5-10 دقائق لكل حالة.
تنبيهات المتابعة الذكية
نظام يتتبع المرضى الذين لم يعودوا بعد زيارتهم الأولى خلال الفترة المقررة في خطة العلاج. Laravel Scheduler يُشغّل يومياً ويُرسل تذكير واتساب لطيف: "مرحباً أحمد، مر 3 أشهر على آخر زيارتك للدكتور محمد. هل تود حجز موعد متابعة؟" — يرفع معدل الاحتفاظ بالمرضى بشكل واضح.
تقارير التأمين الآلية
بدلاً من إعداد مطالبات التأمين يدوياً، كلود يساعد في بناء مولّد تقارير NPHIES (نظام التأمين الصحي السعودي) — يجمع الزيارات والتشخيصات والإجراءات ويُنتج ملف XML أو JSON بالتنسيق المطلوب. توفير ساعات من العمل الإداري أسبوعياً.
Dashboard مخصص لكل دور
Filament يتيح تخصيص Dashboard لكل Role. الطبيب يرى مرضاه اليوم + تحاليل منتظرة. السكرتيرة ترى المواعيد + المدفوعات المعلقة. المدير يرى KPIs الإيرادات + الكفاءة التشغيلية. كلود يكتب هذا التخصيص بشكل نظيف باستخدام Filament Panels.
Patient Portal — بوابة المريض الذاتية
صفحات Blade بسيطة تتيح للمريض: مشاهدة مواعيده القادمة، تحميل وصفاته ونتائج تحاليله، طلب إعادة صرف وصفة، وتقييم تجربة الزيارة. كلود يبني هذه الوحدة مع Authentication مستقل للمرضى (مختلف عن authentication المستخدمين الداخليين).
الأسئلة الشائعة
🧭 اكتشف المزيد
مواضيع مرتبطة من أقسام أخرى تُكمّل ما تعلمته