Files
CapaKraken/packages/api/src/router/timeline-project-read-support.ts
T

110 lines
2.8 KiB
TypeScript

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<TBudgetStatus extends object>(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<TPreview>(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,
};
}