# جریان کاربری — تسک ۱۲

## الف) کلینیک پروتکل دوره را تعریف می‌کند

```
پنل › خدمات › لیزر فول‌بادی › تب «پروتکل دوره»
    │
    تعداد جلسات: ۸
    فاصلهٔ حداقل / ایده‌آل / حداکثر: ۲۱ / ۲۸ / ۴۵ روز
    ☑ تلاش برای انتخاب همان اپراتور جلسات قبل
    │
    پارامتر هر جلسه:
    ┌──────┬──────────────┬────────────┐
    │ جلسه │ سطح انرژی    │ مدت خاص    │
    ├──────┼──────────────┼────────────┤
    │  ۱   │      ۱۲      │  ۷۵ دقیقه  │  ← جلسهٔ اول طولانی‌تر (تست و آموزش)
    │  ۲   │      ۱۴      │     —      │
    │  …   │      …       │     —      │
    │  ۸   │      ۲۲      │     —      │
    └──────┴──────────────┴────────────┘
    ▼
POST /api/v1/course-protocols
```

---

## ب) شروع دوره و رزرو کل آن

```
پنل › بیمار › «شروع دورهٔ درمان»
    سرویس: لیزر فول‌بادی  (پروتکل خودکار بارگذاری می‌شود)
    پکیج: «۶ جلسه لیزر» ▾  (اختیاری — تسک ۱۱)
    ▼
POST /api/v1/treatment-course
    → ۸ CourseSession با وضعیت «برنامه‌ریزی‌شده»
    ⚠️ «اعتبار پکیج (۶) کمتر از جلسات دوره (۸) است»
    ▼
صفحهٔ دوره:

┌────────────────────────────────────────────────────────┐
│ لیزر فول‌بادی — ز. احمدی            ● دورهٔ فعال        │
│ ●●●○○○○○  ۳ از ۸ جلسه                                  │
├──────┬─────────────┬────────┬─────────┬────────────────┤
│ جلسه │ تاریخ       │ فاصله  │ انرژی   │ وضعیت          │
├──────┼─────────────┼────────┼─────────┼────────────────┤
│  ۱   │ ۱۴۰۵/۰۳/۰۵ │   —    │  ۱۲     │ ✔ انجام‌شده     │
│  ۲   │ ۱۴۰۵/۰۴/۰۲ │ ۲۸ روز │  ۱۴     │ ✔ انجام‌شده     │
│  ۳   │ ۱۴۰۵/۰۵/۰۳ │ ۳۱ روز │  ۱۶     │ ✔ انجام‌شده     │
│  ۴   │ ۱۴۰۵/۰۵/۳۱ │ ۲۸ روز │  ۱۸     │ ◷ رزروشده       │
│  ۵   │      —      │   —    │  ۲۰     │ ○ برنامه‌ریزی‌شده│
└──────┴─────────────┴────────┴─────────┴────────────────┘
     [رزرو جلسهٔ بعدی]   [رزرو همهٔ جلسات باقی‌مانده]
```

ستون «فاصله» عدد واقعی است، نه ایده‌آل. کلینیک از آن می‌فهمد بیمار منظم است یا نه.

```
«رزرو همهٔ جلسات باقی‌مانده»
    ▼
POST /treatment-course/{uuid}/book-all
    │
    ├─ لنگر: تاریخ جلسهٔ ۴ (آخرین رزروشده)
    ├─ جلسهٔ ۵: هدف ۲۸ روز بعد → نزدیک‌ترین وقت در بازهٔ ۲۱..۴۵ روز
    ├─ جلسهٔ ۶: لنگر = تاریخ واقعی جلسهٔ ۵
    ├─ جلسهٔ ۷: خارج از ۹۰ روز → planned می‌ماند
    └─ همه در یک تراکنش
    ▼
200 { "booked_count": 2, "remaining_planned": 2,
      "message": "۲ جلسه رزرو شد. جلسات ۷ و ۸ خارج از بازهٔ مجاز رزرو (۹۰ روز) هستند." }
```

---

## ج) پیشنهاد جلسهٔ بعدی بعد از هر جلسه

```
منشی وضعیت جلسهٔ ۳ را «انجام‌شده» می‌کند
    ▼
سیستم خودکار بنر نشان می‌دهد:

┌────────────────────────────────────────────────┐
│ 📅 جلسهٔ بعدی این بیمار                          │
│    جلسهٔ ۴ از ۸ · سطح انرژی: ۱۸                 │
│    تاریخ پیشنهادی: ۱۴۰۵/۰۵/۳۱  (۲۸ روز بعد)    │
│    بازهٔ مجاز: ۱۴۰۵/۰۵/۲۴ تا ۱۴۰۵/۰۶/۱۷        │
│                                                │
│    ۰۹:۰۰ ▸   ۱۱:۳۰ ▸   ۱۴:۰۰ ▸                 │
│                          [رزرو با اپراتور مریم]│
└────────────────────────────────────────────────┘
```

«اپراتور مریم» چون جلسات ۱ تا ۳ با او بود (`same_as_previous`). اگر آزاد نباشد، نامش
عوض می‌شود و رزرو رد نمی‌شود.

---

## د) بیمار دیر می‌آید — عبور از حداکثر فاصله

```
۶۰ روز از جلسهٔ ۳ گذشته (حداکثر ۴۵ روز)
    ▼
GET /treatment-course/{uuid}/next-slot-suggestion
    ▼
{
  "session_number": 4,
  "warning": "از حداکثر فاصلهٔ مجاز (۴۵ روز) عبور شده است. برای ادامهٔ دوره با پزشک مشورت کنید.",
  "suggested_slots": [ … ]
}
```

در UI یک نوار زرد بالای پیشنهادها. **رزرو مسدود نمی‌شود** — تصمیم بالینی است، نه فنی.
اگر کلینیکی می‌خواهد واقعاً مسدود شود، آن یک قانون `eligibility` است (تسک ۰۹).

---

## ه) لغو جلسهٔ وسط دوره

```
جلسهٔ ۴ لغو می‌شود
    ▼
├─ Appointment → cancelled_*
├─ CourseSession ۴ → planned ، appointment_id → NULL
├─ اعتبار پکیج → refund +1 (تسک ۱۱)
├─ اشغال منابع → released (تسک ۰۷)
└─ جلسات ۵..۸ دست‌نخورده
    ▼
پیشنهاد بعدی: لنگر همان جلسهٔ ۳ (آخرین انجام‌شده)
```

جلسات بعدی خودکار جابه‌جا **نمی‌شوند**. جابه‌جایی زنجیره‌ای پنج نوبت آیندهٔ بیمار بدون
تأیید، همان مسئلهٔ `abandon` است: عمل برگشت‌ناپذیر روی داده و ظرفیت.

پنل یک پیشنهاد نشان می‌دهد: «فاصلهٔ جلسات ۵ تا ۸ با لغو این جلسه از پروتکل خارج شد.
[بازچینی جلسات باقی‌مانده]» — با یک کلیک صریح.

---

## و) پایان دوره

```
جلسهٔ ۸ → completed
    ▼
├─ TreatmentCourse → completed ، completed_at = now
├─ active_course_key → NULL  (بیمار می‌تواند دورهٔ جدید شروع کند)
└─ رویداد CourseCompleted (تسک ۱۴)
    ▼
کارت بیمار: «دورهٔ لیزر فول‌بادی تکمیل شد — ۸ جلسه در ۲۳۱ روز»
        [شروع دورهٔ نگهدارنده]
```
