Skip to main content

Bindings Python para ler e gerar XML do SIFEN (Paraguay)

Project description

pysifen

Bindings Python para ler e gerar XML do SIFEN (Sistema Integrado de Facturación Electrónica Nacional) do Paraguai.

Gerados automaticamente a partir dos XSD oficiais da SET usando xsdata, seguindo a mesma abordagem da nfelib.

Instalação

pip install pysifen

Com assinatura digital (RSA-SHA256):

pip install pysifen[sign]

Com transmissão SOAP (envio ao SIFEN):

pip install pysifen[transmissao]

Para desenvolvimento:

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

Uso

Ler um Documento Electrónico (DE)

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

# Ler de arquivo
rde = RDe.from_path("factura.xml")

# Ler de string
rde = RDe.from_xml(xml_string)

# Navegar nos dados
print(rde.DE.gDatGralOpe.gEmis.dRucEm)       # RUC do emissor
print(rde.DE.gDatGralOpe.gEmis.dNomEmi)       # Nome do emissor
print(rde.DE.gDtipDE.gCamFE.iIndPres)         # Indicador de presença
print(len(rde.DE.gDtipDE.gCamItem))            # Quantidade de itens

Serializar para XML

xml = rde.to_xml()
print(xml)

Round-trip (ler e escrever)

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)

Assinar XML (RSA-SHA256)

pip install pysifen[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 diretamente com RSA-SHA256 e C14N, conforme exigido pelo SIFEN. A função centralizada também está disponível em:

from pysifen.assinatura import sign_xml

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

Transmissão SOAP ao SIFEN

pip install pysifen[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 autorização

Enviar lote de DEs (assí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ão social
print(resultado.xContRUC.dRUCFactElec)  # "S" = habilitado para FE

Enviar eventos (cancelamento, inutilização, 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 Descrição
Factura Electrónica 1 Fatura eletrônica
FE Exportación 2 Fatura de exportação
FE Importación 3 Fatura de importação
Autofactura 4 Autofatura
Nota de Crédito 5 Nota de crédito
Nota de Débito 6 Nota de débito
Nota de Remisión 7 Nota de remissão
Comprobante de Retención 8 Comprovante de retenção

Módulos

Bindings (gerados automaticamente)

Módulo Descrição
fe_v141 Documento Electrónico principal (RDe, TDe, TgEmis, ...)
de_v150 Tipos adicionais do DE v150
de_types_v150 Tipos base (enums, restrições)
evento_v150 Eventos (cancelação, inutilização, conformidade, ...)
evento_types_v150 Tipos de eventos
ws_si_recep_de_v150 WS Recepção DE
ws_si_recep_evento_v150 WS Recepção Evento
ws_si_cons_de_v141 WS Consulta DE
ws_si_cons_ruc_v141 WS Consulta RUC
prot_proces_de_v150 Protocolo de processamento
xmldsig_core_schema Assinatura digital XML

Assinatura (pysifen.assinatura)

Função Descrição
sign_xml() Assina XML com PKCS12/RSA-SHA256 usando signxml

Transmissão (pysifen.transmissao)

Classe Descrição
TransmissaoDE Envio de DEs (síncrono e lote) com mTLS
ConsultaSIFEN Consultas (DE por CDC, lote, RUC, DTE)
TransmissaoEvento Envio de eventos (cancelamento, inutilização, etc.)
TransmissaoBase Classe base com SOAP client, mTLS e serialização

Ambientes

Constante Valor Descrição
PRODUCCION 1 Ambiente de produção (sifen.set.gov.py)
TEST 2 Ambiente de testes (sifen-test.set.gov.py)

Dependências Opcionais

Extra Pacotes Uso
sign signxml, cryptography, lxml Assinatura digital RSA-SHA256
transmissao xsdata[soap], signxml, cryptography, requests, lxml Transmissão SOAP com mTLS
soap xsdata[soap] Apenas cliente SOAP
test pytest, pytest-cov, xmldiff, lxml Testes

Regenerar Bindings

Se os XSD forem atualizados:

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

Desenvolvimento

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

Referências

Licença

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

Uploaded Python 3

File details

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

File metadata

  • Download URL: sifen-0.1.0.tar.gz
  • Upload date:
  • Size: 124.9 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.0.tar.gz
Algorithm Hash digest
SHA256 0aae2e25a82fe34a6a56ed1497ffe1ec9417b95f9b6156e8adf7ceea51918d5d
MD5 c08631a874727c11318cb3259214d3b2
BLAKE2b-256 e458a8973bccdce897822db3d8660e79d2948d25e1c7a1463dce3c84823ff5d0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sifen-0.1.0-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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 acd92a64246f6d5eb7e05c4d3f734ce5a29b489f8117b7560456f390a74717bb
MD5 0a97cce053412802e4d2add5ce25c17f
BLAKE2b-256 26f0c3f3b72332835a4bda3554acf29db4f175ba17eb45f37eb90da4557bdb1c

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