Ir para conteúdo
  • Cadastre-se

dev botao

MÉTODO : DistribuicaoDFe - COMO UTILIZAR ?


Ver Solução Respondido por Italo Giurizzato Junior,
  • Este tópico foi criado há 2261 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Companheiros

Gostaria de solicitar a ajuda de todos porque estou totalmente confuso!

Normalmente os nossos clientes fazem Manifestação das NFEs à eles destinadas utilizando ferramentas públicas e depois fazem download do xml utilizando recursos que cada um elegeu como ideal.

Depois utilizam recurso existente em nosso ERP para gerar uma Nota Fiscal de Entrada através da importação de arquivo XML.

Porém agora os clientes solicitaram que todos estes procedimentos sejam automáticos.
Assim, nosso Erp terá que ter a habilidade de :
- consultar notas fiscais destinadas ao CNPJ
- efetuar manifestação
- fazer download
- importar no ERP transformando-a em uma Nota Fiscal de Compra

Em 2014 eu havia criado um recurso específico para Consultar Nfe Destinadas e Efetuar Manifestação ( que não foi utilizado porque os clientes já estavam acostumados a usar outras ferramentas de suas preferências ).

Porém agora quando testo esta rotina antiga é exibida a seguinte mensagem de erro :
"Após 02/05/2017 o Web Service ConsultaNFeDest foi desativado pela SEFAZ.  Favor utilizar o método DistribuicaoDFe."
 
Assim gostaria de ajuda dos companheiros para entender exatamente o que devo alterar no procedimento de Inicial da Consulta utilizando este método : DistribuicaoDFe.

Abaixo estou postando o código-fonte de 2014.

