import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import * as domain from "../domain/fiscalYear"; import type { CreateFiscalYearInput } from "../domain/fiscalYear"; import type { Transaction } from "../generated/kysely-tailordb"; export type { CreateFiscalYearInput } from "../domain/fiscalYear"; import { OverlappingFiscalYearError } from "../lib/errors.generated"; import type { OrganizationQueries } from "../module"; import { createFiscalYearRepository, type FiscalYearRepository, } from "../repository/fiscalYearRepository"; export async function run>( db: Transaction, input: CreateFiscalYearInput & CF, ctx: CommandContext, organizationQueries: Pick, fiscalYearRepositoryFactory: ( db: Transaction, ) => FiscalYearRepository = createFiscalYearRepository, ) { const fiscalYearRepository = fiscalYearRepositoryFactory(db); const { company } = (await organizationQueries.getCompany(db, { id: input.companyId }, ctx)) .value; const created = domain.create(input, { companyExists: !!company }); if (!created.ok) return created; const overlapping = await fiscalYearRepository.findOverlapping( input.companyId, input.startDate, input.endDate, ); if (overlapping) return err(new OverlappingFiscalYearError(input.companyId)); const fiscalYear = await fiscalYearRepository.insert(created.value); return ok({ fiscalYear }); }