Ir para conteúdo
  • Cadastre-se

dev botao

Homologado TEF Discado com ACBrTEFD


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

Recommended Posts

  • Membros Pro

Pessoal

Passamos na homologação do sistema na semana passada com o ACBrTEFD...

Redecard, sem problemas

Plug&Pay.. apenas uma modificação para a impressão de um gerencial com mais de 2 minutos.

Pay & Go... tudo ok.

Abraços

Ivan

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

A alteração que fiz foi no ACBrECF.pas, na procedure LinhaRelatorioGerencial.

O problema que tinhamos que resolver é a questão do teste que imprime um gerencial quilométrico e ocorre um timeout na impressora fiscal, normalmente em 2 minutos, mas o pessoal da SevenPDV falou que cada impressora reage de forma diferente. Então eu coloquei um contador de tempo nesta procedure onde, chegando a um minuto, fecha o gerencial e abre outro e o sistema tem que continuar imprimindo o gerencial a partir de onde fechou o gerencial anterior.

Levando em conta que isto pode acontecer não só com os gerenciais do TEF, mas também com qualquer gerencial que fique enorme, agora com o PAF pode acontecer, acredito que esta alteração deva permanecer no ACBrECF.pas, mas peço que analisem o código e melhorem o que for preciso !!!

Não levei em consideração a questão de compatibilidade com linux, tive que adicionar a unit DateUtils e passamos na homologação com esta alteração.

Segue a procedure:

procedure TACBrECF.LinhaRelatorioGerencial(const Linha: AnsiString; const IndiceBMP: Integer);

Var

  Texto, Buffer : String ;

  Lin   : Integer ;

  SL    : TStringList ;

  TempoInicio: Double;

begin


  if MaxLinhasBuffer < 1 then

  begin

     ComandoLOG := 'LinhaRelatorioGerencial( '+Linha+' )';

     fsECF.LinhaRelatorioGerencial( Linha, IndiceBMP );

  end

  else

  begin

     TempoInicio:= Now;

     Texto  := '' ;

     Buffer := AjustaLinhas(Linha, Colunas) ;

     SL     := TStringList.Create ;

     try

       SL.Text := Buffer ;

       For Lin := 0 to SL.Count - 1 do

       begin

         if SecondsBetween(now,TempoInicio) > 60 then

          begin

             fsECF.fechaRelatorio;

             if fsECF.EmLinha(10) then begin

                TempoInicio:= Now;

                fsECF.AbreRelatorioGerencial;

             end;

          end;

          Texto := Texto + SL[Lin] + sLineBreak;

          if (Lin mod MaxLinhasBuffer) = 0 then

          begin

             ComandoLOG := 'LinhaRelatorioGerencial( '+Texto+' )';

             fsECF.LinhaRelatorioGerencial( Texto ) ;

             Texto := '' ;

          end ;

       end ;


       if Texto <> '' then

       begin

          ComandoLOG := 'LinhaRelatorioGerencial( '+Texto+' )';

          fsECF.LinhaRelatorioGerencial( Texto, IndiceBMP ) ;

       end ;

     finally

       SL.Free ;

     end ;

  end ;



  {$IFNDEF CONSOLE}

   if MemoAssigned then

   begin

      fsMemoOperacao := 'linharelatoriogerencial' ;

      Buffer := AjustaLinhas( Linha, fsMemoColunas) ;

      MemoAdicionaLinha( Buffer );

   end ;

  {$ENDIF}

end;

Link para o comentário
Compartilhar em outros sites

  • Consultores

A impressora que eu usei (uma Bematech MP-3000 TH FI) não teve esse problema. Assim, deve-se levar em conta que algumas impressoras talvez não tenham limite de tempo.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Acho que todas tem o limite, pois isso é uma restrição legal...

Mas no caso da Bematech, o comando que abre o Gerencial é o mesmo que imprime as linhas, e portanto, o Loop acaba abrindo um novo Gerencial...

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

  • Consultores

ahh pode ser. Sabe que eu não percebi isso... :oops:

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Pessoal

passei pela mesma situação tive que alterar em TACBrECF.LinhaRelatorioGerencial, de maneira muito parecida com o código postado anteriormente, trocando apenas para 90seg o tempo limite para abertura do novo gerencial. Acho que o tempo limite poderia ser uma property no componente ECF.

att

Franklin

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

Boa tarde a todos

Fiz a re-homologação do TEF Discado Sengunda e terça-feira (29/11 a 30/11).

Utilizei os componentes ACBrECF e ACBrTEFD. Até então eu tinha rotina prória para um único cartão,

