Skip to content

Commit 2877945

Browse files
committed
Merge branch 'develop' of https://github.com/Northeastern-Electric-Racing/FinishLine into #1522-create-material-type-endpoint
2 parents c7aac4d + fd3922f commit 2877945

18 files changed

Lines changed: 66 additions & 83 deletions

File tree

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-- AlterEnum
2+
CREATE TYPE "Work_Package_Stage_new" AS ENUM ('RESEARCH', 'DESIGN', 'MANUFACTURING', 'INSTALL');
3+
ALTER TABLE "Work_Package" ALTER COLUMN "stage" TYPE "Work_Package_Stage_new" USING (
4+
CASE "stage"::text
5+
WHEN 'INTEGRATION' THEN 'INSTALL'::"Work_Package_Stage_new"
6+
ELSE "stage"::text::"Work_Package_Stage_new"
7+
END);
8+
ALTER TYPE "Work_Package_Stage" RENAME TO "Work_Package_Stage_old";
9+
ALTER TYPE "Work_Package_Stage_new" RENAME TO "Work_Package_Stage";
10+
DROP TYPE "Work_Package_Stage_old";

src/backend/src/prisma/migrations/20231011234802_add_bom/migration.sql renamed to src/backend/src/prisma/migrations/20231019013832_add_bom/migration.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ CREATE TABLE "Assembly" (
2525
-- CreateTable
2626
CREATE TABLE "Material" (
2727
"materialId" TEXT NOT NULL,
28-
"assembyId" TEXT,
28+
"assemblyId" TEXT,
2929
"name" TEXT NOT NULL,
3030
"wbsElementId" INTEGER NOT NULL,
3131
"dateDeleted" TIMESTAMP(3),
@@ -81,7 +81,7 @@ ALTER TABLE "Assembly" ADD CONSTRAINT "Assembly_userCreatedId_fkey" FOREIGN KEY
8181
ALTER TABLE "Assembly" ADD CONSTRAINT "Assembly_wbsElementId_fkey" FOREIGN KEY ("wbsElementId") REFERENCES "WBS_Element"("wbsElementId") ON DELETE RESTRICT ON UPDATE CASCADE;
8282

8383
-- AddForeignKey
84-
ALTER TABLE "Material" ADD CONSTRAINT "Material_assembyId_fkey" FOREIGN KEY ("assembyId") REFERENCES "Assembly"("assemblyId") ON DELETE SET NULL ON UPDATE CASCADE;
84+
ALTER TABLE "Material" ADD CONSTRAINT "Material_assemblyId_fkey" FOREIGN KEY ("assemblyId") REFERENCES "Assembly"("assemblyId") ON DELETE SET NULL ON UPDATE CASCADE;
8585

8686
-- AddForeignKey
8787
ALTER TABLE "Material" ADD CONSTRAINT "Material_wbsElementId_fkey" FOREIGN KEY ("wbsElementId") REFERENCES "WBS_Element"("wbsElementId") ON DELETE RESTRICT ON UPDATE CASCADE;

src/backend/src/prisma/schema.prisma

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ enum Work_Package_Stage {
6767
RESEARCH
6868
DESIGN
6969
MANUFACTURING
70-
INTEGRATION
70+
INSTALL
7171
}
7272

7373
model User {
@@ -256,7 +256,7 @@ model WBS_Element {
256256
tasks Task[]
257257
reimbursementProducts Reimbursement_Product[]
258258
links Link[] @relation(name: "links")
259-
assembies Assembly[]
259+
assemblies Assembly[]
260260
materials Material[]
261261
262262
@@unique([carNumber, projectNumber, workPackageNumber], name: "wbsNumber")
@@ -487,8 +487,8 @@ model Assembly {
487487

488488
model Material {
489489
materialId String @id @default(uuid())
490-
assemby Assembly? @relation(fields: [assembyId], references: [assemblyId])
491-
assembyId String?
490+
assembly Assembly? @relation(fields: [assemblyId], references: [assemblyId])
491+
assemblyId String?
492492
name String @unique
493493
wbsElement WBS_Element @relation(fields: [wbsElementId], references: [wbsElementId])
494494
wbsElementId Int

src/backend/src/prisma/seed.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,24 @@ const performSeed: () => Promise<void> = async () => {
447447
);
448448
const workPackage3WbsNumber = validateWBS(workPackage3WbsString);
449449

450+
/** Work Package 4 */
451+
const { workPackageWbsNumber: workPackage4WbsNumber, workPackage: workPackage4 } = await seedWorkPackage(
452+
thomasEmrax,
453+
project5WbsNumber,
454+
'Install Wiring Harness',
455+
changeRequest1Id,
456+
WorkPackageStage.Install,
457+
'04/01/2023',
458+
7,
459+
[],
460+
['Assemble and install wiring harness', 'Confirm the installation was successful'],
461+
['Wiring harness is functional and installed in the car'],
462+
thomasEmrax,
463+
WbsElementStatus.Active,
464+
joeShmoe.userId,
465+
thomasEmrax.userId
466+
);
467+
450468
/**
451469
* Change Requests
452470
*/

src/backend/src/transformers/change-requests.transformer.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { wbsNumOf } from '../utils/utils';
55
import { calculateChangeRequestStatus, convertCRScopeWhyType } from '../utils/change-requests.utils';
66
import proposedSolutionTransformer from './proposed-solutions.transformer';
77
import userTransformer from './user.transformer';
8+
import { getDateImplemented } from '../utils/change-requests.utils';
89

910
const changeRequestTransformer = (
1011
changeRequest: Prisma.Change_RequestGetPayload<typeof changeRequestRelationArgs>
@@ -23,11 +24,7 @@ const changeRequestTransformer = (
2324
dateReviewed: changeRequest.dateReviewed ?? undefined,
2425
accepted: changeRequest.accepted ?? undefined,
2526
reviewNotes: changeRequest.reviewNotes ?? undefined,
26-
dateImplemented: changeRequest.changes.reduce(
27-
(res: Date | undefined, change) =>
28-
!res || change.dateImplemented.valueOf() > res.valueOf() ? change.dateImplemented : res,
29-
undefined
30-
),
27+
dateImplemented: getDateImplemented(changeRequest),
3128
implementedChanges: changeRequest.changes.map((change) => ({
3229
wbsNum: wbsNumOf(change.wbsElement),
3330
changeId: change.changeId,

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import prisma from '../prisma/prisma';
2-
import { Scope_CR_Why_Type, Team, User, Prisma, Change_Request } from '@prisma/client';
2+
import { Scope_CR_Why_Type, Team, User, Prisma, Change_Request, Change } from '@prisma/client';
33
import { addWeeksToDate, ChangeRequestReason } from 'shared';
44
import { sendMessage } from '../integrations/slack';
55
import { HttpException, NotFoundException } from './errors.utils';
@@ -134,15 +134,16 @@ export const updateBlocking = async (
134134
* @throws if the change request is unreviewed, denied, or deleted
135135
*/
136136
export const validateChangeRequestAccepted = async (crId: number) => {
137-
const changeRequest = await prisma.change_Request.findUnique({ where: { crId } });
137+
const changeRequest = await prisma.change_Request.findUnique({ where: { crId }, include: { changes: true } });
138138
const currentDate = new Date();
139139

140140
if (!changeRequest) throw new NotFoundException('Change Request', crId);
141141
if (changeRequest.dateDeleted) throw new HttpException(400, 'Cannot use a deleted change request!');
142142
if (changeRequest.accepted === null) throw new HttpException(400, 'Cannot implement an unreviewed change request');
143143
if (!changeRequest.accepted) throw new HttpException(400, 'Cannot implement a denied change request');
144144
if (!changeRequest.dateReviewed) throw new HttpException(400, 'Cannot use an unreviewed change request');
145-
if (currentDate.getTime() - changeRequest.dateReviewed.getTime() > 1000 * 60 * 60 * 24 * 5)
145+
const dateImplemented = getDateImplemented(changeRequest);
146+
if (dateImplemented && currentDate.getTime() - dateImplemented.getTime() > 1000 * 60 * 60 * 24 * 5)
146147
throw new HttpException(400, 'Cannot tie changes to outdated change request');
147148

148149
return changeRequest;
@@ -166,6 +167,14 @@ export const calculateChangeRequestStatus = (
166167
return ChangeRequestStatus.Open;
167168
};
168169

170+
export const getDateImplemented = (changeRequest: Change_Request & { changes: Change[] }): Date | undefined => {
171+
return changeRequest.changes.reduce(
172+
(res: Date | undefined, change) =>
173+
!res || change.dateImplemented.valueOf() < res.valueOf() ? change.dateImplemented : res,
174+
undefined
175+
);
176+
};
177+
169178
/**
170179
* Determines whether all the change requests in an array of change requests have been reviewed
171180
* @param changeRequests the given array of change requests

src/backend/src/utils/validation.utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export const isWorkPackageStageOrNone = (validationObject: ValidationChain): Val
3636
WorkPackageStage.Research,
3737
WorkPackageStage.Design,
3838
WorkPackageStage.Manufacturing,
39-
WorkPackageStage.Integration,
39+
WorkPackageStage.Install,
4040
'NONE'
4141
]);
4242
};

src/backend/tests/projects.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ const mockGetHighestProjectNumber = getHighestProjectNumber as jest.Mock<Promise
2323

2424
describe('Projects', () => {
2525
beforeEach(() => {
26-
vi.spyOn(changeRequestUtils, 'validateChangeRequestAccepted').mockImplementation(async (_crId) => prismaChangeRequest1);
26+
vi.spyOn(changeRequestUtils, 'validateChangeRequestAccepted').mockImplementation(async (_crId) => {
27+
return { ...prismaChangeRequest1, changes: [] };
28+
});
2729
vi.spyOn(projectTransformer, 'default').mockReturnValue(sharedProject1);
2830
vi.spyOn(WorkPackagesService, 'deleteWorkPackage').mockImplementation(async (_user: User, _wbsNum: WbsNumber) => {});
2931
});

src/backend/tests/work-packages.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ describe('Work Packages', () => {
6161

6262
beforeEach(() => {
6363
vi.spyOn(changeRequestUtils, 'validateChangeRequestAccepted').mockImplementation(async (_crId) => {
64-
return prismaChangeRequest1;
64+
return { ...prismaChangeRequest1, changes: [] };
6565
});
6666

6767
vi.spyOn(workPackageTransformer, 'default').mockReturnValue(sharedWorkPackage);

src/frontend/src/components/ChangeRequestDropdown.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const getFilteredChangeRequests = (changeRequests: ChangeRequest[], user: Authen
1212
const fiveDaysAgo = subDays(today, 5);
1313

1414
const filteredRequests = changeRequests.filter(
15-
(cr) => cr.dateReviewed && cr.accepted && isWithinInterval(cr.dateReviewed, { start: fiveDaysAgo, end: today })
15+
(cr) => cr.dateImplemented && cr.accepted && isWithinInterval(cr.dateImplemented, { start: fiveDaysAgo, end: today })
1616
);
1717

1818
// The current user's CRs should be at the top

0 commit comments

Comments
 (0)