1df208dbcc
Allocation bars that have active optimistic overrides (post-drag, awaiting server confirmation) now pulse subtly via animate-pulse. The pending set is derived from the existing optimisticAllocations map keys, requiring no additional state. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
import { toIsoDate, type WeekdayAvailability } from "@capakraken/shared";
|
|
export { toIsoDate } from "@capakraken/shared";
|
|
import { calculateEffectiveBookedHours } from "../lib/resource-capacity.js";
|
|
|
|
type BookingForCapacity = {
|
|
startDate: Date;
|
|
endDate: Date;
|
|
hoursPerDay: number;
|
|
};
|
|
|
|
export function buildDailyBookedHoursMap(
|
|
bookings: BookingForCapacity[],
|
|
availability: WeekdayAvailability,
|
|
context: Parameters<typeof calculateEffectiveBookedHours>[0]["context"],
|
|
periodStart: Date,
|
|
periodEnd: Date,
|
|
): Map<string, number> {
|
|
const dailyBookedHours = new Map<string, number>();
|
|
const cursor = new Date(periodStart);
|
|
cursor.setUTCHours(0, 0, 0, 0);
|
|
const end = new Date(periodEnd);
|
|
end.setUTCHours(0, 0, 0, 0);
|
|
|
|
while (cursor <= end) {
|
|
const isoDate = toIsoDate(cursor);
|
|
const bookedHours = bookings.reduce(
|
|
(sum, booking) => sum + calculateEffectiveBookedHours({
|
|
availability,
|
|
startDate: booking.startDate,
|
|
endDate: booking.endDate,
|
|
hoursPerDay: booking.hoursPerDay,
|
|
periodStart: cursor,
|
|
periodEnd: cursor,
|
|
context,
|
|
}),
|
|
0,
|
|
);
|
|
dailyBookedHours.set(isoDate, bookedHours);
|
|
cursor.setUTCDate(cursor.getUTCDate() + 1);
|
|
}
|
|
|
|
return dailyBookedHours;
|
|
}
|