# جریان کاربری — تسک ۱۵: پرونده بیمار ## جریان خودکار — تأیید نوبت → ایجاد پرونده ``` دکتر/منشی نوبت را تأیید می‌کند │ ▼ PATCH /api/v1/appointment/{uuid}/status { status: 'confirmed' } │ ▼ AppointmentController::updateStatus() │ ▼ آیا entity دارای پنل Basic+ است؟ خیر → پرونده ایجاد نمی‌شود (Free plan) بله ↓ ▼ PatientService::autoCreateOnAppointmentConfirm() │ ▼ آیا PatientRecord برای این (entity, user) وجود دارد؟ خیر → ایجاد PatientRecord جدید (created_by='system') بله → همان پرونده استفاده می‌شود │ ▼ ایجاد PatientSession با: appointment_id = appointment.id visit_price_rials = 0 ← کاربر بعداً تکمیل می‌کند payment_method = 'pending' ``` ## جریان دستی — ایجاد پرونده توسط منشی ``` منشی در صفحه «بیماران» کلیک می‌کند → [+ بیمار جدید] │ ▼ Modal: جستجو بیمار با نام یا شماره تلفن GET /api/v1/admin/users?search=09121234567 │ ▼ بیمار انتخاب می‌شود │ ▼ POST /api/v1/patient { user_uuid: '...' } │ ├─► 409: این بیمار قبلاً پرونده دارد → نمایش پرونده موجود └─► 201: پرونده ایجاد شد → redirect به PatientDetailPage ``` ## جریان ثبت مراجعه (سشن) ``` منشی/دکتر در صفحه پرونده بیمار، روی «+ مراجعه جدید» کلیک می‌کند │ ▼ Modal ثبت سشن: ┌──────────────────────────────────────────────────────┐ │ ثبت مراجعه جدید │ ├──────────────────────────────────────────────────────┤ │ بیمه پایه: [تأمین اجتماعی ▼] │ │ درصد کسر: [۳۰%____________] │ │ بیمه مکمل: [---بدون مکمل--- ▼] │ ├──────────────────────────────────────────────────────┤ │ مبلغ ویزیت: [500,000 ریال____] │ ├──────────────────────────────────────────────────────┤ │ سرویس‌های انجام‌شده: │ │ [+ سرم ۵۰۰cc × علی رضایی] [+ سرویس دیگر] │ ├──────────────────────────────────────────────────────┤ │ 📊 محاسبه: │ │ ویزیت: 500,000 → بعد از بیمه: 315,000 │ │ سرویس‌ها: 130,000 │ │ مجموع: 445,000 ریال │ ├──────────────────────────────────────────────────────┤ │ روش پرداخت: [نقدی ▼] │ │ یادداشت: [____________________________] │ └──────────────────────────────────────────────────────┘ │ [لغو] [ثبت مراجعه] │ │ ▼ POST /api/v1/patient/{uuid}/session { ... } │ ▼ سشن ثبت شد → لیست مراجعات refresh می‌شود ``` ## محاسبه real-time در Frontend ``` هر بار که visit_price یا discount درصد تغییر می‌کند: after_base = visit_price × (1 - base_discount / 100) after_supp = after_base × (1 - supp_discount / 100) final = round(after_supp) + services_total نمایش: «مبلغ قابل پرداخت: ۴۴۵,۰۰۰ ریال» ``` ## جریان جستجو بیمار ``` GET /api/v1/patients?search=علی&page=1 → جستجو در نام و شماره تلفن user → نمایش paginated در DataTable → کلیک روی هر ردیف → PatientDetailPage ``` ## نمایش صفحه بیمار (PatientDetailPage.tsx) ``` ┌─────────────────────────────────────────────────────┐ │ علی محمدی — 09121234567 │ │ ۵ مراجعه | آخرین: ۱۴۰۵/۰۳/۱۵ | مجموع: ۲,۲۵۰,۰۰۰ │ ├─────────────────────────────────────────────────────┤ │ [+ مراجعه جدید] │ ├──────────────┬──────────────┬──────────────────────┤ │ تاریخ │ مبلغ نهایی │ روش پرداخت عملیات │ ├──────────────┼──────────────┼──────────────────────┤ │ ۱۴۰۵/۰۳/۱۵ │ ۴۴۵,۰۰۰ ریال│ نقدی ✏️ 👁️ │ │ ۱۴۰۵/۰۲/۰۸ │ ۳۲۰,۰۰۰ ریال│ کارت ✏️ 👁️ │ └──────────────┴──────────────┴──────────────────────┘ ```