Files
CapaKraken/packages/api/src/router/dispo-management-support.ts
T

90 lines
2.5 KiB
TypeScript

import {
DispoStagedRecordType,
ImportBatchStatus,
StagedRecordStatus,
} from "@capakraken/db";
import { TRPCError } from "@trpc/server";
type StagedRecordAction = "APPROVE" | "REJECT" | "SKIP";
export const terminalImportBatchStatuses: readonly ImportBatchStatus[] = [
ImportBatchStatus.COMMITTED,
ImportBatchStatus.CANCELLED,
];
export function assertImportBatchCancelable(input: {
id: string;
status: ImportBatchStatus;
}): void {
if (terminalImportBatchStatuses.includes(input.status)) {
throw new TRPCError({
code: "BAD_REQUEST",
message: `Cannot cancel batch in status "${input.status}"`,
});
}
}
export function resolveDispoStagedRecordStatus(
action: StagedRecordAction,
): StagedRecordStatus {
switch (action) {
case "APPROVE":
return StagedRecordStatus.APPROVED;
case "REJECT":
case "SKIP":
return StagedRecordStatus.REJECTED;
}
}
export function resolveDispoStagedRecordStoreKey(
recordType: DispoStagedRecordType,
): keyof DispoStagedRecordStores {
switch (recordType) {
case DispoStagedRecordType.RESOURCE:
return "stagedResource";
case DispoStagedRecordType.CLIENT:
return "stagedClient";
case DispoStagedRecordType.PROJECT:
return "stagedProject";
case DispoStagedRecordType.ASSIGNMENT:
return "stagedAssignment";
case DispoStagedRecordType.VACATION:
return "stagedVacation";
case DispoStagedRecordType.AVAILABILITY_RULE:
return "stagedAvailabilityRule";
case DispoStagedRecordType.UNRESOLVED:
return "stagedUnresolvedRecord";
default:
throw new TRPCError({
code: "BAD_REQUEST",
message: `Unknown record type: ${recordType as string}`,
});
}
}
export type DispoStagedRecordStores = {
stagedResource: { update: Function };
stagedClient: { update: Function };
stagedProject: { update: Function };
stagedAssignment: { update: Function };
stagedVacation: { update: Function };
stagedAvailabilityRule: { update: Function };
stagedUnresolvedRecord: { update: Function };
};
export function buildCancelledImportBatchUpdateData() {
return { status: ImportBatchStatus.CANCELLED } as const;
}
export function buildResolvedStagedRecordUpdateData(
action: StagedRecordAction,
) {
return { status: resolveDispoStagedRecordStatus(action) } as const;
}
export function buildDispoImportCommitAuditSummary(
counts: Record<string, unknown>,
): string {
return `Committed import batch (${JSON.stringify(counts)})`;
}