Grato

 
CÓDIGO-FONTE DESENVOLVIDO EM 2014:  
  // PARAMETRO 1 : Indicador de NFe a ser Consultada
  //veja NT 2012/002 pág. 11 para identificar os valores possíveis 0 = Todas as NF-e; 1 = Somente as NF-e que ainda não tiveram manifestação do destinatário
  //    (Desconhecimento da operação, Operação não Realizada ou Confirmação da Operação); 2 = Idem anterior, incluindo as NF-e que também não tiveram a Ciência da Operação.*)
  stIndNFe := '0';

  // PARAMETRO 2 : Indicador do Emissor da NF-e
  //veja NT 2012/002 pág. 11 para identificar os valores possíveis /0 = Todos os Emitentes / Remetentes;
  //1 = Somente as NF-e emitidas por emissores / remetentes que não tenham a mesma raiz do CNPJ do destinatário (para excluir as notas fiscais de transferência entre filiais).
  stIndEmi := '0';

  // PARAMETRO 3 : Último NSU recebido pela Empresa veja NT 2012/002 pág. 11 para identificar os valores possíveis
  // Caso seja informado com zero, ou com um NSU muito antigo, a consulta retornará unicamente as notas fiscais que tenham sido recepcionadas nos últimos 15 dias.
  stUltNSU := qryUltimoNsu.FieldByName('NRO_NSU_ULTIMO').AsString;
  if Trim(stUltNSU) = '' then
    stUltNSU := '0';

  inInc          := 0;
  inNroPesquisa  := 0;
  inItemConsulta := 0;
  dmdModAcbrNFe.acbrNota.NotasFiscais.Clear;
  with dmdModAcbrNFe.acbrNota.WebServices.ConsNFeDest.retConsNFeDest do
    begin
      repeat
      // incremento item da pesquisa ( servirá apenas para determinar se trata-se da primeira pesquisa
      //                               visto que esta deverá ser utilizar o NSU da consulta anterior )
      inNroPesquisa := inNroPesquisa + 1;

      // pesquiso na sefaz
      try
            dmdModAcbrNFe.acbrNota.ConsultaNFeDest(stCNPJEmpresa,
                                     StrToIndicadorNFe(ok,stIndNFe),
                                     StrToIndicadorEmissor(ok,stIndEmi),
                                     stUltNSU);
      except on e : exception do
        if Trim(e.message) <> '' then
          begin
            stMsgErro := 'ATENÇÃO !'                                    + #13 + #13 +
                         'A SEFAZ recebeu o pedido de Consulta '        + #13 + #13 +
                         'Mas retornou a seguinte mensagem de erro : '  + #13 + #13 + '  ' + Trim(e.message);
            showmessage(stMsgErro);
          end
        else
          begin
            stMsgErro := 'ATENÇÃO !'                                    + #13 + #13 +
                         'A SEFAZ recebeu o pedido de Consulta '        + #13 + #13 +
                         'Mas retornou a seguinte mensagem de erro : '  + #13 + #13 +
                         '  ' +  Trim(dmdModAcbrNFe.acbrNota.WebServices.ConsNFeDest.retConsNFeDest.xMotivo);
            showmessage(stMsgErro);
          end
      end;

      for inInc := 0 to ret.Count - 1 do
        begin
          retorno :=  ret.Items[inInc];

          // inicializo dataset de inclusão do item
          if (not(retorno.resNFe = nil) and not(retorno.resNFe.chNFe = EmptyStr)) then
            if (Trim(retorno.resNFe.NSU) <> '') then
            begin
                // numero do NSU
                stNro_Nsu := retorno.resNFe.NSU;
                // nro. nota eletronica
                stNumNfEletronica := retorno.resNFe.chNFe;
                // cnpj
                stCnpj := retorno.resNFe.CNPJCPF;
                stCnpj := Copy(stCnpj,1,2) + '.' +
                          Copy(stCnpj,3,3) + '.' +
                          Copy(stCnpj,6,3) + '/' +
                          Copy(stCnpj,9,4) + '-' +
                          Copy(stCnpj,13,2) ;
                // razão social
                stRazaoSocial       := AnsiUpperCase(retorno.resNFe.xNome);
                // inscrição estadual
                stInscricao     := retorno.resNFe.IE;
                // data da emissão
                dtDataEmissao     := retorno.resNFe.dEmi
                // entrada ou saída
                case retorno.resNFe.tpNF of
                  tnEntrada: stTipoNfe := '0';  // entrada
                  tnSaida:   stTipoNfe := '1';  // saida
                end;
                // valor total da nota fiscal
                cyValorNota  := retorno.resNFe.vNF;
                // data da autorização
                dtDataAutoriza := retorno.resNFe.dhRecbto
                // código da situação da nfe
                stCodSituacaoNfe  := '';
                case retorno.resNFe.cSitNFe of
                  snAutorizado: stCodSituacaoNfe := '1';  // nfe autorizada
                  snDenegado:   stCodSituacaoNfe := '2';  // nfe denegada
                  snCancelado:  stCodSituacaoNfe := '3';  // nfe cancelada
                end;
                // Código da Situação da Manifestação do Destinatário
                case retorno.resNFe.cSitConf of
                  smdSemManifestacao:      stCodSituacaoManifestacao := '0';  // Sem Manifestação do Destinatario
                  smdConfirmada:           stCodSituacaoManifestacao := '1';  // Confirmada Operaçao
                  smdDesconhecida:         stCodSituacaoManifestacao := '2';  // Desconhecida
                  smdOperacaoNaoRealizada: stCodSituacaoManifestacao := '3';  // Operação não Realizada
                  smdCiencia:              stCodSituacaoManifestacao := '4';  // Ciencia
                end;

              except
                AddMensagem('Erro Gravando NSU : ' + stNro_Nsu);
                if qryIncItemConsulta.Transaction.InTransaction then
                  qryIncItemConsulta.Transaction.RollbackRetaining;
                Raise;
              end;
            end;
        end;

      stUltNSU := ultNSU;

      if (inItemConsulta > spnMaximoNotas.Value) then
        begin
          break;
        end;

      until (indCont = icNaoPossuiMaisDocumentos);
    end;

 

  • Consultores
Postado

Bom dia Carlos,

Pequenas alterações na sua rotina.

   ACBrNFe.DistribuicaoDFePorUltNSU( CodigodaUF, CNPJ, sUltimoNSU );

   sStat   := IntToStr(ACBrNFe.WebServices.DistribuicaoDFe.retDistDFeInt.cStat);
   sMotivo := ACBrNFe.WebServices.DistribuicaoDFe.retDistDFeInt.xMotivo;

   if ACBrNFe.WebServices.DistribuicaoDFe.retDistDFeInt.cStat = 137
   then sTemMais := 'N'
   else sTemMais := 'S';

   sUltimoNSU := ACBrNFe.WebServices.DistribuicaoDFe.retDistDFeInt.ultNSU;

