Browse Source

[MERGE] Merge com o branch 'master3' do fork para atualizar a lib

- Adicionado suporte a NFCE
pull/283/head
Rodrigo Ferreira Rodrigues 6 years ago
parent
commit
2292d093e9
  1. 1
      .gitignore
  2. 99
      README.md
  3. 221
      pytrustnfe/Servidores.py
  4. 58
      pytrustnfe/nfe/__init__.py
  5. 28
      pytrustnfe/nfe/danfce.py
  6. 22
      pytrustnfe/nfe/danfe.py
  7. 39
      pytrustnfe/nfe/patch.py
  8. 3
      pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml
  9. 97
      pytrustnfe/nfe/templates/NfeAutorizacao.xml
  10. 81
      pytrustnfe/nfse/aparecida/__init__.py
  11. 91
      pytrustnfe/nfse/aparecida/templates/Rps.xml
  12. 15
      pytrustnfe/nfse/aparecida/templates/cancelarNfse.xml
  13. 7
      pytrustnfe/nfse/aparecida/templates/consultarLoteRps.xml
  14. 13
      pytrustnfe/nfse/aparecida/templates/recepcionarLoteRps.xml
  15. 8
      pytrustnfe/nfse/bh/__init__.py
  16. 4
      pytrustnfe/nfse/bh/templates/CancelarNfse.xml
  17. 1
      pytrustnfe/nfse/floripa/__init__.py
  18. 2
      pytrustnfe/nfse/ginfes/__init__.py
  19. 69
      pytrustnfe/nfse/imperial/__init__.py
  20. 17
      pytrustnfe/nfse/imperial/templates/CANCELANOTAELETRONICA.xml
  21. 9
      pytrustnfe/nfse/imperial/templates/CONSULTANOTASPROTOCOLO.xml
  22. 9
      pytrustnfe/nfse/imperial/templates/CONSULTAPROTOCOLO.xml
  23. 14
      pytrustnfe/nfse/imperial/templates/CancelarNota.xml
  24. 43
      pytrustnfe/nfse/imperial/templates/GerarNota.xml
  25. 81
      pytrustnfe/nfse/imperial/templates/PROCESSARPS.xml
  26. 5
      pytrustnfe/nfse/imperial/templates/SoapRequest.xml
  27. 2
      pytrustnfe/nfse/simpliss/__init__.py
  28. 150
      pytrustnfe/urls.py
  29. 297
      pytrustnfe/xml/schemas/distDFeInt_v1.01.xsd
  30. 4247
      pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd
  31. 5
      pytrustnfe/xml/validate.py
  32. 2
      requirements.txt
  33. 6
      setup.py
  34. 2
      tests/test_servidores.py

1
.gitignore

@ -11,6 +11,7 @@ dist/
*egg*/
docs/_build
.vscode/tags
.vscode/
.cache
.idea/
venv/

99
README.md

@ -17,7 +17,7 @@ Dependências:
NFSe - Cidades atendidas
--------------
-----------------------------
* **Paulistana** - São Paulo/SP
* **Nota Carioca** - Rio de Janeiro/RJ
* **Imperial** - Petrópolis/RH
@ -39,7 +39,7 @@ Implementar novos provedores de NFSe
Exemplos de uso da NFe
---------------
-----------------------------
Consulta Cadastro por CNPJ:
@ -52,7 +52,102 @@ 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
---------------------------------

221
pytrustnfe/Servidores.py

@ -132,7 +132,7 @@ SVRS = {
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', # noqa
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx?wsdl', # noqa
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfe-homologacao.svrs.rs.gov.br',
@ -142,7 +142,7 @@ SVRS = {
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', # noqa
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx?wsdl', # noqa
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa
}
},
NFCE_MODELO: {
@ -268,29 +268,29 @@ UFAM = {
},
NFCE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.am.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'services2/services/NfeConsulta2',
WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2',
WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2',
'servidor': 'nfce.sefaz.am.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfce-services/services/RecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfce-services/services/NfeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfce-services/services/NfeRetAutorizacao4?wsdl',
WS_NFE_INUTILIZACAO: 'nfce-services/services/NfeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfce-services/services/NfeConsulta4?wsdl',
WS_NFE_SITUACAO: 'nfce-services/services/NfeStatusServico4?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homnfce.sefaz.am.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfce-services-nac/services/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'nfce-services-nac/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfce-services-nac/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfce-services-nac/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfce-services-nac/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfce-services-nac/services/NfeStatusServico2',
WS_NFE_RECEPCAO_EVENTO: 'nfce-services/services/RecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfce-services/services/NfeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfce-services/services/NfeRetAutorizacao4?wsdl',
WS_NFE_INUTILIZACAO: 'nfce-services/services/NfeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfce-services/services/NfeConsulta4?wsdl',
WS_NFE_SITUACAO: 'nfce-services/services/NfeStatusServico4?wsdl',
WS_NFCE_QR_CODE: 'http://homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp',
}
}
}
UFBA = {
NFE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.ba.gov.br',
WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa
@ -311,6 +311,29 @@ UFBA = {
WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa
WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa
}
},
NFCE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfce.svrs.rs.gov.br',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl',
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa
WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx?',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfce-homologacao.svrs.rs.gov.br',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl',
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa
WS_NFCE_QR_CODE: 'http://dec.fazenda.df.gov.br/ConsultarNFCe.aspx?',
}
}
}
UFCE = {
@ -362,6 +385,7 @@ UFGO = {
UFMT = {
<<<<<<< HEAD
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.mt.gov.br',
WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl',
@ -381,10 +405,56 @@ UFMT = {
WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl',
=======
NFE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.mt.gov.br',
WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl',
WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.sefaz.mt.gov.br',
WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta4?wsdl',
WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl',
}
},
NFCE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfce.sefaz.mt.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfcews/services/RecepcaoEvento4',
WS_NFE_AUTORIZACAO: 'nfcews/services/NfeAutorizacao4',
WS_NFE_RET_AUTORIZACAO: 'nfcews/services/NfeRetAutorizacao4',
WS_NFE_INUTILIZACAO: 'nfcews/services/NfeInutilizacao4',
WS_NFE_CONSULTA: 'nfcews/services/NfeConsulta4',
WS_NFE_SITUACAO: 'nfcews/services/NfeStatusServico4',
WS_NFCE_QR_CODE: 'http://www.sefaz.mt.gov.br/nfce/consultanfce',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.sefaz.mt.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfcews/services/RecepcaoEvento4',
WS_NFE_AUTORIZACAO: 'nfcews/services/NfeAutorizacao4',
WS_NFE_RET_AUTORIZACAO: 'nfcews/services/NfeRetAutorizacao4',
WS_NFE_INUTILIZACAO: 'nfcews/services/NfeInutilizacao4',
WS_NFE_CONSULTA: 'nfcews/services/NfeConsulta4',
WS_NFE_SITUACAO: 'nfcews/services/NfeStatusServico4',
WS_NFCE_QR_CODE: 'http://www.sefaz.mt.gov.br/nfce/consultanfce',
}
>>>>>>> danimar/master3
}
}
UFMS = {
<<<<<<< HEAD
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.ms.gov.br',
WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl',
@ -404,6 +474,53 @@ UFMS = {
WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl',
=======
NFE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.ms.gov.br',
WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.nfe.sefaz.ms.gov.br',
WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'ws/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4?wsdl',
}
},
NFCE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfce.sefaz.ms.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4',
WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4',
WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4',
WS_NFE_CADASTRO: 'CadConsultaCadastro4',
WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4',
WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4',
WS_NFE_SITUACAO: 'ws/NFeStatusServico4',
WS_NFCE_QR_CODE: 'www.dfe.ms.gov.br/nfce/qrcode?',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.nfce.sefaz.ms.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4',
WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4',
WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4',
WS_NFE_CADASTRO: 'ws/CadConsultaCadastro4',
WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4',
WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4',
WS_NFE_SITUACAO: 'ws/NFeStatusServico4',
WS_NFCE_QR_CODE: 'www.dfe.ms.gov.br/nfce/qrcode?'
}
>>>>>>> danimar/master3
}
}
@ -432,6 +549,7 @@ UFMG = {
}
UFPR = {
<<<<<<< HEAD
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefa.pr.gov.br',
WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl',
@ -451,6 +569,53 @@ UFPR = {
WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl',
=======
NFE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefa.pr.gov.br',
WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfe.sefa.pr.gov.br',
WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro4?wsdl',
},
},
NFCE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfce.sefa.pr.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfce/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfce/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfce/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfce/CadConsultaCadastro4?wsdl',
WS_NFE_INUTILIZACAO: 'nfce/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfce/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfce/NFeStatusServico4?wsdl',
WS_NFCE_QR_CODE: 'www.fazenda.pr.gov.br/nfce/qrcode?',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfce.sefa.pr.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfce/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfce/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfce/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfce/CadConsultaCadastro4?wsdl',
WS_NFE_INUTILIZACAO: 'nfce/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfce/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfce/NFeStatusServico4?wsdl',
WS_NFCE_QR_CODE: 'www.fazenda.pr.gov.br/nfce/qrcode?'
}
>>>>>>> danimar/master3
}
}
@ -553,24 +718,24 @@ UFSP = {
NFCE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfce.fazenda.sp.gov.br',
WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
WS_NFE_CONSULTA: 'ws/nfeconsulta2.asmx',
WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx',
WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4.asmx?wsdl',
WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4.asmx?wsdl',
WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4.asmx?wsdl',
WS_NFE_SITUACAO: 'ws/NFeStatusServico4.asmx?wsdl',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx',
WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4.asmx?wsdl',
WS_NFCE_QR_CODE: '',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfce.fazenda.sp.gov.br',
WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
WS_NFE_CONSULTA: 'ws/nfeconsulta2.asmx',
WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx',
WS_NFE_AUTORIZACAO: 'ws/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NFeRetAutorizacao4.asmx?wsdl',
WS_NFE_INUTILIZACAO: 'ws/NFeInutilizacao4.asmx?wsdl',
WS_NFE_CONSULTA: 'ws/NFeConsultaProtocolo4.asmx?wsdl',
WS_NFE_SITUACAO: 'ws/NFeStatusServico4.asmx?wsdl',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx',
WS_NFE_RECEPCAO_EVENTO: 'ws/NFeRecepcaoEvento4.asmx?wsdl',
WS_NFCE_QR_CODE: 'https://homologacao.nfce.fazenda.sp.gov.br/NFCEConsultaPublica/Paginas/ConstultaQRCode.aspx',
}
}

