Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Pessoal,

Estou aqui fazendo os testes da pré-certificação do V&S Pague via background. Tenho algumas dúvidas e gostaria de usar esse tópico para saná-las. Ficarei muito grato se alguém de vocês puder me ajudar.

A primeira delas é a seguinte: pré-teste 1.1.2.1

Procedimento: Realizar uma transação de Crédito no valor de R$ 900,00. Desligar a ECF no Comprovante Vinculado (CCD) e após exibir a mensagem “Erro na impressão. Deseja tentar novamente? . ” Desligar o Computador. Após o retorno da energia, manter a ECF Desligada e iniciar a Automação.

Resultado esperado: A automação deve solicitar o desfazimento da Transação TEF e exibir a seguinte mensagem “A(s) trasanção(s) TEF NSU: XXXXXX e Valor: XX,XX está PENDENTE. Favor realizar o DESFAZIMENTO no menu administrativo. Cancelar o cupom fiscal ! ” - ao confirmar essa mesagem a automação deve abrir o menu ADM - transações pedentes, para DESFAZER a transação.

Observação: A automação deve realizar o tratamento independente de a ECF estar ligada ou não.

Se eu simplesmente inicializar o TEF ao abrir o aplicativo o ACBrTEFD entra no ADM e me dá a opção de confirmar, desfazer ou fechar o diálogo. Mas infelizmente a mensagem não é exibida. Então creio que eu mesmo tenho que fazer isso.

Gostaria que os colegas pudessem me dizer se existe um evento específico pra fazer isso, e/ou como fazer isso.

Obrigado.

Itamar Bermond

Ibersoft Sistemas
Governador Valadares, MG

  • Respostas 66
  • Created
  • Última resposta

Top Posters In This Topic

Postado

Se a transação TEF estiver pendente (ou seja, se o arquivo dela ainda existir no diretório de Backup) o próprio ACBRTEFD chamará o cancelamento quando for inicializado

Sim, exatamente. Mas o roteiro fala de uma mensagem. Eu coloquei a mensagem no evento OnAntesCancelarTransacao e está funcionando, mas tenho dúvidas de que é exatamente assim:

procedure TfrmPrincipal.acbrTEFAntesCancelarTransacao(RespostaPendente: TACBrTEFDResp);

const

  sAviso = 'A transação TEF NSU: %s e valor: %s está pendente. Favor realizar o desfazimento no Menu Administrativo e cancelar o Cupom Fiscal.';

var

  Estado: TACBrECFEstado;

begin

  Estado := ECF.Estado;


  if RespostaPendente.ValorTotal > 0 then

    MyDlgInformation(Format(sAviso, [RespostaPendente.NSU, FormatFloat(',0.00', RespostaPendente.ValorTotal)]));


  case Estado of

    estVenda, estPagamento: ECF.CancelaCupom;

    estRelatorio: ECF.FechaRelatorio;

  else

    if not (Estado in [estLivre, estDesconhecido, estNaoInicializada]) then

      ECF.CorrigeEstadoErro(False);

  end;

end;

Outra coisa: o teste seguinte me manda apenas fechar o diálogo sem tratar, e fechar a aplicação. Quando voltar, a aplicação deve mostrar novamente a pendência. Acontece que não mostra. Parece que está limpando os dados.

Itamar Bermond

Ibersoft Sistemas
Governador Valadares, MG

  • Fundadores
Postado

Itamar,

Isso não é necessário... Veja o código de procedure TACBrTEFDVeSPague.Inicializar;

fpInicializado := True ;

GravaLog( Name +' Inicializado VeSPague' );

ServicoIniciar;

CancelarTransacoesPendentesClass ;

end;

Do jeito que você implementou ele irá pedir para confirmar sempre... e em alguns casos é necessário comandar o cancelamento automático...

Talvez fazer uma verificação em TACBrTEFDVeSPague.Inicializar, antes de chamar o CancelarTransacoesPendentesClass

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.

Postado

No VeSPague é o seguinte:

Caso o client deles reinicie (queda de energia, travamentos, etc), as transações pendentes não podem ser canceladas "automaticamente".

As transações precisam ser canceladas pelo comando ADM. Eu uso da seguinte forma:

Removi o CancelarTransacoesPendentesClass do metodo Inicializar do componente, e no lugar eu chamo um metodo que criei que faz o seguinte:

Varre os arquivos de backup do TEF, monta uma mensagem, exibe ao operador, e entra em um loop de envios de ADM até que o ADM retorno que não existem mais transações pendentes.

Se voce apenas enviar um NCN ou CNC a transação NÃO É TRATADA.

Resumindo: Se o client deles não fechar... vc pode enviar NCN ou CNC (que é o q o CancelarTransacoesPendentes faz), caso contrario, apenas via comando ADM (solicitando inclusive usuário e senha do estabelecimento).

Eu mudei para o background a pouco tempo, tenho algumas coisas que mudei no componente para me atender melhor, problema está em conseguir tempo para organizar um pouco o código e enviar para o pessoal adaptar.

  • 1 mês depois ...
Postado

No VeSPague é o seguinte:

Caso o client deles reinicie (queda de energia, travamentos, etc), as transações pendentes não podem ser canceladas "automaticamente".

As transações precisam ser canceladas pelo comando ADM. Eu uso da seguinte forma:

Removi o CancelarTransacoesPendentesClass do metodo Inicializar do componente, e no lugar eu chamo um metodo que criei que faz o seguinte:

Varre os arquivos de backup do TEF, monta uma mensagem, exibe ao operador, e entra em um loop de envios de ADM até que o ADM retorno que não existem mais transações pendentes.

Se voce apenas enviar um NCN ou CNC a transação NÃO É TRATADA.

Resumindo: Se o client deles não fechar... vc pode enviar NCN ou CNC (que é o q o CancelarTransacoesPendentes faz), caso contrario, apenas via comando ADM (solicitando inclusive usuário e senha do estabelecimento).

Eu mudei para o background a pouco tempo, tenho algumas coisas que mudei no componente para me atender melhor, problema está em conseguir tempo para organizar um pouco o código e enviar para o pessoal adaptar.

Eddie, estou fazendo a minha homologação com o VeSPague também e creio estar passando por um problema similar... a minha situação é que quando é feita uma transação com dois cartões e a impressora é desligada na impressão da 1a. via do 2o. comprovante, o ACBR até chama o NCN, mas a transação não é desfeita, no entanto, neste ponto o sistema tem que desfazer a transação automaticamente e não chamar o ADM. Como você solucionou isso ? teste 15.8 do roteiro de testes da VeSPague.

[]'s

Postado

Eu dei um tempo no desenvolvimento do TEF para o V&S Pague, e logo depois tirei férias. Agora estou retomando o desenvolvimento e quero terminar.

Peço por favor aos colegas que homologaram: ajudem postando suas alterações para que o Daniel possa incluí-las no código do ACBr.

Obrigado! Obrigado!

Itamar Bermond

Ibersoft Sistemas
Governador Valadares, MG

Postado

Sou novo no forum e estou desenvolvendo um TEF Dedicado V&SPague usando o componente ACBr e estou com algumas dúvidas:

É melhor desenvolver o TEF V&SPague para Background ou Foreground ? Quais as vantagens e desvantagens de cada um?

Obrigado!

Postado

Pessoal,

O teste Pré-Certificação da Cielo com o V&S Pague, no passo 1.1.2.1a diz o seguinte:

Procedimento:

Realizar uma transação de Crédito no valor de R$ 900,00. Desligar a ECF no Comprovante Vinculado (CCD) e após exibir a mensagem “Erro na impressão. Deseja tentar novamente? . ” Desligar o Computador. Após o retorno da energia, manter a ECF Desligada e iniciar a Automação.

Resultado esperado:

