import { Injectable, Logger } from "@nestjs/common"; import { PrismaService } from "../../../prisma/prisma.service"; import { computeHours, getWeekStart } from "src/common/utils/date-utils"; @Injectable() export class HolidayService { private readonly logger = new Logger(HolidayService.name); constructor(private readonly prisma: PrismaService) {} private async computeHoursPrevious4Weeks(employeeId: number, holidayDate: Date): Promise { //sets the end of the window to 1ms before the week with the holiday const holidayWeekStart = getWeekStart(holidayDate); const windowEnd = new Date(holidayWeekStart.getTime() - 1); //sets the start of the window to 28 days ( 4 completed weeks ) before the week with the holiday const windowStart = new Date(windowEnd.getTime() - 28 * 24 * 60 * 60000 + 1 ) const validCodes = ['G1', 'G45', 'G56', 'G104', 'G105', 'G700']; //fetches all shift of the employee in said window ( 4 previous completed weeks ) const shifts = await this.prisma.shifts.findMany({ where: { timesheet: { employee_id: employeeId } , date: { gte: windowStart, lte: windowEnd }, bank_code: { bank_code: { in: validCodes } }, }, select: { date: true, start_time: true, end_time: true }, }); const totalHours = shifts.map(s => computeHours(s.start_time, s.end_time)).reduce((sum, h)=> sum + h, 0); const dailyHours = totalHours / 20; return dailyHours; } async calculateHolidayPay( employeeId: number, holidayDate: Date, modifier: number): Promise { const hours = await this.computeHoursPrevious4Weeks(employeeId, holidayDate); const dailyRate = Math.min(hours, 8); this.logger.debug(`Holiday pay calculation: hours= ${hours.toFixed(2)}`); return dailyRate * modifier; } }