Skip to content

Commit f5ee7b4

Browse files
committed
Merge branch 'develop' into test/node-25-compatibility
2 parents f556faa + 0fb0b4c commit f5ee7b4

53 files changed

Lines changed: 1047 additions & 185 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/system-tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ on:
55
push:
66
branches:
77
- main
8+
- multitenancy
89
- develop
910
- feature/**
1011

src/backend/src/controllers/change-requests.controllers.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,25 @@ export default class ChangeRequestsController {
140140
}
141141
}
142142

143+
static async createLeadershipChangeRequest(req: Request, res: Response, next: NextFunction) {
144+
try {
145+
const { wbsNum, leadId, managerId } = req.body;
146+
147+
const cr = await ChangeRequestsService.createLeadershipChangeRequest(
148+
req.currentUser,
149+
wbsNum.carNumber,
150+
wbsNum.projectNumber,
151+
wbsNum.workPackageNumber,
152+
leadId,
153+
managerId,
154+
req.organization
155+
);
156+
res.status(200).json(cr);
157+
} catch (error: unknown) {
158+
next(error);
159+
}
160+
}
161+
143162
static async createStandardChangeRequest(req: Request, res: Response, next: NextFunction) {
144163
try {
145164
const { wbsNum, type, what, why, proposedSolutions, projectProposedChanges, workPackageProposedChanges } = req.body;

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ export default class ReimbursementRequestsController {
8383
otherReimbursementProducts,
8484
wbsReimbursementProducts,
8585
accountCodeId,
86-
totalCost
86+
totalCost,
87+
description
8788
} = req.body;
8889
const user = await getCurrentUserWithUserSettings(res);
8990

@@ -96,7 +97,8 @@ export default class ReimbursementRequestsController {
9697
accountCodeId,
9798
totalCost,
9899
req.organization,
99-
dateOfExpense
100+
dateOfExpense,
101+
description
100102
);
101103
res.status(200).json(createdReimbursementRequest);
102104
} catch (error: unknown) {
@@ -130,7 +132,8 @@ export default class ReimbursementRequestsController {
130132
totalCost,
131133
otherReimbursementProducts,
132134
wbsReimbursementProducts,
133-
receiptPictures
135+
receiptPictures,
136+
description
134137
} = req.body;
135138

136139
const updatedReimbursementRequestId = await ReimbursementRequestService.editReimbursementRequest(
@@ -144,7 +147,8 @@ export default class ReimbursementRequestsController {
144147
receiptPictures,
145148
req.currentUser,
146149
req.organization,
147-
dateOfExpense
150+
dateOfExpense,
151+
description
148152
);
149153
res.status(200).json(updatedReimbursementRequestId);
150154
} catch (error: unknown) {

src/backend/src/prisma-query-args/change-requests.query-args.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ export const getChangeRequestQueryArgs = (organizationId: string) =>
3939
},
4040
budgetChangeRequest: true,
4141
deletedBy: getUserQueryArgs(organizationId),
42-
requestedReviewers: getUserQueryArgs(organizationId)
42+
requestedReviewers: getUserQueryArgs(organizationId),
43+
leadershipChangeRequest: {
44+
include: { lead: getUserQueryArgs(organizationId), manager: getUserQueryArgs(organizationId) }
45+
}
4346
}
4447
});
4548

@@ -58,7 +61,10 @@ export const getManyChangeRequestQueryArgs = (organizationId: string) =>
5861
},
5962
budgetChangeRequest: true,
6063
deletedBy: getUserQueryArgs(organizationId),
61-
requestedReviewers: getUserQueryArgs(organizationId)
64+
requestedReviewers: getUserQueryArgs(organizationId),
65+
leadershipChangeRequest: {
66+
include: { lead: getUserQueryArgs(organizationId), manager: getUserQueryArgs(organizationId) }
67+
}
6268
}
6369
});
6470

@@ -101,6 +107,9 @@ export const getChangeRequestWithProjectAndWorkPackageQueryArgs = (organizationI
101107
},
102108
budgetChangeRequest: true,
103109
deletedBy: getUserQueryArgs(organizationId),
104-
requestedReviewers: getUserQueryArgs(organizationId)
110+
requestedReviewers: getUserQueryArgs(organizationId),
111+
leadershipChangeRequest: {
112+
include: { lead: getUserQueryArgs(organizationId), manager: getUserQueryArgs(organizationId) }
113+
}
105114
}
106115
});
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-- AlterEnum
2+
ALTER TYPE "CR_Type" ADD VALUE 'LEADERSHIP';
3+
4+
-- CreateTable
5+
CREATE TABLE "Leadership_CR" (
6+
"leadershipCrId" TEXT NOT NULL,
7+
"changeRequestId" TEXT NOT NULL,
8+
"leadId" TEXT,
9+
"managerId" TEXT,
10+
11+
CONSTRAINT "Leadership_CR_pkey" PRIMARY KEY ("leadershipCrId")
12+
);
13+
14+
-- CreateIndex
15+
CREATE UNIQUE INDEX "Leadership_CR_changeRequestId_key" ON "Leadership_CR"("changeRequestId");
16+
17+
-- CreateIndex
18+
CREATE INDEX "Leadership_CR_changeRequestId_idx" ON "Leadership_CR"("changeRequestId");
19+
20+
-- AddForeignKey
21+
ALTER TABLE "Leadership_CR" ADD CONSTRAINT "Leadership_CR_changeRequestId_fkey" FOREIGN KEY ("changeRequestId") REFERENCES "Change_Request"("crId") ON DELETE RESTRICT ON UPDATE CASCADE;
22+
23+
-- AddForeignKey
24+
ALTER TABLE "Leadership_CR" ADD CONSTRAINT "Leadership_CR_leadId_fkey" FOREIGN KEY ("leadId") REFERENCES "User"("userId") ON DELETE SET NULL ON UPDATE CASCADE;
25+
26+
-- AddForeignKey
27+
ALTER TABLE "Leadership_CR" ADD CONSTRAINT "Leadership_CR_managerId_fkey" FOREIGN KEY ("managerId") REFERENCES "User"("userId") ON DELETE SET NULL ON UPDATE CASCADE;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "Reimbursement_Request" ADD COLUMN "description" TEXT NOT NULL DEFAULT '';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "Reimbursement_Request" ALTER COLUMN "saboId" SET DATA TYPE TEXT;

src/backend/src/prisma/schema.prisma

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ generator client {
1515
enum CR_Type {
1616
ISSUE
1717
DEFINITION_CHANGE
18+
LEADERSHIP
1819
OTHER
1920
STAGE_GATE
2021
ACTIVATION
@@ -299,6 +300,8 @@ model User {
299300
deniedEvents Event[] @relation(name: "deniedEventAttendee")
300301
deletedDocuments Document[] @relation(name: "deletedDocuments")
301302
createdDocuments Document[] @relation(name: "documentsCreatedBy")
303+
leadershipCrAsLead Leadership_CR[] @relation(name: "leadershipCrLead")
304+
leadershipCrAsManager Leadership_CR[] @relation(name: "leadershipCrManager")
302305
prospectiveSponsorsContacted Prospective_Sponsor[] @relation(name: "prospectiveSponsorContactor")
303306
}
304307

@@ -389,6 +392,7 @@ model Change_Request {
389392
stageGateChangeRequest Stage_Gate_CR?
390393
activationChangeRequest Activation_CR?
391394
budgetChangeRequest Budget_CR?
395+
leadershipChangeRequest Leadership_CR?
392396
notificationSlackThreads Message_Info[]
393397
394398
@@unique([identifier, organizationId], name: "uniqueChangeRequest")
@@ -486,6 +490,18 @@ model Budget_CR {
486490
@@index([changeRequestId])
487491
}
488492

493+
model Leadership_CR {
494+
leadershipCrId String @id @default(uuid())
495+
changeRequestId String @unique
496+
changeRequest Change_Request @relation(fields: [changeRequestId], references: [crId])
497+
leadId String?
498+
lead User? @relation(name: "leadershipCrLead", fields: [leadId], references: [userId])
499+
managerId String?
500+
manager User? @relation(name: "leadershipCrManager", fields: [managerId], references: [userId])
501+
502+
@@index([changeRequestId])
503+
}
504+
489505
model Change {
490506
changeId String @id @default(uuid())
491507
changeRequestId String
@@ -719,10 +735,11 @@ model Receipt {
719735
model Reimbursement_Request {
720736
reimbursementRequestId String @id @default(uuid())
721737
identifier Int
722-
saboId Int? @unique
738+
saboId String? @unique
723739
dateCreated DateTime @default(now())
724740
dateDeleted DateTime?
725741
dateOfExpense DateTime?
742+
description String @default("")
726743
reimbursementStatuses Reimbursement_Status[]
727744
recipientId String
728745
recipient User @relation(name: "reimbursementRequestRecipient", fields: [recipientId], references: [userId])
@@ -804,7 +821,7 @@ model Vendor {
804821
organizationId String
805822
organization Organization @relation(fields: [organizationId], references: [organizationId])
806823
username String?
807-
password String? // password is encrypted
824+
password String? // password is encrypted
808825
discountCode String?
809826
twoFactorContacts User[] @relation(name: "twoFactorContactVendors")
810827
notes String?

src/backend/src/prisma/seed-data/reimbursement-requests.seed.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ export const seedReimbursementRequests = async (
9797
accountCodes.equipment.accountCodeId,
9898
3500,
9999
organization,
100-
new Date('2024-10-01')
100+
new Date('2024-10-01'),
101+
'Reimbursement request for high performance battery pack'
101102
);
102103
reimbursementRequests.push(rr1);
103104

@@ -1314,7 +1315,7 @@ export const seedReimbursementRequests = async (
13141315
organization,
13151316
new Date('2024-07-15')
13161317
);
1317-
await ReimbursementRequestService.setSaboNumber(rr30.reimbursementRequestId, 12345, users.richieRich, organization);
1318+
await ReimbursementRequestService.setSaboNumber(rr30.reimbursementRequestId, 'abc123', users.richieRich, organization);
13181319
await ReimbursementRequestService.inputReimbursementRequestInSabo(
13191320
rr30.reimbursementRequestId,
13201321
users.richieRich,
@@ -1382,7 +1383,7 @@ export const seedReimbursementRequests = async (
13821383
organization,
13831384
new Date('2024-07-18')
13841385
);
1385-
await ReimbursementRequestService.setSaboNumber(rr31.reimbursementRequestId, 12346, users.mrKrabs, organization);
1386+
await ReimbursementRequestService.setSaboNumber(rr31.reimbursementRequestId, 'sdfkj3', users.mrKrabs, organization);
13861387
await ReimbursementRequestService.inputReimbursementRequestInSabo(
13871388
rr31.reimbursementRequestId,
13881389
users.mrKrabs,
@@ -1450,7 +1451,7 @@ export const seedReimbursementRequests = async (
14501451
organization,
14511452
new Date('2024-06-10')
14521453
);
1453-
await ReimbursementRequestService.setSaboNumber(rr32.reimbursementRequestId, 12340, users.monopolyMan, organization);
1454+
await ReimbursementRequestService.setSaboNumber(rr32.reimbursementRequestId, '324jj', users.monopolyMan, organization);
14541455
await ReimbursementRequestService.inputReimbursementRequestInSabo(
14551456
rr32.reimbursementRequestId,
14561457
users.monopolyMan,
@@ -1523,7 +1524,7 @@ export const seedReimbursementRequests = async (
15231524
organization,
15241525
new Date('2024-05-20')
15251526
);
1526-
await ReimbursementRequestService.setSaboNumber(rr33.reimbursementRequestId, 12335, users.johnBoddy, organization);
1527+
await ReimbursementRequestService.setSaboNumber(rr33.reimbursementRequestId, 'kaljf23', users.johnBoddy, organization);
15271528
await ReimbursementRequestService.inputReimbursementRequestInSabo(
15281529
rr33.reimbursementRequestId,
15291530
users.johnBoddy,
@@ -1596,7 +1597,7 @@ export const seedReimbursementRequests = async (
15961597
organization,
15971598
new Date('2024-05-08')
15981599
);
1599-
await ReimbursementRequestService.setSaboNumber(rr34.reimbursementRequestId, 12330, users.richieRich, organization);
1600+
await ReimbursementRequestService.setSaboNumber(rr34.reimbursementRequestId, 'newklajfd', users.richieRich, organization);
16001601
await ReimbursementRequestService.inputReimbursementRequestInSabo(
16011602
rr34.reimbursementRequestId,
16021603
users.richieRich,

src/backend/src/routes/change-requests.routes.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,15 @@ changeRequestsRouter.post(
116116
ChangeRequestsController.requestCRReview
117117
);
118118

119+
changeRequestsRouter.post(
120+
'/new/leadership',
121+
intMinZero(body('wbsNum.carNumber')),
122+
intMinZero(body('wbsNum.projectNumber')),
123+
intMinZero(body('wbsNum.workPackageNumber')),
124+
nonEmptyString(body('leadId')).optional(),
125+
nonEmptyString(body('managerId')).optional(),
126+
validateInputs,
127+
ChangeRequestsController.createLeadershipChangeRequest
128+
);
129+
119130
export default changeRequestsRouter;

0 commit comments

Comments
 (0)