Fiz a re-homologação para multiplos cartões para o Redecard, Hipercard, Tecban, Visanet, Amex e Pay&Go, fui aprovado sem problema algum.

A unica surpresa foi que ao terminar a re-homologação do Redecard, Hipercar e Tecban, (Tecbam pela primeira vez) eu vi o pessoal da SevenPDV fazendo um teste eu não tinha nos documentos baixados do site dele que é o seguinte:

Abrir um ADM, ao abrir o GP não selecionar a bandeira, ir para a pasta REQ (C:\tef_Dial\Req) ) e copie o valor que consta no campo 001-000 dele. Depois abra o arquivo Intpos.001 que eles fornecem (que anexei aqui) e e substitua o valor do campo 001-000 copiado do Intpos.001 da REQ. Copie o arquivo Intpos.001 da pasta teste para a para RESP (C:\tef_dial\resp).

Este teste é para testar um grande volume de informação para que a impressora leve mais que os 2 minutos que a impressora leva para fechar o relatório gerencial, porque os 2 minutos: isso porque a legislação atual dos ECFs determina que um relatório gerencial seja fechado em 2 minutos.

Para resolver o problema tem que fechar o Gerencial abrir um novo e continuar a impressão sem mostar mensagem ao operador.

Eu fiz algo parecido com o que o Ivan fez,

Creio que seria interessante incluir isso no componente.

Wandarlei

INTPOS.zip

Wandarlei Michelon

Link para o comentário
Compartilhar em outros sites

  • Consultores

É exatamente esse teste. Com o arquivo postado dá pro pessoal simular antes, e talvez possamos fazer uma correção mais definitiva.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Fundadores

Finalmente consegui um tempo para me dedicar a essa questão...

Apliquei uma modificação no ACBrECF.pas, que verifica se o Gerencial foi fechado, caso a impressão da Linha do Gerencial falhe... e se for o caso, Abre um novo gerencial e continua com a Impressão...

o método ficou:


procedure TACBrECF.LinhaRelatorioGerencial(const Linha: AnsiString;
const IndiceBMP: Integer);
Var
Texto, Buffer : String ;
Lin : Integer ;
SL : TStringList ;

Procedure TentaImprimirLinhas( Texto: AnsiString; IndiceBMP: Integer ) ;
var
Est : TACBrECFEstado ;
OldTimeOut : LongInt ;
begin
ComandoLOG := 'LinhaRelatorioGerencial( "'+Texto+'", '+IntToStr(IndiceBMP)+' )';
try
fsECF.LinhaRelatorioGerencial( Texto, IndiceBMP ) ;
except
// Não conseguiu imprimir ? Verifique se o relatório foi fechado pelo ECF //
OldTimeOut := TimeOut;
TimeOut := max(TimeOut,5); // Tenta ler o Estado por 5 seg ou mais
try
Est := Estado; // Lendo o estado do ECF

if Est = estLivre then
begin
// Está Livre, provavelmente foi fechado por longo tempo de
// impressao... (O ECF é obrigado a fechar o Gerencial após 2
// minutos de Impressão). Vamos abrir um Novo Gerencial e Tentar
// novamente
AbreRelatorioGerencial(fsIndiceGerencial);
fsECF.LinhaRelatorioGerencial( Texto, IndiceBMP );
end ;
finally
TimeOut := OldTimeOut;
end ;
end ;
end ;

begin
if MaxLinhasBuffer begin
ComandoLOG := 'LinhaRelatorioGerencial( "'+Texto+'", '+IntToStr(IndiceBMP)+' )';
fsECF.LinhaRelatorioGerencial( Texto, IndiceBMP ) ;
end
else
begin
Texto := '' ;
Buffer := AjustaLinhas(Linha, Colunas) ;
SL := TStringList.Create ;
try
SL.Text := Buffer ;

For Lin := 0 to SL.Count - 1 do
begin
Texto := Texto + SL[Lin] + sLineBreak;

if (Lin mod MaxLinhasBuffer) = 0 then
begin
TentaImprimirLinhas( Texto, IndiceBMP ) ;
Texto := '' ;
end ;
end ;

if Texto '' then
TentaImprimirLinhas( Texto, IndiceBMP ) ;
finally
SL.Free ;
end ;
end ;

{$IFNDEF CONSOLE}
if MemoAssigned then
begin
fsMemoOperacao := 'linharelatoriogerencial' ;
Buffer := AjustaLinhas( Linha, fsMemoColunas) ;
MemoAdicionaLinha( Buffer );
end ;
{$ENDIF}
end;
[/code]

Já está "comitado" no SVN

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

  • Fundadores

