Uecko_ERP/modules/customer-invoices/src/api/infrastructure/dependencies.ts

136 lines
4.0 KiB
TypeScript
Raw Normal View History

2025-09-13 18:45:55 +00:00
// modules/invoice/infrastructure/invoice-dependencies.factory.ts
2025-09-12 09:14:27 +00:00
import type { IMapperRegistry, IPresenterRegistry, ModuleParams } from "@erp/core/api";
2025-09-13 18:45:55 +00:00
2025-09-12 09:14:27 +00:00
import {
InMemoryMapperRegistry,
InMemoryPresenterRegistry,
SequelizeTransactionManager,
} from "@erp/core/api";
2025-09-13 18:45:55 +00:00
import {
CreateCustomerInvoiceUseCase,
2025-09-12 16:23:36 +00:00
CustomerInvoiceFullPresenter,
CustomerInvoiceItemsFullPresenter,
CustomerInvoiceReportHTMLPresenter,
CustomerInvoiceReportPDFPresenter,
GetCustomerInvoiceUseCase,
2025-09-12 10:40:52 +00:00
ListCustomerInvoicesPresenter,
ListCustomerInvoicesUseCase,
2025-09-12 09:14:27 +00:00
ReportCustomerInvoiceUseCase,
} from "../application";
2025-09-12 16:23:36 +00:00
2025-09-13 18:45:55 +00:00
import { JsonTaxCatalogProvider, spainTaxCatalogProvider } from "@erp/core";
2025-09-04 17:57:04 +00:00
import { CustomerInvoiceService } from "../domain";
2025-09-13 18:45:55 +00:00
import { CustomerInvoiceDomainMapper, CustomerInvoiceListMapper } from "./mappers";
import { CustomerInvoiceRepository } from "./sequelize";
2025-09-13 18:45:55 +00:00
export type CustomerInvoiceDeps = {
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-09-04 17:57:04 +00:00
service: CustomerInvoiceService;
2025-09-08 17:24:38 +00:00
catalogs: {
taxes: JsonTaxCatalogProvider;
};
build: {
list: () => ListCustomerInvoicesUseCase;
get: () => GetCustomerInvoiceUseCase;
create: () => CreateCustomerInvoiceUseCase;
2025-09-12 16:23:36 +00:00
//update: () => UpdateCustomerInvoiceUseCase;
2025-09-13 18:45:55 +00:00
//delete: () => DeleteCustomerInvoiceUseCase;
2025-09-12 09:14:27 +00:00
report: () => ReportCustomerInvoiceUseCase;
};
};
2025-09-13 18:45:55 +00:00
export function buildCustomerInvoiceDependencies(params: ModuleParams): CustomerInvoiceDeps {
const { database } = params;
const transactionManager = new SequelizeTransactionManager(database);
2025-09-13 18:45:55 +00:00
const catalogs = { taxes: spainTaxCatalogProvider };
2025-09-11 12:05:50 +00:00
2025-09-13 18:45:55 +00:00
// Mapper Registry
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
const repo = new CustomerInvoiceRepository({ mapperRegistry, database });
const service = new CustomerInvoiceService(repo);
2025-09-12 16:23:36 +00:00
2025-09-13 18:45:55 +00:00
// Presenter Registry
const presenterRegistry = new InMemoryPresenterRegistry();
presenterRegistry.registerPresenters([
{
key: {
resource: "customer-invoice-items",
projection: "FULL",
2025-09-12 16:23:36 +00:00
},
2025-09-13 18:45:55 +00:00
presenter: new CustomerInvoiceItemsFullPresenter(presenterRegistry),
},
{
key: {
resource: "customer-invoice",
projection: "FULL",
2025-09-12 16:23:36 +00:00
},
2025-09-13 18:45:55 +00:00
presenter: new CustomerInvoiceFullPresenter(presenterRegistry),
},
{
key: {
resource: "customer-invoice",
projection: "LIST",
},
presenter: new ListCustomerInvoicesPresenter(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),
},
]);
return {
transactionManager,
2025-09-13 18:45:55 +00:00
repo,
mapperRegistry,
presenterRegistry,
service,
catalogs,
build: {
2025-09-13 18:45:55 +00:00
list: () => new ListCustomerInvoicesUseCase(service, transactionManager, presenterRegistry),
get: () => new GetCustomerInvoiceUseCase(service, transactionManager, presenterRegistry),
create: () =>
2025-09-08 17:24:38 +00:00
new CreateCustomerInvoiceUseCase(
2025-09-13 18:45:55 +00:00
service,
transactionManager,
presenterRegistry,
catalogs.taxes
2025-09-08 17:24:38 +00:00
),
2025-09-13 18:45:55 +00:00
// update: () => new UpdateCustomerInvoiceUseCase(service, transactionManager),
// delete: () => new DeleteCustomerInvoiceUseCase(service, transactionManager),
2025-09-12 09:14:27 +00:00
report: () =>
2025-09-13 18:45:55 +00:00
new ReportCustomerInvoiceUseCase(service, transactionManager, presenterRegistry),
},
};
}