diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index 43a5e70..0cfdeb2 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -167,7 +167,7 @@ class ComunicacaoSefaz(Comunicacao): # url url = self._get_url_an(consulta='DISTRIBUICAO') # Monta XML para envio da requisição - raiz = etree.Element('distDFeInt', versao='1.00', xmlns=NAMESPACE_NFE) + raiz = etree.Element('distDFeInt', versao='1.01', xmlns=NAMESPACE_NFE) etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente) if self.uf: etree.SubElement(raiz, 'cUFAutor').text = CODIGOS_ESTADOS[self.uf.upper()] @@ -175,15 +175,16 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'CNPJ').text = cnpj else: etree.SubElement(raiz, 'CPF').text = cpf - distNSU = etree.SubElement(raiz, 'distNSU') - etree.SubElement(distNSU, 'ultNSU').text = str(nsu).zfill(15) - # if chave: - # consChNFe = etree.SubElement(raiz, 'consChNFe') - # etree.SubElement(consChNFe, 'chNFe').text = chave - # Monta XML para envio da requisição + if not chave: + distNSU = etree.SubElement(raiz, 'distNSU') + etree.SubElement(distNSU, 'ultNSU').text = str(nsu).zfill(15) + if chave: + consChNFe = etree.SubElement(raiz, 'consChNFe') + etree.SubElement(consChNFe, 'chNFe').text = chave + #Monta XML para envio da requisição xml = self._construir_xml_soap('NFeDistribuicaoDFe', raiz) - # print(url) - # print(etree.tostring(xml)) + + return self._post(url, xml) def consulta_cadastro(self, modelo, cnpj): @@ -352,7 +353,7 @@ class ComunicacaoSefaz(Comunicacao): raise Exception('Modelo não encontrado! Defina modelo="nfe" ou "nfce"') # Estados que utilizam outros ambientes else: - lista_svrs = ['AC', 'RJ', 'RN', 'PB', 'SC', 'SE', 'PI'] + lista_svrs = ['AC', 'RJ', 'RN', 'PB', 'SC', 'SE', 'PI', 'DF', 'ES'] lista_svan = ['MA','PA'] if self.uf.upper() in lista_svrs: if self._ambiente == 1: diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 19d9570..077bbb2 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -305,9 +305,9 @@ class SerializacaoXML(Serializacao): etree.SubElement(icms_item, 'modBCST').text = str(produto_servico.icms_st_modalidade_determinacao_bc) etree.SubElement(icms_item, 'pMVAST').text = str(produto_servico.icms_st_percentual_adicional) # Percentual da margem de valor Adicionado do ICMS ST etree.SubElement(icms_item, 'pRedBCST').text = str(produto_servico.icms_st_percentual_reducao_bc) # APercentual da Redução de BC do ICMS ST - etree.SubElement(icms_item, 'vBCST ').text = str(produto_servico.icms_st_valor_base_calculo) - etree.SubElement(icms_item, 'pICMSST ').text = str(produto_servico.icms_st_aliquota) - etree.SubElement(icms_item, 'vICMSST ').text = str(produto_servico.icms_st_valor) + etree.SubElement(icms_item, 'vBCST').text = str(produto_servico.icms_st_valor_base_calculo) + etree.SubElement(icms_item, 'pICMSST').text = str(produto_servico.icms_st_aliquota) + etree.SubElement(icms_item, 'vICMSST').text = str(produto_servico.icms_st_valor) # 20=Com redução de base de cálculo elif produto_servico.icms_modalidade == '20': etree.SubElement(icms_item, 'pRedBC').text = '{:.2f}'.format(produto_servico.icms_percentual_reducao_bc or 0) # Percentual da Redução de BC @@ -728,7 +728,7 @@ class SerializacaoQrcode(object): # 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”. # A mesma URL que deve estar informada no DANFE NFC-e para consulta por chave de acesso - lista_uf_padrao = ['PR', 'CE', 'RS', 'RJ', 'RO'] + lista_uf_padrao = ['PR', 'CE', 'RS', 'RJ', 'RO', 'DF'] if uf.upper() in lista_uf_padrao: qrcode = NFCE[uf.upper()]['QR'] + url url_chave = NFCE[uf.upper()]['URL'] diff --git a/pynfe/utils/descompactar.py b/pynfe/utils/descompactar.py new file mode 100644 index 0000000..ab4e1ea --- /dev/null +++ b/pynfe/utils/descompactar.py @@ -0,0 +1,30 @@ + +""" + @author: Lucas Resende + + classe que descompacta o gzip recebido pela consulta distribuicao + +""" + +from io import BytesIO +import base64 +import gzip +from lxml import etree + +class DescompactaGzip(object): + @staticmethod + def descompacta(stringZipada): + """ + :paramn stringZipada: String + + :return : Etree + """ + arq = BytesIO() + arq.write(base64.b64decode(stringZipada)) + arq.seek(0) + zip = gzip.GzipFile(fileobj=arq) + texto = zip.read() + arq.close() + zip.close() + descompactado = texto.decode('utf-8') + return etree.fromstring(descompactado) diff --git a/pynfe/utils/webservices.py b/pynfe/utils/webservices.py index 4e7713c..bf08aeb 100644 --- a/pynfe/utils/webservices.py +++ b/pynfe/utils/webservices.py @@ -172,7 +172,10 @@ NFCE = { 'CHAVE': '', 'INUTILIZACAO': '', 'EVENTOS': '', - 'QR': '' + 'QR': 'sefaz.es.gov.br/ConsultaNFCe/qrcode.aspx? ', + 'HTTPS': 'http://nfe.', + 'HOMOLOGACAO': 'http://homologacao.', + 'URL': 'www.sefaz.es.gov.br/nfce/consulta' }, 'RJ': { 'STATUS': '', @@ -263,6 +266,10 @@ NFCE = { 'HTTPS': 'http://nfe.', 'HOMOLOGACAO': 'http://homolog.' }, + 'DF': { + 'QR': 'http://www.fazenda.df.gov.br/nfce/qrcode?', + 'URL': 'www.fazenda.df.gov.br/nfce/consulta' + }, # RO, AC, RR, PA, AP, TO, MA, PI, RN, PB, AL, SE, BA, ES, RJ, GO, DF 'SVRS': { 'STATUS': 'svrs.rs.gov.br/ws/NfeStatusServico/NfeStatusServico4.asmx',