Browse Source

Merge branch 'frp-update-pytrustnfe' of github.com:loggi/PyTrustNFe into frp-better-templates-for-nfse-paulistana-update

pull/268/head
Felipe Prenholato 7 years ago
parent
commit
00284f56d8
  1. 3
      .gitignore
  2. 763
      pytrustnfe/Servidores.py
  3. 257
      pytrustnfe/nfe/__init__.py
  4. 174
      pytrustnfe/nfe/danfe.py
  5. 12
      pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml
  6. 91
      pytrustnfe/nfe/templates/NfeAutorizacao.xml
  7. 5
      pytrustnfe/nfe/templates/NfeConsulta2.xml
  8. 5
      pytrustnfe/nfe/templates/NfeConsultaProtocolo.xml
  9. 2
      pytrustnfe/nfe/templates/NfeInutilizacao.xml
  10. 2
      pytrustnfe/nfe/templates/NfeRetAutorizacao.xml
  11. 2
      pytrustnfe/nfe/templates/NfeStatusServico.xml
  12. 6
      pytrustnfe/nfe/templates/RecepcaoEvento.xml
  13. 21
      pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml
  14. 31
      pytrustnfe/nfe/templates/RecepcaoEventoEPEC.xml
  15. 2
      pytrustnfe/nfe/templates/RecepcaoEventoManifesto.xml
  16. 20
      pytrustnfe/test/test_comunicacao.py
  17. 19
      pytrustnfe/test/test_consulta_cadastro.py
  18. 286
      pytrustnfe/test/test_nfse_paulistana.py
  19. 16
      pytrustnfe/test/test_servidores.py
  20. 8
      pytrustnfe/test/test_utils.py
  21. 21
      pytrustnfe/utils.py
  22. 2
      pytrustnfe/xml/schemas/enviNFe_v4.00.xsd
  23. 1104
      pytrustnfe/xml/schemas/leiauteNFe_v4.00.xsd
  24. 2
      pytrustnfe/xml/schemas/nfe_v4.00.xsd
  25. 20
      pytrustnfe/xml/schemas/tiposBasico_v4.00.xsd
  26. 0
      pytrustnfe/xml/schemas/xmldsig-core-schema_v1.01.xsd
  27. 4
      pytrustnfe/xml/validate.py
  28. 1
      requirements.txt
  29. 6
      setup.py

3
.gitignore

@ -12,4 +12,5 @@ dist/
docs/_build docs/_build
.vscode/tags .vscode/tags
.cache/ .cache/
.idea
.idea/
.pytest_cache/

763
pytrustnfe/Servidores.py

