110 lines
2.8 KiB
TypeScript
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,
|
|
};
|
|
}
|