diff --git a/.claude/prompt/resource-first-appointments.md b/.claude/prompt/resource-first-appointments.md index eaf95149..e839c04e 100644 --- a/.claude/prompt/resource-first-appointments.md +++ b/.claude/prompt/resource-first-appointments.md @@ -1,5 +1,49 @@ # نوبت‌دهی منبع‌محور در صفحهٔ نوبت‌ها — تب هر منبع + رزرو سرویسی + حذف تایم‌لاین منابع +> **وضعیت: انجام شد (۱۴۰۵/۰۵/۱۲).** کامیت‌ها: `3e3a2482` (تب منابع + فیلتر)، +> `fd27ceef` (مودال رزرو + حذف تایم‌لاین). +> +> ## این پرامپت در اجرا سه‌بار غلط از آب درآمد — چیزی که واقعاً شد: +> +> **۱. «نوبت بدون پزشک» پیاده شد و بعد کاملاً برگردانده شد.** `doctor` تهی‌پذیر شد و +> migration اجرا شد، ولی وسط کار معلوم شد مدل مجوز منشی روی سه‌تایی +> `(منشی، کلینیک، پزشک)` بنا شده و `DoctorSecretary.doctor` تهی‌پذیر نیست — یعنی برای +> نوبتِ بدون پزشک **هیچ ردیف مجوزی وجود ندارد**. تصمیم کاربر: منبع پزشکِ مسئول داشته +> باشد. migration رول‌بک و کد `git checkout` شد. +> +> **۲. «۷۳ فراخوانی getDoctor()» بیش‌برآورد بود.** بیشترشان روی entityهای دیگرند +> (`WeeklySchedule`، `Holiday`، `Rate`، `DoctorAddress`). عدد واقعی روی `Appointment` +> حدود ۲۵ بود، و diff سطح ۸ دقیقاً **۳۳ نقطهٔ جدید در ۱۶ فایل** داد. +> +> **۳. مهم‌ترین: کل موتور از قبل ساخته شده بود و این پرامپت از وجودش بی‌خبر بود.** +> `POST /api/v1/appointment-availability` (با `assignment` per اسلات)، `appointment-hold`، +> `appointment-confirm`، هوک `useResourceBooking.ts`، و حتی یک صفحهٔ کامل +> `ResourceBookingPage.tsx` روی `/admin/resource-booking`. `confirm` هم از قبل +> `doctor_uuid` می‌گیرد. پس **هیچ تغییر بک‌اندی برای رزرو لازم نبود** و تنها افزودنی +> بک‌اند، فیلتر `resource_uuid` روی فهرست نوبت‌ها شد. +> +> ## دو تلهٔ ابزاری که باید بدانی +> +> - **`phpstan` این پروژه تهی‌پذیری را چک نمی‌کند.** بررسی «صدا زدن متد روی تهی» سطح ۸ +> است و `phpstan.neon` روی سطح ۵. با یک خطای عمدی تست شد: `[OK] No errors`. برای این +> جنس تغییر، گیت واقعی PHPUnit است، نه phpstan. +> - **`doctrine:migrations:diff` تغییر nullable را ندید** و به‌جایش یک migration بی‌ربط +> `messenger_messages` ساخت. migration دستی نوشته شد. +> +> ## معماری‌ای که ماند +> +> - رزرو منبع از `hold → confirm` می‌رود، نه `POST /api/v1/appointment`. دلیلش حیاتی است: +> فقط `HoldService` رکورد `resource_occupancy_buckets` می‌نویسد و قید یکتای +> `uniq_bucket_resource_seat` تداخل را غیرممکن می‌کند. `book()` هیچ occupancy نمی‌نویسد، +> پس رزرو منبع از آن مسیر بی‌گارد است. +> - موتور خدمت‌محور جواب می‌دهد؛ مودال نتیجه را به اسلات‌هایی تنگ می‌کند که `assignment`شان +> همین منبع را دارد و آن نقش را به منبع قفل می‌کند. +> +> بقیهٔ این فایل متن اولیهٔ پرامپت است و برای تاریخچه نگه داشته شده — **به‌عنوان دستورالعمل +> اجرا معتبر نیست.** + +--- + ## زمینه صفحهٔ `/admin/appointments` امروز کاملاً پزشک‌محور است: تب‌ها فقط پزشک‌اند