Saltar al contenido principal

SIFEN — Log de Request/Response SOAP en disco

Fecha: 2026-04-13 Ubicacion: storage/app/private/sifen/responses/{Y/m}/ Formato: XML formateado (pretty-print) con cabecera de metadatos


Que es

Cada vez que OnnixConnect envia un request SOAP a SIFEN (envio sync, lote, evento, consulta), se guarda automaticamente un archivo XML en disco con:

  • El request completo (envelope SOAP con el DE firmado)
  • La respuesta completa de SIFEN (con codigos, mensajes y protocolos)
  • Metadatos en comentarios XML (fecha, accion, endpoint, HTTP code)

Todo formateado con indentacion para que sea legible sin herramientas especiales.


Donde se guardan

storage/app/private/sifen/responses/
└── 2026/
└── 04/
├── rEnviDe_20260413_184351_200.xml ← envio sync individual
├── rEnviLoteDe_20260413_190000_200.xml ← envio lote
├── rEnviEventoDe_20260413_191500_200.xml ← evento (cancelacion/inutilizacion)
├── rConsDe_20260413_192000_200.xml ← consulta DE por CDC
└── rConsRUC_20260413_193000_200.xml ← consulta RUC

Nombre del archivo: {accion}_{YYYYmmdd_HHiiss}_{httpCode}.xml

  • accion — nombre de la operacion SOAP (rEnviDe, rEnviLoteDe, rEnviEventoDe, rConsDe, rConsRUC)
  • YYYYmmdd_HHiiss — timestamp del envio
  • httpCode — codigo HTTP de la respuesta (200, 500, etc.)

Formato del archivo

<!-- ============================================== -->
<!-- SIFEN SOAP Log -->
<!-- Fecha: 2026-04-13T18:43:51+00:00 -->
<!-- Accion: rEnviDe -->
<!-- Endpoint: https://sifen-test.set.gov.py/de/ws/sync/recibe.wsdl -->
<!-- HTTP Code: 200 -->
<!-- ============================================== -->

<!-- ========== REQUEST ========== -->
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header/>
<env:Body>
<rEnviDe xmlns="http://ekuatia.set.gov.py/sifen/xsd">
<dId>1</dId>
<xDE>
<rDE ...>
<!-- XML del DE completo, indentado -->
</rDE>
</xDE>
</rEnviDe>
</env:Body>
</env:Envelope>

<!-- ========== RESPONSE ========== -->
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header/>
<env:Body>
<ns2:rRetEnviDe xmlns:ns2="http://ekuatia.set.gov.py/sifen/xsd">
<ns2:rProtDe>
<ns2:dEstRes>Rechazado</ns2:dEstRes>
<ns2:gResProc>
<ns2:dCodRes>1107</ns2:dCodRes>
<ns2:dMsgRes>Fecha de inicio de vigencia del timbrado incorrecta</ns2:dMsgRes>
</ns2:gResProc>
</ns2:rProtDe>
</ns2:rRetEnviDe>
</env:Body>
</env:Envelope>

Como buscar logs

Por fecha

ls storage/app/private/sifen/responses/2026/04/

Por accion

# Solo envios sync
ls storage/app/private/sifen/responses/2026/04/rEnviDe_*

# Solo eventos (cancelacion/inutilizacion)
ls storage/app/private/sifen/responses/2026/04/rEnviEventoDe_*

# Solo consultas
ls storage/app/private/sifen/responses/2026/04/rConsDe_*

Por codigo HTTP

# Solo errores 500
ls storage/app/private/sifen/responses/2026/04/*_500.xml

# Solo exitosos
ls storage/app/private/sifen/responses/2026/04/*_200.xml

Buscar un codigo SIFEN especifico

# Buscar todos los rechazos por CDC duplicado (1001)
grep -l "1001" storage/app/private/sifen/responses/2026/04/*.xml

# Buscar aprobaciones (0260)
grep -l "0260" storage/app/private/sifen/responses/2026/04/*.xml

Ver un log especifico

# El XML ya esta formateado, se puede abrir con cualquier editor o cat
cat storage/app/private/sifen/responses/2026/04/rEnviDe_20260413_184351_200.xml

Implementacion tecnica

El logging se hace en SifenHttpClient::guardarLog() que se ejecuta automaticamente despues de cada curl_exec().

SifenHttpClient::post()
↓ curl_exec() → raw response
↓ guardarLog(action, endpoint, request, response, httpCode)
↓ formatXml(request) → pretty-print
↓ formatXml(response) → pretty-print
↓ Storage::disk('local')->put("sifen/responses/{Y/m}/{filename}", content)
↓ parsearRespuesta() → SifenResponseData

Seguridad:

  • Los archivos estan en storage/app/private/ (fuera del webroot, no accesibles por HTTP).
  • Si el logging falla (disco lleno, permisos), el envio no se interrumpe (try/catch silencioso).

Performance:

  • El pretty-print usa DOMDocument::formatOutput que es nativo PHP (no dependencias externas).
  • Si el response no es XML valido (ej. error HTML de proxy), se guarda tal cual sin formatear.

Limpieza

Los logs crecen con el tiempo. Para produccion se recomienda limpiar logs antiguos periodicamente:

# Borrar logs de hace mas de 90 dias
find storage/app/private/sifen/responses/ -name "*.xml" -mtime +90 -delete

O agregar al scheduler de Laravel:

// routes/console.php
Schedule::command('model:prune')->daily();
// O un command custom:
// Schedule::exec('find storage/app/private/sifen/responses/ -name "*.xml" -mtime +90 -delete')->daily();

Diferencia con laravel.log

Aspectolaravel.logsifen/responses/
ContenidoMensajes de log (INFO/WARNING/ERROR) con contexto JSONXML completo (request + response SOAP)
FormatoTexto plano, una linea por entradaXML formateado con indentacion
UsoMonitoreo operativo, debugging rapidoAuditoria completa, reproduccion de errores
RotacionLOG_CHANNEL=daily (14-30 dias)Manual o por cron (90+ dias recomendado)
TamanoPequeno (~KB por entrada)Grande (~10-50KB por archivo, incluye XML firmado)

Usar laravel.log para: saber rapidamente si un DTE fue aprobado o rechazado.

Usar sifen/responses/ para: ver exactamente que se envio y que respondio SIFEN, reproducir un error, auditoria legal, debugging profundo de validaciones XSD.


Archivo fuente

app/Domains/Sifen/Services/Soap/SifenHttpClient.php — metodos guardarLog() y formatXml().