Jump to content

Tratar Retorno NFSe ao enviar


fpasqueto
  • Este tópico foi criado há 1714 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 to comment
Share on other sites

  • Consultores

Bom dia

Tentou tratar no evento OnTransmitError do componente?

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

Link to comment
Share on other sites

  • 4 months later...

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 to comment
Share on other 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

Link to comment
Share on other 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

Link to comment
Share on other 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

Link to comment
Share on other 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

Link to comment
Share on other sites

  • 1 month later...

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 to comment
Share on other sites

  • 1 month later...
  • 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

Link to comment
Share on other 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 to comment
Share on other 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

Link to comment
Share on other 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 to comment
Share on other sites

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.