@ -2,43 +2,31 @@
# © 2016 Danimar Ribeiro # © 2016 Danimar Ribeiro
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
WS_NFE_AUTORIZACAO = 'NfeAutorizacao'
WS_NFE_RET_AUTORIZACAO = 'NfeRetAutorizacao'
WS_NFE_CANCELAMENTO = 'RecepcaoEventoCancelamento'
# Consultas básicas da NF-e
WS_NFE_INUTILIZACAO = 'NfeInutilizacao' WS_NFE_INUTILIZACAO = 'NfeInutilizacao'
WS_NFE_CONSULTA = 'NfeConsulta2'
WS_NFE_CONSULTA = 'NfeConsultaProtocolo'
WS_NFE_SITUACAO = 'NfeStatusServico' WS_NFE_SITUACAO = 'NfeStatusServico'
WS_NFE_CADASTRO = 'NfeConsultaCadastro'
WS_NFCE_AUTORIZACAO = 'NfeAutorizacao'
WS_NFCE_RET_AUTORIZACAO = 'NfeRetAutorizacao'
WS_NFCE_CANCELAMENTO = 'RecepcaoEventoCancelamento'
WS_NFCE_INUTILIZACAO = 'NfeInutilizacao'
WS_NFCE_CONSULTA = 'NfeConsultaProtocolo'
WS_NFCE_SITUACAO = 'NfeStatusServico'
WS_NFCE_CADASTRO = 'NfeConsultaCadastro'
WS_NFCE_RECEPCAO_EVENTO = 'RecepcaoEventoCarta'
WS_NFCE_QR_CODE = 'NfeQRCode'
WS_NFCE_CONSULTA_DESTINADAS = 'NfeConsultaDest',
WS_NFCE_RET_AUTORIZACAO = 'NFeRetAutorizacao',
WS_NFE_RECEPCAO_EVENTO = 'RecepcaoEvento'
WS_NFE_AUTORIZACAO = 'NfeAutorizacao'
WS_NFE_RET_AUTORIZACAO = 'NfeRetAutorizacao'
# Alguns estados possuem essa consulta não todos
WS_NFE_CADASTRO = 'NfeConsultaCadastro' WS_NFE_CADASTRO = 'NfeConsultaCadastro'
WS_DPEC_RECEPCAO = 'RecepcaoEventoEPEC'
WS_DPEC_CONSULTA = 8
WS_NFE_RECEPCAO_EVENTO = 'RecepcaoEventoCarta'
WS_NFE_RECEPCAO_EVENTO_MANIFESTO = 'RecepcaoEventoManifesto'
# Ambiente nacional
WS_NFCE_QR_CODE = 'NfeQRCode'
WS_NFCE_CONSULTA_DESTINADAS = 'NfeConsultaDest'
WS_DFE_DISTRIBUICAO = 'NFeDistribuicaoDFe' WS_DFE_DISTRIBUICAO = 'NFeDistribuicaoDFe'
WS_DOWNLOAD_NFE = 'nfeDistDFeInteresse' WS_DOWNLOAD_NFE = 'nfeDistDFeInteresse'
NFE_AMBIENTE_PRODUCAO = 1
NFE_AMBIENTE_HOMOLOGACAO = 2
NFCE_AMBIENTE_PRODUCAO = 1
NFCE_AMBIENTE_HOMOLOGACAO = 2
# Códigos do ambiente de homologação e produção
AMBIENTE_PRODUCAO = 1
AMBIENTE_HOMOLOGACAO = 2
NFE_MODELO = u'55'
NFCE_MODELO = u'65'
# Modelos dos documentos eletrônicos
NFE_MODELO = '55'
NFCE_MODELO = '65'
SIGLA_ESTADO = { SIGLA_ESTADO = {
'12': 'AC', '12': 'AC',
@ -68,6 +56,7 @@ SIGLA_ESTADO = {
'28': 'SE', '28': 'SE',
'35': 'SP', '35': 'SP',
'17': 'TO', '17': 'TO',
'91': 'AN'
} }
@ -75,8 +64,7 @@ def localizar_url(servico, estado, mod='55', ambiente=2):
sigla = SIGLA_ESTADO[estado] sigla = SIGLA_ESTADO[estado]
ws = ESTADO_WS[sigla] ws = ESTADO_WS[sigla]
if servico in (WS_DFE_DISTRIBUICAO, WS_DOWNLOAD_NFE,
WS_NFE_RECEPCAO_EVENTO_MANIFESTO):
if servico in (WS_DFE_DISTRIBUICAO, WS_DOWNLOAD_NFE):
ws = AN ws = AN
if mod in ws: if mod in ws:
@ -97,11 +85,8 @@ def localizar_url(servico, estado, mod='55', ambiente=2):
def localizar_qrcode(estado, ambiente=2): def localizar_qrcode(estado, ambiente=2):
sigla = SIGLA_ESTADO[estado] sigla = SIGLA_ESTADO[estado]
dominio = ESTADO_WS[sigla]['65'][ambiente]['servidor']
complemento = ESTADO_WS[sigla]['65'][ambiente][WS_NFCE_QR_CODE]
if 'https://' in complemento:
return complemento
return "https://%s/%s" % (dominio, complemento)
ws_qrcode = ESTADO_WS[sigla][NFCE_MODELO][ambiente][WS_NFCE_QR_CODE]
return ws_qrcode
METODO_WS = { METODO_WS = {
@ -123,7 +108,6 @@ METODO_WS = {
}, },
WS_NFE_SITUACAO: { WS_NFE_SITUACAO: {
'webservice': 'NfeStatusServico2', 'webservice': 'NfeStatusServico2',
'metodo': 'nfeStatusServicoNF2', 'metodo': 'nfeStatusServicoNF2',
}, },
WS_NFE_CADASTRO: { WS_NFE_CADASTRO: {
@ -137,172 +121,153 @@ METODO_WS = {
} }
SVRS = { SVRS = {
NFE_AMBIENTE_PRODUCAO: {
NFE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.svrs.rs.gov.br', 'servidor': 'nfe.svrs.rs.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_CADASTRO: 'ws/CadConsultaCadastro/CadConsultaCadastro2.asmx',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
},
NFE_AMBIENTE_HOMOLOGACAO: {
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa
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', # 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
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfe-homologacao.svrs.rs.gov.br', 'servidor': 'nfe-homologacao.svrs.rs.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_CADASTRO: 'ws/CadConsultaCadastro/CadConsultaCadastro2.asmx',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao2.asmx',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa
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', # 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
}
},
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',
}
} }
} }
SVAN = { SVAN = {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'www.sefazvirtual.fazenda.gov.br', 'servidor': 'www.sefazvirtual.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_CANCELAMENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx',
},
NFE_AMBIENTE_HOMOLOGACAO: {
WS_NFE_INUTILIZACAO: 'NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl',
WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa
WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa
WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.sefazvirtual.fazenda.gov.br', 'servidor': 'hom.sefazvirtual.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_CANCELAMENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx',
}
}
SCAN = {
NFE_AMBIENTE_PRODUCAO: {
'servidor': 'www.scan.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx'
},
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.nfe.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_INUTILIZACAO: 'NfeInutilizacao2/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx'
WS_NFE_INUTILIZACAO: 'NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl',
WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa
WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa
WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa
} }
} }
SVC_AN = { SVC_AN = {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'www.svc.fazenda.gov.br', 'servidor': 'www.svc.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx'
},
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.nfe.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_NFE_AUTORIZACAO: 'NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_CONSULTA: 'NfeConsulta2/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'NfeStatusServico2/NfeStatusServico2.asmx'
WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa
WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa
WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.svc.fazenda.gov.br',
WS_NFE_CONSULTA: 'NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa
WS_NFE_SITUACAO: 'NFeStatusServico4/NFeStatusServico4.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa
WS_NFE_AUTORIZACAO: 'NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa
} }
} }
SVC_RS = { SVC_RS = {
NFE_AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefazvirtual.rs.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
},
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfe.sefazvirtual.rs.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
}
}
DPEC = {
NFE_AMBIENTE_PRODUCAO: {
'servidor': 'www.nfe.fazenda.gov.br',
WS_DPEC_CONSULTA: 'SCERecepcaoRFB/SCERecepcaoRFB.asmx',
WS_DPEC_RECEPCAO: 'SCEConsultaRFB/SCEConsultaRFB.asmx'
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.svrs.rs.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'ws/NfeConsulta/NfeConsulta4.asmx?wsdl',
WS_NFE_AUTORIZACAO: 'ws/NfeStatusServico/NfeStatusServico4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl',
WS_NFE_CONSULTA: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl',
WS_NFE_SITUACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl',
}, },
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.nfe.fazenda.gov.br',
WS_DPEC_CONSULTA: 'SCERecepcaoRFB/SCERecepcaoRFB.asmx',
WS_DPEC_RECEPCAO: 'SCEConsultaRFB/SCEConsultaRFB.asmx'
AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfe-homologacao.svrs.rs.gov.br',
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
} }
} }
AN = { AN = {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'www1.nfe.fazenda.gov.br', 'servidor': 'www1.nfe.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx',
WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx',
WS_NFE_RECEPCAO_EVENTO_MANIFESTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl',
WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa
}, },
NFE_AMBIENTE_HOMOLOGACAO: {
AMBIENTE_HOMOLOGACAO: {
'servidor': 'hom.nfe.fazenda.gov.br', 'servidor': 'hom.nfe.fazenda.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx',
WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx',
WS_NFE_RECEPCAO_EVENTO_MANIFESTO: 'RecepcaoEvento/RecepcaoEvento.asmx',
WS_DFE_DISTRIBUICAO: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl',
WS_DOWNLOAD_NFE: 'NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?Wsdl', # noqa
}, },
} }
UFAM = { UFAM = {
NFE_MODELO: { NFE_MODELO: {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.am.gov.br', 'servidor': 'nfe.sefaz.am.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: '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',
},
NFE_AMBIENTE_HOMOLOGACAO: {
WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'services2/services/NfeConsulta4?wsdl',
WS_NFE_SITUACAO: 'services2/services/NfeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao4?wsdl', # noqa
WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homnfe.sefaz.am.gov.br', 'servidor': 'homnfe.sefaz.am.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: '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',
WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'services2/services/NfeConsulta4?wsdl',
WS_NFE_SITUACAO: 'services2/services/NfeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao4?wsdl', # noqa
WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2?wsdl',
} }
}, },
NFCE_MODELO: { NFCE_MODELO: {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.am.gov.br', 'servidor': 'nfe.sefaz.am.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento', WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'services2/services/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao', WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao', WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2', WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2',
@ -310,273 +275,251 @@ UFAM = {
WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2', WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2',
WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2', WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2',
}, },
NFE_AMBIENTE_HOMOLOGACAO: {
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homnfce.sefaz.am.gov.br', 'servidor': 'homnfce.sefaz.am.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfce-services-nac/services/RecepcaoEvento', WS_NFE_RECEPCAO_EVENTO: 'nfce-services-nac/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfce-services-nac/services/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'nfce-services-nac/services/NfeAutorizacao', WS_NFE_AUTORIZACAO: 'nfce-services-nac/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfce-services-nac/services/NfeRetAutorizacao', WS_NFE_RET_AUTORIZACAO: 'nfce-services-nac/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfce-services-nac/services/NfeInutilizacao2', WS_NFE_INUTILIZACAO: 'nfce-services-nac/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfce-services-nac/services/NfeConsulta2', WS_NFE_CONSULTA: 'nfce-services-nac/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfce-services-nac/services/NfeStatusServico2', WS_NFE_SITUACAO: 'nfce-services-nac/services/NfeStatusServico2',
WS_NFCE_QR_CODE: 'nfceweb/consultarNFCe.jsp',
WS_NFCE_QR_CODE: 'http://homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp',
} }
} }
} }
UFBA = { UFBA = {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.ba.gov.br', 'servidor': 'nfe.sefaz.ba.gov.br',
WS_NFE_AUTORIZACAO: 'webservices/NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO:
'webservices/NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_CONSULTA: 'webservices/NfeConsulta/NfeConsulta.asmx',
WS_NFE_SITUACAO: 'webservices/NfeStatusServico/NfeStatusServico.asmx',
WS_NFE_INUTILIZACAO: 'webservices/nfenw/nfeinutilizacao2.asmx',
WS_NFE_CADASTRO: 'webservices/nfenw/CadConsultaCadastro2.asmx',
WS_NFE_RECEPCAO_EVENTO: 'webservices/sre/recepcaoevento.asmx',
WS_NFE_CANCELAMENTO: 'webservices/sre/recepcaoevento.asmx',
},
NFE_AMBIENTE_HOMOLOGACAO: {
WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa
WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa
WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa
WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa
WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa
WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa
WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'hnfe.sefaz.ba.gov.br', 'servidor': 'hnfe.sefaz.ba.gov.br',
WS_NFE_AUTORIZACAO: 'webservices/NfeAutorizacao/NfeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO:
'webservices/NfeRetAutorizacao/NfeRetAutorizacao.asmx',
WS_NFE_CONSULTA: 'webservices/NfeConsulta/NfeConsulta.asmx',
WS_NFE_SITUACAO: 'webservices/NfeStatusServico/NfeStatusServico.asmx',
WS_NFE_INUTILIZACAO: 'webservices/nfenw/nfeinutilizacao2.asmx',
WS_NFE_CADASTRO: 'webservices/nfenw/CadConsultaCadastro2.asmx',
WS_NFE_RECEPCAO_EVENTO: 'webservices/sre/recepcaoevento.asmx',
WS_NFE_CANCELAMENTO: 'webservices/sre/recepcaoevento.asmx',
WS_NFE_INUTILIZACAO: 'webservices/NFeInutilizacao4/NFeInutilizacao4.asmx?wsdl', # noqa
WS_NFE_CONSULTA: 'webservices/NFeConsultaProtocolo4/NFeConsultaProtocolo4.asmx?wsdl', # noqa
WS_NFE_SITUACAO: 'webservices/NFeStatusServico4/NFeStatusServico4.asmx?wsdl', # noqa
WS_NFE_RECEPCAO_EVENTO: 'webservices/NFeRecepcaoEvento4/NFeRecepcaoEvento4.asmx?wsdl', # noqa
WS_NFE_AUTORIZACAO: 'webservices/NFeAutorizacao4/NFeAutorizacao4.asmx?wsdl', # noqa
WS_NFE_RET_AUTORIZACAO: 'webservices/NFeRetAutorizacao4/NFeRetAutorizacao4.asmx?wsdl', # noqa
WS_NFE_CADASTRO: 'webservices/CadConsultaCadastro4/CadConsultaCadastro4.asmx?wsdl', # noqa
} }
} }
UFCE = { UFCE = {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.ce.gov.br', 'servidor': 'nfe.sefaz.ce.gov.br',
WS_NFE_AUTORIZACAO: 'nfe2/services/NfeRecepcao2',
WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetRecepcao2',
WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfe2/services/NfeStatusServico2',
WS_NFE_CADASTRO: 'nfe2/services/CadConsultaCadastro2',
WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfe2/services/RecepcaoEvento',
},
NFE_AMBIENTE_HOMOLOGACAO: {
WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfeh.sefaz.ce.gov.br', 'servidor': 'nfeh.sefaz.ce.gov.br',
WS_NFE_AUTORIZACAO: 'nfe2/services/NfeRecepcao2',
WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetRecepcao2',
WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfe2/services/NfeStatusServico2',
WS_NFE_CADASTRO: 'nfe2/services/CadConsultaCadastro2',
WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfe2/services/RecepcaoEvento',
WS_NFE_INUTILIZACAO: 'nfe4/services/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe4/services/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe4/services/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe4/services/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe4/services/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe4/services/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe4/services/CadConsultaCadastro4?wsdl',
} }
} }
UFGO = { UFGO = {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.go.gov.br', 'servidor': 'nfe.sefaz.go.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfe/services/v2/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'nfe/services/v2/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfe/services/v2/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfe/services/v2/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfe/services/v2/NfeConsulta2',
WS_NFE_SITUACAO: 'nfe/services/v2/NfeStatusServico2',
WS_NFE_CADASTRO: 'nfe/services/v2/CadConsultaCadastro2',
WS_NFE_CANCELAMENTO: 'nfe/services/v2/RecepcaoEvento',
},
NFE_AMBIENTE_HOMOLOGACAO: {
WS_NFE_INUTILIZACAO: 'nfe/services/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe/services/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe/services/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe/services/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe/services/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe/services/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe/services/CadConsultaCadastro4?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homolog.sefaz.go.gov.br', 'servidor': 'homolog.sefaz.go.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfe/services/v2/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'nfe/services/v2/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfe/services/v2/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfe/services/v2/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfe/services/v2/NfeConsulta2',
WS_NFE_SITUACAO: 'nfe/services/v2/NfeStatusServico2',
WS_NFE_CADASTRO: 'nfe/services/v2/CadConsultaCadastro2',
WS_NFE_CANCELAMENTO: 'nfe/services/v2/RecepcaoEvento',
WS_NFE_INUTILIZACAO: 'nfe/services/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe/services/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe/services/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe/services/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe/services/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe/services/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe/services/CadConsultaCadastro4?wsdl',
} }
} }
UFMT = { UFMT = {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.mt.gov.br', 'servidor': 'nfe.sefaz.mt.gov.br',
WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico2',
WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro2',
WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfews/v2/services/RecepcaoEvento',
},
NFE_AMBIENTE_HOMOLOGACAO: {
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', 'servidor': 'homologacao.sefaz.mt.gov.br',
WS_NFE_AUTORIZACAO: 'nfews/v2/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfews/v2/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfews/v2/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfews/v2/services/NfeStatusServico2',
WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro2',
WS_NFE_RECEPCAO_EVENTO: 'nfews/v2/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfews/v2/services/RecepcaoEvento',
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/CadConsultaCadastro4?wsdl',
WS_NFE_AUTORIZACAO: 'nfews/v2/services/RecepcaoEvento4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfews/v2/services/NfeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfews/v2/services/CadConsultaCadastro4?wsdl',
} }
} }
UFMS = { UFMS = {
NFE_AMBIENTE_PRODUCAO: {
'servidor': 'nfe.fazenda.ms.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'producao/services2/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'producao/services2/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'producao/services2/NfeRetAutorizacao',
WS_NFE_CADASTRO: 'producao/services2/CadConsultaCadastro2',
WS_NFE_INUTILIZACAO: 'producao/services2/NfeInutilizacao2',
WS_NFE_CONSULTA: 'producao/services2/NfeConsulta2',
WS_NFE_SITUACAO: 'producao/services2/NfeStatusServico2',
WS_NFE_CANCELAMENTO: 'producao/services2/RecepcaoEvento',
},
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfe.ms.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'homologacao/services2/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'homologacao/services2/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'homologacao/services2/NfeRetAutorizacao',
WS_NFE_CADASTRO: 'homologacao/services2/CadConsultaCadastro2',
WS_NFE_INUTILIZACAO: 'homologacao/services2/NfeInutilizacao2',
WS_NFE_CONSULTA: 'homologacao/services2/NfeConsulta2',
WS_NFE_SITUACAO: 'homologacao/services2/NfeStatusServico2',
WS_NFE_CANCELAMENTO: 'homologacao/services2/RecepcaoEvento',
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',
} }
} }
UFMG = { UFMG = {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.fazenda.mg.gov.br', 'servidor': 'nfe.fazenda.mg.gov.br',
WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfe2/services/NfeStatus2',
WS_NFE_CADASTRO: 'nfe2/services/cadconsultacadastro2',
WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfe2/services/RecepcaoEvento',
},
NFE_AMBIENTE_HOMOLOGACAO: {
WS_NFE_INUTILIZACAO: 'nfe2/services/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe2/services/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe2/services/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe2/services/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe2/services/cadconsultacadastro2?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'hnfe.fazenda.mg.gov.br', 'servidor': 'hnfe.fazenda.mg.gov.br',
WS_NFE_AUTORIZACAO: 'nfe2/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfe2/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfe2/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfe2/services/NfeStatus2',
WS_NFE_CADASTRO: 'nfe2/services/cadconsultacadastro2',
WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfe2/services/RecepcaoEvento',
WS_NFE_INUTILIZACAO: 'nfe2/services/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe2/services/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe2/services/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe2/services/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe2/services/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe2/services/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe2/services/cadconsultacadastro2?wsdl',
} }
} }
UFPR = { UFPR = {
NFE_AMBIENTE_PRODUCAO: {
'servidor': 'nfe.fazenda.pr.gov.br',
WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao3',
WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao3',
WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao3',
WS_NFE_CONSULTA: 'nfe/NFeConsulta3',
WS_NFE_SITUACAO: 'nfe/NFeStatusServico3',
WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2',
WS_NFE_RECEPCAO_EVENTO: 'nfe-evento/NFeRecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfe-evento/NFeRecepcaoEvento',
},
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfe.fazenda.pr.gov.br',
WS_NFE_AUTORIZACAO: 'nfe/NFeAutorizacao3',
WS_NFE_RET_AUTORIZACAO: 'nfe/NFeRetAutorizacao3',
WS_NFE_INUTILIZACAO: 'nfe/NFeInutilizacao3',
WS_NFE_CONSULTA: 'nfe/NFeConsulta3',
WS_NFE_SITUACAO: 'nfe/NFeStatusServico3',
WS_NFE_CADASTRO: 'nfe/CadConsultaCadastro2',
WS_NFE_RECEPCAO_EVENTO: 'nfe-evento/NFeRecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfe-evento/NFeRecepcaoEvento',
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',
} }
} }
UFPE = { UFPE = {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefaz.pe.gov.br', 'servidor': 'nfe.sefaz.pe.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfe-service/services/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'nfe-service/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfe-service/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfe-service/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfe-service/services/NfeStatusServico2',
WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2',
},
NFE_AMBIENTE_HOMOLOGACAO: {
WS_NFE_INUTILIZACAO: 'nfe-service/services/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe-service/services/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe-service/services/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe-service/services/NFeAutorizacao4?Wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfehomolog.sefaz.pe.gov.br', 'servidor': 'nfehomolog.sefaz.pe.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/RecepcaoEvento',
WS_NFE_CANCELAMENTO: 'nfe-service/services/RecepcaoEvento',
WS_NFE_AUTORIZACAO: 'nfe-service/services/NfeAutorizacao',
WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NfeRetAutorizacao',
WS_NFE_INUTILIZACAO: 'nfe-service/services/NfeInutilizacao2',
WS_NFE_CONSULTA: 'nfe-service/services/NfeConsulta2',
WS_NFE_SITUACAO: 'nfe-service/services/NfeStatusServico2',
WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2',
WS_NFE_INUTILIZACAO: 'nfe-service/services/NFeInutilizacao4?wsdl',
WS_NFE_CONSULTA: 'nfe-service/services/NFeConsultaProtocolo4?wsdl',
WS_NFE_SITUACAO: 'nfe-service/services/NFeStatusServico4?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'nfe-service/services/NFeRecepcaoEvento4?wsdl',
WS_NFE_AUTORIZACAO: 'nfe-service/services/NFeAutorizacao4?wsdl',
WS_NFE_RET_AUTORIZACAO: 'nfe-service/services/NFeRetAutorizacao4?wsdl',
WS_NFE_CADASTRO: 'nfe-service/services/CadConsultaCadastro2?wsdl',
} }
} }
UFRS = { UFRS = {
NFE_MODELO: { NFE_MODELO: {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.sefazrs.rs.gov.br', 'servidor': 'nfe.sefazrs.rs.gov.br',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa
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', # noqa
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfe-homologacao.sefazrs.rs.gov.br',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao/nfeinutilizacao4.asmx?wsdl', # noqa
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', #noqa
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa
}
},
NFCE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfce.sefazrs.rs.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', # noqa
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa
WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFCE_QR_CODE: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx',
}, },
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfe-homologacao.sefazrs.rs.gov.br',
AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfce-homologacao.sefazrs.rs.gov.br',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx', WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx', # noqa
WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx', # noqa
WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx', WS_NFE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx',
WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx', WS_NFE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx', WS_NFE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
WS_NFE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
}
},
NFCE_MODELO: {
NFE_AMBIENTE_PRODUCAO: {
'servidor': 'nfce.sefazrs.rs.gov.br',
WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx',
WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx',
WS_NFCE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx',
WS_NFCE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx',
WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
WS_NFCE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFCE_QR_CODE: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx',
},
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'nfce-homologacao.sefazrs.rs.gov.br',
WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFCE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao.asmx',
WS_NFCE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao.asmx',
WS_NFCE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx',
WS_NFCE_INUTILIZACAO: 'ws/NfeInutilizacao/NfeInutilizacao2.asmx',
WS_NFCE_CONSULTA: 'ws/NfeConsulta/NfeConsulta2.asmx',
WS_NFCE_SITUACAO: 'ws/NfeStatusServico/NfeStatusServico2.asmx',
WS_NFCE_CANCELAMENTO: 'ws/recepcaoevento/recepcaoevento.asmx',
WS_NFCE_QR_CODE: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx' WS_NFCE_QR_CODE: 'https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx'
} }
} }
@ -584,8 +527,30 @@ UFRS = {
UFSP = { UFSP = {
NFE_MODELO: { NFE_MODELO: {
NFE_AMBIENTE_PRODUCAO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfe.fazenda.sp.gov.br', 'servidor': 'nfe.fazenda.sp.gov.br',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao4.asmx?wsdl',
WS_NFE_CONSULTA: 'ws/nfeconsultaprotocolo4.asmx?wsdl',
WS_NFE_SITUACAO: 'ws/nfestatusservico4.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'ws/nferecepcaoevento4.asmx?wsdl',
WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao4.asmx?wsdl',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro4.asmx?wsdl',
},
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfe.fazenda.sp.gov.br',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao4.asmx?wsdl',
WS_NFE_CONSULTA: 'ws/nfeconsultaprotocolo4.asmx?wsdl',
WS_NFE_SITUACAO: 'ws/nfestatusservico4.asmx?wsdl',
WS_NFE_RECEPCAO_EVENTO: 'ws/nferecepcaoevento4.asmx?wsdl',
WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao4.asmx?wsdl',
WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao4.asmx?wsdl',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro4.asmx?wsdl',
}
},
NFCE_MODELO: {
AMBIENTE_PRODUCAO: {
'servidor': 'nfce.fazenda.sp.gov.br',
WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx', WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx', WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx', WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
@ -593,10 +558,10 @@ UFSP = {
WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx', WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx', WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx',
WS_NFE_CANCELAMENTO: 'ws/recepcaoevento.asmx',
WS_NFCE_QR_CODE: '',
}, },
NFE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfe.fazenda.sp.gov.br',
AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfce.fazenda.sp.gov.br',
WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx', WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx', WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx', WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
@ -604,31 +569,7 @@ UFSP = {
WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx', WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx',
WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx', WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx',
WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx', WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx',
WS_NFE_CANCELAMENTO: 'ws/recepcaoevento.asmx',
}
},
NFCE_MODELO: {
NFCE_AMBIENTE_PRODUCAO: {
'servidor': 'nfce.fazenda.sp.gov.br',
WS_NFCE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
WS_NFCE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
WS_NFCE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
WS_NFCE_CONSULTA: 'ws/nfeconsulta2.asmx',
WS_NFCE_SITUACAO: 'ws/nfestatusservico2.asmx',
WS_NFCE_CADASTRO: 'ws/cadconsultacadastro2.asmx',
WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx',
WS_NFCE_QR_CODE: '',
},
NFCE_AMBIENTE_HOMOLOGACAO: {
'servidor': 'homologacao.nfce.fazenda.sp.gov.br',
WS_NFCE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
WS_NFCE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
WS_NFCE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
WS_NFCE_CONSULTA: 'ws/nfeconsulta2.asmx',
WS_NFCE_SITUACAO: 'ws/nfestatusservico2.asmx',
WS_NFCE_CADASTRO: 'ws/cadconsultacadastro2.asmx',
WS_NFCE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx',
WS_NFCE_QR_CODE: 'NFCEConsultaPublica/Paginas/ConstultaQRCode.aspx',
WS_NFCE_QR_CODE: 'https://homologacao.nfce.fazenda.sp.gov.br/NFCEConsultaPublica/Paginas/ConstultaQRCode.aspx',
} }
} }
} }
@ -662,47 +603,5 @@ ESTADO_WS = {
'SE': SVRS, 'SE': SVRS,
'SP': UFSP, 'SP': UFSP,
'TO': SVRS, 'TO': SVRS,
}
#
# Informação obtida em
# http://www.nfe.fazenda.gov.br/portal/webServices.aspx
# Última verificação: 15/08/2014 16:22
#
# Autorizadores em contingência:
# - UF que utilizam a SVC-AN - Sefaz Virtual de Contingência Ambiente Nacional:
# AC, AL, AP, DF, ES, MG, PB, RJ, RN, RO, RR, RS, SC, SE, SP, TO
# - UF que utilizam a SVC-RS - Sefaz Virtual de Contingência Rio Grande do Sul:
# AM, BA, CE, GO, MA, MS, MT, PA, PE, PI, PR
#
ESTADO_WS_CONTINGENCIA = {
'AC': SVC_AN,
'AL': SVC_AN,
'AM': SVC_RS,
'AP': SVC_AN,
'BA': SVC_RS,
'CE': SVC_RS,
'DF': SVC_AN,
'ES': SVC_AN,
'GO': SVC_RS,
'MA': SVC_RS,
'MG': SVC_AN,
'MS': SVC_RS,
'MT': SVC_RS,
'PA': SVC_RS,
'PB': SVC_AN,
'PE': SVC_RS,
'PI': SVC_RS,
'PR': SVC_RS,
'RJ': SVC_AN,
'RN': SVC_AN,
'RO': SVC_AN,
'RR': SVC_AN,
'RS': SVC_AN,
'SC': SVC_AN,
'SE': SVC_AN,
'SP': SVC_AN,
'TO': SVC_AN,
'AN': AN,
} }

