Skip to content

Plataforma técnica · Orchestrator

Servicios de Activo Fijo

Orchestrator Activo Fijo Servicios

El dominio Activo Fijo del Orchestrator se compone de dos servicios que viven en orchestrator/src/domain/activo-fijo/. Comparten la tabla activo_fijo.activos y el catálogo de categorías, pero cada uno tiene su propio repositorio y responsabilidad acotada:

  • ActivoFijoService — alta y mantenimiento de categorías, proveedores clasificados, compras disponibles, activos y la baja. Marca la compra de origen como contabilizada para evitar doble imputación como gasto.
  • DepreciacionService — cálculo de la cuota mensual (lineal con corrección monetaria), persistencia, contabilización del detalle contable, anulación y reverso. Publica el evento de dominio depreciacion:calculada.

Ninguno de los dos servicios contiene la lectura contable (criterios IFRS, ejemplos contables, NIC 16). Esa lectura vive en accounting/activos-fijos/. Ver Activos Fijos · contable.

flowchart LR
  subgraph ROUTES["routes/activo-fijo/"]
    R1["/api/activo-fijo/* (alta, baja, categorías)"]
    R2["/api/activo-fijo/depreciacion (futuro)"]
  end

  subgraph DOMAIN["domain/activo-fijo/"]
    AFS["ActivoFijoService"]
    DS["DepreciacionService"]
    AFR["ActivoFijoRepository"]
    DR["DepreciacionRepository"]
    TYPES["types.ts<br/>(DTOs e interfaces)"]
  end

  subgraph DB["Mother · schema activo_fijo"]
    CAT[("categorias_activo")]
    ACT[("activos")]
    DEP[("depreciacion")]
    DET[("depreciacion_detalle")]
    VIEW[("v_activos_estado_actual")]
  end

  subgraph EXT["Schemas externos consumidos"]
    PC[("administracion.plan_contable")]
    OP[("operaciones_sii.compras_ventas_detalle")]
    CM[("parametros.correccion_monetaria")]
  end

  subgraph EVENTS["domain/common/events"]
    BUS["DomainEventBus"]
  end

  R1 --> AFS
  R2 --> DS

  AFS -.usa.-> AFR
  DS -.usa.-> DR
  DS -.lee activo.-> AFR

  AFR --> CAT
  AFR --> ACT
  AFR --> VIEW
  AFR --> PC
  AFR --> OP

  DR --> DEP
  DR --> DET
  DS --> CM

  DS -- "outbox.queue<br/>'depreciacion:calculada'" --> BUS

Ambos servicios siguen el mismo modelo arquitectónico, definido por BaseService (domain/common/BaseService.ts):

PatrónCómo se aplica aquí
Template MethodBaseService.withTransaction(ctx, fn) provee el esqueleto de manejo transaccional; los servicios sólo pasan el callback. También validateRequired, assertExists, success y failure.
Repository (estático)ActivoFijoRepository y DepreciacionRepository exponen sólo métodos static async que reciben pool | client como primer parámetro. Sin instancias ni inyección.
Transactional OutboxCada withTransaction recibe un TxOutbox. Los servicios encolan eventos durante la TX y se emiten al DomainEventBus sólo después del COMMIT. ROLLBACK descarta la cola — cero efectos fantasma.
Observer (vía DomainEventBus)DepreciacionService.generar publica depreciacion:calculada. Otros dominios pueden suscribirse sin acoplarse al servicio.
SnapshotEl alta de activo copia vida_util_anos y dep_acelerada_anos desde la categoría. Cambios futuros a la categoría no reescriben la contabilidad de activos ya registrados.

Strategy, Builder, Decorator, Factory y Singleton no aplican explícitamente en este dominio.

types.ts define las interfaces que cruzan el borde HTTP. Las más relevantes:

TipoUso
CategoriaActivoCategoría con sus tres cuentas (activo, dep. acumulada, gasto dep.), vida útil normal y acelerada, y la clasificación SII.
ActivoFijoBien individual con su snapshot de vida útil; monto_depreciable es columna generada (monto_neto - valor_residual).
DepreciacionEntryCuota mensual con cm_factor y cm_mes_origen para trazabilidad de corrección monetaria.
DepreciacionDetalleEntryLínea contable de un asiento de depreciación (CUOTA_DEP, CM_ACTIVO, CM_DEP_ACUM).
CompraDisponibleLínea de operaciones_sii.compras_ventas_detalle candidata a generar un activo fijo.
ActivoEstadoActualVista materializada (v_activos_estado_actual) con depreciación acumulada, valor libro y porcentaje depreciado.