Lembre-se que o método DistribuicaoDFe retorna resumos das notas e o XML completo das notas que foram manifestadas.

Logo ele substitui os métodos ConsNFeDest (que retornava somente o resumo) e DownLoadNFe (que retornava o XML completo da nota manifestada).

Sugiro que leia com muita atenção a Nota Técnica 2014/002 versão 1.02b que trata sobre o Webservice Distribuição DFe.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Sr. Italo

Inicialmente eu gostaria de agradecer a sua resposta.

Conforme sugerido eu li a Nota Técnica 2014/002 versão 1.02b.

Ficaram apenas as seguintes dúvidas :

1)-O procedimento normal, pelo que eu entendi, seria :
Primeiro : Consultar quais notas fiscais de terceiros foram emitidas para o meu CNPJ
Segundo  : Manifestar "Ciência da Operação" para a nota fiscal desejada
Terceiro : Finalmente fazer download do Xml desejado.
Então a questão é : o ACBR encapsulou todas estas tarefas dentro do Método : DistribuicaoDFePorUltNSU ou DistribuicaoDFePorChaveNFe ?
Isto é, o Acbr enviará automaticamente comando de "Ciência da Operação" ?

2)-Em 2014 quando fiz o desenvolvimento da Consulta por NSU , constatei que em caso da empresa ter diversas Notas Fiscais a ela destinadas, aparecia erro de "consumo indevido".
Assim, cheguei a definir que seriam consultadas de 20 e 20 notas.
A questão é : na prática o sr. tem observado este problema atualmente?

Grato

  • Consultores
Postado

Bom dia Carlos,

Os métodos DistribuicaoDFePorNSU, DistribuicaoDFePorUltNSU e DistribuicaoDFePorChaveNFe apenas consomem o Webservice do DistribuicaoDFe.

Sendo assim o retorno deles sempre será um XML contendo um resumo de uma nota não manifestada ou o XML completo de uma nota manifestada.

Para realizar a manifestação do destinatário que é um evento é um procedimento a parte.

Os métodos DistribuicaoDFePorNSU e DistribuicaoDFePorChaveNFe só vão retornar apenas um XML sendo este um resumo ou uma nota completa.

Já o método DistribuicaoDFePorUltNSU poderá retornar um Lote com até 50 XML, sendo estes resumos e ou notas completas.

Ao usar este método devemos informar o numero do Ultimo NSU por exemplo 1500.

Suponha que no retorno o Lote tenha 50 XML e os valores de ultNSU seja 1550 e maxNSU seja 1580.

Isso significa que devemos executar novamente o método DistribuicaoDFePorUltNSU passando o valor 1550 (pois o valor de maxNSU é maior que ultNSU).

Nessa segunda execução teremos como retorno um Lote com 30 XML e os valores de ultNSU será 1580 e de maxNSU também 1580.

Isso se nenhum fornecedor emitir uma nota nesse meio tempo.

Como os valore de ultNSU e maxNSU são iguais não faz sentido executar novamente o método, demos agora iniciar a manifestação de cada nota, lembrando que a manifestação é um evento que deve ser enviado para SEFAZ.

Lembre-se que existe 4 tipos de eventos de Manifestação do Destinatário ( favor ler a Nota Técnica 2012/002 versão 1.02 que trata sobre a Manifestação do Destinatário).

A minha sugestão é que aguarde uns 30 segundos entre uma execução e outra do DistribuicaoDFePorUltNSU.

Continuando o exemplo acima, após a manifestação das 80 notas devemos executar novamente o método DistribuicaoDFePorUltNSU informando como numero do Ultimo NSU o valor 1580.

Se tudo ocorrer conforme esperamos, você terá como retorno um Lote de 50 XML.

Atenção: não necessariamente as 50 primeiras notas manifestadas, lembre-se que se nesse meio tempo algum fornecedor emitiu alguma nota, nesse lote poderá conter o resumo dela.

Portanto poderá ser necessário não apenas 2 execuções do método e sim umas 3 para obter nos retornos os 80 XML das notas manifestadas.

Tudo vai depender da quantidade de notas que os fornecedores emitem contra o seu CNPJ.

Espero ter ajudado.

  • Curtir 2
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado (editado)

Sr. Italo

