import type { Allocation } from "@capakraken/shared"; import { fmtDate } from "./timeline-read-shared.js"; export function buildTimelineShiftValidationBookings( bookings: Array<{ id: string; resourceId: string | null; projectId: string | null; startDate: Date; endDate: Date; hoursPerDay: number; status: string; }>, ) { return bookings .filter( ( booking, ): booking is typeof booking & { resourceId: string; projectId: string } => booking.resourceId !== null && booking.projectId !== null, ) .map((booking) => ({ id: booking.id, resourceId: booking.resourceId, projectId: booking.projectId, startDate: booking.startDate, endDate: booking.endDate, hoursPerDay: booking.hoursPerDay, status: booking.status, })); } export function buildTimelineBudgetStatusAllocations( bookings: Array<{ status: string; dailyCostCents: number; startDate: Date; endDate: Date; hoursPerDay: number; }>, ): Pick< Allocation, "status" | "dailyCostCents" | "startDate" | "endDate" | "hoursPerDay" >[] { return bookings.map((booking) => ({ status: booking.status as Allocation["status"], dailyCostCents: booking.dailyCostCents, startDate: booking.startDate, endDate: booking.endDate, hoursPerDay: booking.hoursPerDay, })); } export function buildTimelineBudgetStatusResponse(input: { project: { name: string; shortCode: string | null; budgetCents: number; }; budgetStatus: TBudgetStatus; totalAllocations: number; }): TBudgetStatus & { projectName: string; projectCode: string; totalAllocations: number; budgetCents: number; } { return { ...input.budgetStatus, projectName: input.project.name, projectCode: input.project.shortCode ?? "", totalAllocations: input.totalAllocations, budgetCents: input.project.budgetCents, }; } export function buildTimelineShiftPreviewDetailResponse(input: { project: { id: string; name: string; shortCode: string | null; status: string; responsiblePerson: string | null; startDate: Date; endDate: Date; }; requestedShift: { newStartDate: Date; newEndDate: Date; }; preview: TPreview; }) { return { project: { id: input.project.id, name: input.project.name, shortCode: input.project.shortCode, status: input.project.status, responsiblePerson: input.project.responsiblePerson, startDate: fmtDate(input.project.startDate), endDate: fmtDate(input.project.endDate), }, requestedShift: { newStartDate: fmtDate(input.requestedShift.newStartDate), newEndDate: fmtDate(input.requestedShift.newEndDate), }, preview: input.preview, }; }