- 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
6.5 KiB
6.5 KiB
چکلیست — تسک ۰۸ (لیست قیمت بازهدار و snapshot فاکتور)
وضعیت کلی: ⏳ شروع نشده · آخرین بازبینی: —
قواعد: _shared/definition-of-done.md · red-lines.md · ui-conventions.md
۰. خط سرخ
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۰.۱ | --group=slot-mode-frozen سبز |
⏳ | |
| ۰.۲ | Tariff دستنخورده — سطر ۴ زنجیرهٔ PriceResolver |
⏳ | |
| ۰.۳ | AppointmentInsuranceService و TenantServiceCoverage بازنویسی نشدند |
⏳ | قاعدهٔ «اول بگرد» |
| ۰.۴ | DiscountRule/DiscountEngine دستنخورده |
⏳ | |
| ۰.۵ | Invoice/InvoiceItem دستنخورده و حذف نشدند |
⏳ | کار متفاوتی میکنند |
| ۰.۶ | ستونهای موجود نوبت استفاده شدند، ستون جدید مالی روی appointments اضافه نشد |
⏳ |
۱. بکاند
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۱.۱ | PriceList · PriceListItem · PriceSnapshot · PriceSnapshotLine · DepositPolicy |
⏳ | |
| ۱.۲ | PricingEngine — هفت مرحله، هر کدام سرویس مستقل |
⏳ | |
| ۱.۳ | مراحل ۳ و ۴ از روز اول در زنجیره، حتی no-op | ⏳ | تسک ۰۹ و ۱۱ |
| ۱.۴ | PriceResolver — ترتیب پنجگانه، هرگز صفر یا خطا |
⏳ | |
| ۱.۵ | تاریخ مبنا = slot_start (تاریخ رزرو)، نه time() |
⏳ | ⭐ دو تفسیر دارد |
| ۱.۶ | همهٔ محاسبات با intdiv، هیچ float در مسیر پول |
⏳ | |
| ۱.۷ | تخفیف پشتسرهم، نه جمع درصدها | ⏳ | ۴۰ سپس ۱۰ = ۴۶ |
| ۱.۸ | سقف جمع تخفیف اعمال شد | ⏳ | |
| ۱.۹ | final = max(0, …) + ردیف adjustment هنگام فعال شدن سقف |
⏳ | |
| ۱.۱۰ | appliedPolicyIds از روز اول ثبت میشود |
⏳ | |
| ۱.۱۱ | PriceSnapshotLine.label و source_id بدون FK (کپی متنی) |
⏳ | قانون پنجم |
| ۱.۱۲ | DepositCalculator روی ستونهای موجود نوبت مینویسد |
⏳ | |
| ۱.۱۳ | activate تداخل بازه را میسنجد؛ لیست شعبه با محیط تداخل ندارد |
⏳ | |
| ۱.۱۴ | هفت endpoint | ⏳ | |
| ۱.۱۵ | قلاب مرحلهٔ ۶ BookingService::confirm وصل شد |
⏳ | |
| ۱.۱۶ | TenantOwnershipChecker روی هر uuid از request |
⏳ |
۲. دیتابیس
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۲.۱ | پنج جدول | ⏳ | |
| ۲.۲ | final_rials و amount_rials از نوع BIGINT |
⏳ | ⭐ پکیج بزرگ از سقف INT عبور میکند |
| ۲.۳ | بقیهٔ price_rials ها INT ماندند |
⏳ | قیمت واحد عبور نمیکند |
| ۲.۴ | UNIQUE(appointment_id) روی snapshot |
⏳ | |
| ۲.۵ | price_list_items و price_snapshot_lines در AGGREGATE_CHILDREN |
⏳ | |
| ۲.۶ | app:pricing:backfill-snapshots --force — idempotent |
⏳ | نوبتهای موجود فاکتور خالی نداشته باشند |
| ۲.۷ | TenantSchemaCoverageTest سبز |
⏳ |
۳. UI
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۳.۱ | PriceListsPage · PriceListFormPage |
⏳ | |
| ۳.۲ | وضعیت شمسی: پیشنویس/فعال/منقضی با StatusBadge |
⏳ | |
| ۳.۳ | بازهٔ تاریخ با PersianDatePicker |
⏳ | |
| ۳.۴ | قیمتها با PriceInput |
⏳ | |
| ۳.۵ | شعبه با SearchableSelect |
⏳ | |
| ۳.۶ | «کپی از لیست قیمت قبلی» | ⏳ | ⭐ با ۲۰۰ سرویس بدون آن لیست جدید ساخته نمیشود |
| ۳.۷ | کارت «فاکتور» در AppointmentDetailPage با ردیفهای snapshot |
⏳ | |
| ۳.۸ | متن «قیمت بر اساس تاریخ نوبت محاسبه شده است» | ⏳ | |
| ۳.۹ | هیچ رنگ/شعاع hard-code | ⏳ | |
| ۳.۱۰ | دارکمود و حالت فشرده | ⏳ | |
| ۳.۱۱ | RTL و موبایل | ⏳ | |
| ۳.۱۲ | مبالغ با formatRial · تاریخها با formatDate |
⏳ | |
| ۳.۱۳ | وضعیت لیست در URL با useUrlState |
⏳ | |
| ۳.۱۴ | همهٔ رشتهها فارسی | ⏳ |
۴. تست
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۴.۱ | PriceResolverTest — ترتیب پنجگانه + fallback |
⏳ | |
| ۴.۲ | PricingEngineTest — تخفیف پشتسرهم، سقف، منفی → صفر |
⏳ | |
| ۴.۳ | invariant: جمع ردیفها = مبلغ نهایی، در همهٔ سناریوها | ⏳ | ⭐ |
| ۴.۴ | PriceSnapshotImmutabilityTest — قانون پنجم |
⏳ | ⭐ تغییر قیمت و حذف قانون |
| ۴.۵ | PriceListActivationTest — تداخل همسطح ۴۲۲، شعبه/محیط بیتداخل |
⏳ | |
| ۴.۶ | DepositCalculatorTest — درصدی با min/max، اولویت سرویس |
⏳ | |
| ۴.۷ | QuoteTenantTest — سرویس محیط دیگر ۴۰۴ |
⏳ | |
| ۴.۸ | نوبت بدون سرویس (حالت slot) → snapshot با visit_price_rials |
⏳ |
۵. مستندات
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۵.۱ | docs/api/pricing.md |
⏳ | |
| ۵.۲ | تصمیم «تاریخ رزرو، نه تاریخ ثبت» صریح | ⏳ | |
| ۵.۳ | docs/architecture/insurance-billing-system.md جدول PriceSnapshot vs Invoice |
⏳ | ⭐ وگرنه یکی حذف میشود |
۶. بازبینی پایانی
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| ۶.۱ | هیچ 🔄 و ⏳ بیدلیل نمانده | ⏳ | |
| ۶.۲ | bin/phpunit کامل سبز |
⏳ | |
| ۶.۳ | --group=slot-mode-frozen سبز |
⏳ | |
| ۶.۴ | phpstan بدون خطای جدید |
⏳ | |
| ۶.۵ | npx tsc --noEmit و yarn test سبز |
⏳ | |
| ۶.۶ | تستهای tenant سبز | ⏳ | |
| ۶.۷ | docs/api/* بهروز |
⏳ | |
| ۶.۸ | چکلیست UI کامل | ⏳ | |
| ۶.۹ | ⚠️ مبلغ نمایشی رزرو ممکن است عوض شود → دو کلاینت دستی بررسی شدند | ⏳ | |
| ۶.۱۰ | commit، سپس graphify update . |
⏳ | |
| ۶.۱۱ | موارد بهتعویق با دلیل و تسک مقصد | ⏳ |