import { type FC, useState } from 'react' import { Printer, TickCircle } from 'iconsax-react' import ModalConfirm from '@/components/ModalConfirm' import Button from '@/components/Button' import Table from '@/components/Table' import type { RowDataType } from '@/components/types/TableTypes' import { Link, useParams } from 'react-router-dom' import { useQueryClient } from '@tanstack/react-query' import { useConfirmInvoiceItem, useGetInvoiceDetail } from './hooks/useInvoiceData' import { useGetRequestDetails } from '@/pages/request/hooks/useRequestData' import { NumberFormat } from '@/config/func' import moment from 'moment-jalaali' import type { InvoiceItem as ApiInvoiceItem } from './types/InvoiceTypes' import { Paths } from '@/config/Paths' import { useGetPaymentInvoice } from '../payment/hooks/usePaymentData' import InvoicePaymentList from './InvoicePaymentList' import { formatItemDiscountDisplay } from './utils/invoiceItem' interface TableInvoiceItem extends RowDataType { id: string image: string | null title: string quantity: string unitPrice: string discountValue: string discountPercent: string totalPrice: string confirmed: boolean confirmedAt: string | null } const formatPrice = (num: number) => `${NumberFormat(num)} ریال` const InvoiceDetail: FC = () => { const { id } = useParams() const queryClient = useQueryClient() const { data, isPending } = useGetInvoiceDetail(id!) useGetPaymentInvoice(id) const { data: requestData } = useGetRequestDetails(data?.data?.requestId ?? '') const { mutate: confirmInvoiceItem, isPending: isConfirming } = useConfirmInvoiceItem() const [confirmingItemId, setConfirmingItemId] = useState(null) const invoice = data?.data const invoiceData = invoice ? { invoiceNumber: String(invoice.invoiceNumber), confirmDate: invoice.items?.[0]?.confirmedAt ? moment(invoice.items[0].confirmedAt).format('jYYYY/jMM/jDD HH:mm') : '-', customerName: [invoice.user?.firstName, invoice.user?.lastName].filter(Boolean).join(' ') || invoice.user?.phone || '-', orderDate: moment(invoice.createdAt).format('jYYYY/jMM/jDD'), phoneNumber: invoice.user?.phone || '-', orderNumber: String(requestData?.data?.requestNumber ?? '-'), address: invoice.user?.addresse || '-', paymentMethod: invoice.paymentMethod || '-', } : null const items: TableInvoiceItem[] = invoice?.items?.map((item: ApiInvoiceItem) => { const discounts = formatItemDiscountDisplay(item) return { id: item.id, image: item.product?.images?.[0] ?? null, title: item.product?.title || '-', quantity: String(item.quantity), unitPrice: formatPrice(item.unitPrice), discountValue: discounts.value, discountPercent: discounts.percent, totalPrice: formatPrice(item.total ?? 0), confirmed: !!item.confirmedAt, confirmedAt: item.confirmedAt, }}) ?? [] const handlePrint = () => { window.print() } const handleConfirmProforma = () => { if (!confirmingItemId) return confirmInvoiceItem(confirmingItemId, { onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['invoice', id] }) setConfirmingItemId(null) }, }) } const columns = [ { key: 'title', title: 'عنوان', }, { key: 'quantity', title: 'تعداد', }, { key: 'unitPrice', title: 'مبلغ واحد', }, { key: 'discountValue', title: 'تخفیف (مبلغ)', }, { key: 'discountPercent', title: 'تخفیف (درصد)', }, { key: 'totalPrice', title: 'مبلغ کل', }, { key: 'image', title: '', render: (item: TableInvoiceItem) => ( !item.confirmed ? (
e.stopPropagation()}>
) : ( item.confirmedAt && ( تایید شده در {moment(item.confirmedAt).format('jYYYY/jMM/jDD HH:mm')} ) ) ) } ] if (isPending && !invoice) { return (
در حال بارگذاری...
) } if (!invoiceData) { return (
صورت حساب یافت نشد
) } // const isPaid = invoice && invoice.paidAmount >= invoice.total && invoice.total > 0 return (
{/* Header */}
صورت حساب {invoiceData.invoiceNumber}
{/* بخش اول: اطلاعات صورت حساب */}
اطلاعات صورت حساب
تاریخ ایجاد سفارش : {invoiceData.orderDate}
شماره همراه: {invoiceData?.phoneNumber}
تاریخ تایید پیش فاکتور: {invoiceData.confirmDate}
مشتری: {invoiceData.customerName}
آدرس: {invoiceData.address}
روش پرداخت: {invoiceData.paymentMethod}
{invoice?.description && (
توضیحات: {invoice.description}
)} {invoice?.attachments && invoice.attachments.length > 0 && (
پیوست‌ها:
    {invoice.attachments.map((att: unknown, index: number) => { const url = typeof att === 'string' ? att : (att as { url?: string })?.url const name = typeof att === 'object' && att && 'name' in (att as object) ? (att as { name?: string }).name : url || `پیوست ${index + 1}` return url ? (
  • {name}
  • ) : null })}
)}
{/* بخش دوم: اقلام درخواستی */}
اقلام درخواستی
{/* Price Summary */} {invoice && (
جمع کل: {formatPrice(invoice.subTotal)}
{(invoice.discount ?? 0) > 0 && (
تخفیف: {formatPrice(invoice.discount ?? 0)}
)} {invoice.enableTax && invoice.taxAmount > 0 && (
مالیات: {formatPrice(invoice.taxAmount)}
)}
مبلغ کل: {formatPrice(invoice.total)}
مبلغ پرداخت شده: {formatPrice(invoice.paidAmount)}
مانده: {formatPrice(invoice.balance)}
)} {/* Notes Section */}
۱- تمام تحویل‌ها، سفارشات با تاکیب مناسب و منعطف، ۱۵ می باشد و مبلغ نهایی براساس تراز نهایی محاسبه می‌گردد.
۲- سفارشات چاپی با اختلاف رنگ ۱۰ الی ۱۵ درصد یا قابل طراحی شده می‌باشد
{/* لیست پرداخت‌ها */}
setConfirmingItemId(null)} onConfirm={handleConfirmProforma} title='تایید پیش فاکتور' message='آیا از تایید این پیش فاکتور اطمینان دارید؟' confirmLabel='تایید' cancelLabel='انصراف' isLoading={isConfirming} /> ) } export default InvoiceDetail