Eu nunca fui reprovado... mas sempre precisei ajustar algo no momento da homologação :)... Mas notei nas vezes que estive lá, que a média de aprovação é de apenas 50%

Basta você aplicar com bastante atenção os testes do roteiro de pre-teste, que tudo vai bem... e sempre que ficar uma "duvidazinha" é importante ligar nos homologadores ou solicitar ajuda no forum...

Não há custo para homologar o TEF discado... (apenas despesas de viagem/hospedagem)

Para o dedicado, vc tb pode se isentar de custos, se homologar junto a um parceiro como por exemplo a DataRegis ou SkyTEF

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

  • Consultores

Eu fui pela primeira vez e só tive alguns ajustes a fazer na hora. Foi tão rápido que o pessoal ficou impressionado que era minha primeira vez. Como o Daniel mencionou, o que conta muito é fazer os testes minuciosamente antes e retirar quaisquer dúvidas antes da viagem.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Boa tarde Daniel,

Baixei a nova versão e fiz o teste, ficou perfeito,

Em relação a homologação, se fizer os testes bem direitinho, não tem problemas.

Eu fiz a re-homologação pela quarta vez nunca reprovei, já tive que alterar algumas coisas lá. Mas nunca sem solução.

Abraço a todos.

Wandarlei Michelon

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...

Olá pessoal, esta semana conseguimos re-homologar TEF discado com ACbr e o Dedicado já está agendado. O componente foi perfeito. Só tive que fazer um pequeno ajuste em um teste opcional onde se trabalha TEF + Dinheiro com Troco. Segue o código alterado. Se isso proceder, favor alterar no componente. Fiz esse ajuste e passou tranquilo.

Como não implementei com multiplos cartões e deixo pro Acbr auto-finalizar o cupom, fiz essa alteração e funcionou tranquilo.

Obrigado a todos os mantenedores do Acbr, vou procurar ser mais ativo no fórum e ajudar a outros que precisem.

Codigo anterior na classe ACBrTEFDClass.pas:

  

if (Valor > RespostasPendentes.SaldoRestante ) then

       raise Exception.Create( ACBrStr( 'Operação TEF deve ser igual ao '+

                                        'Saldo a Pagar' ) );

Codigo alterado na classe ACBrTEFDClass.pas:

  if (MultiplosCartoes and (Valor > RespostasPendentes.SaldoRestante) ) then

       raise Exception.Create( ACBrStr( 'Operação TEF deve ser igual ao '+

                                        'Saldo a Pagar' ) );


Link para o comentário
Compartilhar em outros sites

  • Fundadores

Em relação ao problema do SAQUE.. acho que realmente há um bug no componente... conforme relatado em:

viewtopic.php?f=16&t=892

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

  • 2 semanas depois ...

Senhores,

Fiz a homologação dia 31/01 com o TACBrTEFD utilizando: MultiplosCartoes = True; AutoEfetuarPagamento = True;

NumeroMaximoCartoes = 2; (achei uma quantidade boa por conta do tempo da ECF na hora de imprimir os vinculados)

Homologuei em todas as bandeiras: Cielo/Amex (Seven) e RedeCard/Hiper/TecBan (SoftwareExpress). O componente é muito completo e só fiz uma modificação no componente (que precisei) e não sei se está correta mais funcionou no meu sistema.

O checklist dos caras é muito próximo de como eles testam lá, o segreto é testar bem sua aplicação e não tera tantos problemas, homoloquei no primeiro dia Cielo/Amex logo de manhã não teve nenhum erro grande, somente besteiras (3 erros) e no segundo dia fiz RedeCard/Hiper/TecBan tranquilo demais e o unico problema que demorei mais pra corrigir foi essa alteração do metodo (relavada logo abaixo). O que me ajudou foi conhecer bem o componente antes de ir homologar.

1. Alteração Feita:

Na Unit: ACBrTEFDClass

No metodo TACBrTEFDClass.ProcessarResposta

eu tirei with TACBrTEFD(Owner) do começo da procedure e coloquei ele especificamente nas propriedades que achei que fosse dele, pois existe algumas propriedades como Resp que tem no TACBrTEFDClass e no TACBrTEFD e com isso algumas vezes ele não fazia o processo correto. (Logo a baixo vou explicar o problema):

Metodo Anterior:

procedure TACBrTEFDClass.ProcessarResposta ;

var

   RespostaPendente: TACBrTEFDRespTXT;

