import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import * as domain from "../domain/fiscalYear"; import type { Transaction } from "../generated/kysely-tailordb"; import { FiscalYearNotFoundError } from "../lib/errors.generated"; import { createAccountingPeriodRepository, type AccountingPeriodRepository, } from "../repository/accountingPeriodRepository"; import { createFiscalYearRepository, type FiscalYearRepository, } from "../repository/fiscalYearRepository"; export interface DeleteFiscalYearInput { id: string; } export async function run( db: Transaction, input: DeleteFiscalYearInput, _ctx: CommandContext, fiscalYearRepositoryFactory: ( db: Transaction, ) => FiscalYearRepository = createFiscalYearRepository, accountingPeriodRepositoryFactory: ( db: Transaction, ) => AccountingPeriodRepository = createAccountingPeriodRepository, ) { const fiscalYearRepository = fiscalYearRepositoryFactory(db); const accountingPeriodRepository = accountingPeriodRepositoryFactory(db); const fiscalYear = await fiscalYearRepository.findById(input.id, { forUpdate: true }); if (!fiscalYear) return err(new FiscalYearNotFoundError(input.id)); const allowed = domain.checkDeletable( input.id, await accountingPeriodRepository.hasFiscalYearPeriods(input.id), ); if (!allowed.ok) return allowed; await fiscalYearRepository.delete(input.id); return ok({ deleted: true }); }