import { ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import * as domain from "../domain/accountingPeriod"; import type { CreateAccountingPeriodInput } from "../domain/accountingPeriod"; import type { Transaction } from "../generated/kysely-tailordb"; export type { CreateAccountingPeriodInput } from "../domain/accountingPeriod"; import { createAccountingPeriodRepository, type AccountingPeriodRepository, } from "../repository/accountingPeriodRepository"; import { createFiscalYearRepository, type FiscalYearRepository, } from "../repository/fiscalYearRepository"; export async function run>( db: Transaction, input: CreateAccountingPeriodInput & CF, _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.fiscalYearId); const initial = domain.validateCreation(input, fiscalYear); if (!initial.ok) return initial; const periods = await accountingPeriodRepository.findByFiscalYearId(input.fiscalYearId); const created = domain.create(input, fiscalYear, periods); if (!created.ok) return created; const accountingPeriod = await accountingPeriodRepository.insert(created.value); return ok({ accountingPeriod }); }