refactor(FE): Make vehicle/expedition/transport fields optional

This commit is contained in:
rstubryan
2026-01-15 19:29:03 +07:00
parent 87bf474cf6
commit 228e79bb31
3 changed files with 40 additions and 44 deletions
@@ -185,8 +185,8 @@ const PurchaseOrderAcceptApprovalForm = ({
purchase_item_id: formItem.purchase_item_id || 0, purchase_item_id: formItem.purchase_item_id || 0,
received_date: formItem.received_date || '', received_date: formItem.received_date || '',
travel_number: formItem.travel_number || '', travel_number: formItem.travel_number || '',
vehicle_number: formItem.vehicle_number || '', vehicle_number: formItem.vehicle_number || null,
expedition_vendor_id: formItem.expedition_vendor_id || 0, expedition_vendor_id: formItem.expedition_vendor_id || null,
received_qty: received_qty:
typeof formItem.received_qty === 'string' typeof formItem.received_qty === 'string'
? parseFloat(formItem.received_qty) || 0 ? parseFloat(formItem.received_qty) || 0
@@ -194,10 +194,13 @@ const PurchaseOrderAcceptApprovalForm = ({
transport_per_item: transport_per_item:
typeof formItem.transport_per_item === 'string' typeof formItem.transport_per_item === 'string'
? parseFloat(formItem.transport_per_item) || 0 ? parseFloat(formItem.transport_per_item) || 0
: formItem.transport_per_item || 0, : formItem.transport_per_item || null,
}; };
}) || [], }) || [],
travel_documents: values.travel_documents || [], travel_documents:
values.travel_documents
?.filter((file): file is File => file instanceof File)
.filter(Boolean) || undefined,
}; };
switch (type) { switch (type) {
@@ -405,22 +408,13 @@ const PurchaseOrderAcceptApprovalForm = ({
Dokumen Surat Jalan Dokumen Surat Jalan
<span className='text-error'>*</span> <span className='text-error'>*</span>
</th> </th>
<th> <th>Nomor Kendaraan</th>
Nomor Kendaraan <th>Vendor Ekspedisi</th>
<span className='text-error'>*</span>
</th>
<th>
Vendor Ekspedisi
<span className='text-error'>*</span>
</th>
<th> <th>
Jumlah Diterima Jumlah Diterima
<span className='text-error'>*</span> <span className='text-error'>*</span>
</th> </th>
<th> <th>Transport/Item</th>
Transport/Item
<span className='text-error'>*</span>
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -538,7 +532,6 @@ const PurchaseOrderAcceptApprovalForm = ({
</td> </td>
<td> <td>
<TextInput <TextInput
required
name={`items.${idx}.vehicle_number`} name={`items.${idx}.vehicle_number`}
type='text' type='text'
value={formItem?.vehicle_number || ''} value={formItem?.vehicle_number || ''}
@@ -564,7 +557,6 @@ const PurchaseOrderAcceptApprovalForm = ({
</td> </td>
<td> <td>
<SelectInput <SelectInput
required
isClearable={true} isClearable={true}
value={formItem?.expedition_vendor} value={formItem?.expedition_vendor}
key={`expedition-vendor-${idx}`} key={`expedition-vendor-${idx}`}
@@ -633,7 +625,6 @@ const PurchaseOrderAcceptApprovalForm = ({
</td> </td>
<td> <td>
<NumberInput <NumberInput
required
name={`items.${idx}.transport_per_item`} name={`items.${idx}.transport_per_item`}
value={formItem?.transport_per_item || ''} value={formItem?.transport_per_item || ''}
onChange={(e) => onChange={(e) =>
@@ -684,7 +675,6 @@ const PurchaseOrderAcceptApprovalForm = ({
<div className={'col-span-2 my-2'}> <div className={'col-span-2 my-2'}>
<FileInput <FileInput
required
name='travel_documents' name='travel_documents'
label='Dokumen Surat Jalan' label='Dokumen Surat Jalan'
accept='.pdf,.jpg,.jpeg,.png' accept='.pdf,.jpg,.jpeg,.png'
@@ -38,16 +38,16 @@ type PurchaseRequestAcceptApprovalFormSchemaType = {
purchase_item_id: number; purchase_item_id: number;
received_date: string; received_date: string;
travel_number: string; travel_number: string;
vehicle_number: string; vehicle_number?: string | null;
expedition_vendor?: { expedition_vendor?: {
value: number; value: number;
label: string; label: string;
} | null; } | null;
expedition_vendor_id: number; expedition_vendor_id?: number | null;
received_qty: number | string; received_qty: number | string;
transport_per_item: number | string; transport_per_item?: number | string | null;
}[]; }[];
travel_documents: File[]; travel_documents?: (File | null | undefined)[] | null;
}; };
export type PurchaseStaffApprovalItemSchema = { export type PurchaseStaffApprovalItemSchema = {
@@ -75,14 +75,14 @@ export type PurchaseAcceptApprovalItemSchema = {
purchase_item_id: number; purchase_item_id: number;
received_date: string; received_date: string;
travel_number: string; travel_number: string;
vehicle_number: string; vehicle_number?: string | null;
expedition_vendor?: { expedition_vendor?: {
value: number; value: number;
label: string; label: string;
} | null; } | null;
expedition_vendor_id: number; expedition_vendor_id?: number | null;
received_qty: number | string; received_qty: number | string;
transport_per_item: number | string; transport_per_item?: number | string | null;
}; };
export type PurchaseDeleteItemsSchema = { export type PurchaseDeleteItemsSchema = {
@@ -184,15 +184,20 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
.required('No. Surat jalan wajib diisi!') .required('No. Surat jalan wajib diisi!')
.typeError('No. Surat jalan wajib diisi!'), .typeError('No. Surat jalan wajib diisi!'),
vehicle_number: Yup.string() vehicle_number: Yup.string()
.required('Nomor kendaraan wajib diisi!') .nullable()
.typeError('Nomor kendaraan wajib diisi!'), .optional()
.typeError('Nomor kendaraan harus berupa string!'),
expedition_vendor: Yup.object({ expedition_vendor: Yup.object({
value: Yup.number().min(1).required(), value: Yup.number().min(1).required(),
label: Yup.string().required(), label: Yup.string().required(),
}).nullable(), })
.nullable()
.optional(),
expedition_vendor_id: Yup.number() expedition_vendor_id: Yup.number()
.min(1, 'Vendor ekspedisi wajib diisi!') .nullable()
.required('Vendor ekspedisi wajib diisi!') .optional()
.min(1, 'Vendor ekspedisi tidak valid!')
.typeError('Vendor ekspedisi harus berupa angka!')
.test( .test(
'is-valid-expedition-vendor', 'is-valid-expedition-vendor',
'Vendor ekspedisi harus dipilih!', 'Vendor ekspedisi harus dipilih!',
@@ -200,8 +205,7 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
if (!this.parent.expedition_vendor) return true; if (!this.parent.expedition_vendor) return true;
return Boolean(value && value > 0); return Boolean(value && value > 0);
} }
) ),
.typeError('Vendor ekspedisi harus dipilih!'),
received_qty: Yup.mixed<string | number>() received_qty: Yup.mixed<string | number>()
.required('Jumlah diterima wajib diisi!') .required('Jumlah diterima wajib diisi!')
.test( .test(
@@ -217,13 +221,14 @@ const PurchaseAcceptApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseAcceptApp
) )
.typeError('Jumlah diterima harus berupa angka!'), .typeError('Jumlah diterima harus berupa angka!'),
transport_per_item: Yup.mixed<string | number>() transport_per_item: Yup.mixed<string | number>()
.required('Biaya transport per item wajib diisi!') .nullable()
.optional()
.test( .test(
'is-valid-transport-per-item', 'is-valid-transport-per-item',
'Biaya transport per item harus berupa angka lebih dari atau sama dengan 0!', 'Biaya transport per item harus berupa angka lebih dari atau sama dengan 0!',
function (value) { function (value) {
if (value === '' || value === null || value === undefined) if (value === '' || value === null || value === undefined)
return false; return true;
const numValue = const numValue =
typeof value === 'string' ? parseFloat(value) : value; typeof value === 'string' ? parseFloat(value) : value;
return !isNaN(numValue) && numValue >= 0; return !isNaN(numValue) && numValue >= 0;
@@ -389,16 +394,17 @@ export const PurchaseRequestAcceptApprovalFormSchema: Yup.ObjectSchema<PurchaseR
travel_documents: Yup.array() travel_documents: Yup.array()
.of( .of(
Yup.mixed<File>() Yup.mixed<File>()
.required('Dokumen surat jalan wajib diupload!') .nullable()
.optional()
.test('fileSize', 'Ukuran dokumen maksimal 5 MB', (value) => { .test('fileSize', 'Ukuran dokumen maksimal 5 MB', (value) => {
if (!value) return true; if (!value) return true;
if (value instanceof File) return value.size <= 5 * 1024 * 1024; if (value instanceof File) return value.size <= 5 * 1024 * 1024;
return true; return true;
}) })
) )
.required('Dokumen surat jalan wajib diupload!') .nullable()
.min(1, 'Minimal upload 1 dokumen surat jalan!') .optional()
.typeError('Dokumen surat jalan wajib diupload!'), .typeError('Dokumen surat jalan harus berupa array!'),
}); });
export const PurchaseRequestAcceptApprovalFormInitialValues: PurchaseRequestAcceptApprovalFormSchemaType = export const PurchaseRequestAcceptApprovalFormInitialValues: PurchaseRequestAcceptApprovalFormSchemaType =
+4 -4
View File
@@ -120,12 +120,12 @@ export type CreateAcceptApprovalRequestPayload = {
purchase_item_id: number; purchase_item_id: number;
received_date: string; received_date: string;
travel_number: string; travel_number: string;
vehicle_number: string; vehicle_number?: string | null;
expedition_vendor_id: number; expedition_vendor_id?: number | null;
received_qty: number; received_qty: number;
transport_per_item: number; transport_per_item?: number | null;
}[]; }[];
travel_documents?: File[]; travel_documents?: File[] | null;
}; };
export type DeletePurchaseRequestItemPayload = { export type DeletePurchaseRequestItemPayload = {