feat: Implement resource booking functionality
- Add service timeline builder for appointments to manage available slots. - Create a hook to fetch resource booking services with effective durations. - Develop ResourceBookingSlotController to handle API requests for resource booking slots. - Implement ResourceBookingSlotService to calculate available time slots based on resource occupancy and service durations. - Add tests for resource appointment creation and booking slot functionality to ensure correct behavior and edge cases.
This commit is contained in:
@@ -1118,6 +1118,39 @@ New query param `reserve=1` → returns only reserve-list entries; without it on
|
||||
منبع تحت `TenantFilter` است: `resource_uuid`ِ محیط دیگر هیچ ردیفی برنمیگرداند (۲۰۰ با
|
||||
فهرست خالی، نه ۴۰۳).
|
||||
|
||||
### ثبت نوبت برای یک منبع — `resource_uuid` روی `POST /api/v1/my/appointment` (2026-08)
|
||||
|
||||
نوبتدهی منبع **سرویسی** است: مودالِ منبع همان فرمِ نوبتدهی سرویسیِ پزشک است و همین
|
||||
اندپوینت را صدا میزند، فقط با `resource_uuid`.
|
||||
|
||||
| فیلد | نوع | توضیح |
|
||||
|---|---|---|
|
||||
| `resource_uuid` | string | منبعِ نوبت. غیرفعال یا ناموجود ⇒ `422` |
|
||||
|
||||
قواعدی که فقط وقتی این فیلد بیاید اعمال میشوند:
|
||||
|
||||
- **پزشک از ناظرِ منبع میآید.** `doctor_uuid` اختیاری میشود؛ منبعِ بیناظر ⇒ `422`
|
||||
(رابطهٔ پزشک↔منبع یک جا تعریف شده است و پرسیدن دوبارهاش یعنی دو منبعِ حقیقت).
|
||||
- **مدت از زنجیرهٔ حلِ همان منبع** (`ResourceServiceResolver`) میآید نه از
|
||||
`duration_minutes` خامِ سرویس: همان «RF فرکشنال» روی یک دستگاه ۵۰ دقیقه است و روی
|
||||
دیگری ۴۰. `service_durations` همچنان همین نوبت را جابهجا میکند.
|
||||
- **گیتِ سرویس، `ResourceServiceOffering` فعال است** نه پرچم `bookable`: سرویسی که
|
||||
این منبع ارائه نمیدهد ⇒ `422` با فیلد `service_item_uuids`.
|
||||
- **تداخل روی خودِ منبع جدا سنجیده میشود** ⇒ `409`. `bookAtomically` فقط اسلاتِ پزشک
|
||||
را قفل میکند و دو پزشک میتوانند یک دستگاه را همزمان بگیرند. اشغال از دو جا خوانده
|
||||
میشود: نوبتهای `appointments.resource_id` و ردیفهای `resource_occupancy` (رزرو
|
||||
موقت، مسدودسازیِ دستی، نوبتهای موتور منبعمحور). ظرفیت منبع رعایت میشود: اتاق
|
||||
دوتخته با یک نوبت پر نمیشود.
|
||||
- **منبعِ محیط دیگر رد میشود** ⇒ `422`. منبع با uuid از بدنه میآید و `TenantFilter`
|
||||
پوششش نمیدهد.
|
||||
|
||||
> **محدودیت شناختهشده:** این مسیر ردیف `resource_occupancy` نمیسازد (مثل
|
||||
> `POST /api/v1/appointment` عمومی که از قبل همینطور بود). پس نوبتِ پنلی برای موتور
|
||||
> منبعمحور (`appointment-availability`) نامرئی است؛ در جهت عکس — پنل هر دو منبعِ
|
||||
> اشغال را میخواند — مشکلی نیست.
|
||||
|
||||
تست: `tests/Appointment/ResourceAppointmentCreateTest.php`.
|
||||
|
||||
خروجی واقعی `GET /api/v1/my/appointments?limit=1&resource_uuid=ce070910-…`:
|
||||
|
||||
```json
|
||||
|
||||
Reference in New Issue
Block a user