import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import type { PrimitivesModule } from "../../primitives"; import { updateBankAccount } from "../domain/businessPartner"; import type { Transaction } from "../generated/kysely-tailordb"; import { BankAccountNotFoundError, CurrencyNotFoundError } from "../lib/errors.generated"; import { createBusinessPartnerRepository, type BusinessPartnerRepository, } from "../repository/businessPartnerRepository"; type PrimitivesQueries = PrimitivesModule["queries"]; export type UpdatePartnerBankAccountInput = { id: string; bankName?: string; accountHolderName?: string; accountNumber?: string; routingNumber?: string | null; currencyId?: string; }; /** Updates bank details through their owning BusinessPartner aggregate. */ export async function run>( db: Transaction, input: UpdatePartnerBankAccountInput & Partial, ctx: CommandContext, primitivesQueries?: Pick, repositoryFactory: ( db: Transaction, ) => BusinessPartnerRepository = createBusinessPartnerRepository, ) { const { id, bankName, accountHolderName, accountNumber, routingNumber, currencyId, ...customFields } = input; const repository = repositoryFactory(db); const partner = await repository.findByBankAccountId(id, { forUpdate: true }); if (!partner) return err(new BankAccountNotFoundError(id)); if (currencyId !== undefined && primitivesQueries?.getCurrency) { const currencyResult = await primitivesQueries.getCurrency(db, { id: currencyId }, ctx); if (!currencyResult.ok || !currencyResult.value.currency) { return err(new CurrencyNotFoundError(currencyId)); } } const updated = updateBankAccount(partner, id, { bankName, accountHolderName, accountNumber, routingNumber, currencyId, customFields, }); if (!updated.ok) return updated; await repository.save(updated.value.partner); return ok({ partnerBankAccountId: updated.value.bankAccount.id }); }