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
|
|
|
|
2025-08-14 14:58:13 +00:00
|
|
|
import {
|
2025-11-11 18:57:04 +00:00
|
|
|
ChangeStatusProformaUseCase,
|
|
|
|
|
CreateProformaUseCase,
|
2025-11-05 17:19:33 +00:00
|
|
|
CustomerInvoiceApplicationService,
|
2025-09-12 16:23:36 +00:00
|
|
|
CustomerInvoiceFullPresenter,
|
|
|
|
|
CustomerInvoiceItemsFullPresenter,
|
2025-11-05 17:19:33 +00:00
|
|
|
CustomerInvoiceItemsReportPersenter,
|
2025-09-12 16:23:36 +00:00
|
|
|
CustomerInvoiceReportHTMLPresenter,
|
|
|
|
|
CustomerInvoiceReportPDFPresenter,
|
2025-09-18 08:49:32 +00:00
|
|
|
CustomerInvoiceReportPresenter,
|
2025-11-12 10:53:56 +00:00
|
|
|
CustomerInvoiceTaxesReportPresenter,
|
2025-11-12 14:48:57 +00:00
|
|
|
DeleteProformaUseCase,
|
2025-11-11 18:57:04 +00:00
|
|
|
GetProformaUseCase,
|
|
|
|
|
IssueProformaInvoiceUseCase,
|
2025-09-12 10:40:52 +00:00
|
|
|
ListCustomerInvoicesPresenter,
|
2025-11-11 18:57:04 +00:00
|
|
|
ListProformasUseCase,
|
2025-09-17 17:37:41 +00:00
|
|
|
RecipientInvoiceFullPresenter,
|
2025-11-11 18:57:04 +00:00
|
|
|
ReportProformaUseCase,
|
2025-11-12 14:48:57 +00:00
|
|
|
UpdateProformaUseCase,
|
2025-08-14 14:58:13 +00:00
|
|
|
} from "../application";
|
2025-11-11 18:57:04 +00:00
|
|
|
|
2025-09-13 18:45:55 +00:00
|
|
|
import { CustomerInvoiceDomainMapper, CustomerInvoiceListMapper } from "./mappers";
|
2025-08-14 14:58:13 +00:00
|
|
|
import { CustomerInvoiceRepository } from "./sequelize";
|
2025-11-05 17:19:33 +00:00
|
|
|
import { SequelizeInvoiceNumberGenerator } from "./services";
|
2025-08-14 14:58:13 +00:00
|
|
|
|
2025-09-13 18:45:55 +00:00
|
|
|
export type CustomerInvoiceDeps = {
|
2025-08-14 14:58:13 +00:00
|
|
|
transactionManager: SequelizeTransactionManager;
|
2025-09-11 12:05:50 +00:00
|
|
|
mapperRegistry: IMapperRegistry;
|
2025-09-12 10:40:52 +00:00
|
|
|
presenterRegistry: IPresenterRegistry;
|
2025-08-14 14:58:13 +00:00
|
|
|
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;
|
|
|
|
|
issue_proforma: () => IssueProformaInvoiceUseCase;
|
|
|
|
|
changeStatus_proforma: () => ChangeStatusProformaUseCase;
|
2025-08-14 14:58:13 +00:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2025-09-13 18:45:55 +00:00
|
|
|
export function buildCustomerInvoiceDependencies(params: ModuleParams): CustomerInvoiceDeps {
|
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 });
|
2025-11-05 17:19:33 +00:00
|
|
|
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-07 17:51:18 +00:00
|
|
|
key: { resource: "customer-invoice-items", projection: "FULL" },
|
2025-09-13 18:45:55 +00:00
|
|
|
presenter: new CustomerInvoiceItemsFullPresenter(presenterRegistry),
|
|
|
|
|
},
|
2025-09-17 17:37:41 +00:00
|
|
|
{
|
2025-11-07 17:51:18 +00:00
|
|
|
key: { resource: "recipient-invoice", projection: "FULL" },
|
2025-09-17 17:37:41 +00:00
|
|
|
presenter: new RecipientInvoiceFullPresenter(presenterRegistry),
|
|
|
|
|
},
|
2025-09-13 18:45:55 +00:00
|
|
|
{
|
2025-11-07 17:51:18 +00:00
|
|
|
key: { resource: "customer-invoice", projection: "FULL" },
|
2025-09-13 18:45:55 +00:00
|
|
|
presenter: new CustomerInvoiceFullPresenter(presenterRegistry),
|
|
|
|
|
},
|
|
|
|
|
{
|
2025-11-07 17:51:18 +00:00
|
|
|
key: { resource: "customer-invoice", projection: "LIST" },
|
2025-09-13 18:45:55 +00:00
|
|
|
presenter: new ListCustomerInvoicesPresenter(presenterRegistry),
|
|
|
|
|
},
|
2025-09-18 08:49:32 +00:00
|
|
|
{
|
2025-11-07 17:51:18 +00:00
|
|
|
key: { resource: "customer-invoice", projection: "REPORT", format: "JSON" },
|
2025-09-18 08:49:32 +00:00
|
|
|
presenter: new CustomerInvoiceReportPresenter(presenterRegistry),
|
|
|
|
|
},
|
2025-11-12 10:53:56 +00:00
|
|
|
{
|
|
|
|
|
key: { resource: "customer-invoice-taxes", projection: "REPORT", format: "JSON" },
|
|
|
|
|
presenter: new CustomerInvoiceTaxesReportPresenter(presenterRegistry),
|
|
|
|
|
},
|
2025-09-18 11:17:18 +00:00
|
|
|
{
|
2025-11-07 17:51:18 +00:00
|
|
|
key: { resource: "customer-invoice-items", projection: "REPORT", format: "JSON" },
|
2025-09-18 11:17:18 +00:00
|
|
|
presenter: new CustomerInvoiceItemsReportPersenter(presenterRegistry),
|
|
|
|
|
},
|
2025-09-13 18:45:55 +00:00
|
|
|
{
|
2025-11-07 17:51:18 +00:00
|
|
|
key: { resource: "customer-invoice", projection: "REPORT", format: "HTML" },
|
2025-09-13 18:45:55 +00:00
|
|
|
presenter: new CustomerInvoiceReportHTMLPresenter(presenterRegistry),
|
|
|
|
|
},
|
|
|
|
|
{
|
2025-11-07 17:51:18 +00:00
|
|
|
key: { resource: "customer-invoice", projection: "REPORT", format: "PDF" },
|
2025-09-13 18:45:55 +00:00
|
|
|
presenter: new CustomerInvoiceReportPDFPresenter(presenterRegistry),
|
|
|
|
|
},
|
|
|
|
|
]);
|
2025-08-14 14:58:13 +00:00
|
|
|
|
2025-11-12 14:48:57 +00:00
|
|
|
const useCases: CustomerInvoiceDeps["useCases"] = {
|
|
|
|
|
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: () =>
|
|
|
|
|
new IssueProformaInvoiceUseCase(appService, transactionManager, presenterRegistry),
|
|
|
|
|
changeStatus_proforma: () => new ChangeStatusProformaUseCase(appService, transactionManager),
|
2025-11-07 17:51:18 +00:00
|
|
|
};
|
|
|
|
|
|
2025-08-14 14:58:13 +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,
|
2025-08-14 14:58:13 +00:00
|
|
|
};
|
|
|
|
|
}
|