From 51f157dfad6697e0e0a0af7a2667fbe015e1ce18 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Thu, 20 Nov 2025 23:50:14 +0700 Subject: [PATCH] refactor(FE-208,212): enhance quantity validation and formatting in PurchaseOrderAcceptApprovalForm --- .../order/PurchaseOrderAcceptApprovalForm.tsx | 38 +++++++++++++++++-- .../form/order/PurchaseOrderForm.schema.ts | 6 ++- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/components/pages/purchase/form/order/PurchaseOrderAcceptApprovalForm.tsx b/src/components/pages/purchase/form/order/PurchaseOrderAcceptApprovalForm.tsx index 993e925c..57989cad 100644 --- a/src/components/pages/purchase/form/order/PurchaseOrderAcceptApprovalForm.tsx +++ b/src/components/pages/purchase/form/order/PurchaseOrderAcceptApprovalForm.tsx @@ -22,6 +22,7 @@ import { Purchase, } from '@/types/api/purchase/purchase'; import DateInput from '@/components/input/DateInput'; +import { formatNumber } from '@/lib/helper'; interface PurchaseOrderAcceptApprovalFormProps { type?: 'add' | 'edit'; @@ -218,7 +219,7 @@ const PurchaseOrderAcceptApprovalForm = ({ vehicle_number: item.vehicle_number || '', expedition_vendor: null, expedition_vendor_id: 0, - received_qty: item.sub_qty ? item.sub_qty.toString() : '', + received_qty: '', transport_per_item: '', transport_total: '', }; @@ -227,6 +228,21 @@ const PurchaseOrderAcceptApprovalForm = ({ } }, [purchaseItems, initialValues]); + // ===== HELPER FUNCTIONS ===== + const getQuantityExceededError = useCallback( + (idx: number, receivedQty: number) => { + if (!receivedQty) return null; + + const originalQty = purchaseItems[idx]?.quantity || 0; + if (receivedQty > originalQty) { + return `Tidak boleh melebihi ${formatNumber(originalQty)}`; + } + + return null; + }, + [purchaseItems] + ); + const expeditionVendors: ExpeditionVendorOptionType[] = useMemo(() => { return [ { @@ -410,7 +426,7 @@ const PurchaseOrderAcceptApprovalForm = ({ type='text' value={ purchaseItem?.quantity - ? purchaseItem.quantity.toLocaleString('id-ID') + ? formatNumber(purchaseItem.quantity) : '' } readOnly={true} @@ -578,11 +594,25 @@ const PurchaseOrderAcceptApprovalForm = ({ decimalScale={0} thousandSeparator=',' decimalSeparator='.' + bottomLabel={`Total: ${purchaseItems[idx]?.quantity ? formatNumber(purchaseItems[idx].quantity) : 0}`} isError={ - isRepeaterInputError(idx, 'received_qty').isError + isRepeaterInputError(idx, 'received_qty').isError || + (formItem?.received_qty + ? getQuantityExceededError( + idx, + Number(formItem.received_qty) + ) !== null + : false) } errorMessage={ - isRepeaterInputError(idx, 'received_qty').errorMessage + isRepeaterInputError(idx, 'received_qty') + .errorMessage || + (formItem?.received_qty + ? getQuantityExceededError( + idx, + Number(formItem.received_qty) + ) || undefined + : undefined) } className={{ wrapper: 'min-w-40 md:min-w-52 lg:min-w-64', diff --git a/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts b/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts index 98ed5eb0..bfe4ed92 100644 --- a/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts +++ b/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts @@ -120,7 +120,9 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema