Saltar al contenido principal

SIFEN — Comandos CLI de Diagnostico

Fecha: 2026-04-13 Sprint: 4 — Tarea 4.4 Requisito: php artisan serve corriendo o acceso a la terminal del servidor


Que son

Son 5 comandos que se ejecutan desde la terminal (no desde la API/Swagger). Sirven para diagnosticar, probar y resolver problemas del sistema de facturacion electronica sin necesidad de usar el navegador o Postman.

Pensalos como herramientas de mecanico — no las usa el cliente, las usa el equipo tecnico.


Antes de empezar

# Verificar que estas en la carpeta del proyecto
cd /home/tomcodev/projects/onnix/onnixconnect

# Verificar que Laravel responde
php artisan --version
# Laravel Framework 12.x.x

1. sifen:test-dte — Crear una factura de prueba

Para que sirve: Genera una factura electronica de prueba, la firma digitalmente, pero NO la envia a SIFEN. Es para verificar que el certificado digital funciona y que el pipeline de generacion esta OK.

Cuando usarlo:

  • Despues de subir un certificado P12 nuevo.
  • Despues de cambiar la configuracion de un emisor.
  • Para verificar que el sistema genera XMLs correctos.
# Usar el emisor 1 (por defecto)
php artisan sifen:test-dte

# Usar otro emisor
php artisan sifen:test-dte 2

# Ver el XML firmado completo en pantalla
php artisan sifen:test-dte --show-xml

Salida esperada:

Emisor: ONNIX TECNOLOGIA Y SERVICIOS S.A. (RUC 80126006-0)
Ambiente: test

Generando DTE de prueba #0001004...
[OK] DTE creado en 24ms — ID: 100, Estado: draft
[OK] Firmado en 155ms — Estado: signed

+--------------+----------------------------------------------+
| Campo | Valor |
+--------------+----------------------------------------------+
| DTE ID | 100 |
| CDC | 01801260060001001000100422026041311556605571 |
| Numero | 0001004 |
| Estado | signed |
| Emisor | ONNIX TECNOLOGIA Y SERVICIOS S.A. (80126006) |
| XML Path | sifen/xml/signed/2026/04/018012600...xml |
| Tiempo total | 182ms |
+--------------+----------------------------------------------+

DTE generado y firmado exitosamente. NO fue enviado a SIFEN.
Para enviar: php artisan sifen:send-sync 100

Que significa cada campo:

  • DTE ID: Numero interno en la base de datos.
  • CDC: Codigo de Control de 44 digitos, unico por factura. Es como el "DNI" de la factura.
  • Numero: Numero correlativo de la factura (ej. 0001004).
  • Estado: signed = firmado digitalmente, listo para enviar.
  • XML Path: Donde se guardo el archivo XML firmado en el disco.
  • Tiempo total: Cuanto tardo en crear + firmar.

Si falla:

  • "Emisor X no encontrado" → El ID del emisor no existe en la base de datos.
  • "Firma fallida" → Problema con el certificado P12 (password incorrecta, expirado, corrupto).

2. sifen:send-sync — Enviar una factura a SIFEN

Para que sirve: Toma una factura que ya fue firmada (estado signed) y la envia a SIFEN. Muestra la respuesta en tiempo real.

Cuando usarlo:

  • Despues de sifen:test-dte para completar el ciclo.
  • Para reenviar manualmente una factura rechazada.
  • Para debugging de errores de envio.
# Enviar el DTE con ID 100
php artisan sifen:send-sync 100

Salida esperada (aprobado):

DTE #100 | Estado: signed | CDC: 018012600...
Enviando a SIFEN...

+--------------+----------------------------------------------+
| Campo | Valor |
+--------------+----------------------------------------------+
| DTE ID | 100 |
| CDC | 018012600... |
| Estado | approved |
| Codigo SIFEN | 0260 |
| Mensaje | Autorizacion del DE satisfactoria |
| Tiempo | 413ms |
+--------------+----------------------------------------------+
DTE APROBADO por SIFEN.

Salida esperada (rechazado):

DTE rejected: 1001 — TEST - CDC duplicado

Codigos SIFEN comunes:

  • 0260 = Aprobado.
  • 1001 = CDC duplicado (ya existe en SIFEN).
  • 1101 = Numero de timbrado invalido.
  • 1107 = Fecha de inicio de vigencia del timbrado incorrecta.
  • 0160 = XML mal formado.

Si falla:

  • "Solo se pueden enviar DTEs en estado signed, rejected o error" → La factura ya fue aprobada o cancelada.
  • "cURL error" → Problema de red o certificado TLS.

3. sifen:validate-dte — Verificar estructura del XML

Para que sirve: Lee el XML firmado de una factura y verifica que tenga todos los campos obligatorios. Es como un "chequeo medico" del XML.

Cuando usarlo:

  • Cuando SIFEN rechaza con "XML mal formado" (0160).
  • Para verificar que la firma digital esta presente.
  • Para confirmar que el QR esta generado.
php artisan sifen:validate-dte 100

Salida esperada:

Validando DTE #100 — CDC: 018012600...

