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

147 lines
4.5 KiB
TypeScript
Raw Normal View History

2025-09-08 17:24:38 +00:00
import { 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";
import {
CreateCustomerInvoiceUseCase,
2025-09-12 16:23:36 +00:00
CustomerInvoiceFullPresenter,
CustomerInvoiceItemsFullPresenter,
CustomerInvoiceReportHTMLPresenter,
CustomerInvoiceReportPDFPresenter,
DeleteCustomerInvoiceUseCase,
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-04 17:57:04 +00:00
import { CustomerInvoiceService } from "../domain";
2025-09-11 12:05:50 +00:00
import { CustomerInvoiceFullMapper, CustomerInvoiceListMapper } from "./mappers";
import { CustomerInvoiceRepository } from "./sequelize";
type InvoiceDeps = {
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;
delete: () => DeleteCustomerInvoiceUseCase;
2025-09-12 09:14:27 +00:00
report: () => ReportCustomerInvoiceUseCase;
};
};
2025-09-12 09:14:27 +00:00
let _presenterRegistry: IPresenterRegistry | null = null;
2025-09-11 12:05:50 +00:00
let _mapperRegistry: IMapperRegistry | null = null;
2025-09-12 09:14:27 +00:00
let _repo: CustomerInvoiceRepository | null = null;
2025-09-04 17:57:04 +00:00
let _service: CustomerInvoiceService | null = null;
2025-09-08 17:24:38 +00:00
let _catalogs: InvoiceDeps["catalogs"] | null = null;
export function getInvoiceDependencies(params: ModuleParams): InvoiceDeps {
const { database } = params;
const transactionManager = new SequelizeTransactionManager(database);
2025-09-09 18:13:54 +00:00
if (!_catalogs) _catalogs = { taxes: spainTaxCatalogProvider };
2025-09-11 12:05:50 +00:00
if (!_mapperRegistry) {
_mapperRegistry = new InMemoryMapperRegistry();
2025-09-12 09:14:27 +00:00
_mapperRegistry.registerDomainMapper(
"FULL",
new CustomerInvoiceFullMapper({
taxCatalog: _catalogs!.taxes,
})
);
_mapperRegistry.registerReadModelMapper("LIST", new CustomerInvoiceListMapper());
2025-09-11 12:05:50 +00:00
}
if (!_repo) _repo = new CustomerInvoiceRepository({ mapperRegistry: _mapperRegistry, database });
if (!_service) _service = new CustomerInvoiceService(_repo);
2025-09-12 09:14:27 +00:00
if (!_presenterRegistry) {
_presenterRegistry = new InMemoryPresenterRegistry();
2025-09-12 16:23:36 +00:00
_presenterRegistry.registerPresenters([
2025-09-12 10:40:52 +00:00
{
2025-09-12 16:23:36 +00:00
key: {
resource: "customer-invoice-items",
projection: "FULL",
},
presenter: new CustomerInvoiceItemsFullPresenter(_presenterRegistry),
2025-09-12 10:40:52 +00:00
},
2025-09-12 16:23:36 +00:00
{
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: "HTML",
},
presenter: new CustomerInvoiceReportHTMLPresenter(_presenterRegistry),
},
{
key: {
resource: "customer-invoice",
projection: "REPORT",
format: "PDF",
},
presenter: new CustomerInvoiceReportPDFPresenter(_presenterRegistry),
},
]);
}
return {
transactionManager,
repo: _repo,
2025-09-11 12:05:50 +00:00
mapperRegistry: _mapperRegistry,
2025-09-12 10:40:52 +00:00
presenterRegistry: _presenterRegistry,
service: _service,
2025-09-08 17:24:38 +00:00
catalogs: _catalogs,
2025-09-12 10:40:52 +00:00
build: {
list: () =>
2025-09-12 16:23:36 +00:00
new ListCustomerInvoicesUseCase(_service!, transactionManager!, _presenterRegistry!),
get: () => new GetCustomerInvoiceUseCase(_service!, transactionManager!, _presenterRegistry!),
create: () =>
2025-09-08 17:24:38 +00:00
new CreateCustomerInvoiceUseCase(
_service!,
transactionManager!,
2025-09-12 16:23:36 +00:00
_presenterRegistry!,
2025-09-08 17:24:38 +00:00
_catalogs!.taxes
),
2025-09-12 16:23:36 +00:00
/*update: () =>
2025-09-09 18:13:54 +00:00
new UpdateCustomerInvoiceUseCase(
_service!,
transactionManager!,
2025-09-12 16:23:36 +00:00
_presenterRegistry!,
2025-09-09 18:13:54 +00:00
_catalogs!.taxes
2025-09-12 16:23:36 +00:00
),*/
delete: () => new DeleteCustomerInvoiceUseCase(_service!, transactionManager!),
2025-09-12 09:14:27 +00:00
report: () =>
2025-09-12 16:23:36 +00:00
new ReportCustomerInvoiceUseCase(_service!, transactionManager!, _presenterRegistry!),
},
};
}