- 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.
8.0 KiB
8.0 KiB
چکلیست — تسک ۰۰ (تکمیل نوبتدهی سرویسی در clinicpro)
وضعیت کلی: ⏳ شروع نشده آخرین بازبینی: —
قواعد: _shared/definition-of-done.md · خط سرخها: _shared/red-lines.md · UI: _shared/ui-conventions.md
۰. خط سرخ — منطق اسلاتی
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۰.۱ | SlotModeFrozenTest + سه fixture ساخته شد پیش از هر تغییر کد |
⏳ | ترتیب مهم است |
| ۰.۲ | fixture ها با تاریخ ثابتاند، نه time() |
⏳ | |
| ۰.۳ | کامنت «read-only، هیچ تسکی بهروزش نمیکند» بالای هر سه fixture | ⏳ | |
| ۰.۴ | هیچ متد موجود SlotCalculatorService ویرایش نشد |
⏳ | فقط پارامتر اختیاری excludeAppointmentId روی getServiceStartTimes |
| ۰.۵ | GET /appointment-slots بیتبهبیت دستنخورده |
⏳ | |
| ۰.۶ | GET /month-availability/{doctorUuid} دستنخورده |
⏳ | |
| ۰.۷ | active_slot_key و refreshActiveSlotKey() دستنخورده |
⏳ | تنها استثنا: صدا زدنش در setIsReserve |
| ۰.۸ | isSlotTaken امضا و معنا دستنخورده |
⏳ | |
| ۰.۹ | --group=slot-mode-frozen در پایان سبز |
⏳ |
۱. بکاند
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۱.۱ | ServiceBookingCalculator ساخته شد |
⏳ | |
| ۱.۲ | serviceSlots() موجود از آن استفاده میکند، خروجیاش عوض نشده |
⏳ | |
| ۱.۳ | جمع سادهٔ += حفظ شد (اصلاحش تسک ۰۴ است) |
⏳ | |
| ۱.۴ | ServiceRescheduleService + POST /appointment/{uuid}/service-reschedule |
⏳ | |
| ۱.۵ | PATCH /appointment/{uuid} توسعه یافت — منطق جدید داخل isServiceMode() |
⏳ | |
| ۱.۶ | PATCH مقدار service_item_uuids[] میپذیرد |
⏳ | |
| ۱.۷ | ReserveConversionService + POST /appointment/{uuid}/convert-reserve |
⏳ | |
| ۱.۸ | نوبت رزرو در حالت سرویسی سرویسها را ذخیره میکند | ⏳ | |
| ۱.۹ | excludeAppointmentId روی getServiceStartTimes و findBusyIntervals |
⏳ | همان الگوی isSlotTaken |
| ۱.۱۰ | Appointment::replaceServiceItems() + currentServiceUuids() |
⏳ | |
| ۱.۱۱ | replaceServiceItems مقدار serviceItem تکی را همگام میکند |
⏳ | چهار مصرفکننده رویش خواندهاند |
| ۱.۱۲ | setIsReserve() صدا زدن refreshActiveSlotKey() |
⏳ | |
| ۱.۱۳ | اعتبارسنجی زمان با عضویت در getServiceStartTimes، نه فقط isSlotTaken |
⏳ | |
| ۱.۱۴ | TenantOwnershipChecker روی همهٔ uuid های سرویس، پیش از هر بررسی دیگر |
⏳ | |
| ۱.۱۵ | allowInactive فقط برای سرویسهای موجود نوبت، نه uuid های تازه |
⏳ | |
| ۱.۱۶ | کنترلر نازک ماند — منطق در سرویس | ⏳ |
۲. دیتابیس و مهاجرت
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۲.۱ | service_total_minutes و service_buffer_minutes (تهیپذیر) |
⏳ | |
| ۲.۲ | هیچ ستون موجودی حذف/تغییر نوع/تغییر معنا نداد | ⏳ | |
| ۲.۳ | دو کد خطای جدید در ErrorCodes.php با پیام فارسی |
⏳ | شمارهٔ واقعی از خود فایل |
| ۲.۴ | app:appointment:backfill-service-duration — dry-run پیشفرض، idempotent |
⏳ | |
| ۲.۵ | backfill مقدار را از خود نوبت میگیرد، نه بازمحاسبه از سرویسها | ⏳ | |
| ۲.۶ | migration اجرا شد و TenantSchemaCoverageTest سبز |
⏳ |
۳. UI — پنل ادمین
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۳.۱ | AppointmentEditPage: حالت سرویسی ServiceSlotPicker نشان میدهد |
⏳ | |
| ۳.۲ | AppointmentEditPage: حالت اسلاتی دقیقاً رفتار امروز |
⏳ | سه فیلد ساعت |
| ۳.۳ | ورودی دستی ساعت در حالت سرویسی پنهان، نه disabled | ⏳ | |
| ۳.۴ | ServiceSlotPicker موجود بازاستفاده شد؛ نسخهٔ موازی ساخته نشد |
⏳ | فقط prop excludeAppointmentUuid |
| ۳.۵ | ReserveAppointmentsPage: سرویسها + دکمهٔ تبدیل |
⏳ | |
| ۳.۶ | ReserveAppointmentsPage از جدول خام به DataTable مهاجرت کرد |
⏳ | <td style={td}> حذف شد |
| ۳.۷ | مدت و بافر فارسی با واحد: «۳۵ دقیقه (+۱۰ دقیقه فاصله)» | ⏳ | |
| ۳.۸ | هیچ رنگ/شعاع/سایهٔ hard-code — همه از توکنهای styles.css |
⏳ | |
| ۳.۹ | دارکمود (data-theme="dark") بررسی شد |
⏳ | |
| ۳.۱۰ | حالت فشرده (data-density="compact") بررسی شد |
⏳ | |
| ۳.۱۱ | انتخاب چند سرویس با SearchableSelect؛ هیچ <select> بومی |
⏳ | |
| ۳.۱۲ | backTo/BackButton روی هر دو صفحه |
⏳ | |
| ۳.۱۳ | وضعیت لیست رزروها در URL با useUrlState |
⏳ | |
| ۳.۱۴ | تاریخ با PersianDateInput · مبلغ با formatRial |
⏳ | |
| ۳.۱۵ | RTL بررسی شد (ms/me نه ml/mr) |
⏳ | |
| ۳.۱۶ | موبایل بررسی شد — بدون اسکرول افقی | ⏳ | |
| ۳.۱۷ | همهٔ رشتهها فارسی و از i18n | ⏳ | |
| ۳.۱۸ | داده با TanStack Query و استخراج envelope درست | ⏳ |
۴. تست
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۴.۱ | SlotModeFrozenTest — سه سنجه |
⏳ | |
| ۴.۲ | ServiceBookingCalculatorTest — موفق/خطا/مرزی |
⏳ | |
| ۴.۳ | ServiceRescheduleTest — شامل «حذف سرویس → مدت خودکار» |
⏳ | |
| ۴.۴ | PatchServiceDurationTest — شامل «در حالت اسلاتی هیچکدام اجرا نمیشود» |
⏳ | |
| ۴.۵ | ConvertReserveTest — شامل active_slot_key و رقابت |
⏳ | |
| ۴.۶ | ServiceModeSectionDurationTest موجود سبز ماند |
⏳ | |
| ۴.۷ | BookingTenantTest موجود سبز ماند |
⏳ | |
| ۴.۸ | AppointmentEditPage.test.tsx — دو حالت |
⏳ |
۵. مستندات
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۵.۱ | docs/api/appointment.md — دو endpoint جدید + توسعهٔ PATCH |
⏳ | |
| ۵.۲ | ماتریس «کدام endpoint در کدام حالت» | ⏳ | |
| ۵.۳ | docs/architecture/booking-modes.md ساخته شد |
⏳ | تسک ۰۶ حالت سوم را اضافه میکند |
| ۵.۴ | دو کد خطای جدید مستند شد | ⏳ |
۶. بازبینی پایانی
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۶.۱ | همهٔ ردیفهای بالا وضعیت نهایی دارند (هیچ 🔄 و ⏳ بیدلیل) | ⏳ | |
| ۶.۲ | ddev exec php bin/phpunit کامل سبز |
⏳ | |
| ۶.۳ | ddev exec php bin/phpunit --group=slot-mode-frozen سبز |
⏳ | |
| ۶.۴ | phpstan analyse بدون خطای جدید |
⏳ | |
| ۶.۵ | npx tsc --noEmit بدون خطا |
⏳ | |
| ۶.۶ | yarn test سبز |
⏳ | |
| ۶.۷ | TenantSchemaCoverageTest + TenantLookupInventoryTest سبز |
⏳ | |
| ۶.۸ | docs/api/* بهروز شد |
⏳ | |
| ۶.۹ | چکلیست UI (بخش ۳) کامل شد | ⏳ | |
| ۶.۱۰ | nobat724_front و clinic-pro-tauri دستی بررسی شدند |
⏳ | service_item تکی همگام است؟ |
| ۶.۱۱ | commit شد، سپس graphify update . |
⏳ | |
| ۶.۱۲ | موارد بهتعویقافتاده با دلیل و تسک مقصد ثبت شدند | ⏳ |