Saltar al contenido principal

OnnixConnect OC — Especificación Técnica

Documento base del proyecto — convertido desde docs/docx/OnnixConnect_OC_Especificacion_Tecnica.docx.

Esta es la especificación original que dio origen al proyecto OnnixConnect. Define la arquitectura, flujos, modelo de datos, eventos, observabilidad y roadmap completo del sistema.

Manual de Integración — Sistema SIFEN Paraguay

Nombre en ClaveOnnixConnect OC (OC)
Versión del Documento1.0 — Revisión Inicial
EstadoEn Desarrollo Activo
Tecnología PrincipalPHP 8.5 / Laravel 12 / PostgreSQL
Interfaz de UsuarioAdminLTE 2024 + Livewire v3 + Alpine.js
Panel AdministrativoFilament v3
Área de MonitoreoRedis + Laravel Horizon + Sentry
Responsable TécnicoOnnix Tecnología y Servicios SA
ClasificaciónCONFIDENCIAL — Uso Interno

Onnix Tecnología y Servicios SA — RUC: 80126006-0

https://onnix.com.py | Asunción, Paraguay

1. Introducción y Propósito

El presente documento constituye la especificación técnica oficial del proyecto OnnixConnect OC, un sistema de integración nativo para el Sistema Integrado de Facturación Electrónica Nacional (SIFEN) de la República del Paraguay, administrado por la Dirección Nacional de Ingresos Tributarios (DNIT). OnnixConnect OC reemplaza las implementaciones legadas en Java proyecto (SIFEN) por un ecosistema moderno construido sobre PHP 8.5 y Laravel 12, manteniendo compatibilidad total con los protocolos SOAP y las especificaciones técnicas del Manual Técnico de la DNIT.

#################### 1.1 Alcance del Sistema

  • Generación, firmado digital y envío de Documentos Electrónicos (DE) a la DNIT.

  • Gestión completa del ciclo de vida de comprobantes: creación, aprobación, rechazo, cancelación e inutilización.

  • Procesamiento de lotes masivos de hasta 4.500 comprobantes simultáneos (Tarjetas de Crédito Procard y Bancard).

  • Sincronización automática de estados entre el sistema interno y SIFEN, eliminando la conciliación manual.

  • Panel de monitoreo y control operativo integrado en AdminLTE 2024 con componentes reactivos Livewire v3.

  • Panel administrativo en Filament v3 para gestión de empresas, certificados digitales y configuración del sistema.

#################### 1.2 Definiciones y Acrónimos

TérminoDefinición
SIFENSistema Integrado de Facturación Electrónica Nacional — plataforma oficial de la DNIT
DNITDirección Nacional de Ingresos Tributarios - autoridad tributaria de Paraguay
DE / KuDEDocumento Electrónico / Representación gráfica imprimible del DE
CDCCódigo de Control del DE. Identificador único de 44 dígitos asignado por el emisor
TimbradoNúmero de autorización de impresión otorgado por la SET para un período fiscal
CSCCódigo de Seguridad del Contribuyente — usado para generar el código QR del KuDE
NCRNota de Crédito Electrónica — tipo 5 en la nomenclatura SIFEN
WS / SOAPWeb Service — protocolo de comunicación con los servicios oficiales de la SET
OCOnnixConnect — nombre en clave del presente proyecto
HorizonPanel de administración de colas Redis para Laravel
Livewire v3Framework para componentes reactivos server-side en PHP/Laravel
Filament v3Framework de panel de administración basado en Livewire para Laravel

2. Arquitectura de Integración

OnnixConnect OC implementa una arquitectura de capas desacopladas donde cada capa tiene responsabilidades bien definidas. La comunicación entre el sistema interno y la DNIT fluye a través de servicios PHP especializados que replican y mejoran la funcionalidad de las librerías Java legadas.

#################### 2.1 Capas del Sistema

CapaComponentesResponsabilidad
PresentaciónLivewire v3 + Alpine.js + AdminLTE 2024Interfaces operativas: monitor de lotes, control SIFEN, gestión de errores
AdministraciónFilament v3Configuración de empresas, certificados, usuarios y parámetros del sistema
ControladoresLaravel Controllers (MVC)Enrutamiento HTTP, validación de requests, orquestación de flujos
ServiciosPHP Service ClassesLógica de negocio: generación XML, firmado digital, comunicación SOAP
Colas / JobsLaravel Horizon + RedisProcesamiento asíncrono de lotes masivos y sincronización de estados
PersistenciaPostgreSQL 18 + Eloquent ORMAlmacenamiento de comprobantes, eventos, logs y configuraciones
CachéRedis + Cache TagsEstados de comprobantes con TTL de 30 minutos; progreso de lotes
ObservabilidadSentry + Prometheus + GrafanaTrazabilidad de errores y métricas de rendimiento del WS de la DNIT

#################### 2.2 Componentes Técnicos del Core Criptográfico

El firmado digital, operación crítica y legalmente mandatoria, migra de la implementación Java (javax.xml.crypto.dsig + KeyStore) a PHP puro mediante las siguientes librerías:

