40 lines
1.9 KiB
TypeScript
40 lines
1.9 KiB
TypeScript
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<number> {
|
|
//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<number> {
|
|
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;
|
|
}
|
|
} |