Ir para conteúdo
  • Cadastre-se

dev botao

Tratar Retorno NFSe ao enviar


fpasqueto
  • Este tópico foi criado há 2310 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa tarde senhores.

Estou enfrentando algumas dificuldades ao trabalhar com o issnet Cuiabá-MT

Apos o comando enviar se houver algum erro seja ele qual for simplesmente o componente gera uma mensagem de erro e interrompe o ciclo da aplicação e como se um abort fosse executado, ontem dia 12/04/2017 por exemplo o servidor da prefeitura estava lento para processar as notas então ao enviar ele retornava uma mensagem em branco, gostaria de saber se existe alguma possibilidade de apos algum tipo de erro no envio eu conseguir fazer o tratamento descrito no código abaixo por exemplo.

        if ACBrNFSe1.Enviar(IntToStr(ANFSELote)) then 
        begin
          for i := 0 to ANFSEQTD -1 do
          begin
            if trim(ACBrNFSe1.NotasFiscais.Items.NFSe.CodigoVerificacao) <> '' then
            begin
              //ACBrNFSe1.NotasFiscais.Items.NFSe.
              DMGERVST.Socket.AppServer.GER_IniciaTransacao; // Inicia transação
              with cdsConsultaNFSE do
              begin
                Close;
                Params.Clear;
                Params.CreateParam(ftString,'NFSE_CODIGOVERIFICACAO',ptInput);
                Params.CreateParam(ftString,'NFSE_NOMEARQUIVO',ptInput);
                Params.CreateParam(ftString,'NFSE_NUMERO',ptInput);
                Params.CreateParam(ftString,'NFSE_PROTOCOLO',ptInput);
                Params.CreateParam(ftString,'STATUS',ptInput);
                Params.CreateParam(ftInteger,'ID_EMPRESA',ptInput);
                Params.CreateParam(ftInteger,'ID_FILIAL',ptInput);
                Params.CreateParam(ftString,'NFSE_RPS',ptInput);
                Params.CreateParam(ftString,'NFSE_SERIE',ptInput);

                CommandText:= ' UPDATE TAST_NFSE SET                                        '+#13+
                              '       NFSE_CODIGOVERIFICACAO   = :NFSE_CODIGOVERIFICACAO,   '+#13+
                              '       NFSE_NOMEARQUIVO         = :NFSE_NOMEARQUIVO,         '+#13+
                              '       NFSE_NUMERO              = :NFSE_NUMERO,              '+#13+
                              '       NFSE_PROTOCOLO           = :NFSE_PROTOCOLO,           '+#13+
                              '       STATUS                   = :STATUS                    '+#13+
                              '       WHERE ID_EMPRESA         = :ID_EMPRESA                '+#13+
                              '       AND ID_FILIAL            = :ID_FILIAL                 '+#13+
                              '       AND NFSE_RPS             = :NFSE_RPS                  '+#13+
                              '       AND NFSE_SERIE           = :NFSE_SERIE                '+#13;
                Params.ParamByName('NFSE_CODIGOVERIFICACAO').AsString   := ACBrNFSe1.NotasFiscais.Items.NFSe.CodigoVerificacao;
                Params.ParamByName('NFSE_NOMEARQUIVO').AsString         := ExtractFileName(ACBrNFSe1.NotasFiscais.Items.NomeArq);
                Params.ParamByName('NFSE_NUMERO').AsString              := ACBrNFSe1.NotasFiscais.Items.NFSe.Numero;
                Params.ParamByName('NFSE_PROTOCOLO').AsString           := ACBrNFSe1.NotasFiscais.Items.NFSe.Protocolo;
                Params.ParamByName('STATUS').AsString                   := ACBrNFSe1.NotasFiscais.Items.NFSe.Situacao;
                Params.ParamByName('ID_EMPRESA').AsInteger              := SisEmpresa;
                Params.ParamByName('ID_FILIAL').AsInteger               := SisFilial;
                Params.ParamByName('NFSE_RPS').AsString                 := ACBrNFSe1.NotasFiscais.Items.NFSe.IdentificacaoRps.Numero;
                Params.ParamByName('NFSE_SERIE').AsString               := IntToStr(ANFSENumeroSerie);
                Execute;
              end;
              DMGERVST.Socket.AppServer.GER_ConcretizaTransacao;
            end;
            {
            MemoDados.Lines.Add('Nome XML: '+ACBrNFSe1.NotasFiscais.Items.NomeArq);
            MemoDados.Lines.Add('Nota Numero: '+ACBrNFSe1.NotasFiscais.Items.NFSe.Numero);
            MemoDados.Lines.Add('Código de Verificação: '+ACBrNFSe1.NotasFiscais.Items.NFSe.CodigoVerificacao);
            }
          end;
        end
        else
        begin
          DMGERVST.Socket.AppServer.GER_IniciaTransacao; // Inicia transação
          with cdsConsultaNFSE do
          begin
            Close;
            Params.Clear;
            Params.CreateParam(ftString,'STATUS',ptInput);
            Params.CreateParam(ftInteger,'ID_EMPRESA',ptInput);
            Params.CreateParam(ftInteger,'ID_FILIAL',ptInput);
            Params.CreateParam(ftString,'NFSE_RPS',ptInput);
            Params.CreateParam(ftString,'NFSE_SERIE',ptInput);
            CommandText:= ' UPDATE TAST_NFSE SET                                        '+#13+
                          '       STATUS                   = :STATUS                    '+#13+
                          '       WHERE ID_EMPRESA         = :ID_EMPRESA                '+#13+
                          '       AND ID_FILIAL            = :ID_FILIAL                 '+#13+
                          '       AND NFSE_RPS             = :NFSE_RPS                  '+#13+
                          '       AND NFSE_SERIE           = :NFSE_SERIE                '+#13;
            Params.ParamByName('STATUS').AsString                   := '0';
            Params.ParamByName('ID_EMPRESA').AsInteger              := SisEmpresa;
            Params.ParamByName('ID_FILIAL').AsInteger               := SisFilial;
            Params.ParamByName('NFSE_RPS').AsInteger                := ANFSELote;
            Params.ParamByName('NFSE_SERIE').AsString               := IntToStr(ANFSENumeroSerie);
            Execute;
          end;
          DMGERVST.Socket.AppServer.GER_ConcretizaTransacao;
        end;