257
pytrustnfe/nfe/__init__.py

@ -5,34 +5,18 @@
import os import os
import hashlib import hashlib
import binascii
from lxml import etree from lxml import etree
from .comunicacao import executar_consulta
from .assinatura import Assinatura from .assinatura import Assinatura
from pytrustnfe.xml import render_xml
from pytrustnfe.utils import CabecalhoSoap
from pytrustnfe.xml import render_xml, sanitize_response
from pytrustnfe.utils import gerar_chave, ChaveNFe from pytrustnfe.utils import gerar_chave, ChaveNFe
from pytrustnfe.Servidores import localizar_url, localizar_qrcode from pytrustnfe.Servidores import localizar_url, localizar_qrcode
from pytrustnfe.xml.validate import valida_nfe
from pytrustnfe.exceptions import NFeValidationException
def _build_header(method, **kwargs):
action = {
'NfeAutorizacao': ('NfeAutorizacao', '3.10'),
'NfeRetAutorizacao': ('NfeRetAutorizacao', '3.10'),
'NfeConsultaCadastro': ('CadConsultaCadastro2', '2.00'),
'NfeInutilizacao': ('NfeInutilizacao2', '3.10'),
'RecepcaoEventoCancelamento': ('RecepcaoEvento', '1.00'),
'RecepcaoEventoCarta': ('RecepcaoEvento', '1.00'),
'NFeDistribuicaoDFe': ('NFeDistribuicaoDFe/nfeDistDFeInteresse',
'1.00'),
'RecepcaoEventoManifesto': ('RecepcaoEvento', '1.00'),
'NfeConsulta2': ('NfeConsulta2', '3.10')
}
vals = {'estado': kwargs['estado'],
'soap_action': action[method][0],
'versao': action[method][1]}
return CabecalhoSoap(**vals)
from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key
# Zeep
from requests import Session
from zeep import Client
from zeep.transports import Transport
def _generate_nfe_id(**kwargs): def _generate_nfe_id(**kwargs):
@ -54,26 +38,6 @@ def _generate_nfe_id(**kwargs):
item['infNFe']['ide']['cDV'] = chave_nfe[len(chave_nfe) - 1:] item['infNFe']['ide']['cDV'] = chave_nfe[len(chave_nfe) - 1:]
def _add_required_node(elemTree):
ns = elemTree.nsmap
if None in ns:
ns['ns'] = ns[None]
ns.pop(None)
prods = elemTree.findall('ns:NFe/ns:infNFe/ns:det/ns:prod', namespaces=ns)
for prod in prods:
element = prod.find('ns:cEAN', namespaces=ns)
if element is None:
cEan = etree.Element('cEAN')
prod.insert(1, cEan)
element = prod.find('ns:cEANTrib', namespaces=ns)
if element is None:
cEANTrib = etree.Element('cEANTrib')
vProd = prod.find('ns:vProd', namespaces=ns)
prod.insert(prod.index(vProd) + 1, cEANTrib)
return elemTree
def _add_qrCode(xml, **kwargs): def _add_qrCode(xml, **kwargs):
xml = etree.fromstring(xml) xml = etree.fromstring(xml)
inf_nfe = kwargs['NFes'][0]['infNFe'] inf_nfe = kwargs['NFes'][0]['infNFe']
@ -81,15 +45,13 @@ def _add_qrCode(xml, **kwargs):
infnfesupl = etree.Element('infNFeSupl') infnfesupl = etree.Element('infNFeSupl')
qrcode = etree.Element('qrCode') qrcode = etree.Element('qrCode')
chave_nfe = inf_nfe['Id'][3:] chave_nfe = inf_nfe['Id'][3:]
dh_emissao = inf_nfe['ide']['dhEmi'].encode('hex')
dh_emissao = binascii.hexlify(inf_nfe['ide']['dhEmi'].encode()).decode()
versao = '100' versao = '100'
ambiente = kwargs['ambiente'] ambiente = kwargs['ambiente']
valor_total = inf_nfe['total']['vNF'] valor_total = inf_nfe['total']['vNF']
dest_cpf = 'Inexistente' dest_cpf = 'Inexistente'
dest = nfe.find(".//{http://www.portalfiscal.inf.br/nfe}dest") dest = nfe.find(".//{http://www.portalfiscal.inf.br/nfe}dest")
if dest:
dest_parent = dest.getparent()
dest_parent.remove(dest)
if inf_nfe.get('dest', False): if inf_nfe.get('dest', False):
if inf_nfe['dest'].get('CPF', False): if inf_nfe['dest'].get('CPF', False):
dest_cpf = inf_nfe['dest']['CPF'] dest_cpf = inf_nfe['dest']['CPF']
@ -97,11 +59,10 @@ def _add_qrCode(xml, **kwargs):
cpf = etree.Element('CPF') cpf = etree.Element('CPF')
cpf.text = dest_cpf cpf.text = dest_cpf
dest.append(cpf) dest.append(cpf)
dest_parent.append(dest)
icms_total = inf_nfe['total']['vICMS'] icms_total = inf_nfe['total']['vICMS']
dig_val = xml.find(
".//{http://www.w3.org/2000/09/xmldsig#}DigestValue")\
.text.encode('hex')
dig_val = binascii.hexlify(xml.find(
".//{http://www.w3.org/2000/09/xmldsig#}DigestValue").text.encode()).decode()
cid_token = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['cid_token'] cid_token = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['cid_token']
csc = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['csc'] csc = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['csc']
@ -109,7 +70,7 @@ def _add_qrCode(xml, **kwargs):
={5}&vICMS={6}&digVal={7}&cIdToken={8}{9}".\ ={5}&vICMS={6}&digVal={7}&cIdToken={8}{9}".\
format(chave_nfe, versao, ambiente, dest_cpf, dh_emissao, format(chave_nfe, versao, ambiente, dest_cpf, dh_emissao,
valor_total, icms_total, dig_val, cid_token, csc) valor_total, icms_total, dig_val, cid_token, csc)
c_hash_QR_code = hashlib.sha1(c_hash_QR_code).hexdigest()
c_hash_QR_code = hashlib.sha1(c_hash_QR_code.encode()).hexdigest()
QR_code_url = "?chNFe={0}&nVersao={1}&tpAmb={2}&{3}dhEmi={4}&vNF={5}&vICMS\ QR_code_url = "?chNFe={0}&nVersao={1}&tpAmb={2}&{3}dhEmi={4}&vNF={5}&vICMS\
={6}&digVal={7}&cIdToken={8}&cHashQRCode={9}".\ ={6}&digVal={7}&cIdToken={8}&cHashQRCode={9}".\
@ -125,49 +86,23 @@ def _add_qrCode(xml, **kwargs):
return etree.tostring(xml) return etree.tostring(xml)
def _send(certificado, method, sign, **kwargs):
def _render(certificado, method, sign, **kwargs):
path = os.path.join(os.path.dirname(__file__), 'templates') path = os.path.join(os.path.dirname(__file__), 'templates')
xmlElem_send = render_xml(path, '%s.xml' % method, True, **kwargs) xmlElem_send = render_xml(path, '%s.xml' % method, True, **kwargs)
modelo = xmlElem_send.find(".//{http://www.portalfiscal.inf.br/nfe}mod") modelo = xmlElem_send.find(".//{http://www.portalfiscal.inf.br/nfe}mod")
modelo = modelo.text if modelo is not None else '55' modelo = modelo.text if modelo is not None else '55'
if modelo == '65':
pagamento = etree.Element('pag')
tipo_pagamento = etree.Element('tPag')
valor = etree.Element('vPag')
valor_pago = kwargs['NFes'][0]['infNFe']['total']['vNF']
metodo_pagamento = kwargs['NFes'][0]['infNFe']['pagamento']
tipo_pagamento.text, valor.text = metodo_pagamento, valor_pago
pagamento.append(tipo_pagamento)
pagamento.append(valor)
transp = xmlElem_send.find(
".//{http://www.portalfiscal.inf.br/nfe}transp")
transp.addnext(pagamento)
if sign: if sign:
# Caso for autorização temos que adicionar algumas tags tipo
# cEan, cEANTrib porque o governo sempre complica e não segue padrão
if method == 'NfeAutorizacao':
xmlElem_send = _add_required_node(xmlElem_send)
signer = Assinatura(certificado.pfx, certificado.password) signer = Assinatura(certificado.pfx, certificado.password)
if method == 'NfeInutilizacao': if method == 'NfeInutilizacao':
xml_send = signer.assina_xml(xmlElem_send, kwargs['obj']['id']) xml_send = signer.assina_xml(xmlElem_send, kwargs['obj']['id'])
if method == 'NfeAutorizacao': if method == 'NfeAutorizacao':
xml_send = signer.assina_xml( xml_send = signer.assina_xml(
xmlElem_send, kwargs['NFes'][0]['infNFe']['Id']) xmlElem_send, kwargs['NFes'][0]['infNFe']['Id'])
if 'validate' in kwargs:
erros = valida_nfe(xml_send)
if erros:
raise NFeValidationException('Erro ao validar NFe',
erros=erros,
sent_xml=xml_send)
elif method == 'RecepcaoEventoCancelamento':
elif method == 'RecepcaoEvento':
xml_send = signer.assina_xml( xml_send = signer.assina_xml(
xmlElem_send, kwargs['eventos'][0]['Id']) xmlElem_send, kwargs['eventos'][0]['Id'])
if method == 'RecepcaoEventoCarta':
xml_send = signer.assina_xml(
xmlElem_send, kwargs['Id'])
elif method == 'RecepcaoEventoManifesto': elif method == 'RecepcaoEventoManifesto':
xml_send = signer.assina_xml( xml_send = signer.assina_xml(
xmlElem_send, kwargs['manifesto']['identificador']) xmlElem_send, kwargs['manifesto']['identificador'])
@ -177,68 +112,178 @@ def _send(certificado, method, sign, **kwargs):
else: else:
xml_send = etree.tostring(xmlElem_send) xml_send = etree.tostring(xmlElem_send)
return xml_send
url = localizar_url(method, kwargs['estado'], modelo,
kwargs['ambiente'])
cabecalho = _build_header(method, **kwargs)
send_raw = False
if method == 'NFeDistribuicaoDFe':
send_raw = True
def _send(certificado, method, **kwargs):
xml_send = kwargs["xml"]
base_url = localizar_url(
method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente'])
cert, key = extract_cert_and_key_from_pfx(
certificado.pfx, certificado.password)
cert, key = save_cert_key(cert, key)
session = Session()
session.cert = (cert, key)
session.verify = False
transport = Transport(session=session)
xml = etree.fromstring(xml_send)
client = Client(base_url, transport=transport)
port = next(iter(client.wsdl.port_types))
first_operation = next(iter(client.wsdl.port_types[port].operations))
namespaceNFe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe")
if namespaceNFe is not None:
namespaceNFe.set('xmlns', 'http://www.portalfiscal.inf.br/nfe')
response, obj = executar_consulta(certificado, url, cabecalho, xml_send,
send_raw=send_raw)
with client.settings(raw_response=True):
response = client.service[first_operation](xml)
response, obj = sanitize_response(response.text)
return { return {
'sent_xml': xml_send, 'sent_xml': xml_send,
'received_xml': response, 'received_xml': response,
'object': obj
'object': obj.Body.getchildren()[0]
} }
def autorizar_nfe(certificado, **kwargs): # Assinar
def xml_autorizar_nfe(certificado, **kwargs):
_generate_nfe_id(**kwargs) _generate_nfe_id(**kwargs)
return _send(certificado, 'NfeAutorizacao', True, **kwargs)
return _render(certificado, 'NfeAutorizacao', True, **kwargs)
def autorizar_nfe(certificado, **kwargs): # Assinar
if "xml" not in kwargs:
kwargs['xml'] = xml_autorizar_nfe(certificado, **kwargs)
return _send(certificado, 'NfeAutorizacao', **kwargs)
def xml_retorno_autorizar_nfe(certificado, **kwargs):
return _render(certificado, 'NfeRetAutorizacao', False, **kwargs)
def retorno_autorizar_nfe(certificado, **kwargs): def retorno_autorizar_nfe(certificado, **kwargs):
return _send(certificado, 'NfeRetAutorizacao', False, **kwargs)
if "xml" not in kwargs:
kwargs['xml'] = xml_retorno_autorizar_nfe(certificado, **kwargs)
return _send(certificado, 'NfeRetAutorizacao', **kwargs)
def xml_recepcao_evento_cancelamento(certificado, **kwargs): # Assinar
return _render(certificado, 'RecepcaoEvento', True, **kwargs)
def recepcao_evento_cancelamento(certificado, **kwargs): # Assinar def recepcao_evento_cancelamento(certificado, **kwargs): # Assinar
return _send(certificado, 'RecepcaoEventoCancelamento', True, **kwargs)
if "xml" not in kwargs:
kwargs['xml'] = xml_recepcao_evento_cancelamento(certificado, **kwargs)
return _send(certificado, 'RecepcaoEvento', **kwargs)
def xml_inutilizar_nfe(certificado, **kwargs):
return _render(certificado, 'NfeInutilizacao', True, **kwargs)
def inutilizar_nfe(certificado, **kwargs): # Assinar
return _send(certificado, 'NfeInutilizacao', True, **kwargs)
def inutilizar_nfe(certificado, **kwargs):
if "xml" not in kwargs:
kwargs['xml'] = xml_inutilizar_nfe(certificado, **kwargs)
return _send(certificado, 'NfeInutilizacao', **kwargs)
def xml_consultar_protocolo_nfe(certificado, **kwargs):
return _render(certificado, 'NfeConsultaProtocolo', False, **kwargs)
def consultar_protocolo_nfe(certificado, **kwargs): def consultar_protocolo_nfe(certificado, **kwargs):
return _send(certificado, 'NfeConsulta2', False, **kwargs)
if "xml" not in kwargs:
kwargs['xml'] = xml_consultar_protocolo_nfe(certificado, **kwargs)
return _send(certificado, 'NfeConsultaProtocolo', **kwargs)
def xml_nfe_status_servico(certificado, **kwargs):
return _render(certificado, 'NfeStatusServico', False, **kwargs)
def nfe_status_servico(certificado, **kwargs): def nfe_status_servico(certificado, **kwargs):
return _send(certificado, 'NfeStatusServico', False, **kwargs)
if "xml" not in kwargs:
kwargs['xml'] = xml_nfe_status_servico(certificado, **kwargs)
return _send(certificado, 'NfeStatusServico', **kwargs)
def xml_consulta_cadastro(certificado, **kwargs):
return _render(certificado, 'NfeConsultaCadastro', False, **kwargs)
def consulta_cadastro(certificado, **kwargs): def consulta_cadastro(certificado, **kwargs):
return _send(certificado, 'NfeConsultaCadastro', False, **kwargs)
if "xml" not in kwargs:
kwargs['xml'] = xml_consulta_cadastro(certificado, **kwargs)
kwargs['modelo'] = '55'
return _send(certificado, 'NfeConsultaCadastro', **kwargs)
def xml_recepcao_evento_carta_correcao(certificado, **kwargs): # Assinar
return _render(certificado, 'RecepcaoEvento', True, **kwargs)
def recepcao_evento_carta_correcao(certificado, **kwargs): # Assinar def recepcao_evento_carta_correcao(certificado, **kwargs): # Assinar
return _send(certificado, 'RecepcaoEventoCarta', True, **kwargs)
if "xml" not in kwargs:
kwargs['xml'] = xml_recepcao_evento_carta_correcao(
certificado, **kwargs)
return _send(certificado, 'RecepcaoEvento', **kwargs)
def xml_recepcao_evento_manifesto(certificado, **kwargs): # Assinar
return _render(certificado, 'RecepcaoEvento', True, **kwargs)
def recepcao_evento_manifesto(certificado, **kwargs): # Assinar def recepcao_evento_manifesto(certificado, **kwargs): # Assinar
return _send(certificado, 'RecepcaoEventoManifesto', True, **kwargs)
if "xml" not in kwargs:
kwargs['xml'] = xml_recepcao_evento_manifesto(certificado, **kwargs)
return _send(certificado, 'RecepcaoEvento', **kwargs)
def recepcao_evento_epec(certificado, **kwargs): # Assinar
return _send(certificado, 'RecepcaoEventoEPEC', True, **kwargs)
def xml_consulta_distribuicao_nfe(certificado, **kwargs): # Assinar
return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs)
def consulta_distribuicao_nfe(certificado, **kwargs): def consulta_distribuicao_nfe(certificado, **kwargs):
return _send(certificado, 'NFeDistribuicaoDFe', False, **kwargs)
if "xml" not in kwargs:
kwargs['xml'] = xml_consulta_distribuicao_nfe(certificado, **kwargs)
xml_send = kwargs["xml"]
base_url = localizar_url(
'NFeDistribuicaoDFe', kwargs['estado'], kwargs['modelo'],
kwargs['ambiente'])
cert, key = extract_cert_and_key_from_pfx(
certificado.pfx, certificado.password)
cert, key = save_cert_key(cert, key)
session = Session()
session.cert = (cert, key)
session.verify = False
transport = Transport(session=session)
xml = etree.fromstring(xml_send)
xml_um = etree.fromstring('<nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/"><cUF>AN</cUF><versaoDados>1.00</versaoDados></nfeCabecMsg>')
client = Client(base_url, transport=transport)
port = next(iter(client.wsdl.port_types))
first_operation = next(iter(client.wsdl.port_types[port].operations))
with client.settings(raw_response=True):
response = client.service[first_operation](nfeDadosMsg=xml, _soapheaders=[xml_um])
response, obj = sanitize_response(response.text)
return {
'sent_xml': xml_send,
'received_xml': response,
'object': obj.Body.nfeDistDFeInteresseResponse.nfeDistDFeInteresseResult
}
def xml_download_nfe(certificado, **kwargs): # Assinar
return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs)
def download_nfe(certificado, **kwargs): def download_nfe(certificado, **kwargs):
return _send(certificado, 'NFeDistribuicaoDFe', False, **kwargs)
if "xml" not in kwargs:
kwargs['xml'] = xml_download_nfe(certificado, **kwargs)
return _send(certificado, 'NFeDistribuicaoDFe', **kwargs)

