diff --git a/src/backend/src/services/reimbursement-requests.services.ts b/src/backend/src/services/reimbursement-requests.services.ts index a5c383883b..8e5486527a 100644 --- a/src/backend/src/services/reimbursement-requests.services.ts +++ b/src/backend/src/services/reimbursement-requests.services.ts @@ -699,13 +699,19 @@ export default class ReimbursementRequestService { if (reimbursementRequest.organizationId !== organization.organizationId) throw new InvalidOrganizationException('Reimbursement Request'); + const existingWithSaboNumber = await prisma.reimbursement_Request.findFirst({ + where: { saboId: saboNumber, organizationId: organization.organizationId } + }); + if (existingWithSaboNumber) { + throw new HttpException(400, 'This SABO number is already assigned to another reimbursement request.'); + } + const reimbursementRequestWithSaboNumber = await prisma.reimbursement_Request.update({ where: { reimbursementRequestId }, data: { saboId: saboNumber } }); - return reimbursementRequestWithSaboNumber; } diff --git a/src/backend/tests/unit/reimbursement-requests.test.ts b/src/backend/tests/unit/reimbursement-requests.test.ts index 0717511bc0..b1d21a0bc4 100644 --- a/src/backend/tests/unit/reimbursement-requests.test.ts +++ b/src/backend/tests/unit/reimbursement-requests.test.ts @@ -785,4 +785,28 @@ describe('Reimbursement Requests', () => { ).rejects.toThrow(new NotFoundException('Reimbursement Product Other Reason', 'bad id')); }); }); + + describe('Setting the SABO number on a reimbursement request', () => { + test('Fails when SABO number is already assigned to a request', async () => { + await ReimbursementRequestService.setSaboNumber( + reimbursementRequest.reimbursementRequestId, + 'SABO-001', + createdUser, + org + ); + await expect( + ReimbursementRequestService.setSaboNumber(reimbursementRequest.reimbursementRequestId, 'SABO-001', createdUser, org) + ).rejects.toThrow(new HttpException(400, 'This SABO number is already assigned to another reimbursement request.')); + }); + + test('Successfully sets the SABO number', async () => { + const result = await ReimbursementRequestService.setSaboNumber( + reimbursementRequest.reimbursementRequestId, + 'SABO-001', + createdUser, + org + ); + expect(result.saboId).toEqual('SABO-001'); + }); + }); }); diff --git a/src/frontend/src/apis/finance.api.ts b/src/frontend/src/apis/finance.api.ts index bcc112c199..604ea39ea2 100644 --- a/src/frontend/src/apis/finance.api.ts +++ b/src/frontend/src/apis/finance.api.ts @@ -363,7 +363,7 @@ export const getPendingAdvisorList = () => { * @param saboNumber the SABO number to set */ export const setSaboNumber = async (requestId: string, saboNumber: string) => { - axios.post(apiUrls.financeSetSaboNumber(requestId), { + return axios.post(apiUrls.financeSetSaboNumber(requestId), { saboNumber }); }; diff --git a/src/frontend/src/pages/FinancePage/ReimbursementRequestDetailPage/AddSABONumberModal.tsx b/src/frontend/src/pages/FinancePage/ReimbursementRequestDetailPage/AddSABONumberModal.tsx index a56c4bf7ee..40c4d13554 100644 --- a/src/frontend/src/pages/FinancePage/ReimbursementRequestDetailPage/AddSABONumberModal.tsx +++ b/src/frontend/src/pages/FinancePage/ReimbursementRequestDetailPage/AddSABONumberModal.tsx @@ -34,12 +34,12 @@ const AddSABONumberModal = ({ modalShow, onHide, reimbursementRequestId }: AddSA const onSubmit = async (data: { saboNumber: string }) => { try { await setSaboNumber(data); + onHide(); } catch (error: unknown) { if (error instanceof Error) { toast.error(error.message); } } - onHide(); }; return (