Link para o comentário
Compartilhar em outros sites

  • 4 meses depois ...

Bom dia

Estou com o mesmo problema, mas não tenho ideia de como tratar isso.

O código que uso esta abaixo. É bem simples, mas quero melhorar nessa questão de tratamento de erro.

Ai já me falaram que esse problema ai da mensagem em branco é por que registrou a nota lá no servidor, mas ela não retornou, ai me falaram para fazer a impressão assim mesmo. Mas não posso fazer isso sem ter certeza que a nota foi registrada no servidor. E outra, não vou ter o protocolo.

Achei no fórum que dizem para usar o comando ACBrNFSe.NotasFiscais.Items[0].NFSe.Situacao

// 1 = Não Recebido
// 2 = Não Processado
// 3 = Processado com Erro
// 4 = Processado com Sucesso

Alguém pode me dar uma luz?

Por favor.

 If ACBrNFSe.Enviar(vLote, False) then
 begin
  MQNFSeDescricaoServico.AsString := vDescServico;
  MQNFSeBaseCalculo.AsCurrency := vBaseCalculo;
  MQNFSeValorISSQN.AsCurrency := vValorISS;
  MQNFSeValorISSQNRetido.AsCurrency := vValorISSRetido;
  MQNFSeTotalNota.AsCurrency := vTotal;
  MQNFSeCodigoVerificacao.AsString := ACBrNFSe.NotasFiscais.Items[0].NFSe.CodigoVerificacao;
  MQNFSeNumeroNota.AsString := ACBrNFSe.NotasFiscais.Items[0].NFSe.Numero;
  MQNFSeDataEmissaoNota.AsDateTime := ACBrNFSe.NotasFiscais.Items[0].NFSe.DataEmissao;
  MQNFSeNumeroRPS.AsString := ACBrNFSe.NotasFiscais.Items[0].NFSe.IdentificacaoRps.Numero;
  MQNFSeSerieRPS.AsString := ACBrNFSe.NotasFiscais.Items[0].NFSe.IdentificacaoRps.Serie;
  MQNFSeDataEmissaoRPS.AsDateTime := ACBrNFSe.NotasFiscais.Items[0].NFSe.DataEmissaoRps;
  MQNFSe.Post;
  MQNFSe.CommitUpdates;
  CDSServicosTemp.First;
  While not CDSServicosTemp.Eof do
  begin
   MQNFSeItens.Append;
   MQNFSeItensCodigoNota.AsInteger := MQNFSeCodigo.AsInteger;
   MQNFSeItensIdServico.AsInteger := CDSServicosTempIdServico.AsInteger;
   MQNFSeItensCodigoServico.AsString := CDSServicosTempCodigoServico.AsString;
   MQNFSeItensQuantidade.AsFloat := CDSServicosTempQuantidade.AsFloat;
   MQNFSeItensValorUnitario.AsFloat := CDSServicosTempValorUnitario.AsFloat;
   MQNFSeItensValorTotal.AsFloat := CDSServicosTempValorTotal.AsFloat;
   MQNFSeItensValorDesconto.AsFloat := CDSServicosTempValorDesconto.AsFloat;
   MQNFSeItensDescricao.AsString := CDSServicosTempDescricao.AsString;
   MQNFSeItensHoras.Value := CDSServicosTempHoras.Value;
   MQNFSeItensSigla.AsString := CDSServicosTempSigla.AsString;
   MQNFSeItens.Post;
   MQNFSeItens.CommitUpdates;
   CDSServicosTemp.Next;
  end;
  If MQAux.Active then
   MQAux.Close;

  MQAux.SQL.Text := 'update ordem_servico set NotaFiscal = ' +
   MQNFSeNumeroNota.AsString + ', NFEmitida = "Sim" where (' +
   FormSelecionaOSNFSe.vCodOrc + ')/* and (cod_emp = ' +
   Dtm.QueryEmpresaIdCodigo.AsString + ')*/';
  //Clipboard.AsText := MQAux.SQL.Text;
  MQAux.Execute;
 end;
 ImpressaoNota('I');

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia,

