refactor(FE): Refactor delivery order value initialization logic

This commit is contained in:
rstubryan
2026-03-05 09:41:25 +07:00
parent 1938f6cbda
commit 4de21561b3
2 changed files with 86 additions and 29 deletions
@@ -111,16 +111,34 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => {
useState<DeliveryOrderProductFormValues | null>(null); useState<DeliveryOrderProductFormValues | null>(null);
const [deliveryOrderValues, setDeliveryOrderValues] = useState< const [deliveryOrderValues, setDeliveryOrderValues] = useState<
DeliveryOrderProductFormValues[] DeliveryOrderProductFormValues[]
>( >([]);
isResponseSuccess(marketing)
? mergeSOwithDO( const getDeliveryOrderValues = useCallback(
marketing?.data.sales_order?.map(SalesProductToFieldValues) ?? [], (marketingData: Marketing): DeliveryOrderProductFormValues[] => {
marketing?.data.delivery_order?.flatMap((delivery) => const hasDeliveryOrder =
DeliveryProductToFieldValues(marketing.data.sales_order, delivery) marketingData.delivery_order &&
) ?? [], marketingData.delivery_order.length > 0 &&
true 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 ================== // ================== SETUP FORMIK ==================
@@ -129,14 +147,8 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => {
>(() => { >(() => {
if (!isResponseSuccess(marketing)) if (!isResponseSuccess(marketing))
return {} as SalesOrderFormValues & DeliveryOrderFormValues; 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); setDeliveryOrderValues(deliveryValues);
return { return {
@@ -162,7 +174,7 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => {
) ?? [], ) ?? [],
delivery_order: deliveryValues, delivery_order: deliveryValues,
}; };
}, [marketing]); }, [marketing, getDeliveryOrderValues]);
const formik = useFormik<SalesOrderFormValues & DeliveryOrderFormValues>({ const formik = useFormik<SalesOrderFormValues & DeliveryOrderFormValues>({
enableReinitialize: true, enableReinitialize: true,
@@ -647,9 +659,8 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => {
<tr> <tr>
<td className='text-sm px-4 py-3'>No. Order</td> <td className='text-sm px-4 py-3'>No. Order</td>
<td className='text-sm px-4 py-3'> <td className='text-sm px-4 py-3'>
{marketing.data.do_number {marketing.data.do_number ||
? marketing.data.do_number marketing.data.so_number}
: marketing.data.so_number}
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -764,6 +775,7 @@ const DeliveryOrderFormModal = ({}: { initialValues?: Marketing }) => {
<MemoizedDeliveryOrderProductForm <MemoizedDeliveryOrderProductForm
formState={'edit'} formState={'edit'}
salesOrders={marketing?.data?.sales_order ?? []} salesOrders={marketing?.data?.sales_order ?? []}
deliveryOrders={marketing?.data?.delivery_order ?? []}
exisitingValues={deliveryOrderValues} exisitingValues={deliveryOrderValues}
onSubmitForm={handleAddSubmitDO} onSubmitForm={handleAddSubmitDO}
initialValues={selectedDeliveryProduct ?? undefined} initialValues={selectedDeliveryProduct ?? undefined}
@@ -10,7 +10,10 @@ import NumberInput from '@/components/input/NumberInput';
import PatternInput from '@/components/input/PatternInput'; import PatternInput from '@/components/input/PatternInput';
import { formatTitleCase, formatVechicleNumber } from '@/lib/helper'; import { formatTitleCase, formatVechicleNumber } from '@/lib/helper';
import DateInput from '@/components/input/DateInput'; import DateInput from '@/components/input/DateInput';
import { BaseSalesOrder } from '@/types/api/marketing/marketing'; import {
BaseSalesOrder,
BaseDeliveryOrder,
} from '@/types/api/marketing/marketing';
import { SalesProductToFieldValues } from '@/components/pages/marketing/form/MarketingForm.schema'; import { SalesProductToFieldValues } from '@/components/pages/marketing/form/MarketingForm.schema';
import * as Yup from 'yup'; import * as Yup from 'yup';
import { isResponseSuccess } from '@/lib/api-helper'; import { isResponseSuccess } from '@/lib/api-helper';
@@ -32,6 +35,7 @@ import { handleMarketingCalculation } from '@/lib/marketing-calculation';
const DeliveryOrderProductForm = ({ const DeliveryOrderProductForm = ({
formState, formState,
salesOrders, salesOrders,
deliveryOrders,
initialValues, initialValues,
exisitingValues, exisitingValues,
onUpdateForm, onUpdateForm,
@@ -39,6 +43,7 @@ const DeliveryOrderProductForm = ({
}: { }: {
formState: 'add' | 'edit'; formState: 'add' | 'edit';
salesOrders: BaseSalesOrder[]; salesOrders: BaseSalesOrder[];
deliveryOrders?: BaseDeliveryOrder[];
initialValues?: DeliveryOrderProductFormValues; initialValues?: DeliveryOrderProductFormValues;
exisitingValues?: DeliveryOrderProductFormValues[]; exisitingValues?: DeliveryOrderProductFormValues[];
onSubmitForm?: (value: DeliveryOrderProductFormValues) => Promise<void>; onSubmitForm?: (value: DeliveryOrderProductFormValues) => Promise<void>;
@@ -115,6 +120,36 @@ const DeliveryOrderProductForm = ({
}) })
?.filter((item) => item != null) as OptionType[]; ?.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( const salesOrder = salesOrders.find(
(item) => item.id === initialValues?.marketing_product_id (item) => item.id === initialValues?.marketing_product_id
); );
@@ -122,15 +157,25 @@ const DeliveryOrderProductForm = ({
const formik = useFormik<DeliveryOrderProductFormValues>({ const formik = useFormik<DeliveryOrderProductFormValues>({
enableReinitialize: true, enableReinitialize: true,
initialValues: { initialValues: {
delivery_date: initialValues?.delivery_date || undefined, delivery_date:
vehicle_number: initialValues?.vehicle_number || undefined, deliveryOrder?.delivery_date ||
initialValues?.delivery_date ||
undefined,
vehicle_number:
deliveryOrder?.vehicle_number ||
initialValues?.vehicle_number ||
undefined,
marketing_product_id: marketing_product_id:
salesOrder?.id || initialValues?.marketing_product_id || undefined, salesOrder?.id || initialValues?.marketing_product_id || undefined,
unit_price: initialValues?.unit_price || undefined, unit_price:
total_weight: initialValues?.total_weight || undefined, deliveryOrder?.unit_price ?? initialValues?.unit_price ?? undefined,
qty: initialValues?.qty || undefined, total_weight:
avg_weight: initialValues?.avg_weight || undefined, deliveryOrder?.total_weight ?? initialValues?.total_weight ?? undefined,
total_price: initialValues?.total_price || 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, marketing_product: initialValues?.marketing_product || undefined,
uom: initialValues?.uom || '', uom: initialValues?.uom || '',
weight_per_convertion: weight_per_convertion: