Files
hamed 158dcb58aa feat: implement service mode completion for nobat724_front
- 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.
2026-07-30 11:56:08 +03:30

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)