{"id":13405533,"url":"https://github.com/akretion/nfelib","last_synced_at":"2025-04-05T05:02:31.640Z","repository":{"id":25418325,"uuid":"103947788","full_name":"akretion/nfelib","owner":"akretion","description":"nfelib - bindings Python para e ler e gerir XML de NF-e, NFS-e nacional, CT-e, MDF-e, BP-e","archived":false,"fork":false,"pushed_at":"2024-07-18T16:20:05.000Z","size":3604,"stargazers_count":144,"open_issues_count":28,"forks_count":58,"subscribers_count":26,"default_branch":"master","last_synced_at":"2024-10-01T06:43:29.702Z","etag":null,"topics":["bpe","brasil","cte","mdfe","nfe","nfse","nota-fiscal-eletronica","python","sped"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/akretion.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"MIT-LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-09-18T14:12:52.000Z","updated_at":"2024-09-27T13:47:01.000Z","dependencies_parsed_at":"2024-01-04T19:24:15.720Z","dependency_job_id":"a7140714-4e6d-493d-a1e8-821a7d1e126d","html_url":"https://github.com/akretion/nfelib","commit_stats":{"total_commits":80,"total_committers":4,"mean_commits":20.0,"dds":0.09999999999999998,"last_synced_commit":"5888104e2206558825d0325a2fc08d947e7e0bf5"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akretion%2Fnfelib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akretion%2Fnfelib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akretion%2Fnfelib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akretion%2Fnfelib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/akretion","download_url":"https://codeload.github.com/akretion/nfelib/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247289409,"owners_count":20914464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bpe","brasil","cte","mdfe","nfe","nfse","nota-fiscal-eletronica","python","sped"],"created_at":"2024-07-30T19:02:04.817Z","updated_at":"2025-04-05T05:02:31.624Z","avatar_url":"https://github.com/akretion.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"nfelib - bindings Python para e ler e gerir XML de NF-e, NFS-e nacional, CT-e, MDF-e, BP-e\n==========================================================================================\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://akretion.com/pt-BR\" \u003e \n \u003cimg src=\"https://raw.githubusercontent.com/akretion/nfelib/master/ext/nfelib.jpg\"/\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://codecov.io/gh/akretion/nfelib\" \u003e \n \u003cimg src=\"https://codecov.io/gh/akretion/nfelib/branch/master/graph/badge.svg?token=IqcCHJzhuw\"/\u003e\n\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/nfelib/\"\u003e\u003cimg alt=\"PyPI\" src=\"https://img.shields.io/pypi/v/nfelib\"\u003e\u003c/a\u003e\n\u003ca href=\"https://pepy.tech/project/nfelib\"\u003e\u003cimg alt=\"Downloads\" src=\"https://pepy.tech/badge/nfelib\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\n## Porque escolher a nfelib\n\n* **Simples e confiável**. As outras bibliotecas costumam ter dezenas de milhares de linhas de código feito tudo manualmente para fazer o que o nfelib faz tudo automaticamente com algumas linhas para gerir código com o [xsdata](https://xsdata.readthedocs.io/) a partir dos últimos pacotes xsd da Fazenda. O xsdata é uma biblioteca de databinding extremamente bem escrita e bem testada. A própria nfelib tem testes para ler e gerir todos documentos fiscais.\n* **Completa**: já que gerir os bindings ficou trivial, a nfelib mantém atualizada todos os bindings para interagir com todos os serviços e eventos de NF-e, NFS-e nacional, CT-e, MDF-e, BP-e. Os testes detetam também quando sai uma nova versão de algum esquema.\n\n\n## Instalação\n\n```bash\npip install nfelib\n```\n\n## Como usar\n\n**NF-e**\n```python\n\u003e\u003e\u003e # Ler o XML de uma NF-e:\n\u003e\u003e\u003e from nfelib.nfe.bindings.v4_0.proc_nfe_v4_00 import NfeProc\n\u003e\u003e\u003e nfe_proc = NfeProc.from_path(\"nfelib/nfe/samples/v4_0/leiauteNFe/NFe35200159594315000157550010000000012062777161.xml\")\n\u003e\u003e\u003e # (pode ser usado também o metodo from_xml(xml) )\n\u003e\u003e\u003e\n\u003e\u003e\u003e nfe_proc.NFe.infNFe.emit.CNPJ\n'59594315000157'\n\u003e\u003e\u003e nfe_proc.NFe.infNFe.emit\nTnfe.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=\u003cTufEmi.SP: 'SP'\u003e, CEP='18125000', cPais=\u003cTenderEmiCPais.VALUE_1058: '1058'\u003e, xPais=\u003cTenderEmiXPais.BRASIL: 'Brasil'\u003e, fone='2130109965'), IE='755338250133', IEST=None, IM=None, CNAE=None, CRT=\u003cEmitCrt.VALUE_1: '1'\u003e)\n\u003e\u003e\u003e nfe_proc.NFe.infNFe.emit.enderEmit.UF.value\n'SP'\n\u003e\u003e\u003e\n\u003e\u003e\u003e # Serializar uma NF-e:\n\u003e\u003e\u003e nfe_proc.to_xml()\n'\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\\n\u003cnfeProc xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"4.00\"\u003e\\n  \u003cNFe\u003e\\n    \u003cinfNFe versao=\"4.00\" Id=\"35200159594315000157550010000000012062777161\"\u003e\\n      \u003cide\u003e\\n        \u003ccUF\u003e35\u003c/cUF\u003e\\n        \u003ccNF\u003e06277716\u003c/cNF\u003e\\n        \u003cnatOp\u003eVenda\u003c/natOp\u003e\\n        \u003cmod\u003e55\u003c/mod\u003e\\n        \u003cserie\u003e1\u003c/serie\u003e\\n        \u003cnNF\u003e1\u003c/nNF\u003e\\n        \u003cdhEmi\u003e2020-01-01T12:00:00+01:00\u003c/dhEmi\u003e\\n        \u003cdhSaiEnt\u003e2020-01-01T12:00:00+01:00\u003c/dhSaiEnt\u003e\\n        \u003ctpNF\u003e1\u003c/tpNF\u003e\\n        \u003cidDest\u003e1\u003c/idDest\u003e\\n [...]\n\u003e\u003e\u003e\n\u003e\u003e\u003e # Montar uma NFe do zero:\n\u003e\u003e\u003e from nfelib.nfe.bindings.v4_0.nfe_v4_00 import Nfe\n\u003e\u003e\u003e nfe=Nfe(infNFe=Nfe.InfNfe(emit=Nfe.InfNfe.Emit(xNome=\"Minha Empresa\", CNPJ='59594315000157')))\n\u003e\u003e\u003e nfe\nNfe(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)\n\u003e\u003e\u003e \n\u003e\u003e\u003e # Validar o XML de uma nota:\n\u003e\u003e\u003e nfe.validate_xml()\n[\"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.\" [...]\n```\n\nAssinar o XML de uma nota usando a lib [erpbrasil.assinatura](https://github.com/erpbrasil/erpbrasil.assinatura) (funciona com os outros documentos eletrônicos também)\n```\n\u003e\u003e\u003e # Assinar o XML de uma nota:\n\u003e\u003e\u003e with open(path_to_your_pkcs12_certificate, \"rb\") as pkcs12_buffer:\n    pkcs12_data = pkcs12_buffer.read()\n\u003e\u003e\u003e signed_xml = nfe.sign_xml(xml, pkcs12_data, cert_password, nfe.NFe.infNFe.Id)\n```\n\nImprimir o DANFE usando a lib [BrazilFiscalReport](https://github.com/Engenere/BrazilFiscalReport) ou a lib [erpbrasil.edoc.pdf](https://github.com/erpbrasil/erpbrasil.edoc.pdf) (futuramente BrazilFiscalReport deve imprimir o pdf de outros documentos eletrônicos também; erpbrasil.edoc.pdf é uma lib mais 'legacy')\n```\n\u003e\u003e\u003e # Imprimir o pdf de uma nota usando BrazilFiscalReport:\n\u003e\u003e\u003e pdf_bytes = nfe.to_pdf()\n\u003e\u003e\u003e # Imprimir o pdf de uma nota usando erpbrasil.edoc.pdf:\n\u003e\u003e\u003e pdf_bytes = nfe.to_pdf(engine=\"erpbrasil.edoc.pdf\")\n\u003e\u003e\u003e # Ou então para imprimir e assinar junto:\n\u003e\u003e\u003e pdf_bytes = nfe.to_pdf(\n    pkcs12_data=cert_data,\n    pkcs12_password=cert_password,\n    doc_id=nfe.NFe.infNFe.Id,\n    )\n```\n\n**NFS-e padrão nacional**\n```python\n\u003e\u003e\u003e # Ler uma NFS-e:\n\u003e\u003e\u003e\u003e from nfelib.nfse.bindings.v1_0.nfse_v1_00 import Nfse\n\u003e\u003e\u003e nfse = Nfse.from_path(\"alguma_nfse.xml\")\n\u003e\u003e\u003e\n\u003e\u003e\u003e # Serializar uma NFS-e:\n\u003e\u003e\u003e nfse.to_xml()\n\u003e\u003e\u003e # Ler uma DPS:\n\u003e\u003e\u003e\u003e from nfelib.nfse.bindings.v1_0.dps_v1_00 import Dps\n\u003e\u003e\u003e dps = Nfse.from_path(\"nfelib/nfse/samples/v1_0/GerarNFSeEnvio-env-loterps.xml\")\n\u003e\u003e\u003e\n\u003e\u003e\u003e # Serializar uma DPS:\n\u003e\u003e\u003e dps.to_xml()\n```\n\n**MDF-e**\n```python\n\u003e\u003e\u003e # Ler um MDF-e:\n\u003e\u003e\u003e\u003e from nfelib.mdfe.bindings.v3_0.mdfe_v3_00 import Mdfe\n\u003e\u003e\u003e mdfe = Mdfe.from_path(\"nfelib/mdfe/samples/v3_0/ComPagtoPIX_41210780568835000181580010402005751006005791-procMDFe.xml\")\n\u003e\u003e\u003e\n\u003e\u003e\u003e # Serializar um MDF-e:\n\u003e\u003e\u003e mdfe.to_xml()\n```\n\n**CT-e**\n```python\n\u003e\u003e\u003e # Ler um CT-e:\n\u003e\u003e\u003e\u003e from nfelib.cte.bindings.v4_0.cte_v4_00 import Cte\n\u003e\u003e\u003e cte = Cte.from_path(\"nfelib/cte/samples/v4_0/43120178408960000182570010000000041000000047-cte.xml\")\n\u003e\u003e\u003e\n\u003e\u003e\u003e # Serializar um CT-e:\n\u003e\u003e\u003e cte.to_xml()\n```\n\n**BP-e**\n```python\n\u003e\u003e\u003e # Ler um BP-e:\n\u003e\u003e\u003e\u003e from nfelib.bpe.bindings.v1_0.bpe_v1_00 import Bpe\n\u003e\u003e\u003e bpe = Bpe.from_path(\"algum_bpe.xml\")\n\u003e\u003e\u003e\n\u003e\u003e\u003e # Serializar um BP-e:\n\u003e\u003e\u003e bpe.to_xml()\n```\n\n\n## Desenvolvimento / testes\n\nPara rodar os testes:\n\n```bash\npytest\n```\n\nPara atualizar os bindings:\n\n1. baixar o novo zip dos esquemas e atualizar a pasta ```nfelib/\u003cnfe|nfse|cte|mdfe|bpe\u003e/schemas/\u003cversao\u003e/```\n2. gerir os bindings de um pacote de esquemas xsd, por examplo da NF-e:\n\n    ```bash\n    xsdata generate nfelib/nfe/schemas/v4_0 --package nfelib.nfe.bindings.v4_0\n    ```\n\nPara gerir todos bindings com xsdata:\n\n```bash\n./script.sh\n```\n\n## Versões dos esquemas e pastas\n\nA nfelib usa apenas 2 dígitos para caracterizar a versão. Isso foi decidido observando que a Fazenda nunca usa o terceiro dígito da versão e que a mudança do segundo dígito já caracteriza uma mudança maior. Nisso qualquer alteração de esquema que não mudar o primeiro nem o segundo dígito da versão do esquema vai na mesma pasta e se sobreponha a antiga versão, assumindo que é possível usar o mais novo esquema no lugar do antigo (por exemplo é possível ler uma NFe 4.00 pacote nº 9j (NT 2022.003 v.1.00b) com os bindings da versão nfe pacote nº 9k (NT 2023.001 v.1.20).\n\nPelo contrário, caso houver uma mudança maior afetando os 2 primeiros dígitos como NFe 3.0 e NFe 3.1 ou NFe 3.1 e NFe 4.0, será possível também suportar as várias versões ao mesmo tempo usando pastas diferentes. Assim seria possível por exemplo emitir a futura NFe 5.0 e ainda importar uma NFe 4.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakretion%2Fnfelib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakretion%2Fnfelib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakretion%2Fnfelib/lists"}