174
pytrustnfe/nfe/danfe.py

@ -18,6 +18,9 @@ from reportlab.lib.enums import TA_CENTER
from reportlab.platypus import Paragraph, Image from reportlab.platypus import Paragraph, Image
from reportlab.lib.styles import ParagraphStyle from reportlab.lib.styles import ParagraphStyle
import pytz
from datetime import datetime, timedelta
def chunks(cString, nLen): def chunks(cString, nLen):
for start in range(0, len(cString), nLen): for start in range(0, len(cString), nLen):
@ -34,10 +37,43 @@ def format_cnpj_cpf(value):
return cValue return cValue
def getdateUTC(cDateUTC):
cDt = cDateUTC[0:10].split('-')
def getdateByTimezone(cDateUTC, timezone=None):
'''
Esse método trata a data recebida de acordo com o timezone do
usuário. O seu retorno é dividido em duas partes:
1) A data em si;
2) As horas;
:param cDateUTC: string contendo as informações da data
:param timezone: timezone do usuário do sistema
:return: data e hora convertidos para a timezone do usuário
'''
# Aqui cortamos a informação do timezone da string (+03:00)
dt = cDateUTC[0:19]
# Verificamos se a string está completa (data + hora + timezone)
if timezone and len(cDateUTC) == 25:
# tz irá conter informações da timezone contida em cDateUTC
tz = cDateUTC[19:25]
tz = int(tz.split(':')[0])
dt = datetime.strptime(dt, '%Y-%m-%dT%H:%M:%S')
# dt agora será convertido para o horario em UTC
dt = dt - timedelta(hours=tz)
# tzinfo passará a apontar para <UTC>
dt = pytz.utc.localize(dt)
# valor de dt é convertido para a timezone do usuário
dt = timezone.normalize(dt)
dt = dt.strftime('%Y-%m-%dT%H:%M:%S')
cDt = dt[0:10].split('-')
cDt.reverse() cDt.reverse()
return '/'.join(cDt), cDateUTC[11:16]
return '/'.join(cDt), dt[11:16]
def format_number(cNumber): def format_number(cNumber):
@ -72,7 +108,8 @@ def get_image(path, width=1 * cm):
class danfe(object): class danfe(object):
def __init__(self, sizepage=A4, list_xml=None, recibo=True, def __init__(self, sizepage=A4, list_xml=None, recibo=True,
orientation='portrait', logo=None, cce_xml=None):
orientation='portrait', logo=None, cce_xml=None,
timezone=None):
self.width = 210 # 21 x 29,7cm self.width = 210 # 21 x 29,7cm
self.height = 297 self.height = 297
self.nLeft = 10 self.nLeft = 10
@ -81,10 +118,13 @@ class danfe(object):
self.nBottom = 8 self.nBottom = 8
self.nlin = self.nTop self.nlin = self.nTop
self.logo = logo self.logo = logo
self.oFrete = {'0': '0 - Emitente',
'1': '1 - Destinatário',
'2': '2 - Terceiros',
'9': '9 - Sem Frete'}
self.oFrete = {
'0': '0 - Contratação por conta do Remetente (CIF)',
'1': '1 - Contratação por conta do Destinatário (FOB)',
'2': '2 - Contratação por conta de Terceiros',
'3': '3 - Transporte Próprio por conta do Remetente',
'4': '4 - Transporte Próprio por conta do Destinatário',
'9': '9 - Sem Ocorrência de Transporte'}
self.oPDF_IO = IO() self.oPDF_IO = IO()
if orientation == 'landscape': if orientation == 'landscape':
@ -104,8 +144,8 @@ class danfe(object):
self.Page = 1 self.Page = 1
# Calculando total linhas usadas para descrições dos itens # Calculando total linhas usadas para descrições dos itens
# Com bloco fatura, apenas 29 linhas para itens na primeira folha
nNr_Lin_Pg_1 = 34 if oXML_cobr is None else 30
# Com bloco fatura, apenas 25 linhas para itens na primeira folha
nNr_Lin_Pg_1 = 30 if oXML_cobr is None else 26
# [ rec_ini , rec_fim , lines , limit_lines ] # [ rec_ini , rec_fim , lines , limit_lines ]
oPaginator = [[0, 0, 0, nNr_Lin_Pg_1]] oPaginator = [[0, 0, 0, nNr_Lin_Pg_1]]
el_det = oXML.findall(".//{http://www.portalfiscal.inf.br/nfe}det") el_det = oXML.findall(".//{http://www.portalfiscal.inf.br/nfe}det")
@ -119,9 +159,9 @@ class danfe(object):
infAdProd = item.find( infAdProd = item.find(
".//{http://www.portalfiscal.inf.br/nfe}infAdProd") ".//{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: if infAdProd is not None:
list_.extend(wrap(infAdProd.text, 56))
list_.extend(wrap(infAdProd.text, 50))
list_desc.append(list_) list_desc.append(list_)
list_cProd = wrap(tagtext(oNode=el_prod, cTag='cProd'), 14) list_cProd = wrap(tagtext(oNode=el_prod, cTag='cProd'), 14)
@ -144,13 +184,13 @@ class danfe(object):
self.NrPages = len(oPaginator) # Calculando nr. páginas self.NrPages = len(oPaginator) # Calculando nr. páginas
if recibo: if recibo:
self.recibo_entrega(oXML=oXML)
self.recibo_entrega(oXML=oXML, timezone=timezone)
self.ide_emit(oXML=oXML)
self.destinatario(oXML=oXML)
self.ide_emit(oXML=oXML, timezone=timezone)
self.destinatario(oXML=oXML, timezone=timezone)
if oXML_cobr is not None: if oXML_cobr is not None:
self.faturas(oXML=oXML_cobr)
self.faturas(oXML=oXML_cobr, timezone=timezone)
self.impostos(oXML=oXML) self.impostos(oXML=oXML)
self.transportes(oXML=oXML) self.transportes(oXML=oXML)
@ -162,7 +202,7 @@ class danfe(object):
# Gera o restante das páginas do XML # Gera o restante das páginas do XML
for oPag in oPaginator[1:]: for oPag in oPaginator[1:]:
self.newpage() self.newpage()
self.ide_emit(oXML=oXML)
self.ide_emit(oXML=oXML, timezone=timezone)
self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPag, self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPag,
list_desc=list_desc, nHeight=77, list_desc=list_desc, nHeight=77,
list_cod_prod=list_cod_prod) list_cod_prod=list_cod_prod)
@ -170,17 +210,19 @@ class danfe(object):
self.newpage() self.newpage()
if cce_xml: if cce_xml:
for xml in cce_xml: for xml in cce_xml:
self._generate_cce(cce_xml=xml, oXML=oXML)
self._generate_cce(cce_xml=xml, oXML=oXML, timezone=timezone)
self.newpage() self.newpage()
self.canvas.save() self.canvas.save()
def ide_emit(self, oXML=None):
def ide_emit(self, oXML=None, timezone=None):
elem_infNFe = oXML.find( elem_infNFe = oXML.find(
".//{http://www.portalfiscal.inf.br/nfe}infNFe") ".//{http://www.portalfiscal.inf.br/nfe}infNFe")
elem_protNFe = oXML.find( elem_protNFe = oXML.find(
".//{http://www.portalfiscal.inf.br/nfe}protNFe") ".//{http://www.portalfiscal.inf.br/nfe}protNFe")
elem_emit = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}emit") elem_emit = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}emit")
elem_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide") elem_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide")
elem_evento = oXML.find(
".//{http://www.portalfiscal.inf.br/nfe}infEvento")
cChave = elem_infNFe.attrib.get('Id')[3:] cChave = elem_infNFe.attrib.get('Id')[3:]
barcode128 = code128.Code128( barcode128 = code128.Code128(
@ -250,7 +292,8 @@ class danfe(object):
self.stringcenter(self.nLeft + 116.5 + nW_Rect, self.nlin + 19.5, self.stringcenter(self.nLeft + 116.5 + nW_Rect, self.nlin + 19.5,
' '.join(chunks(cChave, 4))) # Chave ' '.join(chunks(cChave, 4))) # Chave
self.canvas.setFont('NimbusSanL-Regu', 8) self.canvas.setFont('NimbusSanL-Regu', 8)
cDt, cHr = getdateUTC(tagtext(oNode=elem_protNFe, cTag='dhRecbto'))
cDt, cHr = getdateByTimezone(
tagtext(oNode=elem_protNFe, cTag='dhRecbto'), timezone)
cProtocolo = tagtext(oNode=elem_protNFe, cTag='nProt') cProtocolo = tagtext(oNode=elem_protNFe, cTag='nProt')
cDt = cProtocolo + ' - ' + cDt + ' ' + cHr cDt = cProtocolo + ' - ' + cDt + ' ' + cHr
nW_Rect = (self.width - self.nLeft - self.nRight - 110) / 2 nW_Rect = (self.width - self.nLeft - self.nRight - 110) / 2
@ -271,9 +314,9 @@ class danfe(object):
# Razão Social emitente # Razão Social emitente
P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN) P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN)
w, h = P.wrap(55 * mm, 50 * mm)
w, h = P.wrap(55 * mm, 40 * mm)
P.drawOn(self.canvas, (self.nLeft + 30) * mm, P.drawOn(self.canvas, (self.nLeft + 30) * mm,
(self.height - self.nlin - 12) * mm)
(self.height - self.nlin - ((5*h + 12)/12)) * mm)
if self.logo: if self.logo:
img = get_image(self.logo, width=2 * cm) img = get_image(self.logo, width=2 * cm)
@ -308,9 +351,19 @@ class danfe(object):
self.string(self.nLeft + 65, 449, 'SEM VALOR FISCAL') self.string(self.nLeft + 65, 449, 'SEM VALOR FISCAL')
self.canvas.restoreState() self.canvas.restoreState()
# Cancelado
if tagtext(oNode=elem_evento, cTag='xEvento') == \
'Cancelamento registrado':
self.canvas.saveState()
self.canvas.rotate(45)
self.canvas.setFont('NimbusSanL-Bold', 60)
self.canvas.setFillColorRGB(1, 0.2, 0.2)
self.string(self.nLeft + 80, 275, 'CANCELADO')
self.canvas.restoreState()
self.nlin += 48 self.nlin += 48
def destinatario(self, oXML=None):
def destinatario(self, oXML=None, timezone=None):
elem_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide") elem_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide")
elem_dest = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}dest") elem_dest = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}dest")
nMr = self.width - self.nRight nMr = self.width - self.nRight
@ -354,9 +407,11 @@ class danfe(object):
else: else:
cnpj_cpf = format_cnpj_cpf(tagtext(oNode=elem_dest, cTag='CPF')) cnpj_cpf = format_cnpj_cpf(tagtext(oNode=elem_dest, cTag='CPF'))
self.string(nMr - 69, self.nlin + 7.5, cnpj_cpf) self.string(nMr - 69, self.nlin + 7.5, cnpj_cpf)
cDt, cHr = getdateUTC(tagtext(oNode=elem_ide, cTag='dhEmi'))
cDt, cHr = getdateByTimezone(tagtext(oNode=elem_ide, cTag='dhEmi'),
timezone)
self.string(nMr - 24, self.nlin + 7.7, cDt + ' ' + cHr) self.string(nMr - 24, self.nlin + 7.7, cDt + ' ' + cHr)
cDt, cHr = getdateUTC(tagtext(oNode=elem_ide, cTag='dhSaiEnt'))
cDt, cHr = getdateByTimezone(
tagtext(oNode=elem_ide, cTag='dhSaiEnt'), timezone)
self.string(nMr - 24, self.nlin + 14.3, cDt + ' ' + cHr) # Dt saída self.string(nMr - 24, self.nlin + 14.3, cDt + ' ' + cHr) # Dt saída
cEnd = tagtext(oNode=elem_dest, cTag='xLgr') + ', ' + tagtext( cEnd = tagtext(oNode=elem_dest, cTag='xLgr') + ', ' + tagtext(
oNode=elem_dest, cTag='nro') oNode=elem_dest, cTag='nro')
@ -376,7 +431,7 @@ class danfe(object):
self.nlin += 24 # Nr linhas ocupadas pelo bloco self.nlin += 24 # Nr linhas ocupadas pelo bloco
def faturas(self, oXML=None):
def faturas(self, oXML=None, timezone=None):
nMr = self.width - self.nRight nMr = self.width - self.nRight
@ -409,7 +464,8 @@ class danfe(object):
line_iter = iter(oXML[1:10]) # Salta elemt 1 e considera os próximos 9 line_iter = iter(oXML[1:10]) # Salta elemt 1 e considera os próximos 9
for oXML_dup in line_iter: for oXML_dup in line_iter:
cDt, cHr = getdateUTC(tagtext(oNode=oXML_dup, cTag='dVenc'))
cDt, cHr = getdateByTimezone(tagtext(oNode=oXML_dup, cTag='dVenc'),
timezone)
self.string(self.nLeft + nCol + 1, self.nlin + nLin, self.string(self.nLeft + nCol + 1, self.nlin + nLin,
tagtext(oNode=oXML_dup, cTag='nDup')) tagtext(oNode=oXML_dup, cTag='nDup'))
self.string(self.nLeft + nCol + 17, self.nlin + nLin, cDt) self.string(self.nLeft + nCol + 17, self.nlin + nLin, cDt)
@ -522,6 +578,8 @@ obsCont[@xCampo='NomeVendedor']")
def transportes(self, oXML=None): def transportes(self, oXML=None):
el_transp = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}transp") el_transp = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}transp")
veic_transp = oXML.find(
".//{http://www.portalfiscal.inf.br/nfe}veicTransp")
nMr = self.width - self.nRight nMr = self.width - self.nRight
self.canvas.setFont('NimbusSanL-Bold', 7) self.canvas.setFont('NimbusSanL-Bold', 7)
@ -532,25 +590,26 @@ obsCont[@xCampo='NomeVendedor']")
self.width - self.nLeft - self.nRight, 20) self.width - self.nLeft - self.nRight, 20)
self.hline(self.nLeft, self.nlin + 8.6, self.width - self.nLeft) self.hline(self.nLeft, self.nlin + 8.6, self.width - self.nLeft)
self.hline(self.nLeft, self.nlin + 15.2, self.width - self.nLeft) self.hline(self.nLeft, self.nlin + 15.2, self.width - self.nLeft)
self.vline(nMr - 40, self.nlin + 2, 13.2)
self.vline(nMr - 49, self.nlin + 2, 20)
self.vline(nMr - 92, self.nlin + 2, 6.6)
self.vline(nMr - 120, self.nlin + 2, 6.6)
self.vline(nMr - 75, self.nlin + 2, 6.6)
self.vline(nMr - 26, self.nlin + 2, 13.2)
self.vline(nMr - 33, self.nlin + 2, 13.2)
self.vline(nMr - 67, self.nlin + 2, 6.6)
self.vline(nMr - 123, self.nlin + 2, 6.6)
self.vline(nMr - 53, self.nlin + 2, 6.6)
self.vline(nMr - 26, self.nlin + 15.2, 6.6) self.vline(nMr - 26, self.nlin + 15.2, 6.6)
self.vline(nMr - 49, self.nlin + 15.2, 6.6)
self.vline(nMr - 102, self.nlin + 8.6, 6.6) self.vline(nMr - 102, self.nlin + 8.6, 6.6)
self.vline(nMr - 85, self.nlin + 15.2, 6.6) self.vline(nMr - 85, self.nlin + 15.2, 6.6)
self.vline(nMr - 121, self.nlin + 15.2, 6.6) self.vline(nMr - 121, self.nlin + 15.2, 6.6)
self.vline(nMr - 160, self.nlin + 15.2, 6.6) self.vline(nMr - 160, self.nlin + 15.2, 6.6)
# Labels/Fields # Labels/Fields
self.string(nMr - 39, self.nlin + 3.8, 'CNPJ/CPF')
self.string(nMr - 74, self.nlin + 3.8, 'PLACA DO VEÍCULO')
self.string(nMr - 91, self.nlin + 3.8, 'CÓDIGO ANTT')
self.string(nMr - 119, self.nlin + 3.8, 'FRETE POR CONTA')
self.string(nMr - 25, self.nlin + 3.8, 'CNPJ/CPF')
self.string(nMr - 52, self.nlin + 3.8, 'PLACA DO VEÍCULO')
self.string(nMr - 66, self.nlin + 3.8, 'CÓDIGO ANTT')
self.string(nMr - 122, self.nlin + 3.8, 'FRETE POR CONTA')
self.string(self.nLeft + 1, self.nlin + 3.8, 'RAZÃO SOCIAL') self.string(self.nLeft + 1, self.nlin + 3.8, 'RAZÃO SOCIAL')
self.string(nMr - 48, self.nlin + 3.8, 'UF')
self.string(nMr - 39, self.nlin + 10.3, 'INSCRIÇÃO ESTADUAL')
self.string(nMr - 48, self.nlin + 10.3, 'UF')
self.string(nMr - 32, self.nlin + 3.8, 'UF')
self.string(nMr - 25, self.nlin + 10.3, 'INSCRIÇÃO ESTADUAL')
self.string(nMr - 32, self.nlin + 10.3, 'UF')
self.string(nMr - 101, self.nlin + 10.3, 'MUNICÍPIO') self.string(nMr - 101, self.nlin + 10.3, 'MUNICÍPIO')
self.string(self.nLeft + 1, self.nlin + 10.3, 'ENDEREÇO') self.string(self.nLeft + 1, self.nlin + 10.3, 'ENDEREÇO')
self.string(nMr - 48, self.nlin + 17, 'PESO BRUTO') self.string(nMr - 48, self.nlin + 17, 'PESO BRUTO')
@ -560,20 +619,27 @@ obsCont[@xCampo='NomeVendedor']")
self.string(nMr - 159, self.nlin + 17, 'ESPÉCIE') self.string(nMr - 159, self.nlin + 17, 'ESPÉCIE')
self.string(self.nLeft + 1, self.nlin + 17, 'QUANTIDADE') self.string(self.nLeft + 1, self.nlin + 17, 'QUANTIDADE')
# Conteúdo campos # Conteúdo campos
self.canvas.setFont('NimbusSanL-Regu', 8)
self.canvas.setFont('NimbusSanL-Regu', 7)
self.string(self.nLeft + 1, self.nlin + 7.7, self.string(self.nLeft + 1, self.nlin + 7.7,
tagtext(oNode=el_transp, cTag='xNome')[:40])
self.string(self.nLeft + 71, self.nlin + 7.7,
tagtext(oNode=el_transp, cTag='xNome')[:42])
self.string(self.nLeft + 68, self.nlin + 7.7,
self.oFrete[tagtext(oNode=el_transp, cTag='modFrete')]) self.oFrete[tagtext(oNode=el_transp, cTag='modFrete')])
self.string(nMr - 39, self.nlin + 7.7,
self.string(self.nLeft + 122, self.nlin + 7.7,
tagtext(oNode=el_transp, cTag='RNTC'))
self.string(self.nLeft + 136, self.nlin + 7.7,
tagtext(oNode=el_transp, cTag='placa'))
self.string(self.nLeft + 157, self.nlin + 7.7,
tagtext(oNode=veic_transp, cTag='UF'))
self.string(nMr - 25, self.nlin + 7.7,
format_cnpj_cpf(tagtext(oNode=el_transp, cTag='CNPJ'))) format_cnpj_cpf(tagtext(oNode=el_transp, cTag='CNPJ')))
self.canvas.setFont('NimbusSanL-Regu', 8)
self.string(self.nLeft + 1, self.nlin + 14.2, self.string(self.nLeft + 1, self.nlin + 14.2,
tagtext(oNode=el_transp, cTag='xEnder')[:45]) tagtext(oNode=el_transp, cTag='xEnder')[:45])
self.string(self.nLeft + 89, self.nlin + 14.2, self.string(self.nLeft + 89, self.nlin + 14.2,
tagtext(oNode=el_transp, cTag='xMun')) tagtext(oNode=el_transp, cTag='xMun'))
self.string(nMr - 48, self.nlin + 14.2,
self.string(nMr - 32, self.nlin + 14.2,
tagtext(oNode=el_transp, cTag='UF')) tagtext(oNode=el_transp, cTag='UF'))
self.string(nMr - 39, self.nlin + 14.2,
self.string(nMr - 25, self.nlin + 14.2,
tagtext(oNode=el_transp, cTag='IE')) tagtext(oNode=el_transp, cTag='IE'))
self.string(self.nLeft + 1, self.nlin + 21.2, self.string(self.nLeft + 1, self.nlin + 21.2,
tagtext(oNode=el_transp, cTag='qVol')) tagtext(oNode=el_transp, cTag='qVol'))
@ -717,10 +783,11 @@ obsCont[@xCampo='NomeVendedor']")
self.canvas.setFont('NimbusSanL-Regu', 5) self.canvas.setFont('NimbusSanL-Regu', 5)
self.string(self.nLeft + 1, self.nlin + 4, self.string(self.nLeft + 1, self.nlin + 4,
'INFORMAÇÕES COMPLEMENTARES') 'INFORMAÇÕES COMPLEMENTARES')
self.string((self.width / 2) + 1, self.nlin + 4, 'RESERVADO AO FISCO')
self.string(
((self.width / 3)*2) + 1, self.nlin + 4, 'RESERVADO AO FISCO')
self.rect(self.nLeft, self.nlin + 2, self.rect(self.nLeft, self.nlin + 2,
self.width - self.nLeft - self.nRight, 42) self.width - self.nLeft - self.nRight, 42)
self.vline(self.width / 2, self.nlin + 2, 42)
self.vline((self.width / 3)*2, self.nlin + 2, 42)
# Conteúdo campos # Conteúdo campos
styles = getSampleStyleSheet() styles = getSampleStyleSheet()
styleN = styles['Normal'] styleN = styles['Normal']
@ -732,12 +799,12 @@ obsCont[@xCampo='NomeVendedor']")
if fisco: if fisco:
observacoes = fisco + ' ' + observacoes observacoes = fisco + ' ' + observacoes
P = Paragraph(observacoes, styles['Normal']) P = Paragraph(observacoes, styles['Normal'])
w, h = P.wrap(92 * mm, 32 * mm)
w, h = P.wrap(128 * mm, 32 * mm)
altura = (self.height - self.nlin - 5) * mm altura = (self.height - self.nlin - 5) * mm
P.drawOn(self.canvas, (self.nLeft + 1) * mm, altura - h) P.drawOn(self.canvas, (self.nLeft + 1) * mm, altura - h)
self.nlin += 36 self.nlin += 36
def recibo_entrega(self, oXML=None):
def recibo_entrega(self, oXML=None, timezone=None):
el_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide") el_ide = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}ide")
el_dest = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}dest") el_dest = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}dest")
el_total = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}total") el_total = oXML.find(".//{http://www.portalfiscal.inf.br/nfe}total")
@ -769,7 +836,8 @@ obsCont[@xCampo='NomeVendedor']")
self.string(self.width - self.nRight - nW + 2, self.nlin + 14, self.string(self.width - self.nRight - nW + 2, self.nlin + 14,
u"SÉRIE %s" % (tagtext(oNode=el_ide, cTag='serie'))) u"SÉRIE %s" % (tagtext(oNode=el_ide, cTag='serie')))
cDt, cHr = getdateUTC(tagtext(oNode=el_ide, cTag='dhEmi'))
cDt, cHr = getdateByTimezone(
tagtext(oNode=el_ide, cTag='dhEmi'), timezone)
cTotal = format_number(tagtext(oNode=el_total, cTag='vNF')) cTotal = format_number(tagtext(oNode=el_total, cTag='vNF'))
cEnd = tagtext(oNode=el_dest, cTag='xNome') + ' - ' cEnd = tagtext(oNode=el_dest, cTag='xNome') + ' - '
@ -836,7 +904,7 @@ obsCont[@xCampo='NomeVendedor']")
self.oPDF_IO.close() self.oPDF_IO.close()
fileObj.write(pdf_out) fileObj.write(pdf_out)
def _generate_cce(self, cce_xml=None, oXML=None):
def _generate_cce(self, cce_xml=None, oXML=None, timezone=None):
self.canvas.setLineWidth(.2) self.canvas.setLineWidth(.2)
# labels # labels
@ -875,8 +943,8 @@ obsCont[@xCampo='NomeVendedor']")
self.string(82, 24, cnpj) self.string(82, 24, cnpj)
chave_acesso = tagtext(oNode=elem_infNFe, cTag='chNFe') chave_acesso = tagtext(oNode=elem_infNFe, cTag='chNFe')
self.string(82, 30, chave_acesso) self.string(82, 30, chave_acesso)
data_correcao = getdateUTC(tagtext(
oNode=elem_infNFe, cTag='dhEvento'))
data_correcao = getdateByTimezone(tagtext(
oNode=elem_infNFe, cTag='dhEvento'), timezone)
data_correcao = data_correcao[0] + " " + data_correcao[1] data_correcao = data_correcao[0] + " " + data_correcao[1]
self.string(82, 36, data_correcao) self.string(82, 36, data_correcao)
cce_id = elem_infNFe.values()[0] cce_id = elem_infNFe.values()[0]