Procedimento semelhante ao teste anterior (texto do teste anterior: "A automação deve solicitar o desfazimento da Transação TEF e exibir a seguinte mensagem “A(s) trasanção(s) TEF NSU: XXXXXX e Valor: XX,XX está PENDENTE. Favor realizar o DESFAZIMENTO no menu administrativo. Cancelar o cupom fiscal ! ” - ao confirmar essa mesagem a automação deve abrir o menu ADM - transações pedentes, para DESFAZER a transação."), mas: AO ABRIR A TELA COM A TRANSAÇÃO PENDENTE FECHE SEM TRATAR, E REINICIA A APLICAÇÃO, A APLICAÇÃO DEVE APRESENTAR A MENSAGEM NOVAMENTE.

Observações:

"Duas opções: 1- Ao fechar a tela com a transação pendente, deve solicitar o usuário e senha novamnete para que seja realizado o tratamento da transação. Impedindo que o operador saia do fluxo sem tratar. 2. Ao fechar a janela com a transação pendente, não deve permitir abrir a o caixa, toda vez que tentar abrir o caixa irá apresentar a mesma mensagem, até que seja resolvido."

Eu pergunto: qual método do ACBrTEFD eu uso pra saber se tem transação pendente para poder abrir novamente o ADM? Eu fiz um teste usando o RespostasPendentes.Count mas ele não me dá a informação.

Agradeço qualquer ajuda.

Itamar Bermond

Ibersoft Sistemas
Governador Valadares, MG

Postado

O TEFD já faz isso automáticamente no Inicializar... (que deve ser chamado no Inicio do seu programa)

Ele simplesmente chama:

CancelarTransacoesPendentesClass

Sim, ele realmente chama no inicializar.

Mas aqui comigo está acontecendo o seguinte: após o desligamento, ao religar a máquina entrar no PAF-ECF, o TEFD chama o ADM. Mas o teste manda fechar sem tratar para que o sistema chame novamente o ADM. É isso que não acontece. Esse loop não é feito pelo TEFD. O PAF-ECF tem que implementar isso?

Mais um detalhe. Se eu fecho o ADM sem tratar e logo em seguida fecho o PAF-ECF, ao reabrir o PAF-ECF o ADM não é chamado.

Eu devo estar fazendo alguma coisa errada em algum lugar. Eu uso o seguinte código ao iniciar o PAF-ECF:

    try

      TEF.Inicializar(gpVeSPague);


      (* esse código comentado não resolve o problema

      while TEF.RespostasPendentes.Count > 0 do

      begin

        MyDlgInformation('Existem respostas pendentes não tratadas.');

        TEF.ADM(gpVeSPague);

      end;

      *)


    except

      on E: Exception do

      WriteLog('Ativação do TEF V&S Pague: ' + E.Message);

    end;

Está faltando alguma coisa?

Obrigado.

Itamar Bermond

Ibersoft Sistemas
Governador Valadares, MG

Postado

Daniel, o Moises da Cemay que faz homologação remota de Vespague, me disse que para efetuar o cancelamento de transações efetuadas não é necessário que a aplicação colha as informações de Rede, NSU, Data, Hora e Valor e que eu devo tirar isso, eu peguei o exemplo do ACBRTEFDemo e la ele usa esse form que tem esses campos. Para que eu possa fazer o cancelamento sem informar esses dados é soh deixar e exibir o form e chamar direto o método

ACBrTEFD1.CNC('','',date(),0)

?

[]'s

  • Fundadores
Postado

O ACBrTEFD é projetado para compatibilizar vários TEFs diferentes com o TEF discado... por isso a assinatura do comando tem todos esses parâmetros...

Analise os fontes do arquivo... ACBrTEFDVeSPague.pas tudo que ele usa é o NSU


Function TACBrTEFDVeSPague.CNC(Rede, NSU : String;
DataHoraTransacao : TDateTime; Valor : Double) : Boolean;
var
Retorno : Integer;
ListaParams : AnsiString ;
begin
ListaParams := '' ;
if NSU '' then
ListaParams := 'transacao_nsu="'+Trim(NSU)+'"';

Retorno := FazerRequisicao( fTransacaoCNC, 'CNC', Valor, '', ListaParams ) ;

