Skip to content

Commit 01f2af0

Browse files
authored
Merge pull request #1672 from Northeastern-Electric-Racing/#1658-finance-team-edit-RRs
#1658 Allowed finance team to edit all RR's
2 parents bbe25ce + 9a22f45 commit 01f2af0

4 files changed

Lines changed: 35 additions & 10 deletions

File tree

src/backend/src/services/reimbursement-requests.services.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
removeDeletedReceiptPictures,
2525
updateReimbursementProducts,
2626
validateReimbursementProducts,
27+
validateUserEditRRPermissions,
2728
validateUserIsPartOfFinanceTeam
2829
} from '../utils/reimbursement-requests.utils';
2930
import {
@@ -255,10 +256,7 @@ export default class ReimbursementRequestService {
255256

256257
if (!oldReimbursementRequest) throw new NotFoundException('Reimbursement Request', requestId);
257258
if (oldReimbursementRequest.dateDeleted) throw new DeletedException('Reimbursement Request', requestId);
258-
if (oldReimbursementRequest.recipientId !== submitter.userId)
259-
throw new AccessDeniedException(
260-
'You do not have access to delete this reimbursement request, only the creator can edit a reimbursement request'
261-
);
259+
await validateUserEditRRPermissions(submitter, oldReimbursementRequest);
262260

263261
const vendor = await prisma.vendor.findUnique({
264262
where: { vendorId }

src/backend/src/utils/reimbursement-requests.utils.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { ReimbursementProductCreateArgs, ReimbursementReceiptCreateArgs, WbsNumber, wbsPipe } from 'shared';
77
import prisma from '../prisma/prisma';
88
import { AccessDeniedException, DeletedException, HttpException, NotFoundException } from './errors.utils';
9-
import { Prisma, Receipt, Reimbursement_Product, Team, User } from '@prisma/client';
9+
import { Prisma, Receipt, Reimbursement_Product, Reimbursement_Request, Team, User } from '@prisma/client';
1010
import authUserQueryArgs from '../prisma-query-args/auth-user.query-args';
1111
import { isUserOnTeam } from './teams.utils';
1212

@@ -233,3 +233,17 @@ export const isAuthUserHeadOfFinance = (user: Prisma.UserGetPayload<typeof authU
233233
const isTeamIdInList = (teamId: string, teamsList: Team[]) => {
234234
return teamsList.map((team) => team.teamId).includes(teamId);
235235
};
236+
237+
/**
238+
* Validates user has permission to edit the reimbursement request.
239+
* @param user the person editing the reimbursement request
240+
* @param reimbursementRequest the reimbursement request to edit
241+
*/
242+
export const validateUserEditRRPermissions = async (user: User, reimbursementRequest: Reimbursement_Request) => {
243+
try {
244+
await validateUserIsPartOfFinanceTeam(user);
245+
} catch {
246+
if (reimbursementRequest.recipientId !== user.userId)
247+
throw new AccessDeniedException('Only the creator or finance team can edit a reimbursement request');
248+
}
249+
};

src/backend/tests/reimbursement-requests.test.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,24 @@ describe('Reimbursement Requests', () => {
224224
[],
225225
superman
226226
)
227-
).rejects.toThrow(
228-
new AccessDeniedException(
229-
'You do not have access to delete this reimbursement request, only the creator can edit a reimbursement request'
227+
).rejects.toThrow(new AccessDeniedException('Only the creator or finance team can edit a reimbursement request'));
228+
});
229+
230+
test('Edit Reimbursement Request fails if Submitter not on Finance Team', async () => {
231+
vi.spyOn(prisma.team, 'findUnique').mockResolvedValue({ ...primsaTeam2, headId: 1 });
232+
await expect(
233+
ReimbursementRequestService.editReimbursementRequest(
234+
GiveMeMyMoney.reimbursementRequestId,
235+
GiveMeMyMoney.dateOfExpense,
236+
GiveMeMyMoney.vendorId,
237+
GiveMeMyMoney.account as ClubAccount,
238+
GiveMeMyMoney.expenseTypeId,
239+
GiveMeMyMoney.totalCost,
240+
[],
241+
[],
242+
alfred
230243
)
231-
);
244+
).rejects.toThrow(new AccessDeniedException('Only the creator or finance team can edit a reimbursement request'));
232245
});
233246

234247
test('Edit Reimbursement Request Fails When Vendor does not exist', async () => {

src/frontend/src/pages/FinancePage/ReimbursementRequestDetailPage/ReimbursementRequestDetailsView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ const ReimbursementRequestDetailsView: React.FC<ReimbursementRequestDetailsViewP
194194
title: 'Edit',
195195
onClick: () => history.push(`${routes.REIMBURSEMENT_REQUESTS}/${reimbursementRequest.reimbursementRequestId}/edit`),
196196
icon: <Edit />,
197-
disabled: !allowEdit
197+
disabled: !allowEdit && !user.isFinance
198198
},
199199
{
200200
title: 'Delete',

0 commit comments

Comments
 (0)