feat(FE-311): Add rejection modals and accept handler

This commit is contained in:
rstubryan
2025-12-10 13:30:40 +07:00
parent 48f228de1c
commit 429f5ffb62
2 changed files with 92 additions and 1 deletions
@@ -27,6 +27,7 @@ import PurchaseOrderInvoice from '@/components/pages/purchase/order/PurchaseOrde
import Card from '@/components/Card'; import Card from '@/components/Card';
import { import {
CreateAcceptApprovalRequestPayload,
CreateManagerApprovalRequestPayload, CreateManagerApprovalRequestPayload,
CreateStaffApprovalRequestPayload, CreateStaffApprovalRequestPayload,
Purchase, Purchase,
@@ -88,6 +89,8 @@ const PurchaseOrderDetail = ({
const staffApprovalModal = useModal(); const staffApprovalModal = useModal();
const staffRejectionModal = useModal(); const staffRejectionModal = useModal();
const acceptApprovalModal = useModal(); const acceptApprovalModal = useModal();
const acceptRejectionModal = useModal();
const managerRejectionModal = useModal();
const editModal = useModal(); const editModal = useModal();
const penerimaanBarangModal = useModal(); const penerimaanBarangModal = useModal();
const deleteModal = useModal(); const deleteModal = useModal();
@@ -216,6 +219,12 @@ const PurchaseOrderDetail = ({
case 1: case 1:
staffRejectionModal.openModal(); staffRejectionModal.openModal();
break; break;
case 2:
managerRejectionModal.openModal();
break;
case 3:
acceptRejectionModal.openModal();
break;
default: default:
break; break;
} }
@@ -296,6 +305,33 @@ const PurchaseOrderDetail = ({
[initialValues?.id, searchParams, refetchData] [initialValues?.id, searchParams, refetchData]
); );
const createAcceptApprovalHandler = useCallback(
async (payload: CreateAcceptApprovalRequestPayload) => {
const purchaseRequestId = searchParams.get('purchaseId')
? parseInt(searchParams.get('purchaseId')!)
: initialValues?.id || 1;
if (!purchaseRequestId) {
toast.error('Purchase Request ID is required');
return;
}
const res = await PurchaseApi.acceptApproval.create(
purchaseRequestId,
payload
);
if (isResponseError(res)) {
toast.error(res.message);
return;
}
toast.success(res?.message as string);
refreshApprovals();
refetchData?.();
},
[initialValues?.id, searchParams, refreshApprovals, refetchData]
);
// ===== MODAL HANDLERS ===== // ===== MODAL HANDLERS =====
const handleStaffApprovalModalClose = useCallback(() => { const handleStaffApprovalModalClose = useCallback(() => {
refreshApprovals(); refreshApprovals();
@@ -1026,6 +1062,61 @@ const PurchaseOrderDetail = ({
}} }}
/> />
{/* Accept Rejection Modal */}
<ConfirmationModalWithNotes
ref={acceptRejectionModal.ref}
type='error'
text='Apakah Anda yakin ingin menolak (reject) penerimaan barang ini?'
placeholder='(Opsional) Masukkan alasan penolakan...'
rows={4}
closeOnBackdrop
primaryButton={{
text: 'Ya, Tolak',
color: 'error',
onClick: async (notes) => {
const payload: CreateAcceptApprovalRequestPayload = {
action: 'REJECTED',
notes: notes || null,
items: [],
};
await createAcceptApprovalHandler(payload);
await refetchData?.();
acceptRejectionModal.closeModal();
},
}}
secondaryButton={{
text: 'Batal',
}}
/>
{/* Manager Rejection Modal */}
<ConfirmationModalWithNotes
ref={managerRejectionModal.ref}
type='error'
text='Apakah Anda yakin ingin menolak (reject) approval manajer untuk permintaan pembelian ini?'
placeholder='(Opsional) Masukkan alasan penolakan...'
rows={4}
closeOnBackdrop
primaryButton={{
text: 'Ya, Tolak',
color: 'error',
onClick: async (notes) => {
const payload: CreateManagerApprovalRequestPayload = {
action: 'REJECTED',
notes: notes || null,
};
await createManagerApprovalHandler(payload);
await refetchData?.();
managerRejectionModal.closeModal();
},
}}
secondaryButton={{
text: 'Batal',
}}
/>
{/* Delete Confirmation Modal */} {/* Delete Confirmation Modal */}
<ConfirmationModal <ConfirmationModal
ref={deleteModal.ref} ref={deleteModal.ref}
+1 -1
View File
@@ -105,7 +105,7 @@ export type CreateManagerApprovalRequestPayload = {
export type CreateAcceptApprovalRequestPayload = { export type CreateAcceptApprovalRequestPayload = {
action: 'APPROVED' | 'REJECTED'; action: 'APPROVED' | 'REJECTED';
notes?: string; notes?: string | null;
items: { items: {
purchase_item_id: number; purchase_item_id: number;
received_date: string; received_date: string;