[OK] Nodo raiz DE
[OK] Atributo Id (CDC) en DE = 018012600...
[OK] Digito verificador (dDVId) = 1
[OK] Fecha de firma (dFecFirma) = 2026-04-13T19:31:46
[OK] Tipo de emision (iTipEmi) = 1
[OK] Tipo de documento (iTiDE) = 1
[OK] Numero de timbrado (dNumTim) = 80126006
[OK] Establecimiento (dEst) = 001
[OK] Punto de expedicion (dPunExp) = 001
[OK] Numero de documento (dNumDoc) = 0001004
[OK] Fecha de emision (dFeEmiDE)
[OK] RUC del emisor (dRucEm) = 80126006
[OK] Razon social del emisor (dNomEmi)
[OK] Nombre del receptor (dNomRec)
[OK] Items (gCamItem)
[OK] Totales (gTotSub)
[OK] URL QR (dCarQR)
[OK] Firma XMLDSig (Signature)
[OK] DigestValue de la firma
[OK] SignatureValue de la firma
[OK] Certificado X509 embebido

Resultado: 21 OK, 0 faltantes de 21 validaciones.
Items encontrados: 1
Tamano XML: 7,958 bytes

Que verifica (21 puntos):

  • Estructura basica del documento (DE, CDC, fecha, timbrado).
  • Datos del emisor (RUC, razon social).
  • Datos del receptor.
  • Items y totales.
  • QR con URL de consulta.
  • Firma digital completa (Signature, DigestValue, SignatureValue, certificado X509).

Si algo dice [--] NO ENCONTRADO: Ese campo falta en el XML. Revisar el builder XML o los datos de entrada.


4. sifen:inspect-payload — Ver el sobre SOAP

Para que sirve: Muestra el "sobre" SOAP completo que se envia a SIFEN, con el XML firmado adentro. Es util para comparar byte a byte con lo que SIFEN espera.

Cuando usarlo:

  • Debugging avanzado cuando SIFEN rechaza y no se entiende por que.
  • Para copiar el payload y probarlo manualmente con curl.
  • Para comparar con el payload del sistema Java legacy.
php artisan sifen:inspect-payload 100

Salida esperada:

DTE #100 | CDC: 018012600...
Endpoint: https://sifen-test.set.gov.py/de/ws/sync/recibe.wsdl
Tamano payload: 8,169 bytes

<?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 firmado completo indentado...
</rDE>
</xDE>
</rEnviDe>
</env:Body>
</env:Envelope>

Tip: Podes redirigir a un archivo para analizarlo:

php artisan sifen:inspect-payload 100 > /tmp/payload_dte_100.xml

5. sifen:retry-errors — Reenviar facturas fallidas

Para que sirve: Busca todas las facturas que fueron rechazadas (rejected) o que tuvieron error tecnico (error) y las reencola para volver a enviarlas a SIFEN.

Cuando usarlo:

  • Despues de corregir un problema de configuracion (timbrado, certificado).
  • Despues de que SIFEN estuvo caido y hay facturas pendientes.
  • Para limpiar la cola de errores.
# Ver que se haria sin ejecutar (RECOMENDADO primero)
php artisan sifen:retry-errors --dry-run

# Reenviar todos los rejected/error de todos los emisores
php artisan sifen:retry-errors

# Solo del emisor 1
php artisan sifen:retry-errors 1

# Solo los que tienen error tecnico (no los rechazados por datos)
php artisan sifen:retry-errors --estado=error

# Combinar: solo errores del emisor 1
php artisan sifen:retry-errors 1 --estado=error

Salida esperada (dry-run):

DTEs encontrados: 68

+-----+-------------------------+----------+--------+-----------------------------------------+
| ID | CDC | Estado | Codigo | Mensaje |
+-----+-------------------------+----------+--------+-----------------------------------------+
| 100 | 01801260060001001000... | rejected | 1101 | TEST - Numero de timbrado invalido |
| 98 | 01801260060001001000... | rejected | 1001 | TEST - CDC duplicado |
| ... | | | | |
+-----+-------------------------+----------+--------+-----------------------------------------+
--dry-run: no se ejecuto nada.

Salida esperada (ejecucion real):

DTEs encontrados: 68
Reenviar 68 DTEs? (yes/no) [no]: yes
68 DTEs reencolados para envio.

IMPORTANTE:

  • Siempre usar --dry-run primero para ver la lista.
  • El comando pide confirmacion antes de ejecutar.
  • Los DTEs con CDC duplicado (1001) van a volver a ser rechazados — eso es normal.
  • Solo tiene sentido reenviar si se corrigio el problema original.

Resumen rapido

Que quiero hacerComando
Probar que el certificado funcionaphp artisan sifen:test-dte
Enviar una factura manualmentephp artisan sifen:send-sync 100
Ver si un XML esta bien armadophp artisan sifen:validate-dte 100
Ver el sobre SOAP que se enviaphp artisan sifen:inspect-payload 100
Reenviar todas las facturas fallidasphp artisan sifen:retry-errors --dry-run

Flujo tipico de diagnostico

Cuando algo falla, seguir estos pasos en orden:

1. php artisan sifen:test-dte
→ Si falla: problema de certificado o configuracion del emisor.

2. php artisan sifen:validate-dte {id}
→ Si tiene [--] faltantes: problema en el builder XML.

3. php artisan sifen:inspect-payload {id}
→ Comparar el envelope con la documentacion del Manual v150.

4. php artisan sifen:send-sync {id}
→ Ver el codigo de error exacto de SIFEN.

5. php artisan sifen:retry-errors --dry-run
→ Ver cuantas facturas estan pendientes y por que.

Donde ver los logs

Ademas de la salida en consola, toda la actividad queda registrada en:

  • storage/logs/laravel.log — mensajes de log con prefijo [SIFEN]
  • storage/app/private/sifen/responses/ — request + response SOAP formateado en XML
# Ver ultimos logs de SIFEN
grep "[SIFEN]" storage/logs/laravel.log | tail -20

# Ver responses de hoy
ls storage/app/private/sifen/responses/2026/04/