begin

  VerificarIniciouRequisicao;


  with TACBrTEFD(Owner) do

  begin

     GravaLog( Name +' ProcessarResposta: '+Req.Header );


     EstadoResp := respProcessando;


     if Resp.QtdLinhasComprovante > 0 then

      begin

         { Cria c�pia do Objeto Resp, e salva no ObjectList "RespostasPendentes" }

         RespostaPendente := TACBrTEFDRespTXT.Create ;

         try

            RespostaPendente.Assign( Resp );

            RespostasPendentes.Add( RespostaPendente );


            ImprimirRelatorio ;


            if Assigned( OnDepoisConfirmarTransacoes ) then

               OnDepoisConfirmarTransacoes( RespostasPendentes );

         finally

            RespostasPendentes.Clear;

         end;

      end

     else

        if Resp.TextoEspecialOperador <> '' then

           DoExibeMsg( opmOK, Resp.TextoEspecialOperador )

  end ;

end;

Metodo Corrigido por mim:
procedure TACBrTEFDClass.ProcessarResposta ;

var

   RespostaPendente: TACBrTEFDRespTXT;

begin

  VerificarIniciouRequisicao;



   GravaLog( Name +' ProcessarResposta: '+Req.Header );


   TACBrTEFD(Owner).EstadoResp := respProcessando;


   if Resp.QtdLinhasComprovante > 0 then

   begin

       { Cria cópia do Objeto Resp, e salva no ObjectList "RespostasPendentes" }

       RespostaPendente := TACBrTEFDRespTXT.Create ;

       try

          RespostaPendente.Assign( Resp );

          TACBrTEFD(Owner).RespostasPendentes.Add( RespostaPendente );


          ImprimirRelatorio ;


          with TACBrTEFD(Owner) do

          begin

            if Assigned( OnDepoisConfirmarTransacoes ) then

               OnDepoisConfirmarTransacoes( RespostasPendentes );

          end ;



       finally

          TACBrTEFD(Owner).RespostasPendentes.Clear;

       end;

   end

   else

     if Resp.TextoEspecialOperador <> '' then

         TACBrTEFD(Owner).DoExibeMsg( opmOK, Resp.TextoEspecialOperador )

end;

Problema:

Ao fazer uma venda, com 2 cartoes, os dois cartoes sao aprovado no momento em está ocorrendo a impressao do segundo cartão (a forma de pagamento ainda não foi confirmado na ECF do segundo cartão), eu fecho a apliacao (desligo a maquina ou dou ctrl+alt+del) e ao voltar no sistema ele faz toda aquela verificação pelo proprio componente utilizando o "Inicializar".

quando ele vai fazer o tratamento de pendencias ele vai dar o NCN da segunda transação (que não foi confirmada) que é a mensagem em showmessage e logo depois ele deveria fazer a CNC que seria o cancelamento pela GP, esse segundo passo não estava ocorrendo por conta desse with, ai fiz essa modificação e funcionou, espero que ajude.

2. Para utilizar a propriedade de MultiplosCartoes := True eu sempre vejo se for precisar fazer uma operacao MultiplosCartoes, caso não precise, coloco como False (sempre verificando se existe RespostasPendentes.Count = 0 para mexer nessa propriedade, pois ele tem esse tratamento).

3. Depois de utilizar o metodo FinalizarCupom; eu sempre verifico se RespostasPendentes.Count > 0 para enviar ImprimirTransacoesPendentes; pois se você fizer um pagamento com cartao e depois fazer o resto com dinheiro a transacao nao sai, acredito que isso é por conta da propriedade AutoEfetuarPagamento = True que a forma de pagamento Dinheiro(comando enviado pelo ACBRECF) nao tem os tratamento do componente tef, mais esse if resolve o problema da impressão no final.

Espero ter ajudo alguem e valeu a todos vocês que fazem o Acbr!!!

Link para o comentário
Compartilhar em outros sites

  • Fundadores

izaiasavila,

Parabéns pela sua homologação :)

Obrigado pela sua correção e pelas suas valiosas dicas...

Estou aplicando as modificações no SVN

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

  • Consultores

Ficou faltando no TACBrTEFDClass.ProcessarResposta a referência pro TACBrTEFD(Owner) ao chamar o método DoExibeMsg no final (linha 2049)


else
if Resp.TextoEspecialOperador '' then
TACBrTEFD(Owner).DoExibeMsg( opmOK, Resp.TextoEspecialOperador )
end;[/code]

EDIT, à medida que eu digitei outro usuário também viu o erro. veja: viewtopic.php?f=16&t=1046

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Fundadores

AFF... Isso é que dá fazer as coisas de madrugada e com sono :)

Já corrigi no SVN... Obrigado pelo aviso...

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

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