import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import type { Transaction } from "../generated/kysely-tailordb"; import { ItemNotPurchasableError } from "../lib/errors.generated"; import { createPurchaseItemRepository, type PurchaseItemRepository, } from "../repository/purchaseItemRepository"; export interface DeletePurchaseItemInput { itemId: string; } export async function run( db: Transaction, input: DeletePurchaseItemInput, _ctx: CommandContext, repositoryFactory: (db: Transaction) => PurchaseItemRepository = createPurchaseItemRepository, ) { const repository = repositoryFactory(db); const purchaseItem = await repository.findByItemId(input.itemId, { forUpdate: true }); if (!purchaseItem) { return err(new ItemNotPurchasableError(input.itemId)); } // Purchase orders reference the item, not this record, so withdrawing the // adoption leaves ordered documents receivable and billable. await repository.deleteByItemId(input.itemId); return ok({ purchaseItemId: purchaseItem.id }); }