12
pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml

@ -1,8 +1,4 @@
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<nfeDistDFeInteresse xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NFeDistribuicaoDFe">
<nfeDadosMsg>
<distDFeInt xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
<distDFeInt xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
<tpAmb>{{ ambiente }}</tpAmb> <tpAmb>{{ ambiente }}</tpAmb>
<cUFAutor>{{ estado }}</cUFAutor> <cUFAutor>{{ estado }}</cUFAutor>
<CNPJ>{{ cnpj_cpf }}</CNPJ> <CNPJ>{{ cnpj_cpf }}</CNPJ>
@ -12,8 +8,4 @@
<consChNFe> <consChNFe>
<chNFe>{{ chave_nfe }}</chNFe> <chNFe>{{ chave_nfe }}</chNFe>
</consChNFe> </consChNFe>
</distDFeInt>
</nfeDadosMsg>
</nfeDistDFeInteresse>
</Body>
</Envelope>
</distDFeInt>

91
pytrustnfe/nfe/templates/NfeAutorizacao.xml

@ -1,15 +1,14 @@
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="4.00">
<idLote>{{ idLote }}</idLote> <idLote>{{ idLote }}</idLote>
<indSinc>{{ indSinc }}</indSinc> <indSinc>{{ indSinc }}</indSinc>
{% for NFe in NFes %} {% for NFe in NFes %}
<NFe xmlns="http://www.portalfiscal.inf.br/nfe"> <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe versao="3.10" Id="{{ NFe.infNFe.Id }}">
<infNFe versao="4.00" Id="{{ NFe.infNFe.Id }}">
<ide> <ide>
{% with ide = NFe.infNFe.ide %} {% with ide = NFe.infNFe.ide %}
<cUF>{{ ide.cUF }}</cUF> <cUF>{{ ide.cUF }}</cUF>
<cNF>{{ ide.cNF }}</cNF> <cNF>{{ ide.cNF }}</cNF>
<natOp>{{ ide.natOp }}</natOp> <natOp>{{ ide.natOp }}</natOp>
<indPag>{{ ide.indPag }}</indPag>
<mod>{{ ide.mod }}</mod> <mod>{{ ide.mod }}</mod>
<serie>{{ ide.serie }}</serie> <serie>{{ ide.serie }}</serie>
<nNF>{{ ide.nNF }}</nNF> <nNF>{{ ide.nNF }}</nNF>
@ -182,6 +181,9 @@
<NCM>{{ prod.NCM }}</NCM> <NCM>{{ prod.NCM }}</NCM>
<NVE>{{ prod.NVE }}</NVE> <NVE>{{ prod.NVE }}</NVE>
<CEST>{{ prod.CEST }}</CEST> <CEST>{{ prod.CEST }}</CEST>
<indEscala>{{ prod.indEscala }}</indEscala>
<CNPJFab>{{ prod.CNPJFab }}</CNPJFab>
<cBenef>{{ prod.cBenef }}</cBenef>
<EXTIPI>{{ prod.EXTIPI }}</EXTIPI> <EXTIPI>{{ prod.EXTIPI }}</EXTIPI>
<CFOP>{{ prod.CFOP }}</CFOP> <CFOP>{{ prod.CFOP }}</CFOP>
<uCom>{{ prod.uCom }}</uCom> <uCom>{{ prod.uCom }}</uCom>
@ -244,6 +246,21 @@
<xPed>{{ prod.xPed }}</xPed> <xPed>{{ prod.xPed }}</xPed>
<nItemPed>{{ prod.nItemPed }}</nItemPed> <nItemPed>{{ prod.nItemPed }}</nItemPed>
<nFCI>{{ prod.nFCI }}</nFCI> <nFCI>{{ prod.nFCI }}</nFCI>
{% for rastro in prod.rastro %}
<rastro>
<nLote>{{ rastro.nLote }}</nLote>
<qLote>{{ rastro.qLote }}</qLote>
<dFab>{{ rastro.dFab }}</dFab>
<dVal>{{ rastro.dVal }}</dVal>
<cAgreg>{{ rastro.cAgreg }}</cAgreg>
</rastro>
{% endfor %}
{% for med in prod.med %}
<med>
<cProdANVISA>{{ med.cProdANVISA }}</cProdANVISA>
<vPMC>{{ med.vPMC }}</vPMC>
</med>
{% endfor %}
{% endwith %} {% endwith %}
</prod> </prod>
<imposto> <imposto>
@ -258,6 +275,8 @@
<vBC>{{ imposto.ICMS.vBC }}</vBC> <vBC>{{ imposto.ICMS.vBC }}</vBC>
<pICMS>{{ imposto.ICMS.pICMS }}</pICMS> <pICMS>{{ imposto.ICMS.pICMS }}</pICMS>
<vICMS>{{ imposto.ICMS.vICMS }}</vICMS> <vICMS>{{ imposto.ICMS.vICMS }}</vICMS>
<pFCP>{{ imposto.ICMS.pFCP }}</pFCP>
<vFCP>{{ imposto.ICMS.vFCP }}</vFCP>
</ICMS00> </ICMS00>
{% endif %} {% endif %}
{% if imposto.ICMS.CST == '10' -%} {% if imposto.ICMS.CST == '10' -%}
@ -268,12 +287,18 @@
<vBC>{{ imposto.ICMS.vBC }}</vBC> <vBC>{{ imposto.ICMS.vBC }}</vBC>
<pICMS>{{ imposto.ICMS.pICMS }}</pICMS> <pICMS>{{ imposto.ICMS.pICMS }}</pICMS>
<vICMS>{{ imposto.ICMS.vICMS }}</vICMS> <vICMS>{{ imposto.ICMS.vICMS }}</vICMS>
<vBCFCP>{{ imposto.ICMS.vBCFCP }}</vBCFCP>
<pFCP>{{ imposto.ICMS.pFCP }}</pFCP>
<vFCP>{{ imposto.ICMS.vFCP }}</vFCP>
<modBCST>{{ imposto.ICMS.modBCST }}</modBCST> <modBCST>{{ imposto.ICMS.modBCST }}</modBCST>
<pMVAST>{{ imposto.ICMS.pMVAST }}</pMVAST> <pMVAST>{{ imposto.ICMS.pMVAST }}</pMVAST>
<pRedBCST>{{ imposto.ICMS.pRedBCST }}</pRedBCST> <pRedBCST>{{ imposto.ICMS.pRedBCST }}</pRedBCST>
<vBCST>{{ imposto.ICMS.vBCST }}</vBCST> <vBCST>{{ imposto.ICMS.vBCST }}</vBCST>
<pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST> <pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST>
<vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST> <vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST>
<vBCFCPST>{{ imposto.ICMS.vBCFCPST }}</vBCFCPST>
<pFCPST>{{ imposto.ICMS.pFCPST }}</pFCPST>
<vFCPST>{{ imposto.ICMS.vFCPST }}</vFCPST>
</ICMS10> </ICMS10>
{% endif %} {% endif %}
{% if imposto.ICMS.CST == '20' -%} {% if imposto.ICMS.CST == '20' -%}
@ -285,6 +310,9 @@
<vBC>{{ imposto.ICMS.vBC }}</vBC> <vBC>{{ imposto.ICMS.vBC }}</vBC>
<pICMS>{{ imposto.ICMS.pICMS }}</pICMS> <pICMS>{{ imposto.ICMS.pICMS }}</pICMS>
<vICMS>{{ imposto.ICMS.vICMS }}</vICMS> <vICMS>{{ imposto.ICMS.vICMS }}</vICMS>
<vBCFCP>{{ imposto.ICMS.vBCFCP }}</vBCFCP>
<pFCP>{{ imposto.ICMS.pFCP }}</pFCP>
<vFCP>{{ imposto.ICMS.vFCP }}</vFCP>
<vICMSDeson>{{ imposto.ICMS.vICMSDeson }}</vICMSDeson> <vICMSDeson>{{ imposto.ICMS.vICMSDeson }}</vICMSDeson>
<motDesICMS>{{ imposto.ICMS.motDesICMS }}</motDesICMS> <motDesICMS>{{ imposto.ICMS.motDesICMS }}</motDesICMS>
</ICMS20> </ICMS20>
@ -299,6 +327,9 @@
<vBCST>{{ imposto.ICMS.vBCST }}</vBCST> <vBCST>{{ imposto.ICMS.vBCST }}</vBCST>
<pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST> <pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST>
<vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST> <vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST>
<vBCFCPST>{{ imposto.ICMS.vBCFCPST }}</vBCFCPST>
<pFCPST>{{ imposto.ICMS.pFCPST }}</pFCPST>
<vFCPST>{{ imposto.ICMS.vFCPST }}</vFCPST>
<vICMSDeson>{{ imposto.ICMS.vICMSDeson }}</vICMSDeson> <vICMSDeson>{{ imposto.ICMS.vICMSDeson }}</vICMSDeson>
<motDesICMS>{{ imposto.ICMS.motDesICMS }}</motDesICMS> <motDesICMS>{{ imposto.ICMS.motDesICMS }}</motDesICMS>
</ICMS30> </ICMS30>
@ -323,6 +354,9 @@
<pDif>{{ imposto.ICMS.pDif }}</pDif> <pDif>{{ imposto.ICMS.pDif }}</pDif>
<vICMSDif>{{ imposto.ICMS.vICMSDif }}</vICMSDif> <vICMSDif>{{ imposto.ICMS.vICMSDif }}</vICMSDif>
<vICMS>{{ imposto.ICMS.vICMS }}</vICMS> <vICMS>{{ imposto.ICMS.vICMS }}</vICMS>
<vBCFCP>{{ imposto.ICMS.vBCFCP }}</vBCFCP>
<pFCP>{{ imposto.ICMS.pFCP }}</pFCP>
<vFCP>{{ imposto.ICMS.vFCP }}</vFCP>
</ICMS51> </ICMS51>
{% endif %} {% endif %}
{% if imposto.ICMS.CST == '60' -%} {% if imposto.ICMS.CST == '60' -%}
@ -330,7 +364,11 @@
<orig>{{ imposto.ICMS.orig }}</orig> <orig>{{ imposto.ICMS.orig }}</orig>
<CST>{{ imposto.ICMS.CST }}</CST> <CST>{{ imposto.ICMS.CST }}</CST>
<vBCSTRet>{{ imposto.ICMS.vBCSTRet }}</vBCSTRet> <vBCSTRet>{{ imposto.ICMS.vBCSTRet }}</vBCSTRet>
<pST>{{ imposto.ICMS.pST }}</pST>
<vICMSSTRet>{{ imposto.ICMS.vICMSSTRet }}</vICMSSTRet> <vICMSSTRet>{{ imposto.ICMS.vICMSSTRet }}</vICMSSTRet>
<vBCFCPSTRet>{{ imposto.ICMS.vBCFCPSTRet }}</vBCFCPSTRet>
<pFCPSTRet>{{ imposto.ICMS.pFCPSTRet }}</pFCPSTRet>
<vFCPSTRet>{{ imposto.ICMS.vFCPSTRet }}</vFCPSTRet>
</ICMS60> </ICMS60>
{% endif %} {% endif %}
{% if imposto.ICMS.CST == '70' -%} {% if imposto.ICMS.CST == '70' -%}
@ -342,12 +380,18 @@
<vBC>{{ imposto.ICMS.vBC }}</vBC> <vBC>{{ imposto.ICMS.vBC }}</vBC>
<pICMS>{{ imposto.ICMS.pICMS }}</pICMS> <pICMS>{{ imposto.ICMS.pICMS }}</pICMS>
<vICMS>{{ imposto.ICMS.vICMS }}</vICMS> <vICMS>{{ imposto.ICMS.vICMS }}</vICMS>
<vBCFCP>{{ imposto.ICMS.vBCFCP }}</vBCFCP>
<pFCP>{{ imposto.ICMS.pFCP }}</pFCP>
<vFCP>{{ imposto.ICMS.vFCP }}</vFCP>
<modBCST>{{ imposto.ICMS.modBCST }}</modBCST> <modBCST>{{ imposto.ICMS.modBCST }}</modBCST>
<pMVAST>{{ imposto.ICMS.pMVAST }}</pMVAST> <pMVAST>{{ imposto.ICMS.pMVAST }}</pMVAST>
<pRedBCST>{{ imposto.ICMS.pRedBCST }}</pRedBCST> <pRedBCST>{{ imposto.ICMS.pRedBCST }}</pRedBCST>
<vBCST>{{ imposto.ICMS.vBCST }}</vBCST> <vBCST>{{ imposto.ICMS.vBCST }}</vBCST>
<pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST> <pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST>
<vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST> <vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST>
<vBCFCPST>{{ imposto.ICMS.vBCFCPST }}</vBCFCPST>
<pFCPST>{{ imposto.ICMS.pFCPST }}</pFCPST>
<vFCPST>{{ imposto.ICMS.vFCPST }}</vFCPST>
<vICMSDeson>{{ imposto.ICMS.vICMSDeson }}</vICMSDeson> <vICMSDeson>{{ imposto.ICMS.vICMSDeson }}</vICMSDeson>
<motDesICMS>{{ imposto.ICMS.motDesICMS }}</motDesICMS> <motDesICMS>{{ imposto.ICMS.motDesICMS }}</motDesICMS>
</ICMS70> </ICMS70>
@ -361,12 +405,18 @@
<pRedBC>{{ imposto.ICMS.pRedBC }}</pRedBC> <pRedBC>{{ imposto.ICMS.pRedBC }}</pRedBC>
<pICMS>{{ imposto.ICMS.pICMS }}</pICMS> <pICMS>{{ imposto.ICMS.pICMS }}</pICMS>
<vICMS>{{ imposto.ICMS.vICMS }}</vICMS> <vICMS>{{ imposto.ICMS.vICMS }}</vICMS>
<vBCFCP>{{ imposto.ICMS.vBCFCP }}</vBCFCP>
<pFCP>{{ imposto.ICMS.pFCP }}</pFCP>
<vFCP>{{ imposto.ICMS.pFCP }}</vFCP>
<modBCST>{{ imposto.ICMS.modBCST }}</modBCST> <modBCST>{{ imposto.ICMS.modBCST }}</modBCST>
<pMVAST>{{ imposto.ICMS.pMVAST }}</pMVAST> <pMVAST>{{ imposto.ICMS.pMVAST }}</pMVAST>
<pRedBCST>{{ imposto.ICMS.pRedBCST }}</pRedBCST> <pRedBCST>{{ imposto.ICMS.pRedBCST }}</pRedBCST>
<vBCST>{{ imposto.ICMS.vBCST }}</vBCST> <vBCST>{{ imposto.ICMS.vBCST }}</vBCST>
<pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST> <pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST>
<vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST> <vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST>
<vBCFCPST>{{ imposto.ICMS.vBCFCPST }}</vBCFCPST>
<pFCPST>{{ imposto.ICMS.pFCPST }}</pFCPST>
<vFCPST>{{ imposto.ICMS.vFCPST }}</vFCPST>
<vICMSDeson>{{ imposto.ICMS.vICMSDeson }}</vICMSDeson> <vICMSDeson>{{ imposto.ICMS.vICMSDeson }}</vICMSDeson>
<motDesICMS>{{ imposto.ICMS.motDesICMS }}</motDesICMS> <motDesICMS>{{ imposto.ICMS.motDesICMS }}</motDesICMS>
</ICMS90> </ICMS90>
@ -380,12 +430,10 @@
<pRedBC>{{ imposto.ICMSPart.pRedBC }}</pRedBC> <pRedBC>{{ imposto.ICMSPart.pRedBC }}</pRedBC>
<pICMS>{{ imposto.ICMSPart.pICMS }}</pICMS> <pICMS>{{ imposto.ICMSPart.pICMS }}</pICMS>
<vICMS>{{ imposto.ICMSPart.vICMS }}</vICMS> <vICMS>{{ imposto.ICMSPart.vICMS }}</vICMS>
<vBCST>{{ imposto.ICMS.vBCST }}</vBCST>
<modBCST>{{ imposto.ICMSPart.modBCST }}</modBCST> <modBCST>{{ imposto.ICMSPart.modBCST }}</modBCST>
<pMVAST>{{ imposto.ICMSPart.pMVAST }}</pMVAST> <pMVAST>{{ imposto.ICMSPart.pMVAST }}</pMVAST>
<pRedBCST>{{ imposto.ICMSPart.pRedBCST }}</pRedBCST> <pRedBCST>{{ imposto.ICMSPart.pRedBCST }}</pRedBCST>
<vBCST>{{ imposto.ICMSPart.vBCST }}</vBCST>
<pICMSST>{{ imposto.ICMSPart.pICMSST }}</pICMSST>
<vICMSST>{{ imposto.ICMSPart.vICMSST }}</vICMSST>
<pBCOp>{{ imposto.ICMSPart.pBCOp }}</pBCOp> <pBCOp>{{ imposto.ICMSPart.pBCOp }}</pBCOp>
<UFST>{{ imposto.ICMSPart.UFST }}</UFST> <UFST>{{ imposto.ICMSPart.UFST }}</UFST>
</ICMSPart> </ICMSPart>
@ -424,6 +472,9 @@
<vBCST>{{ imposto.ICMS.vBCST }}</vBCST> <vBCST>{{ imposto.ICMS.vBCST }}</vBCST>
<pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST> <pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST>
<vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST> <vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST>
<vBCFCPST>{{ imposto.ICMS.vBCFCPST }}</vBCFCPST>
<pFCPST>{{ imposto.ICMS.pFCPST }}</pFCPST>
<vFCPST>{{ imposto.ICMS.vFCPST }}</vFCPST>
<pCredSN>{{ imposto.ICMS.pCredSN }}</pCredSN> <pCredSN>{{ imposto.ICMS.pCredSN }}</pCredSN>
<vCredICMSSN>{{ imposto.ICMS.vCredICMSSN }}</vCredICMSSN> <vCredICMSSN>{{ imposto.ICMS.vCredICMSSN }}</vCredICMSSN>
</ICMSSN201> </ICMSSN201>
@ -438,6 +489,9 @@
<vBCST>{{ imposto.ICMS.vBCST }}</vBCST> <vBCST>{{ imposto.ICMS.vBCST }}</vBCST>
<pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST> <pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST>
<vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST> <vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST>
<vBCFCPST>{{ imposto.ICMS.vBCFCPST }}</vBCFCPST>
<pFCPST>{{ imposto.ICMS.pFCPST }}</pFCPST>
<vFCPST>{{ imposto.ICMS.vFCPST }}</vFCPST>
</ICMSSN202> </ICMSSN202>
{% endif %} {% endif %}
{% if imposto.ICMS.CST == '500' -%} {% if imposto.ICMS.CST == '500' -%}
@ -445,7 +499,11 @@
<orig>{{ imposto.ICMS.orig }}</orig> <orig>{{ imposto.ICMS.orig }}</orig>
<CSOSN>{{ imposto.ICMS.CST }}</CSOSN> <CSOSN>{{ imposto.ICMS.CST }}</CSOSN>
<vBCSTRet>{{ imposto.ICMS.vBCSTRet }}</vBCSTRet> <vBCSTRet>{{ imposto.ICMS.vBCSTRet }}</vBCSTRet>
<pST>{{ imposto.ICMS.pST }}</pST>
<vICMSSTRet>{{ imposto.ICMS.vICMSSTRet }}</vICMSSTRet> <vICMSSTRet>{{ imposto.ICMS.vICMSSTRet }}</vICMSSTRet>
<vBCFCPSTRet>{{ imposto.ICMS.vBCFCPSTRet }}</vBCFCPSTRet>
<pFCPSTRet>{{ imposto.ICMS.pFCPSTRet }}</pFCPSTRet>
<pFCPSTRet>{{ imposto.ICMS.pFCPSTRet }}</pFCPSTRet>
</ICMSSN500> </ICMSSN500>
{% endif %} {% endif %}
{% if imposto.ICMS.CST == '900' -%} {% if imposto.ICMS.CST == '900' -%}
@ -463,6 +521,9 @@
<vBCST>{{ imposto.ICMS.vBCST }}</vBCST> <vBCST>{{ imposto.ICMS.vBCST }}</vBCST>
<pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST> <pICMSST>{{ imposto.ICMS.pICMSST }}</pICMSST>
<vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST> <vICMSST>{{ imposto.ICMS.vICMSST }}</vICMSST>
<vBCFCPST>{{ imposto.ICMS.vBCFCPST }}</vBCFCPST>
<pFCPST>{{ imposto.ICMS.pFCPST }}</pFCPST>
<vFCPST>{{ imposto.ICMS.vFCPST }}</vFCPST>
<pCredSN>{{ imposto.ICMS.pCredSN }}</pCredSN> <pCredSN>{{ imposto.ICMS.pCredSN }}</pCredSN>
<vCredICMSSN>{{ imposto.ICMS.vCredICMSSN }}</vCredICMSSN> <vCredICMSSN>{{ imposto.ICMS.vCredICMSSN }}</vCredICMSSN>
</ICMSSN900> </ICMSSN900>
@ -491,7 +552,6 @@
</IPINT> </IPINT>
{% endif %} {% endif %}
</IPI> </IPI>
{% endif %}
{% if imposto.II is defined %} {% if imposto.II is defined %}
<II> <II>
<vBC>{{ imposto.II.vBC }}</vBC> <vBC>{{ imposto.II.vBC }}</vBC>
@ -500,6 +560,7 @@
<vIOF>{{ imposto.II.vIOF }}</vIOF> <vIOF>{{ imposto.II.vIOF }}</vIOF>
</II> </II>
{% endif %} {% endif %}
{% endif %}
<PIS> <PIS>
{% if imposto.PIS.CST in ('01', '02') %} {% if imposto.PIS.CST in ('01', '02') %}
<PISAliq> <PISAliq>
@ -607,8 +668,9 @@
{% if imposto.ICMSUFDest is defined %} {% if imposto.ICMSUFDest is defined %}
<ICMSUFDest> <ICMSUFDest>
<vBCUFDest>{{ imposto.ICMSUFDest.vBCUFDest }}</vBCUFDest> <vBCUFDest>{{ imposto.ICMSUFDest.vBCUFDest }}</vBCUFDest>
<vBCFCPUFDest>{{ imposto.ICMSUFDest.vBCFCPUFDest }}</vBCFCPUFDest>
<pFCPUFDest>{{ imposto.ICMSUFDest.pFCPUFDest }}</pFCPUFDest> <pFCPUFDest>{{ imposto.ICMSUFDest.pFCPUFDest }}</pFCPUFDest>
<pICMSUFDest>{{ imposto.ICMSUFDest.pICMSInter }}</pICMSUFDest>
<pICMSUFDest>{{ imposto.ICMSUFDest.pICMSUFDest }}</pICMSUFDest>
<pICMSInter>{{ imposto.ICMSUFDest.pICMSInter }}</pICMSInter> <pICMSInter>{{ imposto.ICMSUFDest.pICMSInter }}</pICMSInter>
<pICMSInterPart>{{ imposto.ICMSUFDest.pICMSInterPart }}</pICMSInterPart> <pICMSInterPart>{{ imposto.ICMSUFDest.pICMSInterPart }}</pICMSInterPart>
<vFCPUFDest>{{ imposto.ICMSUFDest.vFCPUFDest }}</vFCPUFDest> <vFCPUFDest>{{ imposto.ICMSUFDest.vFCPUFDest }}</vFCPUFDest>
@ -639,14 +701,18 @@
<vFCPUFDest>{{ total.vFCPUFDest }}</vFCPUFDest> <vFCPUFDest>{{ total.vFCPUFDest }}</vFCPUFDest>
<vICMSUFDest>{{ total.vICMSUFDest }}</vICMSUFDest> <vICMSUFDest>{{ total.vICMSUFDest }}</vICMSUFDest>
<vICMSUFRemet>{{ total.vICMSUFRemet }}</vICMSUFRemet> <vICMSUFRemet>{{ total.vICMSUFRemet }}</vICMSUFRemet>
<vFCP>{{ total.vFCP }}</vFCP>
<vBCST>{{ total.vBCST }}</vBCST> <vBCST>{{ total.vBCST }}</vBCST>
<vST>{{ total.vST }}</vST> <vST>{{ total.vST }}</vST>
<vFCPST>{{ total.vFCPST }}</vFCPST>
<vFCPSTRet>{{ total.vFCPSTRet }}</vFCPSTRet>
<vProd>{{ total.vProd }}</vProd> <vProd>{{ total.vProd }}</vProd>
<vFrete>{{ total.vFrete }}</vFrete> <vFrete>{{ total.vFrete }}</vFrete>
<vSeg>{{ total.vSeg }}</vSeg> <vSeg>{{ total.vSeg }}</vSeg>
<vDesc>{{ total.vDesc }}</vDesc> <vDesc>{{ total.vDesc }}</vDesc>
<vII>{{ total.vII }}</vII> <vII>{{ total.vII }}</vII>
<vIPI>{{ total.vIPI }}</vIPI> <vIPI>{{ total.vIPI }}</vIPI>
<vIPIDevol>{{ total.vIPIDevol }}</vIPIDevol>
<vPIS>{{ total.vPIS }}</vPIS> <vPIS>{{ total.vPIS }}</vPIS>
<vCOFINS>{{ total.vCOFINS }}</vCOFINS> <vCOFINS>{{ total.vCOFINS }}</vCOFINS>
<vOutro>{{ total.vOutro }}</vOutro> <vOutro>{{ total.vOutro }}</vOutro>
@ -750,19 +816,24 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if NFe.infNFe.pag is defined %} {% if NFe.infNFe.pag is defined %}
{% for pag in NFe.infNFe.pag %}
<pag> <pag>
{% for pag in NFe.infNFe.pag %}
<detPag>
<indPag>{{ pag.indPag }}</indPag>
<tPag>{{ pag.tPag }}</tPag> <tPag>{{ pag.tPag }}</tPag>
<vPag>{{ pag.vPag }}</vPag> <vPag>{{ pag.vPag }}</vPag>
{% if pag.card is defined %} {% if pag.card is defined %}
<card> <card>
<tpIntegra>{{ pag.card.tpIntegra }}</tpIntegra>
<CNPJ>{{ pag.card.CNPJ }}</CNPJ> <CNPJ>{{ pag.card.CNPJ }}</CNPJ>
<tBand>{{ pag.card.tBand }}</tBand> <tBand>{{ pag.card.tBand }}</tBand>
<cAut>{{ pag.card.cAut }}</cAut> <cAut>{{ pag.card.cAut }}</cAut>
</card> </card>
{% endif %} {% endif %}
</pag>
<vTroco>{{ pag.vTroco }}</vTroco>
</detPag>
{% endfor %} {% endfor %}
</pag>
{% endif %} {% endif %}
<infAdic> <infAdic>
<infAdFisco>{{ NFe.infNFe.infAdic.infAdFisco|normalize|escape }}</infAdFisco> <infAdFisco>{{ NFe.infNFe.infAdic.infAdFisco|normalize|escape }}</infAdFisco>

