import { useEffect, useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import { api } from '../lib/api'; import { formatRial } from '../lib/utils'; interface InsuranceRow { insurance_id: number; insurance_name: string; type: string; patient_share_rials: number | null; } interface PricingResponse { free_visit_price_rials: number; insurances: InsuranceRow[]; } const TYPE_LABEL: Record = { basic: 'بیمه پایه', supplementary: 'بیمه تکمیلی', }; export default function InsurancePricingSection() { const qc = useQueryClient(); const [freeVisit, setFreeVisit] = useState(''); const [shares, setShares] = useState>({}); const { data, isLoading } = useQuery<{ data: PricingResponse }>({ queryKey: ['insurance-pricing'], queryFn: () => api.get('/api/v1/insurance-pricing'), }); const pricing = (data as any)?.data as PricingResponse | undefined; useEffect(() => { if (!pricing) return; setFreeVisit(String(pricing.free_visit_price_rials ?? 0)); const next: Record = {}; pricing.insurances.forEach((i) => { next[i.insurance_id] = i.patient_share_rials != null ? String(i.patient_share_rials) : ''; }); setShares(next); }, [pricing]); const saveMut = useMutation({ mutationFn: () => api.put('/api/v1/insurance-pricing', { free_visit_price_rials: Number(freeVisit) || 0, insurances: (pricing?.insurances ?? []).map((i) => ({ insurance_id: i.insurance_id, patient_share_rials: shares[i.insurance_id] === '' || shares[i.insurance_id] == null ? null : Number(shares[i.insurance_id]) || 0, })), }), onSuccess: () => { toast.success('قیمت‌گذاری بیمه ذخیره شد'); qc.invalidateQueries({ queryKey: ['insurance-pricing'] }); }, onError: (e: Error) => toast.error(e.message), }); const basics = (pricing?.insurances ?? []).filter((i) => i.type === 'basic'); const supps = (pricing?.insurances ?? []).filter((i) => i.type === 'supplementary'); const renderRow = (i: InsuranceRow) => { const share = shares[i.insurance_id] ?? ''; const preview = share !== '' && freeVisit !== '' ? `سهم بیمار: ${formatRial(Number(share) || 0)}` : 'تعیین نشده'; return (
{i.insurance_name}
{preview}
setShares((p) => ({ ...p, [i.insurance_id]: e.target.value })) } />
); }; return (

قیمت‌گذاری ویزیت بر اساس بیمه

مبلغ ویزیت آزاد و سهم بیمار به ازای هر بیمه را تعیین کنید. خالی‌گذاشتن یک بیمه یعنی پذیرفته نمی‌شود.

{isLoading ? (
در حال بارگذاری...
) : (
setFreeVisit(e.target.value)} /> {freeVisit !== '' ? formatRial(Number(freeVisit) || 0) : '—'}
{basics.length > 0 && (
{TYPE_LABEL.basic}
{basics.map(renderRow)}
)} {supps.length > 0 && (
{TYPE_LABEL.supplementary}
{supps.map(renderRow)}
)} {basics.length === 0 && supps.length === 0 && (
بیمه فعالی در سیستم تعریف نشده است.
)}
)}
); }