Skip to main content

sifen

Bindings Python para leer y generar XML del SIFEN (Sistema Integrado de Facturación Electrónica Nacional) de Paraguay.

Generados automáticamente a partir de los XSD oficiales de la SET usando xsdata, siguiendo el mismo enfoque de nfelib.

Instalación

pip install sifen

Con firma digital (RSA-SHA256):

pip install sifen[sign]

Con transmisión SOAP (envío al SIFEN):

pip install sifen[transmissao]

Para desarrollo:

pip install -e ".[sign,test]"

Uso

Leer un Documento Electrónico (DE)

Nota sobre v150: el paquete pysifen.de.bindings.v150 se genera desde toda la carpeta de esquemas, que mezcla XSD v141 y v150; por colisión de tipos, su root queda con estructura v141. Para trabajar con el root v150 limpio (dSisFact, gValorRestaItem, dBasExe) usá el paquete aislado pysifen.de.bindings.de_v150:

from pysifen.de.bindings.de_v150.de_v150 import RDe
from pysifen.de.bindings.v150.fe_v141 import RDe

# Leer desde archivo
rde = RDe.from_path("factura.xml")

# Leer desde string
rde = RDe.from_xml(xml_string)

# Navegar los datos
print(rde.DE.gDatGralOpe.gEmis.dRucEm)       # RUC del emisor
print(rde.DE.gDatGralOpe.gEmis.dNomEmi)       # Nombre del emisor
print(rde.DE.gDtipDE.gCamFE.iIndPres)         # Indicador de presencia
print(len(rde.DE.gDtipDE.gCamItem))            # Cantidad de ítems

Serializar a XML

xml = rde.to_xml()
print(xml)

Round-trip (leer y escribir)

rde = RDe.from_path("factura.xml")
xml = rde.to_xml()
rde2 = RDe.from_xml(xml)
assert rde.DE.Id == rde2.DE.Id

Validar contra XSD

errors = rde.validate_xml()
if not errors:
    print("XML válido!")
else:
    for error in errors:
        print(error)

Firmar XML (RSA-SHA256)

pip install sifen[sign]
with open("certificado.pfx", "rb") as f:
    cert_data = f.read()
signed = rde.sign_xml(xml, cert_data, "password", rde.DE.Id)

Usa signxml directamente con RSA-SHA256 y C14N, conforme lo exigido por el SIFEN. La función centralizada también está disponible en:

from pysifen.assinatura import sign_xml

signed = sign_xml(xml, cert_data, "password", doc_id)

Transmisión SOAP al SIFEN

pip install sifen[transmissao]

Enviar DE (síncrono)

from pysifen.transmissao import TransmissaoDE, TEST

transmissao = TransmissaoDE(
    ambiente=TEST,
    pkcs12_data=cert_data,
    pkcs12_password="password",
)
resultado = transmissao.enviar_de(rde)
print(resultado.rProtDe.dEstRes)      # "Aprobado"
print(resultado.rProtDe.dProtAut)     # Protocolo de autorización

Enviar lote de DEs (asíncrono)

resultado = transmissao.enviar_lote([rde1, rde2, rde3])
print(resultado.dProtConsLote)  # Protocolo para consulta posterior

Consultar DE por CDC

from pysifen.transmissao import ConsultaSIFEN, TEST

consulta = ConsultaSIFEN(
    ambiente=TEST,
    pkcs12_data=cert_data,
    pkcs12_password="password",
)
resultado = consulta.consultar_de("01800695631001001000000612024112917595714694")

Consultar RUC

resultado = consulta.consultar_ruc("80069563")
print(resultado.xContRUC.dRazCons)      # Razón social
print(resultado.xContRUC.dRUCFactElec)  # "S" = habilitado para FE

Enviar eventos (cancelación, inutilización, etc.)

from pysifen.transmissao import TransmissaoEvento, TEST

evento_transmissao = TransmissaoEvento(
    ambiente=TEST,
    pkcs12_data=cert_data,
    pkcs12_password="password",
)
resultado = evento_transmissao.enviar_evento(evento)

Tipos de Documento Electrónico

