Files
lti-web-client/src/components/pages/purchase/form/PurchaseRequestForm.schema.ts
T

110 lines
3.5 KiB
TypeScript

import * as Yup from 'yup';
import { Supplier } from '@/types/api/master-data/supplier';
import { Warehouse } from '@/types/api/master-data/warehouse';
import { CreatePurchaseRequestPayload } from '@/types/api/purchase/purchase';
export const PurchaseRequestFormSchema = Yup.object({
supplier: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable(),
supplier_id: Yup.number()
.default(0)
.typeError('Supplier wajib diisi!')
.test(
'is-valid-supplier',
'Supplier wajib diisi!',
(value) => value !== undefined && value !== null && value > 0
)
.required('Supplier wajib diisi!'),
warehouse: Yup.array()
.of(
Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
})
)
.min(1, 'Minimal harus ada 1 warehouse!')
.required('Warehouse wajib diisi!')
.nullable(),
warehouse_ids: Yup.array()
.of(Yup.number().min(1))
.min(1, 'Minimal harus ada 1 warehouse!')
.required('Warehouse wajib diisi!'),
credit_term: Yup.number()
.required('Termin kredit wajib diisi!')
.min(1, 'Termin kredit tidak boleh negatif!')
.typeError('Termin kredit harus berupa angka!'),
notes: Yup.string().optional().nullable(),
purchase_items: Yup.array()
.of(
Yup.object({
product_id: Yup.number()
.required('Produk wajib diisi!')
.min(1, 'Produk wajib diisi!')
.typeError('Produk harus berupa angka!'),
product_warehouse_id: Yup.number()
.required('Product warehouse wajib diisi!')
.min(1, 'Product warehouse wajib diisi!')
.typeError('Product warehouse harus berupa angka!'),
total_qty: Yup.number()
.required('Jumlah total wajib diisi!')
.min(1, 'Jumlah total tidak boleh negatif!')
.typeError('Jumlah total harus berupa angka!'),
price: Yup.number()
.required('Harga wajib diisi!')
.min(1, 'Harga tidak boleh negatif!')
.typeError('Harga harus berupa angka!'),
})
)
.min(1, 'Minimal harus ada 1 item pembelian!')
.required('Item pembelian wajib diisi!'),
});
export const UpdatePurchaseRequestFormSchema = PurchaseRequestFormSchema;
export type PurchaseRequestFormValues = Yup.InferType<
typeof PurchaseRequestFormSchema
>;
type PurchaseRequestFormData = Partial<CreatePurchaseRequestPayload> & {
supplier?: Supplier;
warehouse?: Warehouse[];
purchase_items?: CreatePurchaseRequestPayload['purchase_items'];
};
export const getPurchaseRequestFormInitialValues = (
initialValues?: PurchaseRequestFormData
): PurchaseRequestFormValues => ({
supplier: initialValues?.supplier
? {
value: initialValues.supplier.id,
label: initialValues.supplier.name,
}
: null,
supplier_id: initialValues?.supplier_id ?? 0,
warehouse:
initialValues?.warehouse?.map((warehouse) => ({
value: warehouse.id,
label: warehouse.name,
})) ?? [],
warehouse_ids: initialValues?.warehouse_ids ?? [],
credit_term: initialValues?.credit_term ?? 0,
notes: initialValues?.notes ?? '',
purchase_items: initialValues?.purchase_items?.map(
(item: NonNullable<CreatePurchaseRequestPayload['purchase_items']>[0]) => ({
product_id: item.product_id,
product_warehouse_id: item.product_warehouse_id,
total_qty: item.total_qty,
price: item.price,
})
) ?? [
{
product_id: 0,
product_warehouse_id: 0,
total_qty: 0,
price: 0,
},
],
});