import Tabs from '@/components/Tabs' import { useMemo, useState, type FC } from 'react' import { Link, useNavigate, useSearchParams } from 'react-router-dom' import { invoiceListTabs, invoiceListTabStatuses, ProformaInvoiceStatusEnum, } from './enum/InvoiceEnum' import Filters from '@/components/Filters' import Table from '@/components/Table' import { useGetInvoices, useGetInvoiceTabCounts } from './hooks/useInvoiceData' import type { Invoice } from './types/InvoiceTypes' import type { ColumnType } from '@/components/types/TableTypes' import type { FilterValues } from '@/components/Filters' import { NumberFormat } from '@/config/func' import { Paths } from '@/config/Paths' import moment from 'moment-jalaali' import StatusWithText from '@/components/StatusWithText' import { Eye } from 'iconsax-react' const INVOICE_TABS = invoiceListTabs.map((tab) => tab.value) const isInvoiceTab = (value: string | null): value is ProformaInvoiceStatusEnum => value !== null && INVOICE_TABS.includes(value as ProformaInvoiceStatusEnum) const getServiceNames = (invoice: Invoice): string => { const names = [...new Set(invoice.items.map((item) => item.product.title))] return names.join('، ') || '-' } const ProformaInvoice: FC = () => { const navigate = useNavigate() const [searchParams, setSearchParams] = useSearchParams() const tabFromQuery = searchParams.get('tab') const activeTab = isInvoiceTab(tabFromQuery) ? tabFromQuery : ProformaInvoiceStatusEnum.PENDING const [filters, setFilters] = useState({}) const statuses = invoiceListTabStatuses[activeTab] const setActiveTab = (tab: ProformaInvoiceStatusEnum) => { setSearchParams( (current) => { const next = new URLSearchParams(current) next.set('tab', tab) return next }, { replace: true }, ) } const { data, isPending } = useGetInvoices({ statuses }) const { data: tabCounts } = useGetInvoiceTabCounts() const invoices = useMemo(() => data?.data ?? [], [data?.data]) const tabsWithCount = useMemo( () => invoiceListTabs.map((tab) => { const total = tab.value === ProformaInvoiceStatusEnum.PENDING ? (tabCounts?.pending ?? 0) : tab.value === ProformaInvoiceStatusEnum.CONFIRMED ? (tabCounts?.confirmed ?? 0) : (tabCounts?.archived ?? 0) return { ...tab, label: total > 0 ? `${tab.label} (${total.toLocaleString('fa-IR')})` : tab.label, } }), [tabCounts], ) const filteredInvoices = useMemo(() => { let result = invoices const search = filters.search?.toString().trim() if (search) { const lower = search.toLowerCase() result = result.filter( (inv) => String(inv.invoiceNumber).includes(search) || inv.user?.phone?.includes(search) || inv.description?.toLowerCase().includes(lower) || inv.items.some((item) => item.product.title.toLowerCase().includes(lower)) ) } const dateFilter = filters.date?.toString() if (dateFilter) { result = result.filter((inv) => { const createdAt = moment(inv.createdAt).format('YYYY-MM-DD') return createdAt === dateFilter }) } return result }, [invoices, filters]) const columns: ColumnType[] = [ { key: 'invoiceNumber', title: 'شماره', render: (item) => {item.invoiceNumber}, }, { key: 'service', title: 'خدمت', render: (item) => {getServiceNames(item)}, }, { key: 'issueDate', title: 'تاریخ صدور', render: (item) => moment(item.createdAt).format('jYYYY/jMM/jDD'), }, { key: 'lastConfirmDate', title: 'آخرین مهلت تایید', render: (item) => moment(item.approvalDeadline).format('jYYYY/jMM/jDD'), }, { key: 'total', title: 'مجموع', render: (item) => {NumberFormat(item.total)} ریال, }, { key: 'status', title: 'وضعیت تایید', render: (item) => { const statusMap = { confirmed: { variant: 'success' as const, text: 'تایید شده' }, partially_confirmed: { variant: 'info' as const, text: 'تایید جزئی' }, pending: { variant: 'warning' as const, text: 'در انتظار تایید' }, archived: { variant: 'info' as const, text: 'آرشیو شده' }, } const status = statusMap[item.status] ?? statusMap.pending return ( ) }, }, { key: 'action', title: '', render: (item) => { return ( ) }, }, ] const handleRowClick = (id: string) => { navigate(`${Paths.proformaInvoice}/${id}`) } return (

پیش فاکتورها

setActiveTab(tab as ProformaInvoiceStatusEnum)} />
columns={columns} data={filteredInvoices} isLoading={isPending} onRowClick={handleRowClick} noDataMessage="پیش فاکتوری یافت نشد" />
) } export default ProformaInvoice