From 4de21561b39b57fbc8ffa6b856ca451908f2c36d Mon Sep 17 00:00:00 2001 From: rstubryan Date: Thu, 5 Mar 2026 09:41:25 +0700 Subject: [PATCH] refactor(FE): Refactor delivery order value initialization logic --- .../marketing/DeliveryOrderFormModal.tsx | 54 +++++++++------- .../delivery-order/DeliverOrderProduct.tsx | 61 ++++++++++++++++--- 2 files changed, 86 insertions(+), 29 deletions(-) diff --git a/src/components/pages/marketing/DeliveryOrderFormModal.tsx b/src/components/pages/marketing/DeliveryOrderFormModal.tsx index b4dd1e6e..4635c826 100644 --- a/src/components/pages/marketing/DeliveryOrderFormModal.tsx +++ b/src/components/pages/marketing/DeliveryOrderFormModal.tsx @@ -111,16 +111,34 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => { useState(null); const [deliveryOrderValues, setDeliveryOrderValues] = useState< DeliveryOrderProductFormValues[] - >( - isResponseSuccess(marketing) - ? mergeSOwithDO( - marketing?.data.sales_order?.map(SalesProductToFieldValues) ?? [], - marketing?.data.delivery_order?.flatMap((delivery) => - DeliveryProductToFieldValues(marketing.data.sales_order, delivery) - ) ?? [], - true - ) - : [] + >([]); + + const getDeliveryOrderValues = useCallback( + (marketingData: Marketing): DeliveryOrderProductFormValues[] => { + const hasDeliveryOrder = + marketingData.delivery_order && + marketingData.delivery_order.length > 0 && + marketingData.delivery_order.some( + (doItem) => doItem.deliveries && doItem.deliveries.length > 0 + ); + + if (hasDeliveryOrder) { + return ( + marketingData.delivery_order?.flatMap((delivery) => + DeliveryProductToFieldValues(marketingData.sales_order, delivery) + ) ?? [] + ); + } + + return mergeSOwithDO( + marketingData.sales_order?.map(SalesProductToFieldValues) ?? [], + marketingData.delivery_order?.flatMap((delivery) => + DeliveryProductToFieldValues(marketingData.sales_order, delivery) + ) ?? [], + true + ); + }, + [] ); // ================== SETUP FORMIK ================== @@ -129,14 +147,8 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => { >(() => { if (!isResponseSuccess(marketing)) return {} as SalesOrderFormValues & DeliveryOrderFormValues; - const deliveryValues = mergeSOwithDO( - marketing?.data.sales_order?.map(SalesProductToFieldValues) ?? [], - marketing?.data.delivery_order?.flatMap((delivery) => - DeliveryProductToFieldValues(marketing.data.sales_order, delivery) - ) ?? [], - true - ); + const deliveryValues = getDeliveryOrderValues(marketing.data); setDeliveryOrderValues(deliveryValues); return { @@ -162,7 +174,7 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => { ) ?? [], delivery_order: deliveryValues, }; - }, [marketing]); + }, [marketing, getDeliveryOrderValues]); const formik = useFormik({ enableReinitialize: true, @@ -647,9 +659,8 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => { No. Order - {marketing.data.do_number - ? marketing.data.do_number - : marketing.data.so_number} + {marketing.data.do_number || + marketing.data.so_number} @@ -764,6 +775,7 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => { Promise; @@ -115,6 +120,36 @@ const DeliveryOrderProductForm = ({ }) ?.filter((item) => item != null) as OptionType[]; + const hasDeliveryOrder = useMemo(() => { + return ( + deliveryOrders && + deliveryOrders.length > 0 && + deliveryOrders.some( + (doItem) => doItem.deliveries && doItem.deliveries.length > 0 + ) + ); + }, [deliveryOrders]); + + const deliveryOrder = useMemo(() => { + if (!hasDeliveryOrder || !deliveryOrders) return null; + + for (const doItem of deliveryOrders) { + const found = doItem.deliveries.find( + (d) => + d.product_warehouse.id === + initialValues?.marketing_product?.product_warehouse_id + ); + if (found) { + return { + ...found, + delivery_date: doItem.delivery_date, + do_number: doItem.do_number, + }; + } + } + return null; + }, [deliveryOrders, hasDeliveryOrder, initialValues]); + const salesOrder = salesOrders.find( (item) => item.id === initialValues?.marketing_product_id ); @@ -122,15 +157,25 @@ const DeliveryOrderProductForm = ({ const formik = useFormik({ enableReinitialize: true, initialValues: { - delivery_date: initialValues?.delivery_date || undefined, - vehicle_number: initialValues?.vehicle_number || undefined, + delivery_date: + deliveryOrder?.delivery_date || + initialValues?.delivery_date || + undefined, + vehicle_number: + deliveryOrder?.vehicle_number || + initialValues?.vehicle_number || + undefined, marketing_product_id: salesOrder?.id || initialValues?.marketing_product_id || undefined, - unit_price: initialValues?.unit_price || undefined, - total_weight: initialValues?.total_weight || undefined, - qty: initialValues?.qty || undefined, - avg_weight: initialValues?.avg_weight || undefined, - total_price: initialValues?.total_price || undefined, + unit_price: + deliveryOrder?.unit_price ?? initialValues?.unit_price ?? undefined, + total_weight: + deliveryOrder?.total_weight ?? initialValues?.total_weight ?? undefined, + qty: deliveryOrder?.qty ?? initialValues?.qty ?? undefined, + avg_weight: + deliveryOrder?.avg_weight ?? initialValues?.avg_weight ?? undefined, + total_price: + deliveryOrder?.total_price ?? initialValues?.total_price ?? undefined, marketing_product: initialValues?.marketing_product || undefined, uom: initialValues?.uom || '', weight_per_convertion: