import { ok, err, type CommandContext } from "@tailor-platform/erp-kit/core"; import type { Transaction } from "../generated/kysely-tailordb"; import { AssignmentNotFoundError, AssignmentAlreadyClosedError } from "../lib/errors.generated"; export interface EndAssignmentInput { id: string; effectiveEnd: Date; } /** Function: run Description: Closes the current open generation of an Assignment (sets effectiveEnd) without creating a replacement generation. */ export async function run(db: Transaction, input: EndAssignmentInput, _ctx: CommandContext) { const assignment = await db .selectFrom("Assignment") .selectAll() .where("id", "=", input.id) .forUpdate() .executeTakeFirst(); if (!assignment) return err(new AssignmentNotFoundError(input.id)); if (assignment.effectiveEnd !== null) return err(new AssignmentAlreadyClosedError(input.id)); const updated = await db .updateTable("Assignment") .set({ effectiveEnd: input.effectiveEnd }) .where("id", "=", input.id) .returningAll() .executeTakeFirstOrThrow(); return ok({ assignment: updated }); }