import Button from '@/components/Button'; import { BaseDeliveryOrder, Marketing } from '@/types/api/marketing/marketing'; import { Icon } from '@iconify/react'; import { Document, Page, pdf, Text, View } from '@react-pdf/renderer'; import { useMemo, useState } from 'react'; import { formatDate, formatNumber, formatVechicleNumber } from '@/lib/helper'; import pdfStyles from '@/components/pages/marketing/pdf/styles/MarketingPDFStyles'; import toast from 'react-hot-toast'; import { useSearchParams } from 'next/navigation'; interface DeliveryOrderExportProps { data?: Marketing; deliveryOrder: BaseDeliveryOrder; className?: string; } const DeliveryOrderExport = ({ data, deliveryOrder, }: DeliveryOrderExportProps) => { const [isGeneratingPDF, setIsGeneratingPDF] = useState(false); const salesData = data; const searchParams = useSearchParams(); const action = searchParams.get('action'); const id = searchParams.get('id'); const handleDownloadPDF = async () => { if (!salesData) { toast.error('No sales order data available'); return; } setIsGeneratingPDF(true); try { const blob = await pdf( ).toBlob(); const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.style.display = 'none'; link.href = url; link.download = `${deliveryOrder?.do_number || 'delivery-order'}.pdf`; link.setAttribute('target', '_blank'); link.setAttribute('rel', 'noopener noreferrer'); document.body.appendChild(link); link.click(); // Delay cleanup to ensure download starts setTimeout(() => { document.body.removeChild(link); window.URL.revokeObjectURL(url); }, 150); } catch { toast.error('Failed to generate PDF. Please try again.'); } finally { setIsGeneratingPDF(false); window.location.href = `/marketing?action=${action}&id=${id}`; } }; if (!salesData) { return (
No sales order data available
); } return deliveryOrder?.do_number ? ( ) : null; }; export default DeliveryOrderExport; const PDFDocument = ({ data, deliveryOrder, }: { data: Marketing; deliveryOrder: BaseDeliveryOrder; }) => { const grandTotal = useMemo(() => { return ( deliveryOrder.deliveries?.reduce((a, b) => a + b.total_price, 0) ?? 0 ); }, []); return ( {/* Header Section */} PT LUMBUNG TELUR INDONESIA SOHO Building Lt.3 (Paris Van Java), Jalan Karang Tinggal, Kel. Cipedes, Kec. Sukajadi, Kota Bandung 40162 {/* Delivery Order Title */} DELIVERY ORDER {deliveryOrder.do_number || '-'} {/* Depature Table */} Ship To Depature From {data?.customer?.name || '-'} ({data?.customer?.type || '-'}) {data?.customer.email || ''} - {data?.customer.phone || ''} {data?.customer.address || ''} {deliveryOrder.warehouse?.name || '-'} {formatDate(deliveryOrder.delivery_date, 'DD MMM YYYY')} {deliveryOrder.warehouse?.area?.name} {/* Delivery Table */} Product Shipped Item Description Vehicle Number Unit Price Quantity Total Amount {deliveryOrder.deliveries?.map((item, index) => { return ( {item.product_warehouse?.product?.name || '-'} {formatVechicleNumber(item.vehicle_number) || '-'} Rp{formatNumber(item.unit_price || 0)} {formatNumber(item.qty || 0)} Rp{formatNumber(item.total_price || 0)} ); }) || []} {/* Grand Total Row inside table */} Grand Total Rp{formatNumber(grandTotal)} {/* Footer with Special Instructions */} From Sales Order {data?.so_number || '-'} -{' '} {formatDate(data.so_date, 'DD MMM YYYY')} PT LUMBUNG TELUR INDONESIA ); };