import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import { confirm } from "../domain/salesOrder"; import type { Transaction } from "../generated/kysely-tailordb"; import { SalesOrderNotFoundError } from "../lib/errors.generated"; import type { BusinessPartnerQueries } from "../module"; import { createSalesOrderRepository, type SalesOrderRepository, } from "../repository/salesOrderRepository"; export interface ConfirmSalesOrderInput { salesOrderId: string; } export async function run( db: Transaction, input: ConfirmSalesOrderInput, ctx: CommandContext, businessPartnerQueries: Pick, repositoryFactory: (db: Transaction) => SalesOrderRepository = createSalesOrderRepository, ) { const repository = repositoryFactory(db); const order = await repository.findById(input.salesOrderId, { forUpdate: true }); if (!order) { return err(new SalesOrderNotFoundError(input.salesOrderId)); } const { account: customer } = ( await businessPartnerQueries.getCustomerAccount( db, { customerAccountId: order.header.customerAccountId }, ctx, ) ).value; const confirmed = confirm(order, { customer }); if (!confirmed.ok) { return confirmed; } await repository.save(confirmed.value); return ok({ salesOrderId: confirmed.value.id }); }