跳转到主要内容

nfelib:巴西电子发票库

项目描述

nfelib - 用于读取和管理NF-e, NFS-e全国, CT-e, MDF-e, BP-e XML的Python绑定

PyPI Downloads

为什么选择nfelib

  • 简单可靠。其他库通常需要成千上万行代码手动实现所有功能,而nfelib只需几行代码即可自动完成。它使用xsdata来管理代码,xsdata是一个编写良好且经过充分测试的数据绑定库。nfelib本身也包含读取和管理所有税务文档的测试。
  • 完整:由于绑定管理变得非常简单,nfelib维护所有绑定,以与NF-e、NFS-e国家、CT-e、MDF-e、BP-e的所有服务和事件进行交互。测试还能检测到某些方案的版本更新。

安装

pip install nfelib

如何使用

NF-e

>>> # Ler o XML de uma NF-e:
>>> from nfelib.nfe.bindings.v4_0.proc_nfe_v4_00 import NfeProc
>>> nfe_proc = NfeProc.from_path("nfelib/nfe/samples/v4_0/leiauteNFe/NFe35200159594315000157550010000000012062777161.xml")
>>> # (pode ser usado também o metodo from_xml(xml) )
>>>
>>> nfe_proc.NFe.infNFe.emit.CNPJ
'59594315000157'
>>> nfe_proc.NFe.infNFe.emit
Tnfe.InfNfe.Emit(CNPJ='59594315000157', CPF=None, xNome='Akretion LTDA', xFant='Akretion', enderEmit=TenderEmi(xLgr='Rua Paulo Dias', nro='586', xCpl=None, xBairro=None, cMun='3501152', xMun='Alumínio', UF=<TufEmi.SP: 'SP'>, CEP='18125000', cPais=<TenderEmiCPais.VALUE_1058: '1058'>, xPais=<TenderEmiXPais.BRASIL: 'Brasil'>, fone='2130109965'), IE='755338250133', IEST=None, IM=None, CNAE=None, CRT=<EmitCrt.VALUE_1: '1'>)
>>> nfe_proc.NFe.infNFe.emit.enderEmit.UF.value
'SP'
>>>
>>> # Serializar uma NF-e:
>>> nfe_proc.to_xml()
'<?xml version="1.0" encoding="UTF-8"?>\n<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="4.00">\n  <NFe>\n    <infNFe versao="4.00" Id="35200159594315000157550010000000012062777161">\n      <ide>\n        <cUF>35</cUF>\n        <cNF>06277716</cNF>\n        <natOp>Venda</natOp>\n        <mod>55</mod>\n        <serie>1</serie>\n        <nNF>1</nNF>\n        <dhEmi>2020-01-01T12:00:00+01:00</dhEmi>\n        <dhSaiEnt>2020-01-01T12:00:00+01:00</dhSaiEnt>\n        <tpNF>1</tpNF>\n        <idDest>1</idDest>\n [...]
>>>
>>> # Montar uma NFe do zero:
>>> from nfelib.nfe.bindings.v4_0.nfe_v4_00 import Nfe
>>> nfe=Nfe(infNFe=Nfe.InfNfe(emit=Nfe.InfNfe.Emit(xNome="Minha Empresa", CNPJ='59594315000157')))
>>> nfe
Nfe(infNFe=Tnfe.InfNfe(ide=None, emit=Tnfe.InfNfe.Emit(CNPJ='59594315000157', CPF=None, xNome='Minha Empresa', xFant=None, enderEmit=None, IE=None, IEST=None, IM=None, CNAE=None, CRT=None), avulsa=None, dest=None, retirada=None, entrega=None, autXML=[], det=[], total=None, transp=None, cobr=None, pag=None, infIntermed=None, infAdic=None, exporta=None, compra=None, cana=None, infRespTec=None, infSolicNFF=None, versao=None, Id=None), infNFeSupl=None, signature=None)
>>> 
>>> # Validar o XML de uma nota:
>>> nfe.validate_xml()
["Element '{http://www.portalfiscal.inf.br/nfe}infNFe': The attribute 'versao' is required but missing.", "Element '{http://www.portalfiscal.inf.br/nfe}infNFe': The attribute 'Id' is required but missing." [...]

使用erpbrasil.assinatura库签名发票XML(也适用于其他电子文档)

>>> # Assinar o XML de uma nota:
>>> with open(path_to_your_pkcs12_certificate, "rb") as pkcs12_buffer:
    pkcs12_data = pkcs12_buffer.read()
>>> signed_xml = nfe.sign_xml(xml, pkcs12_data, cert_password, nfe.NFe.infNFe.Id)

使用BrazilFiscalReport库或erpbrasil.edoc.pdf库打印DANFE(将来BrazilFiscalReport库也将打印其他电子文档的PDF;erpbrasil.edoc.pdf是一个较旧的库)

>>> # Imprimir o pdf de uma nota usando BrazilFiscalReport:
>>> pdf_bytes = nfe.to_pdf()
>>> # Imprimir o pdf de uma nota usando erpbrasil.edoc.pdf:
>>> pdf_bytes = nfe.to_pdf(engine="erpbrasil.edoc.pdf")
>>> # Ou então para imprimir e assinar junto:
>>> pdf_bytes = nfe.to_pdf(
    pkcs12_data=cert_data,
    pkcs12_password=cert_password,
    doc_id=nfe.NFe.infNFe.Id,
    )

国家标准NFS-e

>>> # Ler uma NFS-e:
>>>> from nfelib.nfse.bindings.v1_0.nfse_v1_00 import Nfse
>>> nfse = Nfse.from_path("alguma_nfse.xml")
>>>
>>> # Serializar uma NFS-e:
>>> nfse.to_xml()
>>> # Ler uma DPS:
>>>> from nfelib.nfse.bindings.v1_0.dps_v1_00 import Dps
>>> dps = Nfse.from_path("nfelib/nfse/samples/v1_0/GerarNFSeEnvio-env-loterps.xml")
>>>
>>> # Serializar uma DPS:
>>> dps.to_xml()

MDF-e

>>> # Ler um MDF-e:
>>>> from nfelib.mdfe.bindings.v3_0.mdfe_v3_00 import Mdfe
>>> mdfe = Mdfe.from_path("nfelib/mdfe/samples/v3_0/ComPagtoPIX_41210780568835000181580010402005751006005791-procMDFe.xml")
>>>
>>> # Serializar um MDF-e:
>>> mdfe.to_xml()

CT-e

>>> # Ler um CT-e:
>>>> from nfelib.cte.bindings.v4_0.cte_v4_00 import Cte
>>> cte = Cte.from_path("nfelib/cte/samples/v4_0/43120178408960000182570010000000041000000047-cte.xml")
>>>
>>> # Serializar um CT-e:
>>> cte.to_xml()

BP-e

>>> # Ler um BP-e:
>>>> from nfelib.bpe.bindings.v1_0.bpe_v1_00 import Bpe
>>> bpe = Bpe.from_path("algum_bpe.xml")
>>>
>>> # Serializar um BP-e:
>>> bpe.to_xml()

开发和测试

运行测试

pytest

更新绑定

  1. 下载新版本的方案zip文件,并更新nfelib/<nfe|nfse|cte|mdfe|bpe>/schemas/<versao>/文件夹

  2. 管理xsdata方案包的绑定,例如NF-e

    xsdata generate nfelib/nfe/schemas/v4_0 --package nfelib.nfe.bindings.v4_0
    

使用xsdata管理所有绑定

./script.sh

方案版本和文件夹

nfelib仅使用两位数字来表示版本。这是在观察到税务局从未使用版本号的第三位数字,并且第二位数字的变化已经代表了一个较大的变化后决定的。因此,任何不改变方案版本号的第一位和第二位的方案变更都会放在同一个文件夹中,并覆盖旧版本,假设可以使用最新的方案替代旧版本(例如,可以使用nfe包号9k(NT 2023.001 v.1.20)的绑定来读取NFe 4.00包号9j(NT 2022.003 v.1.00b))。

相反,如果存在影响前两位数字的重大变更,如NFe 3.0和NFe 3.1或NFe 3.1和NFe 4.0,则也可以使用不同的文件夹来同时支持多个版本。例如,可以同时发布未来的NFe 5.0和导入NFe 4.0。

项目详细信息


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

nfelib-2.1.1.tar.gz (540.5 kB 查看哈希值)

上传时间

构建分布

nfelib-2.1.1-py3-none-any.whl (845.6 kB 查看哈希值)

上传时间 Python 3

由以下支持