# چک‌لیست — تسک ۰۲ (منبع، نوع منبع، مهارت، استخر) **وضعیت کلی:** ⏳ شروع نشده · **آخرین بازبینی:** — قواعد: [_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` سبز | ⏳ | | | ۰.۲ | `Doctor` به `Resource` تبدیل **نشد** — فقط لینک شد | ⏳ | `appointments.doctor_id` سر جایش | | ۰.۳ | `ClinicStaff` و `Room` هویت مستقل حفظ کردند | ⏳ | | | ۰.۴ | `service_item_staff` و `ServiceItem.staffMembers` دست‌نخورده | ⏳ | | | ۰.۵ | `WeeklySchedule.meta.buffer_minutes` دست‌نخورده | ⏳ | `setup/cleanup` مفهوم جداست | ## ۱. بک‌اند | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۱.۱ | `ResourceType` · `ClinicResource` · `Skill` · `ResourceSkill` | ⏳ | | | ۱.۲ | `ResourcePool` · `ResourcePoolMember` | ⏳ | | | ۱.۳ | نام کلاس `ClinicResource` (نه `Resource`) و جدول `clinic_resources` | ⏳ | | | ۱.۴ | `ResourceLinker` — تنها نقطهٔ نگاشت پزشک/پرسنل/اتاق ↔ منبع | ⏳ | | | ۱.۵ | حداکثر یکی از `doctor_id`/`staff_id`/`room_id` — قید در سازنده | ⏳ | | | ۱.۶ | `capacity>1` روی `type=doctor` → ۴۲۲ | ⏳ | | | ۱.۷ | `normalizeAttributes` — اسکالر، کلید `[a-z_]{1,40}`، سقف ۲۰ | ⏳ | | | ۱.۸ | `ResourcePoolService` — اعضا هم‌شعبه و هم‌نوع، وگرنه ۴۲۲ | ⏳ | | | ۱.۹ | `findEligible()` با `HAVING COUNT(DISTINCT skill) = n` | ⏳ | همهٔ مهارت‌ها، نه یکی | | ۱.۱۰ | `StaffService` موجود `ResourceLinker::syncActive()` صدا می‌زند | ⏳ | نه lifecycle callback | | ۱.۱۱ | چهارده endpoint | ⏳ | | | ۱.۱۲ | `app:resource:backfill` — dry-run، idempotent | ⏳ | سه نوع سیستمی + پزشک/پرسنل/اتاق | | ۱.۱۳ | `TenantOwnershipChecker` روی هر uuid از request | ⏳ | | ## ۲. دیتابیس | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۲.۱ | شش جدول ساخته شد | ⏳ | | | ۲.۲ | سه UNIQUE تهی‌پذیر روی `doctor_id`/`staff_id`/`room_id` | ⏳ | | | ۲.۳ | `idx_resource_skills_skill (skill_id, level)` | ⏳ | کوئری داغ تسک ۰۶ | | ۲.۴ | `entity_type, entity_id` ستون اول ایندکس‌های لیست | ⏳ | | | ۲.۵ | `resource_skills` و `resource_pool_members` در `AGGREGATE_CHILDREN` | ⏳ | | | ۲.۶ | `TenantSchemaCoverageTest` سبز | ⏳ | | ## ۳. UI | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۳.۱ | `ResourcesPage` · `ResourceFormPage` · `ResourceTypesPage` · `SkillsPage` · `ResourcePoolsPage` | ⏳ | | | ۳.۲ | فیلتر شعبه/نوع/فعال در URL با `useUrlState` | ⏳ | | | ۳.۳ | شعبه و نوع با `SearchableSelect` | ⏳ | | | ۳.۴ | مهارت‌ها با چیپ چندانتخابی | ⏳ | | | ۳.۵ | `DataTable` با skeleton و empty state | ⏳ | | | ۳.۶ | `backTo`/`BackButton` روی همهٔ زیرصفحه‌ها | ⏳ | | | ۳.۷ | هیچ رنگ/شعاع hard-code | ⏳ | | | ۳.۸ | دارک‌مود و حالت فشرده | ⏳ | | | ۳.۹ | RTL و موبایل | ⏳ | | | ۳.۱۰ | `setup/cleanup` با واحد فارسی «دقیقه» | ⏳ | | | ۳.۱۱ | هشدار «این منبع N نوبت آیندهٔ فعال دارد» هنگام غیرفعال‌سازی | ⏳ | | ## ۴. تست | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۴.۱ | `ResourceCrudTest` — شعبهٔ محیط دیگر ۴۰۴، دو پل ۴۲۲، capacity | ⏳ | | | ۴.۲ | `SkillAssignmentTest` — جایگزینی کامل، level، حذف در استفاده | ⏳ | | | ۴.۳ | `ResourcePoolTest` — عضو شعبهٔ دیگر / نوع دیگر → ۴۲۲ | ⏳ | | | ۴.۴ | `ResourceEligibilityTest` — دو مهارت، منبع با یکی برنمی‌گردد | ⏳ | | | ۴.۵ | `BackfillResourceTest` — idempotent | ⏳ | | | ۴.۶ | `TenantLookupInventoryTest` شمارنده به‌روز شد | ⏳ | | ## ۵. مستندات | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۵.۱ | `docs/api/resource.md` | ⏳ | | | ۵.۲ | توضیح «ظرفیت ۳ = یک ردیف، نه سه منبع» | ⏳ | | | ۵.۳ | تفاوت `setup/cleanup` منبع با `buffer_minutes` برنامه | ⏳ | | | ۵.۴ | `docs/api/staff.md` بخش «رابطه با منبع» | ⏳ | | | ۵.۵ | `docs/architecture/tenancy.md` به‌روز | ⏳ | | ## ۶. بازبینی پایانی | # | مورد | وضعیت | یادداشت | |---|---|---|---| | ۶.۱ | هیچ 🔄 و ⏳ بی‌دلیل نمانده | ⏳ | | | ۶.۲ | `bin/phpunit` کامل سبز | ⏳ | | | ۶.۳ | `--group=slot-mode-frozen` سبز | ⏳ | | | ۶.۴ | `phpstan` بدون خطای جدید | ⏳ | | | ۶.۵ | `npx tsc --noEmit` و `yarn test` سبز | ⏳ | | | ۶.۶ | تست‌های tenant سبز | ⏳ | | | ۶.۷ | `docs/api/*` به‌روز | ⏳ | | | ۶.۸ | چک‌لیست UI کامل | ⏳ | | | ۶.۹ | دو کلاینت دیگر بررسی شدند | ⏳ | | | ۶.۱۰ | commit، سپس `graphify update .` | ⏳ | | | ۶.۱۱ | موارد به‌تعویق با دلیل و تسک مقصد | ⏳ | |