Multi-tenant insurance contracts, service coverage, versioned tariffs, invoice calculation, and insurance claims with debt reporting. - TenantInsurance: per-tenant insurance contracts (coverage/franchise/ceiling, versioning, soft-deactivate) + active guard - ServiceItem.insuranceCovered + TenantServiceCoverage per-service overrides - Tariff: versioned yearly tariffs with fallback to ServiceItem price - Billing domain: Money/ShareBreakdown VOs, BillingCalculator (unit-tested), Invoice/InvoiceItem aggregate, InvoiceService.createFromSession - Claim/ClaimItem with state machine (pending->submitted->approved/rejected->paid), ClaimService, insurance-debt report - ClaimSubmitterInterface + ManualClaimSubmitter (future insurance API ready) - Admin UI: insurance-pricing page, claims page, service tariff modal, service insurance toggle; routes + sidebar entries - Architecture doc + billing/insurance/clinic-services API docs Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.0 KiB
مشخصکردن شمول بیمه برای هر خدمت
پروژه
clinicpro (backend + admin frontend)
زمینه
هر خدمت کلینیک با موجودیت ServiceItem نگهداری میشود. در حال حاضر هیچ فیلدی ندارد که بگوید این خدمت شامل بیمه میشود یا نه.
مشکل / هدف
افزودن قابلیت تعیین «شمول بیمه» به هر ServiceItem:
- یک پرچم: آیا این خدمت شامل بیمه میشود؟
- اگر شامل میشود، اطلاعات لازم برای محاسبهی درست (مثلاً سهم بیمار / درصد پوشش / لیست بیمههای پذیرفتهشده) ذخیره و نمایش داده شود.
فایلهای مرتبط
| فایل | نقش |
|---|---|
src/ClinicService/Entity/ServiceItem.php |
موجودیت خدمت |
src/ClinicService/Controller/ClinicServiceController.php |
CRUD خدمات/بخشها |
src/ClinicService/Repository/ServiceItemRepository.php |
کوئریها |
assets/admin/pages/ClinicServicesPage.tsx |
صفحهی مدیریت خدمات در پنل |
src/Patient/Service/PatientService.php |
محاسبهی قیمت مراجعه (مصرفکنندهی خدمت) |
docs/api/clinic-services.md |
مستندات API خدمات |
وضعیت فعلی
ServiceItem فیلدهای موجود:
private string $name;
#[ORM\Column(name: 'price_rials', type: 'integer')]
private int $priceRials = 0;
#[ORM\Column(type: 'boolean')]
private bool $active = true;
toArray():
return [
'uuid' => $this->uuid,
'section_uuid' => $this->section->getUuid(),
'staff_uuid' => $this->staff?->getUuid(),
'staff_name' => $this->staff?->getFullName(),
'name' => $this->name,
'price_rials' => $this->priceRials,
'active' => $this->active,
'created_at' => $this->createdAt,
'updated_at' => $this->updatedAt,
];
هیچ مفهوم بیمهای ندارد.
وظایف
۱. طراحی فیلد شمول بیمه
تصمیم بگیر مدل داده چه باشد:
- ساده: یک
bool $insuranceCovered = false. - کاملتر:
bool $insuranceCovered+?int $patientShareRials(سهم بیمار وقتی بیمه اعمال شود) یا?float $coveragePercent.
توصیه:
insuranceCovered(bool) +?int $insurancePriceRials(قیمت/سهم بیمار با بیمه). اگرinsuranceCovered=false، فیلد دوم نادیده گرفته شود.
طرح را قبل از پیادهسازی توضیح بده.
۲. Entity + Migration
- فیلد(ها) را به
ServiceItemاضافه کن + getter/setter. - در
toArray()اضافه کن. doctrine:migrations:diffسپسmigrate.
۳. API
ClinicServiceController (create/update خدمت) باید فیلدهای جدید را از body بپذیرد و ذخیره کند. validation مناسب (اگر insurance_covered=true و قیمت بیمه خالی، خطا یا صفر منطقی).
۴. Admin Frontend
در ClinicServicesPage.tsx فرم خدمت:
- یک toggle/checkbox «شامل بیمه میشود»
- وقتی روشن شد، ورودی «قیمت با بیمه (ریال)» نمایش داده شود
- در لیست خدمات، یک badge نشان دهد خدمت شامل بیمه است یا خیر
۵. مستندات
docs/api/clinic-services.md را با فیلدهای جدید در request/response بهروز کن.
نکات مهم
- قیمتها integer ریال.
- این فیلد بعداً در محاسبهی قیمت مراجعه (
PatientService::createSession) قابل استفاده است؛ در این پرامپت فقط ذخیره/نمایش کافی است مگر اینکه ساده باشد همانجا هم اعمال شود. - الگوی frontend خدمات موجود را رعایت کن (همان فرم/modal فعلی).