- 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.
150 lines
7.4 KiB
Markdown
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 (تسک ۱۴)
|
|
▼
|
|
کارت بیمار: «دورهٔ لیزر فولبادی تکمیل شد — ۸ جلسه در ۲۳۱ روز»
|
|
[شروع دورهٔ نگهدارنده]
|
|
```
|