import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { MagnifyingGlassIcon, EyeIcon, BanknotesIcon } from '@heroicons/react/24/outline'; import PageHeader from '../components/ui/PageHeader'; import Pagination from '../components/ui/Pagination'; import PersianDateInput from '../components/ui/PersianDateInput'; import { formatRial, formatNumber, toDate } from '../lib/utils'; import { usePatientPayments, MY_PAYMENTS_LIMIT, type PatientPaymentRow, type PaymentRowStatus, } from '../hooks/useMyPayments'; const STATUS_LABEL: Record = { paid: 'پرداخت شده', unsettled: 'تسویه نشده', unpaid: 'پرداخت نشده', }; const STATUS_BADGE: Record = { paid: 'green', unsettled: 'amber', unpaid: 'red', }; const EMPTY: PatientPaymentRow[] = []; /** unix start-of-day for `from`, end-of-day for `to`, from a gregorian Y-m-d. */ function dayBound(value: string, end: boolean): number | undefined { const d = toDate(value); if (!d) return undefined; const secs = Math.floor(d.setHours(0, 0, 0, 0) / 1000); return end ? secs + 86399 : secs; } /** لیست پرداخت‌ها — per-patient payment summary for the logged-in doctor/clinic. */ export default function MyPaymentsPage() { const navigate = useNavigate(); const [page, setPage] = useState(1); const [nationalCode, setNationalCode] = useState(''); const [status, setStatus] = useState(''); const [from, setFrom] = useState(''); const [to, setTo] = useState(''); const reset = () => setPage(1); const { data, isLoading } = usePatientPayments({ page, national_code: nationalCode.trim() || undefined, status: status || undefined, from: from ? dayBound(from, false) : undefined, to: to ? dayBound(to, true) : undefined, }); const rows = data?.data ?? EMPTY; const total = data?.meta?.totalRecords ?? 0; const th: React.CSSProperties = { textAlign: 'right', padding: '12px 16px', fontWeight: 600 }; const td: React.CSSProperties = { padding: '12px 16px' }; return ( <> {/* فیلترها */}
{ setNationalCode(e.target.value.replace(/\D/g, '')); reset(); }} placeholder="کد ملی بیمار را وارد کنید..." dir="ltr" inputMode="numeric" />
{ setFrom(v); reset(); }} placeholder="از تاریخ" />
{ setTo(v); reset(); }} placeholder="تا تاریخ" />
{isLoading ? (
در حال بارگذاری…
) : rows.length === 0 ? (
پرداختی یافت نشد
با ثبت صورتحساب برای بیماران، این فهرست پر می‌شود.
) : ( <>
{rows.map((row, i) => ( ))}
ردیف نام بیمار کد ملی تعداد صورتحساب مبلغ پرداختی مبلغ باقیمانده وضعیت عملیات
{formatNumber((page - 1) * MY_PAYMENTS_LIMIT + i + 1)} {row.patient_name ?? '—'} {row.national_code ?? '—'} {formatNumber(row.invoice_count)} {formatRial(row.paid_rials)} 0 ? 'var(--danger)' : 'var(--text-2)' }}> {formatRial(row.remaining_rials)} {STATUS_LABEL[row.status]}
)} ); }