import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import * as domain from "../domain/accountingPeriod"; import type { Transaction } from "../generated/kysely-tailordb"; import { AccountingPeriodNotFoundError } from "../lib/errors.generated"; import { createAccountingPeriodRepository, type AccountingPeriodRepository, } from "../repository/accountingPeriodRepository"; export interface ClosePeriodInput { id: string; } export async function run( db: Transaction, input: ClosePeriodInput, _ctx: CommandContext, accountingPeriodRepositoryFactory: ( db: Transaction, ) => AccountingPeriodRepository = createAccountingPeriodRepository, ) { const accountingPeriodRepository = accountingPeriodRepositoryFactory(db); const period = await accountingPeriodRepository.findById(input.id, { forUpdate: true }); if (!period) return err(new AccountingPeriodNotFoundError(input.id)); const changed = domain.transition(period, "closePeriod"); if (!changed.ok) return changed; const accountingPeriod = await accountingPeriodRepository.update(input.id, changed.value); return ok({ accountingPeriod }); }