import { useEffect, useState } from 'react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import { api } from '../lib/api'; import type { ApiResponse } from '../lib/api'; import { digitsOnly } from '../lib/utils'; import Modal from './ui/Modal'; interface CoverageDefaultRow { key: string; label: string; coverage_percent: number; } interface Props { /** بیمهٔ هدف؛ `null` یعنی مودال بسته است. */ insurance: { id: number; name: string; type: 'basic' | 'supplementary' } | null; onClose: () => void; } /** * تنظیمات مرکزی درصد پوشش یک بیمه به تفکیک نوع خدمت (سرپایی/بستری/…). * لیست نوع‌ها از سرور می‌آید؛ قراردادهای پزشک/کلینیک که override نکرده‌اند * همین مقادیر را زنده می‌خوانند. */ export default function InsuranceCoverageDefaultsModal({ insurance, onClose }: Props) { const qc = useQueryClient(); const [percents, setPercents] = useState>({}); const { data, isLoading } = useQuery>({ queryKey: ['insurance-coverage-defaults', insurance?.id], queryFn: () => api.get(`/api/v1/admin/insurance/${insurance!.id}/coverage-defaults`), enabled: insurance !== null, }); const rows = data?.data?.categories ?? []; useEffect(() => { if (rows.length === 0) return; setPercents(Object.fromEntries(rows.map((r) => [r.key, String(r.coverage_percent)]))); }, [data]); const save = useMutation({ mutationFn: () => api.put(`/api/v1/admin/insurance/${insurance!.id}/coverage-defaults`, { categories: rows.map((r) => ({ key: r.key, coverage_percent: Number(percents[r.key] || 0) })), }), onSuccess: () => { toast.success('درصدهای پوشش ذخیره شد'); qc.invalidateQueries({ queryKey: ['admin-insurances'] }); qc.invalidateQueries({ queryKey: ['insurance-coverage-defaults', insurance?.id] }); qc.invalidateQueries({ queryKey: ['insurance-pricing'] }); onClose(); }, onError: (e: Error) => toast.error(e.message), }); const invalid = rows.some((r) => Number(percents[r.key] || 0) > 100); return ( } >

{insurance?.type === 'supplementary' ? 'سهم بیمهٔ تکمیلی روی «باقیماندهٔ پس از بیمهٔ پایه» اعمال می‌شود.' : 'سهم بیمهٔ پایه از مبلغ کل خدمت محاسبه می‌شود؛ باقیمانده سهم بیمار است.'} {' '}این مقادیر پیش‌فرض همهٔ پزشکان و کلینیک‌ها است و قراردادهایی که درصد اختصاصی تعیین نکرده‌اند، با تغییر همین اعداد به‌روز می‌شوند.

{isLoading ? (

در حال بارگذاری...

) : (
{rows.map((row) => (
setPercents((p) => ({ ...p, [row.key]: digitsOnly(e.target.value, 3) }))} placeholder="مثلاً: ۳۰" /> {Number(percents[row.key] || 0) > 100 && (

درصد نمی‌تواند بیشتر از ۱۰۰ باشد

)}
))}
)}
); }