Skip to content

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.

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:

Acceso directo vs facade
// 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 StockService
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:

Patrón de delegación
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
}
SubdominioService delegadoMétodos de la fachada
CategoríasCategoriasExistenciaServicegetCategorias, createCategoria, updateCategoria, deleteCategoria.
ExistenciasExistenciasServicegetExistencias, getExistenciaById, createExistencia, updateExistencia, eliminarExistencia, getResumenExistencias.
StockStockServicegetStockActual, actualizarEstadoStock, eliminarStockMovimiento, getMovimientos, registrarEntrada, ajustarSaldoInventario, getSaldoStockMensual, procesarSaldoStock, reversarSaldoStock.
ComprasComprasInventarioServicegetComprasExistencias, procesarCompraExistencia, getComprasDetallePendientes, eliminarCompraDetalle, eliminarComprasDetalleByProveedor, generarExistenciasPorProveedor, getComprasContabilizadas, getComprasContabilizadasDetalle, procesarCompraIngresoCategoria, reversarCompraIngreso.
Costo ventasCostoVentasServicegetCostoVentas, getCostoVentasCierre, crearCostoVentasCierre, eliminarCostoVentasCierre, actualizarEstadoCostoVentasCierre, calcularCostoVentas, reversarCostoVentas.
ProvisionesProvisionesInventarioServicegetProvisionesExistenciasCierre, crearProvisionExistenciaCierre, actualizarEstadoProvisionExistenciaCierre, eliminarProvisionExistenciaCierre, getProvisionAjusteCandidatos, getProvisionAjustesCierre, contabilizarProvisionAjustesCierre, reversarProvisionAjustesCierre.
ProveedoresProveedoresClasificacionServicegetProveedoresExistencias, getAllProveedoresClasificacion, getProveedoresPendientesDesdeCompras, createProveedorClasificacion, updateProveedorClasificacion, deleteProveedorClasificacion.

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.

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).