Saltar al contenido principal

Recomendaciones y Mejores Prácticas SIFEN — Guía para el Desarrollador

Fuente: "Guía de Mejores Prácticas para la Gestión del Envío de DE.pdf" (DNIT/e-kuatia, octubre 2024)


1. Generación de Documentos Electrónicos (DE)

Declaración raíz rDE (obligatoria)

<rDE xmlns="http://ekuatia.set.gov.py/sifen/xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ekuatia.set.gov.py/sifen/xsd siRecepDE_v150.xsd">

Reglas de formato — NO incorporar (causa 0160 inmediato)

#ReglaEjemplo maloCorrecto
1Espacios en blanco al inicio/fin de campos numéricos o alfanuméricos" 80126006 ""80126006"
2Comentarios, anotaciones (annotation, documentation) en el XML<!-- comentario -->(omitir)
3Caracteres de formato: line-feed, carriage return, tab, espacios entre etiquetas<tag>\n <sub><tag><sub>
4Prefijos en el namespace de las etiquetas<xsd:gDatRec><gDatRec>
5Etiquetas vacías de campos opcionales (ceros, vacíos, blancos)<gCamGen/>(omitir si no tiene contenido)
6Valores negativos o caracteres no numéricos en campos numéricos"-100" o "1.000,00""100" o "1000.00"
7Nombres de campos con mayúsculas/minúsculas incorrectas<GopEDE>, <gopede><gOpeDE> (exacto como el manual)

Regla 5 — CRÍTICA: Solo se exceptúan los campos marcados como obligatorios en el XSD (minOccurs="1"). Un <gCamGen/> vacío, por ejemplo, debe omitirse.

Pre-validador SIFEN

URL: https://ekuatia.set.gov.py/prevalidador/


2. Servicios Web — Endpoints

ServicioTestProducción
recibe-lote (async)https://sifen-test.set.gov.py/de/ws/async/recibe-lote.wsdlhttps://sifen.set.gov.py/de/ws/async/recibe-lote.wsdl
consulta-lotehttps://sifen-test.set.gov.py/de/ws/consultas/consulta-lote.wsdlhttps://sifen.set.gov.py/de/ws/consultas/consulta-lote.wsdl
consulta (por CDC)https://sifen-test.set.gov.py/de/ws/consultas/consulta.wsdlhttps://sifen.set.gov.py/de/ws/consultas/consulta.wsdl
recibe-synchttps://sifen-test.set.gov.py/de/ws/sync/recibe.wsdlhttps://sifen.set.gov.py/de/ws/sync/recibe.wsdl

Para obtener el WSDL: agregar ?wsdl al final. Ejemplo: .../consulta-lote.wsdl?wsdl


3. Configuración Postman — mTLS (autenticación mutua)

Pasos (OBLIGATORIO para conectar con SIFEN)

  1. Abrir Postman → Settings (⚙)Certificates
  2. Sección Client certificatesAdd Certificate
  3. Configurar:
CampoValor para TESTValor para PROD
HOSTsifen-test.set.gov.pysifen.set.gov.py
PFX fileruta al .p12 del emisorruta al .p12 del emisor
Passphrasecontraseña del certificadocontraseña del certificado
  1. Para ONNIX (emisor ID=1):
    • Cert: storage/app/private/sifen/certs/p12/F1T_51100.p12
    • Passphrase: (la del archivo p12)
    • Agregar entrada para HOST sifen-test.set.gov.py

Sin este paso, SIFEN rechazará la conexión TLS antes de procesar el XML.


4. SOAP Envelope — recibe-lote (async)

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://ekuatia.set.gov.py/sifen/xsd">
<soap:Header/>
<soap:Body>
<xsd:rEnvioLote>
<xsd:dId>20240926</xsd:dId>
<xsd:xDE>{AQUI VA EL BASE64 DEL ZIP}</xsd:xDE>
</xsd:rEnvioLote>
</soap:Body>
</soap:Envelope>

Cómo construir el body:

  1. Crear estructura <rLoteDE><rDE>...</rDE><rDE>...</rDE></rLoteDE> (hasta 50 DEs, mismo tipo, mismo RUC)
  2. Comprimir a ZIP
  3. Convertir ZIP a Base64
  4. Poner Base64 en <xsd:xDE>

