6.1 KiB
6.1 KiB
جریان کاربری — تسک ۱۵: پرونده بیمار
جریان خودکار — تأیید نوبت → ایجاد پرونده
دکتر/منشی نوبت را تأیید میکند
│
▼
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 │
│ ۵ مراجعه | آخرین: ۱۴۰۵/۰۳/۱۵ | مجموع: ۲,۲۵۰,۰۰۰ │
├─────────────────────────────────────────────────────┤
│ [+ مراجعه جدید] │
├──────────────┬──────────────┬──────────────────────┤
│ تاریخ │ مبلغ نهایی │ روش پرداخت عملیات │
├──────────────┼──────────────┼──────────────────────┤
│ ۱۴۰۵/۰۳/۱۵ │ ۴۴۵,۰۰۰ ریال│ نقدی ✏️ 👁️ │
│ ۱۴۰۵/۰۲/۰۸ │ ۳۲۰,۰۰۰ ریال│ کارت ✏️ 👁️ │
└──────────────┴──────────────┴──────────────────────┘