import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import type { Transaction } from "../generated/kysely-tailordb"; import { ItemNotSellableError } from "../lib/errors.generated"; import { createSalesItemRepository, type SalesItemRepository, } from "../repository/salesItemRepository"; export interface DeleteSalesItemInput { itemId: string; } export async function run( db: Transaction, input: DeleteSalesItemInput, _ctx: CommandContext, repositoryFactory: (db: Transaction) => SalesItemRepository = createSalesItemRepository, ) { const repository = repositoryFactory(db); const salesItem = await repository.findByItemId(input.itemId, { forUpdate: true }); if (!salesItem) { return err(new ItemNotSellableError(input.itemId)); } // Sales orders reference the item, not this record, so withdrawing the // adoption leaves ordered documents fulfillable and billable. await repository.deleteByItemId(input.itemId); return ok({ salesItemId: salesItem.id }); }