From af939ee225343ddb22c1d56fb18995cf30b5368d Mon Sep 17 00:00:00 2001 From: randy-ar Date: Thu, 20 Nov 2025 19:43:50 +0700 Subject: [PATCH] feat(FE-272): adding DO PDF export --- package.json | 2 +- .../marketing/detail/MarketingDetail.tsx | 9 +- .../marketing/pdf/DeliveryOrderExport.tsx | 235 ++++++++++++++++++ 3 files changed, 241 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3416a673..6d3edacd 100644 --- a/package.json +++ b/package.json @@ -49,4 +49,4 @@ "tailwindcss": "^4", "typescript": "^5" } -} \ No newline at end of file +} diff --git a/src/components/pages/marketing/detail/MarketingDetail.tsx b/src/components/pages/marketing/detail/MarketingDetail.tsx index 1b3945e5..d196732e 100644 --- a/src/components/pages/marketing/detail/MarketingDetail.tsx +++ b/src/components/pages/marketing/detail/MarketingDetail.tsx @@ -32,6 +32,7 @@ import { useRouter } from 'next/navigation'; import { useState } from 'react'; import toast from 'react-hot-toast'; import SalesOrderExport from '@/components/pages/marketing/pdf/SalesOrderExport'; +import DeliveryOrderExport from '../pdf/DeliveryOrderExport'; const MarketingDetail = ({ initialValues, @@ -386,10 +387,10 @@ const MarketingDetail = ({ />
- +
); diff --git a/src/components/pages/marketing/pdf/DeliveryOrderExport.tsx b/src/components/pages/marketing/pdf/DeliveryOrderExport.tsx index e69de29b..c2b19660 100644 --- a/src/components/pages/marketing/pdf/DeliveryOrderExport.tsx +++ b/src/components/pages/marketing/pdf/DeliveryOrderExport.tsx @@ -0,0 +1,235 @@ +import Button from '@/components/Button'; +import { BaseDeliveryOrder, Marketing } from '@/types/api/marketing/marketing'; +import { Icon } from '@iconify/react'; +import { Document, Image, Page, pdf, Text, View } from '@react-pdf/renderer'; +import { useMemo, useState } from 'react'; +import pdfStyles from './styles/MarketingPDFStyles'; +import { formatDate, formatNumber, formatVechicleNumber } from '@/lib/helper'; +import { format } from 'path'; +import { date } from 'yup'; + +interface DeliveryOrderExportProps { + data?: Marketing; + deliveryOrder: BaseDeliveryOrder; + className?: string; +} + +const DeliveryOrderExport = ({ + data, + deliveryOrder, +}: DeliveryOrderExportProps) => { + const [isGeneratingPDF, setIsGeneratingPDF] = useState(false); + const salesData = data; + + const handleDownloadPDF = async () => { + if (!salesData) { + alert('No sales order data available'); + return; + } + setIsGeneratingPDF(true); + try { + const blob = await pdf( + + ).toBlob(); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `${deliveryOrder?.do_number || 'delivery-order'}.pdf`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + } catch (error) { + console.error('Error generating PDF:', error); + alert('Failed to generate PDF. Please try again.'); + } finally { + setIsGeneratingPDF(false); + } + }; + + if (!salesData) { + return ( +
+
No sales order data available
+
+ ); + } + + return salesData?.so_number && salesData.so_number !== 'Belum dibuat' ? ( + + ) : 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 + + + + + ); +};