Files
clinicpro/docs/new_feture/taskes/task-08-pricing-snapshot/checklist.md
T
hamed 70739691d1 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
2026-07-30 12:12:45 +03:30

6.5 KiB
Raw Blame History

چک‌لیست — تسک ۰۸ (لیست قیمت بازه‌دار و 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 .
۶.۱۱ موارد به‌تعویق با دلیل و تسک مقصد