# جریان کاربری — تسک ۱۳: سرویس‌های کلینیک ## جریان مشاهده و ایجاد سرویس‌ها ``` کاربر وارد صفحه «سرویس‌ها» می‌شود │ ▼ GET /api/v1/service-sections → accordion دو سطحی نمایش داده می‌شود │ بر روی هر بخش کلیک می‌کند: ▼ GET /api/v1/service-items/{sectionUuid} → زیربخش‌ها نمایش داده می‌شوند ``` ## ساختار نمایش (ServicesPage.tsx) ``` ┌─────────────────────────────────────────────┐ │ سرویس‌های کلینیک [+ بخش جدید] │ ├─────────────────────────────────────────────┤ │ ▼ تزریقات ✏️ 🗑️ │ │ ├─ سرم ۵۰۰cc ۸۵,۰۰۰ ریال ✏️ 🗑️ │ │ ├─ آمپول B12 ۴۵,۰۰۰ ریال ✏️ 🗑️ │ │ └─ [+ سرویس جدید] │ ├─────────────────────────────────────────────┤ │ ► فیزیوتراپی ✏️ 🗑️ │ └─────────────────────────────────────────────┘ ``` ## جریان ایجاد بخش جدید ``` کاربر «+ بخش جدید» کلیک می‌کند → Modal باز می‌شود │ ▼ POST /api/v1/service-section { name: 'تزریقات' } │ ├─► 403 ERR_SUBSCRIPTION_REQUIRED → «پنل Basic لازم است» └─► 201 → accordion به‌روز می‌شود ``` ## جریان حذف بخش ``` کاربر روی 🗑️ بخش کلیک می‌کند │ ▼ ConfirmDialog: «آیا از حذف بخش "تزریقات" مطمئنید؟ همه زیربخش‌های آن هم حذف می‌شوند.» │ ▼ DELETE /api/v1/service-section/{uuid} │ ├─► اگر هیچ زیربخشی ندارد → 200 حذف شد └─► اگر زیربخش دارد → 409 ERR_SERVICE_SECTION_HAS_ITEMS (یا اگر DELETE CASCADE تعریف شده: همه حذف می‌شوند) ``` ## جریان حذف زیربخش ``` DELETE /api/v1/service-item/{uuid} │ ├─► اگر در هیچ session_services نیست → 200 └─► اگر در session_services استفاده شده → 409 ERR_SERVICE_ITEM_IN_USE پیام: «این سرویس در پرونده بیمار ثبت شده و قابل حذف نیست.» ``` ## جریان انتخاب پرسنل انجام‌دهنده ``` هنگام ایجاد/ویرایش ServiceItem: │ ▼ GET /api/v1/staff → SearchableSelect از پرسنل فعال → «علی رضایی (پرستار)» → «مریم نوری (فیزیوتراپیست)» → [بدون پرسنل مشخص] ``` ## gate check — کاربر Free ``` کاربر Free روی «سرویس‌ها» در sidebar کلیک می‌کند │ ▼ ServicesPage.tsx → GET /api/v1/service-sections → 403 │ ▼ نمایش banner: ┌─────────────────────────────────────────────┐ │ 🔒 این قابلیت نیاز به پنل Basic یا بالاتر │ │ دارد. │ │ [مشاهده پنل‌ها] │ └─────────────────────────────────────────────┘ ```