Función Java LegacyEquivalente PHP en OCPaquete
KeyStore.load(.p12)openssl_pkcs12_read()PHP nativo — ext-openssl
XML-DSig / RSA-SHA256XMLSecurityDSig + XMLSecurityKeyrobrichards/xmlseclibs 3.x
JAXB Marshalling XMLDOMDocument nativo + spatie/array-to-xmlPHP nativo + Composer
SAAJ SoapClientSoapClient nativo PHPPHP nativo — ext-soap
SifenException hierarchyJerarquía propia + Sentry contextsentry/sentry-laravel
JPA @EntityEloquent Model + MigrationLaravel 12 ORM
Spring SchedulerLaravel Scheduler (cron único)Laravel 12 nativo
ExecutorService (threads)Laravel Horizon + Redis Queueslaravel/horizon

#################### 2.3 Stack Tecnológico Justificado

La elección del stack no es arbitraria. Cada componente fue seleccionado con base en tres criterios: compatibilidad con el ecosistema PHP de Onnix, capacidad de manejo de concurrencia a largo plazo, y facilidad de mantenimiento por equipos Junior o Solo Dev.

TecnologíaVersiónJustificación Técnica
PHP8.5Fibers nativos para concurrencia, JIT mejorado, tipos de intersección y async implícito
Laravel12.xEcosystem maduro: Horizon, Scheduler, Eloquent, Sanctum. Menor curva de aprendizaje vs Spring Boot
PostgreSQL18ACID compliance, JSONB para almacenar respuestas SOAP, particionado por fecha en tablas de alto volumen
Redis7.xDriver de colas de Horizon, caché de estados con TTL, pub/sub para actualizaciones en tiempo real
Livewire v33.xComponentes reactivos sin JavaScript complejo. Polling automático para monitor de lotes
Filament v33.xPanel administrativo con CRUD, subida de certificados .p12 y gestión de roles sin código extra
AdminLTE2024Plantilla Bootstrap estándar compatible con Blade/Livewire. Familiar para operadores de caja
SentrySelf-hostedCaptura de errores de firmado digital con contexto. Los datos no salen del perímetro de la entidad
Prometheus+GrafanaEstableMétricas de latencia del WS de la DNIT, tasa de aprobación y tamaño de colas de Horizon

3. Flujos de Datos

#################### 3.1 Envío Individual — Operaciones Diarias

El envío individual es el flujo estándar para comprobantes generados en tiempo real: facturación de caja, cobro de cuotas de préstamos y facturación manual. El ciclo es sincrónico desde la perspectiva del operador, pero asíncrono internamente gracias a Horizon.

Flujo Técnico — Envío Individual

Usuario inicia comprobante → Controller valida datos → DocumentoElectronicoDTO → XmlGeneradorService genera XML → Validación XSD → XmlFirmadorService firma (RSA-SHA256) → EnviarComprobanteDLJob despachado a cola 'critica' → SifenSoapService llama recepcionDE() → Respuesta almacenada (IdDocumento, CDC, XML, Respuesta) → Estado actualizado en PostgreSQL → Cache tag invalidado → UI Livewire refleja estado en tiempo real.

############################## 3.1.1 Estructura JSON de la Cabecera (Factura Electrónica)

El siguiente mapeo define la estructura del JSON de entrada al sistema OC, derivado del formato real analizado (Factura_Json.json):

Campo JSONTipoDescripciónEjemplo Real
IDFACTURAstringIdentificador único interno del comprobante"24050738"
FECHAdateFecha de emisión (YYYY-MM-DD)"2025-11-07"
NRO1intNúmero de establecimiento (3 dígitos)1
NRO2intNúmero de punto de expedición (3 dígitos)1
NRO3stringNúmero correlativo del comprobante"1427697"
IDCOMPROBANTEintTipo: 1=Fact.Contado, 2=Fact.Crédito, 3=NCR, 5=NCR Elect.1
NROTIMBRADOstringNúmero de timbrado DNIT vigente"16014181"
HORA_EMISIONtimeHora de emisión (HH:MM:SS)"16:08:17"
RUCstringRUC del receptor con dígito verificador"80067095-7"
NOMBREstringRazón social o nombre del receptor"CATHAY SAE"
DIRECCIONstringDirección del receptor"SIN DIRECCION"
EMAILstringCorreo electrónico del receptor para KuDE"jorge.ortiz@timbo.com.py"
CODPAISstringCódigo de país ISO-3166 (PRY por defecto)"PRY"
TOTALGRALdecimalTotal general del comprobante en guaraníes"90393"
IDMEDIOPAGOint1=Efectivo, 2=Cheque, 3=Tarjeta, 4=Transferencia"2"
TCdecimalTipo de cambio (relevante para moneda extranjera)"7710.7"
EXTRANJEROboolIndicador de receptor extranjero (0/1)0
NOCONTRIBUYENTEboolReceptor no contribuyente (0/1)0
ITIPDOCASOint|nullTipo de doc. asociado (para NCR: tipo de factura)null
NRO1R/NRO2R/NRO3Rint|nullNúmero de comprobante referenciado (en NCR)null
NROTIMBRADORstring|nullTimbrado del documento referenciado (en NCR)null
IMOTEMIint|nullMotivo de emisión de NCR (1-8 según normativa DNIT)null
INDINUTILIZADOintIndicador de inutilización previa (0/1)0
INDENVIADOstringEstado de envío: 0=No enviado, 1=Enviado"0"

