From ae6ce4bf979ebe7b508351643d1ba2da2930a33e Mon Sep 17 00:00:00 2001 From: Matthieu Haineault Date: Tue, 19 Aug 2025 09:37:53 -0400 Subject: [PATCH] feat(pay-period): added email to Param of getCrewOverview --- docs/swagger/swagger-spec.json | 14 +++++++++++--- .../controllers/pay-periods.controller.ts | 18 ++++++------------ .../services/pay-periods-query.service.ts | 15 ++++++++++----- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/docs/swagger/swagger-spec.json b/docs/swagger/swagger-spec.json index c8b8500..72371bc 100644 --- a/docs/swagger/swagger-spec.json +++ b/docs/swagger/swagger-spec.json @@ -2073,7 +2073,7 @@ ] } }, - "/pay-periods/{year}/{periodNumber}/approval": { + "/pay-periods/approval/{year}/{periodNumber}": { "patch": { "operationId": "PayPeriodsController_approve", "parameters": [ @@ -2108,7 +2108,7 @@ ] } }, - "/pay-periods/{year}/{periodNumber}/crew-overview": { + "/pay-periods/{year}/{periodNumber}/{email}": { "get": { "operationId": "PayPeriodsController_getCrewOverview", "parameters": [ @@ -2131,6 +2131,14 @@ "type": "number" } }, + { + "name": "email", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, { "name": "includeSubtree", "required": false, @@ -2163,7 +2171,7 @@ ] } }, - "/pay-periods/{year}/{periodNumber}/overview": { + "/pay-periods/overview/{year}/{periodNumber}": { "get": { "operationId": "PayPeriodsController_getOverviewByYear", "parameters": [ diff --git a/src/modules/pay-periods/controllers/pay-periods.controller.ts b/src/modules/pay-periods/controllers/pay-periods.controller.ts index 32a8ef3..ca30c5e 100644 --- a/src/modules/pay-periods/controllers/pay-periods.controller.ts +++ b/src/modules/pay-periods/controllers/pay-periods.controller.ts @@ -59,7 +59,7 @@ export class PayPeriodsController { return this.queryService.findOneByYearPeriod(year, periodNumber); } - @Patch(":year/:periodNumber/approval") + @Patch("approval/:year/:periodNumber") //@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({ summary: "Approve all timesheets with activity in the period" }) @ApiParam({ name: "year", type: Number, example: 2024 }) @@ -73,7 +73,7 @@ export class PayPeriodsController { return { message: `Pay-period ${year}-${periodNumber} approved` }; } - @Get(':year/:periodNumber/crew-overview') + @Get(':year/:periodNumber/:email') //@RolesAllowed(RoleEnum.SUPERVISOR) @ApiOperation({ summary: 'Supervisor crew overview for a given pay period' }) @ApiParam({ name: 'year', type: Number, example: 2024 }) @@ -84,20 +84,14 @@ export class PayPeriodsController { async getCrewOverview( @Param('year', ParseIntPipe) year: number, @Param('periodNumber', ParseIntPipe) periodNumber: number, + @Param('email') email: string, @Query('includeSubtree', new ParseBoolPipe({ optional: true })) includeSubtree = false, @Req() req: Request, ): Promise { - const rawUser = (req as any).user ?? {}; - const userId: string | undefined = rawUser.id ?? rawUser.sub ?? rawUser.userId; //needs ajusting according to passport logic - - if (!userId) { - throw new ForbiddenException('Authenticated user not found on request'); + return this.queryService.getCrewOverview(year, periodNumber, email, includeSubtree); } - return this.queryService.getCrewOverview(year, periodNumber, userId, includeSubtree); - } - - @Get(':year/:periodNumber/overview') + @Get('overview/:year/:periodNumber') @ApiOperation({ summary: 'Detailed view of a pay period by year + number' }) @ApiParam({ name: 'year', type: Number, example: 2024 }) @ApiParam({ name: 'periodNumber', type: Number, example: 1, description: '1..26' }) @@ -107,6 +101,6 @@ export class PayPeriodsController { @Param('year', ParseIntPipe) year: number, @Param('periodNumber', ParseIntPipe) periodNumber: number, ): Promise { - return this.queryService.getOverviewByYearPeriod(year, periodNumber); + return this.queryService.getOverviewByYearPeriod(year, periodNumber); } } diff --git a/src/modules/pay-periods/services/pay-periods-query.service.ts b/src/modules/pay-periods/services/pay-periods-query.service.ts index c3e7196..b1bdf8a 100644 --- a/src/modules/pay-periods/services/pay-periods-query.service.ts +++ b/src/modules/pay-periods/services/pay-periods-query.service.ts @@ -181,17 +181,22 @@ export class PayPeriodsQueryService { } - async getCrewOverview(year: number, periodNumber: number, userId: string, includeSubtree: boolean): Promise { + async getCrewOverview(year: number, periodNumber: number, email: string, includeSubtree: boolean): Promise { // 1) Search for the period const period = await this.prisma.payPeriods.findFirst({ where: { year, period_number: periodNumber } }); if (!period) throw new NotFoundException(`Pay period ${year}-${periodNumber} not found`); // 2) fetch supervisor - const supervisor = await this.prisma.employees.findUnique({ - where: { user_id: userId }, - select: { id: true }, + const supervisor = await this.prisma.employees.findFirst({ + where: { user: {email: email }}, + select: { + id: true, + is_supervisor: true, + }, }); - if (!supervisor) throw new ForbiddenException('No employee record linked to current user'); + + if (!supervisor) throw new NotFoundException('No employee record linked to current user'); + if (!supervisor.is_supervisor) throw new ForbiddenException('Employee is not a supervisor'); // 3)fetchs crew members const crew = await this.resolveCrew(supervisor.id, includeSubtree); // [{ id, first_name, last_name }]