From 1938f6cbda059a30ae40083c29ed62e90ec3bebd Mon Sep 17 00:00:00 2001 From: rstubryan Date: Wed, 4 Mar 2026 17:13:30 +0700 Subject: [PATCH] refactor(FE): Refactor DeliveryOrderProductTable to support delivery order rendering --- .../table-view/DeliveryOrderProductTable.tsx | 278 +++++++++++++++--- 1 file changed, 235 insertions(+), 43 deletions(-) diff --git a/src/components/pages/marketing/form/table-view/DeliveryOrderProductTable.tsx b/src/components/pages/marketing/form/table-view/DeliveryOrderProductTable.tsx index 12d97b9a..71a6040c 100644 --- a/src/components/pages/marketing/form/table-view/DeliveryOrderProductTable.tsx +++ b/src/components/pages/marketing/form/table-view/DeliveryOrderProductTable.tsx @@ -2,10 +2,11 @@ import { DeliveryOrderProductFormValues } from '@/components/pages/marketing/for import Button from '@/components/Button'; import Card from '@/components/Card'; import { Icon } from '@iconify/react'; -import { useRef } from 'react'; +import { useRef, useMemo } from 'react'; import { formatCurrency, formatDate, formatNumber } from '@/lib/helper'; import DeliveryOrderExport from '@/components/pages/marketing/pdf/DeliveryOrderExport'; -import { Marketing } from '@/types/api/marketing/marketing'; +import { Marketing, BaseDelivery } from '@/types/api/marketing/marketing'; +import { Warehouse } from '@/types/api/master-data/warehouse'; type DeliveryOrderProductTableProps = { data: DeliveryOrderProductFormValues[]; @@ -42,7 +43,31 @@ const DeliveryOrderProductTable = ({ const approvalStepNumber = marketing?.latest_approval?.step_number; - const renderTableContent = (item: DeliveryOrderProductFormValues) => { + const hasDeliveryOrder = useMemo(() => { + return ( + marketing?.delivery_order && + marketing.delivery_order.length > 0 && + marketing.delivery_order.some( + (doItem) => doItem.deliveries && doItem.deliveries.length > 0 + ) + ); + }, [marketing?.delivery_order]); + + const deliveryItems = useMemo(() => { + if (!hasDeliveryOrder) return []; + return ( + marketing?.delivery_order?.flatMap((doItem) => + doItem.deliveries.map((delivery) => ({ + ...delivery, + do_number: doItem.do_number, + delivery_date: doItem.delivery_date, + warehouse: doItem.warehouse, + })) + ) ?? [] + ); + }, [marketing?.delivery_order, hasDeliveryOrder]); + + const renderSalesOrderContent = (item: DeliveryOrderProductFormValues) => { const doItem = marketing?.delivery_order?.find( (doItem) => doItem.do_number === item.do_number ); @@ -185,50 +210,217 @@ const DeliveryOrderProductTable = ({ ); }; + const renderDeliveryOrderContent = ( + item: BaseDelivery & { + do_number: string; + delivery_date: string; + warehouse: Warehouse; + } + ) => { + const parentDoItem = marketing?.delivery_order?.find( + (doItem) => doItem.do_number === item.do_number + ); + + return ( + <> + + + Label + + +
+
Value
+
+ + + <> + + Gudang + {item.warehouse?.name} + + + Produk + + {item.product_warehouse?.product?.name} + + + + Qty + + {item.qty + ? `${formatNumber(item.qty)} ${item.product_warehouse?.product?.uom?.name ?? ''}` + : '-'} + + + {Number(item.avg_weight ?? 0) > 0 && ( + + Avg Bobot + + {formatNumber(Number(item.avg_weight))} Kg + + + )} + {Number(item.total_weight ?? 0) > 0 && ( + + Total Bobot + + {formatNumber(Number(item.total_weight))} + + + )} + + Total Harga Satuan + + {formatCurrency(item.unit_price)} + + + + Total Penjualan + + {formatCurrency(item.total_price)} + + + + + + Label + + +
+
Value
+
+ + + <> + {approvalStepNumber !== 1 && ( + + Tanggal Pengiriman + + {item.delivery_date + ? formatDate(item.delivery_date, 'DD MMM YYYY') + : '-'} + + + )} + {item.do_number && ( + + No. Pengiriman + {item.do_number} + + )} + + No. Polisi + {item.vehicle_number} + + {parentDoItem && ( + + Dokumen Pengiriman + + + + + )} + + + ); + }; + return ( <>
- {data.map((item) => ( -
- {formType === 'success' ? ( -
- - {renderTableContent(item)} -
+ {hasDeliveryOrder + ? deliveryItems.map((item, index) => ( +
+ {formType === 'success' ? ( +
+ + + {renderDeliveryOrderContent(item)} + +
+
+ ) : ( + + + + {renderDeliveryOrderContent(item)} + +
+
+ )}
- ) : ( - - - {renderTableContent(item)} -
-
- )} -
- ))} + )) + : data.map((item) => ( +
+ {formType === 'success' ? ( +
+ + + {renderSalesOrderContent(item)} + +
+
+ ) : ( + + + + {renderSalesOrderContent(item)} + +
+
+ )} +
+ ))}
);