# خط سرخ‌ها — قواعدی که هیچ تسکی نمی‌تواند نقض کند این فایل بالای هر تسک حاکم است. اگر تسکی با این‌ها تناقض داشت، **این فایل برنده است** و تسک باید اصلاح شود، نه این فایل. --- ## ۱. ⛔ نوبت‌دهی اسلاتی به هیچ عنوان دست‌کاری نمی‌شود `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)