import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import { submit, validateSupplier } from "../domain/purchaseOrder"; import type { Transaction } from "../generated/kysely-tailordb"; import { PurchaseOrderNotFoundError } from "../lib/errors.generated"; import type { BusinessPartnerQueries } from "../module"; import { createPurchaseOrderRepository, type PurchaseOrderRepository, } from "../repository/purchaseOrderRepository"; export interface SubmitPurchaseOrderInput { id: string; } export async function run( db: Transaction, input: SubmitPurchaseOrderInput, ctx: CommandContext, supplierAccountQueries: Pick, repositoryFactory: (db: Transaction) => PurchaseOrderRepository = createPurchaseOrderRepository, ) { const repository = repositoryFactory(db); const order = await repository.findById(input.id, { forUpdate: true }); if (!order) { return err(new PurchaseOrderNotFoundError(input.id)); } const submitted = submit(order); if (!submitted.ok) { return submitted; } const { account } = ( await supplierAccountQueries.getSupplierAccount( db, { supplierAccountId: order.header.supplierAccountId }, ctx, ) ).value; const supplier = validateSupplier( order.header.supplierAccountId, order.header.companyId, account, ); if (!supplier.ok) return supplier; await repository.save(submitted.value); return ok({ purchaseOrderId: submitted.value.id }); }