import { createContext, DomainError } from "@tailor-platform/erp-kit/app"; import { createResolver, t } from "@tailor-platform/sdk"; import { getDB } from "@/generated/kysely-tailordb"; import { apModulesExport } from "@/modules"; /** * releaseAccountPayableDocumentHold — release a payment hold on an invoice. * * Registration's 3-way matching can place SYSTEM holds (price/quantity/unit * variance) that block posting. A user reviews and releases them here (MANUAL * holds are released the same way). `id` is the AccountPayableDocumentHold id. */ export default createResolver({ name: "releaseAccountPayableDocumentHold", operation: "mutation", input: { id: t.string().description("Account payable document hold ID"), releaseReason: t.string({ optional: true }).description("Optional reason recorded on release"), }, body: async (context) => { const ctx = createContext(context); const db = getDB("main-db"); return db .transaction() .execute(async (trx) => { const result = await apModulesExport.commands.releaseAccountPayableDocumentHold( trx, { id: context.input.id, releaseReason: context.input.releaseReason ?? undefined }, ctx, ); if (!result.ok) { switch (result.error.code) { case "ACCOUNT_PAYABLE_AP_HOLD_NOT_FOUND": throw new DomainError(`Hold not found: ${context.input.id}`); case "ACCOUNT_PAYABLE_AP_HOLD_ALREADY_RELEASED": throw new DomainError(`Hold has already been released: ${context.input.id}`); case "UNAUTHENTICATED": throw new DomainError("Authentication is required"); case "INSUFFICIENT_PERMISSION": throw new DomainError("You do not have permission to perform this action"); default: throw result.error satisfies never; } } return { id: result.value.accountPayableDocumentHold.id }; }) .catch((err: unknown) => { if (err instanceof DomainError) throw err; throw new Error("Failed to release the account payable document hold", { cause: err }); }); }, output: t .object({ id: t.string().description("Released hold ID"), }) .description("ReleaseAccountPayableDocumentHold response"), });