Skip to content

Plataforma técnica · Orchestrator

Operaciones (RCV SII)

Orchestrator Operaciones Sii

El dominio Operaciones procesa el RCV (Registro de Compras y Ventas) del SII y produce detalle contable auditable. Su responsabilidad es convertir documentos tributarios normalizados — facturas, notas de crédito/débito, boletas — en líneas operacionales clasificadas por concepto contable, listas para ser contabilizadas, pagadas o usadas como base de declaraciones (F29 principalmente).

ServicioResponsabilidad
OperacionesServiceÚnico servicio del dominio. Genera, contabiliza, reversa y consulta detalle operacional.

No hay más servicios en domain/operaciones/. La complejidad del dominio está en la lógica de clasificación (notas de crédito invierten signos, facturas de compra en libro de ventas tratan IVA retenido, IVA no recuperable se separa como gasto, redondeos de 1–2 pesos se ajustan automáticamente), toda concentrada en un solo servicio.

EventoTriggerPayload
venta:contabilizadaOperacionesService.generate con contabilizar_ingresos: true (1 evento por documento marcado){ ventaId, documentoTipo: BOLETA | FACTURA, rutCliente, monto, formaPago }

Catálogo completo en Domain Events. El payload se enriquece con tenantDb, userId, requestId al flush post-COMMIT del outbox transaccional.

flowchart LR
  subgraph IN["Entrada"]
    SII["operaciones_sii.ventas + compras + boletas<br/>(sincronizado upstream desde SII)"]
  end

  subgraph CFG["Configuración (admin)"]
    CC["operaciones_sii.conceptos_operaciones<br/>(catálogo de conceptos)"]
    PCT["administracion.plan_contable<br/>(via ConfigContableService.cuentas)"]
  end

  subgraph SVC["domain/operaciones/"]
    OP["OperacionesService"]
  end

  subgraph OUT["Salida"]
    DET["operaciones_sii.compras_ventas_detalle<br/>(estado: PENDIENTE → CONTABILIZADO → PAGADO)"]
    EVT["DomainEventBus<br/>venta:contabilizada"]
  end

  SII --> OP
  CC --> OP
  PCT -. wiring via ConfigContable .-> OP
  OP --> DET
  OP -. solo si contabilizar_ingresos .-> EVT

Para que OperacionesService.generate funcione, el tenant debe tener:

  1. Plan contable poblado — administrado por ChartOfAccountsService.
  2. Conceptos activos en operaciones_sii.conceptos_operaciones — catálogo seedeado.
  3. Wiring contable opcional vía ConfigContableService si se quiere derivar a asientos definitivos después.

Sin (1) y (2), generate lanza Error('Concepto no encontrado: <codigo>') y aborta el procesamiento.

CasoSigno del monto en compras_ventas_detalle
Factura normal (venta/compra)Positivo.
Nota de crédito (NC)Negativo (revierte).
Nota de débito (ND)Positivo.
IVA no recuperable en NCNegativo.
RedondeoPuede ser positivo o negativo (±1 o ±2).
BoletaPositivo.

Esto permite que SUM(monto) GROUP BY concepto dé el saldo neto del período correctamente sin lógica adicional.