import { ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import { adopt } from "../domain/purchaseItem"; import type { Transaction } from "../generated/kysely-tailordb"; import type { ItemManagementQueries } from "../module"; import { createPurchaseItemRepository, type PurchaseItemRepository, } from "../repository/purchaseItemRepository"; export interface CreatePurchaseItemInput { itemId: string; requiresPhysicalReceipt: boolean; } export async function run>( db: Transaction, input: CreatePurchaseItemInput & CF, ctx: CommandContext, itemManagementQueries: Pick, repositoryFactory: (db: Transaction) => PurchaseItemRepository = createPurchaseItemRepository, ) { const { itemId, requiresPhysicalReceipt, ...customFields } = input; const repository = repositoryFactory(db); const existingRecord = await repository.findByItemId(itemId, { forUpdate: true }); const { item } = (await itemManagementQueries.getItem(db, { id: itemId }, ctx)).value; const adopted = adopt( { itemId, requiresPhysicalReceipt, customFields }, { item, existingRecord }, ); if (!adopted.ok) { return adopted; } await repository.save(adopted.value); return ok({ purchaseItemId: adopted.value.id }); }