Add checklists for tasks 11 to 14 covering credit ledger, treatment course, cancellation policies, and event utilization
- Created checklist for task 11: Package and Credit Ledger - Created checklist for task 12: Treatment Course - Created checklist for task 13: Cancellation Policy, No-Show, and Waitlist - Created checklist for task 14: Domain Events and Utilization Reports
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
# چکلیست — تسک ۰۴ (کاتالوگ خدمات v2)
|
||||
|
||||
**وضعیت کلی:** ⏳ شروع نشده · **آخرین بازبینی:** —
|
||||
|
||||
قواعد: [_shared/definition-of-done.md](../_shared/definition-of-done.md) ·
|
||||
[red-lines.md](../_shared/red-lines.md) · [ui-conventions.md](../_shared/ui-conventions.md)
|
||||
|
||||
---
|
||||
|
||||
## ۰. خط سرخ
|
||||
|
||||
| # | مورد | وضعیت | یادداشت |
|
||||
|---|---|---|---|
|
||||
| ۰.۱ | `--group=slot-mode-frozen` سبز | ⏳ | |
|
||||
| ۰.۲ | نام `ServiceItem` عوض **نشد** | ⏳ | هفت جدول + سه ریپو رویشاند |
|
||||
| ۰.۳ | `service_items.duration_minutes` حذف نشد | ⏳ | مدت پایهٔ سرویس میماند |
|
||||
| ۰.۴ | `ServiceSection` (بخش کلینیک) دستنخورده | ⏳ | مفهومش با دستهبندی فرق دارد |
|
||||
| ۰.۵ | `BackwardCompatibilityTest`: سرویس بدون گروه → خروجی `appointment-service-slots` عیناً مثل قبل | ⏳ | ⭐ مهمترین ردیف این تسک |
|
||||
|
||||
## ۱. بکاند
|
||||
|
||||
| # | مورد | وضعیت | یادداشت |
|
||||
|---|---|---|---|
|
||||
| ۱.۱ | `ServiceCategory` درختی با materialized path | ⏳ | |
|
||||
| ۱.۲ | `ItemGroup` با `min_select`/`max_select` | ⏳ | |
|
||||
| ۱.۳ | `ServiceOption` («آیتم» مستند) با `solo_minutes`/`additional_minutes` | ⏳ | |
|
||||
| ۱.۴ | `ServiceOptionRelation` — ناسازگاری متقارن، پیشنیاز جهتدار | ⏳ | |
|
||||
| ۱.۵ | `assertNoCycle()` روی پیشنیاز — هنگام **ثبت**، نه ارزیابی | ⏳ | |
|
||||
| ۱.۶ | `ServiceBranchOverride` با سه ستون تهیپذیر (override جزئی) | ⏳ | |
|
||||
| ۱.۷ | `DurationCalculator` — اولین آیتم گروه solo، بقیه additional | ⏳ | |
|
||||
| ۱.۸ | مرتبسازی نزولی بر `solo_minutes` + کامنت دلیل | ⏳ | قطعیت |
|
||||
| ۱.۹ | `additional_minutes === null` → از `solo_minutes` (نه صفر) | ⏳ | |
|
||||
| ۱.۱۰ | `ServiceSelectionValidator` — ترتیب ششمرحلهای، مالکیت محیط **اول** | ⏳ | |
|
||||
| ۱.۱۱ | خطاها **همه با هم** برمیگردند، نه اولی | ⏳ | |
|
||||
| ۱.۱۲ | `ServicePriceResolver` با override شعبه بر تعرفه | ⏳ | |
|
||||
| ۱.۱۳ | `ServiceBookingCalculator` تسک ۰۰ به `DurationCalculator` وصل شد | ⏳ | ⭐ نقطهٔ اتصال — یک خط |
|
||||
| ۱.۱۴ | ده endpoint | ⏳ | |
|
||||
| ۱.۱۵ | `additional > solo` → ۴۲۲ | ⏳ | |
|
||||
| ۱.۱۶ | سقف عمق درخت ۴ · جابهجایی با `UPDATE … REPLACE(path)` در تراکنش | ⏳ | |
|
||||
|
||||
## ۲. `POST /service-selection/validate` — عمومی
|
||||
|
||||
| # | مورد | وضعیت | یادداشت |
|
||||
|---|---|---|---|
|
||||
| ۲.۱ | مسیر در `security.yaml` whitelist شد | ⏳ | سایت بدون توکن صدا میزند |
|
||||
| ۲.۲ | گارد دستی `TenantOwnershipChecker::belongsToPair()` روی همهٔ uuid ها | ⏳ | `TenantFilter` خاموش است |
|
||||
| ۲.۳ | `symfony/rate-limiter` روی IP | ⏳ | enumerate کاتالوگ |
|
||||
| ۲.۴ | uuid محیط دیگر → ۴۰۴ **بدون** هیچ اطلاعاتی در بدنه | ⏳ | |
|
||||
|
||||
## ۳. دیتابیس
|
||||
|
||||
| # | مورد | وضعیت | یادداشت |
|
||||
|---|---|---|---|
|
||||
| ۳.۱ | چهار جدول جدید + `service_option_relations` | ⏳ | |
|
||||
| ۳.۲ | سه ستون جدید روی `service_items` (همه تهیپذیر یا با default) | ⏳ | |
|
||||
| ۳.۳ | `idx_svc_cat_path` برای شرط دستهای تسک ۰۹ | ⏳ | |
|
||||
| ۳.۴ | `entity_type, entity_id` ستون اول ایندکسهای لیست | ⏳ | |
|
||||
| ۳.۵ | `service_option_relations` در `AGGREGATE_CHILDREN` | ⏳ | |
|
||||
| ۳.۶ | `TenantSchemaCoverageTest` + `TenantLookupInventoryTest` سبز | ⏳ | |
|
||||
|
||||
## ۴. UI
|
||||
|
||||
| # | مورد | وضعیت | یادداشت |
|
||||
|---|---|---|---|
|
||||
| ۴.۱ | تب «گروهها و آیتمها» در `ServiceDetailPage` موجود | ⏳ | صفحهٔ جدید نه، تب |
|
||||
| ۴.۲ | ویرایش inline `min/max` گروه | ⏳ | |
|
||||
| ۴.۳ | جدول آیتمها: نام، زمان تنها، زمان اضافه، قیمت، فعال | ⏳ | |
|
||||
| ۴.۴ | ناسازگاری/پیشنیاز با `SearchableSelect` چندانتخابی | ⏳ | |
|
||||
| ۴.۵ | **پیشنمایش زنده مدت** با debounce ۴۰۰ms | ⏳ | ⭐ بدون آن کل تسک بیاثر است |
|
||||
| ۴.۶ | قیمت با `PriceInput` | ⏳ | |
|
||||
| ۴.۷ | هیچ رنگ/شعاع hard-code | ⏳ | |
|
||||
| ۴.۸ | دارکمود و حالت فشرده | ⏳ | |
|
||||
| ۴.۹ | RTL و موبایل | ⏳ | |
|
||||
| ۴.۱۰ | فرم با React Hook Form + Zod | ⏳ | |
|
||||
| ۴.۱۱ | همهٔ رشتهها فارسی | ⏳ | |
|
||||
| ۴.۱۲ | خطاهای اعتبارسنجی **زیر همان گروه** نمایش داده میشوند | ⏳ | |
|
||||
|
||||
## ۵. تست
|
||||
|
||||
| # | مورد | وضعیت | یادداشت |
|
||||
|---|---|---|---|
|
||||
| ۵.۱ | `DurationCalculatorTest` — پنج حالت + **قطعیت** (جابهجایی ترتیب ورودی) | ⏳ | |
|
||||
| ۵.۲ | `ServiceSelectionValidatorTest` — min/max/ناسازگار/پیشنیاز/چند خطا/۴۰۴ | ⏳ | |
|
||||
| ۵.۳ | `ServicePriceResolverTest` — اولویت و override جزئی | ⏳ | |
|
||||
| ۵.۴ | `ServiceCategoryTreeTest` — عمق، حذف، جابهجایی path | ⏳ | |
|
||||
| ۵.۵ | `BackwardCompatibilityTest` | ⏳ | ⭐ |
|
||||
| ۵.۶ | حلقهٔ پیشنیاز → ۴۲۲ | ⏳ | |
|
||||
|
||||
## ۶. مستندات
|
||||
|
||||
| # | مورد | وضعیت | یادداشت |
|
||||
|---|---|---|---|
|
||||
| ۶.۱ | `docs/api/clinic-services.md` — **جدول واژگان** عیناً از architecture | ⏳ | ⭐ بدون آن همه قاطی میکنند |
|
||||
| ۶.۲ | endpoint های جدید | ⏳ | |
|
||||
| ۶.۳ | یادآوری: `nobat724_front` قرارداد `service-selection/validate` را مصرف میکند | ⏳ | |
|
||||
|
||||
## ۷. بازبینی پایانی
|
||||
|
||||
| # | مورد | وضعیت | یادداشت |
|
||||
|---|---|---|---|
|
||||
| ۷.۱ | هیچ 🔄 و ⏳ بیدلیل نمانده | ⏳ | |
|
||||
| ۷.۲ | `bin/phpunit` کامل سبز | ⏳ | |
|
||||
| ۷.۳ | `--group=slot-mode-frozen` سبز | ⏳ | |
|
||||
| ۷.۴ | `phpstan` بدون خطای جدید | ⏳ | |
|
||||
| ۷.۵ | `npx tsc --noEmit` و `yarn test` سبز | ⏳ | |
|
||||
| ۷.۶ | تستهای tenant سبز | ⏳ | |
|
||||
| ۷.۷ | `docs/api/*` بهروز | ⏳ | |
|
||||
| ۷.۸ | چکلیست UI کامل | ⏳ | |
|
||||
| ۷.۹ | ⚠️ مدت نوبتهای چندسرویسی عوض میشود → `nobat724_front` و `clinic-pro-tauri` دستی بررسی شدند | ⏳ | ⭐ این تسک عدد را عوض میکند |
|
||||
| ۷.۱۰ | commit، سپس `graphify update .` | ⏳ | |
|
||||
| ۷.۱۱ | موارد بهتعویق با دلیل و تسک مقصد | ⏳ | |
|
||||
Reference in New Issue
Block a user