- Add task for completing service mode in clinicpro with detailed objectives and acceptance criteria. - Create architecture documentation for task 00b, outlining involved components and necessary changes. - Develop checklist for task 00b to ensure all requirements are met. - Document implementation notes for task 00b, emphasizing API contract checks and design system adherence. - Update task documentation for task 00b, specifying goals and current issues with service mode.
97 lines
4.6 KiB
Markdown
97 lines
4.6 KiB
Markdown
# خط سرخها — قواعدی که هیچ تسکی نمیتواند نقض کند
|
|
|
|
این فایل بالای هر تسک حاکم است. اگر تسکی با اینها تناقض داشت، **این فایل برنده است** و
|
|
تسک باید اصلاح شود، نه این فایل.
|
|
|
|
---
|
|
|
|
## ۱. ⛔ نوبتدهی اسلاتی به هیچ عنوان دستکاری نمیشود
|
|
|
|
`booking_mode = 'slot'` منطق تولیدیِ زنده است. در **هیچ تسکی از این فاز** نه رفتارش،
|
|
نه امضایش، نه خروجیاش تغییر نمیکند.
|
|
|
|
### فایلها و مسیرهای قفلشده
|
|
|
|
| فایل / مسیر | چه چیزی قفل است |
|
|
|---|---|
|
|
| `src/Appointment/Service/SlotCalculatorService.php` | متدهای `getAvailableSlots`، `getAllSlotsWithAvailability`، `hasAnyAvailability`، `findNextAvailableStart`، `buildSessionSlots`، `buildAllSessions`، `filterBookedSlots`، `isWithinBookingWindow` — **هیچکدام** ویرایش نمیشوند |
|
|
| `GET /api/v1/appointment-slots` | قرارداد request/response |
|
|
| `GET /api/v1/appointment-settings/month-availability/{doctorUuid}` | قرارداد |
|
|
| `Appointment::active_slot_key` و `refreshActiveSlotKey()` | مکانیزم یکتایی موجود |
|
|
| `AppointmentRepository::isSlotTaken` | امضا و معنا |
|
|
| `WeeklySchedule::MODE_SLOT` و `DEFAULT_META['booking_mode']` | مقدار پیشفرض `slot` میماند |
|
|
|
|
### چه چیزی مجاز است
|
|
|
|
- **افزودن** متد جدید به `SlotCalculatorService` — بدون تغییر متدهای موجود
|
|
- **افزودن** کلاس/سرویس موازی (مثل `AvailabilityEngine` تسک ۰۶)
|
|
- **افزودن** کلید جدید به `WeeklySchedule.meta` — با حفظ پیشفرضهای موجود
|
|
- **افزودن** ستون تهیپذیر به `appointments`
|
|
|
|
### چه چیزی ممنوع است
|
|
|
|
- تغییر امضای هر متد موجود در `SlotCalculatorService`
|
|
- تغییر شکل خروجی `appointment-slots` (حتی افزودن فیلد، اگر ترتیب/نوع فیلدهای موجود عوض شود)
|
|
- «یکدستسازی» یا refactor مسیر اسلاتی
|
|
- حذف `active_slot_key` یا `is_reserve`
|
|
- اعمال قوانین جدید (تسک ۰۹) روی حالت `slot` — حتی اگر منطقی به نظر برسد
|
|
|
|
### اجبار خودکار
|
|
|
|
هر تسک باید این تست را سبز نگه دارد:
|
|
|
|
```bash
|
|
ddev exec php bin/phpunit --group=slot-mode-frozen
|
|
```
|
|
|
|
و در `tests/Appointment/SlotModeFrozenTest.php`:
|
|
|
|
```php
|
|
/** @group slot-mode-frozen */
|
|
public function testSlotModeContractUnchanged(): void
|
|
{
|
|
// snapshot خروجی appointment-slots برای یک برنامهٔ ثابت
|
|
// هر تغییری در شکل پاسخ، این تست را قرمز میکند
|
|
self::assertJsonStringEqualsJsonFile(
|
|
__DIR__ . '/fixtures/slot-mode-contract.json',
|
|
$this->client->getResponse()->getContent()
|
|
);
|
|
}
|
|
```
|
|
|
|
fixture در تسک ۰۰ ساخته میشود و **هیچ تسکی اجازهٔ بهروزرسانیاش را ندارد**.
|
|
|
|
---
|
|
|
|
## ۲. ✅ نوبتدهی سرویسی در همین فاز کامل میشود
|
|
|
|
`booking_mode = 'service'` نیمهکاره است: در مسیر رزرو (سایت و درawer پنل) کار میکند، ولی
|
|
در ویرایش نوبت، نوبت رزرو، و بخشی از پنل بیمار غایب است.
|
|
|
|
تکمیلش **پیشنیاز** بقیهٔ فاز است، نه موازی با آن:
|
|
|
|
```
|
|
تسک ۰۰ تکمیل نوبتدهی سرویسی در clinicpro
|
|
تسک ۰۰ب سازگارسازی nobat724_front با وضعیت فعلی
|
|
↓
|
|
تسک ۰۱ به بعد (موتور چندمنبعی)
|
|
```
|
|
|
|
دلیل ترتیب: اگر حالت `resource` (تسک ۰۶) روی حالت `service` نیمهکاره ساخته شود، هر باگ
|
|
موجود سرویسی به موتور جدید ارث میرسد و تشخیص منبعش غیرممکن میشود.
|
|
|
|
---
|
|
|
|
## ۳. 🎨 هر صفحه یا بخش جدید، عیناً با دیزاینسیستم موجود
|
|
|
|
هیچ طراحی جدید، هیچ کامپوننت موازی، هیچ رنگ hard-code.
|
|
جزئیات کامل و چکلیست: [ui-conventions.md](ui-conventions.md)
|
|
|
|
---
|
|
|
|
## ۴. ☑️ هیچ تسکی بدون تکمیل چکلیستش تمام نیست
|
|
|
|
هر تسک یک `checklist.md` دارد. پیش از اعلام پایان، **همهٔ** ردیفها باید وضعیت نهایی
|
|
داشته باشند و هیچ ردیفی در `🔄` یا `⏳` نماند.
|
|
قالب و قواعد: [definition-of-done.md](definition-of-done.md)
|