Skip to main content

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


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.1.1.tar.gz (125.0 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.1.1-py3-none-any.whl (151.3 kB view details)

Uploaded Python 3

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

Hashes for sifen-0.1.1.tar.gz
Algorithm Hash digest
SHA256 a8597dace1cb5ec634e743fa13741d9acbf788cc1e387f020e01d35e1a9f8224
MD5 3a8281ddc9f796afa0cc698034f12750
BLAKE2b-256 2a7b5bc47e6acd7f6b3f74451102c0ecb7fd6c76f962a4e5ccb1a0d550d4ebf0

See more details on using hashes here.

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

Hashes for sifen-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a313e373276e4cda3a76eb420dfd3dd8c72b55c1cfc8f22812bb8556d8df7a17
MD5 c3029d94ce62985de637ee5ec59de38f
BLAKE2b-256 21b5a869c13d8f814944cb4d659b593addead0c89514cfedfd4971ab53353d50

See more details on using hashes here.

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