erpbrasil.edoc
Biblioteca Python para transmitir documentos fiscais eletrônicos brasileiros aos webservices das SEFAZ e das prefeituras: monta a mensagem, assina, envia, consulta e interpreta o retorno de NF-e, NFC-e, CT-e, MDF-e, manifestação do destinatário e NFS-e.
É a camada de transmissão da localização brasileira do Odoo (OCA/l10n-brazil), e pode ser usada em qualquer projeto Python. A assinatura digital vem da erpbrasil.assinatura e o transporte SOAP da erpbrasil.transmissao.
O que a biblioteca faz
Documento |
Classe |
Serviços |
|---|---|---|
NF-e (modelo 55) |
erpbrasil.edoc.nfe.NFe |
status do serviço, autorização (síncrona e assíncrona) e consulta do recibo, consulta por chave, cancelamento, carta de correção, inutilização, consulta de cadastro, distribuição de DF-e |
NFC-e (modelo 65) |
erpbrasil.edoc.nfce.NFCe |
os serviços da NF-e, autorização síncrona e QR Code |
Manifestação do destinatário |
erpbrasil.edoc.mde.MDe |
ciência, confirmação, desconhecimento e operação não realizada |
CT-e |
erpbrasil.edoc.cte.CTe |
status do serviço, autorização e consulta do recibo, consulta por chave, cancelamento, carta de correção, QR Code |
MDF-e |
erpbrasil.edoc.mdfe.MDFe |
status do serviço, autorização e consulta do recibo, consulta por chave, cancelamento, encerramento, QR Code |
NFS-e |
erpbrasil.edoc.provedores.cidades.NFSeFactory |
envio do lote de RPS, consulta do lote e da NFS-e, cancelamento (os serviços variam por provedor) |
O endereço do webservice é escolhido pela UF (ou pela cidade, na NFS-e) e pelo ambiente: 1 produção e 2 homologação.
Provedores de NFS-e
A NFSeFactory escolhe o provedor pelo código IBGE da cidade do prestador. A tabela traz as cidades homologadas.
Provedor |
Cidades (código IBGE) |
Bindings |
|---|---|---|
DSF |
Belém-PA (1501402), Teresina-PI (2211001), Uberlândia-MG (3170206), Nova Iguaçu-RJ (3303500), Campinas-SP (3509502), Campo Grande-MS (5002704) |
erpbrasil.edoc[nfselib.dsf] |
Ginfes |
Itajubá-MG (3132404), Franca-SP (3516200) |
erpbrasil.edoc[nfselib.ginfes] |
Paulistana |
São Paulo-SP (3550308) |
erpbrasil.edoc[nfselib.paulistana] |
ISSNet |
Ribeirão Preto-SP (3543402), Duque de Caxias-RJ (3301702) |
erpbrasil.edoc[nfselib.issnet] |
Barueri |
Barueri-SP (3505708) |
erpbrasil.edoc[nfselib.barueri] |
Outras cidades atendidas pelos mesmos provedores podem funcionar, mas não foram homologadas. Para usar uma delas, inclua o código IBGE da cidade no dicionário cidades de erpbrasil.edoc.provedores.cidades e homologue o envio, as consultas e o cancelamento antes de ir para produção; um PR com a cidade nova ajuda quem vier depois. Também dá para registrar em tempo de execução, sem mudar a biblioteca:
from erpbrasil.edoc.provedores.cidades import cidades
from erpbrasil.edoc.provedores.ginfes import Ginfes
cidades[codigo_ibge] = Ginfes # cidade atendida pelo Ginfes, ainda não homologada
Instalação
pip install erpbrasil.edoc
NF-e, NFC-e e manifestação do destinatário já funcionam com a instalação básica: as bindings que elas usam vêm embutidas no pacote (erpbrasil.nfelib_legacy). Os demais documentos pedem bindings externas, instaladas por extras:
pip install "erpbrasil.edoc[nfelib]" # CT-e e MDF-e
pip install "erpbrasil.edoc[nfselib.paulistana]" # NFS-e de São Paulo
Os extras de NFS-e seguem a tabela de provedores acima.
Como usar
Status do serviço da NF-e em homologação, em São Paulo (código IBGE da UF 35):
from erpbrasil.assinatura.certificado import Certificado
from erpbrasil.edoc.nfe import NFe
from erpbrasil.transmissao import TransmissaoSOAP
from requests import Session
certificado = Certificado("certificado-a1.pfx", "senha-do-certificado")
transmissao = TransmissaoSOAP(certificado, Session())
nfe = NFe(transmissao, "35", versao="4.00", ambiente="2")
processo = nfe.status_servico()
print(processo.resposta.cStat, processo.resposta.xMotivo)
NFS-e pela fábrica de provedores:
from erpbrasil.edoc.provedores.cidades import NFSeFactory
nfse = NFSeFactory(
transmissao=transmissao,
ambiente="2",
cidade_ibge=3550308,
cnpj_prestador="12345678000195",
im_prestador="12345678",
)
processo = nfse.envia_documento(lote_rps)
lote_rps é o objeto montado com as bindings do provedor (por exemplo, nfselib.paulistana).
Quem monta a NF-e, a NFC-e, o CT-e ou o MDF-e com as bindings da nfelib (xsdata) deve usar os adaptadores de nfelib.nfe.ws.edoc_legacy (NFeAdapter, NFCeAdapter, CTeAdapter, MDFeAdapter, MDeAdapter), que embrulham as classes desta biblioteca. É o caminho usado pela localização OCA.
Desenvolvimento
pip install tox pre-commit
pre-commit install
tox -e py310 # testes (também py38 e py39)
tox -e check # metadados do pacote e o RST deste arquivo
tox -e docs # documentação, inclusive a verificação de links
Os testes que falam com webservices reproduzem respostas gravadas com o vcrpy (tests/fixtures/vcr_cassettes). O tox fixa o vcrpy e o urllib3 em versões que reproduzem esses cassetes: rodar o pytest fora do tox, com versões mais novas, faz esses testes falharem com Invalid XML content received.
Para combinar a cobertura de todos os ambientes do tox no Linux e no macOS:
PYTEST_ADDOPTS=--cov-append tox
No Windows:
set PYTEST_ADDOPTS=--cov-append
tox
Publicação de uma versão
Atualizar o CHANGELOG.rst.
bump2version --no-tag patch (ou minor ou major): atualiza a versão no setup.py, neste arquivo, em docs/conf.py e em src/erpbrasil/edoc/__init__.py.
Abrir o PR com o bump e mesclar com o CI verde.
Criar a Release vX.Y.Z no GitHub sobre o commit mesclado (ela cria a tag).
A Release dispara o workflow publish, que gera o sdist e o wheel, confere se a versão do pacote é a da tag e publica no PyPI. Não há token no repositório: o PyPI aceita só este workflow, rodando no ambiente pypi (Trusted Publishing).
Para testar antes de anunciar, publique um release candidate (X.Y.Zrc1, com a Release marcada como pré-release): o pip só instala pré-releases quando pedido com --pre ou com a versão exata.
Créditos
Biblioteca criada pela Akretion e pela KMEE e mantida com a comunidade da localização brasileira, com contribuições da Engenere e da Escodoo, entre outras empresas e pessoas. Veja a lista de contribuidores.
Licença
MIT, veja o arquivo LICENSE.
Changelog
0.0.0 (2019-09-23)
First release on PyPI.
1.0.0 (2020-11-21)
- NF-e - Nota fiscal eletrônica;
Status Serviço;
Emissão;
Cancelamento;
Carta de correção;
Consulta Chave;
Consulta Distribuição;
- Manifestação do Destinatário;
Confirmação de Operação;
Ciência de Operação;
Desconhecimento da operação;
Operação não realizada;
- MDF-e - Manifesto Eletrônico de Documentos Fiscais (Transporte):
Status Serviço;
Consulta Documento;
Consulta Não Encerrados;
Emissão;
Cancelamento;
- NFS-E - Base para o desenvolvimento de provedores:
Status Serviço;
Consulta Documento;
Consulta NFS-e / RPS;
Consulta Lote RPS;
Emissão;
Cancelamento;
- Suporte ao provedor:
GINFES:
Implementação de testes automatizados;
2.0.0 (2021-04-09)
Refatoração do módulo de NF-e
2.1.0 (2021-05-01)
Manifestação do Destinatário
Consulta Cadastro
2.2.0 (2021-05-26)
Nota Paulistana
2.9.0 (2024-05-15)
Suporte para emissão de NF-e utilizando as Sefaz autorizadoras de contingência.
2.10.0 (2024-07-25)
Ceará passa a usar o webservice da SVRS.
URLs e expressão regular do Ginfes corrigidas.
Leitura do retorno SOAP com um padrão combinado de prefixos.
Versão da nfelib travada e erpbrasil.transmissao no requirements.
2.10.1 (2024-10-10)
URL da SEFAZ MG corrigida.
3.0.0 (2024-12-06)
CT-e: status do serviço, envio, cancelamento, carta de correção e cteProc.
MDF-e refatorado.
NF-e e NFC-e: monta_qrcode.
Busca das URLs dos webservices refatorada.
3.1.0 (2025-11-08)
Bindings generateDS legados de NF-e, NFC-e e eventos embutidos em erpbrasil.nfelib_legacy.
MDF-e: RS na SVRS e get_service_url levanta erro para UF sem configuração.
Manifestação do destinatário: endpoint de homologação corrigido.
3.1.1 (2026-01-08)
digVal: gds_format_base64 converte bytes para texto.
3.2.0 (2026-10-05)
Novidades:
NFS-e Paulistana: schema v03 (Reforma Tributária) opcional, com versao_schema="v03"; o v02 continua padrão e gera o mesmo XML (#101).
NFS-e Barueri: consulta pelo protocolo, download do arquivo do lote e retorno da consulta com a situação e a mensagem (#93).
Novo extra nfselib.barueri.
Correções:
assina_raiz não altera mais o XML depois de assinado, o que evitava a rejeição 297 com texto que tem quebra de linha (#97). No Ginfes o XML assinado continua sem quebras de linha, como até a 3.1.1.
Reassinatura descarta a Signature anterior e declara xmlns:ds na exportação dos bindings legados (#99).
CT-e e MDF-e: get_service_url aceita o ambiente como texto (#109). Quem passa "1" em texto, como a localização OCA na 14.0, transmitia o MDF-e para a homologação e passa a transmitir para a produção.
CT-e: PR, MT, MS e MG usam a autorizadora própria e RS a SVRS (#110).
MDF-e: todas as UFs autorizam na SVRS; MG, MS, MT e PR levantavam ValueError (#100).
NF-e: caminhos da contingência SVC-RS em produção, que estavam trocados entre os serviços (AM, BA, GO, MA, MS, MT, PE, PI e PR).
NF-e: o lote que volta já processado a um envio assíncrono (cStat 104, sem infRec), comum na contingência, não quebra mais o processar_documento com AttributeError depois da autorização; o processo é montado como no envio síncrono (#102).
NF-e: consulta de cadastro do AM e do PE pelo CadConsultaCadastro4, como publica o Portal NF-e; a versão 2 dava 404 (#87).
Barueri: analisa_retorno_consulta não levanta mais UnboundLocalError em retorno com erro.
Os extras nfelib e mdfelib instalam a nfelib (apontavam para pacotes inexistentes); sai o extra nfselib.betha.
Outros:
README reescrito; descrição e links do pacote no PyPI.
A Release do GitHub publica no PyPI (workflow publish, Trusted Publishing).
CI: py37 removido; zeep e requests por versão do Python (alertas de segurança); testes de Paulistana, ISSNet, chave, CT-e, MDF-e, contingência SVC-RS, Barueri e reassinatura.
Metadata
Release files for erpbrasil.edoc 3.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| erpbrasil_edoc-3.2.0.tar.gz | 658.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| erpbrasil_edoc-3.2.0-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details |
Total release size: 1.2 MB
Release files / erpbrasil_edoc-3.2.0.tar.gz
| Download URL | erpbrasil_edoc-3.2.0.tar.gz |
|---|---|
| Size | 658.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3e7d1a11fc80a1b8e65cc7f3d0130c792e60a61e052b101e70a5e8c42a8f3361
|
|
BLAKE2b-256 checksum How to use checksums |
fbead3e0c912ae46ab4d1d875a119ff3c727a6e59ac235350d3da8b41d40bb38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency logRelease files / erpbrasil_edoc-3.2.0-py2.py3-none-any.whl
| Download URL | erpbrasil_edoc-3.2.0-py2.py3-none-any.whl |
|---|---|
| Size | 510.5 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
2a416d5269ca0bcdb6129796bfaf89ba79bd015efba3c0cdfc6bda7267e513d0
|
|
BLAKE2b-256 checksum How to use checksums |
3cea12402ad37e1d70d5b593f5cf3d97f75a4ae48ec70f4414d1255d713411f6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency log