-
Notifications
You must be signed in to change notification settings - Fork 173
Fluxo da Consulta de Distribuicao por NSU
Leonardo Gregianin edited this page Aug 6, 2022
·
1 revision
Consulta distribuição de DF-e retornando uma lista de todos os XMLs do fornecedor:
from pynfe.processamento.comunicacao import ComunicacaoSefaz
from pynfe.utils.descompactar import DescompactaGzip
from pynfe.utils.flags import NAMESPACE_NFE
from lxml import etree
certificado = "/home/user/certificado.pfx"
senha = 'senha'
uf = 'uf'
homologacao = True
CPFCNPJ = ''
NSU = 0
CHAVE = ''
con = ComunicacaoSefaz(uf, certificado, senha, homologacao)
ultNSU = 0
maxNSU = 0
cStat = 0
while True:
xml = con.consulta_distribuicao(cnpj=CPFCNPJ, chave=CHAVE, nsu=NSU)
NSU = str(NSU).zfill(15)
print(f'Nova consulta a partir do NSU: {NSU}')
resposta = etree.fromstring(xml.text.encode('utf-8'))
ns = {'ns': NAMESPACE_NFE}
contador_resposta = len(resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip', namespaces=ns))
print(f'Quantidade de NSUs na consulta atual: {contador_resposta}')
cStat = resposta.xpath('//ns:retDistDFeInt/ns:cStat', namespaces=ns)[0].text
print(f'cStat: {cStat}')
xMotivo = resposta.xpath('//ns:retDistDFeInt/ns:xMotivo', namespaces=ns)[0].text
print(f'xMotivo: {xMotivo}')
maxNSU = resposta.xpath('//ns:retDistDFeInt/ns:maxNSU', namespaces=ns)[0].text
print(f'maxNSU: {maxNSU}')
# 137=nao tem mais arquivos e 138=existem mais arquivos para baixar
if (cStat == '138'):
for contador_xml in range(contador_resposta):
tipo_schema = resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip/@schema', namespaces=ns)[contador_xml]
numero_nsu = resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip/@NSU', namespaces=ns)[contador_xml]
#nfe = 'procNFe_v4.00.xsd'
#evento = 'procEventoNFe_v1.00.xsd'
#resumo = 'resNFe_v1.01.xsd'
if (tipo_schema == 'procNFe_v4.00.xsd'):
zip_resposta = resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip', namespaces=ns)[contador_xml].text
resposta_descompactado = DescompactaGzip.descompacta(zip_resposta)
texto_descompactado = etree.tostring(resposta_descompactado).decode('utf-8')
with open(f'./consulta_distrib-nsu-{NSU}-contador-{contador_xml}.xml', 'w+', encoding='UTF-8') as f:
f.write(texto_descompactado)
# baixar o resumo e realizar a manifestacao do destinatario
elif (tipo_schema == 'resNFe_v1.01.xsd'):
zip_resposta = resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip', namespaces=ns)[contador_xml].text
# XML completo do resumo
resposta_descompactado = DescompactaGzip.descompacta(zip_resposta)
# Ler chave de acesso do resumo
chave_acesso_nfe = resposta_descompactado.xpath('//ns:resNFe/ns:chNFe', namespaces=ns)[0].text
# Gerar ciência da operação
# https://github.com/TadaSoftware/PyNFe/wiki/Manifesta%C3%A7%C3%A3o-Destinat%C3%A1rio
NSU = resposta.xpath('//ns:retDistDFeInt/ns:ultNSU', namespaces=ns)[0].text
print(f'NSU: {NSU}')
elif (cStat == '137'):
print(f'Não há mais documentos a pesquisar')
break
else:
print(f'Falha')
break