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.v150se 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 aisladopysifen.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
Metadata
Release files for sifen 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sifen-0.2.0.tar.gz | 151.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sifen-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 332.1 kB
Release files / sifen-0.2.0.tar.gz
| Download URL | sifen-0.2.0.tar.gz |
|---|---|
| Size | 151.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d9d4d5de9487d8d2a9de2556945b4e4a3fae53c9301b4d942a9c2b170d1a7224
|
|
BLAKE2b-256 checksum How to use checksums |
c1a80255279c7ababcab8c99cd6bce15e88d07cd6c98a46bf255a69891903835
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 7, 2026.
Transparency logRelease files / sifen-0.2.0-py3-none-any.whl
| Download URL | sifen-0.2.0-py3-none-any.whl |
|---|---|
| Size | 180.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a227617dd9ef262bdd6c682f80139bebf30ed8974782e3dfee53b447962ee959
|
|
BLAKE2b-256 checksum How to use checksums |
3eae6c4b82f14e89e8f33e56acb78da0530242df0655020b5ce56dbc0c9ce6b6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 7, 2026.
Transparency log