refactor(FE-208,212): update PurchaseRequestForm schema and validation, improve credit term handling and reset logic for supplier changes

This commit is contained in:
rstubryan
2025-11-03 15:19:19 +07:00
parent e1d070b3af
commit ecdd8ae49c
2 changed files with 22 additions and 18 deletions
@@ -17,7 +17,7 @@ type PurchaseRequestFormSchemaType = {
label: string; label: string;
} | null; } | null;
location_id: number; location_id: number;
credit_term: number | string | null; credit_term: number | string | undefined;
notes: string | null; notes: string | null;
purchase_items: { purchase_items: {
warehouse?: { warehouse?: {
@@ -85,7 +85,7 @@ const PurchaseItemObjectSchema: Yup.ObjectSchema<PurchaseItemSchema> =
.min(1, 'Produk wajib dipilih!') .min(1, 'Produk wajib dipilih!')
.typeError('Produk wajib dipilih!'), .typeError('Produk wajib dipilih!'),
sub_qty: Yup.mixed<string | number>() sub_qty: Yup.mixed<string | number>()
.required('Sub Qty wajib diisi!') .required('Kuantitas wajib diisi!')
.test( .test(
'is-valid-sub-qty', 'is-valid-sub-qty',
'Kuantitas harus berupa angka lebih dari 0!', 'Kuantitas harus berupa angka lebih dari 0!',
@@ -134,21 +134,18 @@ export const PurchaseRequestFormSchema: Yup.ObjectSchema<PurchaseRequestFormSche
return Boolean(value && value > 0); return Boolean(value && value > 0);
}) })
.typeError('Lokasi wajib dipilih!'), .typeError('Lokasi wajib dipilih!'),
credit_term: Yup.lazy((value, context) => { credit_term: Yup.mixed<string | number>().when('supplier_id', {
const supplier_id = context.parent.supplier_id; is: (supplier_id: number) => supplier_id && supplier_id > 0,
const hasSupplier = supplier_id && supplier_id > 0; then: () =>
Yup.number()
if (!hasSupplier) { .required('Jumlah hari jatuh tempo wajib diisi!')
return Yup.mixed<string | number>() .min(1, 'Jumlah hari jatuh tempo minimal 1 hari!')
.typeError('Jumlah hari jatuh tempo harus berupa angka!'),
otherwise: () =>
Yup.mixed<string | number>()
.nullable() .nullable()
.default(null) .default(null)
.transform(() => null); .transform(() => null),
}
return Yup.number()
.required('Jumlah hari jatuh tempo wajib diisi!')
.min(1, 'Jumlah hari jatuh tempo minimal 1 hari!')
.typeError('Jumlah hari jatuh tempo harus berupa angka!');
}), }),
notes: Yup.string().nullable().default(null), notes: Yup.string().nullable().default(null),
purchase_items: Yup.array() purchase_items: Yup.array()
@@ -85,7 +85,7 @@ const PurchaseRequestForm = ({
| Record<string, string> | Record<string, string>
| undefined; | undefined;
if (!touchedItem || !errorItem) { if (!touchedItem) {
return { isError: false, errorMessage: '' }; return { isError: false, errorMessage: '' };
} }
@@ -377,6 +377,8 @@ const PurchaseRequestForm = ({
formik.setFieldValue('credit_term', supplierData.due_date.toString()); formik.setFieldValue('credit_term', supplierData.due_date.toString());
} }
} else { } else {
// Reset credit_term field and its touched state when supplier is cleared
formik.setFieldTouched('credit_term', false);
formik.setFieldValue('credit_term', ''); formik.setFieldValue('credit_term', '');
} }
}; };
@@ -787,7 +789,7 @@ const PurchaseRequestForm = ({
/> />
</td> </td>
<td> <td>
<TextInput <NumberInput
required required
name={`purchase_items.${idx}.sub_qty`} name={`purchase_items.${idx}.sub_qty`}
value={item.sub_qty || ''} value={item.sub_qty || ''}
@@ -799,9 +801,14 @@ const PurchaseRequestForm = ({
) )
} }
onBlur={formik.handleBlur} onBlur={formik.handleBlur}
type='number'
placeholder='Masukkan kuantitas' placeholder='Masukkan kuantitas'
readOnly={type === 'detail'} readOnly={type === 'detail'}
allowNegative={false}
decimalScale={0}
isError={getPurchaseItemError(idx, 'sub_qty').isError}
errorMessage={
getPurchaseItemError(idx, 'sub_qty').errorMessage
}
className={{ className={{
wrapper: 'min-w-24', wrapper: 'min-w-24',
}} }}