import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import { accountReceivableDocumentLifecycle } from "../db/accountReceivableDocument.lifecycle.generated"; import type { Transaction } from "../generated/kysely-tailordb"; import { syncSalesOrderBillingStatusFromAccountReceivable } from "../internal/salesBillingFeedback"; import { DocumentNotFoundError, InvalidDocumentStatusError } from "../lib/errors.generated"; import type { SalesCommands } from "../module"; export async function run( db: Transaction, input: { id: string }, ctx: CommandContext, salesCommands: Pick, ) { const document = await db .selectFrom("AccountReceivableDocument") .selectAll() .where("id", "=", input.id) .forUpdate() .executeTakeFirst(); if (!document) return err(new DocumentNotFoundError(input.id)); const nextStatus = accountReceivableDocumentLifecycle.tryTransition(document.status, "cancel"); if (!nextStatus) return err(new InvalidDocumentStatusError(input.id)); const cancelledDocument = await db .updateTable("AccountReceivableDocument") .set({ status: nextStatus, cancelledAt: new Date() }) .where("id", "=", input.id) .returningAll() .executeTakeFirstOrThrow(); if (document.status === "REGISTERED") { const lines = await db .selectFrom("AccountReceivableDocumentLine") .selectAll() .where("accountReceivableDocumentId", "=", input.id) .execute(); const syncResult = await syncSalesOrderBillingStatusFromAccountReceivable( db, { document: cancelledDocument, lines }, ctx, salesCommands, ); if (!syncResult.ok) return syncResult; } return ok({ accountReceivableDocument: cancelledDocument }); }