import Tabs from '@/components/Tabs' import { useMemo, useState, type FC } from 'react' import { ProformaInvoiceStatusEnum } from './enum/InvoiceEnum' import Filters from '@/components/Filters' import Table from '@/components/Table' import { Eye, Add } from 'iconsax-react' import { Link } from 'react-router-dom' import { Paths } from '@/config/Paths' import moment from 'moment-jalaali' import type { FilterValues } from '@/components/Filters' import { useGetInvoice } from './hooks/useInvoiceData' import type { InvoiceType } from './types/Types' const isInvoiceConfirmed = (item: InvoiceType) => { const items = item.items ?? [] return items.length > 0 && items.every((i) => !!i.confirmedAt) } const ProformaInvoice: FC = () => { const [activeTab, setActiveTab] = useState(ProformaInvoiceStatusEnum.ALL) const [page, setPage] = useState(1) const [filters, setFilters] = useState({}) const { data, isLoading } = useGetInvoice(page) const meta = data?.meta const filteredData = useMemo(() => { const list = data?.data ?? [] if (activeTab === ProformaInvoiceStatusEnum.CONFIRMED) { return list.filter((o) => isInvoiceConfirmed(o)) } if (activeTab === ProformaInvoiceStatusEnum.NOT_CONFIRMED) { return list.filter((o) => !isInvoiceConfirmed(o)) } let result = list const search = (filters.search ?? '').trim() if (search) { const lower = search.toLowerCase() result = result.filter( (o) => String(o.invoiceNumber).includes(search) || o.user?.firstName?.toLowerCase().includes(lower) || o.user?.lastName?.toLowerCase().includes(lower) || o.user?.phone?.includes(search) ) } const dateFilter = filters.date if (dateFilter) { const filterDate = moment(dateFilter, 'jYYYY/jMM/jDD').format('YYYY-MM-DD') result = result.filter((o) => { const d = o.createdAt return d && moment(d).format('YYYY-MM-DD') === filterDate }) } return result }, [data?.data, activeTab, filters.search, filters.date]) const getPaymentStatus = (item: InvoiceType) => { const total = Number(item.total) || 0 const paid = Number(item.paidAmount) || 0 if (total <= 0) return '-' if (paid >= total) return 'پرداخت شده' if (paid > 0) return 'پرداخت جزئی' return 'پرداخت نشده' } const getServiceLabel = (item: InvoiceType) => { if (!item.items?.length) return '-' if (item.items.length === 1) return item.items[0].product?.title ?? '-' return `${item.items.length} خدمت` } return (

پیش فاکتورها

setActiveTab(tab as ProformaInvoiceStatusEnum)} />
item.invoiceNumber, }, { key: 'service', title: 'خدمت', render: (item) => getServiceLabel(item), }, { key: 'issueDate', title: 'تاریخ صدور', render: (item) => item.createdAt ? moment(item.createdAt).format('jYYYY/jMM/jDD') : '-', }, { key: 'lastConfirmDate', title: 'آخرین مهلت تایید', render: (item) => item.approvalDeadline ? moment(item.approvalDeadline).format('jYYYY/jMM/jDD') : '-', }, { key: 'total', title: 'مجموع', render: (item) => item.total ? Number(item.total).toLocaleString('fa-IR') + ' تومان' : '-', }, { key: 'confirmStatus', title: 'وضعیت تایید', render: (item) => { const confirmed = isInvoiceConfirmed(item) return ( {confirmed ? 'تایید شده' : 'تایید نشده'} ) }, }, { key: 'paymentStatus', title: 'وضعیت پرداخت', render: (item) => getPaymentStatus(item), }, { key: 'actions', title: '', render: (item) => (
), }, ]} data={filteredData} isLoading={isLoading} noDataMessage='پیش فاکتوری یافت نشد.' pagination={ meta && meta.totalPages > 1 ? { currentPage: meta.page, totalPages: meta.totalPages, onPageChange: setPage, } : undefined } /> ) } export default ProformaInvoice