O problema é o provedor para onde o RPS é enviado.

Se ele segue a versão 1 da ABRASF temos a situação ao consultar a situação do lote.

Se ele segue a versão 2 da ABRASF temos a situação ao consultar o lote.

Agora se ele não segue o layout da ABRASF, cada um é de um jeito.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Consultores

O provedor ISSNet segue a versão 1 do layout da ABRASF, neste caso você só vai saber a situação executando o método ConsultaSituacao.

    function ConsultarSituacao(AProtocolo: String;   const ANumLote: String = ''): Boolean;
 

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Consultores

Você tem o protocolo no retorno do envio.

Ao Enviar temos como resposta o Protocolo que usamos para Consultar a Situação, se a situação for 3 ou 4 devemos Consultar o Lote.

Se a situação for 4 ao Consultar o Lote teremos como retorno o XML da NFS-e e se for 3 teremos a lista de rejeições.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Consultores

Ou você atribui o valor True a propriedade ConsultarLoteAposEnvio, desta forma o componente se encarrega de executar os métodos na sequencia correta e de forma automatizada.

Ou você executa um método de cada vez na ordem que mencionei e vai tratando as respostas.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...

Estou tento problemas para tratar erros de NFSe também. Quando envio dá um erro que o Try pega, mas não tem mensagem  de erro em E.message... Não traz erros também na propriedade ErroRegrasdeNegocios do componente... 

Algum lugar a mais que eu possa saber o erro retornado ao executar o Enviar() da NFSe?

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Consultores

Bom dia Andrei,

O retorno vazio ocorre em qual momento (Envio, consulta, cancelamento)?

Qual provedor?

O problema surgiu de uma hora para outra?

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

3 horas atrás, Italo Jurisato Junior disse:

Bom dia Andrei,

O retorno vazio ocorre em qual momento (Envio, consulta, cancelamento)?

Qual provedor?

O problema surgiu de uma hora para outra?

Boa tarde Italo,

Estou utilizando o provedor ISSNet que é responsável pelas notas de Cuiabá-MT.

O componente está setado com a propriedade ConsultaLoteAposEnvio como True, ou seja, o próprio componente faz todo o processo de envio e consulta da autorização da nota no webservice.

O retorno vazio está sendo retornado no momento em que o componente faz a consulta da nota no webservice.

Este problema surgiu a uns 5 meses atrás de uma hora para outra.

Para contornar este problema, ao obter um retorno vazio, forço meu sistema a realizar uma consulta novamente no webservice e obtenho sucesso. Mas tem muitas vezes que a consulta retorna que a nota é inexistente na prefeitura. Tem vezes que demora cerca de 2 horas para que eu possa solicitar novamente um envio do mesmo RPS para o webservice e assim obtenho sucesso.

Teria alguma outra solução? 

Desde já obrigado.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde Andrei,

Você pode mudar os valores das propriedades:

Tentativas, IntervaloTentativas, AguardarConsultaRet.

Tentativas se refere a quantidade de vezes que o componente vai consultar o Lote para obter o resultado do processamento.

IntervaloTentativas é o tempo em milisegundos entre uma consulta e outra.

AguardarConsultaRet é o tempo em milisegundos que o componente vai aguardar antes de realizar a primeira consulta ao Lote.

Agora em em alguns casos chega demorar 2 horas, ai o problema é no provedor.

Consultor SAC ACBr

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

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

7 minutos atrás, Italo Jurisato Junior disse:

Boa tarde Andrei,

Você pode mudar os valores das propriedades:

Tentativas, IntervaloTentativas, AguardarConsultaRet.

Tentativas se refere a quantidade de vezes que o componente vai consultar o Lote para obter o resultado do processamento.

IntervaloTentativas é o tempo em milisegundos entre uma consulta e outra.

AguardarConsultaRet é o tempo em milisegundos que o componente vai aguardar antes de realizar a primeira consulta ao Lote.

Agora em em alguns casos chega demorar 2 horas, ai o problema é no provedor.

Boa tarde Italo,  

Entendi. Vou mudar estas propriedades e ver se resolve. 

Muito obrigado por enquanto.

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2310 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.