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 { return `Committed import batch (${JSON.stringify(counts)})`; }