Browse Source

Merge pull request #48 from TadaSoftware/qr_2_00

Qr 2 00 PR
pull/51/head
Junior Tada 7 years ago
committed by GitHub
parent
commit
49f453fb5b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 36
      pynfe/processamento/serializacao.py
  2. 2
      pynfe/utils/flags.py
  3. 4
      pynfe/utils/webservices.py

36
pynfe/processamento/serializacao.py

@ -8,6 +8,7 @@ from pynfe.utils.webservices import NFCE
import base64 import base64
import hashlib import hashlib
from datetime import datetime from datetime import datetime
import re
class Serializacao(object): class Serializacao(object):
@ -255,7 +256,7 @@ class SerializacaoXML(Serializacao):
# Lei da transparencia # Lei da transparencia
# Tributos aprox por item # Tributos aprox por item
if produto_servico.valor_tributos_aprox: if produto_servico.valor_tributos_aprox:
etree.SubElement(imposto, 'vTotTrib').text = produto_servico.valor_tributos_aprox
etree.SubElement(imposto, 'vTotTrib').text = str(produto_servico.valor_tributos_aprox)
### ICMS ### ICMS
icms = etree.SubElement(imposto, 'ICMS') icms = etree.SubElement(imposto, 'ICMS')
@ -673,7 +674,7 @@ class SerializacaoXML(Serializacao):
class SerializacaoQrcode(object): class SerializacaoQrcode(object):
""" Classe que gera e serializa o qrcode de NFC-e no xml """ """ Classe que gera e serializa o qrcode de NFC-e no xml """
def gerar_qrcode(self, token, csc, xml, return_qr=False):
def gerar_qrcode(self, token, csc, xml, return_qr=False, online=True):
""" Classe para gerar url do qrcode da NFC-e """ """ Classe para gerar url do qrcode da NFC-e """
# Procura atributos no xml # Procura atributos no xml
ns = {'ns':NAMESPACE_NFE} ns = {'ns':NAMESPACE_NFE}
@ -696,23 +697,34 @@ class SerializacaoQrcode(object):
except IndexError: except IndexError:
cpf = None cpf = None
total = nfe.xpath('ns:infNFe/ns:total/ns:ICMSTot/ns:vNF/text()', namespaces=ns)[0] total = nfe.xpath('ns:infNFe/ns:total/ns:ICMSTot/ns:vNF/text()', namespaces=ns)[0]
icms = nfe.xpath('ns:infNFe/ns:total/ns:ICMSTot/ns:vICMS/text()', namespaces=ns)[0]
# icms = nfe.xpath('ns:infNFe/ns:total/ns:ICMSTot/ns:vICMS/text()', namespaces=ns)[0]
digest = nfe.xpath('sig:Signature/sig:SignedInfo/sig:Reference/sig:DigestValue/text()', namespaces=sig)[0].encode() digest = nfe.xpath('sig:Signature/sig:SignedInfo/sig:Reference/sig:DigestValue/text()', namespaces=sig)[0].encode()
data = base64.b16encode(data).decode()
digest = base64.b16encode(digest).decode()
lista_dia = re.findall("-\d{2}", str(data))
dia = str(lista_dia[1])
dia = dia[1:]
replacements = {'0': ''}
token = re.sub('([0])', lambda m: replacements[m.group()], token)
if cpf is None:
url = 'chNFe={}&nVersao={}&tpAmb={}&dhEmi={}&vNF={}&vICMS={}&digVal={}&cIdToken={}'.format(
chave, VERSAO_QRCODE, tpamb, data.lower(), total, icms, digest.lower(), token)
#VERSAO_QRCODE =2
if online:
#versão online
url = '{}|{}|{}|{}'.format(chave,VERSAO_QRCODE, tpamb, token)
else: else:
url = 'chNFe={}&nVersao={}&tpAmb={}&cDest={}&dhEmi={}&vNF={}&vICMS={}&digVal={}&cIdToken={}'.format(
chave, VERSAO_QRCODE, tpamb, cpf, data.lower(), total, icms, digest.lower(), token)
#versão offline
digest = digest.lower()
digest = digest.hex()
url_hash = hashlib.sha1(url.encode()+csc.encode()).digest()
url = '{}|{}|{}|{}|{}|{}|{}'.format(
chave,VERSAO_QRCODE,tpamb,dia,total,digest,token
)
url_complementar = url + csc
url_hash = hashlib.sha1(url_complementar.encode()).digest()
url_hash = base64.b16encode(url_hash).decode() url_hash = base64.b16encode(url_hash).decode()
url = url + '&cHashQRCode=' + url_hash.upper()
url = 'p={}|{}'.format(url, url_hash)
# url_chave - Texto com a URL de consulta por chave de acesso a ser impressa no DANFE NFC-e. # url_chave - Texto com a URL de consulta por chave de acesso a ser impressa no DANFE NFC-e.
# Informar a URL da “Consulta por chave de acesso da NFC-e”. # Informar a URL da “Consulta por chave de acesso da NFC-e”.
# A mesma URL que deve estar informada no DANFE NFC-e para consulta por chave de acesso # A mesma URL que deve estar informada no DANFE NFC-e para consulta por chave de acesso

