import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { TrashIcon, PlusIcon } from '@heroicons/react/24/outline'; import { toast } from 'sonner'; import { api } from '../lib/api'; import { formatRial } from '../lib/utils'; interface Contract { uuid: string; insurance_id: number; insurance_name: string | null; insurance_kind: string | null; version: number; coverage_percent: number; franchise_rials: number; annual_ceiling_rials: number | null; } interface InsuranceOption { insurance_id: number; insurance_name: string; type: string; } const KIND_LABEL: Record = { basic: 'پایه', supplementary: 'تکمیلی', }; export default function TenantInsuranceContracts() { const qc = useQueryClient(); const [addOpen, setAddOpen] = useState(false); const [insuranceId, setInsuranceId] = useState(''); const [coverage, setCoverage] = useState(''); const [franchise, setFranchise] = useState(''); const [ceiling, setCeiling] = useState(''); const contractsQuery = useQuery<{ data: Contract[] }>({ queryKey: ['tenant-insurances'], queryFn: () => api.get('/api/v1/billing/tenant-insurances'), }); const pricingQuery = useQuery<{ data: { insurances: InsuranceOption[] } }>({ queryKey: ['insurance-pricing'], queryFn: () => api.get('/api/v1/insurance-pricing'), }); const contracts = (contractsQuery.data as any)?.data?.data ?? []; const allInsurances: InsuranceOption[] = (pricingQuery.data as any)?.data?.insurances ?? []; const activeIds = new Set(contracts.map((c: Contract) => c.insurance_id)); const available = allInsurances.filter((i) => !activeIds.has(i.insurance_id)); const resetForm = () => { setInsuranceId(''); setCoverage(''); setFranchise(''); setCeiling(''); setAddOpen(false); }; const addMut = useMutation({ mutationFn: () => api.post('/api/v1/billing/tenant-insurances', { insurance_id: Number(insuranceId), coverage_percent: Number(coverage) || 0, franchise_rials: Number(franchise) || 0, annual_ceiling_rials: ceiling === '' ? null : Number(ceiling), }), onSuccess: () => { toast.success('قرارداد بیمه فعال شد'); resetForm(); qc.invalidateQueries({ queryKey: ['tenant-insurances'] }); }, onError: (e: Error) => toast.error(e.message), }); const delMut = useMutation({ mutationFn: (uuid: string) => api.delete(`/api/v1/billing/tenant-insurances/${uuid}`), onSuccess: () => { toast.success('قرارداد غیرفعال شد'); qc.invalidateQueries({ queryKey: ['tenant-insurances'] }); }, onError: (e: Error) => toast.error(e.message), }); return (

قراردادهای بیمه

بیمه‌هایی که با آن‌ها قرارداد دارید. درصد پوشش، فرانشیز و سقف تعهد هر بیمه را تعیین کنید.

{!addOpen && available.length > 0 && ( )}
{addOpen && (
setCoverage(e.target.value)} />
setFranchise(e.target.value)} />
setCeiling(e.target.value)} />
)} {contractsQuery.isLoading ? (
در حال بارگذاری...
) : contracts.length === 0 ? (
هنوز با هیچ بیمه‌ای قرارداد فعال ندارید.
) : (
{contracts.map((c: Contract) => (
{c.insurance_name ?? `#${c.insurance_id}`} {c.insurance_kind && {KIND_LABEL[c.insurance_kind] ?? c.insurance_kind}}
پوشش {c.coverage_percent}٪ {c.franchise_rials > 0 && ` · فرانشیز ${formatRial(c.franchise_rials)}`} {c.annual_ceiling_rials != null && ` · سقف ${formatRial(c.annual_ceiling_rials)}`}
))}
)}
); }