if Retorno = 0 then
Retorno := ContinuarRequisicao( True ) ; { True = Imprimir Comprovantes agora }

Result := ( Retorno in [0,1] ) ;

ProcessarResposta ; { Faz a Impressão e / ou exibe Mensagem ao Operador }
end;
[/code]

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.

Postado

O ACBrTEFD é projetado para compatibilizar vários TEFs diferentes com o TEF discado... por isso a assinatura do comando tem todos esses parâmetros...

Analise os fontes do arquivo... ACBrTEFDVeSPague.pas tudo que ele usa é o NSU


Function TACBrTEFDVeSPague.CNC(Rede, NSU : String;

DataHoraTransacao : TDateTime; Valor : Double) : Boolean;

var

Retorno : Integer;

ListaParams : AnsiString ;

begin

ListaParams := '' ;

if NSU <> '' then

ListaParams := 'transacao_nsu="'+Trim(NSU)+'"';


Retorno := FazerRequisicao( fTransacaoCNC, 'CNC', Valor, '', ListaParams ) ;


if Retorno = 0 then

Retorno := ContinuarRequisicao( True ) ; { True = Imprimir Comprovantes agora }


Result := ( Retorno in [0,1] ) ;


ProcessarResposta ; { Faz a Impressão e / ou exibe Mensagem ao Operador }

end;

Daniel, o negócia ta nessa function mesmo, o esquema é chamar a execução com tudo zerado e tirar a variavel ListaParams da jogada que dai a aplicação do Vespague pergunta o NSU. No meu caso ficou assim:

execução:

ACBrTEFD1.CNC('','',date(),0);

na function TACBrTEFDVeSPague.CNC alterei a linha:

Retorno := FazerRequisicao( fTransacaoCNC, 'CNC', Valor, '', ListaParams ) ;

para:

Retorno := FazerRequisicao( fTransacaoCNC, 'CNC', Valor, '', '' ) ;

Creio que será necessário alterar o SVN.

[]'s

Postado

Pessoal, segue minha rotina de tratamento de erros para o VeSPague que implementei para o modo background.

Se alguem puder analizar, modificar e colocar a rotina diretamente no componente, fique a vontade. Tempo aqui está bem apertado.

Uma breve explicacao do que eu fiz:

No procedure Inicializar ao inves de chamar o CancelarTransacoesPendentesClass, eu chamo minha procedure.

Ela le os arquivos de backup salvos pelo ACBR e forma uma string que sera exibida posteriormente ao operador.

Caso a mensagem seja exibida, a eu chamo o ADM de cancelamento dentro de um loop. Enquanto o retorno do client nao for que nao existem pendencias, a ADM é chamada novamente.

Isso seria para o caso de ter por ex 2 pendencias, e o operador tratar apenas 1.


procedure TACBrTEFDVeSPague.VerificarTransacoesPendentesClass;

Var

  ArquivosVerficar    : TStringList ;

  ArqMask             : String;

  Retorno: Integer;

  MsgPendencias: WideString;


