From 59b6cdae02dfa170f5f3e74de782e8b3e699dfca Mon Sep 17 00:00:00 2001 From: lmandala Date: Tue, 6 Nov 2018 11:16:48 -0300 Subject: [PATCH] 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