SIFEN — Comandos CLI de Diagnostico
Fecha: 2026-04-13 Sprint: 4 — Tarea 4.4 Requisito:
php artisan servecorriendo 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-dtepara 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-runprimero 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 hacer | Comando |
|---|---|
| Probar que el certificado funciona | php artisan sifen:test-dte |
| Enviar una factura manualmente | php artisan sifen:send-sync 100 |
| Ver si un XML esta bien armado | php artisan sifen:validate-dte 100 |
| Ver el sobre SOAP que se envia | php artisan sifen:inspect-payload 100 |
| Reenviar todas las facturas fallidas | php 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/