الرئيسية Claude AI مركز التعلم القطاعات تواصل معنا
واتساب اتصل بنا

بناء نظام إدارة عيادات كامل بكلود AI — Laravel + Filament من الصفر

clinic management system - كلود AI

نظام إدارة العيادة ليس مجرد "سجل مرضى" — هو منظومة متكاملة تتحكم في تجربة المريض من لحظة حجز الموعد حتى استلام الفاتورة ومتابعة نتائج المختبر. بناء هذا النظام يدوياً من الصفر كان يستلزم شهوراً وفريقاً متخصصاً. اليوم مع كلود AI وClaude Code، يمكن لمطور واحد بناء النظام الكامل في أسابيع قليلة بجودة إنتاجية حقيقية.

في هذا الدليل لن نتوقف عند "كيف تسأل كلود" — سنغطي البنية التقنية الكاملة: ERD قاعدة البيانات، نقاط API، صلاحيات المستخدمين، وتكامل الخدمات الخارجية. هذا هو الدليل الذي يريده المطور المحترف الذي يبني منتجاً حقيقياً.

معمارية النظام — نظرة شاملة قبل السطر الأول من الكود

قبل فتح Claude Code، يجب أن يكون لديك خريطة واضحة. نظام العيادة يتكون من طبقات متمايزة:

1
طبقة البيانات (Data Layer): قاعدة بيانات MySQL مع جداول منفصلة للمرضى، الأطباء، المواعيد، السجلات الطبية، الوصفات، الفواتير. الفصل بين الهوية الشخصية والسجل الطبي إلزامي للخصوصية.
2
طبقة الأعمال (Business Logic Layer): Services في Laravel تحتوي منطق التحقق من التفاعلات الدوائية، حساب الجدولة، تطبيق قواعد التأمين. أي منطق معقد يعيش هنا لا في Controller.
3
طبقة العرض (Presentation Layer): Filament v3 للمستخدمين الداخليين (أطباء، سكرتيرة، إدارة). Blade + Alpine.js لبوابة المريض الخارجية. API Resources لتطبيقات الموبايل المستقبلية.
4
طبقة التكامل (Integration Layer): WhatsApp/SMS للتذكيرات، بوابة دفع إلكتروني، بريد إلكتروني للتقارير، نظام المختبر الخارجي لاستقبال نتائج التحاليل.
5
طبقة الأمان (Security Layer): RBAC لصلاحيات متعددة المستويات، تشفير البيانات الحساسة، Audit Log لكل تعديل، Rate Limiting للـ API.

مخطط 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 الكاملة

MethodEndpointالوصفالصلاحية المطلوبة
GET/api/v1/patientsقائمة المرضى مع Pagination وSearchdoctor, 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}/qrQR 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تحميل فاتورة PDFpatient, admin
GET/api/v1/dashboard/kpisمؤشرات الأداء للوحة القيادةadmin, manager
POST/api/v1/drugs/interaction-checkفحص تفاعل دوائي فوريdoctor only

مصفوفة صلاحيات RBAC — Role-Based Access Control

الوحدةAdminDoctorNurseReceptionistPatient
بيانات المرضى الشخصيةكاملقراءةتعديلقراءةبياناته فقط
السجلات الطبيةقراءةإنشاء + تعديل (مرضاه)قراءةلابياناته فقط
الوصفات الطبيةقراءةإنشاء + إلغاءقراءةلابياناته فقط
المواعيدكاملتعديل حالةإنشاء + تعديلإنشاء + تعديلحجز + إلغاء
الفواتيركاملقراءةقراءةإنشاء + تعديلدفع فقط
نتائج المختبركاملقراءة + تفسيرقراءةلابياناته فقط
إعدادات النظامكامللالالالا
تقارير 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."

أفضل الممارسات لبناء نظام العيادة مع كلود

1

ابدأ بـ ERD كامل قبل أي كود — أرسله لكلود مرة واحدة ثم اطلب جميع Migrations دفعة واحدة. هذا يضمن تناسق أسماء الجداول والحقول طوال المشروع.

2

اطلب من كلود كتابة Tests (Feature Tests) لكل Service مهم — خصوصاً منطق التحقق من تعارض المواعيد والتفاعلات الدوائية. هذه الوظائف الحساسة تحتاج اختباراً آلياً صارماً.

3