Muito obrigado pela resposta.

Entendi agora que providências vou realizar, conforme descrevo abaixo:

1)-Inicialmente utilizo o Método : DistribuicaoDFePorChaveNFe para verificar se a Chave de Nfe
   informada efetivamente existe na Sefaz.
   Se no retorno cStat = 138, considero que a chave da nota está correta.
2)-Depois eu Manifesto "Ciência da Operação" para esta Nota Fiscal da seguinte forma :
  acbrNota.EventoNFe.Evento.Clear;
  with acbrNota.EventoNFe.Evento.Add do
    begin
      // Chave da Nota Fiscal Eletrônica
      infEvento.chNFe               := edtChaveNfe.Text;
      // Cnpj do Detinatário ( empresa.CNPJ )
      infEvento.CNPJ                := qryEmpresa.FieldByName('CNPJ').AsString;
      // data da manifestação
      infEvento.dhEvento            := now;
      // tipo do evento
      infEvento.tpEvento          := teManifDestCiencia
      // orção responsável por receber o evento ( 91 - Ambiente Nacional )
      infEvento.cOrgao              := 91;
      //infEvento.descEvento          := stDescEvento;
      // Ambiente da Nota Fiscal Eletrônica
      infEvento.tpAmb  := taProducao
   end;
   boEventOAceito := False;
   acbrNota.EnviarEvento(1);
   with dmdModAcbrNFe.acbrNota.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento do
     begin
       if ((cStat = 128) or (cStat = 135) or (cStat = 136) or (cStat = 138))  then
          boEventOAceito :=  True;
     end;          
3)-Se a Manifestação tiver sido aceita , finalmente efetuo a baixa do Arquivo Xml:
   if (boEventOAceito) then
     begin
       acbrnfNota.WebServices.DownloadNFe.Executar;
       cdsNotaARQUIVOXML.AsString := acbrnfNota.WebServices.DownloadNFe.retDownloadNFe.XML;
     end;  

Seria basicamente esta a idéia?

Grato

Editado por carlos_augusto
  • Consultores
Postado

Carlos,

Você esta fazendo confusão e não leu a nota técnica com atenção.

Não existe mais os métodos ConsNFeDest e DownloadNFe, logo o seu item 3 não vai funcionar.

O método DistribuicaoDFePorChaveNFe não serve para checar se a nota existe ou não, ele serve para baixar o XML completo de uma nota informando a sua chave, desde que a mesma já tenha sido manifestada.

Por favor releia a minha postagem anterior, note que no exemplo que lhe passei faço referencia ao método DistribuicaoDFePorUltNSU, esse método serve tanto para retornar resumos das notas (que era a função do método ConsNFeDest) e retornar os XMLs completos das notas (que era a função do método DownloadNFe).

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • 4 semanas depois ...
Postado

Boa tarde, 

como tenho acesso ao XML completo através do DistribuicaoDFePorUltNSU ou outro método? Mesmo tendo manifestado a nota, só consegui gerar o XML resumido.

Desde já, obrigado.

  • Consultores
  • Solution
Postado

Bom dia,

Como dito em uma postagem anterior o método DistribuicaoDFePorUltNSU vai retornar tanto resumos quanto XML completos das notas, desde que estas forem previamente manifestadas pelo destinatário.

Vamos imaginar a seguinte situação:

Você passa o numero 30 como sendo o UltNSU e executa o método.

Como retorno você tem 50 resumos e os seguintes valores:

ultNSU = 80 e maxNSU = 860

Se você manifestar uma nota que consta no retorno, o NSU referente ao XML completo dessa nota será 861, ou seja, segue a sequencia.

Na segunda execução do DistribuicaoDFePorUltNSU você passa o valor 80 (que é o correto) para o parâmetro UltNSU.

Como retorno você tem 50 resumos e os seguintes valores:

ultNSU = 130 e maxNSU = 861

Me responda uma pergunta: quantas vezes você vai ter que executar o método sempre passando o numero do UltNSU retornado para obter o documento de NSU = 861 ?

Se você deseja um processo mais rápido você pode usar o método DistribuicaoDFePorChaveNFe onde você informa a chave da NF-e que foi manifestada previamente.

Espero ter ajudado.

  • Curtir 2
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • Administradores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Este tópico foi criado há 2261 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.