5
pytrustnfe/nfe/templates/NfeConsulta2.xml

@ -1,5 +0,0 @@
<consSitNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
<tpAmb>{{ ambiente }}</tpAmb>
<xServ>CONSULTAR</xServ>
<chNFe>{{ chave_nfe }}</chNFe>
</consSitNFe>

5
pytrustnfe/nfe/templates/NfeConsultaProtocolo.xml

@ -0,0 +1,5 @@
<consSitNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="4.00">
<tpAmb>{{ obj.ambiente }}</tpAmb>
<xServ>CONSULTAR</xServ>
<chNFe>{{ obj.chave_nfe }}</chNFe>
</consSitNFe>

2
pytrustnfe/nfe/templates/NfeInutilizacao.xml

@ -1,4 +1,4 @@
<inutNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
<inutNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="4.00">
<infInut Id="{{ obj.id }}"> <infInut Id="{{ obj.id }}">
<tpAmb>{{ obj.ambiente }}</tpAmb> <tpAmb>{{ obj.ambiente }}</tpAmb>
<xServ>INUTILIZAR</xServ> <xServ>INUTILIZAR</xServ>

2
pytrustnfe/nfe/templates/NfeRetAutorizacao.xml

@ -1,4 +1,4 @@
<consReciNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
<consReciNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="4.00">
<tpAmb>{{ obj.ambiente }}</tpAmb> <tpAmb>{{ obj.ambiente }}</tpAmb>
<nRec>{{ obj.numero_recibo }}</nRec> <nRec>{{ obj.numero_recibo }}</nRec>
</consReciNFe> </consReciNFe>