Tipo Código Descripción
Factura Electrónica 1 Factura electrónica estándar
FE Exportación 2 Factura de exportación
FE Importación 3 Factura de importación
Autofactura 4 Autofactura
Nota de Crédito 5 Nota de crédito electrónica
Nota de Débito 6 Nota de débito electrónica
Nota de Remisión 7 Nota de remisión electrónica
Comprobante de Retención 8 Comprobante de retención

Módulos

Bindings (generados automáticamente)

Módulo Descripción
fe_v141 Documento Electrónico principal (RDe, TDe, TgEmis, ...)
de_v150 Tipos adicionales del DE v150
de_v150.de_v150 (paquete aislado) Root DE v150 limpio (RDe, TDe con dSisFact, gValorRestaItem, dBasExe)
de_types_v150 Tipos base (enums, restricciones)
evento_v150 Eventos (cancelación, inutilización, conformidad, ...)
evento_types_v150 Tipos de eventos
ws_si_recep_de_v150 WS Recepción DE
ws_si_recep_evento_v150 WS Recepción Evento
ws_si_cons_de_v141 WS Consulta DE
ws_si_cons_ruc_v141 WS Consulta RUC
prot_proces_de_v150 Protocolo de procesamiento
xmldsig_core_schema Firma digital XML

Firma (pysifen.assinatura)

Función Descripción
sign_xml() Firma XML con PKCS12/RSA-SHA256 usando signxml

Transmisión (pysifen.transmissao)

Clase Descripción
TransmissaoDE Envío de DEs (síncrono y lote) con mTLS
ConsultaSIFEN Consultas (DE por CDC, lote, RUC, DTE)
TransmissaoEvento Envío de eventos (cancelación, inutilización, etc.)
TransmissaoBase Clase base con SOAP client, mTLS y serialización

Ambientes

Constante Valor Descripción
PRODUCCION 1 Ambiente de producción (sifen.set.gov.py)
TEST 2 Ambiente de pruebas (sifen-test.set.gov.py)

Dependencias Opcionales

Extra Paquetes Uso
sign signxml, cryptography, lxml Firma digital RSA-SHA256
transmissao xsdata[soap], signxml, cryptography, requests, lxml Transmisión SOAP con mTLS
soap xsdata[soap] Solo cliente SOAP
test pytest, pytest-cov, xmldiff, lxml Tests

Regenerar Bindings

Si los XSD se actualizan:

pip install xsdata[cli,lxml]
./script.sh

Desarrollo

git clone https://github.com/kmee/sifen.git
cd sifen
python -m venv .venv
source .venv/bin/activate
pip install -e ".[sign,test]" "xsdata[cli,lxml]"
pytest tests/ -v
ruff check pysifen/ tests/

Referencias

Licencia

MIT License - Copyright (c) KMEE

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sifen-0.2.0.tar.gz (151.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sifen-0.2.0-py3-none-any.whl (180.3 kB view details)

Uploaded Python 3

File details

Details for the file sifen-0.2.0.tar.gz.

File metadata

  • Download URL: sifen-0.2.0.tar.gz
  • Upload date:
  • Size: 151.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for sifen-0.2.0.tar.gz
Algorithm Hash digest
SHA256 d9d4d5de9487d8d2a9de2556945b4e4a3fae53c9301b4d942a9c2b170d1a7224
MD5 522517ddca6e5eb46e9cdbf468d5e89a
BLAKE2b-256 c1a80255279c7ababcab8c99cd6bce15e88d07cd6c98a46bf255a69891903835

See more details on using hashes here.

Provenance

The following attestation bundles were made for sifen-0.2.0.tar.gz:

Publisher: publish.yml on kmee/sifen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sifen-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: sifen-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 180.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for sifen-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a227617dd9ef262bdd6c682f80139bebf30ed8974782e3dfee53b447962ee959
MD5 2947bbc61767e9855d59e640c3ba58e8
BLAKE2b-256 3eae6c4b82f14e89e8f33e56acb78da0530242df0655020b5ce56dbc0c9ce6b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for sifen-0.2.0-py3-none-any.whl:

Publisher: publish.yml on kmee/sifen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page