Browse Source

consulta distribuicao por chave e metodo de descompactar gzip

pull/51/head
lmandala 7 years ago
parent
commit
59b6cdae02
  1. 23
      pynfe/processamento/comunicacao.py
  2. 30
      pynfe/utils/descompactar.py
  3. 38
      tests/consulta_distribuicao.txt

23
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):

30
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)

38
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))
Loading…
Cancel
Save