# جریان کاربری — تسک ۱۲ ## الف) کلینیک پروتکل دوره را تعریف می‌کند ``` پنل › خدمات › لیزر فول‌بادی › تب «پروتکل دوره» │ تعداد جلسات: ۸ فاصلهٔ حداقل / ایده‌آل / حداکثر: ۲۱ / ۲۸ / ۴۵ روز ☑ تلاش برای انتخاب همان اپراتور جلسات قبل │ پارامتر هر جلسه: ┌──────┬──────────────┬────────────┐ │ جلسه │ سطح انرژی │ مدت خاص │ ├──────┼──────────────┼────────────┤ │ ۱ │ ۱۲ │ ۷۵ دقیقه │ ← جلسهٔ اول طولانی‌تر (تست و آموزش) │ ۲ │ ۱۴ │ — │ │ … │ … │ — │ │ ۸ │ ۲۲ │ — │ └──────┴──────────────┴────────────┘ ▼ 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 (تسک ۱۴) ▼ کارت بیمار: «دورهٔ لیزر فول‌بادی تکمیل شد — ۸ جلسه در ۲۳۱ روز» [شروع دورهٔ نگهدارنده] ```