begin

  GravaLog( Name +' VerificarTransacoesPendentesClass ');

  //exibe as pendencias

  ArquivosVerficar    := TStringList.Create;

  MsgPendencias := EmptyStr;


  try

     ArquivosVerficar.Clear;


     { Achando Arquivos de Backup deste GP }

     ArqMask := TACBrTEFD(Owner).PathBackup + PathDelim + 'ACBr_' + Self.Name + '_*.tef' ;

     FindFiles( ArqMask, ArquivosVerficar, True );


     { Adicionando Arquivo de Resposta deste GP (se ainda não foi apagado) }

     if FileExists( ArqResp ) then

        ArquivosVerficar.Add( ArqResp );


     { Monta a mensagem de todos os arquivos encontrados }

     if ArquivosVerficar.Count > 0 then

       begin

          MsgPendencias := 'Transações TEF a seguir estão PENDENTES:'+SLineBreak+SLineBreak;

       end

     ;


     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 }

        MsgPendencias := MsgPendencias+'Rede: '+Resp.Rede+SLineBreak+'NSU: '+Resp.NSU+SLineBreak+'Valor: '+FloatToStrF(Resp.ValorTotal, ffCurrency, 18, 2)+SLineBreak+SLineBreak;

        ArquivosVerficar.Delete( 0 );

     end;


     if MsgPendencias <> EmptyStr then

       begin

         MsgPendencias := MsgPendencias+'Favor realizar o DESFAZIMENTO no menu administrativo que será aberto a seguir.';

         TACBrTEFD(Owner).DoExibeMsg( opmOK, MsgPendencias);

       end

     ;

  finally

     ArquivosVerficar.Free;

  end;


  //verifica pendencias

  if MsgPendencias <> EmptyStr then

    begin

      Retorno := 0;

      while Retorno <> 1 do

        begin

          FazerRequisicao( fTransacaoPendente, 'ADM') ;

          if RespVS.Servico = 'executar' then

            begin

              Retorno := RespVS.Retorno;

            end

          ;

          if RespVS.IsColeta then Retorno := 0;

          if RespVS.GetParamString('mensagem') = 'Nao ha transacoes pendentes para este terminal.' then

            begin

              Retorno := 1;

            end

          ;

//          ShowMessage('Retorno: '+IntToStr(Retorno));

          ProcessarResposta ;         { Faz a Impressão e / ou exibe Mensagem ao Operador }

          sleep(250);

        end

      ;

      if Retorno = 0 then  Retorno := ContinuarRequisicao( True ) ;  { True = Imprimir Comprovantes agora }

    end

  ;


  //apaga os arquivos de backup das pendencias

  ArquivosVerficar    := TStringList.Create;


  try

     ArquivosVerficar.Clear;


     { Achando Arquivos de Backup deste GP }

     ArqMask := TACBrTEFD(Owner).PathBackup + PathDelim + 'ACBr_' + Self.Name + '_*.tef' ;

     FindFiles( ArqMask, ArquivosVerficar, True );



     { Adicionando Arquivo de Resposta deste GP (se ainda não foi apagado) }

     if FileExists( ArqResp ) then

        ArquivosVerficar.Add( ArqResp );


     { Apaga todos os arquivos encontrados }

     while ArquivosVerficar.Count > 0 do

     begin

        if not FileExists( ArquivosVerficar[ 0 ] ) then

        begin

           ArquivosVerficar.Delete( 0 );

           Continue;

        end;

        DeleteFile( PWideChar(ArquivosVerficar[ 0 ]) );

        ArquivosVerficar.Delete( 0 );

     end;

  finally

     ArquivosVerficar.Free;

  end;

end;

Postado

Complementando... o VeSPague não aceita CNC para transacoes pendentes apos o client ser reiniciado (reset do computador, ou fechar o client no tray). O cancelamento tem que ser feito pela funcao ADM (Administracao Pendente).

Postado

Será que tem como saber se o usuário confirmou ou cancelou transações pendentes dentro do ADM do Vespague ? Pois se o usuário cancelar comprovante TEF pendente, então o correto é comandar o cancelamento do cupom não fiscal e fiscal que estiver em aberto não seria ?

[]'s

  • Fundadores
Postado

Não... pois ele pode cancelar qualquer transação do dia, e não apenas a última...

Eu faço o contrário... quando cancelo o último cupom fiscal, verifico se houve pagamento com TEF, e dai sim, pergunto ao operador se ele quer cancelar a transação TEF

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.

Postado

Pessoal, segue minha rotina de tratamento de erros para o VeSPague que implementei para o modo background.

Se alguem puder analizar, modificar e colocar a rotina diretamente no componente, fique a vontade. Tempo aqui está bem apertado.

Uma breve explicacao do que eu fiz:

No procedure Inicializar ao inves de chamar o CancelarTransacoesPendentesClass, eu chamo minha procedure.

Ela le os arquivos de backup salvos pelo ACBR e forma uma string que sera exibida posteriormente ao operador.

