From b2ef545f63a82ae10316cfd8a25eccd221f2f1c6 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Thu, 20 Nov 2025 23:21:12 +0700 Subject: [PATCH] refactor(FE-208,212,213): replace product_id and warehouse_id with purchase_item_id in PurchaseRequestStaffApprovalForm and related schemas --- .../form/order/PurchaseOrderForm.schema.ts | 27 +++----- .../order/PurchaseOrderStaffApprovalForm.tsx | 62 +++++++------------ src/types/api/purchase/purchase.d.ts | 3 +- 3 files changed, 33 insertions(+), 59 deletions(-) diff --git a/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts b/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts index 7dbc6c1b..98ed5eb0 100644 --- a/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts +++ b/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts @@ -2,11 +2,10 @@ import * as Yup from 'yup'; import { Purchase } from '@/types/api/purchase/purchase'; type PurchaseRequestStaffApprovalFormSchemaType = { + action: 'APPROVED' | 'REJECTED'; notes: string | null; items: { purchase_item_id?: number; - product_id: number; - warehouse_id: number; qty: number; price: number | string; total_price: number | string; @@ -42,8 +41,6 @@ type PurchaseRequestAcceptApprovalFormSchemaType = { export type PurchaseStaffApprovalItemSchema = { purchase_item_id?: number; - product_id: number; - warehouse_id: number; qty: number; price: number | string; total_price: number | string; @@ -79,14 +76,6 @@ const PurchaseStaffApprovalItemObjectSchema: Yup.ObjectSchema = Yup.object({ + action: Yup.mixed<'APPROVED' | 'REJECTED'>() + .oneOf(['APPROVED', 'REJECTED'], 'Action harus APPROVED atau REJECTED') + .required('Action wajib diisi!') + .default('APPROVED'), notes: Yup.string().nullable().default(null), items: Yup.array() .of(PurchaseStaffApprovalItemObjectSchema) @@ -241,11 +234,11 @@ export const PurchaseDeleteItemsSchema: Yup.ObjectSchema { return { + action: 'APPROVED', notes: purchase?.notes ?? null, items: purchase?.items ? purchase.items.map((item) => ({ purchase_item_id: item.id, - product_id: item.product_id, - warehouse_id: item.warehouse.id, qty: item.qty, price: item.price, total_price: item.total_price, })) : [ { - product_id: 0, - warehouse_id: 0, + purchase_item_id: 0, qty: 0, price: '', total_price: '', diff --git a/src/components/pages/purchase/form/order/PurchaseOrderStaffApprovalForm.tsx b/src/components/pages/purchase/form/order/PurchaseOrderStaffApprovalForm.tsx index 50c5b584..a17b445f 100644 --- a/src/components/pages/purchase/form/order/PurchaseOrderStaffApprovalForm.tsx +++ b/src/components/pages/purchase/form/order/PurchaseOrderStaffApprovalForm.tsx @@ -139,49 +139,33 @@ const PurchaseOrderStaffApprovalForm = ({ return; } - if (type === 'add') { - const createPayload: CreateStaffApprovalRequestPayload = { - action: 'APPROVED', - 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, - }; - }), - }; + const payload: CreateStaffApprovalRequestPayload = { + action: values.action || 'APPROVED', + notes: values.notes || '', + items: purchaseItems.map((purchaseItem, idx) => { + const formItem = values.items?.[idx]; + return { + purchase_item_id: purchaseItem.id, + 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); + if (type === 'add') { + await createStaffApprovalHandler(payload); } else if (type === 'edit') { const updatePayload: UpdateStaffApprovalRequestPayload = { - action: 'APPROVED', + action: values.action || 'APPROVED', 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, - }; - }), + items: payload.items, }; await updateStaffApprovalHandler( diff --git a/src/types/api/purchase/purchase.d.ts b/src/types/api/purchase/purchase.d.ts index 866ebf76..cb944ca0 100644 --- a/src/types/api/purchase/purchase.d.ts +++ b/src/types/api/purchase/purchase.d.ts @@ -82,8 +82,7 @@ export type CreateStaffApprovalRequestPayload = { action: 'APPROVED' | 'REJECTED'; notes?: string | null; items: { - product_id: number; - warehouse_id: number; + purchase_item_id: number; qty: number; price: number; total_price: number;