chore(repo): initialize planarchy workspace

This commit is contained in:
2026-03-14 14:31:09 +01:00
commit dd55d0e78b
769 changed files with 166461 additions and 0 deletions
+63
View File
@@ -0,0 +1,63 @@
/**
* 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;
}