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.utils.webservices import NFE, NFCE, NFSE
from pynfe.entidades.certificado import CertificadoA1 from pynfe.entidades.certificado import CertificadoA1
from .assinatura import AssinaturaA1 from .assinatura import AssinaturaA1
from pynfe.utils.descompactar import DescompactaGzip
class Comunicacao(object): class Comunicacao(object):
@ -167,7 +168,7 @@ class ComunicacaoSefaz(Comunicacao):
# url # url
url = self._get_url_an(consulta='DISTRIBUICAO') url = self._get_url_an(consulta='DISTRIBUICAO')
# Monta XML para envio da requisição # 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) etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente)
if self.uf: if self.uf:
etree.SubElement(raiz, 'cUFAutor').text = CODIGOS_ESTADOS[self.uf.upper()] etree.SubElement(raiz, 'cUFAutor').text = CODIGOS_ESTADOS[self.uf.upper()]
@ -175,15 +176,19 @@ class ComunicacaoSefaz(Comunicacao):
etree.SubElement(raiz, 'CNPJ').text = cnpj etree.SubElement(raiz, 'CNPJ').text = cnpj
else: else:
etree.SubElement(raiz, 'CPF').text = cpf 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) 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) return self._post(url, xml)
def consulta_cadastro(self, modelo, cnpj): 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