From 59b6cdae02dfa170f5f3e74de782e8b3e699dfca Mon Sep 17 00:00:00 2001 From: lmandala Date: Tue, 6 Nov 2018 11:16:48 -0300 Subject: [PATCH 1/6] consulta distribuicao por chave e metodo de descompactar gzip --- pynfe/processamento/comunicacao.py | 23 ++++++++++++++--------- pynfe/utils/descompactar.py | 30 ++++++++++++++++++++++++++++++ tests/consulta_distribuicao.txt | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 pynfe/utils/descompactar.py create mode 100644 tests/consulta_distribuicao.txt diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index 960a545..fa975ff 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -17,6 +17,7 @@ from pynfe.utils.flags import ( from pynfe.utils.webservices import NFE, NFCE, NFSE from pynfe.entidades.certificado import CertificadoA1 from .assinatura import AssinaturaA1 +from pynfe.utils.descompactar import DescompactaGzip class Comunicacao(object): @@ -167,7 +168,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 +176,19 @@ 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)) + #print(url) + #print(etree.tostring(xml)) + #print('\n\n') + + return self._post(url, xml) def consulta_cadastro(self, modelo, cnpj): 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/tests/consulta_distribuicao.txt b/tests/consulta_distribuicao.txt new file mode 100644 index 0000000..8016f73 --- /dev/null +++ b/tests/consulta_distribuicao.txt @@ -0,0 +1,38 @@ +from pynfe.processamento.comunicacao import ComunicacaoSefaz +from pynfe.utils.descompactar import DescompactaGzip +from pynfe.utils.flags import NAMESPACE_NFE +from lxml import etree + +CNPJ = 'CPNJ_DA_EMPRESA' +CHAVE = 'CHAVE_DA_NOTA_DA_CONSULTA' +certificado = "/certs/cert.pfx" +senha = '1234' +uf = 'pi' +homologacao = False +con = ComunicacaoSefaz(uf, certificado, senha, homologacao) +xml = con.consulta_distribuicao(cnpj=CNPJ,chave=CHAVE) +#print('\n\n Retorno:') +#print(xml.text) + +print('Descompactado \n\n') + +# exemplo de leitura da resposta +ns = {'ns': NAMESPACE_NFE} +#esse retorno precisa ser melhorado + +resposta = etree.fromstring(xml.content) + +#desconpactando a mensagem + +zip_resposta = resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip', namespaces=ns)[0].text + +des_resposta = DescompactaGzip.descompacta(zip_resposta) + +#recuperando valores do resultado da descompactacao + +chave = des_resposta.xpath('//ns:resNFe/ns:chNFe',namespaces=ns)[0].text + +valor = des_resposta.xpath('//ns:resNFe/ns:vNF',namespaces=ns)[0].text + + +print('chave:{}\nvalor:{}'.format(chave,valor)) \ No newline at end of file From 549f0ae33f93b5284de95edd41f190c7a0dc7511 Mon Sep 17 00:00:00 2001 From: lmandala Date: Fri, 14 Dec 2018 08:19:30 -0300 Subject: [PATCH 2/6] removendo prints de logs e arqui de teste pessoal --- pynfe/processamento/comunicacao.py | 3 --- tests/consulta_distribuicao.txt | 38 -------------------------------------- 2 files changed, 41 deletions(-) delete mode 100644 tests/consulta_distribuicao.txt diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index fa975ff..ee88f54 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -184,9 +184,6 @@ class ComunicacaoSefaz(Comunicacao): 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)) - #print('\n\n') return self._post(url, xml) diff --git a/tests/consulta_distribuicao.txt b/tests/consulta_distribuicao.txt deleted file mode 100644 index 8016f73..0000000 --- a/tests/consulta_distribuicao.txt +++ /dev/null @@ -1,38 +0,0 @@ -from pynfe.processamento.comunicacao import ComunicacaoSefaz -from pynfe.utils.descompactar import DescompactaGzip -from pynfe.utils.flags import NAMESPACE_NFE -from lxml import etree - -CNPJ = 'CPNJ_DA_EMPRESA' -CHAVE = 'CHAVE_DA_NOTA_DA_CONSULTA' -certificado = "/certs/cert.pfx" -senha = '1234' -uf = 'pi' -homologacao = False -con = ComunicacaoSefaz(uf, certificado, senha, homologacao) -xml = con.consulta_distribuicao(cnpj=CNPJ,chave=CHAVE) -#print('\n\n Retorno:') -#print(xml.text) - -print('Descompactado \n\n') - -# exemplo de leitura da resposta -ns = {'ns': NAMESPACE_NFE} -#esse retorno precisa ser melhorado - -resposta = etree.fromstring(xml.content) - -#desconpactando a mensagem - -zip_resposta = resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip', namespaces=ns)[0].text - -des_resposta = DescompactaGzip.descompacta(zip_resposta) - -#recuperando valores do resultado da descompactacao - -chave = des_resposta.xpath('//ns:resNFe/ns:chNFe',namespaces=ns)[0].text - -valor = des_resposta.xpath('//ns:resNFe/ns:vNF',namespaces=ns)[0].text - - -print('chave:{}\nvalor:{}'.format(chave,valor)) \ No newline at end of file From 94d989ac6c615b572b10100e9173406c78b2f5c7 Mon Sep 17 00:00:00 2001 From: juniortada Date: Mon, 17 Dec 2018 11:41:57 -0200 Subject: [PATCH 3/6] =?UTF-8?q?[new]=20add=20DF=20SVRS,=20removido=20impor?= =?UTF-8?q?t=20desnecess=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/processamento/comunicacao.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index cb40536..fb52751 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -17,7 +17,6 @@ from pynfe.utils.flags import ( from pynfe.utils.webservices import NFE, NFCE, NFSE from pynfe.entidades.certificado import CertificadoA1 from .assinatura import AssinaturaA1 -from pynfe.utils.descompactar import DescompactaGzip class Comunicacao(object): @@ -354,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'] lista_svan = ['MA','PA'] if self.uf.upper() in lista_svrs: if self._ambiente == 1: From aad0dcd9b8692ddee3731b09a8b2eedfb8f1a9fe Mon Sep 17 00:00:00 2001 From: juniortada Date: Mon, 17 Dec 2018 11:53:39 -0200 Subject: [PATCH 4/6] [fix] add url para qrcode nfce DF --- pynfe/processamento/serializacao.py | 2 +- pynfe/utils/webservices.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 19d9570..96f4579 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -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/webservices.py b/pynfe/utils/webservices.py index 342aa0b..25b02d7 100644 --- a/pynfe/utils/webservices.py +++ b/pynfe/utils/webservices.py @@ -263,6 +263,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', From 26a5f4433a73e4039e82cbe4ea5012a124ab5472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20de=20=C3=81vila=20Rodrigues?= Date: Wed, 19 Dec 2018 10:03:21 -0200 Subject: [PATCH 5/6] =?UTF-8?q?Corrige=20espa=C3=A7o=20adicional=20nas=20t?= =?UTF-8?q?ags=20vBCST,=20pICMSST,=20vICMSST=20na=20modalidade=2010=20do?= =?UTF-8?q?=20BC=20ICMS=20ST?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pynfe/processamento/serializacao.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 96f4579..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 From 205e825b6490cad13f64aed320f912e5b679e3eb Mon Sep 17 00:00:00 2001 From: juniortada Date: Wed, 9 Jan 2019 19:43:42 -0200 Subject: [PATCH 6/6] [fix] add ES SVRS, atualizado url NFC-e ES --- pynfe/processamento/comunicacao.py | 2 +- pynfe/utils/webservices.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index fb52751..0cfdeb2 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -353,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', 'DF'] + 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/utils/webservices.py b/pynfe/utils/webservices.py index 25b02d7..abeb0e3 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': '',