Files
clinicpro/docs/phase2_taskes/task-13-clinic-services/user_flow.md
T

100 lines
4.0 KiB
Markdown

# جریان کاربری — تسک ۱۳: سرویس‌های کلینیک
## جریان مشاهده و ایجاد سرویس‌ها
```
کاربر وارد صفحه «سرویس‌ها» می‌شود
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 یا بالاتر │
│ دارد. │
│ [مشاهده پنل‌ها] │
└─────────────────────────────────────────────┘
```