Bindings Python para leer y generar XML del SIFEN (Paraguay)
Project description
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)
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_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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sifen-0.1.1.tar.gz.
File metadata
- Download URL: sifen-0.1.1.tar.gz
- Upload date:
- Size: 125.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8597dace1cb5ec634e743fa13741d9acbf788cc1e387f020e01d35e1a9f8224
|
|
| MD5 |
3a8281ddc9f796afa0cc698034f12750
|
|
| BLAKE2b-256 |
2a7b5bc47e6acd7f6b3f74451102c0ecb7fd6c76f962a4e5ccb1a0d550d4ebf0
|
File details
Details for the file sifen-0.1.1-py3-none-any.whl.
File metadata
- Download URL: sifen-0.1.1-py3-none-any.whl
- Upload date:
- Size: 151.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a313e373276e4cda3a76eb420dfd3dd8c72b55c1cfc8f22812bb8556d8df7a17
|
|
| MD5 |
c3029d94ce62985de637ee5ec59de38f
|
|
| BLAKE2b-256 |
21b5a869c13d8f814944cb4d659b593addead0c89514cfedfd4971ab53353d50
|