Caso a mensagem seja exibida, a eu chamo o ADM de cancelamento dentro de um loop. Enquanto o retorno do client nao for que nao existem pendencias, a ADM é chamada novamente.

Isso seria para o caso de ter por ex 2 pendencias, e o operador tratar apenas 1.


procedure TACBrTEFDVeSPague.VerificarTransacoesPendentesClass;

Var

  ArquivosVerficar    : TStringList ;

  ArqMask             : String;

  Retorno: Integer;

  MsgPendencias: WideString;


begin

  GravaLog( Name +' VerificarTransacoesPendentesClass ');

  //exibe as pendencias

  ArquivosVerficar    := TStringList.Create;

  MsgPendencias := EmptyStr;


  try

     ArquivosVerficar.Clear;


     { Achando Arquivos de Backup deste GP }

     ArqMask := TACBrTEFD(Owner).PathBackup + PathDelim + 'ACBr_' + Self.Name + '_*.tef' ;

     FindFiles( ArqMask, ArquivosVerficar, True );


     { Adicionando Arquivo de Resposta deste GP (se ainda não foi apagado) }

     if FileExists( ArqResp ) then

        ArquivosVerficar.Add( ArqResp );


     { Monta a mensagem de todos os arquivos encontrados }

     if ArquivosVerficar.Count > 0 then

       begin

          MsgPendencias := 'Transações TEF a seguir estão PENDENTES:'+SLineBreak+SLineBreak;

       end

     ;


     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 }

        MsgPendencias := MsgPendencias+'Rede: '+Resp.Rede+SLineBreak+'NSU: '+Resp.NSU+SLineBreak+'Valor: '+FloatToStrF(Resp.ValorTotal, ffCurrency, 18, 2)+SLineBreak+SLineBreak;

        ArquivosVerficar.Delete( 0 );

     end;


     if MsgPendencias <> EmptyStr then

       begin

         MsgPendencias := MsgPendencias+'Favor realizar o DESFAZIMENTO no menu administrativo que será aberto a seguir.';

         TACBrTEFD(Owner).DoExibeMsg( opmOK, MsgPendencias);

       end

     ;

  finally

     ArquivosVerficar.Free;

  end;


  //verifica pendencias

  if MsgPendencias <> EmptyStr then

    begin

      Retorno := 0;

      while Retorno <> 1 do

        begin

          FazerRequisicao( fTransacaoPendente, 'ADM') ;

          if RespVS.Servico = 'executar' then

            begin

              Retorno := RespVS.Retorno;

            end

          ;

          if RespVS.IsColeta then Retorno := 0;

          if RespVS.GetParamString('mensagem') = 'Nao ha transacoes pendentes para este terminal.' then

            begin

              Retorno := 1;

            end

          ;

//          ShowMessage('Retorno: '+IntToStr(Retorno));

          ProcessarResposta ;         { Faz a Impressão e / ou exibe Mensagem ao Operador }

          sleep(250);

        end

      ;

      if Retorno = 0 then  Retorno := ContinuarRequisicao( True ) ;  { True = Imprimir Comprovantes agora }

    end

  ;


  //apaga os arquivos de backup das pendencias

  ArquivosVerficar    := TStringList.Create;


  try

     ArquivosVerficar.Clear;


     { Achando Arquivos de Backup deste GP }

     ArqMask := TACBrTEFD(Owner).PathBackup + PathDelim + 'ACBr_' + Self.Name + '_*.tef' ;

     FindFiles( ArqMask, ArquivosVerficar, True );



     { Adicionando Arquivo de Resposta deste GP (se ainda não foi apagado) }

     if FileExists( ArqResp ) then

        ArquivosVerficar.Add( ArqResp );


     { Apaga todos os arquivos encontrados }

     while ArquivosVerficar.Count > 0 do

     begin

        if not FileExists( ArquivosVerficar[ 0 ] ) then

        begin

           ArquivosVerficar.Delete( 0 );

           Continue;

        end;

        DeleteFile( PWideChar(ArquivosVerficar[ 0 ]) );

        ArquivosVerficar.Delete( 0 );

     end;

  finally

     ArquivosVerficar.Free;

  end;

