127 lines
5.8 KiB
Markdown
127 lines
5.8 KiB
Markdown
# جریان کاربری — تسک ۱۱: پنل اشتراکی
|
||
|
||
## جریان مشاهده پنلها و خرید
|
||
|
||
```
|
||
کاربر وارد صفحه اشتراک میشود
|
||
│
|
||
▼
|
||
GET /api/v1/subscription/my
|
||
→ نمایش پنل فعلی + تاریخ انقضا (شمسی) + days_remaining
|
||
→ اگر used_trial=false و trial_enabled=true → بنر تریال نمایش داده میشود
|
||
│
|
||
▼
|
||
GET /api/v1/subscription/plans
|
||
→ جدول مقایسه پنلها (free | basic | professional)
|
||
→ هر پنل: لیست دورهها با قیمت — دروه تریال جدا نمایش داده میشود
|
||
│
|
||
├─► کاربر «تریال» انتخاب میکند:
|
||
│ │
|
||
│ ▼
|
||
│ POST /api/v1/subscription/trial
|
||
│ ├─► 200: فعال شد → صفحه refresh
|
||
│ └─► 400: قبلاً استفاده شده → toast خطا
|
||
│
|
||
└─► کاربر یک دوره پولی انتخاب میکند:
|
||
│
|
||
▼
|
||
POST /api/v1/subscription-payment (موجود)
|
||
{ period_uuid, gateway: 'mellat' }
|
||
│
|
||
▼
|
||
redirect به gateway بانک
|
||
│
|
||
▼
|
||
GET|POST /api/v1/subscription-payment/callback/{gateway}
|
||
│
|
||
▼
|
||
SubscriptionService::createFromPayment()
|
||
→ ClinicSubscription ساخته میشود
|
||
│
|
||
▼
|
||
redirect به /admin/subscription?success=1
|
||
```
|
||
|
||
## جریان تمدید اشتراک
|
||
|
||
```
|
||
اشتراک ۶ ماهه فعال است (expires_at = آینده)
|
||
│
|
||
▼
|
||
کاربر دوره جدید ۶ ماهه انتخاب میکند و پرداخت میکند
|
||
│
|
||
▼
|
||
calculateExpiresAt():
|
||
base = max(expires_at_فعلی, now) ← از تاریخ انقضا (نه الان)
|
||
new_expires = base + 6 × 30 × 86400
|
||
│
|
||
▼
|
||
اشتراک ۶ ماه دیگر تمدید میشود بدون اتلاف زمان باقیمانده
|
||
```
|
||
|
||
## جریان gate check در تسکهای بعدی
|
||
|
||
```
|
||
کاربر Free تلاش میکند پرونده بیمار بسازد
|
||
│
|
||
▼
|
||
POST /api/v1/patient
|
||
│
|
||
▼
|
||
PatientController::create():
|
||
$hasFeature = $subscriptionService->hasFeature($entityType, $entityId, 'patient_records')
|
||
│
|
||
├─► false → 403 ERR_SUBSCRIPTION_REQUIRED
|
||
│ { "errors": [{ "code": "ERR_SUBSCRIPTION_REQUIRED",
|
||
│ "message": "این قابلیت نیاز به پنل Basic یا بالاتر دارد" }] }
|
||
│
|
||
└─► true → ادامه پردازش
|
||
```
|
||
|
||
## جریان مدیریت پنلها توسط ادمین
|
||
|
||
```
|
||
ادمین وارد صفحه مدیریت اشتراک میشود
|
||
│
|
||
├─► تب «پنلها»:
|
||
│ GET /api/v1/admin/subscription/plans
|
||
│ → جدول پنلها با دورهها و قیمتها
|
||
│ → PATCH /api/v1/admin/subscription/period/{uuid} ← ویرایش inline قیمت
|
||
│ → POST /api/v1/admin/subscription/period ← افزودن دوره جدید
|
||
│
|
||
└─► تب «گزارش»:
|
||
GET /api/v1/admin/subscription/report?from=UNIX&to=UNIX
|
||
→ تعداد خریدها + مجموع درآمد + تعداد تریالها
|
||
→ breakdown بر اساس plan و period
|
||
```
|
||
|
||
## هشدار انقضا (frontend)
|
||
|
||
```
|
||
در هر بار لود صفحه:
|
||
اگر days_remaining <= 7 و expires_at != null:
|
||
→ نمایش banner هشدار: «اشتراک شما X روز دیگر منقضی میشود — تمدید کنید»
|
||
```
|
||
|
||
## نمایش در Frontend (SubscriptionPage.tsx)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────┐
|
||
│ 🎁 یک ماه تریال رایگان — فعالسازی │ ← فقط اگر used_trial=false
|
||
├─────────────────────────────────────────────────────┤
|
||
│ پنل فعلی: Basic | انقضا: ۱۴۰۵/۰۶/۲۳ | ۴۲ روز │
|
||
├───────────┬──────────────────┬─────────────────────┤
|
||
│ Free │ Basic ★ │ Professional │
|
||
│ رایگان │ پرونده بیمار ✅ │ پرونده بیمار ✅ │
|
||
│ ۱ منشی │ سرویسها ✅ │ سرویسها ✅ │
|
||
│ │ ۲ منشی │ ۵ منشی │
|
||
│ │ ┌──────────┐ │ │
|
||
│ │ │ ۱ ماهه │ │ [انتخاب دوره ▼] │
|
||
│ │ │ ۲۵۰,۰۰۰ │ │ │
|
||
│ │ │ ۶ ماهه │ │ │
|
||
│ │ │ ۱,۲۰۰,۰۰۰│ │ │
|
||
│ │ └──────────┘ │ │
|
||
│ │ [خرید اشتراک] │ [خرید اشتراک] │
|
||
└───────────┴──────────────────┴─────────────────────┘
|
||
```
|