# PyTrustNFe
Biblioteca Python que tem por objetivo enviar NFe, NFCe e NFSe no Brasil
[![Coverage Status](https://coveralls.io/repos/danimaribeiro/PyTrustNFe/badge.svg?branch=master3)](https://coveralls.io/r/danimaribeiro/PyTrustNFe?branch=master3)
[![Build Status](https://app.travis-ci.com/danimaribeiro/PyTrustNFe.svg?branch=master3)](https://travis-ci.org/danimaribeiro/PyTrustNFe)
[![PyPI version](https://badge.fury.io/py/PyTrustNFe3.svg)](https://badge.fury.io/py/PyTrustNFe3)
Pacotes necessários para instalação:
```apt-get install --no-install-recommends python3-pip python3-wheel python3-setuptools python3-openssl python3-lxml```
Dependências:
* PyXmlSec
* lxml
* signxml
* suds-jurko
* suds-jurko-requests
* reportlab
* Jinja2
NFSe - Cidades atendidas
-----------------------------
* **Paulistana** - São Paulo/SP
* **Nota Carioca** - Rio de Janeiro/RJ
* **Imperial** - Petrópolis/RH
* **Goiânia** - Goiânia/GO
* [Susesu](cidades/susesu.md) - 3 cidades atendidas
* [Simpliss](cidades/simpliss.md) - 18 cidade atendidas
* [GINFES](cidades/ginfes.md) - 79 cidades atendidas
* [DSF](cidades/dsf.md) - 7 cidades atendidas
Roadmap
--------------
Teste unitários
Implementar novos provedores de NFSe
* [Betha](cidades/betha.md) - 81 cidades atendidas WIP
* [WebISS](cidades/webiss.md) - 51 cidades atendidas
* [ISSIntel](cidades/issintel.md) - 32 cidades atendidas
* [ISSNET](cidades/issnet.md) - 32 cidades atendidas
* [Saatri](cidades/saatri.md) - 31 cidades atendidas
Exemplos de uso da NFe
-----------------------------
Consulta Cadastro por CNPJ:
```python
from pytrustnfe.nfe import consulta_cadastro
from pytrustnfe.certificado import Certificado
certificado = open("/path/certificado.pfx", "r").read()
certificado = Certificado(certificado, 'senha_pfx')
obj = {'cnpj': '12345678901234', 'estado': '42'}
resposta = consulta_cadastro(certificado, obj=obj, ambiente=1, estado='42')
```
Consulta Distribuição NF-e sem Validação de Esquema:
```python
from pytrustnfe.certificado import Certificado
from pytrustnfe.nfe import consulta_distribuicao_nfe, xml_consulta_distribuicao_nfe
certificado = open("/path/certificado.pfx", "r").read()
certificado = Certificado(certificado, 'senha_pfx')
# Gerando xml e enviado consulta por Ultimo NSU
response1 = consulta_distribuicao_nfe(
certificado,
ambiente=1,
estado='42',
modelo='55',
cnpj_cpf='12345678901234',
ultimo_nsu='123456789101213'
)
# Gerando xml e enviado consulta por Chave
response2 = consulta_distribuicao_nfe(
certificado,
ambiente=1,
estado='42',
modelo='55',
cnpj_cpf='12345678901234',
chave_nfe='012345678901234567890123456789012345678912'
)
# Gerando xml e enviado consulta por NSU
response3 = consulta_distribuicao_nfe(
certificado,
ambiente=1,
estado='42',
modelo='55',
cnpj_cpf='12345678901234',
nsu='123456789101213'
)
```
Consulta Distribuição NF-e com Validação de Esquema:
```python
from pytrustnfe.certificado import Certificado
from pytrustnfe.nfe import consulta_distribuicao_nfe, xml_consulta_distribuicao_nfe
from pytrustnfe.xml.validate import valida_nfe, SCHEMA_DFE
certificado = open("/path/certificado.pfx", "r").read()
certificado = Certificado(certificado, 'senha_pfx')
# Gerando XML para Consulta por Ultimo NSU
xml1 = xml_consulta_distribuicao_nfe(
certificado,
ambiente=1,
estado='42',
cnpj_cpf='12345678901234',
ultimo_nsu='123456789101213'
)
# Validando o XML com Esquema
if valida_nfe(xml1, SCHEMA_DFE):
Warning("Erro na validação do esquema")
# Gerando XML para Consulta por Chave
xml2 = xml_consulta_distribuicao_nfe(
certificado,
ambiente=1,
estado='42',
cnpj_cpf='12345678901234',
chave_nfe='012345678901234567890123456789012345678912'
)
# Validando o XML com Esquema
if valida_nfe(xml2, SCHEMA_DFE):
Warning("Erro na validação do esquema")
# Gerando XML para Consulta por NSU
xml3 = xml_consulta_distribuicao_nfe(
certificado,
ambiente=1,
estado='42',
cnpj_cpf='12345678901234',
nsu='123456789101213'
)
# Validando o XML com Esquema
if valida_nfe(xml3, SCHEMA_DFE):
Warning("Erro na validação do esquema")
# Enviando xml de consulta para sefaz
response = consulta_distribuicao_nfe(
certificado,
ambiente=1,
estado='42',
modelo='55',
xml=xml1
)
```
Exemplo de uso da NFSe Paulistana
---------------------------------
Envio de RPS por lote
```python
certificado = open('/path/certificado.pfx', 'r').read()
certificado = Certificado(certificado, '123456')
# Necessário criar um dicionário com os dados, validação dos dados deve
# ser feita pela aplicação que está utilizando a lib
rps = [
{
'assinatura': '123',
'serie': '1',
'numero': '1',
'data_emissao': '2016-08-29',
'codigo_atividade': '07498',
'valor_servico': '2.00',
'valor_deducao': '3.00',
'prestador': {
'inscricao_municipal': '123456'
},
'tomador': {
'tipo_cpfcnpj': '1',
'cpf_cnpj': '12345678923256',
'inscricao_municipal': '123456',
'razao_social': 'Trustcode',
'tipo_logradouro': '1',
'logradouro': 'Vinicius de Moraes, 42',
'numero': '42',
'bairro': 'Corrego',
'cidade': '4205407', # Código da cidade, de acordo com o IBGE
'uf': 'SC',
'cep': '88037240',
},
'codigo_atividade': '07498',
'aliquota_atividade': '5.00',
'descricao': 'Venda de servico'
}
]
nfse = {
'cpf_cnpj': '12345678901234',
'data_inicio': '2016-08-29',
'data_fim': '2016-08-29',
'total_servicos': '2.00',
'total_deducoes': '3.00',
'lista_rps': rps
}
retorno = envio_lote_rps(certificado, nfse=nfse)
# retorno é um dicionário { 'received_xml':'', 'sent_xml':'', 'object': object() }
print retorno['received_xml']
print retorno['sent_xml']
# retorno['object'] é um objeto python criado apartir do xml de resposta
print retorno['object'].Cabecalho.Sucesso
print retorno['object'].ChaveNFeRPS.ChaveNFe.NumeroNFe
print retorno['object'].ChaveNFeRPS.ChaveRPS.NumeroRPS
```
Cancelamento de NFSe:
```python
from pytrustnfe.certificado import Certificado
from pytrustnfe.nfse.paulistana import cancelamento_nfe
certificado = open('/path/certificado.pfx', 'r').read()
certificado = Certificado(certificado, '123456')
cancelamento = {
'cnpj_remetente': '123',
'assinatura': 'assinatura',
'numero_nfse': '456',
'inscricao_municipal': '654',
'codigo_verificacao': '789',
}
retorno = cancelamento_nfe(certificado, cancelamento=cancelamento)
# retorno é um dicionário { 'received_xml':'', 'sent_xml':'', 'object': object() }
print retorno['received_xml']
print retorno['sent_xml']
# retorno['object'] é um objeto python criado apartir do xml de resposta
print retorno['object'].Cabecalho.Sucesso
if not retorno['object'].Cabecalho.Sucesso: # Cancelamento com erro
print retorno['object'].Erro.Codigo
print retorno['object'].Erro.Descricao
```
Raw data
{
"_id": null,
"home_page": "https://github.com/danimaribeiro/PyTrustNFe",
"name": "pytrustnfe3",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "nfe,mdf-e",
"author": "Danimar Ribeiro",
"author_email": "danimaribeiro@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/bd/40/152703e98a1abeca22c80f355cd0173c38eca39b3f9019395244803d4076/pytrustnfe3-2.0.1.tar.gz",
"platform": null,
"description": "# PyTrustNFe\nBiblioteca Python que tem por objetivo enviar NFe, NFCe e NFSe no Brasil\n\n[![Coverage Status](https://coveralls.io/repos/danimaribeiro/PyTrustNFe/badge.svg?branch=master3)](https://coveralls.io/r/danimaribeiro/PyTrustNFe?branch=master3)\n[![Build Status](https://app.travis-ci.com/danimaribeiro/PyTrustNFe.svg?branch=master3)](https://travis-ci.org/danimaribeiro/PyTrustNFe)\n[![PyPI version](https://badge.fury.io/py/PyTrustNFe3.svg)](https://badge.fury.io/py/PyTrustNFe3)\n\nPacotes necess\u00e1rios para instala\u00e7\u00e3o:\n\n```apt-get install --no-install-recommends python3-pip python3-wheel python3-setuptools python3-openssl python3-lxml```\n\n\nDepend\u00eancias:\n* PyXmlSec\n* lxml\n* signxml\n* suds-jurko\n* suds-jurko-requests\n* reportlab\n* Jinja2\n\n\nNFSe - Cidades atendidas\n-----------------------------\n* **Paulistana** - S\u00e3o Paulo/SP\n* **Nota Carioca** - Rio de Janeiro/RJ\n* **Imperial** - Petr\u00f3polis/RH\n* **Goi\u00e2nia** - Goi\u00e2nia/GO\n* [Susesu](cidades/susesu.md) - 3 cidades atendidas\n* [Simpliss](cidades/simpliss.md) - 18 cidade atendidas\n* [GINFES](cidades/ginfes.md) - 79 cidades atendidas\n* [DSF](cidades/dsf.md) - 7 cidades atendidas\n\nRoadmap\n--------------\nTeste unit\u00e1rios\n\nImplementar novos provedores de NFSe\n* [Betha](cidades/betha.md) - 81 cidades atendidas WIP\n* [WebISS](cidades/webiss.md) - 51 cidades atendidas\n* [ISSIntel](cidades/issintel.md) - 32 cidades atendidas\n* [ISSNET](cidades/issnet.md) - 32 cidades atendidas\n* [Saatri](cidades/saatri.md) - 31 cidades atendidas\n\n\nExemplos de uso da NFe\n-----------------------------\n\nConsulta Cadastro por CNPJ:\n\n```python\nfrom pytrustnfe.nfe import consulta_cadastro\nfrom pytrustnfe.certificado import Certificado\n\ncertificado = open(\"/path/certificado.pfx\", \"r\").read()\ncertificado = Certificado(certificado, 'senha_pfx')\nobj = {'cnpj': '12345678901234', 'estado': '42'}\nresposta = consulta_cadastro(certificado, obj=obj, ambiente=1, estado='42')\n```\nConsulta Distribui\u00e7\u00e3o NF-e sem Valida\u00e7\u00e3o de Esquema:\n```python\nfrom pytrustnfe.certificado import Certificado\nfrom pytrustnfe.nfe import consulta_distribuicao_nfe, xml_consulta_distribuicao_nfe\n\ncertificado = open(\"/path/certificado.pfx\", \"r\").read()\ncertificado = Certificado(certificado, 'senha_pfx')\n\n# Gerando xml e enviado consulta por Ultimo NSU\nresponse1 = consulta_distribuicao_nfe(\n certificado,\n ambiente=1,\n estado='42',\n modelo='55',\n cnpj_cpf='12345678901234',\n ultimo_nsu='123456789101213'\n)\n\n# Gerando xml e enviado consulta por Chave\nresponse2 = consulta_distribuicao_nfe(\n certificado,\n ambiente=1,\n estado='42',\n modelo='55',\n cnpj_cpf='12345678901234',\n chave_nfe='012345678901234567890123456789012345678912'\n)\n\n# Gerando xml e enviado consulta por NSU\nresponse3 = consulta_distribuicao_nfe(\n certificado,\n ambiente=1,\n estado='42',\n modelo='55',\n cnpj_cpf='12345678901234',\n nsu='123456789101213'\n)\n```\n\nConsulta Distribui\u00e7\u00e3o NF-e com Valida\u00e7\u00e3o de Esquema:\n```python\nfrom pytrustnfe.certificado import Certificado\nfrom pytrustnfe.nfe import consulta_distribuicao_nfe, xml_consulta_distribuicao_nfe\nfrom pytrustnfe.xml.validate import valida_nfe, SCHEMA_DFE\n\ncertificado = open(\"/path/certificado.pfx\", \"r\").read()\ncertificado = Certificado(certificado, 'senha_pfx')\n\n# Gerando XML para Consulta por Ultimo NSU\nxml1 = xml_consulta_distribuicao_nfe(\n certificado,\n ambiente=1,\n estado='42',\n cnpj_cpf='12345678901234',\n ultimo_nsu='123456789101213'\n)\n\n# Validando o XML com Esquema\nif valida_nfe(xml1, SCHEMA_DFE):\n Warning(\"Erro na valida\u00e7\u00e3o do esquema\")\n \n# Gerando XML para Consulta por Chave\nxml2 = xml_consulta_distribuicao_nfe(\n certificado,\n ambiente=1,\n estado='42',\n cnpj_cpf='12345678901234',\n chave_nfe='012345678901234567890123456789012345678912'\n)\n\n# Validando o XML com Esquema\nif valida_nfe(xml2, SCHEMA_DFE):\n Warning(\"Erro na valida\u00e7\u00e3o do esquema\")\n \n# Gerando XML para Consulta por NSU\nxml3 = xml_consulta_distribuicao_nfe(\n certificado,\n ambiente=1,\n estado='42',\n cnpj_cpf='12345678901234',\n nsu='123456789101213'\n)\n\n# Validando o XML com Esquema\nif valida_nfe(xml3, SCHEMA_DFE):\n Warning(\"Erro na valida\u00e7\u00e3o do esquema\")\n\n# Enviando xml de consulta para sefaz\nresponse = consulta_distribuicao_nfe(\n certificado,\n ambiente=1,\n estado='42',\n modelo='55',\n xml=xml1\n)\n```\n\nExemplo de uso da NFSe Paulistana\n---------------------------------\n\nEnvio de RPS por lote\n\n```python\ncertificado = open('/path/certificado.pfx', 'r').read()\ncertificado = Certificado(certificado, '123456')\n# Necess\u00e1rio criar um dicion\u00e1rio com os dados, valida\u00e7\u00e3o dos dados deve\n# ser feita pela aplica\u00e7\u00e3o que est\u00e1 utilizando a lib\nrps = [\n {\n 'assinatura': '123',\n 'serie': '1',\n 'numero': '1',\n 'data_emissao': '2016-08-29',\n 'codigo_atividade': '07498',\n 'valor_servico': '2.00',\n 'valor_deducao': '3.00',\n 'prestador': {\n 'inscricao_municipal': '123456'\n },\n 'tomador': {\n 'tipo_cpfcnpj': '1',\n 'cpf_cnpj': '12345678923256',\n 'inscricao_municipal': '123456',\n 'razao_social': 'Trustcode',\n 'tipo_logradouro': '1',\n 'logradouro': 'Vinicius de Moraes, 42',\n 'numero': '42',\n 'bairro': 'Corrego',\n 'cidade': '4205407', # C\u00f3digo da cidade, de acordo com o IBGE\n 'uf': 'SC',\n 'cep': '88037240',\n },\n 'codigo_atividade': '07498',\n 'aliquota_atividade': '5.00',\n 'descricao': 'Venda de servico'\n }\n]\nnfse = {\n 'cpf_cnpj': '12345678901234',\n 'data_inicio': '2016-08-29',\n 'data_fim': '2016-08-29',\n 'total_servicos': '2.00',\n 'total_deducoes': '3.00',\n 'lista_rps': rps\n}\n\nretorno = envio_lote_rps(certificado, nfse=nfse)\n# retorno \u00e9 um dicion\u00e1rio { 'received_xml':'', 'sent_xml':'', 'object': object() }\nprint retorno['received_xml']\nprint retorno['sent_xml']\n\n# retorno['object'] \u00e9 um objeto python criado apartir do xml de resposta\nprint retorno['object'].Cabecalho.Sucesso\nprint retorno['object'].ChaveNFeRPS.ChaveNFe.NumeroNFe\nprint retorno['object'].ChaveNFeRPS.ChaveRPS.NumeroRPS\n```\n\n\nCancelamento de NFSe:\n\n```python\nfrom pytrustnfe.certificado import Certificado\nfrom pytrustnfe.nfse.paulistana import cancelamento_nfe\n\ncertificado = open('/path/certificado.pfx', 'r').read()\ncertificado = Certificado(certificado, '123456')\ncancelamento = {\n 'cnpj_remetente': '123',\n 'assinatura': 'assinatura',\n 'numero_nfse': '456',\n 'inscricao_municipal': '654',\n 'codigo_verificacao': '789',\n}\n\nretorno = cancelamento_nfe(certificado, cancelamento=cancelamento)\n\n# retorno \u00e9 um dicion\u00e1rio { 'received_xml':'', 'sent_xml':'', 'object': object() }\nprint retorno['received_xml']\nprint retorno['sent_xml']\n\n# retorno['object'] \u00e9 um objeto python criado apartir do xml de resposta\nprint retorno['object'].Cabecalho.Sucesso\n\nif not retorno['object'].Cabecalho.Sucesso: # Cancelamento com erro\n print retorno['object'].Erro.Codigo\n print retorno['object'].Erro.Descricao\n```\n",
"bugtrack_url": null,
"license": "LGPL-v2.1+",
"summary": "PyTrustNFe \u00e9 uma biblioteca para envio de NF-e",
"version": "2.0.1",
"project_urls": {
"Homepage": "https://github.com/danimaribeiro/PyTrustNFe"
},
"split_keywords": [
"nfe",
"mdf-e"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "fb0296034b856a65da5d0c741dd1e96053839e3f6135371c73dec40294fb1655",
"md5": "d8b1b73ea2f437c54239ec4b93a63683",
"sha256": "2ebd6f2ddefce870f20a57fdbefd71b797d299a3f1c798a465ddc13db9e51b72"
},
"downloads": -1,
"filename": "pytrustnfe3-2.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "d8b1b73ea2f437c54239ec4b93a63683",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 205568,
"upload_time": "2023-10-05T19:41:37",
"upload_time_iso_8601": "2023-10-05T19:41:37.904906Z",
"url": "https://files.pythonhosted.org/packages/fb/02/96034b856a65da5d0c741dd1e96053839e3f6135371c73dec40294fb1655/pytrustnfe3-2.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bd40152703e98a1abeca22c80f355cd0173c38eca39b3f9019395244803d4076",
"md5": "2798738718634af4889af7e7b75ecdde",
"sha256": "7928f0dc48f4147a5f3db5d3d7011e970497b93f3719ab404e671823690bfa7e"
},
"downloads": -1,
"filename": "pytrustnfe3-2.0.1.tar.gz",
"has_sig": false,
"md5_digest": "2798738718634af4889af7e7b75ecdde",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 167274,
"upload_time": "2023-10-05T19:41:39",
"upload_time_iso_8601": "2023-10-05T19:41:39.855304Z",
"url": "https://files.pythonhosted.org/packages/bd/40/152703e98a1abeca22c80f355cd0173c38eca39b3f9019395244803d4076/pytrustnfe3-2.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-10-05 19:41:39",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "danimaribeiro",
"github_project": "PyTrustNFe",
"travis_ci": true,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "pytrustnfe3"
}