# چک‌لیست — تسک ۰۲ (منبع، نوع منبع، مهارت، استخر)

**وضعیت کلی:** ⏳ شروع نشده · **آخرین بازبینی:** —

قواعد: [_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 .` | ⏳ | |
| ۶.۱۱ | موارد به‌تعویق با دلیل و تسک مقصد | ⏳ | |
