64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
/**
|
|
* Vacation utility functions for the engine layer.
|
|
* These are pure functions — no DB imports.
|
|
*/
|
|
|
|
export interface VacationRange {
|
|
startDate: Date;
|
|
endDate: Date;
|
|
status: string;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the given date falls within any APPROVED vacation range.
|
|
*/
|
|
export function isVacationDay(date: Date, vacations: VacationRange[]): boolean {
|
|
const t = new Date(date);
|
|
t.setHours(0, 0, 0, 0);
|
|
const time = t.getTime();
|
|
|
|
for (const v of vacations) {
|
|
if (v.status !== "APPROVED") continue;
|
|
const start = new Date(v.startDate);
|
|
start.setHours(0, 0, 0, 0);
|
|
const end = new Date(v.endDate);
|
|
end.setHours(0, 0, 0, 0);
|
|
if (time >= start.getTime() && time <= end.getTime()) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns all APPROVED vacation dates (as Date objects) that fall within [startDate, endDate].
|
|
* Used for demand recalculation display.
|
|
*/
|
|
export function getVacationDatesInRange(
|
|
startDate: Date,
|
|
endDate: Date,
|
|
vacations: VacationRange[],
|
|
): Date[] {
|
|
const result: Date[] = [];
|
|
const approved = vacations.filter((v) => v.status === "APPROVED");
|
|
|
|
const current = new Date(startDate);
|
|
current.setHours(0, 0, 0, 0);
|
|
const end = new Date(endDate);
|
|
end.setHours(0, 0, 0, 0);
|
|
|
|
while (current <= end) {
|
|
for (const v of approved) {
|
|
const vStart = new Date(v.startDate);
|
|
vStart.setHours(0, 0, 0, 0);
|
|
const vEnd = new Date(v.endDate);
|
|
vEnd.setHours(0, 0, 0, 0);
|
|
if (current >= vStart && current <= vEnd) {
|
|
result.push(new Date(current));
|
|
break;
|
|
}
|
|
}
|
|
current.setDate(current.getDate() + 1);
|
|
}
|
|
|
|
return result;
|
|
}
|