FactuGES_ERP/modules/customer-invoices/src/api/infrastructure/proformas-dependencies.ts

161 lines
5.5 KiB
TypeScript
Raw Normal View History

2025-09-13 18:45:55 +00:00
// modules/invoice/infrastructure/invoice-dependencies.factory.ts
2025-11-11 18:57:04 +00:00
import { type JsonTaxCatalogProvider, SpainTaxCatalogProvider } from "@erp/core";
2025-09-12 09:14:27 +00:00
import type { IMapperRegistry, IPresenterRegistry, ModuleParams } from "@erp/core/api";
import {
InMemoryMapperRegistry,
InMemoryPresenterRegistry,
SequelizeTransactionManager,
} from "@erp/core/api";
2025-11-11 18:57:04 +00:00
import {
2025-11-11 18:57:04 +00:00
ChangeStatusProformaUseCase,
CreateProformaUseCase,
CustomerInvoiceApplicationService,
2025-11-12 14:48:57 +00:00
DeleteProformaUseCase,
2025-11-11 18:57:04 +00:00
GetProformaUseCase,
2025-11-16 19:30:11 +00:00
IssueProformaUseCase,
2025-11-11 18:57:04 +00:00
ListProformasUseCase,
2025-11-17 17:20:18 +00:00
ProformaFullPresenter,
ProformaListPresenter,
ProformaReportHTMLPresenter,
ProformaReportPDFPresenter,
2025-11-11 18:57:04 +00:00
ReportProformaUseCase,
2025-11-12 14:48:57 +00:00
UpdateProformaUseCase,
} from "../application";
2025-11-17 17:20:18 +00:00
import { ProformaItemsFullPresenter } from "../application/presenters/domain/proformas/proforma-items.full.presenter";
import { ProformaRecipientFullPresenter } from "../application/presenters/domain/proformas/proforma-recipient.full.presenter";
import {
IssuedInvoiceTaxesReportPresenter,
ProformaItemsReportPresenter,
ProformaReportPresenter,
} from "../application/presenters/reports";
2025-11-11 18:57:04 +00:00
2025-09-13 18:45:55 +00:00
import { CustomerInvoiceDomainMapper, CustomerInvoiceListMapper } from "./mappers";
import { CustomerInvoiceRepository } from "./sequelize";
import { SequelizeInvoiceNumberGenerator } from "./services";
2025-11-17 17:20:18 +00:00
export type ProformasDeps = {
transactionManager: SequelizeTransactionManager;
2025-09-11 12:05:50 +00:00
mapperRegistry: IMapperRegistry;
2025-09-12 10:40:52 +00:00
presenterRegistry: IPresenterRegistry;
repo: CustomerInvoiceRepository;
2025-11-07 17:51:18 +00:00
appService: CustomerInvoiceApplicationService;
2025-09-08 17:24:38 +00:00
catalogs: {
taxes: JsonTaxCatalogProvider;
};
2025-11-07 17:51:18 +00:00
useCases: {
2025-11-12 14:48:57 +00:00
list_proformas: () => ListProformasUseCase;
get_proforma: () => GetProformaUseCase;
create_proforma: () => CreateProformaUseCase;
update_proforma: () => UpdateProformaUseCase;
delete_proforma: () => DeleteProformaUseCase;
report_proforma: () => ReportProformaUseCase;
2025-11-16 19:30:11 +00:00
issue_proforma: () => IssueProformaUseCase;
2025-11-12 14:48:57 +00:00
changeStatus_proforma: () => ChangeStatusProformaUseCase;
};
};
2025-11-17 17:20:18 +00:00
export function buildProformasDependencies(params: ModuleParams): ProformasDeps {
2025-11-07 17:51:18 +00:00
const { database } = params;
/** Dominio */
2025-10-08 13:11:26 +00:00
const catalogs = { taxes: SpainTaxCatalogProvider() };
2025-09-11 12:05:50 +00:00
2025-11-07 17:51:18 +00:00
/** Infraestructura */
const transactionManager = new SequelizeTransactionManager(database);
2025-09-13 18:45:55 +00:00
const mapperRegistry = new InMemoryMapperRegistry();
mapperRegistry
.registerDomainMapper(
{ resource: "customer-invoice" },
new CustomerInvoiceDomainMapper({ taxCatalog: catalogs.taxes })
)
.registerQueryMappers([
2025-09-12 16:23:36 +00:00
{
2025-09-13 18:45:55 +00:00
key: { resource: "customer-invoice", query: "LIST" },
mapper: new CustomerInvoiceListMapper(),
2025-09-12 16:23:36 +00:00
},
2025-09-13 18:45:55 +00:00
]);
2025-09-12 16:23:36 +00:00
2025-09-13 18:45:55 +00:00
// Repository & Services
2025-11-07 17:51:18 +00:00
const repository = new CustomerInvoiceRepository({ mapperRegistry, database });
const numberGenerator = new SequelizeInvoiceNumberGenerator();
2025-11-07 17:51:18 +00:00
/** Aplicación */
const appService = new CustomerInvoiceApplicationService(repository, numberGenerator);
2025-09-12 16:23:36 +00:00
2025-09-13 18:45:55 +00:00
// Presenter Registry
const presenterRegistry = new InMemoryPresenterRegistry();
presenterRegistry.registerPresenters([
2025-11-17 17:20:18 +00:00
// FULL
2025-09-13 18:45:55 +00:00
{
2025-11-17 17:20:18 +00:00
key: { resource: "proforma-items", projection: "FULL" },
presenter: new ProformaItemsFullPresenter(presenterRegistry),
2025-09-13 18:45:55 +00:00
},
2025-09-17 17:37:41 +00:00
{
2025-11-17 17:20:18 +00:00
key: { resource: "proforma-recipient", projection: "FULL" },
presenter: new ProformaRecipientFullPresenter(presenterRegistry),
2025-09-17 17:37:41 +00:00
},
2025-09-13 18:45:55 +00:00
{
2025-11-17 17:20:18 +00:00
key: { resource: "proforma", projection: "FULL" },
presenter: new ProformaFullPresenter(presenterRegistry),
2025-09-13 18:45:55 +00:00
},
2025-11-17 17:20:18 +00:00
// LIST
2025-09-13 18:45:55 +00:00
{
2025-11-17 17:20:18 +00:00
key: { resource: "proforma", projection: "LIST" },
presenter: new ProformaListPresenter(presenterRegistry),
2025-09-13 18:45:55 +00:00
},
2025-11-17 17:20:18 +00:00
// REPORT
2025-09-18 08:49:32 +00:00
{
2025-11-17 17:20:18 +00:00
key: { resource: "proforma", projection: "REPORT", format: "JSON" },
presenter: new ProformaReportPresenter(presenterRegistry),
2025-09-18 08:49:32 +00:00
},
2025-11-12 10:53:56 +00:00
{
2025-11-17 17:20:18 +00:00
key: { resource: "proforma-taxes", projection: "REPORT", format: "JSON" },
presenter: new IssuedInvoiceTaxesReportPresenter(presenterRegistry),
2025-11-12 10:53:56 +00:00
},
2025-09-18 11:17:18 +00:00
{
2025-11-17 17:20:18 +00:00
key: { resource: "proforma-items", projection: "REPORT", format: "JSON" },
presenter: new ProformaItemsReportPresenter(presenterRegistry),
2025-09-18 11:17:18 +00:00
},
2025-09-13 18:45:55 +00:00
{
2025-11-17 17:20:18 +00:00
key: { resource: "proforma", projection: "REPORT", format: "HTML" },
presenter: new ProformaReportHTMLPresenter(presenterRegistry),
2025-09-13 18:45:55 +00:00
},
{
2025-11-17 17:20:18 +00:00
key: { resource: "proforma", projection: "REPORT", format: "PDF" },
presenter: new ProformaReportPDFPresenter(presenterRegistry),
2025-09-13 18:45:55 +00:00
},
]);
2025-11-17 17:20:18 +00:00
const useCases: ProformasDeps["useCases"] = {
2025-11-14 15:48:09 +00:00
// Proformas
2025-11-12 14:48:57 +00:00
list_proformas: () =>
new ListProformasUseCase(appService, transactionManager, presenterRegistry),
get_proforma: () => new GetProformaUseCase(appService, transactionManager, presenterRegistry),
create_proforma: () =>
2025-11-11 18:57:04 +00:00
new CreateProformaUseCase(appService, transactionManager, presenterRegistry, catalogs.taxes),
2025-11-12 14:48:57 +00:00
update_proforma: () =>
new UpdateProformaUseCase(appService, transactionManager, presenterRegistry),
delete_proforma: () => new DeleteProformaUseCase(appService, transactionManager),
report_proforma: () =>
new ReportProformaUseCase(appService, transactionManager, presenterRegistry),
issue_proforma: () =>
2025-11-16 19:30:11 +00:00
new IssueProformaUseCase(appService, transactionManager, presenterRegistry),
2025-11-12 14:48:57 +00:00
changeStatus_proforma: () => new ChangeStatusProformaUseCase(appService, transactionManager),
2025-11-07 17:51:18 +00:00
};
return {
transactionManager,
2025-11-07 17:51:18 +00:00
repo: repository,
2025-09-13 18:45:55 +00:00
mapperRegistry,
presenterRegistry,
2025-11-07 17:51:18 +00:00
appService,
2025-09-13 18:45:55 +00:00
catalogs,
2025-11-07 17:51:18 +00:00
useCases,
};
}