############################## 3.1.2 Estructura del Detalle (Ítems del Comprobante)

Campo JSONTipoDescripciónEjemplo Real
IDDETALLEFACTURAintNúmero de línea del ítem (secuencial desde 1)1
IDFACTURAintFK — referencia al comprobante padre24050738
CANTIDADintCantidad de unidades del ítem1
DESCRIPCIONstringDescripción del bien o servicio (aparece en KuDE)"Intereses Cuota Prest. 1661008, cuota 13"
PRECIOdecimalPrecio unitario en guaraníes90393
EXENTAdecimalMonto exento de IVA (operaciones exentas)0
IVA5decimalMonto gravado a tasa del 5%0
IVA10decimalMonto gravado a tasa del 10%90393
IDTASAIVAint1=Exenta, 2=IVA 10%, 3=IVA 5%2
IDUNIDADMEDIDAintCódigo de unidad de medida (77=UNI estándar DNIT)77
DESCUENTOdecimalDescuento aplicado al ítem0
CODIGOstring|nullCódigo interno del producto/servicionull
CODBARRAstring|nullCódigo de barras EAN/UPC (opcional)null

############################## 3.1.3 Respuesta del Sistema tras el Envío

Tras la transmisión exitosa, OC registra en la tabla documentos_electronicos los siguientes campos retornados por la DNIT vía el WS de DL Informática:

Campo RespuestaFuenteDescripción
IDDOCUMENTOWS DL / DNITIdentificador numérico asignado por el sistema DL
CDC (44 dígitos)Generado por emisorCódigo de Control único del DE. Formato: RUC(8)+DV(1)+TIPO(2)+ESTAB(3)+PUNEXP(3)+NRODOC(7)+FECHA(8)+CODSEG(9)+DV(1)+TIPOEMISION(1)+DVID(1)
DCODRESDNITCódigo de resultado SIFEN (0260=Aprobado, 0422=Rechazado)
DMSGRESDNITMensaje descriptivo del resultado
XML (completo)Generado por OC+DLXML firmado digitalmente. Incluye firma RSA-SHA256 y namespace http://ekuatia.set.gov.py/sifen/xsd
ESTADODNITAprobado / Rechazado / En Proceso

#################### 3.2 Envío Masivo por Lotes — Tarjetas de Crédito

El proceso masivo de Tarjetas de Crédito (Procard y Bancard) involucra aproximadamente 4.500 comprobantes simultáneos. Su arquitectura es radicalmente diferente al envío individual: debe evitar la saturación del WS externo, proveer visibilidad en tiempo real al operador y garantizar que ningún comprobante quede sin procesar ante fallos parciales.

############################## 3.2.1 Diferencias Fundamentales entre Modos de Envío

CriterioEnvío IndividualEnvío por Lotes (TC)
Volumen típico1 comprobante por operación~4.500 comprobantes por proceso
Origen del procesoAcción del operador en tiempo realArchivo de cierre Procard (E003050T) o período Bancard
Modo de ejecuciónSincrónico (UI espera respuesta)100% asíncrono (Horizon + Redis)
Chunking aplicadoNo aplicaChunks de 50 DEs por job (límite recepcionLoteDE)
Jobs de Horizon1 job por comprobante (cola 'critica')90 jobs de 50 DEs c/u (cola 'lotes')
Monitor en UIEstado actualizado post-respuestaLivewire polling cada 3 segundos (barra de progreso)
Validación duplicadosPor IDFACTURA únicoPor tarjeta + período + documento ('YA EXISTE REGISTRO')
Respuesta al operadorInmediata (< 30 seg)Progresiva (10-15 minutos para 4.500 DEs)
Reintentos ante fallo3 intentos con backoff (30s, 120s, 480s)3 intentos por chunk; chunks fallidos marcados individualmente

############################## 3.2.2 Flujo Técnico del Proceso Masivo

  1. El operador sube el archivo de Procard (E003050T) o selecciona el período de Bancard en la interfaz Livewire.

  2. LoteFacturacionService valida duplicados (tarjeta + período + documento), crea el registro LoteSifen en PostgreSQL y emite el evento de inicio.

  3. Se generan chunks de 50 comprobantes cada uno y se despachan como EnviarChunkSifenJob a la cola de Horizon 'lotes' con 5 workers paralelos.

  4. Cada job procesa su chunk: genera XML → valida XSD → firma RSA-SHA256 → llama recepcionLoteDE() → actualiza estado en PostgreSQL → incrementa progreso en Redis.

  5. El componente MonitorLoteTarjetas de Livewire hace polling cada 3 segundos al hash Redis lote:{id}:progreso y actualiza la barra de progreso sin recargar la página.

  6. Al completarse todos los chunks, el lote pasa a estado COMPLETADO. Los chunks fallidos (después de 3 reintentos) quedan como ERROR_ENVIO y son accesibles desde el panel de Comprobantes Rechazados para reenvío manual.

Nota Técnica — Límite de la DNIT

