Skip to content

Commit 1182021

Browse files
authored
Merge pull request #1722 from Northeastern-Electric-Racing/feature/Workpackage-Form-Redesign
Feature/workpackage form redesign
2 parents 9c27996 + 6fbcd75 commit 1182021

25 files changed

Lines changed: 500 additions & 849 deletions

File tree

src/backend/src/controllers/work-packages.controllers.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export default class WorkPackagesController {
4242
// Create a work package with the given details
4343
static async createWorkPackage(req: Request, res: Response, next: NextFunction) {
4444
try {
45-
const { projectWbsNum, name, crId, startDate, duration, blockedBy, expectedActivities, deliverables } = req.body;
45+
const { name, crId, startDate, duration, blockedBy, expectedActivities, deliverables } = req.body;
4646

4747
let { stage } = req.body;
4848
if (stage === 'NONE') {
@@ -53,7 +53,6 @@ export default class WorkPackagesController {
5353

5454
const wbsString: string = await WorkPackagesService.createWorkPackage(
5555
user,
56-
projectWbsNum,
5756
name,
5857
crId,
5958
stage,

src/backend/src/prisma/seed-data/work-packages.seed.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import { descBulletConverter } from '../../utils/description-bullets.utils';
1818
*/
1919
export const seedWorkPackage = async (
2020
creator: User,
21-
projectWbsNumber: WbsNumber,
2221
name: string,
2322
changeRequestId: number,
2423
stage: WorkPackageStage | null,
@@ -37,7 +36,6 @@ export const seedWorkPackage = async (
3736
}> => {
3837
const workPackage1WbsString = await WorkPackagesService.createWorkPackage(
3938
creator,
40-
projectWbsNumber,
4139
name,
4240
changeRequestId,
4341
stage,

src/backend/src/prisma/seed.ts

Lines changed: 87 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -450,15 +450,98 @@ const performSeed: () => Promise<void> = async () => {
450450
joeBlow.userId
451451
);
452452

453+
/**
454+
* Change Requests for Creating Work Packages
455+
*/
456+
457+
const changeRequestWP1 = await ChangeRequestsService.createStandardChangeRequest(
458+
cyborg,
459+
project1WbsNumber.carNumber,
460+
project1WbsNumber.projectNumber,
461+
project1WbsNumber.workPackageNumber,
462+
CR_Type.OTHER,
463+
'Initial Change Request',
464+
[
465+
{
466+
type: Scope_CR_Why_Type.INITIALIZATION,
467+
explain: 'need this to initialize work packages'
468+
}
469+
],
470+
[
471+
{
472+
budgetImpact: 0,
473+
description: 'Initializing seed data',
474+
timelineImpact: 0,
475+
scopeImpact: 'no scope impact'
476+
}
477+
]
478+
);
479+
480+
const changeRequestWP1Id = changeRequestWP1.crId;
481+
482+
// make a proposed solution for it
483+
const proposedSolution2 = await ChangeRequestsService.addProposedSolution(
484+
cyborg,
485+
changeRequestWP1Id,
486+
0,
487+
'Initializing seed data',
488+
0,
489+
'no scope impact'
490+
);
491+
492+
const proposedSolution2Id = proposedSolution2.id;
493+
494+
// approve the change request
495+
await ChangeRequestsService.reviewChangeRequest(batman, changeRequestWP1Id, 'LGTM', true, proposedSolution2Id);
496+
497+
const changeRequestWP5 = await ChangeRequestsService.createStandardChangeRequest(
498+
cyborg,
499+
project5WbsNumber.carNumber,
500+
project5WbsNumber.projectNumber,
501+
project5WbsNumber.workPackageNumber,
502+
CR_Type.OTHER,
503+
'Initial Change Request',
504+
[
505+
{
506+
type: Scope_CR_Why_Type.INITIALIZATION,
507+
explain: 'need this to initialize work packages'
508+
}
509+
],
510+
[
511+
{
512+
budgetImpact: 0,
513+
description: 'Initializing seed data',
514+
timelineImpact: 0,
515+
scopeImpact: 'no scope impact'
516+
}
517+
]
518+
);
519+
520+
const changeRequestWP5Id = changeRequestWP5.crId;
521+
522+
// make a proposed solution for it
523+
const proposedSolution5 = await ChangeRequestsService.addProposedSolution(
524+
cyborg,
525+
changeRequestWP5Id,
526+
0,
527+
'Initializing seed data',
528+
0,
529+
'no scope impact'
530+
);
531+
532+
const proposedSolution5Id = proposedSolution5.id;
533+
534+
// approve the change request
535+
await ChangeRequestsService.reviewChangeRequest(batman, changeRequestWP5Id, 'LGTM', true, proposedSolution5Id);
536+
453537
/**
454538
* Work Packages
455539
*/
456540
/** Work Package 1 */
457541
const { workPackageWbsNumber: workPackage1WbsNumber, workPackage: workPackage1 } = await seedWorkPackage(
458542
joeShmoe,
459-
project1WbsNumber,
460543
'Bodywork Concept of Design',
461-
changeRequest1.crId,
544+
changeRequestWP1Id,
462545
WorkPackageStage.Design,
463546
'01/01/2023',
464547
3,
@@ -497,9 +580,8 @@ const performSeed: () => Promise<void> = async () => {
497580
/** Work Package 2 */
498581
const { workPackageWbsNumber: workPackage2WbsNumber, workPackage: workPackage2 } = await seedWorkPackage(
499582
thomasEmrax,
500-
project1WbsNumber,
501583
'Adhesive Shear Strength Test',
502-
changeRequest1.crId,
584+
changeRequestWP1Id,
503585
WorkPackageStage.Research,
504586
'01/22/2023',
505587
5,
@@ -521,9 +603,8 @@ const performSeed: () => Promise<void> = async () => {
521603
/** Work Package 3 */
522604
const workPackage3WbsString = await WorkPackagesService.createWorkPackage(
523605
thomasEmrax,
524-
project5WbsNumber,
525606
'Manufacture Wiring Harness',
526-
changeRequest1.crId,
607+
changeRequestWP5Id,
527608
WorkPackageStage.Manufacturing,
528609
'02/01/2023',
529610
3,
@@ -541,7 +622,6 @@ const performSeed: () => Promise<void> = async () => {
541622
/** Work Package 4 */
542623
const { workPackageWbsNumber: workPackage4WbsNumber, workPackage: workPackage4 } = await seedWorkPackage(
543624
thomasEmrax,
544-
project5WbsNumber,
545625
'Install Wiring Harness',
546626
changeRequest1.crId,
547627
WorkPackageStage.Install,

src/backend/src/routes/work-packages.routes.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,10 @@ workPackagesRouter.post(
2020
'/create',
2121
intMinZero(body('crId')),
2222
nonEmptyString(body('name')),
23-
intMinZero(body('projectWbsNum.carNumber')),
24-
intMinZero(body('projectWbsNum.projectNumber')),
25-
intMinZero(body('projectWbsNum.workPackageNumber')),
2623
isWorkPackageStageOrNone(body('stage')),
2724
isDate(body('startDate')),
2825
intMinZero(body('duration')),
26+
body('blockedBy').isArray(),
2927
intMinZero(body('blockedBy.*.carNumber')),
3028
intMinZero(body('blockedBy.*.projectNumber')),
3129
intMinZero(body('blockedBy.*.workPackageNumber')),

src/backend/src/services/work-packages.services.ts

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,6 @@ export default class WorkPackagesService {
158158
/**
159159
* Creates a Work_Package in the database
160160
* @param user the user creating the work package
161-
* @param projectWbsNum the WBS number of the attached project
162161
* @param name the name of the new work package
163162
* @param crId the id of the change request creating this work package
164163
* @param stage the stage of the work package
@@ -172,7 +171,6 @@ export default class WorkPackagesService {
172171
*/
173172
static async createWorkPackage(
174173
user: User,
175-
projectWbsNum: WbsNumber,
176174
name: string,
177175
crId: number,
178176
stage: WorkPackageStage | null,
@@ -184,22 +182,7 @@ export default class WorkPackagesService {
184182
): Promise<string> {
185183
if (isGuest(user.role)) throw new AccessDeniedGuestException('create work packages');
186184

187-
await validateChangeRequestAccepted(crId);
188-
189-
// get the corresponding project so we can find the next wbs number
190-
// and what number work package this should be
191-
const { carNumber, projectNumber, workPackageNumber } = projectWbsNum;
192-
193-
if (workPackageNumber !== 0) {
194-
throw new HttpException(
195-
400,
196-
`Given WBS Number ${carNumber}.${projectNumber}.${workPackageNumber} is not for a project.`
197-
);
198-
}
199-
200-
if (blockedBy.find((dep: WbsNumber) => equalsWbsNumber(dep, projectWbsNum))) {
201-
throw new HttpException(400, 'A Work Package cannot have its own project as a blocker');
202-
}
185+
const changeRequest = await validateChangeRequestAccepted(crId);
203186

204187
blockedBy.forEach((dep: WbsNumber) => {
205188
if (dep.workPackageNumber === 0) {
@@ -209,11 +192,7 @@ export default class WorkPackagesService {
209192

210193
const wbsElem = await prisma.wBS_Element.findUnique({
211194
where: {
212-
wbsNumber: {
213-
carNumber,
214-
projectNumber,
215-
workPackageNumber
216-
}
195+
wbsElementId: changeRequest.wbsElementId
217196
},
218197
include: {
219198
project: {
@@ -224,10 +203,32 @@ export default class WorkPackagesService {
224203
}
225204
});
226205

227-
if (!wbsElem) throw new NotFoundException('WBS Element', `${carNumber}.${projectNumber}.${workPackageNumber}`);
206+
if (!wbsElem) throw new NotFoundException('WBS Element', changeRequest.wbsElementId);
207+
208+
// get the corresponding project so we can find the next wbs number
209+
// and what number work package this should be
210+
const { carNumber, projectNumber, workPackageNumber } = wbsElem;
211+
212+
const projectWbsNum: WbsNumber = {
213+
carNumber,
214+
projectNumber,
215+
workPackageNumber
216+
};
217+
228218
if (wbsElem.dateDeleted)
229219
throw new DeletedException('WBS Element', wbsPipe({ carNumber, projectNumber, workPackageNumber }));
230220

221+
if (workPackageNumber !== 0) {
222+
throw new HttpException(
223+
400,
224+
`Given WBS Number ${carNumber}.${projectNumber}.${workPackageNumber} is not for a project.`
225+
);
226+
}
227+
228+
if (blockedBy.find((dep: WbsNumber) => equalsWbsNumber(dep, projectWbsNum))) {
229+
throw new HttpException(400, 'A Work Package cannot have its own project as a blocker');
230+
}
231+
231232
const { project } = wbsElem;
232233

233234
if (!project) throw new NotFoundException('Project', `${carNumber}.${projectNumber}.${workPackageNumber}`);

src/backend/tests/test-data/wbs-element.test-data.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,17 @@ export const prismaWbsElement1: PrismaWbsElement = {
1313
projectLeadId: 4,
1414
projectManagerId: 5
1515
};
16+
17+
export const prismaWbsElement2: PrismaWbsElement = {
18+
wbsElementId: 1,
19+
status: PrismaWBSElementStatus.ACTIVE,
20+
carNumber: 1,
21+
projectNumber: 2,
22+
workPackageNumber: 2,
23+
dateCreated: new Date(),
24+
dateDeleted: null,
25+
name: 'car',
26+
deletedByUserId: null,
27+
projectLeadId: 4,
28+
projectManagerId: 5
29+
};

0 commit comments

Comments
 (0)