refactor(FE-208,212): enhance PurchaseOrderStaffApprovalForm for edit functionality and validation checks

This commit is contained in:
rstubryan
2025-11-18 22:32:39 +07:00
parent f4bb87550c
commit f6afb741af
@@ -18,8 +18,10 @@ import { isResponseError } from '@/lib/api-helper';
import { StaffApprovalApi } from '@/services/api/purchase';
import {
CreateStaffApprovalRequestPayload,
UpdateStaffApprovalRequestPayload,
Purchase,
} from '@/types/api/purchase/purchase';
import { router } from 'next/client';
interface PurchaseOrderStaffApprovalFormProps {
type?: 'add' | 'edit';
@@ -37,6 +39,13 @@ const PurchaseOrderStaffApprovalForm = ({
useState('');
// ===== UTILITY FUNCTIONS =====
const canUpdatePurchase = useMemo(() => {
if (!initialValues?.approval) return false;
const currentStep = initialValues.approval.step_number;
return currentStep >= 4;
}, [initialValues?.approval]);
const getPurchaseItemError = (
idx: number,
field: 'price' | 'total_price'
@@ -87,8 +96,8 @@ const PurchaseOrderStaffApprovalForm = ({
);
const updateStaffApprovalHandler = useCallback(
async (purchaseId: number, payload: CreateStaffApprovalRequestPayload) => {
const res = await StaffApprovalApi.createStaffApproval(
async (purchaseId: number, payload: UpdateStaffApprovalRequestPayload) => {
const res = await StaffApprovalApi.updateStaffApproval(
purchaseId,
payload
);
@@ -98,7 +107,7 @@ const PurchaseOrderStaffApprovalForm = ({
}
toast.success(res?.message as string);
onCancel?.();
window.location.href = '/purchase';
await router.push(`/purchase/detail?purchaseId=${purchaseId}`);
},
[]
);
@@ -116,36 +125,60 @@ const PurchaseOrderStaffApprovalForm = ({
validateOnChange: true,
validateOnBlur: true,
onSubmit: async (values) => {
const payload: CreateStaffApprovalRequestPayload = {
notes: values.notes || '',
items: purchaseItems.map((purchaseItem, idx) => {
const formItem = values.items?.[idx];
return {
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
: formItem?.price || 0,
total_price:
typeof formItem?.total_price === 'string'
? parseFloat(formItem.total_price) || 0
: formItem?.total_price || 0,
};
}),
};
if (type === 'edit' && !canUpdatePurchase) {
setPurchaseOrderFormErrorMessage(
'Tidak bisa diupdate. Harus melewati step 4 dahulu (Tahapan Penerimaan Produk).'
);
return;
}
switch (type) {
case 'add':
await createStaffApprovalHandler(payload);
break;
case 'edit':
await updateStaffApprovalHandler(
initialValues?.id as number,
payload
);
break;
if (type === 'add') {
const createPayload: CreateStaffApprovalRequestPayload = {
notes: values.notes || '',
items: purchaseItems.map((purchaseItem, idx) => {
const formItem = values.items?.[idx];
return {
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
: formItem?.price || 0,
total_price:
typeof formItem?.total_price === 'string'
? parseFloat(formItem.total_price) || 0
: formItem?.total_price || 0,
};
}),
};
await createStaffApprovalHandler(createPayload);
} else if (type === 'edit') {
const updatePayload: UpdateStaffApprovalRequestPayload = {
'notes?': values.notes || null,
items: purchaseItems.map((purchaseItem, idx) => {
const formItem = values.items?.[idx];
return {
purchase_item_id:
formItem?.purchase_item_id || purchaseItem.value || 0,
qty: purchaseItem.quantity || 0,
price:
typeof formItem?.price === 'string'
? parseFloat(formItem.price) || 0
: formItem?.price || 0,
total_price:
typeof formItem?.total_price === 'string'
? parseFloat(formItem.total_price) || 0
: formItem?.total_price || 0,
};
}),
};
await updateStaffApprovalHandler(
initialValues?.id as number,
updatePayload
);
}
},
});
@@ -175,17 +208,22 @@ const PurchaseOrderStaffApprovalForm = ({
}, [initialValues?.items]);
useEffect(() => {
if (purchaseItems.length > 0) {
const updatedItems = purchaseItems.map((purchaseItem) => ({
product_id: purchaseItem.product_id || 0,
warehouse_id: purchaseItem.warehouse_id || 0,
qty: purchaseItem.quantity || 0,
price: '',
total_price: '',
}));
if (purchaseItems.length > 0 && initialValues?.items) {
const updatedItems = purchaseItems.map((purchaseItem, idx) => {
const originalItem = initialValues.items?.[idx];
return {
purchase_item_id: type === 'edit' ? purchaseItem.value : undefined,
product_id: purchaseItem.product_id || 0,
warehouse_id: purchaseItem.warehouse_id || 0,
qty: purchaseItem.quantity || 0,
price: type === 'edit' && originalItem ? originalItem.price : '',
total_price:
type === 'edit' && originalItem ? originalItem.total_price : '',
};
});
formik.setFieldValue('items', updatedItems);
}
}, [purchaseItems]);
}, [purchaseItems, type, initialValues]);
// ===== PURCHASE ITEM OPERATIONS =====
const handlePurchaseItemChange = (