diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py
index 44dda58..d679e70 100644
--- a/pytrustnfe/Servidores.py
+++ b/pytrustnfe/Servidores.py
@@ -10,6 +10,17 @@ WS_NFE_CONSULTA = 'NfeConsultaProtocolo'
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_NFE_CADASTRO = 'NfeConsultaCadastro'
WS_DPEC_RECEPCAO = 'RecepcaoEventoEPEC'
WS_DPEC_CONSULTA = 8
@@ -20,6 +31,11 @@ WS_DFE_DISTRIBUICAO = 12
NFE_AMBIENTE_PRODUCAO = 1
NFE_AMBIENTE_HOMOLOGACAO = 2
+NFCE_AMBIENTE_PRODUCAO = 1
+NFCE_AMBIENTE_HOMOLOGACAO = 2
+
+NFE_MODELO = u'55'
+NFCE_MODELO = u'65'
SIGLA_ESTADO = {
'12': 'AC',
@@ -54,54 +70,22 @@ SIGLA_ESTADO = {
def localizar_url(servico, estado, mod=55, ambiente=2):
sigla = SIGLA_ESTADO[estado]
- dominio = ESTADO_WS[sigla][ambiente]['servidor']
- complemento = ESTADO_WS[sigla][ambiente][servico]
- if mod == 65:
- if sigla == 'SP':
- if servico == WS_NFE_AUTORIZACAO:
- dominio = 'https://homologacao.nfce.fazenda.sp.gov.br/ws/\
-nfeautorizacao.asmx'
- if servico == WS_NFE_RET_AUTORIZACAO:
- dominio = 'https://homologacao.nfce.fazenda.sp.gov.br/ws/\
-nferetautorizacao.asmx'
- if servico == WS_NFE_INUTILIZACAO:
- dominio = 'https://homologacao.nfce.fazenda.sp.gov.br/ws/\
-nfeinutilizacao2.asmx'
- if servico == WS_NFE_CONSULTA:
- dominio = 'https://homologacao.nfce.fazenda.sp.gov.br/ws/\
-nfeconsulta2.asmx'
- if servico == WS_NFE_SITUACAO:
- dominio = 'https://homologacao.nfce.fazenda.sp.gov.br/ws/\
-nfestatusservico2.asmx'
- if servico == WS_NFE_RECEPCAO_EVENTO:
- dominio = 'https://homologacao.nfce.fazenda.sp.gov.br/ws/\
-recepcaoevento.asmx'
- if sigla == 'RS':
- if servico == WS_NFE_AUTORIZACAO:
- dominio = 'https://nfce-homologacao.sefazrs.rs.gov.br/ws/\
-NfeAutorizacao/NFeAutorizacao.asmx'
- if servico == WS_NFE_RET_AUTORIZACAO:
- dominio = 'https://nfce-homologacao.sefazrs.rs.gov.br/ws/\
-NfeRetAutorizacao/NFeRetAutorizacao.asmx'
- if servico == WS_NFE_INUTILIZACAO:
- dominio = 'https://nfce-homologacao.sefazrs.rs.gov.br/ws/\
-nfeinutilizacao/nfeinutilizacao2.asmx'
- if servico == WS_NFE_CONSULTA:
- dominio = 'https://nfce-homologacao.sefazrs.rs.gov.br/ws/\
-NfeConsulta/NfeConsulta2.asmx'
- if servico == WS_NFE_SITUACAO:
- dominio = 'https://nfce-homologacao.sefazrs.rs.gov.br/ws/\
-NfeStatusServico/NfeStatusServico2.asmx'
- if servico == WS_NFE_RECEPCAO_EVENTO:
- dominio = 'https://nfce-homologacao.sefazrs.rs.gov.br/ws/\
-recepcaoevento/recepcaoevento.asmx'
-
- else:
- if sigla == 'RS' and servico == WS_NFE_CADASTRO:
- dominio = 'cad.sefazrs.rs.gov.br'
- if sigla in ('AC', 'RN', 'PB', 'SC') and \
- servico == WS_NFE_CADASTRO:
- dominio = 'cad.svrs.rs.gov.br'
+ dominio = ESTADO_WS[sigla][mod][ambiente]['servidor']
+ complemento = ESTADO_WS[sigla][mod][ambiente][servico]
+
+ if sigla == 'RS' and servico == WS_NFE_CADASTRO:
+ dominio = 'cad.sefazrs.rs.gov.br'
+ if sigla in ('AC', 'RN', 'PB', 'SC') and \
+ servico == WS_NFE_CADASTRO:
+ dominio = 'cad.svrs.rs.gov.br'
+
+ return "https://%s/%s" % (dominio, complemento)
+
+
+def localizar_qrcode(estado, ambiente=2):
+ sigla = SIGLA_ESTADO[estado]
+ dominio = ESTADO_WS[sigla]['65'][ambiente]['servidor']
+ complemento = ESTADO_WS[sigla]['65'][ambiente][WS_NFCE_QR_CODE]
return "https://%s/%s" % (dominio, complemento)
@@ -529,27 +513,51 @@ UFRS = {
UFSP = {
- NFE_AMBIENTE_PRODUCAO: {
- 'servidor': 'nfe.fazenda.sp.gov.br',
- WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
- WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
- WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
- WS_NFE_CONSULTA: 'ws/nfeconsulta2.asmx',
- WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx',
- WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx',
- WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx',
- WS_NFE_CANCELAMENTO: 'ws/recepcaoevento.asmx',
+ NFE_MODELO: {
+ NFE_AMBIENTE_PRODUCAO: {
+ 'servidor': 'nfe.fazenda.sp.gov.br',
+ WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
+ WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
+ WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
+ WS_NFE_CONSULTA: 'ws/nfeconsulta2.asmx',
+ WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx',
+ WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx',
+ WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx',
+ },
+ NFE_AMBIENTE_HOMOLOGACAO: {
+ 'servidor': 'homologacao.nfe.fazenda.sp.gov.br',
+ WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
+ WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
+ WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
+ WS_NFE_CONSULTA: 'ws/nfeconsulta2.asmx',
+ WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx',
+ WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.asmx',
+ WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento.asmx',
+ }
},
- NFE_AMBIENTE_HOMOLOGACAO: {
- 'servidor': 'homologacao.nfe.fazenda.sp.gov.br',
- WS_NFE_AUTORIZACAO: 'ws/nfeautorizacao.asmx',
- WS_NFE_RET_AUTORIZACAO: 'ws/nferetautorizacao.asmx',
- WS_NFE_INUTILIZACAO: 'ws/nfeinutilizacao2.asmx',
- WS_NFE_CONSULTA: 'ws/nfeconsulta2.asmx',
- WS_NFE_SITUACAO: 'ws/nfestatusservico2.asmx',
- WS_NFE_CADASTRO: 'ws/cadconsultacadastro2.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',
+ }
}
}
diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py
index bd900f0..c8926c4 100644
--- a/pytrustnfe/nfe/__init__.py
+++ b/pytrustnfe/nfe/__init__.py
@@ -10,7 +10,7 @@ from .assinatura import Assinatura
from pytrustnfe.xml import render_xml
from pytrustnfe.utils import CabecalhoSoap
from pytrustnfe.utils import gerar_chave, ChaveNFe
-from pytrustnfe.Servidores import localizar_url
+from pytrustnfe.Servidores import localizar_url, localizar_qrcode
def _build_header(method, **kwargs):
@@ -61,9 +61,31 @@ def _add_required_node(elemTree):
return elemTree
+def _add_qrCode(xml, **kwargs):
+ xml = etree.fromstring(xml)
+ inf_nfe = kwargs['NFes'][0]['infNFe']
+ nfe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe")
+ infnfesupl = etree.Element('infNFeSupl')
+ qrcode = etree.Element('qrCode')
+ qrcode_url = localizar_qrcode(kwargs['estado'], kwargs['ambiente'])
+ chave_nfe = inf_nfe['Id'][3:]
+ dh_emissao = inf_nfe['ide']['dhEmi'].encode('hex')
+ versao = 100
+ ambiente = kwargs['ambiente']
+ valor_total = inf_nfe['total']['vNF']
+ if inf_nfe.get('dest', False):
+ dest_cpf = inf_nfe['dest'].get('CPF', False)
+ icms_total = inf_nfe['total']['vICMS']
+ dig_val_tag = xml.find(
+ ".//{http://www.portalfiscal.inf.br/nfe}Signature/SignedInfo/Reference/DigestValue")
+ dig_val = dig_val_tag.text.encode('hex')
+
+ qrcode_text = qrcode_url
+
+
def _send(certificado, method, sign, **kwargs):
path = os.path.join(os.path.dirname(__file__), 'templates')
-
+ modelo = kwargs['NFes'][0]['infNFe']['ide']['mod']
xmlElem_send = render_xml(path, '%s.xml' % method, True, **kwargs)
if sign:
# Caso for autorização temos que adicionar algumas tags tipo
@@ -78,10 +100,15 @@ def _send(certificado, method, sign, **kwargs):
elif method == 'RecepcaoEventoCancelamento':
xml_send = signer.assina_xml(
xmlElem_send, kwargs['eventos'][0]['Id'])
+
+ if modelo == '65':
+ _add_qrCode(xml_send, **kwargs)
+
else:
xml_send = etree.tostring(xmlElem_send)
- url = localizar_url(method, kwargs['estado'], kwargs['ambiente'])
+ url = localizar_url(method, kwargs['estado'], modelo,
+ kwargs['ambiente'])
cabecalho = _build_header(method, **kwargs)
response, obj = executar_consulta(certificado, url, cabecalho, xml_send)
diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml
index 3b5d319..e3c8be3 100644
--- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml
+++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml
@@ -14,7 +14,9 @@
{{ ide.serie }}
{{ ide.nNF }}
{{ ide.dhEmi }}
- {{ ide.dhSaiEnt }}
+ {% if ide.mod != '65' %}
+ {{ ide.dhSaiEnt }}
+ {% endif %}
{{ ide.tpNF }}
{{ ide.idDest }}
{{ ide.cMunFG }}
@@ -462,6 +464,7 @@
{% endif %}
+ {% if NFe.infNFe.ide.mod != '65' %}
{{ imposto.IPI.clEnq }}
{{ imposto.IPI.CNPJProd }}
@@ -484,6 +487,7 @@
{% endif %}
+ {% endif %}
{% if imposto.II is defined %}
{{ imposto.II.vBC }}
@@ -717,6 +721,7 @@
{% endif %}
{% if NFe.infNFe.cobr is defined %}
+ {% if NFe.infNFe.ide.mod != '65' %}
{% if NFe.infNFe.cobr.fat is defined %}
@@ -736,6 +741,7 @@
{% endfor %}
{% endif %}
+ {% endif %}
{% endif %}
{% if NFe.infNFe.pag is defined %}
{% for pag in NFe.infNFe.pag %}