end;

Eddie, seu código ficou ótimo, no entanto tive que fazer uns pequenos ajustes para passar na homologação, trat-se de dois try..except e uma alteração para que ele exiba a mensagem de transações pendentes caso o usuário informe senha incorreta ou cancele a telinha de login. Também criei uma propriedade nova na classe chamada fTinhaPendencias para poder consultá-la do lado da minha aplicação para saber se devo ou não exibir mensagem de alerta que foram tratadas pendencias no TEF e o usuário apurar a necessidade de cancelamento de cupons ou não. E também enviei o comando na variavel TransacaoOpcao:='Confirmar' para que não habilite o botão confirmar do Client. O código ficou assim:

procedure TACBrTEFDVeSPague.VerificarTransacoesPendentesClass;

Var

  ArquivosVerficar    : TStringList ;

  ArqMask             : String;

  Retorno: Integer;

  MsgPendencias: WideString;

  perguntou: Boolean;  


begin

  GravaLog( Name +' VerificarTransacoesPendentesClass ');

  //exibe as pendencias

  ArquivosVerficar    := TStringList.Create;

  MsgPendencias := EmptyStr;


  try

     ArquivosVerficar.Clear;


     { Achando Arquivos de Backup deste GP }

     ArqMask := TACBrTEFD(Owner).PathBackup + PathDelim + 'ACBr_' + Self.Name + '_*.tef' ;

     FindFiles( ArqMask, ArquivosVerficar, True );


     { Adicionando Arquivo de Resposta deste GP (se ainda não foi apagado) }

     if FileExists( ArqResp ) then

        ArquivosVerficar.Add( ArqResp );


     { Monta a mensagem de todos os arquivos encontrados }

     if ArquivosVerficar.Count > 0 then

       begin

          MsgPendencias := 'Transações TEF a seguir estão PENDENTES:'+SLineBreak+SLineBreak;

       end

     ;


     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 }

        MsgPendencias := MsgPendencias+'Rede: '+Resp.Rede+SLineBreak+'NSU: '+Resp.NSU+SLineBreak+'Valor: '+FloatToStrF(Resp.ValorTotal, ffCurrency, 18, 2)+SLineBreak+SLineBreak;

        ArquivosVerficar.Delete( 0 );


//     if MsgPendencias <> EmptyStr then

//       begin

//         MsgPendencias := MsgPendencias+'Favor realizar o DESFAZIMENTO no menu administrativo que será aberto a seguir.';

//         TACBrTEFD(Owner).DoExibeMsg( opmOK, MsgPendencias);

//       end

