// modules/invoice/infrastructure/invoice-dependencies.factory.ts import { type JsonTaxCatalogProvider, SpainTaxCatalogProvider } from "@erp/core"; import type { IMapperRegistry, IPresenterRegistry, ModuleParams } from "@erp/core/api"; import { InMemoryMapperRegistry, InMemoryPresenterRegistry, SequelizeTransactionManager, } from "@erp/core/api"; import { ChangeStatusProformaUseCase, CreateProformaUseCase, CustomerInvoiceApplicationService, CustomerInvoiceFullPresenter, CustomerInvoiceItemsFullPresenter, CustomerInvoiceItemsReportPersenter, CustomerInvoiceReportHTMLPresenter, CustomerInvoiceReportPDFPresenter, CustomerInvoiceReportPresenter, CustomerInvoiceTaxesReportPresenter, DeleteProformaUseCase, GetProformaUseCase, IssueProformaInvoiceUseCase, ListCustomerInvoicesPresenter, ListProformasUseCase, RecipientInvoiceFullPresenter, ReportProformaUseCase, UpdateProformaUseCase, } from "../application"; import { CustomerInvoiceDomainMapper, CustomerInvoiceListMapper } from "./mappers"; import { CustomerInvoiceRepository } from "./sequelize"; import { SequelizeInvoiceNumberGenerator } from "./services"; export type CustomerInvoiceDeps = { transactionManager: SequelizeTransactionManager; mapperRegistry: IMapperRegistry; presenterRegistry: IPresenterRegistry; repo: CustomerInvoiceRepository; appService: CustomerInvoiceApplicationService; catalogs: { taxes: JsonTaxCatalogProvider; }; useCases: { list_proformas: () => ListProformasUseCase; get_proforma: () => GetProformaUseCase; create_proforma: () => CreateProformaUseCase; update_proforma: () => UpdateProformaUseCase; delete_proforma: () => DeleteProformaUseCase; report_proforma: () => ReportProformaUseCase; issue_proforma: () => IssueProformaInvoiceUseCase; changeStatus_proforma: () => ChangeStatusProformaUseCase; }; }; export function buildCustomerInvoiceDependencies(params: ModuleParams): CustomerInvoiceDeps { const { database } = params; /** Dominio */ const catalogs = { taxes: SpainTaxCatalogProvider() }; /** Infraestructura */ const transactionManager = new SequelizeTransactionManager(database); const mapperRegistry = new InMemoryMapperRegistry(); mapperRegistry .registerDomainMapper( { resource: "customer-invoice" }, new CustomerInvoiceDomainMapper({ taxCatalog: catalogs.taxes }) ) .registerQueryMappers([ { key: { resource: "customer-invoice", query: "LIST" }, mapper: new CustomerInvoiceListMapper(), }, ]); // Repository & Services const repository = new CustomerInvoiceRepository({ mapperRegistry, database }); const numberGenerator = new SequelizeInvoiceNumberGenerator(); /** Aplicación */ const appService = new CustomerInvoiceApplicationService(repository, numberGenerator); // Presenter Registry const presenterRegistry = new InMemoryPresenterRegistry(); presenterRegistry.registerPresenters([ { key: { resource: "customer-invoice-items", projection: "FULL" }, presenter: new CustomerInvoiceItemsFullPresenter(presenterRegistry), }, { key: { resource: "recipient-invoice", projection: "FULL" }, presenter: new RecipientInvoiceFullPresenter(presenterRegistry), }, { key: { resource: "customer-invoice", projection: "FULL" }, presenter: new CustomerInvoiceFullPresenter(presenterRegistry), }, { key: { resource: "customer-invoice", projection: "LIST" }, presenter: new ListCustomerInvoicesPresenter(presenterRegistry), }, { key: { resource: "customer-invoice", projection: "REPORT", format: "JSON" }, presenter: new CustomerInvoiceReportPresenter(presenterRegistry), }, { key: { resource: "customer-invoice-taxes", projection: "REPORT", format: "JSON" }, presenter: new CustomerInvoiceTaxesReportPresenter(presenterRegistry), }, { key: { resource: "customer-invoice-items", projection: "REPORT", format: "JSON" }, presenter: new CustomerInvoiceItemsReportPersenter(presenterRegistry), }, { key: { resource: "customer-invoice", projection: "REPORT", format: "HTML" }, presenter: new CustomerInvoiceReportHTMLPresenter(presenterRegistry), }, { key: { resource: "customer-invoice", projection: "REPORT", format: "PDF" }, presenter: new CustomerInvoiceReportPDFPresenter(presenterRegistry), }, ]); const useCases: CustomerInvoiceDeps["useCases"] = { list_proformas: () => new ListProformasUseCase(appService, transactionManager, presenterRegistry), get_proforma: () => new GetProformaUseCase(appService, transactionManager, presenterRegistry), create_proforma: () => new CreateProformaUseCase(appService, transactionManager, presenterRegistry, catalogs.taxes), update_proforma: () => new UpdateProformaUseCase(appService, transactionManager, presenterRegistry), delete_proforma: () => new DeleteProformaUseCase(appService, transactionManager), report_proforma: () => new ReportProformaUseCase(appService, transactionManager, presenterRegistry), issue_proforma: () => new IssueProformaInvoiceUseCase(appService, transactionManager, presenterRegistry), changeStatus_proforma: () => new ChangeStatusProformaUseCase(appService, transactionManager), }; return { transactionManager, repo: repository, mapperRegistry, presenterRegistry, appService, catalogs, useCases, }; }