TadaSoftware / PyNFe

Projeto de biblioteca para fazer interface com o webservice de Nota Fiscal eletrônica para Python, disponível sob LGPL.
http://groups.google.com/group/pynfe
Other
426 stars 173 forks source link

Dúvida sobre consulta_nfe #275

Closed HiagoCardos closed 1 year ago

HiagoCardos commented 1 year ago

Essa função, "consulta_distribuição", ela realiza o download do XML?

con = ComunicacaoSefaz(uf, certificado, senha, homologacao)
xml = con.consulta_distribuicao(cnpj=CNPJ, chave=CHAVE)

Estava tentando utilizar ela para baixar o XML da chave, mas não obtive sucesso, ele encontra a chave certinho, e me entrega os dados corretos, mas quando vou usar a função para gerar XML não tenho sucesso, não demonstra erro nem nada, apenas não gera nada.

resposta = etree.fromstring(xml.content)
ns = {'ns': NAMESPACE_NFE}
zip_resposta = resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip', namespaces=ns)[0].text
des_resposta = DescompactaGzip.descompacta(zip_resposta)

E só como um extra, no caso desse método, é possivel baixar apenas os ultimos 3 meses, correto? Não sei se foi erro meu, ou se é limitação, mas pelos testes que fiz foi possivel dos ultimos 3 meses.

juniortada commented 1 year ago

Boa noite @HiagoCardos O que você quer dizer com: "mas quando vou usar a função para gerar XML não tenho sucesso" ? Seria "deszipar" o conteúdo da resposta? Quando você consulta uma DF-e pela chave o conteúdo não vem em formato .zip, somente em lotes de NSU. Outra dúvida, você está consultado DF-e do CNPJ emissor ou destinatário? O documento já teve manifestação do destinatário (ciência da operação)?

HiagoCardos commented 1 year ago

Não sabia que pela chave não gerava o XML, quando fui testar pelo NSU não tinha no banco do SEFAZ, pela chave ele encontrava normalmente, mas não me repassava nenhum valor. CNPJ que estou pesquisando é destinatário, se teve manifestação não sei confirmar, é de um cliente meu, mas acredito que sim, estava testando com notas de 3 meses atrás.

juniortada commented 1 year ago

@HiagoCardos eu falei que a resposta não vem compactada, mas pode variar de SEFAZ autorizador ou tamanho do xml. Como você sabe que consultando pela chave "pela chave ele encontrava normalmente, mas não me repassava nenhum valo."? Posta a consulta pesquisando pela chave e pelo nsu com conteúdo anonimizado. Como o seu CNPJ é o destinatário da DF-e você precisa manifestar "ciência da operação/confirmação da operação" para o xml ficar disponível para download. Exemplo: https://portal.fazenda.sp.gov.br/servicos/nfe/Paginas/Aplicativo-de-Manifesta%C3%A7%C3%A3o-do-Destinat%C3%A1rio.aspx

HiagoCardos commented 1 year ago

Mandei nessa imagem, parte da resposta que tenho, quando eu uso o descompactador que tem aqui, ele da um erro, mas ai provavelmente o motivo é o que você comentou, que não está compactado.

image

leogregianin commented 1 year ago

Só um comentário: porque não esse exemplo de fluxo para descompactar?

HiagoCardos commented 1 year ago

@leogregianin Esse precisa do NSU, e pelo NSU por algum motivo não encontra a nota no SEFAZ, não sei dizer o porque. Quando eu busco ele diz que o ultimo NSU é 000000000, e quando eu boto pra buscar o NSU 0, ele bloqueia por excesso de notas, mas quando eu mando buscar apenas 1 NSU, "1" mesmo sendo 1 ele não encontra, ou o correto "55789" salvo engano, ele diz que não encontra.

Quando eu busco a pela chave, e chega o NSU da chave, em sequencia busco o NSU dessa chave, não consigo encontrar nada.

E no caso do serviço que estou fazendo para o cliente, pela chave seria o modelo "ideal", pensei em buscar a chave, pegar o NSU dela e depois pesquisar novamente, mas como seria 2 pesquisas por vez, acabaria sendo inviavel, quando forem usadas muitas chaves.

juniortada commented 1 year ago

@HiagoCardos na imagem está vindo conteúdo compactado sim (conteúdo dentro da tag doczip). Outra ponto importante se você reparar o schema é um procNFe e não um resNFe (sua dúvida se precisava ou não manifestação do destinatário). Acho que o problema é só seguir corretamente esse fluxo para descompactar. Exemplo:

zip_resposta = resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip', namespaces=ns)[0].text
resposta_descompactado = DescompactaGzip.descompacta(zip_resposta)
texto_descompactado = etree.tostring(resposta_descompactado).decode('utf-8')

with open(f'{CHAVE}.xml', 'w+', encoding='UTF-8') as f:
  f.write(texto_descompactado)
HiagoCardos commented 1 year ago

@juniortada Deu certo, eu estava usando o metodo que consta aqui, e por este dava esse erro que comentei, troquei para o que você enviou, só adicionei 2 linhas a mais e funcionou corretamente.

# Gerar XML
resposta = etree.fromstring(xml.text.encode('utf-8'))
ns = {'ns': NAMESPACE_NFE}
zip_resposta = resposta.xpath('//ns:retDistDFeInt/ns:loteDistDFeInt/ns:docZip', namespaces=ns)[0].text
resposta_descompactado = DescompactaGzip.descompacta(zip_resposta)
texto_descompactado = etree.tostring(resposta_descompactado).decode('utf-8')

with open(f'{CHAVE}.xml', 'w+', encoding='UTF-8') as f:
    f.write(texto_descompactado)

Muito obrigado pela ajuda, @leogregianin Dentro do fluxo que você enviou, tinha a resposta, mas acabei nem vendo direito pois achei que era o mesmo modo de descompactação que eu estava utilizando, mas só quando o @juniortada enviou o código que vi corretamente, apesar da diferença ser minima, há diferença.