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,
} 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',
@@ -120,7 +120,9 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
purchase_item: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable().optional(),
})
.nullable()
.optional(),
purchase_item_id: Yup.number()
.min(1, 'Purchase item is required!')
.required('Purchase item is required!')
@@ -164,7 +166,7 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
.required('Jumlah diterima wajib diisi!')
.test(
'is-valid-received-qty',
'Jumlah diterima harus berupa angka lebih dari 0!',
'Harus berupa angka lebih dari 0!',
function (value) {
if (value === '' || value === null || value === undefined)
return false;