El WS oficial recepcionLoteDE() de SIFEN acepta un máximo de 50 Documentos Electrónicos por llamada. Por ello, el chunking de 4.500 ÷ 50 = 90 jobs es mandatorio y no configurable. Aumentar el tamaño del chunk por encima de 50 resultará en el error 'Lote no encolado para procesamiento. Se rechazaron todos los DE del lote', error documentado en el sistema actual.

4. Gestión de Eventos — Inutilización y Cancelación

La gestión de eventos es la operación más delicada del sistema desde el punto de vista legal y tributario. Un error en la elección del tipo de evento (Inutilización vs Cancelación) puede resultar en infracciones tributarias ante la DNIT. OnnixConnect OC implementa validaciones estrictas para garantizar que el tipo correcto de evento sea aplicado según el estado actual del DE.

#################### 4.1 Regla de Negocio Fundamental

REGLA CRÍTICA — Distinción entre Inutilización y Cancelación

INUTILIZACIÓN (I): Se aplica EXCLUSIVAMENTE a números de comprobantes que fueron generados localmente pero que NUNCA fueron aprobados por la DNIT. El DE no tiene CDC definitivo de la DNIT. Ejemplo: rangos de números reservados que no se utilizaron. CANCELACIÓN (C): Se aplica EXCLUSIVAMENTE a DEs que YA FUERON APROBADOS por la DNIT (estado APROBADO con CDC completo de 44 dígitos). El motivo es obligatorio y queda registrado en el protocolo de auditoría de la DNIT.

#################### 4.2 Parámetros Técnicos del WS de Eventos

Los eventos se envían al WS de DL Informática mediante la siguiente estructura de URL (Datasnap REST):

http://{servidor}:{puerto}/datasnap/rest/TServerMetodos/eventoDE/{TIPO}/{CDC}/{TIMBRADO}/{ESTAB}/{PEXPEDICION}/{NRODESDE}/{NROHASTA}/{TIPODOC}/{MOTIVO}

############################## 4.2.1 Tabla de Parámetros por Tipo de Evento

