refactor(FE-208,212): enhance quantity validation and formatting in PurchaseOrderAcceptApprovalForm

This commit is contained in:
rstubryan
2025-11-20 23:50:14 +07:00
parent c1d71ee3c6
commit 51f157dfad
2 changed files with 38 additions and 6 deletions
@@ -22,6 +22,7 @@ import {
Purchase, Purchase,
} from '@/types/api/purchase/purchase'; } from '@/types/api/purchase/purchase';
import DateInput from '@/components/input/DateInput'; import DateInput from '@/components/input/DateInput';
import { formatNumber } from '@/lib/helper';
interface PurchaseOrderAcceptApprovalFormProps { interface PurchaseOrderAcceptApprovalFormProps {
type?: 'add' | 'edit'; type?: 'add' | 'edit';
@@ -218,7 +219,7 @@ const PurchaseOrderAcceptApprovalForm = ({
vehicle_number: item.vehicle_number || '', vehicle_number: item.vehicle_number || '',
expedition_vendor: null, expedition_vendor: null,
expedition_vendor_id: 0, expedition_vendor_id: 0,
received_qty: item.sub_qty ? item.sub_qty.toString() : '', received_qty: '',
transport_per_item: '', transport_per_item: '',
transport_total: '', transport_total: '',
}; };
@@ -227,6 +228,21 @@ const PurchaseOrderAcceptApprovalForm = ({
} }
}, [purchaseItems, initialValues]); }, [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(() => { const expeditionVendors: ExpeditionVendorOptionType[] = useMemo(() => {
return [ return [
{ {
@@ -410,7 +426,7 @@ const PurchaseOrderAcceptApprovalForm = ({
type='text' type='text'
value={ value={
purchaseItem?.quantity purchaseItem?.quantity
? purchaseItem.quantity.toLocaleString('id-ID') ? formatNumber(purchaseItem.quantity)
: '' : ''
} }
readOnly={true} readOnly={true}
@@ -578,11 +594,25 @@ const PurchaseOrderAcceptApprovalForm = ({
decimalScale={0} decimalScale={0}
thousandSeparator=',' thousandSeparator=','
decimalSeparator='.' decimalSeparator='.'
bottomLabel={`Total: ${purchaseItems[idx]?.quantity ? formatNumber(purchaseItems[idx].quantity) : 0}`}
isError={ isError={
isRepeaterInputError(idx, 'received_qty').isError isRepeaterInputError(idx, 'received_qty').isError ||
(formItem?.received_qty
? getQuantityExceededError(
idx,
Number(formItem.received_qty)
) !== null
: false)
} }
errorMessage={ errorMessage={
isRepeaterInputError(idx, 'received_qty').errorMessage isRepeaterInputError(idx, 'received_qty')
.errorMessage ||
(formItem?.received_qty
? getQuantityExceededError(
idx,
Number(formItem.received_qty)
) || undefined
: undefined)
} }
className={{ className={{
wrapper: 'min-w-40 md:min-w-52 lg:min-w-64', wrapper: 'min-w-40 md:min-w-52 lg:min-w-64',
@@ -120,7 +120,9 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
purchase_item: Yup.object({ purchase_item: Yup.object({
value: Yup.number().min(1).required(), value: Yup.number().min(1).required(),
label: Yup.string().required(), label: Yup.string().required(),
}).nullable().optional(), })
.nullable()
.optional(),
purchase_item_id: Yup.number() purchase_item_id: Yup.number()
.min(1, 'Purchase item is required!') .min(1, 'Purchase item is required!')
.required('Purchase item is required!') .required('Purchase item is required!')
@@ -164,7 +166,7 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
.required('Jumlah diterima wajib diisi!') .required('Jumlah diterima wajib diisi!')
.test( .test(
'is-valid-received-qty', 'is-valid-received-qty',
'Jumlah diterima harus berupa angka lebih dari 0!', 'Harus berupa angka lebih dari 0!',
function (value) { function (value) {
if (value === '' || value === null || value === undefined) if (value === '' || value === null || value === undefined)
return false; return false;