Ir para conteúdo
  • Cadastre-se

EddieBR

Membros
  • Total de ítens

    106
  • Registro em

  • Última visita

Tudo que EddieBR postou

  1. Ah.. mais uma coisa que lembrei, que em produção enche bastante a paciencia. Em caso de queda da internet por exemplo... o client perde comunicacao e nao retorna sozinho. Eu resolvi da seguinte forma. Antes de solicitar uma transacao de cartao, eu chamo um ATV, que nao responde caso o client esteja sem comunicacao, e chamo um arquivo .bat que mata o processo do VeSPague e roda novamente. Seria +- assim: Timeout de 10s (nao lembro qual o padrao). - Solicito ATV. Se nao responder ao ATV eu coloco o timeout maior, pois o client demora ate reconectar. E faco um loop ate que o ATV responda ou o operador cancele a operacao. Dentro desse loop com o timeout maior, eu mostro uma mensagem e chamo o .bat que reinicia o client. E apenas solicito o CRT quando o ATV responder OK. Como em produção o client roda atraves de uma VPN, tem tambem o OpenVPN que as vezes desconecta tmb em caso de queda de internet.. mas é bem mais dificil.
  2. Parabens pela homologação Ivan. Quando fiz a minha apanhei bastante heheh mas com a ajuda do Moises e algumas noites sem dormir deu tudo certo... homologuei multiplos cartoes de primeira! heheh fiquei aqui no teamviewer só olhando.
  3. Quando eu fiz as modificações pro VeSPague (primeiramente na classe TEFDial para trabalhar no modo File, e depois na classe do VesPague) eu nao encontrei problemas de travamento nem de apagar os arquivos no caso de cancelamento. O loop ficava la ate vir a mensagem "Nao existem transacoes pendentes". Uma coisa que venho observando sobre as transações pendentes é o seguinte. Tem casos em que a transacao nao é confirmada, ficando como pendencia, porem o arquivo de backup da transacao é excluido normalmente. No modo file isso acontecia direto (problemas do gerenciador deles) e no modo background acontece raramente. Ainda não consegui pegar o que acontece. No modo file eu tinha feito essa rotina ai diferente. Primeiro fazia dessa forma, verificando a existencia de arquivos de backup ao inicializar, e depois eu enviava o comando de transacoes pendentes. Eu parei de usar essa funcao por 2 motivos. Primeiro.. de vez em quando ao executar o transacoes pendentes o client simplesmente nao responde, ou demora muito tempo. Segundo, pela demora de alguns segundos a mais toda vez que inicia o sistema. Nao vi se foram feitas alteracoes recentes na classe, mas quando eu fiz a rotina o CancelarTransacoesPendentesClass nao chamava a funcao ADM de tratamento de pendencias, portanto nao abria login/senha. A classe fazia um loop e enviava um CNC para cada arquivo de backup encontrado, o que não funciona no VeSPague apos o reinicio do client. Tem alguns outros detalhes que eu mudei referente a tratamento das mensagens ao operador na classe (e no processamento do meu PDV), assim que conseguir uma folga aqui eu posto alguma coisa e ja aproveito pra mudar algumas coisas.
  4. 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).
  5. 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;
  6. 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.
×
×
  • 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.

The popup will be closed in 10 segundos...