import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { api } from '../lib/api'; import type { ApiResponse, PaginatedResponse } from '../lib/api'; import { formatDate, formatNumber, formatRial } from '../lib/utils'; import PageHeader from '../components/ui/PageHeader'; import StatCard from '../components/ui/StatCard'; import DataTable, { Column } from '../components/ui/DataTable'; import Pagination from '../components/ui/Pagination'; import PersianDateInput from '../components/ui/PersianDateInput'; interface EarningsSummary { enabled: boolean; share_percent: number; relations: { relation_uuid: string; doctor_name: string; clinic_name: string | null; share_percent: number }[]; today_rials: number; this_month_rials: number; total_rials: number; appointments_count: number; wallet_balance_rials: number; } interface EarningRow { uuid: string; appointment_uuid: string | null; doctor_name: string | null; gross_rials: number; sms_fee_rials: number; tax_rials: number; net_after_tax_rials: number; share_percent: number; share_rials: number; created_at: number; } /** تاریخ ISO (Y-m-d) → Unix؛ رشتهٔ خالی یعنی بدون فیلتر. */ const toUnix = (iso: string): string => (iso ? String(Math.floor(new Date(iso).getTime() / 1000)) : ''); /** درآمد منشی از نوبت‌های آنلاین: خلاصهٔ روزانه/ماهانه + گزارش سطر-به-سطر. */ export default function SecretaryEarningsPage() { const [page, setPage] = useState(1); const [from, setFrom] = useState(''); const [to, setTo] = useState(''); const limit = 15; const { data: summaryData } = useQuery>({ queryKey: ['secretary-earnings-summary'], queryFn: () => api.get('/api/v1/secretary/earnings/summary'), }); const summary = summaryData?.data?.data; const { data, isLoading } = useQuery({ queryKey: ['secretary-earnings-report', page, from, to], queryFn: () => { const params = new URLSearchParams({ page: String(page), limit: String(limit) }); if (from) params.set('from', toUnix(from)); if (to) params.set('to', toUnix(to)); return api.get>(`/api/v1/secretary/earnings/report?${params}`); }, }); const rows = data?.data ?? []; const total = data?.meta?.totalRecords ?? 0; const columns: Column[] = [ { key: 'created_at', header: 'تاریخ', render: (r) => formatDate(r.created_at) }, { key: 'doctor_name', header: 'پزشک', render: (r) => r.doctor_name ?? '—' }, { key: 'gross_rials', header: 'مبلغ نوبت', render: (r) => formatRial(r.gross_rials) }, { key: 'sms_fee_rials', header: 'هزینه پیامک', render: (r) => (r.sms_fee_rials > 0 ? formatRial(r.sms_fee_rials) : '—') }, { key: 'tax_rials', header: 'مالیات', render: (r) => (r.tax_rials > 0 ? formatRial(r.tax_rials) : '—') }, { key: 'net_after_tax_rials', header: 'مبلغ خالص', render: (r) => formatRial(r.net_after_tax_rials) }, { key: 'share_percent', header: 'درصد', render: (r) => `${formatNumber(r.share_percent)}٪` }, { key: 'share_rials', header: 'سهم شما', render: (r) => ( {formatRial(r.share_rials)} ) }, ]; return (
{summary && !summary.enabled ? (
محاسبه درآمد از نوبت‌های آنلاین برای شما فعال نیست. برای فعال‌سازی با مدیر سیستم تماس بگیرید.
) : ( <>
{ setFrom(v); setPage(1); }} placeholder="انتخاب" />
{ setTo(v); setPage(1); }} placeholder="انتخاب" />
{formatNumber(summary?.appointments_count ?? 0)} نوبت
columns={columns} data={rows} loading={isLoading} emptyMessage="هنوز درآمدی از نوبت آنلاین ثبت نشده است" />
)}
); }