//     ;


     end;

  finally

     ArquivosVerficar.Free;

  end;


  //verifica pendencias

  if MsgPendencias <> EmptyStr then

    begin

      Retorno := 0;

      perguntou:=false;

      while Retorno <> 1 do

        begin

          try

            if not perguntou then

               begin

                 //MsgPendencias := MsgPendencias+'Favor realizar o DESFAZIMENTO no menu administrativo que será aberto a seguir.';

                 TACBrTEFD(Owner).DoExibeMsg( opmOK,'Favor realizar o DESFAZIMENTO no menu administrativo que será aberto a seguir.' {MsgPendencias});

                 fTinhaPendencias:=True;

                 perguntou:=true;

               end;


            TransacaoOpcao:='Confirmar';

            FazerRequisicao( fTransacaoPendente, 'ADM') ;

            if RespVS.Servico = 'executar' then

              begin

                Retorno := RespVS.Retorno;

              end;

          except on e:Exception do

            begin

              if RespVS.Retorno<>3 then

                 MessageDlg('Erro no tratamento de transações pendentes: '+#13+e.Message,mtError,[mbOK],0);

              perguntou:=false;

            end;

          end;

          if RespVS.IsColeta then Retorno := 0;

          if RespVS.GetParamString('mensagem') = 'Nao ha transacoes pendentes para este terminal.' then

            begin

              Retorno := 1;

            end

          ;

//          ShowMessage('Retorno: '+IntToStr(Retorno));

          try

            ProcessarResposta ;         { Faz a Impressão e / ou exibe Mensagem ao Operador }

          except on e:Exception do

            begin

              if e.message<>'Nenhuma Requisição Iniciada' then

                 MessageDlg('Erro no tratamento de transações pendentes: '+#13+e.Message,mtError,[mbOK],0);

            end;

          end;

          sleep(250);

        end

      ;

      if Retorno = 0 then  Retorno := ContinuarRequisicao( True ) ;  { True = Imprimir Comprovantes agora }

    end

  ;


  //apaga os arquivos de backup das pendencias

  ArquivosVerficar    := TStringList.Create;


  try

     ArquivosVerficar.Clear;


     { Achando Arquivos de Backup deste GP }

     ArqMask := TACBrTEFD(Owner).PathBackup + PathDelim + 'ACBr_' + Self.Name + '_*.tef' ;

     FindFiles( ArqMask, ArquivosVerficar, True );



     { Adicionando Arquivo de Resposta deste GP (se ainda não foi apagado) }

     if FileExists( ArqResp ) then

        ArquivosVerficar.Add( ArqResp );


     { Apaga todos os arquivos encontrados }

     while ArquivosVerficar.Count > 0 do

     begin

        if not FileExists( ArquivosVerficar[ 0 ] ) then

        begin

           ArquivosVerficar.Delete( 0 );

           Continue;

        end;

        DeleteFile( PWideChar(ArquivosVerficar[ 0 ]) );

        ArquivosVerficar.Delete( 0 );

     end;

  finally

     ArquivosVerficar.Free;

  end;

end;

[]'s

Postado

Senhores,

Se desejam submeter alterações nos fontes para analise, por favor anexem a Unit ou um Patch

Pretendo sim, é que ainda estou alterando, pois estou fazendo os últimos ajustes conforme o Moises vai me orientando, assim que estiver pronto eu anexo a Unit.

[]'s

Postado

Alterei a Unit do Vespague conforme o Moises da Cemay (empresa que faz homologação) me orientou, as minhas alterações foram as seguintes:

Criei as propriedades publicadas chamadas:

- ExecutandoVerificacaoTransacoesPendentes - Para controlar a execução da procedure VerificarTransacoesPendentesClass para quando o componente for instanciado

- DesabilitarBotaoConfirma - Para setar quando o botão de CONFIRMAR do client do Vespague deverá ser desabilitado (casos de trtamento de transações pendentes)

- TinhaPendencias - Para minha aplicação saber se da última vez que o componente foi instanciado se existiam pendencias ou não

Alterei a procedure VerificarTransacoesPendentesClass criada por nosso amigo Eddie da seguinte forma:

- Fiz uso da propriedade ExecutandoVerificacaoTransacoesPendentes paa saber se deve ser executado ou não, esta alteração foi necessária para evitar que a procedure seja chamada mais de uma vez dentro de uma mesma instância e para setar de minha aplicação antes de ser executada se será executada (para casos em que o usuario acessa o menu do TEF e deseja executar Administração de Pendencias)

- Tratei a propriedade DesabilitarBotaoConfirma para que caso seja setada passe o parâmetro TransacaoOpcao:='Confirmar'; para que desabilite o botão confirmar, isso é necessário quando se trata transações pendentes, mas no caso de uso atraves do botao Administração Pendencias o botão Confirmar do client deverá estar habilitado, dai a necessidade de se controlar este recurso de fora da classe do vespague (pela aplicação)

- Alterei o local onde é exibida a mensagem de transações pendentes (pedido do homologador), agora a mensagem é exibida dentro do while que executa o ADM, no entanto, tive que criar um controlador para saber se a pergunta já foi realizada ou não.

- Tive que colocar uns try..except em alguns pontos, pois existiam exceções ocorridas em algumas chamadas que quebravam a execução do while do ADM

Que eu me lembro foi só isso. Segue a unit anexada.

[]'s

ACBrTEFDVeSPague.pas

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