feat(FE-62,65): add biaya_ekspedisi_per_item field and calculation in MovementForm

This commit is contained in:
rstubryan
2025-10-11 08:33:48 +07:00
parent 757893c757
commit 478f52c94b
3 changed files with 52 additions and 2 deletions
@@ -26,10 +26,10 @@ export type EkspedisiSchema = {
no_surat_jalan: string; no_surat_jalan: string;
dokumen: string | File; dokumen: string | File;
biaya_ekspedisi: number; biaya_ekspedisi: number;
biaya_ekspedisi_per_item?: number | undefined;
nama_sopir: string; nama_sopir: string;
}; };
// Define schemas for nested objects
const ProductObjectSchema: Yup.ObjectSchema<ProductSchema> = Yup.object({ const ProductObjectSchema: Yup.ObjectSchema<ProductSchema> = Yup.object({
product: Yup.object({ product: Yup.object({
value: Yup.number().min(1).required(), value: Yup.number().min(1).required(),
@@ -64,6 +64,12 @@ const EkspedisiObjectSchema: Yup.ObjectSchema<EkspedisiSchema> = Yup.object({
.required('Biaya ekspedisi wajib diisi!') .required('Biaya ekspedisi wajib diisi!')
.min(0, 'Biaya minimal 0!') .min(0, 'Biaya minimal 0!')
.typeError('Biaya harus berupa angka!'), .typeError('Biaya harus berupa angka!'),
biaya_ekspedisi_per_item: Yup.number()
.transform((value) => (isNaN(value) ? undefined : value))
.min(0, 'Biaya per item minimal 0!')
.typeError('Biaya per item harus berupa angka!')
.optional()
.default(undefined),
nama_sopir: Yup.string().required('Nama sopir wajib diisi!'), nama_sopir: Yup.string().required('Nama sopir wajib diisi!'),
}); });
@@ -130,6 +136,7 @@ export const getMovementFormInitialValues = (
no_surat_jalan: e.no_surat_jalan, no_surat_jalan: e.no_surat_jalan,
dokumen: e.dokumen, dokumen: e.dokumen,
biaya_ekspedisi: e.biaya_ekspedisi, biaya_ekspedisi: e.biaya_ekspedisi,
biaya_ekspedisi_per_item: e.biaya_ekspedisi,
nama_sopir: e.nama_sopir, nama_sopir: e.nama_sopir,
})) ?? [], })) ?? [],
}); });
@@ -81,6 +81,9 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
dokumen: dokumen:
e.dokumen instanceof File ? e.dokumen : (e.dokumen as string), e.dokumen instanceof File ? e.dokumen : (e.dokumen as string),
biaya_ekspedisi: e.biaya_ekspedisi, biaya_ekspedisi: e.biaya_ekspedisi,
biaya_ekspedisi_per_item: e.qty
? e.biaya_ekspedisi / e.qty
: e.biaya_ekspedisi,
nama_sopir: e.nama_sopir, nama_sopir: e.nama_sopir,
})), })),
}; };
@@ -145,6 +148,7 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
no_surat_jalan: '', no_surat_jalan: '',
dokumen: '', dokumen: '',
biaya_ekspedisi: 0, biaya_ekspedisi: 0,
biaya_ekspedisi_per_item: 0,
nama_sopir: '', nama_sopir: '',
}, },
]; ];
@@ -252,6 +256,18 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
formikSetValues(formikInitialValues); formikSetValues(formikInitialValues);
}, [formikSetValues, formikInitialValues]); }, [formikSetValues, formikInitialValues]);
useEffect(() => {
formik.values.ekspedisi?.forEach((eks, idx) => {
if (eks.qty && eks.biaya_ekspedisi) {
const perItem = eks.biaya_ekspedisi / eks.qty;
formik.setFieldValue(
`ekspedisi.${idx}.biaya_ekspedisi_per_item`,
perItem
);
}
});
}, [formik.values.ekspedisi]);
const getFilteredProductOptions = useCallback(() => { const getFilteredProductOptions = useCallback(() => {
return ( return (
formik.values.product formik.values.product
@@ -646,7 +662,8 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
<th>Plat Nomor</th> <th>Plat Nomor</th>
<th>No Surat Jalan</th> <th>No Surat Jalan</th>
<th>Dokumen</th> <th>Dokumen</th>
<th>Biaya Ekspedisi</th> <th>Biaya Ekspedisi (Rp.)</th>
<th>Biaya Ekspedisi / Item (Rp.)</th>
<th>Nama Sopir</th> <th>Nama Sopir</th>
{type !== 'detail' && <th>Aksi</th>} {type !== 'detail' && <th>Aksi</th>}
</tr> </tr>
@@ -836,6 +853,31 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
}} }}
/> />
</td> </td>
<td>
<TextInput
disabled
onChange={formik.handleChange}
onBlur={formik.handleBlur}
isError={isRepeaterInputError(
'ekspedisi',
'biaya_ekspedisi_per_item',
idx
)}
name={`ekspedisi.${idx}.biaya_ekspedisi_per_item`}
value={
ekspedisi.qty && ekspedisi.biaya_ekspedisi
? (
ekspedisi.biaya_ekspedisi / ekspedisi.qty
).toLocaleString('id-ID')
: '0'
}
readOnly
className={{
wrapper: 'w-full min-w-24',
input: 'bg-base-200',
}}
/>
</td>
<td> <td>
<TextInput <TextInput
required required
+1
View File
@@ -44,6 +44,7 @@ export type CreateMovementPayload = {
no_surat_jalan: string; no_surat_jalan: string;
dokumen: string | File; dokumen: string | File;
biaya_ekspedisi: number; biaya_ekspedisi: number;
biaya_ekspedisi_per_item?: number;
nama_sopir: string; nama_sopir: string;
}[]; }[];
}; };