From 42d9ad26c536f31e0484eb2c59ddeb607d690c4a Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Sat, 18 Jul 2026 12:10:49 +0330 Subject: [PATCH] Add tests and implementation for ServiceDetailPage and PriceInput components - Implement PriceInput component tests to validate Persian and Arabic numeral handling, input formatting, and controlled behavior. - Create ServiceDetailPage component with detailed service information, including pricing, insurance coverage, and editing capabilities. - Add API tests for service item detail retrieval and coverage synchronization with insurance contracts. - Ensure proper error handling and user feedback for service item retrieval and coverage management. --- .../prompt/service-management-refinements.md | 259 ++++++++++++ assets/admin/App.tsx | 2 + .../components/ServiceInsuranceModal.test.tsx | 84 ++++ .../components/ServiceInsuranceModal.tsx | 15 +- .../admin/components/ServiceItemFormModal.tsx | 232 +++++++++++ .../admin/components/ServiceTariffModal.tsx | 8 +- .../components/WalletTransactionModal.tsx | 4 +- .../components/inventory/AddPackageModal.tsx | 4 +- .../paymentMethods/PosFormModal.tsx | 5 +- .../admin/components/ui/PriceInput.test.tsx | 118 ++++++ assets/admin/components/ui/PriceInput.tsx | 64 ++- assets/admin/lib/utils.test.ts | 61 +++ assets/admin/lib/utils.ts | 27 ++ .../pages/ClinicAppointmentSettingsPage.tsx | 13 +- .../admin/pages/ClinicServicesPage.test.tsx | 50 +++ assets/admin/pages/ClinicServicesPage.tsx | 285 ++----------- assets/admin/pages/ServiceDetailPage.test.tsx | 135 +++++++ assets/admin/pages/ServiceDetailPage.tsx | 375 ++++++++++++++++++ assets/admin/types/index.ts | 4 + docs/api/clinic-services.md | 44 +- docs/api/insurance.md | 6 + .../Controller/ClinicServiceController.php | 13 + src/ClinicService/Entity/ServiceItem.php | 1 + .../TenantServiceCoverageRepository.php | 11 + .../Service/TenantInsuranceService.php | 18 + .../ServiceItemDetailApiTest.php | 87 ++++ .../ServiceCoverageSyncsItemFlagTest.php | 117 ++++++ 27 files changed, 1758 insertions(+), 284 deletions(-) create mode 100644 .claude/prompt/service-management-refinements.md create mode 100644 assets/admin/components/ServiceInsuranceModal.test.tsx create mode 100644 assets/admin/components/ServiceItemFormModal.tsx create mode 100644 assets/admin/components/ui/PriceInput.test.tsx create mode 100644 assets/admin/pages/ServiceDetailPage.test.tsx create mode 100644 assets/admin/pages/ServiceDetailPage.tsx create mode 100644 tests/ClinicService/ServiceItemDetailApiTest.php create mode 100644 tests/Insurance/ServiceCoverageSyncsItemFlagTest.php diff --git a/.claude/prompt/service-management-refinements.md b/.claude/prompt/service-management-refinements.md new file mode 100644 index 00000000..7acecec1 --- /dev/null +++ b/.claude/prompt/service-management-refinements.md @@ -0,0 +1,259 @@ +# اصلاحات بخش مدیریت سرویسها (بیمه، ورودیهای عددی، صفحه جزئیات) + +## پروژه + +`clinicpro` — پنل ادمین React (`assets/admin/`) + یک اندپوینت جدید در backend (`src/ClinicService/`). +cross-repo نیست؛ سایت عمومی این بخش را مصرف نمیکند. + +## زمینه + +بخش «مدیریت سرویسها» (`/admin/clinic-services`) الان یک صفحه واحد است: نمای بخشها → نمای کارتهای سرویس، و +همهٔ عملیات (ویرایش، تعرفهٔ سالانه، پوشش بیمه) در مودال باز میشود. سه اشکال دارد: + +1. **دو جای تنظیم بیمه:** در مودال ویرایش سرویس یک سوییچ «این خدمت شامل بیمه میشود» + «قیمت تقریبی با بیمه» وجود دارد، + در حالی که تنظیمات واقعی بیمه (درصد پوشش، فرانشیز، سقف، به تفکیک هر بیمهگر) در `ServiceInsuranceModal` است. + کاربر دو منبع حقیقت میبیند. +2. **NaN با کیبورد فارسی:** فیلد «درصد پوشش» در `ServiceInsuranceModal` مقدار خام را `Number()` میکند؛ رقم فارسی → `NaN`. +3. **صفحهٔ جزئیات ندارد:** کلیک روی سرویس هیچ کاری نمیکند؛ همهچیز در مودال پراکنده است. + +## فایلهای مرتبط + +| فایل | نقش | +|------|-----| +| `assets/admin/pages/ClinicServicesPage.tsx` | صفحهٔ اصلی (۶۳۴ خط): نمای بخشها + کارت سرویسها + مودال ایجاد/ویرایش سرویس | +| `assets/admin/components/ServiceInsuranceModal.tsx` | مودال پوشش بیمه به تفکیک قرارداد بیمهگر (منشأ باگ NaN، خط ۱۳۴) | +| `assets/admin/components/ServiceTariffModal.tsx` | مودال تعرفههای سالانه | +| `assets/admin/components/ui/PriceInput.tsx` | ورودی مبلغ (تبدیل رقم را درست انجام میدهد ولی رفتار ویرایش ناقص است) | +| `assets/admin/lib/forms.ts` | `numericField()` / `latinDigitsField()` — wrapper صحیح برای RHF | +| `assets/admin/lib/utils.ts` | `toEnglishDigits`, `digitsOnly`, `rialToToman`, `tomanToRial`, `formatRial` | +| `assets/admin/components/ui/DigitInput.tsx` | ورودی فقط-رقم برای state معمولی (غیر RHF) | +| `assets/admin/App.tsx` | جدول route ها (خط ۲۴۸: `clinic-services`) | +| `src/ClinicService/Controller/ClinicServiceController.php` | اندپوینتهای سرویس/بخش/تعرفه | +| `src/ClinicService/Entity/ServiceItem.php` | Entity + `toArray()` (خط ~۱۵۰) | +| `docs/api/clinicservice.md` (یا معادلش) | مستندات API که باید در همین session بهروز شود | + +## وضعیت فعلی + +### ۱) سوییچ بیمه در مودال سرویس — `ClinicServicesPage.tsx:547-591` + +```tsx +{/* بیمه */} +