Reglas lote:

  • ✅ Un solo RUC emisor por lote
  • ✅ Un solo tipo de documento por lote (solo Facturas, o solo NC, etc.)
  • ✅ Máximo 50 DEs por lote
  • ✅ ZIP no debe superar 1000 KB
  • ❌ Nunca reenviar el mismo CDC sin haber consultado el resultado

5. Respuestas del WS recibe-lote

dCodResSignificadoAcción
0300Lote recibido con éxitoConsultar estado con consulta-lote tras 10+ min
0301Lote NO encoladoVer sección "Lote no encolado para procesamiento"

6. Respuestas del WS consulta-lote

dCodResLotSignificado
0360Número de lote inexistente
0361Lote en procesamiento — reintentar en ≥10 min
0364Consulta extemporánea (>48h) — usar consulta por CDC
0362Procesamiento concluido — ver gResProcLote

Ejemplo respuesta 0362 (concluido, con 0160):

<ns2:gResProcLote>
<ns2:id>07800252985001001000311822024021016361562161</ns2:id>
<ns2:dEstRes>Rechazado</ns2:dEstRes>
<ns2:gResProc>
<ns2:dCodRes>0160</ns2:dCodRes>
<ns2:dMsgRes>XML malformado: [El valor del elemento: dDirRec es invalido,
El valor del elemento: dDirLocEnt es invalido]</ns2:dMsgRes>
</ns2:gResProc>
</ns2:gResProcLote>

⚠️ Este ejemplo muestra que dDirRec y dDirLocEnt con valores inválidos causan 0160. dDirRec ya fue removido de nuestro builder. dDirLocEnt vive en gCamGen > gCamEnt — verificar.


7. SOAP Envelope — consulta-lote

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://ekuatia.set.gov.py/sifen/xsd">
<soap:Header/>
<soap:Body>
<xsd:rEnviConsLoteDe>
<xsd:dId>1</xsd:dId>
<xsd:dProtConsLote>11158097383597290</xsd:dProtConsLote>
</xsd:rEnviConsLoteDe>
</soap:Body>
</soap:Envelope>

8. SOAP Envelope — consulta por CDC

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://ekuatia.set.gov.py/sifen/xsd">
<soap:Header/>
<soap:Body>
<xsd:rEnviConsDeRequest>
<xsd:dId>12</xsd:dId>
<xsd:dCDC>01028052080001001000013622023100111644108186</xsd:dCDC>
</xsd:rEnviConsDeRequest>
</soap:Body>
</soap:Envelope>
dCodResSignificado
0420DE no existe o no está aprobado
0422DE existe y está aprobado — responde xContenDE con XML

9. Motivos de bloqueo temporal (10-60 min por RUC)

  • Enviar lotes vacíos o con contenido inválido
  • Enviar el mismo CDC varias veces en un mismo lote
  • Enviar el mismo CDC en lotes distintos aún en procesamiento
  • Enviar varias veces el mismo lote

10. Checklist Postman para TEST

[ ] HOST sifen-test.set.gov.py configurado en Settings > Certificates
[ ] PFX = F1T_51100.p12 con passphrase correcta
[ ] Content-Type: application/soap+xml; charset=utf-8 (SOAP 1.2)
[ ] SOAPAction header vacío o no presente (SOAP 1.2 no lo requiere)
[ ] URL = https://sifen-test.set.gov.py/de/ws/sync/recibe (para sync)
[ ] Body = raw / XML
[ ] SSL certificate verification: OFF (para test, evitar errores de CA)

11. Puntos críticos a verificar en nuestro XML

CampoProblema conocidoEstado
dDirRecInvalido sin cDepRec/cCiuRec✅ Removido
dDirLocEntInvalido en gCamEnt si gCamGen se emite vacío⚠️ Verificar
<gCamGen/>No debe emitirse vacío (regla 5 PDF)⚠️ Verificar
Espacios entre etiquetas XMLCausa 0160 per regla 3 PDF⚠️ Verificar formatOutput
iTiContRecHardcoded 1 → ahora dinámico desde cliente_tipo_contribuyente✅ Fix aplicado
dFecEmNRSolo para Notas de Remisión✅ Removido
Totales IVACalculados desde items✅ Fix aplicado