Ir para conteúdo
  • Cadastre-se

dev botao

Rotina CancelarTransacoesPendentesClass retorna lista de TACBrTEFDRespostasPendentes incompleta


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

Recommended Posts

Boa tarde!

Com a rotina de SITEF preparada para cancelar transações pendentes ao inicializar o TEF, observei que se existirem mais de uma transação pendente para o mesmo DocumentoVinculado, as transações são devidamente canceladas, contudo, a lista de RespostasCanceladas não está sendo preenchida com todas as transações que foram canceladas pela rotina. Com isso, no evento OnDepoisCancelarTransacoes não é possível usar o argumento RespostasPendentes para dar um 
feedback para o operador sobre quais transações o sistema acabou de cancelar, pois neste caso o argumento retorna uma lista incompleta.

Sugiro efetuar o seguinte ajuste (que está colorido de azul) no método a seguir:

 procedure TACBrTEFDClass.CancelarTransacoesPendentesClass;
Var
  ArquivosVerficar    : TStringList ;
  RespostaCancela     : TACBrTEFDResp ;
  RespostasCanceladas : TACBrTEFDRespostasPendentes ;
  I, Topo             : Integer;
  JaCancelado         : Boolean ;
  ArqMask             : String;
begin
  GravaLog( Name +' CancelarTransacoesPendentesClass ');

  ArquivosVerficar    := TStringList.Create;
  RespostasCanceladas := TACBrTEFDRespostasPendentes.create(True);

  try
     ArquivosVerficar.Clear;
     RespostasCanceladas.Clear;

     { Achando Arquivos de Backup deste GP }
     ArqMask := TACBrTEFD(Owner).PathBackup + PathDelim + 'ACBr_' + Self.Name + '_*.tef' ;
     FindFiles( ArqMask, ArquivosVerficar, True );

     { Vamos processar primeiro os CNCs e ADMs, e as Não Confirmadas }
     I    := ArquivosVerficar.Count-1 ;
     Topo := 0 ;
     while I > Topo do
     begin
        Resp.LeArquivo( ArquivosVerficar[ I ] );

        if (pos(Resp.Header, 'CNC,ADM') > 0) or (not Resp.CNFEnviado) then
         begin
           ArquivosVerficar.Move(I,Topo);
           Topo := Topo + 1;
         end
        else
           I := I - 1 ;
     end;

     { Adicionando Arquivo de Resposta deste GP (se ainda não foi apagado) }
     if FileExists( ArqResp ) then
        ArquivosVerficar.Add( ArqResp );

     { Enviando NCN ou CNC para todos os arquivos encontrados }
     while ArquivosVerficar.Count > 0 do
     begin
        if not FileExists( ArquivosVerficar[ 0 ] ) then
        begin
           ArquivosVerficar.Delete( 0 );
           Continue;
        end;

        Resp.LeArquivo( ArquivosVerficar[ 0 ] );

        {  Verificando se essa Resposta já foi cancela em outro arquivo }
        JaCancelado := False ;
        I := 0 ;
        while (not JaCancelado) and (I < RespostasCanceladas.Count) do
        begin
           if (RespostasCanceladas[I] is TACBrTEFDRespTXT) or
              (Tipo = gpVeSPague) then
            begin
              with RespostasCanceladas[I] do
              begin
                 JaCancelado := (Resp.Rede        = Rede)        and
                                (Resp.NSU         = NSU)         and
                                (Resp.Finalizacao = Finalizacao) and
                                (Resp.ValorTotal  = ValorTotal) ;
              end;
            end
           else
            begin
              with RespostasCanceladas[I] do
              begin
                 JaCancelado := (Resp.DocumentoVinculado = DocumentoVinculado) ;

                 // Se a resposta já foi cancelada em outro arquivo, adiciona a lista de respostas canceladas para que no evento
                 // OnDepoisCancelarTransacoes a lista retornada no argumento RespostasCanceladas esteja devidamente preenchida com todas transações canceladas.
                 