2
pytrustnfe/nfe/templates/NfeStatusServico.xml

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<consStatServ xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
<consStatServ xmlns="http://www.portalfiscal.inf.br/nfe" versao="4.00">
<tpAmb>{{ obj.ambiente }}</tpAmb> <tpAmb>{{ obj.ambiente }}</tpAmb>
<cUF>{{ obj.estado }}</cUF> <cUF>{{ obj.estado }}</cUF>
<xServ>STATUS</xServ> <xServ>STATUS</xServ>

6
pytrustnfe/nfe/templates/RecepcaoEventoCancelamento.xml → pytrustnfe/nfe/templates/RecepcaoEvento.xml

@ -8,13 +8,15 @@
<CNPJ>{{ evento.CNPJ }}</CNPJ> <CNPJ>{{ evento.CNPJ }}</CNPJ>
<chNFe>{{ evento.chNFe }}</chNFe> <chNFe>{{ evento.chNFe }}</chNFe>
<dhEvento>{{ evento.dhEvento }}</dhEvento> <dhEvento>{{ evento.dhEvento }}</dhEvento>
<tpEvento>110111</tpEvento>
<tpEvento>{{ evento.tpEvento }}</tpEvento>
<nSeqEvento>{{ evento.nSeqEvento }}</nSeqEvento> <nSeqEvento>{{ evento.nSeqEvento }}</nSeqEvento>
<verEvento>1.00</verEvento> <verEvento>1.00</verEvento>
<detEvento versao="1.00"> <detEvento versao="1.00">
<descEvento>Cancelamento</descEvento>
<descEvento>{{ evento.descEvento }}</descEvento>
<nProt>{{ evento.nProt }}</nProt> <nProt>{{ evento.nProt }}</nProt>
<xJust>{{ evento.xJust|normalize|escape }}</xJust> <xJust>{{ evento.xJust|normalize|escape }}</xJust>
<xCorrecao>{{ evento.xCorrecao|normalize|escape }}</xCorrecao>
<xCondUso>{{ evento.xCondUso }}</xCondUso>
</detEvento> </detEvento>
</infEvento> </infEvento>
</evento> </evento>

21
pytrustnfe/nfe/templates/RecepcaoEventoCarta.xml

@ -1,21 +0,0 @@
<envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<idLote>{{ idLote }}</idLote>
<evento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<infEvento Id="{{ Id }}">
<cOrgao>{{ cOrgao }}</cOrgao>
<tpAmb>{{ tpAmb }}</tpAmb>
<CNPJ>{{ CNPJ }}</CNPJ>
<CPF>{{ CPF }}</CPF>
<chNFe>{{ chNFe }}</chNFe>
<dhEvento>{{ dhEvento }}</dhEvento>
<tpEvento>{{ tpEvento }}</tpEvento>
<nSeqEvento>{{ nSeqEvento }}</nSeqEvento>
<verEvento>1.00</verEvento>
<detEvento versao="1.00">
<descEvento>Carta de Correção</descEvento>
<xCorrecao>{{ xCorrecao|normalize|escape }}</xCorrecao>
<xCondUso>A Carta de Correção é disciplinada pelo § 1º-A do art. 7º do Convênio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularização de erro ocorrido na emissão de documento fiscal, desde que o erro não esteja relacionado com: I - as variáveis que determinam o valor do imposto tais como: base de cálculo, alíquota, diferença de preço, quantidade, valor da operação ou da prestação; II - a correção de dados cadastrais que implique mudança do remetente ou do destinatário; III - a data de emissão ou de saída.</xCondUso>
</detEvento>
</infEvento>
</evento>
</envEvento>

31
pytrustnfe/nfe/templates/RecepcaoEventoEPEC.xml

@ -1,31 +0,0 @@
<envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<idLote>00106151340701</idLote>
<evento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<infEvento Id="ID1101403514081014278500019055001001061513407959995201">
<cOrgao>91</cOrgao>
<tpAmb>2</tpAmb>
<CNPJ>10142785000190</CNPJ>
<chNFe>35140810142785000190550010010615134079599952</chNFe>
<dhEvento>2014-08-07T04:52:51-03:00</dhEvento>
<tpEvento>110140</tpEvento>
<nSeqEvento>1</nSeqEvento>
<verEvento>1.00</verEvento>
<detEvento versao="1.00">
<descEvento>EPEC</descEvento>
<cOrgaoAutor>35</cOrgaoAutor>
<tpAutor>1</tpAutor>
<verAplic>1.26</verAplic>
<dhEmi>2014-08-07T00:00:00-03:00</dhEmi>
<tpNF>1</tpNF>
<IE>495171423115</IE>
<dest>
<UF>SP</UF>
<CPF>00000000191</CPF>
<vNF>86.00</vNF>
<vICMS>6.02</vICMS>
<vST>0</vST>
</dest>
</detEvento>
</infEvento>
</evento>
</envEvento>

2
pytrustnfe/nfe/templates/RecepcaoEventoManifesto.xml

@ -1,7 +1,7 @@
<envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00"> <envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<idLote>{{ lote }}</idLote> <idLote>{{ lote }}</idLote>
<evento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00"> <evento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
<infEvento Id="{{ manifesto.identificador }}">
<infEvento Id="{{ evento.Id }}">
<cOrgao>91</cOrgao> <cOrgao>91</cOrgao>
<tpAmb>{{ ambiente }}</tpAmb> <tpAmb>{{ ambiente }}</tpAmb>
<CNPJ>{{ manifesto.cnpj_empresa }}</CNPJ> <CNPJ>{{ manifesto.cnpj_empresa }}</CNPJ>

20
pytrustnfe/test/test_comunicacao.py

@ -1,20 +0,0 @@
# coding=utf-8
'''
Created on Jun 16, 2015
@author: danimar
'''
import unittest
import os.path
XML_RETORNO = '<retEnviNFe><cStat>103</cStat>' \
'<cUF>42</cUF></retEnviNFe>'
class test_comunicacao(unittest.TestCase):
caminho = os.path.dirname(__file__)
def test_envio_nfe(self):
pass

19
pytrustnfe/test/test_consulta_cadastro.py

@ -1,19 +0,0 @@
# coding=utf-8
import mock
import os.path
import unittest
from pytrustnfe.certificado import Certificado
from pytrustnfe.nfe import consulta_cadastro
class test_consulta_cadastro(unittest.TestCase):
caminho = os.path.dirname(__file__)
def test_conta_de_cadastro(self):
pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
pfx = Certificado(pfx_source, '123456')
obj = {'cnpj': '12345678901234', 'estado': '42'}
consulta_cadastro(pfx, obj=obj, ambiente=1, estado='42')

286
pytrustnfe/test/test_nfse_paulistana.py

