Ir para conteúdo
  • Cadastre-se

Felipe Sachetti

Membros
  • Total de ítens

    10
  • Registro em

  • Última visita

Posts postados por Felipe Sachetti

  1. 42 minutos atrás, Daniel Simoes disse:

    @Felipe Sachetti, veja o que acha dessa sugestão de correção

    function TACBrTEFAPIClassCliSiTef.ObterDadoPinPad(
      TipoDado: TACBrTEFAPIDadoPinPad; TimeOut: integer; MinLen: SmallInt;
      MaxLen: SmallInt): String;
    Var
      DadoPortador: String;
      Ok: Boolean;
    begin
      DadoPortador := DadoPinPadToOperacao(TipoDado);
      if (DadoPortador = '') then
      begin
        fpACBrTEFAPI.DoException(Format(ACBrStr(sACBrTEFAPICapturaNaoSuportada),
          [GetEnumName(TypeInfo(TACBrTEFAPIDadoPinPad), integer(TipoDado) ), ClassName] ));
      end;
    
      if (MinLen = 0) and (MaxLen = 0) then
        CalcularTamanhosCampoDadoPinPad(TipoDado, MinLen, MaxLen);
    
      if (TimeOut > 1000) then
        TimeOut := trunc(TimeOut/1000);  // SiTef espera o tempo em Segundos.. convertendo de milisegundos
    
      fRespostasPorTipo.ValueInfo[2967] := DadoPortador;
      fRespostasPorTipo.ValueInfo[2968] := IntToStr(MinLen);
      fRespostasPorTipo.ValueInfo[2969] := IntToStr(MaxLen);
      fRespostasPorTipo.ValueInfo[2970] := IntToStr(TimeOut);
    
      Ok := ExecutarTransacaoSiTef(CSITEF_OP_DadosPinPadAberto, 0);
      if Ok then
        Result := fpACBrTEFAPI.UltimaRespostaTEF.LeInformacao(2971,0).AsString;
    end;

     

    o valor Default, é utilizado em todas as demais classes de TEF, então não podemos mudar ele...

    Acredito ser uma otima opçao essa ideia, ja trata o padrao  que é 30000.
    daria pra testar os entre 100 e 999 dividir por 100 pra garantir que alguma funcao ja nao esteja chamando  com algum ajuste relacionado a divisao por 100 que existia
    exemplo, estarem passando 900 pra dividir por 100 e dar 9 segundos
    abaixo disso seria em segundos e 100 segundo aceita de boa a funcao

    if(TimeOut > 1000)then
        TimeOut := trunc(TimeOut/1000)
      else
          if(TimeOut > 100)then
            TimeOut := trunc(TimeOut/100);

    • Curtir 1
  2. cliente relatou que ao chamar ObterDadoPinPad(), obtinha o retorno TEMPO DE ESPERA INVALIDO

    apos alguns testes e contato com suporte sitef, identificamos que o parametro 2970 na chama abaixo tem que ser informado em segundos.
    o padrao da funcao esta em 30000 e esta sendo dividido por 100 dando 300 segundos e retornando o erro..
    nao consegui identificar alteracoes no arquivo, entao, pode ser que tenham mudado algo internamente na sitef..
    com valores mais baixos esta funcionando...

    acredito que uma melhoria seria diminuir o padrao 30000 ou aumentar o fator 100 para 1000 por exemplo..

    function TACBrTEFAPIClassCliSiTef.ObterDadoPinPad(
      TipoDado: TACBrTEFAPIDadoPinPad; TimeOut: integer; MinLen: SmallInt;
      MaxLen: SmallInt): String;
    Var
      DadoPortador: String;
      Ok: Boolean;
    begin
      DadoPortador := DadoPinPadToOperacao(TipoDado);
      if (DadoPortador = '') then
      begin
        fpACBrTEFAPI.DoException(Format(ACBrStr(sACBrTEFAPICapturaNaoSuportada),
          [GetEnumName(TypeInfo(TACBrTEFAPIDadoPinPad), integer(TipoDado) ), ClassName] ));
      end;

      if (MinLen = 0) and (MaxLen = 0) then
        CalcularTamanhosCampoDadoPinPad(TipoDado, MinLen, MaxLen);

      fRespostasPorTipo.ValueInfo[2967] := DadoPortador;
      fRespostasPorTipo.ValueInfo[2968] := IntToStr(MinLen);
      fRespostasPorTipo.ValueInfo[2969] := IntToStr(MaxLen);
      fRespostasPorTipo.ValueInfo[2970] := IntToStr(trunc(TimeOut/100));

      Ok := ExecutarTransacaoSiTef(CSITEF_OP_DadosPinPadAberto, 0);
      if Ok then
        Result := fpACBrTEFAPI.UltimaRespostaTEF.LeInformacao(2971,0).AsString;
    end;

  3. entrei em contato com o sitef, pediram pra testar com SE000002 na identificacao do terminal.... parou de aparecer as pendencias.. porem fiquei com um pouco de receio com essas informacoes antigas, que nao apareciam como pendentes na versao anterior que utilizava do acbr e comecaram aparecer agora... elas era de 10/2023...

    e tbm a ideia de puxar os dados de pendencias mesmo com o servidor estando desativado, teria como saber de onde vem essas informacoes, pois, logs do acbr foram todos excluidos, e arquivos temp do clisitef tbm..

  4. realizei a atualizacao do componente e agora fica aparecendo 6 transacoes pendentes, uma atras da outra, mesmo o servidor local de demo do sitef estar fechado..
    e mesmo executando a apos a mensagem o finalizartransacao... continua toda vez que tenta inicializar

    7/03/25 17:05:21:526 - VerificarTransacoesPendentes
    07/03/25 17:05:34:306 - ProcessarTransacaoPendente( Transa  o Pendente.
    Rede: 
    NSU:  )
    07/03/25 17:05:34:306 -   QuandoDetectarTransacaoPendente
    07/03/25 17:05:34:319 - ResolverOperacaoPendente( tefstsSucessoManual )
    07/03/25 17:07:28:745 - *** FinalizaTransacaoSiTefInterativo. Confirma: SIM, Documento: P_759, Data: 20231016, Hora: 172210, ParametrosAdicionais: 
    07/03/25 17:08:23:327 - ProcessarTransacaoPendente( Transa  o Pendente.
    Rede: 
    NSU:  )


    uma parte do arquivo de log

  5. acabei q pra poder passar na homologacao fiz um "arranjo tecnico", como é testado somente o ultimo documento emitido, ao iniciar o processo de pagamento, salvo em registro o nr do documento e ao inicializar a aplicacao consulto se o ultimo documento esta pendente, por falta de tempo nao consegui dar sequencia no ajusto do componente, alterei algumas partes de funcoes e procedures, vou postar aqui as minhas anotacoes se ajudar, inicio do ano acredito estar mais disponivel e posso ajudar tbm nos ajustes e testes..

     

    unit ACBrTEFAPICliSiTef;

    tirar de dentro e colocar fora do repeat

    TituloMenu := '' ;

    quando vinha titulo no comando 4 nao mostrava no comando 21, pois TituloMenu := '' ;
    eliminava o titulo

    =============================================================

    nit ACBrTEFAPICliSiTef;
    funcao ContinuarRequisicaoSiTef;

    tratamento do comando 30, incluido ajuste para aceitar o VOLTAR no formulario perguntar campo

    30:  // Deve ser lido um campo cujo tamanho está entre TamMinimo e TamMaximo
               begin
                 DefinicaoCampo.TipoCampo := TipoCampo;
                 DefinicaoCampo.TituloPergunta := ACBrStr(Mensagem);
                 DefinicaoCampo.TipoDeEntrada := tedTodos;
                 DefinicaoCampo.TamanhoMaximo := TamanhoMaximo;
                 DefinicaoCampo.TamanhoMinimo := TamanhoMinimo;
                 DefinicaoCampo.MascaraDeCaptura := EmptyStr;

                 Validado := True;
                 TefAPI.QuandoPerguntarCampo(DefinicaoCampo, Resposta, Validado, Interromper);

                 //ajuste para aceitar voltar nos formulario de solicitar informacao
                 if((Interromper = False)and(Validado)and(Resposta = 'RetornarMenuAnterior'))then
                 begin
                      Resposta := '';
                                  Voltar := True;
                 end else
                      RespCliSiTef.GravaInformacao(TipoCampo, Resposta);
               end;

    ============================================================================

    na procedure quando perguntar campo passa valores quando for voltar

    procedure TTef.QuandoPerguntarCampo(DefinicaoCampo: TACBrTEFAPIDefinicaoCampo; var Resposta: string; var Validado, Cancelado: Boolean);

    //se nao for ok ou voltar trata como cancelado
          if((MR <> mrOK)and(MR <> mrRetry))then
          begin
              Cancelado := True;
            Validado := False;  // Não fizemos as validações de "DefinicaoCampo.ValidacaoDado", vamos deixar o ACBrTEFAPI validar
              Resposta := FormObtemCampo.Resposta;
          end else
          begin
              if(MR = mrRetry)then
            begin
                Cancelado := False;
              Validado     := True;
              Resposta     := 'RetornarMenuAnterior';
            end else
            begin
                 Cancelado := False;
              Validado     := False;
              Resposta     := FormObtemCampo.Resposta;
            end;
          end;

    =============================================================================================

    unit ACBrTEFAPICliSiTef;

    TACBrTEFAPIClassCliSiTef.FinalizarTransacao(

    // CliSiTEF não usa Rede, NSU e Finalizacao
      DocumentoVinculado := '';
      Confirma := (AStatus in [tefstsSucessoAutomatico, tefstsSucessoManual]);
      i := fpACBrTEFAPI.RespostasTEF.AcharTransacao(Rede, NSU, CodigoFinalizacao);
      if (i >= 0) then
        DocumentoVinculado := fpACBrTEFAPI.RespostasTEF[i].DocumentoVinculado;

        //caso nao localize e tenha vindo rede sem nsu é pq foi chamado avulso com o DOCUMENTOVINCULADO no Rede
      if((Rede <> '')and(DocumentoVinculado = '')and(NSU = ''))then
          DocumentoVinculado := Rede;

      FinalizarTransacaoSiTef(Confirma, DocumentoVinculado);

    =========================================================

    desculpa a forma como compartilhei sem formatacao, é que mantenho as alteracoes por escrito caso atualize o componente e tenha q 

    ajustar os detalhes manualmente

     

     

    qqr coisa estou a disposicao para ajudar e testes

     

    em relacao a tratar o ultimo documento pendente, ao abrir a aplicacao faco essa validacao

     

    var ultimo := BackupDocumentoSitef_Ler; //leio registro com ultimo documento q foi inicializado o pagamento
          var estapendente := (TACBrTEFAPIClassCliSiTef(ObjetoTef.Acbr.TEF).TEFCliSiTefAPI.ObtemQuantidadeTransacoesPendentes(Now, AnsiString(ultimo)) > 0);

        if(estapendente)then
        begin
          TACBrTEFAPIClassCliSiTef(ObjetoTef.Acbr.TEF).FinalizarTransacao(ultimo,
                                                                          '',
                                                                          '',
                                                                          tefstsSucessoManual);

  6. ao realizar a homologação com Sitef, esbarramos num teste.

    rotina do teste
     - realizar venda
     - credito
     - inserir cartao
     - digitar senha
     - quando aprovar e receber mensagem de retirar cartao (matar o processo simulando desligamento)

    ao iniciar novamente o componente nao valida as operacoes pendentes..

    chegamos no detalhe q o arquivo que é analisado para validar as pendencias "Acbr_xxx" é salvo na chamada apos executar o FinalizarChamadaAPI 
    porem esse somente é chamado no finally da fpTEFAPIClass.EfetuarPagamento(
    e essa so é concluida apos remover o cartao.

    percebemos tambem que existe uma funcao da sitef q retorna a quantidade de pendentes porem ainda nao implementada


    nao conseguimos contornar esse "detalhe", alguem ja passou por isso? conseguiu homologar? passou nesse teste?
    alguem com a implementacao de rotina de retornar e tratar pendentes da sitef??
     

  7. Em 07/05/2018 at 13:01, Josimar Dias disse:

    Até consegui imprimir o qr-code alterando diretamente na unit "ACBrEscPosEpson", porém não consegui lê-lo.

     

      Result := ESC  + 'Z' +                     // Codigo QRCode
                   AnsiChr(0) +                      // m means specified version.(1~40,0:Auto size)
                   'L' +                             // n specifies the EC level.(L:7%,M:15%,Q:25%,H:30%)
                   AnsiChr(2) +                      // k specified component type.(1~8)
                   AnsiChr(Low(Length(ACodigo)+2))  +    // dL:The first byte is the low order number.
                   AnsiChr(High(Length(ACodigo)+2)) +       // dH:The second byte is the upper number.
                   ACodigo;

    estou com o mesmo problema, sem conseguir ler os codigos impressos...
    ja revirei o manual da impressora e nao consegui fazer com que imprimisse e lesse uma URL de NFCE...


    conseguiu resolver esse problema...?

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