import { createContext, DomainError } from "@tailor-platform/erp-kit/app"; import { createResolver, t } from "@tailor-platform/sdk"; import { getDB } from "@/generated/kysely-tailordb"; import { salesModulesExport } from "@/modules"; /** * submitSalesOrder — submit a DRAFT order for confirmation (DRAFT → SUBMITTED). Requires a shipping address when a line needs physical fulfillment. */ export default createResolver({ name: "submitSalesOrder", operation: "mutation", input: { id: t.string().description("Sales order ID"), }, body: async (context) => { const ctx = createContext(context); const db = getDB("main-db"); return db .transaction() .execute(async (trx) => { const result = await salesModulesExport.commands.submitSalesOrder( trx, { salesOrderId: context.input.id }, ctx, ); if (!result.ok) { switch (result.error.code) { case "SALES_SALES_ORDER_NOT_FOUND": throw new DomainError(`Sales order not found: ${context.input.id}`); case "SALES_INVALID_ORDER_STATUS": throw new DomainError( `Sales order cannot be submitted in its current status: ${context.input.id}`, ); case "SALES_EMPTY_ORDER_NOT_ALLOWED": throw new DomainError("The order has no lines to submit."); case "SALES_SHIPPING_ADDRESS_REQUIRED": throw new DomainError( "A shipping address is required before submitting an order with physical items.", ); 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.salesOrderId, // A successful transition implies the target status. status: "SUBMITTED", }; }) .catch((err: unknown) => { if (err instanceof DomainError) throw err; throw new Error("Failed to submit the sales order", { cause: err }); }); }, output: t .object({ id: t.string().description("Sales order ID"), status: t.string().description("New document status (SUBMITTED)"), }) .description("SubmitSalesOrder response"), });