Uecko_ERP/modules/customer-invoices/src/api/infrastructure/dependencies.ts
2025-11-12 15:48:57 +01:00

153 lines
5.4 KiB
TypeScript

// 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,
};
}