ParámetroPosiciónInutilización (I)Cancelación (C)Obligatorio
tipo1I (literal)C (literal)Sí en ambos
cdc2Vacío (//)CDC de 44 dígitos del DE aprobadoSolo en C
timbrado3Ej: 12559938 (número de timbrado)Vacío (//)Solo en I
establecimiento4Ej: 1 (número de establecimiento)Vacío (//)Solo en I
p. expedición5Ej: 3 (punto de expedición)Vacío (//)Solo en I
nrodesde61005 (número inicial del rango a inutilizar)Vacío (//)Solo en I
nrohasta71005 (número final del rango a inutilizar)Vacío (//)Solo en I
tipodoc81=Factura, 4=Autofact, 5=NCR, 6=NDéb, 7=N.Rem.1=Factura, 5=NCR, etc.Sí en ambos
motivo9Texto libre. Mínimo 5 caracteres. Obligatorio.Texto libre. Mínimo 5 caracteres. Obligatorio.Sí en ambos

############################## 4.2.2 Ejemplos de URLs — Ambiente de Pruebas

Inutilización (rango 1005 a 1005, timbrado 12559938, establecimiento 1, punto exp. 3, tipo Factura):

http://10.0.0.242:10000/datasnap/rest/TServerMetodos/eventoDE/I//12559938/1/3/1005/1005/1/PRUEBA DE INUTILIZACION WS

Cancelación (CDC completo del DE aprobado, tipo Factura, motivo de anulación):

http://10.0.0.242:10000/datasnap/rest/TServerMetodos/eventoDE/C/01800262778001001000003222022112214939579665//////1/ANULACION TEST

#################### 4.3 Validaciones Implementadas en OC

ValidaciónReglaError si no cumple
Motivo obligatorioEl campo motivo NUNCA puede estar vacío o tener menos de 5 caracteresError de validación antes de llamar al WS. Equivalente al ORA-20000 del sistema legado
CDC para cancelaciónSi tipo=C, el CDC debe tener exactamente 44 caracteres alfanuméricosRechazo inmediato sin llamar al WS
Estado del DE para CSolo DEs en estado APROBADO pueden cancelarseError de negocio: 'El documento no está aprobado por SIFEN'
Estado del DE para ISolo DEs en estado GENERADO, ERROR o RECHAZADO pueden inutilizarseError de negocio: 'El documento ya fue aprobado. Use Cancelación'
Un evento por tipoUn DE ya cancelado no puede cancelarse nuevamente (código 0360 de DNIT)Verificación previa en tabla eventos antes de llamar al WS
Plazo de cancelaciónLa SET rechaza cancelaciones fuera del plazo legal (código 0380)El sistema advierte si el DE tiene más de 72 horas de emitido

#################### 4.4 Estructura de Respuesta del WS de Eventos

Respuesta exitosa de cancelación (código 0260 = Aprobado):

{

"success": true,

"payload": {

"dCodRes": "0260",

"dMsgRes": "Aprobado",

"gResProcEVe": [{

"id": "01800262778001001..._001",

"dEstRes": "Aprobado",

"dProtAut": "CAN01800262778001001...",

"gResProc": [{ "dCodRes": "0260", "dMsgRes": "Evento de cancelación procesado correctamente" }]

}]

}

}

5. Gestión de Errores y Sincronización de Estados

#################### 5.1 El Problema de Desfase de Estados

El problema central que motivó el diseño de la arquitectura de sincronización de OC es el siguiente: el WS de DL Informática responde inicialmente con el estado 'Registrado con éxito para su envío', pero no actualiza automáticamente el estado local cuando la DNIT finalmente aprueba o rechaza el DE. Esto genera un desfase donde documentos legalmente aprobados permanecen indefinidamente en estado intermedio en la base de datos interna.

Problema Documentado

Estado actual: 'Registrado con éxito para su envío' → Estado correcto: 'APROBADO'. El sistema legado resolvía este desfase descargando manualmente un archivo .txt desde el portal de DL Informática y cargándolo a la base de datos. Este proceso es propenso a errores humanos, introduce latencia de horas o días, y no es escalable para volúmenes de 4.500+ comprobantes mensuales.

#################### 5.2 Solución: Sincronización Automatizada con Laravel Scheduler

OnnixConnect OC elimina completamente el proceso manual mediante un sistema de sincronización automatizada que consume la API de DL Informática cada 30 minutos y actualiza los estados en PostgreSQL, invalidando simultáneamente el caché de Redis para que la UI de Livewire refleje el estado real.

############################## 5.2.1 Tareas Programadas del Scheduler

Tarea (artisan command)FrecuenciaFunción
sifen:sync-estadosCada 30 minutosConsulta estados en DL, actualiza PostgreSQL, invalida Cache Tags Redis
sifen:verificar-pendientesCada horaDetecta DEs con más de 60 min en estado 'Registrado' y reencola para verificación
sifen:reporte-diarioDiariamente 23:30Genera resumen: aprobados, rechazados, pendientes y errores por tipo
sifen:limpiar-cache-expiradoSemanal (domingo 02:00)Limpia entradas Redis huérfanas y logs de auditoría con más de 90 días

Configuración en Servidor Plesk

Solo se requiere un cron de un minuto en Plesk: '* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1'. El Scheduler de Laravel gestiona internamente la frecuencia de cada tarea. No se requieren múltiples crons.

#################### 5.3 Catálogo de Códigos de Error de la DNIT

Código DNITDescripciónAcción en OCPantalla de Control
0260Aprobado — DE aceptado por la DNITEstado → APROBADO. Cache actualizado.No aparece en listas de error
0422Rechazado — Error en el contenido del DEEstado → RECHAZADO. Log en Sentry.Comprobantes Rechazados
0301Fallo de schema XML del rea de datosEstado → RECHAZADO. Detalle en log de error.Errores SIFEN (41 ocurrencias registradas)
0360Documento electrónico duplicadoValidación previa evita el reenvío.Errores SIFEN (4 ocurrencias)
0350El tipo de operación no es compatible con la naturaleza del receptorVerificar IDCOMPROBANTE vs tipo de receptor.Errores SIFEN (13 ocurrencias)
0420No existe DTE consultadoVerificar CDC en base local.Errores SIFEN
Error PKIError Inesperado PKI — fallo de firma digitalCaptura automática en Sentry con stack trace.Errores SIFEN (4 ocurrencias)
0380Plazo vencido para envío del eventoBloquear cancelación. Notificar al operador.Anulaciones — Estado
0370Evento no permitido para el estado actualValidación previa por estado del DE.Anulaciones — Estado
HTTP 503WS de la DNIT no disponibleReintento con backoff exponencial (Horizon).Monitor Horizon

#################### 5.4 Ciclo de Vida de Estados del DE en OC

Estado OCDescripciónTransiciones PosiblesEquivalente Legado
GENERADODE creado en OC, aún no firmado ni enviado→ FIRMADO | → ERROR_FIRMANo enviado
FIRMADOXML firmado digitalmente. Listo para envío.→ ENVIADO | → ERROR_ENVIO
ENVIADOEnviado al WS de DL. Respuesta 'Registrado'.→ APROBADO | → RECHAZADO | → PENDIENTERegistrado con éxito
APROBADOAprobado por la DNIT. CDC definitivo asignado.→ CANCELADO (vía evento C)Migrado SIFEN / Aprobado
RECHAZADORechazado por la DNIT con código de error.→ ENVIADO (reenvío tras corrección)Comprobante Rechazado
CANCELADOCancelado mediante evento C aprobado por DNIT.Estado final — no reversibleAnulado SIFEN
INUTILIZADOInutilizado mediante evento I aprobado por DNIT.Estado final — no reversibleInutilizado SIFEN
ERROR_FIRMAFallo en el firmado digital (PKI/certificado)→ GENERADO (tras corregir certificado)Error Inesperado PKI
ERROR_ENVIOFallo de comunicación con el WS tras 3 reintentos→ ENVIADO (reenvío manual)No Enviado

6. Estructura de Datos — Modelo Relacional

#################### 6.1 Tablas Principales del Sistema OC

El modelo de datos de OnnixConnect OC extiende el schema original del sistema legado (sifen_db.sql), agregando las tablas necesarias para el ciclo de vida completo de los DEs y la gestión de lotes masivos.

############################## 6.1.1 Tabla: empresas

ColumnaTipo PostgreSQLDescripciónOrigen
idBIGINT PKIdentificador autonuméricoNuevo (era INT en legado)
rucVARCHAR(30) UNIQUERUC del emisor sin dígito verificadorempresa.ruc
digito_verificadorVARCHAR(2)Dígito verificador del RUCempresa.digito_verificador
razon_socialTEXTRazón social completa del emisorempresa.razon_social
csc_sifenTEXTCódigo de Seguridad del Contribuyente (32 chars)empresa.csc_sifen
id_csc_sifenVARCHAR(4)Identificador del CSC (ej: '0001')empresa.id_csc_sifen
estadoCHAR(1)'A'=Activo, 'I'=Inactivoempresa.estado
ambienteVARCHAR(20)'desarrollo' | 'produccion'Nuevo
nro_timbradoBIGINTNúmero de timbrado DNIT vigente (ej: 16014181)Nuevo (antes en config)
fecha_inicio_timbradoDATEFecha de inicio de vigencia del timbradoNuevo
establecimientoVARCHAR(3)Número de establecimiento (ej: '001')Nuevo
punto_expedicionVARCHAR(3)Punto de expedición (ej: '001')Nuevo
created_at / updated_atTIMESTAMPAuditoría automática Laravelfecha_insercion / fecha_ultima_actualizacion

############################## 6.1.2 Tabla: certificados

ColumnaTipo PostgreSQLDescripción
idBIGINT PKIdentificador autonumérico
empresa_idBIGINT FKReferencia a empresas.id (relación 1:1)
alias_entradaVARCHAR(100)Alias del certificado dentro del keystore .p12
clave_aliasVARCHAR(100) CIFRADOContraseña del alias — cifrada con encrypt() de Laravel
clave_certificadoVARCHAR(100) CIFRADOContraseña del archivo .p12 — cifrada con encrypt()
contenidoTEXTContenido del .p12 en Base64 — NUNCA exponer en logs
tipo_certificadoVARCHAR(10)'P12' | 'PEM'

############################## 6.1.3 Tabla: documentos_electronicos (tabla central del sistema)

ColumnaTipo PostgreSQLDescripción
idBIGINT PKIdentificador autonumérico
empresa_idBIGINT FKEmpresa emisora
lote_idBIGINT FK NULLLote masivo al que pertenece (NULL si es envío individual)
cdcVARCHAR(44) UNIQUE NULLCódigo de Control de 44 dígitos (NULL hasta ser asignado)
id_sifenBIGINT NULLID numérico retornado por DL/DNIT
nro_facturaVARCHAR(30) NULLNúmero formateado (ej: '001-001-1427697')
tipo_documentoSMALLINT1=Factura, 3=NCR, 5=NCR Electrónica, etc.
estadoENUMVer Sección 5.4 — Ciclo de vida completo
receptor_rucVARCHAR(20) NULLRUC del receptor
receptor_nombreTEXT NULLNombre o razón social del receptor
receptor_emailTEXT NULLEmail para envío del KuDE
monedaCHAR(3)Código ISO: 'PYG', 'USD', 'BRL', etc.
total_generalDECIMAL(18,2)Monto total del comprobante
total_iva_5DECIMAL(18,2)Total IVA al 5%
total_iva_10DECIMAL(18,2)Total IVA al 10%
total_exentaDECIMAL(18,2)Total exento de IVA
xml_sin_firmarLONGTEXT NULLXML generado antes del firmado (solo para debug)
xml_firmadoLONGTEXT NULLXML con firma RSA-SHA256 — resultado final enviado a DNIT
respuesta_dnitTEXT NULLRespuesta JSON/XML completa del WS
codigo_respuestaVARCHAR(10) NULLCódigo de resultado DNIT (0260, 0422, etc.)
mensaje_respuestaTEXT NULLMensaje descriptivo del resultado
fecha_emisionTIMESTAMPFecha y hora de emisión del DE
created_at / updated_atTIMESTAMPAuditoría automática Laravel

############################## 6.1.4 Tabla: eventos

ColumnaTipo PostgreSQLDescripción
idBIGINT PKIdentificador autonumérico
documento_electronico_idBIGINT FKDE sobre el que se aplica el evento
empresa_idBIGINT FKEmpresa emisora del evento
tipo_eventoENUM'CANC'=Cancelación, 'INUT'=Inutilización, 'CONF'=Conformidad, 'DISC'=Disconformidad
motivoTEXTMotivo del evento — OBLIGATORIO para CANC e INUT (mínimo 5 caracteres)
cdcVARCHAR(44) NULLCDC del DE a cancelar (solo para CANC)
nro_timbradoVARCHAR(8) NULLNúmero de timbrado (solo para INUT)
nro_desdeVARCHAR(7) NULLNúmero inicial del rango a inutilizar
nro_hastaVARCHAR(7) NULLNúmero final del rango a inutilizar
estadoENUM'PENDIENTE' | 'APROBADO' | 'RECHAZADO'
xml_eventoTEXT NULLXML del evento firmado enviado a la DNIT
respuesta_dnitTEXT NULLRespuesta completa del WS de eventos
codigo_respuestaVARCHAR(10) NULL0260=Aprobado, 0301=Error formato, etc.

7. Interfaz de Usuario

#################### 7.1 Módulos Operativos — AdminLTE + Livewire v3

Módulo (ruta Laravel)Componente LivewireFunción Principal
/operaciones/comprobantes/rechazadosComprobantesRechazadosListado filtrable. Selección múltiple. Reenvío masivo a SIFEN.
/operaciones/comprobantes/no-enviadosComprobantesNoEnviadosDEs sin CDC o ID SIFEN. Diagnóstico de fallos de comunicación.
/operaciones/comprobantes/anuladosComprobantesAnuladosVista cruzada: Anulado en ERP vs Inutilizado/Anulado en SIFEN.
/operaciones/lotes/monitor/{id}MonitorLoteTarjetasBarra de progreso en tiempo real. Polling 3 seg. Contadores live.
/operaciones/lotes/nueva-tcGeneracionLoteTCCarga archivo Procard (E003050T) o selección período Bancard.
/operaciones/control-sifenControlIngresoSifenCruce Finansys vs SIFEN. Filtros fecha/RUC. 50.000+ registros paginados.
/operaciones/eventos/cancelacionAnulacionComprobanteModal con CDC + Motivo obligatorio. Validación previa de estado.
/operaciones/eventos/inutilizacionInutilizacionComprobanteFormulario con Timbrado + Establecimiento + Rango + Motivo.
/operaciones/errores-sifenErroresSifenTipificación de errores agrupados. Drill-down a comprobantes afectados.

#################### 7.2 Módulos Administrativos — Filament v3

Resource FilamentTabla gestionadaFunción Principal
EmpresaResourceempresasCRUD de empresas emisoras. Configuración de timbrado, CSC y ambiente.
CertificadoResourcecertificadosCarga segura de .p12. Campos de clave cifrados. Vista previa del alias.
UsuarioResourceusuariosGestión de operadores y administradores. Asignación de roles.
RolResourcerolesDefinición de permisos granulares por módulo operativo.
LoteSifenResourcelotes_sifenHistorial de lotes masivos. Estado y métricas de cada proceso de TC.
ConfiguracionResourceconfiguracionesParámetros globales: URLs de WS, timeouts, thresholds de alertas.

8. Observabilidad y Monitoreo

#################### 8.1 Sentry Self-Hosted — Trazabilidad de Errores

Sentry captura automáticamente todas las excepciones no manejadas con contexto enriquecido. Para OnnixConnect OC, los eventos más críticos son los fallos de firmado digital (Error PKI) y los rechazos inesperados del WS de la DNIT.

Tipo de ErrorTag SentryContexto CapturadoAlerta
Fallo firmado .p12sifen.operacion=firmado_digitalempresa_id, alias (SIN clave ni contenido)Email inmediato al equipo
Error schema XML (0301)sifen.tipo_error=schema_xmlCampos inválidos, tipo de documentoAgrupación automática
SoapFault del WS DNITsifen.operacion=soap_dnitfaultcode, faultstring, ambienteSi >5 en 10 min: alerta
Chunk de lote fallidosifen.operacion=lote_chunklote_id, chunk_size, intentosLog en Horizon
Certificado expiradosifen.tipo_error=cert_expiradoempresa_id, fecha_expiracionAlerta 30 días antes

#################### 8.2 Prometheus + Grafana — Métricas de Infraestructura

Métrica PrometheusTipoQuery Grafana sugeridoAlerta si
sifen_soap_duration_secondsHistogramhistogram_quantile(0.95, rate(...))p95 > 10 segundos
sifen_documentos_total{estado}Counterrate(...)[5m] por estadoTasa rechazo > 5%
sifen_horizon_queue_size{cola}Gaugesifen_horizon_queue_size{cola='lotes'}Cola lotes > 500 jobs
sifen_cert_expiry_daysGaugesifen_cert_expiry_days < 30Días para expiración < 30
sifen_lote_duracion_minutosHistogramDuración promedio de lotes de TCLote > 25 minutos

9. Hoja de Ruta de Desarrollo (Roadmap)

El roadmap está organizado en cinco fases que priorizan primero la automatización de los procesos manuales más críticos, luego la interfaz operativa completa, y finalmente la infraestructura de observabilidad y escalabilidad.

#################### Fase 1 — Fundación del Core (Semanas )

TareaResponsableEntregableCriterio de Éxito
Scaffolding Laravel 12 + PostgreSQL + RedisBackend DevProyecto base funcionalHealth check OK en /api/ping
Migración del schema sifen_db.sql a Eloquent MigrationsBackend Dev5 migraciones ejecutadasphp artisan migrate sin errores
Implementar CertificadoService (openssl_pkcs12_read)Backend DevCarga segura de .p12Test unitario con cert real
Implementar XmlGeneradorService (DOM + XSD validation)Backend DevXML válido contra siRecepDE_v150.xsdValidación XSD pasa
Implementar XmlFirmadorService (xmlseclibs RSA-SHA256)Backend DevXML firmado correctamentevalidarFirmaDE() retorna true
Configurar Horizon con 3 colas (critica, lotes, sync)Backend DevWorkers corriendo en servidorDashboard Horizon accesible

#################### Fase 2 — Automatización de Sincronización (Semanas )

TareaResponsableEntregableCriterio de Éxito
Implementar SifenSoapService (recepcionDE, recepcionLoteDE, consultaDE)Backend DevWS funcional en ambiente TESTRespuesta 0260 desde DNIT test
Implementar SincronizarEstadosSifenJob (reemplaza .txt manual)Backend DevJob corriendo en SchedulerEstados actualizados sin intervención
Configurar Laravel Scheduler + cron en servidorDevOpsScheduler activo en Plesk/VPSphp artisan schedule:list muestra tareas
Actualizar WS de anulación a nueva versión de DL InformáticaBackend Dev + DLNuevo endpoint de eventos activoCancelación e inutilización funcionales
Implementar Redis Cache Tags para estados de comprobantesBackend DevTTL 30 min configuradoCache hit >80% en consultas repetidas

#################### Fase 3 — Interfaces Operativas Livewire (Semanas )

TareaResponsableEntregableCriterio de Éxito
Componente MonitorLoteTarjetas con polling 3 segFrontend DevBarra de progreso en tiempo realUI refleja progreso del lote sin recarga
Componente ComprobantesRechazados con reenvío masivoFrontend DevTabla filtrable + acción masivaReenvío de 100 DEs sin timeout de UI
Componente ControlIngresoSifen (50.000+ registros paginados)Frontend DevCruce Finansys vs SIFEN funcionalCarga de página < 2 segundos
Componentes de Cancelación e Inutilización con validacionesFrontend DevModales con validación previaMotivo obligatorio bloqueante
Panel Filament v3: Empresa, Certificado, Usuario, RolFrontend DevAdmin panel funcionalCRUD completo sin errores

#################### Fase 4 — Monitoreo y Pruebas de Estrés (Semanas )

TareaResponsableEntregableCriterio de Éxito
Instalar y configurar Sentry Self-HostedDevOpsServidor Sentry operativoPrimer error capturado correctamente
Instrumentar código con context tags de SentryBackend DevTags: operacion, tipo_error, ambienteError PKI visible en Sentry con contexto
Configurar Prometheus + exporters (php-fpm, redis, postgres)DevOpsMétricas scrapeadas cada 15sDashboard Grafana con 5 paneles activos
Prueba de estrés: 4.500 comprobantes en ambiente TESTQA + BackendInforme de resultados< 20 min total, 0 pérdidas de datos
Prueba de resiliencia: fallo de Redis a mitad del loteQAJobs recuperados tras reinicio0 duplicados, 0 pérdidas tras recovery
Deploy en Plesk con Supervisor para HorizonDevOpsSistema en producciónPrimer lote TC real procesado correctamente

#################### Fase 5 — Escalabilidad a Futuro (A definir con dirección)

  • Containerización con Docker + Docker Compose: paridad total entre entornos dev y producción, eliminación de rutas de montaje manuales.

  • Kubernetes Gestionado (EKS/GKE/AKS): auto-scaling de workers Horizon durante picos de proceso masivo. Condición de adopción: >100.000 comprobantes/mes o equipo de 3+ devs.

  • Multi-empresa: soporte de múltiples RUCs y timbrados desde una única instancia de OC, con aislamiento por empresa_id.

  • API REST pública: exposición de endpoints autenticados (Laravel Sanctum) para integración de sistemas ERP de terceros.

  • Generación nativa de KuDE (PDF): eliminación de dependencia del portal de DL para descarga del comprobante imprimible.

10. Consideraciones de Seguridad

Por operar con documentos tributarios legales y certificados digitales, OnnixConnect OC aplica las siguientes medidas de seguridad de forma mandatoria:

AspectoMedida ImplementadaJustificación
Almacenamiento del .p12Base64 en columna TEXT cifrada. Nunca en filesystem público ni en repositorio.Exposición del .p12 compromete la firma de todos los DEs emitidos
Claves del certificadoCast 'encrypted' en Eloquent (AES-256-CBC con APP_KEY)Cumplimiento con normativas de protección de datos
Variables de entornoAPP_KEY, DB_PASSWORD, REDIS_PASSWORD en .env del servidor — nunca en gitEstándar de la industria para secretos de aplicación
Endpoint /metricsRestringido por IP whitelist (solo servidor Prometheus)Las métricas pueden revelar patrones de uso del sistema
Laravel TelescopeDeshabilitado en producción o restringido a IPs del equipo devTelescope almacena payloads completos incluyendo datos de contribuyentes
Logs de SentryNunca incluir contenido del .p12, claves o datos personales en el contextoGDPR/Ley de protección de datos de Paraguay
Autenticación adminFilament con autenticación Laravel + 2FA recomendadoPanel administrativo accede a configuración de certificados reales
Comunicación con WSHTTPS obligatorio para ambiente de producción (sifen.set.gov.py)Requerimiento técnico de la DNIT para producción

Documento preparado por el Área de Arquitectura Técnica — Onnix Tecnología y Servicios SA

Versión 1.0 — OnnixConnect OC (Nombre en clave) — CONFIDENCIAL