Files
clinicpro/docs/new_feture/taskes/task-12-treatment-course/user_flow.md
T
hamed 021d0eb6b2 feat: implement cancellation policy, no-show tracking, and waitlist management
- Add implementation notes for cancellation and waitlist features.
- Create task documentation outlining goals, current status, and acceptance criteria for cancellation policy and resource utilization reporting.
- Establish architecture for domain events and outbox pattern to ensure reliable event publishing.
- Define database schema for domain events and necessary queries for resource utilization and plan accuracy reports.
- Implement detailed implementation notes covering edge cases, testing strategies, and documentation requirements.
2026-07-30 11:43:58 +03:30

150 lines
7.4 KiB
Markdown

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