استخدم كلود لكتابة Factory بيانات واقعية عربية — أسماء سعودية ومصرية حقيقية، أرقام هواتف بتنسيق صحيح، تواريخ ميلاد منطقية. هذا يجعل التطوير والاختبار أكثر واقعية.

4

لكل Filament Resource معقد، اطلب من كلود إنشاء مخطط UI نصي أولاً: "ما الحقول التي يجب أن تظهر في نموذج الإنشاء؟ وما الأعمدة في الجدول؟ وما الفلاتر المطلوبة؟" قبل كتابة الكود.

5

فصّل Business Logic في Services — لا تضع منطق "التحقق من تعارض المواعيد" في Controller. اطلب من كلود إنشاء AppointmentService مستقل قابل للاختبار والإعادة.

6

احفظ Job IDs عند إنشاء Reminder Jobs لكل موعد. هذا يمكّنك من إلغاء التذكيرات عند إلغاء الموعد — ميزة يفتقر إليها كثير من الأنظمة التجارية.

7

استخدم Laravel Data (Spatie) بدل Form Requests المعقدة — كلود يكتب Data Classes بكفاءة عالية مع validation rules منظمة ويسهل إعادة استخدامها في API والـ Filament معاً.

8

قبل النشر، اطلب من كلود مراجعة أمنية صريحة: "راجع هذا الكود وحدد ثغرات 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 المستخدمين الداخليين).

الأسئلة الشائعة

هل يمكن لكلود AI كتابة كود Laravel لنظام العيادة من الصفر؟
نعم، كلود يستطيع كتابة كود Laravel كامل — Models وMigrations وControllers وFilament Resources وAPI Endpoints — بدقة عالية جداً. المطلوب منك توضيح متطلبات كل وحدة بوضوح وتزويد كلود بمخطط ERD أو وصف المنطق التجاري المطلوب. كلود يكتب الكود ويشرحه ويضيف التعليقات المناسبة باللغتين العربية والإنجليزية.
كيف يتم التحقق من الهوية الوطنية للمريض برمجياً؟
التحقق يتم بطبقتين: أولاً Validation محلي عبر Regex يتحقق من 10 أرقام وبدء الرقم بـ 1 للمواطن أو 2 للمقيم. ثانياً خوارزمية التحقق الرياضية المعتمدة التي تضمن صحة الرقم وليس فقط تنسيقه. اختيارياً يمكن الربط بـ Absher API للتحقق الرسمي. كلود يكتب هذا Validator كاملاً مع رسائل خطأ عربية واضحة.
ما أفضل طريقة لتخزين السجلات الطبية الإلكترونية بأمان؟
أفضل الممارسات تشمل: تشفير حقول الملاحظات الطبية بـ AES-256 عبر Encrypted cast في Laravel قبل التخزين، فصل بيانات المريض الشخصية عن السجلات الطبية في جداول منفصلة، تفعيل Audit Log لكل تعديل يُسجّل من عدّل وماذا ومتى، وتطبيق Row-Level Security. كلود يكتب هذه الطبقات الأمنية كاملة ويوضح الـ tradeoffs لكل خيار.
كيف يتم إرسال تذكيرات المواعيد عبر واتساب تلقائياً؟
يعتمد على: Laravel Scheduler يُشغّل Job كل ساعة يبحث عن مواعيد خلال 24 ساعة و1 ساعة قادمة، Queue System (Laravel Horizon) لمعالجة الإرسال بشكل غير متزامن دون إبطاء التطبيق، وWhatsApp Business API (360dialog أو Twilio) لإرسال Template Message معتمدة مسبقاً من Meta. كلود يكتب هذا المنطق كاملاً مع fallback لـ SMS وإدارة حالات الفشل.
هل Filament مناسب لواجهة نظام العيادة أم يجب بناء واجهة مخصصة؟
Filament v3 ممتاز للواجهة الداخلية التي يستخدمها الأطباء والممرضون والإدارة — يوفر Tables وForms وWidgets احترافية بكود قليل ويدعم RTL عربي بشكل كامل. أما بوابة المرضى الخارجية التي يحجزون منها مواعيدهم، فيُفضل بناء واجهة Blade أو Next.js أكثر مرونة وجمالاً. كلود يبني كلا النوعين بكفاءة.

🧭 اكتشف المزيد

مواضيع مرتبطة من أقسام أخرى تُكمّل ما تعلمته

محتاج مساعدة احترافية؟

فريق A Plan جاهز يساعدك في بناء نظام العيادة الكامل.

تواصل عبر واتساب