Implement SMS panel user flow and patient records system; add wallet charging, automatic reminders, and patient session management with detailed database schema and user flows.

This commit is contained in:
hamed
2026-06-14 21:15:40 +03:30
parent a72a6da621
commit b58aacc37f
28 changed files with 3169 additions and 0 deletions
@@ -0,0 +1,123 @@
# جریان کاربری — تسک ۱۵: پرونده بیمار
## جریان خودکار — تأیید نوبت → ایجاد پرونده
```
دکتر/منشی نوبت را تأیید می‌کند
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 │
│ ۵ مراجعه | آخرین: ۱۴۰۵/۰۳/۱۵ | مجموع: ۲,۲۵۰,۰۰۰ │
├─────────────────────────────────────────────────────┤
│ [+ مراجعه جدید] │
├──────────────┬──────────────┬──────────────────────┤
│ تاریخ │ مبلغ نهایی │ روش پرداخت عملیات │
├──────────────┼──────────────┼──────────────────────┤
│ ۱۴۰۵/۰۳/۱۵ │ ۴۴۵,۰۰۰ ریال│ نقدی ✏️ 👁️ │
│ ۱۴۰۵/۰۲/۰۸ │ ۳۲۰,۰۰۰ ریال│ کارت ✏️ 👁️ │
└──────────────┴──────────────┴──────────────────────┘
```