mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 13:32:00 +00:00
feat(FE-62,65): add biaya_ekspedisi_per_item field and calculation in MovementForm
This commit is contained in:
@@ -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
@@ -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;
|
||||||
}[];
|
}[];
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user