// modules/invoice/infrastructure/invoice-dependencies.factory.ts import { type ModuleParams, buildTransactionManager } from "@erp/core/api"; import { type GetIssuedInvoiceByIdUseCase, type ListIssuedInvoicesUseCase, type ReportIssuedInvoiceUseCase, buildGetIssuedInvoiceByIdUseCase, buildIssuedInvoiceFinder, buildIssuedInvoiceSnapshotBuilders, buildListIssuedInvoicesUseCase, buildReportIssuedInvoiceUseCase, } from "../../application/issued-invoices"; import { buildIssuedInvoiceDocumentService } from "./documents.di"; import { buildRepository } from "./repositories.di"; export type IssuedInvoicesInternalDeps = { useCases: { listIssuedInvoices: () => ListIssuedInvoicesUseCase; getIssuedInvoiceById: () => GetIssuedInvoiceByIdUseCase; reportIssuedInvoice: () => ReportIssuedInvoiceUseCase; }; }; export function buildIssuedInvoicesDependencies(params: ModuleParams): IssuedInvoicesInternalDeps { const { database, env } = params; // Infrastructure const transactionManager = buildTransactionManager(database); const repository = buildRepository(database); // Application helpers const finder = buildIssuedInvoiceFinder(repository); const snapshotBuilders = buildIssuedInvoiceSnapshotBuilders(); const documentGeneratorPipeline = buildIssuedInvoiceDocumentService(env); // Internal use cases (factories) return { useCases: { listIssuedInvoices: () => buildListIssuedInvoicesUseCase({ finder, itemSnapshotBuilder: snapshotBuilders.list, transactionManager, }), getIssuedInvoiceById: () => buildGetIssuedInvoiceByIdUseCase({ finder, fullSnapshotBuilder: snapshotBuilders.full, transactionManager, }), reportIssuedInvoice: () => buildReportIssuedInvoiceUseCase({ finder, fullSnapshotBuilder: snapshotBuilders.full, reportSnapshotBuilder: snapshotBuilders.report, documentService: documentGeneratorPipeline, transactionManager, }), }, }; }