2
pynfe/utils/flags.py

@ -12,7 +12,7 @@ NAMESPACE_BETHA = 'http://www.betha.com.br/e-nota-contribuinte-ws'
VERSAO_PADRAO = '4.00' VERSAO_PADRAO = '4.00'
VERSAO_QRCODE = '100'
VERSAO_QRCODE = '2'
TIPOS_DOCUMENTO = ( TIPOS_DOCUMENTO = (
'CNPJ', 'CNPJ',

4
pynfe/utils/webservices.py

@ -199,7 +199,7 @@ NFCE = {
'INUTILIZACAO': 'nfce.fazenda.sp.gov.br/ws/NFeInutilizacao4.asmx', 'INUTILIZACAO': 'nfce.fazenda.sp.gov.br/ws/NFeInutilizacao4.asmx',
'EVENTOS': 'nfce.fazenda.sp.gov.br/ws/NFeRecepcaoEvento4.asmx', 'EVENTOS': 'nfce.fazenda.sp.gov.br/ws/NFeRecepcaoEvento4.asmx',
'QR': 'nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaQRCode.aspx?', 'QR': 'nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaQRCode.aspx?',
'URL': 'nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaPublica.aspx',
'URL': 'nfce.fazenda.sp.gov.br/consulta',
'HTTPS': 'https://', 'HTTPS': 'https://',
'HOMOLOGACAO': 'https://homologacao.' 'HOMOLOGACAO': 'https://homologacao.'
}, },
@ -212,7 +212,7 @@ NFCE = {
'EVENTOS': 'nfce.sefa.pr.gov.br/nfce/NFeRecepcaoEvento4?wsdl', 'EVENTOS': 'nfce.sefa.pr.gov.br/nfce/NFeRecepcaoEvento4?wsdl',
'CADASTRO': 'nfce.sefa.pr.gov.br/nfce/CadConsultaCadastro4?wsdl', 'CADASTRO': 'nfce.sefa.pr.gov.br/nfce/CadConsultaCadastro4?wsdl',
'QR': 'http://www.fazenda.pr.gov.br/nfce/qrcode?', 'QR': 'http://www.fazenda.pr.gov.br/nfce/qrcode?',
'URL': 'http://www.fazenda.pr.gov.br',
'URL': 'www.fazenda.pr.gov.br/nfce/consulta',
'HTTPS': 'https://', 'HTTPS': 'https://',
'HOMOLOGACAO': 'https://homologacao.' 'HOMOLOGACAO': 'https://homologacao.'
}, },

Loading…
Cancel
Save