Files
clinicpro/docs/new_feture/taskes/task-06-availability-engine/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

5.6 KiB
Raw Blame History

جریان کاربری — تسک ۰۶

الف) بیمار وقت انتخاب می‌کند (سایت عمومی)

[از تسک ۰۵] برنامهٔ نوبت ساخته شد: ۶۸ دقیقه، ۵ بخش
    │
    ▼
GET /api/v1/appointment-availability/month?…&month=1405-05
    → { "1405-05-03": true, "1405-05-04": false, … }
    تقویم شمسی: روزهای بدون ظرفیت خاکستری
    │
    ▼
بیمار روز ۳ مرداد را می‌زند
    │
    ▼
POST /api/v1/appointment-availability
{
  "doctor_uuid": "…", "branch_uuid": "…",
  "service_item_uuid": "…", "option_uuids": ["…","…"],
  "from": "1405-05-03", "to": "1405-05-03", "limit": 50
}
    ▼
{
  "data": {
    "total_minutes": 68,
    "patient_facing_minutes": 63,
    "slots": [
      { "start": 1754…, "start_time": "09:00", "end_time": "10:08",
        "assignment": { "room": "اتاق ۲", "operator": "مریم …", "device": "کندلا ۱" } },
      { "start": 1754…, "start_time": "10:15", … }
    ]
  }
}

بیمار assignment را نمی‌بیند. فقط ساعت. تخصیص برای پنل و برای مرحلهٔ رزرو موقت است. (استثنا: اگر کلینیک «انتخاب پزشک/اپراتور توسط بیمار» را فعال کرده باشد — خارج از دامنهٔ این تسک.)

    ▼
بیمار ۰۹:۰۰ را می‌زند  →  تسک ۰۷ (رزرو موقت)

ب) هیچ وقتی نیست — سه پیام متفاوت

POST /appointment-availability → data.slots = []
                                 data.reason = ?
reason پیام فارسی دکمهٔ پیشنهادی
no_resource «برای این خدمت، منبع لازم در این شعبه تعریف نشده است» (پنل) «افزودن منبع»
no_calendar «برای منابع این خدمت ساعت کاری تعریف نشده است» (پنل) «تنظیم تقویم»
fully_booked «در بازهٔ انتخابی وقت خالی نیست» «جستجو در ۳۰ روز آینده»
outside_window «رزرو آنلاین فقط تا ۳ ماه آینده ممکن است»

پیام واحد «وقتی موجود نیست» بدترین حالت است: بیمار فکر می‌کند کلینیک پر است در حالی که کلینیک اصلاً تقویم تعریف نکرده.


ج) منشی از پنل — با انتخاب دستی منبع

پنل › نوبت جدید
    │
    ├─ بیمار (جستجو یا ثبت جدید)
    ├─ شعبه · سرویس · آیتم‌ها
    │     └─ اعتبارسنجی زنده (تسک ۰۴)
    ▼
POST /appointment-availability  با forManagement=true
    │  (بازهٔ رزرو آنلاین و خاموش‌بودن نوبت‌دهی اعمال نمی‌شود — رفتار امروزی)
    ▼
جدول وقت‌ها با ستون «منابع پیشنهادی»

  ساعت    مدت    اتاق      اپراتور    دستگاه
  ─────────────────────────────────────────────
  ۰۹:۰۰   ۶۸'    اتاق ۲ ▾   مریم ▾    کندلا ۱ ▾
  ۱۰:۱۵   ۶۸'    اتاق ۱ ▾   سارا ▾    کندلا ۲ ▾

هر ▾ یک SearchableSelect است با فقط منابع آزادِ همان بازه.
عوض کردن یکی → درخواست دوباره برای اعتبارسنجی همان زمان (نه کل لیست).
    ▼
«ثبت نوبت» → تسک ۰۷

د) کلینیک به حالت چندمنبعی ارتقا می‌دهد

پنل › تنظیمات نوبت‌دهی
    │
    وضعیت فعلی: «نوبت‌دهی سرویسی» (قفل‌شده)
    │
    ├─ بنر: «ارتقا به نوبت‌دهی چندمنبعی»
    │     ✓ ۵ منبع فعال دارید
    │     ✓ ۳ سرویس با مدت معتبر
    │     ✗ ۲ نوبت فعال در آینده دارید — ابتدا تعیین تکلیف کنید
    │       [مشاهدهٔ نوبت‌ها]
    │
    ▼ (بعد از رفع همهٔ شرط‌ها)
    ├─ ☑ می‌دانم این تغییر برگشت‌ناپذیر است
    └─ [ارتقا]
    ▼
POST /api/v1/appointment-settings/upgrade-booking-mode
    ▼
حالا تنظیمات جدید فعال می‌شوند:
    گام زمانی: ۱۵ دقیقه ▾
    استراتژی انتخاب منبع: کمترین شکاف ▾

چک‌لیست پیش از ارتقا اجباری است. بدون آن، کلینیک ارتقا می‌دهد، نوبت‌های قدیمی‌اش نمایش نادرست می‌گیرند و هیچ راه بازگشتی نیست.


ه) چه چیزی در این جریان تغییر نمی‌کند

پزشک در حالت slot     → GET /api/v1/appointment-slots            بدون تغییر
پزشک در حالت service  → GET /api/v1/appointment-service-slots    بدون تغییر
تقویم ماهانهٔ قدیمی    → GET /api/v1/appointment-settings/month-availability/{uuid}  بدون تغییر

سایت عمومی و اپ دسکتاپ تا وقتی کلینیک ارتقا نداده، هیچ کد جدیدی لازم ندارند. پس از ارتقا، GET /appointment-booking-services مقدار booking_mode: "resource" می‌دهد و کلاینت باید مسیر جدید را صدا بزند — این تنها نقطه‌ای است که کلاینت‌ها باید به‌روز شوند و باید در docs/api/appointment.md برجسته نوشته شود.