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

7.4 KiB

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

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

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