if JaCancelado then
                 begin
                   RespostaCancela := CriarResposta( Tipo );
                   RespostaCancela.Assign( Resp );
                   RespostasCanceladas.Add( RespostaCancela );
                 end;

              end;
            end;

           Inc( I ) ;
        end;

        if not JaCancelado then
         begin
           { Criando cópia da Resposta Atual }
           RespostaCancela := CriarResposta( Tipo );
           RespostaCancela.Assign( Resp );

           { Enviando NCN ou CNC }
           try
              with TACBrTEFD(Owner) do
              begin
                 if Assigned( OnAntesCancelarTransacao ) then
                 try
                    OnAntesCancelarTransacao( RespostaCancela ) ;
                 except
                    { Nao deixa exceptions em OnAntesCancelarTransacao interromper }
                 end;
              end;

              if Resp.CNFEnviado and (Resp.Header <> 'CHQ') then
               begin
                 if not CNC then
                    raise EACBrTEFDErro.Create('CNC nao efetuado') ;
               end
              else
                 NCN;

              DeleteFile( ArquivosVerficar[ 0 ] );
              ArquivosVerficar.Delete( 0 );

              { Adicionando na lista de Respostas Canceladas }
              RespostasCanceladas.Add( RespostaCancela );
           except
           end;
         end
        else
         begin
           DeleteFile( ArquivosVerficar[ 0 ] );
           ArquivosVerficar.Delete( 0 );
         end;
     end;

     with TACBrTEFD(Owner) do
     begin
       if Assigned( OnDepoisCancelarTransacoes ) then
          OnDepoisCancelarTransacoes( RespostasCanceladas );

       { TEF Auttar deve emitir msg apenas no Final de todos Desfazimentos }
       if Tipo = gpTefAuttar then
          if RespostasCanceladas.count > 0 then
             DoExibeMsg( opmOK, 'Transação TEF não Efetuada Reter o Cupom Fiscal!' ) ;
     end;
  finally
     ArquivosVerficar.Free;
     RespostasCanceladas.Free;
  end;
end;

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

@Bruno Siqueira.. não compreendi muito bem a modificação:

image.png

Se o documento já foi encontrado em RespostasCanceladas[I], porque precisamos adicionar ele novamente ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

@Daniel Simoes É justamente pelo fato da transação não ter sido adicionado anteriormente.

Observe que se tiver duas transações pendentes com o mesmo número de DocumentoVinculado a rotina cancela ambos logo no processamento do primeiro arquivo e o adiciona a lista. Contudo a segunda transação não é adicionada pelo pois já foi cancelado anteriormente e possui o mesmo DocumentoVinculado e com isso a lista que deveria conter dois registros tem apenas um. Dessa forma quando implemento o evento OnDepoisCancelarTransacoes para listar as transações canceladas, apenas 1 é exibido sendo que foram 2 transações canceladas.

Link para o comentário
Compartilhar em outros sites

@Daniel Simoes, por algum motivo não consegui editar o último post, então resolvi posta uma nova resposta...

O motivo pelo qual precisamos adicionar a transação à lista é justamente pelo fato de uma das transações não ter sido adicionada.

Observe que se tiver duas transações pendentes com o mesmo número de DocumentoVinculado a rotina cancela ambos logo no processamento do primeiro arquivo e adiciona os dados desse primeiro arquivo a lista. Contudo a segunda transação não é adicionada a lista apesar de ter sido cancelada através do processamento do primeiro arquivo que possui o mesmo DocumentoVinculado e com isso a lista que deveria conter dois registros tem apenas um.
Dessa forma quando implemento o evento OnDepoisCancelarTransacoes uma rotina para listar as transações canceladas, apenas uma transação é exibida sendo que na verdade houveram duas transações canceladas.

Agora respondendo diretamente seu questionamento, na verdade a transação em questão não foi de fato encontrada em RespostasCanceladas[I], o que foi encontrada foi a primeira transação cancelada que contem o mesmo DocumentoVinculado.  Se essa segunda transação não for adicionada conforme sugestão, a lista RespostasCanceladas não vai possuir todas as transações canceladas.

Exemplo:

* Realizo uma venda de 100,00;

  1. Passo a primeira transação SiTef de 40,00 no cartão de credito MasterCard;
  2. A transação é aprovada e fica pendente de confirmação;
  3. Passo a segunda transação SiTef de 60,00 no cartão Visa;
  4. A transação é aprovada e fica pendente de confirmação;
  5. Encerro a aplicação antes de confirmar as transações pendentes;
  6. Abro novamente a aplicação;
  7. Inicializo o TEF;
  8. A rotina CancelarTransacoesPendentesClass processa os cancelamentos das transações pendentes;
  9. Ambas as transações são canceladas corretamente;
  10. O evento OnDepoisCancelarTransacoes retorna apenas uma das transações canceladas no argumento RespostasCanceladas;

 

Qualquer dúvida, estou a disposição;

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1240 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.