58
pytrustnfe/nfe/__init__.py

@ -4,12 +4,16 @@
import os
import requests
from lxml import etree
from .patch import has_patch
from .assinatura import Assinatura
from pytrustnfe.xml import render_xml, sanitize_response
from pytrustnfe.utils import gerar_chave, ChaveNFe
from pytrustnfe.Servidores import localizar_url
from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# Zeep
from requests import Session
@ -62,11 +66,7 @@ def _render(certificado, method, sign, **kwargs):
return xml_send
def _send(certificado, method, **kwargs):
xml_send = kwargs["xml"]
base_url = localizar_url(
method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente'])
def _get_session(certificado):
cert, key = extract_cert_and_key_from_pfx(
certificado.pfx, certificado.password)
cert, key = save_cert_key(cert, key)
@ -76,21 +76,39 @@ def _send(certificado, method, **kwargs):
session = Session()
session.cert = (cert, key)
session.verify = False
transport = Transport(session=session)
return session
parser = etree.XMLParser(strip_cdata=False)
xml = etree.fromstring(xml_send, parser=parser)
def _get_client(base_url, transport):
client = Client(base_url, transport=transport)
port = next(iter(client.wsdl.port_types))
first_operation = [x for x in iter(
client.wsdl.port_types[port].operations) if "zip" not in x.lower()][0]
return first_operation, client
def _send(certificado, method, **kwargs):
xml_send = kwargs["xml"]
base_url = localizar_url(
method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente'])
session = _get_session(certificado)
patch = has_patch(kwargs['estado'], method)
if patch:
return patch(session, xml_send, kwargs['ambiente'])
transport = Transport(session=session)
first_op, client = _get_client(base_url, transport)
return _send_zeep(first_op, client, xml_send)
def _send_zeep(first_operation, client, xml_send):
parser = etree.XMLParser(strip_cdata=False)
xml = etree.fromstring(xml_send, parser=parser)
namespaceNFe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe")
if namespaceNFe is not None:
namespaceNFe.set('xmlns', 'http://www.portalfiscal.inf.br/nfe')
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
with client.settings(raw_response=True):
response = client.service[first_operation](xml)
response, obj = sanitize_response(response.text)
@ -198,6 +216,25 @@ def xml_consulta_distribuicao_nfe(certificado, **kwargs): # Assinar
return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs)
<<<<<<< HEAD
=======
def consulta_distribuicao_nfe(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_consulta_distribuicao_nfe(certificado, **kwargs)
return _send_v310(certificado, **kwargs)
def xml_download_nfe(certificado, **kwargs): # Assinar
return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs)
def download_nfe(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_download_nfe(certificado, **kwargs)
return _send_v310(certificado, **kwargs)
>>>>>>> danimar/master3
def _send_v310(certificado, **kwargs):
xml_send = kwargs["xml"]
base_url = localizar_url(
@ -227,6 +264,7 @@ def _send_v310(certificado, **kwargs):
'received_xml': response,
'object': obj.Body.nfeDistDFeInteresseResponse.nfeDistDFeInteresseResult
}
<<<<<<< HEAD
def consulta_distribuicao_nfe(certificado, **kwargs):
@ -243,3 +281,5 @@ def download_nfe(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_download_nfe(certificado, **kwargs)
return _send_v310(certificado, **kwargs)
=======
>>>>>>> danimar/master3

28
pytrustnfe/nfe/danfce.py

@ -122,7 +122,15 @@ class danfce(object):
self._drawCenteredParagraph(cEnd)
self.drawLine()
def danfce_information(self):
def danfce_information(self, oXML=None):
el_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide")
tipo_emissao = tagtext(oNode=el_ide, cTag='tpEmis')
if tipo_emissao in ('5', '9'):
self.current_height -= 5
self.drawTitle("EMITIDA EM CONTINGÊNCIA",9, 'NimbusSanL-Bold')
self.drawTitle("Pendente de autorização", 7, 'NimbusSanL-Bold')
self.drawLine()
else:
self.drawTitle(
"DANFE NFC-e - Documento Auxiliar da Nota Fiscal de",
7, 'NimbusSanL-Bold')
@ -309,17 +317,25 @@ class danfce(object):
dataSolicitacao = getdateUTC(tagtext(oNode=el_ide, cTag="dhEmi"))
dataSolicitacao = dataSolicitacao[0] + " " + dataSolicitacao[1]
text = u"%s <br />%s <br />NFC-e nº%s Série %s %s<br />" % (
frase_chave_acesso, cnpj_cpf, nNFC, serie, dataSolicitacao)
self._drawCenteredParagraph(text)
tipo_emissao = tagtext(oNode=el_ide, cTag='tpEmis')
if tipo_emissao in ('5', '9'):
self.current_height -= 8
self.drawTitle("EMITIDA EM CONTINGÊNCIA",9, 'NimbusSanL-Bold')
self.drawTitle("Pendente de autorização - Via Consumidor", 7, 'NimbusSanL-Bold')
else:
numProtocolo = tagtext(oNode=el_prot_nfe, cTag="nProt")
dataAutorizacao = getdateUTC(tagtext(oNode=el_prot_nfe,
cTag='dhRecbto'))
dataAutorizacao = dataAutorizacao[0] + " " + dataAutorizacao[1]
text = u"%s <br />%s <br />NFC-e nº%s Série %s %s<br />\
Protocolo de autorização: %s<br />Data de autorização %s<br />\
" % (frase_chave_acesso, cnpj_cpf, nNFC, serie, dataSolicitacao,
text = "Protocolo de autorização: %s<br />Data de autorização %s<br />" % (
numProtocolo, dataAutorizacao)
self._drawCenteredParagraph(text)
self.draw_qr_code(qrcode)
@ -428,7 +444,7 @@ Protocolo de autorização: %s<br />Data de autorização %s<br />\
self.ide_emit(oXML=oXML)
# self.destinatario(oXML=oXML)
self.danfce_information()
self.danfce_information(oXML=oXML)
self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPaginator[0],
list_desc=list_desc, list_cod_prod=list_cod_prod)

22
pytrustnfe/nfe/danfe.py

@ -170,9 +170,9 @@ class danfe(object):
infAdProd = item.find(
".//{http://www.portalfiscal.inf.br/nfe}infAdProd")
list_ = wrap(tagtext(oNode=el_prod, cTag='xProd'), 56)
list_ = wrap(tagtext(oNode=el_prod, cTag='xProd'), 50)
if infAdProd is not None:
list_.extend(wrap(infAdProd.text, 56))
list_.extend(wrap(infAdProd.text, 50))
list_desc.append(list_)
list_cProd = wrap(tagtext(oNode=el_prod, cTag='cProd'), 14)
@ -203,6 +203,8 @@ class danfe(object):
# Gera o restante das páginas do XML
while index < nId:
if index < 0:
index = index * -1
self.newpage()
self.ide_emit(oXML=oXML, timezone=timezone)
index = self.produtos(
@ -329,6 +331,7 @@ class danfe(object):
cEnd = tagtext(oNode=elem_emit, cTag='xLgr') + ', ' + tagtext(
oNode=elem_emit, cTag='nro') + ' - '
cEnd += tagtext(oNode=elem_emit, cTag='xCpl') + ' - '
cEnd += tagtext(oNode=elem_emit, cTag='xBairro') + '<br />' + tagtext(
oNode=elem_emit, cTag='xMun') + ' - '
cEnd += 'Fone: ' + tagtext(oNode=elem_emit, cTag='fone') + '<br />'
@ -356,7 +359,7 @@ class danfe(object):
self.canvas.restoreState()
# Cancelado
if tagtext(oNode=elem_evento, cTag='cStat') == '135':
if tagtext(oNode=elem_evento, cTag='cStat') in ('135', '155'):
self.canvas.saveState()
self.canvas.rotate(45)
self.canvas.setFont('NimbusSanL-Bold', 60)
@ -416,8 +419,9 @@ class danfe(object):
cDt, cHr = getdateByTimezone(
tagtext(oNode=elem_ide, cTag='dhSaiEnt'), timezone)
self.string(nMr - 24, self.nlin + 14.3, cDt + ' ' + cHr) # Dt saída
cEnd = tagtext(oNode=elem_dest, cTag='xLgr') + ', ' + tagtext(
oNode=elem_dest, cTag='nro')
cEnd = '%s, %s %s' % (tagtext(oNode=elem_dest, cTag='xLgr'),
tagtext(oNode=elem_dest, cTag='nro'),
tagtext(oNode=elem_dest, cTag='xCpl'))
self.string(self.nLeft + 1, self.nlin + 14.3, cEnd)
self.string(nMr - 98, self.nlin + 14.3,
tagtext(oNode=elem_dest, cTag='xBairro'))
@ -723,6 +727,7 @@ obsCont[@xCampo='NomeVendedor']")
line_height = max(len(list_cod_prod[id]), len(list_desc[id]))
line_height *= nStep
if nLin + line_height > maxHeight:
id = id * -1
break
item = el_det[id]
@ -761,10 +766,8 @@ obsCont[@xCampo='NomeVendedor']")
self.stringRight(nMr - 26.5, nLin, format_number(vICMS))
self.stringRight(nMr - 7.5, nLin, format_number(pICMS))
if vIPI:
self.stringRight(nMr - 14.5, nLin, format_number(vIPI))
if pIPI:
self.stringRight(nMr - 0.5, nLin, format_number(pIPI))
self.stringRight(nMr - 14.5, nLin, format_number(vIPI or '0.00'))
self.stringRight(nMr - 0.5, nLin, format_number(pIPI or '0.00'))
# Código Item
line_cod = nLin
@ -897,6 +900,7 @@ obsCont[@xCampo='NomeVendedor']")
cEnd = tagtext(oNode=el_dest, cTag='xNome') + ' - '
cEnd += tagtext(oNode=el_dest, cTag='xLgr') + ', ' + tagtext(
oNode=el_dest, cTag='nro') + ', '
cEnd += tagtext(oNode=el_dest, cTag='xCpl') + ' '
cEnd += tagtext(oNode=el_dest, cTag='xBairro') + ', ' + tagtext(
oNode=el_dest, cTag='xMun') + ' - '
cEnd += tagtext(oNode=el_dest, cTag='UF')

39
pytrustnfe/nfe/patch.py

@ -0,0 +1,39 @@
from ..Servidores import SIGLA_ESTADO
from pytrustnfe.xml import sanitize_response
def nfeInutilizacaoCE(session, xml_send, ambiente):
soap = '<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope"><Body>\
<nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NFeInutilizacao4"\
>' + xml_send + '</nfeDadosMsg></Body></Envelope>'
headers = {
'SOAPAction': "",
'Content-Type': 'application/soap+xml; charset="utf-8"'
}
if ambiente == 1:
response = session.post(
'https://nfe.sefaz.ce.gov.br/nfe4/services/NFeInutilizacao4',
data=soap, headers=headers)
else:
response = session.post(
'https://nfeh.sefaz.ce.gov.br/nfe4/services/NFeInutilizacao4',
data=soap, headers=headers)
response, obj = sanitize_response(response.text)
return {
'sent_xml': xml_send,
'received_xml': response,
'object': obj.Body.getchildren()[0]
}
methods = {
'NfeInutilizacaoCE': nfeInutilizacaoCE
}
def has_patch(cod_estado, metodo):
uf = SIGLA_ESTADO[cod_estado]
method = metodo+uf
if method in methods:
return methods[method]
return None

3
pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml

@ -8,4 +8,7 @@
<consChNFe>
<chNFe>{{ chave_nfe }}</chNFe>
</consChNFe>
<consNSU>
<NSU>{{ nsu }}</NSU>
</consNSU>
</distDFeInt>

97
pytrustnfe/nfe/templates/NfeAutorizacao.xml

@ -27,7 +27,7 @@
<indFinal>{{ ide.indFinal }}</indFinal>
<indPres>{{ ide.indPres }}</indPres>
<procEmi>{{ ide.procEmi }}</procEmi>
<verProc>Odoo Brasil 10</verProc>
<verProc>{{ ide.verProc }}</verProc>
{% if ide.NFref is defined -%}
{% for ref in ide.NFref %}
<NFref>
@ -116,6 +116,7 @@
{% endif %}
{% endif %}
<xNome>{{ dest.xNome|normalize|escape }}</xNome>
{% if dest.enderDest is defined %}
<enderDest>
<xLgr>{{ dest.enderDest.xLgr|normalize|escape }}</xLgr>
<nro>{{ dest.enderDest.nro }}</nro>
@ -129,6 +130,7 @@
<xPais>{{ dest.enderDest.xPais }}</xPais>
<fone>{{ dest.enderDest.fone }}</fone>
</enderDest>
{% endif %}
<indIEDest>{{ dest.indIEDest }}</indIEDest>
{% if dest.IE != '' -%}<IE>{{ dest.IE }}</IE>{% endif %}
<ISUF>{{ dest.ISUF }}</ISUF>
@ -141,6 +143,7 @@
<retirada>
<CNPJ>{{ NFe.infNFe.retirada.CNPJ }}</CNPJ>
<CPF>{{ NFe.infNFe.retirada.CPF }}</CPF>
<xNome>{{ NFe.infNFe.retirada.xNome|normalize|escape }}</xNome>
<xLgr>{{ NFe.infNFe.retirada.xLgr|normalize|escape }}</xLgr>
<nro>{{ NFe.infNFe.retirada.nro }}</nro>
<xCpl>{{ NFe.infNFe.retirada.xCpl|normalize|escape }}</xCpl>
@ -148,12 +151,19 @@
<cMun>{{ NFe.infNFe.retirada.cMun }}</cMun>
<xMun>{{ NFe.infNFe.retirada.xMun|normalize }}</xMun>
<UF>{{ NFe.infNFe.retirada.UF }}</UF>
<CEP>{{ NFe.infNFe.retirada.CEP }}</CEP>
<cPais>{{ NFe.infNFe.retirada.cPais }}</cPais>
<xPais>{{ NFe.infNFe.retirada.xPais|normalize|escape }}</xPais>
<fone>{{ NFe.infNFe.retirada.fone }}</fone>
<email>{{ NFe.infNFe.retirada.email }}</email>
<IE>{{ NFe.infNFe.retirada.IE }}</IE>
</retirada>
{% endif %}
{% if NFe.infNFe.entrega is defined %}
<entrega>
<CNPJ>{{ NFe.infNFe.entrega.CNPJ }}</CNPJ>
<CPF>{{ NFe.infNFe.entrega.CPF }}</CPF>
<xNome>{{ NFe.infNFe.entrega.xNome|normalize|escape }}</xNome>
<xLgr>{{ NFe.infNFe.entrega.xLgr|normalize|escape }}</xLgr>
<nro>{{ NFe.infNFe.entrega.nro }}</nro>
<xCpl>{{ NFe.infNFe.entrega.xCpl|normalize|escape }}</xCpl>
@ -161,6 +171,12 @@
<cMun>{{ NFe.infNFe.entrega.cMun }}</cMun>
<xMun>{{ NFe.infNFe.entrega.xMun }}</xMun>
<UF>{{ NFe.infNFe.entrega.UF }}</UF>
<CEP>{{ NFe.infNFe.entrega.CEP }}</CEP>
<cPais>{{ NFe.infNFe.entrega.cPais }}</cPais>
<xPais>{{ NFe.infNFe.entrega.xPais|normalize|escape }}</xPais>
<fone>{{ NFe.infNFe.entrega.fone }}</fone>
<email>{{ NFe.infNFe.entrega.email }}</email>
<IE>{{ NFe.infNFe.entrega.IE }}</IE>
</entrega>
{% endif %}
{% if NFe.infNFe.autXML %}
@ -258,6 +274,7 @@
{% for med in prod.med %}
<med>
<cProdANVISA>{{ med.cProdANVISA }}</cProdANVISA>
<xMotivoIsencao>{{ med.xMotivoIsencao }}</xMotivoIsencao>
<vPMC>{{ med.vPMC }}</vPMC>
</med>
{% endfor %}
@ -366,6 +383,7 @@
<CST>{{ imposto.ICMS.CST }}</CST>
<vBCSTRet>{{ imposto.ICMS.vBCSTRet }}</vBCSTRet>
<pST>{{ imposto.ICMS.pST }}</pST>
<vICMSSubstituto>{{ imposto.ICMS.vICMSSubstituto }}</vICMSSubstituto>
<vICMSSTRet>{{ imposto.ICMS.vICMSSTRet }}</vICMSSTRet>
<vBCFCPSTRet>{{ imposto.ICMS.vBCFCPSTRet }}</vBCFCPSTRet>
<pFCPSTRet>{{ imposto.ICMS.pFCPSTRet }}</pFCPSTRet>
@ -444,9 +462,18 @@
<orig>{{ imposto.ICMSST.orig }}</orig>
<CST>{{ imposto.ICMSST.CST }}</CST>
<vBCSTRet>{{ imposto.ICMSST.vBCSTRet }}</vBCSTRet>
<pST>{{ imposto.ICMSST.pST }}</pST>
<vICMSSubstituto>{{ imposto.ICMSST.vICMSSubstituto }}</vICMSSubstituto>
<vICMSSTRet>{{ imposto.ICMSST.vICMSSTRet }}</vICMSSTRet>
<vBCFCPSTRet>{{ imposto.ICMSST.vBCFCPSTRet }}</vBCFCPSTRet>
<pFCPSTRet>{{ imposto.ICMSST.pFCPSTRet }}</pFCPSTRet>
<vFCPSTRet>{{ imposto.ICMSST.vFCPSTRet }}</vFCPSTRet>
<vBCSTDest>{{ imposto.ICMSST.vBCSTDest }}</vBCSTDest>
<vICMSSTDest>{{ imposto.ICMSST.vICMSSTDest }}</vICMSSTDest>
<pRedBCEfet>{{ imposto.ICMSST.pRedBCEfet }}</pRedBCEfet>
<vBCEfet>{{ imposto.ICMSST.vBCEfet }}</vBCEfet>
<pICMSEfet>{{ imposto.ICMSST.pICMSEfet }}</pICMSEfet>
<vICMSEfet>{{ imposto.ICMSST.vICMSEfet }}</vICMSEfet>
</ICMSST>
{% endif %}
{% if imposto.ICMS.CST == '101' -%}
@ -501,6 +528,7 @@
<CSOSN>{{ imposto.ICMS.CST }}</CSOSN>
<vBCSTRet>{{ imposto.ICMS.vBCSTRet }}</vBCSTRet>
<pST>{{ imposto.ICMS.pST }}</pST>
<vICMSSubstituto>{{ imposto.ICMS.vICMSSubstituto }}</vICMSSubstituto>
<vICMSSTRet>{{ imposto.ICMS.vICMSSTRet }}</vICMSSTRet>
<vBCFCPSTRet>{{ imposto.ICMS.vBCFCPSTRet }}</vBCFCPSTRet>
<pFCPSTRet>{{ imposto.ICMS.pFCPSTRet }}</pFCPSTRet>
@ -554,6 +582,38 @@
</IPINT>
{% endif %}
</IPI>
{% endif %}
{% if imposto.II is defined %}
<II>
<vBC>{{ imposto.II.vBC }}</vBC>
<vDespAdu>{{ imposto.II.vDespAdu }}</vDespAdu>
<vII>{{ imposto.II.vII }}</vII>
<vIOF>{{ imposto.II.vIOF }}</vIOF>
</II>
{% endif %}
{% if NFe.infNFe.ide.mod != '65' and imposto.IPI is defined %}
<IPI>
<clEnq>{{ imposto.IPI.clEnq }}</clEnq>
<CNPJProd>{{ imposto.IPI.CNPJProd }}</CNPJProd>
<cSelo>{{ imposto.IPI.cSelo }}</cSelo>
<qSelo>{{ imposto.IPI.qSelo }}</qSelo>
<cEnq>{{ imposto.IPI.cEnq }}</cEnq>
{% if imposto.IPI.CST in ('00', '49', '50', '99') %}
<IPITrib>
<CST>{{ imposto.IPI.CST }}</CST>
<vBC>{{ imposto.IPI.vBC }}</vBC>
<pIPI>{{ imposto.IPI.pIPI }}</pIPI>
<qUnid>{{ imposto.IPI.qUnid }}</qUnid>
<vUnid>{{ imposto.IPI.vUnid }}</vUnid>
<vIPI>{{ imposto.IPI.vIPI }}</vIPI>
</IPITrib>
{% endif %}
{% if imposto.IPI.CST in ('01', '02', '03', '04', '51', '52', '53', '54', '55') %}
<IPINT>
<CST>{{ imposto.IPI.CST }}</CST>
</IPINT>
{% endif %}
</IPI>
{% if imposto.II is defined %}
<II>
<vBC>{{ imposto.II.vBC }}</vBC>
@ -583,6 +643,26 @@
<indIncentivo>{{ imposto.ISSQN.indIncentivo }}</indIncentivo>
</ISSQN>
{% endif %}
{% if imposto.ISSQN is defined %}
<ISSQN>
<vBC>{{ imposto.ISSQN.vBC }}</vBC>
<vAliq>{{ imposto.ISSQN.vAliq }}</vAliq>
<vISSQN>{{ imposto.ISSQN.vISSQN }}</vISSQN>
<cMunFG>{{ imposto.ISSQN.cMunFG }}</cMunFG>
<cListServ>{{ imposto.ISSQN.cListServ }}</cListServ>
<vDeducao>{{ imposto.ISSQN.vDeducao }}</vDeducao>
<vOutro>{{ imposto.ISSQN.vOutro }}</vOutro>
<vDescIncond>{{ imposto.ISSQN.vDescIncond }}</vDescIncond>
<vDescCond>{{ imposto.ISSQN.vDescCond }}</vDescCond>
<vISSRet>{{ imposto.ISSQN.vDeducao }}</vISSRet>
<indISS>{{ imposto.ISSQN.indISS }}</indISS>
<cServico>{{ imposto.ISSQN.cServico }}</cServico>
<cMun>{{ imposto.ISSQN.cMun }}</cMun>
<cPais>{{ imposto.ISSQN.cPais }}</cPais>
<nProcesso>{{ imposto.ISSQN.nProcesso }}</nProcesso>
<indIncentivo>{{ imposto.ISSQN.indIncentivo }}</indIncentivo>
</ISSQN>
{% endif %}
<PIS>
{% if imposto.PIS.CST in ('01', '02') %}
<PISAliq>
@ -859,6 +939,16 @@
{% endfor %}
{% endif %}
</infAdic>
{% if NFe.infNFe.infRespTec is defined %}
<infRespTec>
<CNPJ>{{ NFe.infNFe.infRespTec.CNPJ }}</CNPJ>
<xContato>{{ NFe.infNFe.infRespTec.xContato }}</xContato>
<email>{{ NFe.infNFe.infRespTec.email }}</email>
<fone>{{ NFe.infNFe.infRespTec.fone }}</fone>
<idCSRT>{{ NFe.infNFe.infRespTec.idCSRT }}</idCSRT>
<hashCSRT>{{ NFe.infNFe.infRespTec.hashCSRT }}</hashCSRT>
</infRespTec>
{% endif %}
{% if NFe.infNFe.exporta is defined %}
<exporta>
<UFSaidaPais>{{ NFe.infNFe.exporta.UFSaidaPais }}</UFSaidaPais>
@ -883,8 +973,13 @@
{% endif %}
</infNFe>
<infNFeSupl>
<<<<<<< HEAD
<qrCode>{{ NFe.infNFe.qrCode }}</qrCode>
<urlChave>{{ NFe.infNFe.urlChave }}</urlChave>
=======
<qrCode>{{ NFe.infNFe.qrCode }}</qrCode>
<urlChave>{{ NFe.infNFe.urlChave }}</urlChave>
>>>>>>> danimar/master3
</infNFeSupl>
</NFe>
{% endfor %}

81
pytrustnfe/nfse/aparecida/__init__.py

@ -0,0 +1,81 @@
# © 2019 Danimar Ribeiro, Trustcode
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import os
from requests import Session
from zeep import Client
from zeep.transports import Transport
from requests.packages.urllib3 import disable_warnings
from pytrustnfe.xml import render_xml, sanitize_response
from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key
from pytrustnfe.nfe.assinatura import Assinatura
def _render(certificado, method, **kwargs):
path = os.path.join(os.path.dirname(__file__), 'templates')
xml_send = render_xml(path, '%s.xml' % method, True, **kwargs)
reference = ''
signer = Assinatura(certificado.pfx, certificado.password)
xml_send = signer.assina_xml(xml_send, reference)
return xml_send
def _send(certificado, method, **kwargs):
base_url = ''
if kwargs['ambiente'] == 'producao':
base_url = 'https://aparecida.siltecnologia.com.br/tbw/services/Abrasf10?wsdl'
else:
base_url = 'https://aparecida.siltecnologia.com.br/tbwhomologacao/services/Abrasf10?wsdl'
cert, key = extract_cert_and_key_from_pfx(
certificado.pfx, certificado.password)
cert, key = save_cert_key(cert, key)
disable_warnings()
session = Session()
session.cert = (cert, key)
session.verify = False
transport = Transport(session=session)
client = Client(base_url, transport=transport)
xml_send = kwargs['xml']
response = client.service[method](xml_send)
response, obj = sanitize_response(response)
return {
'sent_xml': xml_send,
'received_xml': response,
'object': obj
}
def xml_recepcionar_lote_rps(certificado, **kwargs):
return _render(certificado, 'recepcionarLoteRps', **kwargs)
def recepcionar_lote_rps(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_recepcionar_lote_rps(certificado, **kwargs)
return _send(certificado, 'recepcionarLoteRps', **kwargs)
def xml_consultar_lote_rps(certificado, **kwargs):
return _render(certificado, 'consultarLoteRps', **kwargs)
def consultar_lote_rps(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_consultar_lote_rps(certificado, **kwargs)
return _send(certificado, 'consultarLoteRps', **kwargs)
def xml_cancelar_nfse(certificado, **kwargs):
return _render(certificado, 'cancelarNfse', **kwargs)
def cancelar_nfse(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_cancelar_nfse(certificado, **kwargs)
return _send(certificado, 'cancelarNfse', **kwargs)

91
pytrustnfe/nfse/aparecida/templates/Rps.xml

@ -0,0 +1,91 @@
<Rps>
<InfRps Id="rps{{ rps.numero }}">
<IdentificacaoRps>
<Numero>{{ rps.numero }}</Numero>
<Serie>{{ rps.serie }}</Serie>
<Tipo>{{ rps.tipo_rps }}</Tipo>
</IdentificacaoRps>
<DataEmissao>{{ rps.data_emissao }}</DataEmissao>
<NaturezaOperacao>{{ rps.natureza_operacao }}</NaturezaOperacao>
<RegimeEspecialTributacao>{{ rps.regime_tributacao }}</RegimeEspecialTributacao>
<OptanteSimplesNacional>{{ rps.optante_simples }}</OptanteSimplesNacional>
<IncentivadorCultural>{{ rps.incentivador_cultural }}</IncentivadorCultural>
<Status>{{ rps.status }}</Status>
<RpsSubstituido>
<Numero>{{ rps.numero_substituido }}</Numero>
<Serie>{{ rps.serie_substituido }}</Serie>
<Tipo>{{ rps.tipo_substituido }}</Tipo>
</RpsSubstituido>
<Servico>
<Valores>
<ValorServicos>{{ rps.valor_servico }}</ValorServicos>
<ValorDeducoes>{{ rps.valor_deducao }}</ValorDeducoes>
<ValorPis>{{ rps.valor_pis }}</ValorPis>
<ValorCofins>{{ rps.valor_cofins }}</ValorCofins>
<ValorInss>{{ rps.valor_inss }}</ValorInss>
<ValorIr>{{ rps.valor_ir }}</ValorIr>
<ValorCsll>{{ rps.valor_csll }}</ValorCsll>
<IssRetido>{{ rps.iss_retido }}</IssRetido>
<ValorIss>{{ rps.valor_iss }}</ValorIss>
<ValorIssRetido>{{ rps.valor_iss_retido }}</ValorIssRetido>
<OutrasRetencoes>{{ rps.outras_retencoes }}</OutrasRetencoes>
<BaseCalculo>{{ rps.base_calculo }}</BaseCalculo>
<Aliquota>{{ rps.aliquota_issqn }}</Aliquota>
<ValorLiquidoNfse>{{ rps.valor_liquido_nfse }}</ValorLiquidoNfse>
<DescontoIncondicionado>{{ rps.desconto_incondicionado }}</DescontoIncondicionado>
<DescontoCondicionado>{{ rps.desconto_condicionado }}</DescontoCondicionado>
</Valores>
<ItemListaServico>{{ rps.codigo_servico }}</ItemListaServico>
<CodigoCnae>{{ rps.cnae_servico }}</CodigoCnae>
<CodigoTributacaoMunicipio>{{ rps.codigo_tributacao_municipio }}</CodigoTributacaoMunicipio>
<Discriminacao>{{ rps.descricao }}</Discriminacao>
<CodigoMunicipio>{{ rps.codigo_municipio }}</CodigoMunicipio>
</Servico>
<Prestador>
<Cnpj>{{ rps.prestador.cnpj }}</Cnpj>
<InscricaoMunicipal>{{ rps.prestador.inscricao_municipal }}</InscricaoMunicipal>
</Prestador>
<Tomador>
<IdentificacaoTomador>
<CpfCnpj>
{% if rps.tomador.cnpj_cpf|length == 14 %}
<Cnpj>{{ rps.tomador.cnpj_cpf }}</Cnpj>
{% endif %}
{% if rps.tomador.cnpj_cpf|length == 11 %}
<Cpf>{{ rps.tomador.cnpj_cpf }}</Cpf>
{% endif %}
</CpfCnpj>
<InscricaoMunicipal>{{ rps.tomador.inscricao_municipal }}</InscricaoMunicipal>
</IdentificacaoTomador>
<RazaoSocial>{{ rps.tomador.razao_social }}</RazaoSocial>
<Endereco>
<Endereco>{{ rps.tomador.logradouro }}</Endereco>
<Numero>{{ rps.tomador.numero }}</Numero>
<Complemento>{{ rps.tomador.complemento }}</Complemento>
<Bairro>{{ rps.tomador.bairro }}</Bairro>
<CodigoMunicipio>{{ rps.tomador.cidade }}</CodigoMunicipio>
<Uf>{{ rps.tomador.uf }}</Uf>
<Cep>{{ rps.tomador.cep }}</Cep>
</Endereco>
<Contato>
<Telefone>{{ rps.tomador.telefone }}</Telefone>
<Email>{{ rps.tomador.email }}</Email>
</Contato>
</Tomador>
{% if rps.intermediario is defined -%}
<IntermediarioServico>
<RazaoSocial>{{ rps.intermediario.razao_social }}</RazaoSocial>
<CpfCnpj>
<Cnpj>{{ rps.intermediario.cnpj }}</Cnpj>
</CpfCnpj>
<InscricaoMunicipal>{{ rps.intermediario.inscricao_municipal }}</InscricaoMunicipal>
</IntermediarioServico>
{% endif %}
{% if rps.construcao_civil is defined -%}
<ContrucaoCivil>
<CodigoObra>{{ rps.construcao_civil.codigo_obra }}</CodigoObra>
<Art>{{ rps.construcao_civil.art }}</Art>
</ContrucaoCivil>
{% endif %}
</InfRps>
</Rps>

15
pytrustnfe/nfse/aparecida/templates/cancelarNfse.xml

@ -0,0 +1,15 @@
<CancelarNfseEnvio xmlns="http://nfse.abrasf.org.br">
<Pedido>
<InfPedidoCancelamento Id="1">
<IdentificacaoNfse>
<Numero>{{ cancelamento.numero_nfse }}</Numero>
<CpfCnpj>
<Cnpj>{{ cancelamento.cnpj_prestador }}</Cnpj>
</CpfCnpj>
<InscricaoMunicipal>{{ cancelamento.inscricao_municipal }}</InscricaoMunicipal>
<CodigoMunicipio>{{ cancelamento.cidade }}</CodigoMunicipio>
</IdentificacaoNfse>
<CodigoCancelamento>{{ cancelamento.codigo_cancelamento }}</CodigoCancelamento>
</InfPedidoCancelamento>
</Pedido>
</CancelarNfseEnvio>

7
pytrustnfe/nfse/aparecida/templates/consultarLoteRps.xml

@ -0,0 +1,7 @@
<ConsultarLoteRpsEnvio xmlns="http://nfse.abrasf.org.br">
<Prestador>
<Cnpj>{{ consulta.cnpj_prestador }}</Cnpj>
<InscricaoMunicipal>{{ consulta.inscricao_municipal }}</InscricaoMunicipal>
</Prestador>
<Protocolo>{{ consulta.protocolo }}</Protocolo>
</ConsultarLoteRpsEnvio>

13
pytrustnfe/nfse/aparecida/templates/recepcionarLoteRps.xml

@ -0,0 +1,13 @@
<EnviarLoteRpsEnvio>
<LoteRps Id="lote{{ nfse.numero_lote }}">
<NumeroLote>{{ nfse.numero_lote }}</NumeroLote>
<Cnpj>{{ nfse.cnpj_prestador }}</Cnpj>
<InscricaoMunicipal>{{ nfse.inscricao_municipal }}</InscricaoMunicipal>
<QuantidadeRps>{{ nfse.lista_rps|length }}</QuantidadeRps>
<ListaRps>
{% for rps in nfse.lista_rps -%}
{% include 'Rps.xml' %}
{% endfor %}
</ListaRps>
</LoteRps>
</EnviarLoteRpsEnvio>

8
pytrustnfe/nfse/bh/__init__.py

@ -17,14 +17,16 @@ def _render(certificado, method, **kwargs):
xml_send = render_xml(path, '%s.xml' % method, True, **kwargs)
reference = ''
ref_lote = ''
if method == 'GerarNfse':
reference = 'rps:%s' % kwargs['rps']['numero']
ref_lote = 'lote%s' % kwargs['rps']['numero_lote']
elif method == 'CancelarNfse':
reference = 'Cancelamento_NF%s' % kwargs['cancelamento']['numero_nfse']
reference = 'pedidoCancelamento_%s' % kwargs['cancelamento']['numero_nfse']
signer = Assinatura(certificado.pfx, certificado.password)
xml_send = signer.assina_xml(xml_send, reference)
if ref_lote:
xml_send = signer.assina_xml(etree.fromstring(xml_send), ref_lote)
return xml_send.encode('utf-8')
@ -54,10 +56,10 @@ def _send(certificado, method, **kwargs):
response = client.service[method](xml_cabecalho, xml_send)
response, obj = sanitize_response(response.encode('utf-8'))
response, obj = sanitize_response(response)
return {
'sent_xml': xml_send,
'received_xml': response.decode('utf-8'),
'received_xml': response,
'object': obj
}

4
pytrustnfe/nfse/bh/templates/CancelarNfse.xml

@ -1,4 +1,4 @@
<CancelarNfseEnvio xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">
<CancelarNfseEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">
<Pedido xmlns="http://www.abrasf.org.br/nfse.xsd">
<InfPedidoCancelamento Id="pedidoCancelamento_{{ cancelamento.numero_nfse }}">
<IdentificacaoNfse>
@ -7,7 +7,7 @@
<InscricaoMunicipal>{{ cancelamento.inscricao_municipal }}</InscricaoMunicipal>
<CodigoMunicipio>{{ cancelamento.cidade }}</CodigoMunicipio>
</IdentificacaoNfse>
<CodigoCancelamento>1</CodigoCancelamento>
<CodigoCancelamento>2</CodigoCancelamento>
</InfPedidoCancelamento>
</Pedido>
</CancelarNfseEnvio>

1
pytrustnfe/nfse/floripa/__init__.py

@ -112,7 +112,6 @@ def consultar_nota(certificado, **kwargs):
headers = {"Accept": "application/json",
"Authorization": "Bearer %s" % kwargs['access_token']}
r = requests.get(url, headers=headers)
print(r.status_code)
if r.status_code == 200:
return r.text
else:

2
pytrustnfe/nfse/ginfes/__init__.py

@ -50,7 +50,7 @@ def _send(certificado, method, **kwargs):
xml_send = kwargs['xml']
response = client.service[method](header, xml_send)
response, obj = sanitize_response(response.encode('utf-8'))
response, obj = sanitize_response(response)
return {
'sent_xml': xml_send,
'received_xml': response,

69
pytrustnfe/nfse/imperial/__init__.py

@ -3,8 +3,11 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import os
import requests
from lxml import etree
from pytrustnfe import HttpClient
from requests import Session
from zeep import Client
from zeep.transports import Transport
from pytrustnfe.xml import render_xml, sanitize_response
@ -17,57 +20,41 @@ def _render(certificado, method, **kwargs):
def _send(certificado, method, **kwargs):
base_url = ''
if kwargs['ambiente'] == 'producao':
base_url = 'https://nfe.etransparencia.com.br/rj.petropolis/webservice/aws_nfe.aspx' # noqa
base_url = 'https://petropolis.sigiss.com.br/petropolis/ws/sigiss_ws.php' # noqa
else:
base_url = 'https://nfehomologacao.etransparencia.com.br/rj.petropolis/webservice/aws_nfe.aspx' # noqa
xml_send = kwargs["xml"]
path = os.path.join(os.path.dirname(__file__), 'templates')
soap = render_xml(path, 'SoapRequest.xml', False, soap_body=xml_send.decode())
client = HttpClient(base_url)
response = client.post_soap(soap, 'NFeaction/AWS_NFE.%s' % method)
response, obj = sanitize_response(response.encode('utf-8'))
return {
'sent_xml': xml_send.decode(),
'received_xml': response.decode(),
'object': obj
}
raise Exception('Não existe ambiente de homologação!')
def xml_processa_rps(certificado, **kwargs):
return _render(certificado, 'PROCESSARPS', **kwargs)
def processa_rps(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_processa_rps(certificado, **kwargs)
return _send(certificado, 'PROCESSARPS', **kwargs)
def xml_consulta_protocolo(certificado, **kwargs):
return _render(certificado, 'CONSULTAPROTOCOLO', **kwargs)
xml_send = kwargs["xml"].decode('utf-8')
headers = {
'SOAPAction': "urn:sigiss_ws#%s" % method,
'Content-Type': 'text/xml; charset="utf-8"'
}
r = requests.post(base_url, data=xml_send, headers=headers)
response, obj = sanitize_response(r.text.strip())
def consulta_protocolo(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_consulta_protocolo(certificado, **kwargs)
return _send(certificado, 'CONSULTAPROTOCOLO', **kwargs)
return {
'sent_xml': xml_send,
'received_xml': response,
'object': obj.Body
}
def xml_consulta_notas_protocolo(certificado, **kwargs):
return _render(certificado, 'CONSULTANOTASPROTOCOLO', **kwargs)
def xml_gerar_nota(certificado, **kwargs):
return _render(certificado, 'GerarNota', **kwargs)
def consulta_notas_protocolo(certificado, **kwargs):
def gerar_nota(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_consulta_notas_protocolo(certificado, **kwargs)
return _send(certificado, 'CONSULTANOTASPROTOCOLO', **kwargs)
kwargs['xml'] = xml_gerar_nota(certificado, **kwargs)
return _send(certificado, 'GerarNota', **kwargs)
def xml_cancelar_nfse(certificado, **kwargs):
return _render(certificado, 'CANCELANOTAELETRONICA', **kwargs)
def xml_cancelar_nota(certificado, **kwargs):
return _render(certificado, 'CancelarNota', **kwargs)
def cancelar_nfse(certificado, **kwargs):
def cancelar_nota(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_cancelar_nfse(certificado, **kwargs)
return _send(certificado, 'CANCELANOTAELETRONICA', **kwargs)
kwargs['xml'] = xml_cancelar_nota(certificado, **kwargs)
return _send(certificado, 'CancelarNota', **kwargs)

17
pytrustnfe/nfse/imperial/templates/CANCELANOTAELETRONICA.xml

@ -1,17 +0,0 @@
<ws_nfe.CANCELANOTAELETRONICA xmlns="NFe">
<Sdt_cancelanfe>
<Login>
<CodigoUsuario>{{ cancelamento.codigo_usuario }}</CodigoUsuario>
<CodigoContribuinte>{{ cancelamento.codigo_contribuinte }}</CodigoContribuinte>
</Login>
<Nota>
<SerieNota>{{ cancelamento.serie_nota }}</SerieNota>
<NumeroNota>{{ cancelamento.numero_nota }}</NumeroNota>
<SerieRPS>{{ cancelamento.serie_rps }}</SerieRPS>
<NumeroRps>{{ cancelamento.numero_rps }}</NumeroRps>
<ValorNota>{{ cancelamento.valor }}</ValorNota>
<MotivoCancelamento>{{ cancelamento.motivo }}</MotivoCancelamento>
<PodeCancelarGuia>{{ cancelamento.cancelar_guia }}</PodeCancelarGuia>
</Nota>
</Sdt_cancelanfe>
</ws_nfe.CANCELANOTAELETRONICA>

9
pytrustnfe/nfse/imperial/templates/CONSULTANOTASPROTOCOLO.xml

@ -1,9 +0,0 @@
<ws_nfe.CONSULTANOTASPROTOCOLO xmlns="NFe">
<Sdt_consultanotasprotocoloin>
<Protocolo>{{ consulta.protocolo }}</Protocolo>
<Login>
<CodigoUsuario>{{ consulta.codigo_usuario }}</CodigoUsuario>
<CodigoContribuinte>{{ consulta.codigo_contribuinte }}</CodigoContribuinte>
</Login>
</Sdt_consultanotasprotocoloin>
</ws_nfe.CONSULTANOTASPROTOCOLO>

9
pytrustnfe/nfse/imperial/templates/CONSULTAPROTOCOLO.xml

@ -1,9 +0,0 @@
<ws_nfe.CONSULTAPROTOCOLO xmlns="NFe">
<Sdt_consultaprotocoloin>
<Protocolo>{{ consulta.protocolo }}</Protocolo>
<Login>
<CodigoUsuario>{{ consulta.codigo_usuario }}</CodigoUsuario>
<CodigoContribuinte>{{ consulta.codigo_contribuinte }}</CodigoContribuinte>
</Login>
</Sdt_consultaprotocoloin>
</ws_nfe.CONSULTAPROTOCOLO>

14
pytrustnfe/nfse/imperial/templates/CancelarNota.xml

@ -0,0 +1,14 @@
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<CancelarNota xmlns="urn:sigiss_ws">
<DadosCancelaNota>
<ccm>{{ cancelamento.ccm }}</ccm>
<cnpj>{{ cancelamento.cnpj }}</cnpj>
<senha>{{ cancelamento.senha }}</senha>
<nota>{{ cancelamento.nota }}</nota>
<motivo>{{ cancelamento.motivo }}</motivo>
<email>{{ cancelamento.email }}</email>
</DadosCancelaNota>
</CancelarNota>
</Body>
</Envelope>

43
pytrustnfe/nfse/imperial/templates/GerarNota.xml

@ -0,0 +1,43 @@
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<GerarNota xmlns="urn:sigiss_ws">
<DescricaoRps>
<ccm>{{ nfse.ccm }}</ccm>
<cnpj>{{ nfse.cnpj }}</cnpj>
<senha>{{ nfse.senha }}</senha>
<crc>{{ nfse.crc }}</crc>
<crc_estado>{{ nfse.crc_estado }}</crc_estado>
<aliquota_simples>{{ nfse.aliquota_simples }}</aliquota_simples>
<id_sis_legado>{{ nfse.id_sis_legado }}</id_sis_legado>
<servico>{{ nfse.servico }}</servico>
<situacao>{{ nfse.situacao }}</situacao>
<valor>{{ nfse.valor }}</valor>
<base>{{ nfse.base }}</base>
<descricaoNF>{{ nfse.descricaoNF }}</descricaoNF>
<tomador_tipo>{{ nfse.tomador_tipo }}</tomador_tipo>
<tomador_cnpj>{{ nfse.tomador_cnpj }}</tomador_cnpj>
<tomador_email>{{ nfse.tomador_email }}</tomador_email>
<tomador_ie>{{ nfse.tomador_ie }}</tomador_ie>
<tomador_razao>{{ nfse.tomador_razao }}</tomador_razao>
<tomador_fantasia>{{ nfse.tomador_fantasia }}</tomador_fantasia>
<tomador_endereco>{{ nfse.tomador_endereco }}</tomador_endereco>
<tomador_numero>{{ nfse.tomador_endereco }}</tomador_numero>
<tomador_complemento>{{ nfse.tomador_complemento }}</tomador_complemento>
<tomador_bairro>{{ nfse.tomador_bairro }}</tomador_bairro>
<tomador_CEP>{{ nfse.tomador_CEP }}</tomador_CEP>
<tomador_cod_cidade>{{ nfse.tomador_cod_cidade }}</tomador_cod_cidade>
<tomador_fone>{{ nfse.tomador_fone }}</tomador_fone>
<tomador_ramal>{{ nfse.tomador_ramal }}</tomador_ramal>
<tomador_fax>{{ nfse.tomador_fax }}</tomador_fax>
<outro_municipio>{{ nfse.outro_municipio }}</outro_municipio>
<cod_outro_municipio>{{ nfse.cod_outro_municipio }}</cod_outro_municipio>
<retencao_iss>{{ nfse.retencao_iss }}</retencao_iss>
<pis>{{ nfse.pis }}</pis>
<cofins>{{ nfse.cofins }}</cofins>
<inss>{{ nfse.inss }}</inss>
<irrf>{{ nfse.irrf }}</irrf>
<csll>{{ nfse.csll }}</csll>
</DescricaoRps>
</GerarNota>
</Body>
</Envelope>

81
pytrustnfe/nfse/imperial/templates/PROCESSARPS.xml

@ -1,81 +0,0 @@
<ws_nfe.PROCESSARPS xmlns="NFe">
<Sdt_processarpsin>
<Login>
<CodigoUsuario>{{ nfse.codigo_usuario }}</CodigoUsuario>
<CodigoContribuinte>{{ nfse.codigo_contribuinte }}</CodigoContribuinte>
</Login>
<SDTRPS>
<Ano>{{ nfse.ano }}</Ano>
<Mes>{{ nfse.mes }}</Mes>
<CPFCNPJ>{{ nfse.cnpj_prestador }}</CPFCNPJ>
<DTIni>{{ nfse.data_emissao }}</DTIni>
<DTFin>{{ nfse.data_emissao }}</DTFin>
<TipoTrib>{{ nfse.tipo_tributacao }}</TipoTrib>
<DtAdeSN>{{ nfse.data_adesao_simples }}</DtAdeSN>
<AlqIssSN_IP>{{ nfse.aliquota_simples_isencao|comma }}</AlqIssSN_IP>
<Versao>2.00</Versao>
{% for rps in nfse.lista_rps -%}
<Reg20>
<!-- Optional -->
<Reg20Item>
<TipoNFS>{{ rps.tipo_nfse }}</TipoNFS>
<NumRps>{{ rps.numero }}</NumRps>
<SerRps>{{ rps.serie }}</SerRps>
<DtEmi>{{ rps.data_emissao }}</DtEmi>
<RetFonte>{{ rps.iss_retido }}</RetFonte>
<CodSrv>{{ rps.codigo_servico }}</CodSrv>
<DiscrSrv>{{ rps.descricao}}</DiscrSrv>
<VlNFS>{{ rps.valor_liquido_nfse|comma }}</VlNFS>
<VlDed>{{ rps.valor_deducao|comma }}</VlDed>
<DiscrDed>{{ rps.discriminacao_deducao }}</DiscrDed>
<VlBasCalc>{{ rps.base_calculo|comma }}</VlBasCalc>
<AlqIss>{{ rps.aliquota_issqn|comma }}</AlqIss>
<VlIss>{{ rps.valor_iss|comma }}</VlIss>
<VlIssRet>{{ rps.valor_iss_retido|comma }}</VlIssRet>
<CpfCnpTom>{{ rps.tomador.cnpj_cpf }}</CpfCnpTom>
<RazSocTom>{{ rps.tomador.razao_social }}</RazSocTom>
<TipoLogtom>{{ rps.tomador.tipo_logradouro }}</TipoLogtom>
<LogTom>{{ rps.tomador.logradouro }}</LogTom>
<NumEndTom>{{ rps.tomador.numero }}</NumEndTom>
<ComplEndTom>{{ rps.tomador.complemento }}</ComplEndTom>
<BairroTom>{{ rps.tomador.bairro }}</BairroTom>
<MunTom>{{ rps.tomador.municipio }}</MunTom>
<SiglaUFTom>{{ rps.tomador.uf }}</SiglaUFTom>
<CepTom>{{ rps.tomador.cep }}</CepTom>
<Telefone>{{ rps.tomador.telefone }}</Telefone>
<InscricaoMunicipal>{{ rps.tomador.inscricao_municipal }}</InscricaoMunicipal>
{% if rps.local_prestacao == 'prestador' %}
<TipoLogLocPre>{{ rps.prestador.tipo_logradouro }}</TipoLogLocPre>
<LogLocPre>{{ rps.prestador.logradouro }}</LogLocPre>
<NumEndLocPre>{{ rps.prestador.numero }}</NumEndLocPre>
<ComplEndLocPre>{{ rps.prestador.complemento }}</ComplEndLocPre>
<BairroLocPre>{{ rps.prestador.bairro }}</BairroLocPre>
<MunLocPre>{{ rps.prestador.municipio }}</MunLocPre>
<SiglaUFLocpre>{{ rps.prestador.uf }}</SiglaUFLocpre>
<CepLocPre>{{ rps.prestador.cep }}</CepLocPre>
{% endif %}
<Email1>{{ rps.tomador.email }}</Email1>
{% for imposto in rps.impostos -%}
<Reg30>
<Reg30Item>
<TributoSigla>{{ imposto.sigla }}</TributoSigla>
<TributoAliquota>{{ imposto.aliquota|comma }}</TributoAliquota>
<TributoValor>{{ imposto.valor|comma }}</TributoValor>
</Reg30Item>
</Reg30>
{% endfor %}
</Reg20Item>
</Reg20>
{% endfor %}
<Reg90>
<QtdRegNormal>{{ nfse.lista_rps|length }}</QtdRegNormal>
<ValorNFS>{{ nfse.lista_rps|sum(attribute='valor_liquido_nfse')|comma }}</ValorNFS>
<ValorISS>{{ nfse.lista_rps|sum(attribute='valor_iss')|comma }}</ValorISS>
<ValorDed>{{ nfse.lista_rps|sum(attribute='valor_deducao')|comma }}</ValorDed>
<ValorIssRetTom>{{ nfse.lista_rps|sum(attribute='valor_iss_retido')|comma }}</ValorIssRetTom>
<QtdReg30>{{ nfse.quantidade_impostos }}</QtdReg30>
<ValorTributos>{{ nfse.valor_tributos|comma }}</ValorTributos>
</Reg90>
</SDTRPS>
</Sdt_processarpsin>
</ws_nfe.PROCESSARPS>

5
pytrustnfe/nfse/imperial/templates/SoapRequest.xml

@ -1,5 +0,0 @@
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
{{ soap_body }}
</Body>
</Envelope>

2
pytrustnfe/nfse/simpliss/__init__.py

@ -40,7 +40,7 @@ def _send(method, **kwargs):
base_url = 'http://wshomologacao.simplissweb.com.br/nfseservice.svc' # noqa
base_url = 'http://wshomologacao.simplissweb.com.br/nfseservice.svc'
xml_send = kwargs["xml"].replace('<?xml version="1.0"?>', '')
xml_send = kwargs["xml"]
path = os.path.join(os.path.dirname(__file__), 'templates')
soap = render_xml(path, 'SoapRequest.xml', False, soap_body=xml_send)

150
pytrustnfe/urls.py

@ -0,0 +1,150 @@
AC = '12'
AL = '27'
AM = '13'
AP = '16'
BA = '29'
CE = '23'
DF = '53'
ES = '32'
GO = '52'
MA = '21'
MG = '31'
MS = '50'
MT = '51'
PA = '15'
PB = '25'
PE = '26'
PI = '22'
PR = '41'
RJ = '33'
RN = '24'
RO = '11'
RR = '14'
RS = '43'
SC = '42'
SE = '28'
SP = '35'
TO = '17'
PRODUCAO = '1'
HOMOLOGACAO = '2'
URLS = {
PRODUCAO: {
AC: 'http://www.sefaznet.ac.gov.br/nfce/qrcode?',
AL: 'http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp?',
AM: 'http://sistemas.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp?',
AP: 'https://www.sefaz.ap.gov.br/nfce/nfcep.php?',
BA: 'http://nfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx?',
DF: 'http://www.fazenda.df.gov.br/nfce/qrcode?',
GO: 'http://nfe.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe?',
MA: 'http://nfce.sefaz.ma.gov.br/portal/consultarNFCe.jsp?',
MS: 'http://www.dfe.ms.gov.br/nfce/qrcode?',
MT: 'http://www.sefaz.mt.gov.br/nfce/consultanfce?',
PA: 'https://appnfc.sefa.pa.gov.br/portal/view/consultas/nfce/nfceForm.seam?', # noqa
PB: 'http://www.receita.pb.gov.br/nfce?',
PE: 'http://nfce.sefaz.pe.gov.br/nfce/consulta?',
PI: 'http://www.sefaz.pi.gov.br/nfce/qrcode?',
PR: 'http://www.fazenda.pr.gov.br/nfce/consulta?',
RJ: 'http://www4.fazenda.rj.gov.br/consultaNFCe/QRCode?',
RN: 'http://nfce.set.rn.gov.br/consultarNFCe.aspx?',
RO: 'http://www.nfce.sefin.ro.gov.br/consultanfce/consulta.jsp?',
RR: 'https://www.sefaz.rr.gov.br/nfce/servlet/qrcode?',
RS: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx?',
SE: 'http://www.nfce.se.gov.br/nfce/qrcode?',
SP: 'https://www.nfce.fazenda.sp.gov.br/qrcode?',
TO: 'http://www.sefaz.to.gov.br/nfce/qrcode?',
},
HOMOLOGACAO: {
AC: 'http://www.hml.sefaznet.ac.gov.br/nfce/qrcode?',
AL: 'http://nfce.sefaz.al.gov.br/QRCode/consultarNFCe.jsp?',
AM: 'http://homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp?',
AP: 'https://www.sefaz.ap.gov.br/nfcehml/nfce.php?',
BA: 'http://hnfe.sefaz.ba.gov.br/servicos/nfce/qrcode.aspx?',
DF: 'http://www.fazenda.df.gov.br/nfce/qrcode?',
GO: 'http://homolog.sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe?',
MA: 'http://homologacao.sefaz.ma.gov.br/portal/consultarNFCe.jsp?',
MS: 'http://www.dfe.ms.gov.br/nfce/qrcode?',
MT: 'http://homologacao.sefaz.mt.gov.br/nfce/consultanfce?',
PA: 'https://appnfc.sefa.pa.gov.br/portal-homologacao/view/consultas/nfce/nfceForm.seam?', # noqa
PB: 'http://www.receita.pb.gov.br/nfcehom?',
PE: 'http://nfcehomolog.sefaz.pe.gov.br/nfce/consulta?',
PI: 'http://www.sefaz.pi.gov.br/nfce/qrcode?',
PR: 'http://www.fazenda.pr.gov.br/nfce/consulta?',
RJ: 'http://www4.fazenda.rj.gov.br/consultaNFCe/QRCode?',
RN: 'http://hom.nfce.set.rn.gov.br/consultarNFCe.aspx?',
RO: 'http://200.174.88.103:8080/nfce/servlet/qrcode?',
RR: 'https://www.sefaz.rr.gov.br/nfce/servlet/qrcode?',
RS: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx?',
SE: 'http://www.hom.nfe.se.gov.br/nfce/qrcode?',
SP: 'https://www.homologacao.nfce.fazenda.sp.gov.br/qrcode?',
TO: 'http://homologacao.sefaz.to.gov.br/nfce/qrcode?',
}
}
URLS_EXIBICAO = {
PRODUCAO: {
AC: 'www.sefaznet.ac.gov.br/nfce/consulta',
AL: 'www.sefaz.al.gov.br/nfce/consulta',
AM: 'www.sefaz.am.gov.br/nfce/consulta',
AP: 'www.sefaz.ap.gov.br/nfce/consulta',
BA: 'http://www.sefaz.ba.gov.br/nfce/consulta',
CE: 'www.sefaz.ce.gov.br/nfce/consulta',
DF: 'www.fazenda.df.gov.br/nfce/consulta',
ES: 'www.sefaz.es.gov.br/nfce/consulta',
GO: 'www.sefaz.go.gov.br/nfce/consulta',
MA: 'www.sefaz.ma.gov.br/nfce/consulta',
MS: 'www.dfe.ms.gov.br/nfce/consulta',
MT: 'www.sefaz.mt.gov.br/nfce/consulta',
MG: 'www.fazenda.mg.gov.br/nfce/consulta',
PA: 'www.sefa.pa.gov.br/nfce/consulta',
PB: 'www.receita.pb.gov.br/nfce/consulta',
PE: 'nfce.sefaz.pe.gov.br/nfce/consulta',
PI: 'www.sefaz.pi.gov.br/nfce/consulta',
PR: 'http://www.fazenda.pr.gov.br/nfce/consulta',
RJ: 'www.fazenda.rj.gov.br/nfce/consulta',
RN: 'www.set.rn.gov.br/nfce/consulta',
RO: 'www.sefin.ro.gov.br/nfce/consulta',
RR: 'www.sefaz.rr.gov.br/nfce/consulta',
RS: 'www.sefaz.rs.gov.br/nfce/consulta',
SE: 'http://www.nfce.se.gov.br/nfce/consulta',
SP: 'https://www.nfce.fazenda.sp.gov.br/consulta',
TO: 'www.sefaz.to.gov.br/nfce/consulta',
},
HOMOLOGACAO: {
AC: 'www.sefaznet.ac.gov.br/nfce/consulta',
AL: 'www.sefaz.al.gov.br/nfce/consulta',
AM: 'www.sefaz.am.gov.br/nfce/consulta',
AP: 'www.sefaz.ap.gov.br/nfce/consulta',
BA: 'http://hinternet.sefaz.ba.gov.br/nfce/consulta',
CE: 'www.sefaz.ce.gov.br/nfce/consulta',
DF: 'www.fazenda.df.gov.br/nfce/consulta',
ES: 'www.sefaz.es.gov.br/nfce/consulta',
GO: 'www.sefaz.go.gov.br/nfce/consulta',
MA: 'www.sefaz.ma.gov.br/nfce/consulta',
MS: 'www.dfe.ms.gov.br/nfce/consulta',
MT: 'www.sefaz.mt.gov.br/nfce/consulta',
MG: 'www.fazenda.mg.gov.br/nfce/consulta',
PA: 'www.sefa.pa.gov.br/nfce/consulta',
PB: 'www.receita.pb.gov.br/nfcehom',
PE: 'nfce.sefaz.pe.gov.br/nfce/consulta',
PI: 'www.sefaz.pi.gov.br/nfce/consulta',
PR: 'http://www.fazenda.pr.gov.br/nfce/consulta',
RJ: 'www.fazenda.rj.gov.br/nfce/consulta',
RN: 'www.set.rn.gov.br/nfce/consulta',
RO: 'www.sefin.ro.gov.br/nfce/consulta',
RR: 'www.sefaz.rr.gov.br/nfce/consulta',
RS: 'www.sefaz.rs.gov.br/nfce/consulta',
SE: 'http://www.hom.nfe.se.gov.br/nfce/consulta',
SP: 'https://www.homologacao.nfce.fazenda.sp.gov.br/consulta',
TO: 'www.sefaz.to.gov.br/nfce/consulta',
}
}
def url_qrcode(estado, ambiente):
return URLS[ambiente][estado]
def url_qrcode_exibicao(estado, ambiente):
return URLS_EXIBICAO[ambiente][estado]

297
pytrustnfe/xml/schemas/distDFeInt_v1.01.xsd

@ -0,0 +1,297 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.portalfiscal.inf.br/nfe" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="TNSU">
<xs:annotation>
<xs:documentation>Tipo número sequencial único</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:token">
<xs:pattern value="[0-9]{15}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TQNSU">
<xs:annotation>
<xs:documentation>Tipo quantidade de NSU</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:unsignedShort">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="50"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TVerDistDFe">
<xs:annotation>
<xs:documentation>Tipo Versão dos leiautes do Web Service NFeDistribuicaoDFe</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:enumeration value="1.01"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TAmb">
<xs:annotation>
<xs:documentation>Tipo Ambiente</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TCodUfIBGE">
<xs:annotation>
<xs:documentation>Tipo Código da UF da tabela do IBGE</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
<xs:enumeration value="13"/>
<xs:enumeration value="14"/>
<xs:enumeration value="15"/>
<xs:enumeration value="16"/>
<xs:enumeration value="17"/>
<xs:enumeration value="21"/>
<xs:enumeration value="22"/>
<xs:enumeration value="23"/>
<xs:enumeration value="24"/>
<xs:enumeration value="25"/>
<xs:enumeration value="26"/>
<xs:enumeration value="27"/>
<xs:enumeration value="28"/>
<xs:enumeration value="29"/>
<xs:enumeration value="31"/>
<xs:enumeration value="32"/>
<xs:enumeration value="33"/>
<xs:enumeration value="35"/>
<xs:enumeration value="41"/>
<xs:enumeration value="42"/>
<xs:enumeration value="43"/>
<xs:enumeration value="50"/>
<xs:enumeration value="51"/>
<xs:enumeration value="52"/>
<xs:enumeration value="53"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TCOrgaoIBGE">
<xs:annotation>
<xs:documentation>Tipo Código de orgão (UF da tabela do IBGE + 90 RFB)</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
<xs:enumeration value="13"/>
<xs:enumeration value="14"/>
<xs:enumeration value="15"/>
<xs:enumeration value="16"/>
<xs:enumeration value="17"/>
<xs:enumeration value="21"/>
<xs:enumeration value="22"/>
<xs:enumeration value="23"/>
<xs:enumeration value="24"/>
<xs:enumeration value="25"/>
<xs:enumeration value="26"/>
<xs:enumeration value="27"/>
<xs:enumeration value="28"/>
<xs:enumeration value="29"/>
<xs:enumeration value="31"/>
<xs:enumeration value="32"/>
<xs:enumeration value="33"/>
<xs:enumeration value="35"/>
<xs:enumeration value="41"/>
<xs:enumeration value="42"/>
<xs:enumeration value="43"/>
<xs:enumeration value="50"/>
<xs:enumeration value="51"/>
<xs:enumeration value="52"/>
<xs:enumeration value="53"/>
<xs:enumeration value="90"/>
<xs:enumeration value="91"/>
<xs:enumeration value="92"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TCnpj">
<xs:annotation>
<xs:documentation>Tipo Número do CNPJ</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:maxLength value="14"/>
<xs:pattern value="[0-9]{14}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TCpf">
<xs:annotation>
<xs:documentation>Tipo Número do CPF</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:maxLength value="11"/>
<xs:pattern value="[0-9]{11}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TVerAplic">
<xs:annotation>
<xs:documentation>Tipo Versão do Aplicativo</xs:documentation>
</xs:annotation>
<xs:restriction base="TString">
<xs:minLength value="1"/>
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TStat">
<xs:annotation>
<xs:documentation>Tipo Código da Mensagem enviada</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:maxLength value="3"/>
<xs:pattern value="[0-9]{3}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TMotivo">
<xs:annotation>
<xs:documentation>Tipo Motivo</xs:documentation>
</xs:annotation>
<xs:restriction base="TString">
<xs:maxLength value="255"/>
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TString">
<xs:annotation>
<xs:documentation> Tipo string genérico</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:pattern value="[!-ÿ]{1}[ -ÿ]{0,}[!-ÿ]{1}|[!-ÿ]{1}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TChNFe">
<xs:annotation>
<xs:documentation>Tipo Chave da Nota Fiscal Eletrônica</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:maxLength value="44"/>
<xs:pattern value="[0-9]{44}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TProt">
<xs:annotation>
<xs:documentation>Tipo Número do Protocolo de Status</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:maxLength value="15"/>
<xs:pattern value="[0-9]{15}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TDateTimeUTC">
<xs:annotation>
<xs:documentation>Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm)</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:pattern value="(((20(([02468][048])|([13579][26]))-02-29))|(20[0-9][0-9])-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30)))))T(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d([\-,\+](0[0-9]|10|11):00|([\+](12):00))"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TIe">
<xs:annotation>
<xs:documentation>Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:maxLength value="14"/>
<xs:pattern value="[0-9]{2,14}|ISENTO"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TDec_1302">
<xs:annotation>
<xs:documentation>Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:pattern value="0|0\.[0-9]{2}|[1-9]{1}[0-9]{0,12}(\.[0-9]{2})?"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="distDFeInt">
<xs:annotation>
<xs:documentation>Schema de pedido de distribuição de DF-e de interesse</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="tpAmb" type="TAmb">
<xs:annotation>
<xs:documentation>
Identificação do Ambiente:
1 - Produção
2 - Homologação
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="cUFAutor" type="TCodUfIBGE" minOccurs="0">
<xs:annotation>
<xs:documentation>Código da UF do Autor</xs:documentation>
</xs:annotation>
</xs:element>
<xs:choice>
<xs:element name="CNPJ" type="TCnpj">
<xs:annotation>
<xs:documentation>CNPJ do interessado no DF-e</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="CPF" type="TCpf">
<xs:annotation>
<xs:documentation>CPF do interessado no DF-e</xs:documentation>
</xs:annotation>
</xs:element>
</xs:choice>
<xs:choice>
<xs:element name="distNSU">
<xs:annotation>
<xs:documentation>Grupo para distribuir DF-e de interesse</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="ultNSU" type="TNSU">
<xs:annotation>
<xs:documentation>Último NSU recebido pelo ator. Caso seja informado com zero, ou com um NSU muito antigo, a consulta retornará unicamente as informações resumidas e documentos fiscais eletrônicos que tenham sido recepcionados pelo Ambiente Nacional nos últimos 3 meses.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="consNSU">
<xs:annotation>
<xs:documentation>Grupo para consultar um DF-e a partir de um NSU específico</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="NSU" type="TNSU">
<xs:annotation>
<xs:documentation>Número Sequencial Único. Geralmente esta consulta será utilizada quando identificado pelo interessado um NSU faltante. O Web Service retornará o documento ou informará que o NSU não existe no Ambiente Nacional. Assim, esta consulta fechará a lacuna do NSU identificado como faltante.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="consChNFe">
<xs:annotation>
<xs:documentation>Grupo para consultar uma NF-e a partir da chave de acesso</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="chNFe" type="TChNFe">
<xs:annotation>
<xs:documentation>Chave de acesso da NF-e a ser consultada</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:sequence>
<xs:attribute name="versao" type="TVerDistDFe" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>

4247
pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd
File diff suppressed because it is too large
View File

5
pytrustnfe/xml/validate.py

@ -8,11 +8,12 @@ from lxml import etree
PATH = os.path.dirname(os.path.abspath(__file__))
SCHEMA = os.path.join(PATH, 'schemas/enviNFe_v4.00.xsd')
SCHEMA_DFE = os.path.join(PATH, 'schemas/distDFeInt_v1.01.xsd')
def valida_nfe(xml_nfe):
def valida_nfe(xml_nfe, schema=SCHEMA):
nfe = etree.fromstring(xml_nfe)
esquema = etree.XMLSchema(etree.parse(SCHEMA))
esquema = etree.XMLSchema(etree.parse(schema))
esquema.validate(nfe)
erros = [x.message for x in esquema.error_log]
return "\n".join(erros)

2
requirements.txt

@ -12,7 +12,7 @@ pyOpenSSL >= 16.0.0, < 18
certifi >= 2015.11.20.1
xmlsec >= 1.3.3
reportlab
pytest
pytest>=4.1.1
pytest-cov
pytz
zeep

6
setup.py

@ -2,7 +2,7 @@
from setuptools import setup, find_packages
VERSION = "1.0.18"
VERSION = "1.0.44"
setup(
@ -12,7 +12,7 @@ setup(
author_email='danimaribeiro@gmail.com',
keywords=['nfe', 'mdf-e'],
classifiers=[
'Development Status :: 4 - Beta',
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
'Intended Audience :: Developers',
'License :: OSI Approved :: GNU Lesser General Public License v2 or \
@ -39,12 +39,14 @@ later (LGPLv2+)',
'nfse/carioca/templates/*xml',
'nfse/bh/templates/*xml',
'nfse/mga/templates/*xml',
'nfse/aparecida/templates/*xml',
'xml/schemas/*xsd',
]},
url='https://github.com/danimaribeiro/PyTrustNFe',
license='LGPL-v2.1+',
description='PyTrustNFe é uma biblioteca para envio de NF-e',
long_description=open('README.md', 'r').read(),
long_description_content_type='text/markdown',
install_requires=[
'Jinja2 >= 2.8',
'pyOpenSSL >= 16.0.0, < 18',

2
tests/test_servidores.py

@ -21,7 +21,7 @@ url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx?w
url_cad_rs = 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl'
url_cad_sc = 'https://cad.svrs.rs.gov.br/ws/cadconsultacadastro/cadconsulta\
cadastro2.asmx?wsdl'
cadastro4.asmx?wsdl'
class test_servidores(unittest.TestCase):

Loading…
Cancel
Save