refactor(FE-208,213): simplify PurchaseOrderForm and PurchaseOrderStaffApprovalForm by removing unused product and warehouse fields and enhancing price validation

This commit is contained in:
rstubryan
2025-11-18 22:13:14 +07:00
parent 0c79e86736
commit 3d468d9507
2 changed files with 35 additions and 59 deletions
@@ -4,15 +4,7 @@ import { Purchase } from '@/types/api/purchase/purchase';
type PurchaseRequestStaffApprovalFormSchemaType = {
notes: string | null;
items: {
product?: {
value: number;
label: string;
} | null;
product_id: number;
warehouse?: {
value: number;
label: string;
} | null;
warehouse_id: number;
qty: number;
price: number | string;
@@ -53,15 +45,7 @@ type PurchaseRequestAcceptApprovalFormSchemaType = {
};
export type PurchaseStaffApprovalItemSchema = {
product?: {
value: number;
label: string;
} | null;
product_id: number;
warehouse?: {
value: number;
label: string;
} | null;
warehouse_id: number;
qty: number;
price: number | string;
@@ -99,18 +83,10 @@ export type PurchaseDeleteItemsSchema = {
const PurchaseStaffApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseStaffApprovalItemSchema> =
Yup.object({
product: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable(),
product_id: Yup.number()
.required('Produk wajib diisi!')
.min(1, 'Produk wajib diisi!')
.typeError('Produk wajib diisi!'),
warehouse: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable(),
warehouse_id: Yup.number()
.required('Gudang wajib diisi!')
.min(1, 'Gudang wajib diisi!')
@@ -119,16 +95,34 @@ const PurchaseStaffApprovalItemObjectSchema: Yup.ObjectSchema<PurchaseStaffAppro
.required('Jumlah wajib diisi!')
.min(1, 'Jumlah harus berupa angka lebih dari 0!')
.typeError('Jumlah harus berupa angka lebih dari 0!'),
price: Yup.number()
price: Yup.mixed<number | string>()
.required('Harga wajib diisi!')
.min(0, 'Harga harus berupa angka lebih dari atau sama dengan 0!')
.typeError('Harga harus berupa angka lebih dari atau sama dengan 0!'),
total_price: Yup.number()
.test(
'is-valid-price',
'Harga harus berupa angka lebih dari atau sama dengan 0!',
function (value) {
if (value === '' || value === null || value === undefined)
return false;
const numValue =
typeof value === 'string' ? parseFloat(value) : value;
return !isNaN(numValue) && numValue >= 0;
}
)
.typeError('Harga harus berupa angka!'),
total_price: Yup.mixed<number | string>()
.required('Total harga wajib diisi!')
.min(0, 'Total harga harus berupa angka lebih dari atau sama dengan 0!')
.typeError(
'Total harga harus berupa angka lebih dari atau sama dengan 0!'
),
.test(
'is-valid-total-price',
'Total harga harus berupa angka lebih dari atau sama dengan 0!',
function (value) {
if (value === '' || value === null || value === undefined)
return false;
const numValue =
typeof value === 'string' ? parseFloat(value) : value;
return !isNaN(numValue) && numValue >= 0;
}
)
.typeError('Total harga harus berupa angka!'),
});
const PurchaseManagerApprovalObjectSchema: Yup.ObjectSchema<PurchaseRequestManagerApprovalFormSchemaType> =
@@ -271,9 +265,7 @@ export const PurchaseRequestStaffApprovalFormInitialValues: PurchaseRequestStaff
notes: '',
items: [
{
product: null,
product_id: 0,
warehouse: null,
warehouse_id: 0,
qty: 0,
price: '',
@@ -289,9 +281,7 @@ export const PurchaseRequestStaffApprovalFormDefaultValues = (
notes: purchase?.notes ?? null,
items: purchase?.items
? purchase.items.map((item) => ({
product: null,
product_id: item.product_id,
warehouse: null,
warehouse_id: item.warehouse.id,
qty: item.qty,
price: item.price,
@@ -299,9 +289,7 @@ export const PurchaseRequestStaffApprovalFormDefaultValues = (
}))
: [
{
product: null,
product_id: 0,
warehouse: null,
warehouse_id: 0,
qty: 0,
price: '',
@@ -8,7 +8,6 @@ import { useSearchParams } from 'next/navigation';
import Button from '@/components/Button';
import TextInput from '@/components/input/TextInput';
import NumberInput from '@/components/input/NumberInput';
import { OptionType } from '@/components/input/SelectInput';
import {
PurchaseRequestStaffApprovalFormDefaultValues,
@@ -37,22 +36,6 @@ const PurchaseOrderStaffApprovalForm = ({
const [purchaseOrderFormErrorMessage, setPurchaseOrderFormErrorMessage] =
useState('');
// ===== TYPE DEFINITIONS =====
interface PurchaseItemOptionType extends OptionType {
id: number;
quantity: number;
product: {
name: string;
type?: string;
uom?: {
name: string;
};
};
warehouse: {
name: string;
};
}
// ===== UTILITY FUNCTIONS =====
const getPurchaseItemError = (
idx: number,
@@ -138,7 +121,9 @@ const PurchaseOrderStaffApprovalForm = ({
items: purchaseItems.map((purchaseItem, idx) => {
const formItem = values.items?.[idx];
return {
purchase_item_id: purchaseItem.value,
product_id: purchaseItem.product_id || 0,
warehouse_id: purchaseItem.warehouse_id || 0,
qty: purchaseItem.quantity || 0,
price:
typeof formItem?.price === 'string'
? parseFloat(formItem.price) || 0
@@ -170,9 +155,11 @@ const PurchaseOrderStaffApprovalForm = ({
if (initialValues?.items) {
return initialValues.items.map((item) => ({
value: item.id,
label: `${item.product.name} ${item.sub_qty}`,
label: item.product.name,
id: item.id,
quantity: item.sub_qty,
product_id: item.product_id,
warehouse_id: item.warehouse.id,
product: {
name: item.product.name,
product_category: item.product.product_category,
@@ -187,11 +174,12 @@ const PurchaseOrderStaffApprovalForm = ({
return [];
}, [initialValues?.items]);
// Ensure form values are properly set when purchaseItems change
useEffect(() => {
if (purchaseItems.length > 0) {
const updatedItems = purchaseItems.map((purchaseItem) => ({
purchase_item_id: purchaseItem.value,
product_id: purchaseItem.product_id || 0,
warehouse_id: purchaseItem.warehouse_id || 0,
qty: purchaseItem.quantity || 0,
price: '',
total_price: '',
}));