@ -1,143 +1,143 @@
# coding=utf-8
import mock
import os.path
import unittest
from pytrustnfe.certificado import Certificado
from pytrustnfe.nfse.paulistana import envio_lote_rps
from pytrustnfe.nfse.paulistana import cancelamento_nfe
from pytrustnfe.nfse.assinatura import Assinatura
from pytrustnfe.nfse.paulistana import sign_tag
class test_nfse_paulistana(unittest.TestCase):
caminho = os.path.dirname(__file__)
def _get_nfse(self):
rps = [
{
'assinatura': '123',
'serie': '1',
'numero': '1',
'data_emissao': '2016-08-29',
'codigo_atividade': '07498',
'total_servicos': '2.00',
'total_deducoes': '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': 'Floripa',
'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',
'lista_rps': rps
}
return nfse
def test_envio_nfse(self):
pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
pfx = Certificado(pfx_source, '123456')
nfse = self._get_nfse()
path = os.path.join(os.path.dirname(__file__), 'XMLs')
xml_return = open(os.path.join(
path, 'paulistana_resultado.xml'), 'r').read()
with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client') as client:
retorno = mock.MagicMock()
client.return_value = retorno
retorno.service.EnvioLoteRPS.return_value = xml_return
retorno = envio_lote_rps(pfx, nfse=nfse)
self.assertEqual(retorno['received_xml'], xml_return)
self.assertEqual(retorno['object'].Cabecalho.Sucesso, True)
self.assertEqual(
retorno['object'].ChaveNFeRPS.ChaveNFe.NumeroNFe, 446)
self.assertEqual(
retorno['object'].ChaveNFeRPS.ChaveRPS.NumeroRPS, 6)
def test_nfse_signature(self):
pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
pfx = Certificado(pfx_source, '123456')
nfse = self._get_nfse()
path = os.path.join(os.path.dirname(__file__), 'XMLs')
xml_sent = open(os.path.join(
path, 'paulistana_signature.xml'), 'r').read()
with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client') as client:
retorno = mock.MagicMock()
client.return_value = retorno
retorno.service.EnvioLoteRPS.return_value = '<xml></xml>'
retorno = envio_lote_rps(pfx, nfse=nfse)
self.assertEqual(retorno['sent_xml'], xml_sent)
def _get_cancelamento(self):
return {
'cnpj_remetente': '123',
'assinatura': 'assinatura',
'numero_nfse': '456',
'inscricao_municipal': '654',
'codigo_verificacao': '789',
}
def test_cancelamento_nfse_ok(self):
pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
pfx = Certificado(pfx_source, '123456')
cancelamento = self._get_cancelamento()
path = os.path.join(os.path.dirname(__file__), 'XMLs')
xml_return = open(os.path.join(
path, 'paulistana_canc_ok.xml'), 'r').read()
with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client') as client:
retorno = mock.MagicMock()
client.return_value = retorno
retorno.service.CancelamentoNFe.return_value = xml_return
retorno = cancelamento_nfe(pfx, cancelamento=cancelamento)
self.assertEqual(retorno['received_xml'], xml_return)
self.assertEqual(retorno['object'].Cabecalho.Sucesso, True)
def test_cancelamento_nfse_com_erro(self):
pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
pfx = Certificado(pfx_source, '123456')
cancelamento = self._get_cancelamento()
path = os.path.join(os.path.dirname(__file__), 'XMLs')
xml_return = open(os.path.join(
path, 'paulistana_canc_errado.xml'), 'r').read()
with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client') as client:
retorno = mock.MagicMock()
client.return_value = retorno
retorno.service.CancelamentoNFe.return_value = xml_return
retorno = cancelamento_nfe(pfx, cancelamento=cancelamento)
self.assertEqual(retorno['received_xml'], xml_return)
self.assertEqual(retorno['object'].Cabecalho.Sucesso, False)
self.assertEqual(
retorno['object'].Erro.ChaveNFe.NumeroNFe, 446)
# # coding=utf-8
#
# import mock
# import os.path
# import unittest
# from pytrustnfe.certificado import Certificado
# from pytrustnfe.nfse.paulistana import envio_lote_rps
# from pytrustnfe.nfse.paulistana import cancelamento_nfe
# from pytrustnfe.nfse.assinatura import Assinatura
# from pytrustnfe.nfse.paulistana import sign_tag
#
#
# class test_nfse_paulistana(unittest.TestCase):
#
# caminho = os.path.dirname(__file__)
#
# def _get_nfse(self):
# rps = [
# {
# 'assinatura': '123',
# 'serie': '1',
# 'numero': '1',
# 'data_emissao': '2016-08-29',
# 'codigo_atividade': '07498',
# 'total_servicos': '2.00',
# 'total_deducoes': '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': 'Floripa',
# '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',
# 'lista_rps': rps
# }
# return nfse
#
# def test_envio_nfse(self):
# pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
# pfx = Certificado(pfx_source, '123456')
#
# nfse = self._get_nfse()
# path = os.path.join(os.path.dirname(__file__), 'XMLs')
# xml_return = open(os.path.join(
# path, 'paulistana_resultado.xml'), 'r').read()
#
# with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client') as client:
# retorno = mock.MagicMock()
# client.return_value = retorno
# retorno.service.EnvioLoteRPS.return_value = xml_return
#
# retorno = envio_lote_rps(pfx, nfse=nfse)
#
# self.assertEqual(retorno['received_xml'], xml_return)
# self.assertEqual(retorno['object'].Cabecalho.Sucesso, True)
# self.assertEqual(
# retorno['object'].ChaveNFeRPS.ChaveNFe.NumeroNFe, 446)
# self.assertEqual(
# retorno['object'].ChaveNFeRPS.ChaveRPS.NumeroRPS, 6)
#
# def test_nfse_signature(self):
# pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
# pfx = Certificado(pfx_source, '123456')
#
# nfse = self._get_nfse()
# path = os.path.join(os.path.dirname(__file__), 'XMLs')
# xml_sent = open(os.path.join(
# path, 'paulistana_signature.xml'), 'r').read()
#
# with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client') as client:
# retorno = mock.MagicMock()
# client.return_value = retorno
# retorno.service.EnvioLoteRPS.return_value = '<xml></xml>'
#
# retorno = envio_lote_rps(pfx, nfse=nfse)
# self.assertEqual(retorno['sent_xml'], xml_sent)
#
# def _get_cancelamento(self):
# return {
# 'cnpj_remetente': '123',
# 'assinatura': 'assinatura',
# 'numero_nfse': '456',
# 'inscricao_municipal': '654',
# 'codigo_verificacao': '789',
# }
#
# def test_cancelamento_nfse_ok(self):
# pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
# pfx = Certificado(pfx_source, '123456')
# cancelamento = self._get_cancelamento()
#
# path = os.path.join(os.path.dirname(__file__), 'XMLs')
# xml_return = open(os.path.join(
# path, 'paulistana_canc_ok.xml'), 'r').read()
#
# with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client') as client:
# retorno = mock.MagicMock()
# client.return_value = retorno
# retorno.service.CancelamentoNFe.return_value = xml_return
#
# retorno = cancelamento_nfe(pfx, cancelamento=cancelamento)
#
# self.assertEqual(retorno['received_xml'], xml_return)
# self.assertEqual(retorno['object'].Cabecalho.Sucesso, True)
#
# def test_cancelamento_nfse_com_erro(self):
# pfx_source = open(os.path.join(self.caminho, 'teste.pfx'), 'r').read()
# pfx = Certificado(pfx_source, '123456')
# cancelamento = self._get_cancelamento()
#
# path = os.path.join(os.path.dirname(__file__), 'XMLs')
# xml_return = open(os.path.join(
# path, 'paulistana_canc_errado.xml'), 'r').read()
#
# with mock.patch('pytrustnfe.nfse.paulistana.get_authenticated_client') as client:
# retorno = mock.MagicMock()
# client.return_value = retorno
# retorno.service.CancelamentoNFe.return_value = xml_return
#
# retorno = cancelamento_nfe(pfx, cancelamento=cancelamento)
#
# self.assertEqual(retorno['received_xml'], xml_return)
# self.assertEqual(retorno['object'].Cabecalho.Sucesso, False)
# self.assertEqual(
# retorno['object'].Erro.ChaveNFe.NumeroNFe, 446)

16
pytrustnfe/test/test_servidores.py

@ -7,22 +7,20 @@ Created on Jun 14, 2015
import unittest import unittest
from pytrustnfe.Servidores import localizar_url, localizar_qrcode from pytrustnfe.Servidores import localizar_url, localizar_qrcode
url_ba = 'https://nfe.sefaz.ba.gov.br/webservices/NfeAutorizacao/NfeAutoriza\
cao.asmx'
url_ba = 'https://nfe.sefaz.ba.gov.br/webservices/NFeAutorizacao4/NFeAutoriza\
cao4.asmx?wsdl'
url_sp = 'https://nfe.fazenda.sp.gov.br/ws/nfeautorizacao.asmx'
url_sp = 'https://nfe.fazenda.sp.gov.br/ws/nfeautorizacao4.asmx?wsdl'
url_qrcode_homologacao_sp = 'https://homologacao.nfce.fazenda.sp.gov.br/NFCEConsultaPublica/Paginas/ConstultaQRCode.aspx' url_qrcode_homologacao_sp = 'https://homologacao.nfce.fazenda.sp.gov.br/NFCEConsultaPublica/Paginas/ConstultaQRCode.aspx'
url_sc = 'https://nfe.svrs.rs.gov.br/ws/NfeAutorizacao/NfeAutorizacao.asmx'
url_sc = 'https://nfe.svrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl'
url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx'
url_rs = 'https://nfe.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl'
url_cad_rs = 'https://cad.sefazrs.rs.gov.br/ws/cadconsultacadastro/cadcon\
sultacadastro2.asmx'
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/CadConsult\
aCadastro2.asmx'
url_cad_sc = 'https://cad.svrs.rs.gov.br/ws/cadconsultacadastro/cadconsultacadastro2.asmx?wsdl'
class test_servidores(unittest.TestCase): class test_servidores(unittest.TestCase):

8
pytrustnfe/test/test_utils.py

@ -8,7 +8,7 @@ import unittest
import datetime import datetime
from pytrustnfe.utils import date_tostring, datetime_tostring, \ from pytrustnfe.utils import date_tostring, datetime_tostring, \
gerar_chave gerar_chave
from pytrustnfe.utils import ChaveNFe, CabecalhoSoap
from pytrustnfe.utils import ChaveNFe
class test_utils(unittest.TestCase): class test_utils(unittest.TestCase):
@ -18,12 +18,6 @@ class test_utils(unittest.TestCase):
'tipo': 0, 'codigo': '26730161' 'tipo': 0, 'codigo': '26730161'
} }
def test_cabecalho_soap(self):
head = CabecalhoSoap(versao=1, estado='SC', soap_action='Autorizacao')
self.assertEqual(head.versao, 1)
self.assertEqual(head.estado, 'SC')
self.assertEqual(head.soap_action, 'Autorizacao')
def test_date_tostring(self): def test_date_tostring(self):
hoje = datetime.date.today() hoje = datetime.date.today()
data = date_tostring(hoje) data = date_tostring(hoje)

21
pytrustnfe/utils.py

@ -8,14 +8,6 @@ from datetime import date, datetime
import lxml.etree as ET import lxml.etree as ET
class CabecalhoSoap(object):
def __init__(self, **kwargs):
self.versao = kwargs.pop('versao', '')
self.estado = kwargs.pop('estado', '')
self.soap_action = kwargs.pop('soap_action', '')
class ChaveNFe(object): class ChaveNFe(object):
def __init__(self, **kwargs): def __init__(self, **kwargs):
@ -84,7 +76,7 @@ def _find_node(xml, node):
def gerar_nfeproc(envio, recibo): def gerar_nfeproc(envio, recibo):
NSMAP = {None: 'http://www.portalfiscal.inf.br/nfe'} NSMAP = {None: 'http://www.portalfiscal.inf.br/nfe'}
root = ET.Element("nfeProc", versao="3.10", nsmap=NSMAP)
root = ET.Element("nfeProc", versao="4.00", nsmap=NSMAP)
docEnvio = ET.fromstring(envio) docEnvio = ET.fromstring(envio)
docRecibo = ET.fromstring(recibo) docRecibo = ET.fromstring(recibo)
@ -95,3 +87,14 @@ def gerar_nfeproc(envio, recibo):
root.append(nfe) root.append(nfe)
root.append(protocolo) root.append(protocolo)
return ET.tostring(root) return ET.tostring(root)
def gerar_nfeproc_cancel(nfe_proc, cancelamento):
docEnvio = ET.fromstring(nfe_proc)
docCancel = ET.fromstring(cancelamento)
ev_cancelamento = _find_node(docCancel, "retEvento")
if ev_cancelamento is None:
return ''
docEnvio.append(ev_cancelamento)
return ET.tostring(docEnvio)

2
pytrustnfe/xml/schemas/enviNFe_v3.10.xsd → pytrustnfe/xml/schemas/enviNFe_v4.00.xsd

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://www.portalfiscal.inf.br/nfe" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:include schemaLocation="leiauteNFe_v3.10.xsd"/>
<xs:include schemaLocation="leiauteNFe_v4.00.xsd"/>
<xs:element name="enviNFe" type="TEnviNFe"> <xs:element name="enviNFe" type="TEnviNFe">
<xs:annotation> <xs:annotation>
<xs:documentation>Schema XML de validação do Pedido de Concessão de Autorização da Nota Fiscal Eletrônica</xs:documentation> <xs:documentation>Schema XML de validação do Pedido de Concessão de Autorização da Nota Fiscal Eletrônica</xs:documentation>

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

2
pytrustnfe/xml/schemas/nfe_v3.10.xsd → pytrustnfe/xml/schemas/nfe_v4.00.xsd

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?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: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:include schemaLocation="leiauteNFe_v3.10.xsd"/>
<xs:include schemaLocation="leiauteNFe_v4.00.xsd"/>
<xs:element name="NFe" type="TNFe"> <xs:element name="NFe" type="TNFe">
<xs:annotation> <xs:annotation>
<xs:documentation>Nota Fiscal Eletrônica</xs:documentation> <xs:documentation>Nota Fiscal Eletrônica</xs:documentation>

20
pytrustnfe/xml/schemas/tiposBasico_v3.10.xsd → pytrustnfe/xml/schemas/tiposBasico_v4.00.xsd

@ -135,6 +135,15 @@
<xs:pattern value="[0-9]{3,11}"/> <xs:pattern value="[0-9]{3,11}"/>
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="TDec_0104v">
<xs:annotation>
<xs:documentation>Tipo Decimal com até 1 dígitos inteiros, podendo ter de 1 até 4 decimais</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:pattern value="0|0\.[0-9]{1,4}|[1-9]{1}(\.[0-9]{1,4})?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TDec_0204v"> <xs:simpleType name="TDec_0204v">
<xs:annotation> <xs:annotation>
<xs:documentation>Tipo Decimal com até 2 dígitos inteiros, podendo ter de 1 até 4 decimais</xs:documentation> <xs:documentation>Tipo Decimal com até 2 dígitos inteiros, podendo ter de 1 até 4 decimais</xs:documentation>
@ -171,13 +180,22 @@
<xs:pattern value="0(\.[0-9]{2})?|100(\.00)?|[1-9]{1}[0-9]{0,1}(\.[0-9]{2})?"/> <xs:pattern value="0(\.[0-9]{2})?|100(\.00)?|[1-9]{1}[0-9]{0,1}(\.[0-9]{2})?"/>
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="TDec_0304Max100">
<xs:annotation>
<xs:documentation>Tipo Decimal com 3 inteiros (no máximo 100), com 4 decimais</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:pattern value="0(\.[0-9]{4})?|100(\.00)?|[1-9]{1}[0-9]{0,1}(\.[0-9]{4})?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TDec_0302a04Max100"> <xs:simpleType name="TDec_0302a04Max100">
<xs:annotation> <xs:annotation>
<xs:documentation>Tipo Decimal com 3 inteiros (no máximo 100), com até 4 decimais</xs:documentation> <xs:documentation>Tipo Decimal com 3 inteiros (no máximo 100), com até 4 decimais</xs:documentation>
</xs:annotation> </xs:annotation>
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/> <xs:whiteSpace value="preserve"/>
<xs:pattern value="[1-9]{1}(\.[0-9]{2,4})?|[1-9]{1}[0-9]{1}(\.[0-9]{2,4})?|100(\.0{2,4})?"/>
<xs:pattern value="0(\.[0-9]{2,4})?|[1-9]{1}[0-9]{0,1}(\.[0-9]{2,4})?|100(\.0{2,4})?"/>
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="TDec_0803v"> <xs:simpleType name="TDec_0803v">

0
pytrustnfe/xml/schemas/xmldsig-core-schema_v1.01.xsd

4
pytrustnfe/xml/validate.py

@ -8,7 +8,7 @@ import re
from lxml import etree from lxml import etree
PATH = os.path.dirname(os.path.abspath(__file__)) PATH = os.path.dirname(os.path.abspath(__file__))
SCHEMA = os.path.join(PATH, 'schemas/nfe_v3.10.xsd')
SCHEMA = os.path.join(PATH, 'schemas/nfe_v4.00.xsd')
def pop_encoding(xml): def pop_encoding(xml):
@ -30,7 +30,7 @@ def valida_nfe(nfe):
mensagens = [] mensagens = []
for erro in erros: for erro in erros:
campo = re.findall(r"'([^']*)'", erro)[0] campo = re.findall(r"'([^']*)'", erro)[0]
nome = campo[campo.find('}') + 1: ]
nome = campo[campo.find('}') + 1:]
valor = nfe.find('.//' + campo).text valor = nfe.find('.//' + campo).text
if 'Expected is' in erro: if 'Expected is' in erro:
expected_name = re.findall('\(.*?\)', erro) expected_name = re.findall('\(.*?\)', erro)

1
requirements.txt

@ -14,3 +14,4 @@ cryptography >= 1.8, < 1.10
pyOpenSSL >= 16.0.0, < 17 pyOpenSSL >= 16.0.0, < 17
certifi >= 2015.11.20.1 certifi >= 2015.11.20.1
reportlab reportlab
pytz

6
setup.py

@ -1,7 +1,7 @@
# coding=utf-8 # coding=utf-8
from setuptools import setup, find_packages from setuptools import setup, find_packages
VERSION = "0.1.45.post3"
VERSION = "1.0.1.post1"
setup( setup(
name="pytrustnfe", name="pytrustnfe",
@ -40,7 +40,9 @@ later (LGPLv2+)',
'lxml >= 3.5.0, < 4', 'lxml >= 3.5.0, < 4',
'suds >= 0.4', 'suds >= 0.4',
'suds_requests >= 0.3', 'suds_requests >= 0.3',
'reportlab'
'reportlab',
'pytz',
'zeep'
], ],
test_suite='nose.collector', test_suite='nose.collector',
tests_require=[ tests_require=[

Loading…
Cancel
Save