Plataforma técnica · Orchestrator
Inventario Service
Orchestrator Inventarios Facade
InventarioService es una fachada delgada (Thin facade) que re-exporta los métodos de los 7 services especializados del dominio inventario. Su único propósito es mantener compatibilidad con rutas HTTP que históricamente importaban desde un solo entry point.
No tiene lógica propia. Cada método delega directamente al subservicio correspondiente.
Por qué existe
Section titled “Por qué existe”Cuando el dominio inventario se dividió en 7 services (cada uno con su Repository), las rutas HTTP en routes/inventario/ ya importaban InventarioService desde su forma monolítica. Para no tocar todos los handlers, se introdujo la fachada — los handlers siguen llamando inventarioService.metodoX(ctx, ...) y la fachada delega al servicio real.
Si escribís código nuevo, prefiere importar el service específico directamente:
// Preferido en código nuevo:import { StockService } from '@/domain/inventario/StockService';const stockService = new StockService();await stockService.registrarEntrada(ctx, dto);
// Funciona también (legacy compat):import { InventarioService } from '@/domain/inventario/InventarioService';const inventarioService = new InventarioService();await inventarioService.registrarEntrada(ctx, dto); // delega a StockServiceEstructura interna
Section titled “Estructura interna”flowchart LR R["routes/inventario/*"] F["InventarioService<br/>(facade)"] CAT["CategoriasExistenciaService"] EXI["ExistenciasService"] STK["StockService"] COM["ComprasInventarioService"] COS["CostoVentasService"] PRO["ProvisionesInventarioService"] PRV["ProveedoresClasificacionService"] R --> F F -. delega .-> CAT & EXI & STK & COM & COS & PRO & PRV
La fachada instancia los 7 services una vez al cargar el módulo (singletons de módulo) y mantiene referencias en const. Cada método de la clase llama directamente al método del subservicio sin lógica adicional:
const stockService = new StockService();const comprasService = new ComprasInventarioService();// ... otros
export class InventarioService extends BaseService {registrarEntrada = (ctx: ServiceContext, data: RegistrarEntradaDTO) => stockService.registrarEntrada(ctx, data);
procesarCompraExistencia = (ctx, compraId, data) => comprasService.procesarCompraExistencia(ctx, compraId, data);
// ... ~50 métodos más}Catálogo de métodos delegados
Section titled “Catálogo de métodos delegados”| Subdominio | Service delegado | Métodos de la fachada |
|---|---|---|
| Categorías | CategoriasExistenciaService | getCategorias, createCategoria, updateCategoria, deleteCategoria. |
| Existencias | ExistenciasService | getExistencias, getExistenciaById, createExistencia, updateExistencia, eliminarExistencia, getResumenExistencias. |
| Stock | StockService | getStockActual, actualizarEstadoStock, eliminarStockMovimiento, getMovimientos, registrarEntrada, ajustarSaldoInventario, getSaldoStockMensual, procesarSaldoStock, reversarSaldoStock. |
| Compras | ComprasInventarioService | getComprasExistencias, procesarCompraExistencia, getComprasDetallePendientes, eliminarCompraDetalle, eliminarComprasDetalleByProveedor, generarExistenciasPorProveedor, getComprasContabilizadas, getComprasContabilizadasDetalle, procesarCompraIngresoCategoria, reversarCompraIngreso. |
| Costo ventas | CostoVentasService | getCostoVentas, getCostoVentasCierre, crearCostoVentasCierre, eliminarCostoVentasCierre, actualizarEstadoCostoVentasCierre, calcularCostoVentas, reversarCostoVentas. |
| Provisiones | ProvisionesInventarioService | getProvisionesExistenciasCierre, crearProvisionExistenciaCierre, actualizarEstadoProvisionExistenciaCierre, eliminarProvisionExistenciaCierre, getProvisionAjusteCandidatos, getProvisionAjustesCierre, contabilizarProvisionAjustesCierre, reversarProvisionAjustesCierre. |
| Proveedores | ProveedoresClasificacionService | getProveedoresExistencias, getAllProveedoresClasificacion, getProveedoresPendientesDesdeCompras, createProveedorClasificacion, updateProveedorClasificacion, deleteProveedorClasificacion. |
Por qué no emite hooks
Section titled “Por qué no emite hooks”La fachada no abre transacciones propias y no encola eventos. Los hooks del dominio (compra_inv:contabilizada, costo:egreso_calculado, existencia:castigada) los emiten los services subyacentes desde sus propias withTransaction(..., (client, outbox) => ...). Cuando llamas un método de la fachada, el outbox vive en el callback del subservicio, no en la fachada.
Cuándo deprecar la fachada
Section titled “Cuándo deprecar la fachada”Cuando los handlers de routes/inventario/ se refactoricen para importar los services específicos directamente, esta fachada puede eliminarse. No vale la pena bloquear progreso por ella — coexiste sin costo (instancia los services al inicio, no agrega latencia).