feat(admin): resource booking mode with a readiness guard
Task 06's engine could only be switched on through the API, and nothing checked whether the environment was ready for it. Since the mode choice is irreversible, picking it with no resources defined would lock a clinic into a state where no appointment is ever computable. Backend now refuses that: resource mode requires at least one active resource, with a message that says what to define first. Same shape as the existing service-mode guard, applied on both save paths. The panel shows the same conditions as a ✓/✗ list before the choice is made, each unmet one linking to where it gets fixed — a 422 after an irreversible decision is the wrong place to learn about a prerequisite. Also adds the search step (minimum 5 minutes) and extends the existing mode cards to three rather than building a parallel component. No strategy picker: task 06 never built the strategies, and an empty menu reads worse than an absent one. GET /api/v1/service-items now returns has_segments, computed with one aggregate query for the whole list rather than one per service. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -728,3 +728,44 @@ union, because an override changes working hours and working hours are themselve
|
||||
|
||||
Now takes `?clinic_uuid=`. Without it, only the doctor's `personal` addresses are returned; with it,
|
||||
only that clinic's addresses. The two sets are never merged (they used to be).
|
||||
|
||||
---
|
||||
|
||||
## حالت سوم: نوبتدهی منبعمحور
|
||||
|
||||
`meta.booking_mode` مقدار سوم `resource` را هم میپذیرد (تسک ۰۶). در این حالت نوبت به
|
||||
بخشها تقسیم میشود و وقت آزاد از تقاطع تقویم منابع میآید.
|
||||
|
||||
| فیلد `meta` | معنی |
|
||||
|---|---|
|
||||
| `booking_mode: "resource"` | حالت منبعمحور |
|
||||
| `step_minutes` | گام جستجوی وقت؛ پیشفرض ۱۵، کمینه ۵ |
|
||||
|
||||
### شرط آمادگی
|
||||
|
||||
انتخاب این حالت **برگشتناپذیر** است، پس پیش از ثبت سنجیده میشود: محیط باید حداقل یک
|
||||
**منبع فعال** داشته باشد.
|
||||
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"data": null,
|
||||
"errors": [{
|
||||
"code": "ERR_VALIDATION_001",
|
||||
"message": "برای نوبتدهی منبعمحور حداقل یک منبع فعال لازم است؛ اول اتاق، اپراتور یا دستگاه تعریف کنید",
|
||||
"field": "booking_mode"
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
بدون این نگهبان، کلینیک حالتی را برای همیشه قفل میکرد که هیچ وقتی در آن محاسبه نمیشود.
|
||||
|
||||
پنل همین شرطها را **پیش از** ثبت بهصورت ✓/✗ نشان میدهد تا کاربر به ۴۲۲ نخورد.
|
||||
|
||||
### `has_segments` روی فهرست سرویسها
|
||||
|
||||
`GET /api/v1/service-items` حالا فیلد `has_segments` هم میدهد — با یک کوئری تجمعی برای
|
||||
کل فهرست، نه یکی per سرویس. تنظیمات نوبتدهی از همین میفهمد آمادگیِ حالت منبعمحور
|
||||
هست یا نه.
|
||||
|
||||
جزئیات بخشها: [appointment-plan.md](appointment-plan.md) · منابع: [resource.md](resource.md)
|
||||
|
||||
Reference in New Issue
Block a user