Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

  • Membros Pro
Postado

Pessoal,

 

estamos iniciando os roteiros de homologação utilizando as classes acbr. Estamos nos baseando no exemplo TEFDemo para implementarmos a nossa solução. Ao realizarmos o item que fala do cancelamento através da ADM, tivemos o seguinte problema: 

 

1. realizamos uma transação normal de débito e tudo ocorre perfeitamente;

2. acionamos a ADM do gerenciador padrão;

3. selecionamos a opção "Cancelamento";

4. informamos o valor da transação a ser cancelada;

5. informamos o número de controle da transação a ser cancelada;

6. neste momento, a tela do gerenciador padrão não é finalizada e fica aguardando a confirmação. Ao investigar os fontes, percebi que aparentemente o código está pulando o comando CNF pois não chama a rotina ImprimirRelatorio. Se clicar manualmente no botão CNF, o gerenciador padrão se fecha e o controle volta para o app TEFDemo, indicando "ADM realizada com sucesso", mas nenhum comprovante aparece na impressora.

 

No aguardo de uma orientação,

 

 

Leonardo Silveira

  • Membros Pro
Postado
-- 18/12 16:23:04:146 - TEF_DIAL Inicializado
-- 18/12 16:23:04:148 - TEF_DIAL CancelarTransacoesPendentesClass 
-- 18/12 16:23:04:150 - TEF_DIAL IniciarRequisicao: ATV
-- 18/12 16:23:04:154 - TEF_DIAL FinalizarRequisicao: ATV, Fechando arquivo: C:\TEF_DIAL\req\intpos.tmp
-- 18/12 16:23:04:187 - TEF_DIAL FinalizarRequisicao: ATV, Renomeando: C:\TEF_DIAL\req\intpos.tmp para: C:\TEF_DIAL\req\intpos.001
-- 18/12 16:23:04:189 - TEF_DIAL FinalizarRequisicao: ATV, Aguardando: C:\TEF_DIAL\resp\intpos.sts
-- 18/12 16:23:04:447 - TEF_DIAL FinalizarRequisicao: ATV, Fim da Espera de: C:\TEF_DIAL\resp\intpos.sts Recebido
-- 18/12 16:23:04:462 - TEF_DIAL FinalizarRequisicao: ATV, Verificando conteudo de: C:\TEF_DIAL\resp\intpos.sts
-- 18/12 16:23:10:587 - TEF_DIAL IniciarRequisicao: ADM
-- 18/12 16:23:10:589 - TEF_DIAL IniciarRequisicao: ATV
-- 18/12 16:23:10:593 - TEF_DIAL FinalizarRequisicao: ATV, Fechando arquivo: C:\TEF_DIAL\req\intpos.tmp
-- 18/12 16:23:10:630 - TEF_DIAL FinalizarRequisicao: ATV, Renomeando: C:\TEF_DIAL\req\intpos.tmp para: C:\TEF_DIAL\req\intpos.001
-- 18/12 16:23:10:632 - TEF_DIAL FinalizarRequisicao: ATV, Aguardando: C:\TEF_DIAL\resp\intpos.sts
-- 18/12 16:23:11:671 - TEF_DIAL FinalizarRequisicao: ATV, Fim da Espera de: C:\TEF_DIAL\resp\intpos.sts Recebido
-- 18/12 16:23:11:676 - TEF_DIAL FinalizarRequisicao: ATV, Verificando conteudo de: C:\TEF_DIAL\resp\intpos.sts
-- 18/12 16:23:11:686 - TEF_DIAL FinalizarRequisicao: ADM, Fechando arquivo: C:\TEF_DIAL\req\intpos.tmp
-- 18/12 16:23:11:730 - TEF_DIAL FinalizarRequisicao: ADM, Renomeando: C:\TEF_DIAL\req\intpos.tmp para: C:\TEF_DIAL\req\intpos.001
-- 18/12 16:23:11:735 - TEF_DIAL FinalizarRequisicao: ADM, Aguardando: C:\TEF_DIAL\resp\intpos.sts
-- 18/12 16:23:12:493 - TEF_DIAL FinalizarRequisicao: ADM, Fim da Espera de: C:\TEF_DIAL\resp\intpos.sts Recebido
-- 18/12 16:23:12:498 - TEF_DIAL FinalizarRequisicao: ADM, Verificando conteudo de: C:\TEF_DIAL\resp\intpos.sts
-- 18/12 16:23:12:504 - TEF_DIAL LerRespostaRequisicao: ADM, Aguardando: C:\TEF_DIAL\resp\intpos.001
-- 18/12 16:23:46:713 - TEF_DIAL LerRespostaRequisicao: ADM, Fim da Espera de: C:\TEF_DIAL\resp\intpos.001 Recebido
-- 18/12 16:23:46:719 - TEF_DIAL LerRespostaRequisicao: ADM, Verificando conteudo de: C:\TEF_DIAL\resp\intpos.001
-- 18/12 16:23:46:726 - TEF_DIAL ProcessarResposta: ADM
-- 18/12 16:23:46:731 - TEF_DIAL DoExibeMsg: Oper: opmOK Mensagem:    APROVADA: 017503  IMPRIMINDO...
-- 18/12 16:23:51:553 - TEF_DIAL FinalizarResposta: ADM
  • Membros Pro
Postado

Sim. Porém em nenhum momento a operação CNF foi executada e, consequentemente a tela do gerenciador padrão não foi fechada, aguardando a confirmação. Não sei se o demo faz isso, mas sei que a função ImprimirRelatorio gera o comando para impressão e executa o CNF. No caso do cancelamento via ADM, nem a impressao nem o CNF são chamados. Na linha de código abaixo, a mensagem " APROVADA: 017503  IMPRIMINDO..." é invocada no código que está em vermelho (abaixo). Mesmo que a mensagem informe que está imprindo, nenhum comando de impressão é chamado e o processo finaliza ali. O demo imprime o cancelamento via ADM?

 

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;
  • Membros Pro
Postado (editado)

Sim, estou realizando os  seguintes passos: 

 

1. abro o programa TEFdemo.exe;

2. inicializo a impressora e o gerenciador padrão tefdial;

3. clico no botão "ADM";

4. o gerenciador padrão é invocado na tela administrativa;

5. escolho a opção "Cancelamentos";

6. informo senha, valor, n. controle e insiro e retiro o cartão;

7. neste momento, o gerenciador padrão abre uma tela informando que a transação foi aprovada e o metodo "OnExibeMensagem" é chamado. A mensagem é "APROVADA: 017503  IMPRIMINDO...";

8. mensagem "adm executada com cesso";

9. Neste momento, a tela do gerenciador padrão segue aberta e nada foi impresso. Se eu clicar no botão "Imprimir Transações Pendentes", nada acontece pois avariável RespostasPendentes.Count está igual a zero.

10. Se eu clicar no botão CNF, o comando de confirmação é invocado, o gerenciador padrão se fecha (o que está correto), mas nada foi impresso.

Editado por Leonardo Fossati Silveira
  • Moderadores
Postado

Fiz o teste aqui utilizando meu aplicativo que já é homologado e o TEFDemo, ambos funcionaram corretamente, efetuando a transação, imprimindo e fechando corretamente:

Ativar ECF
Inicializando: gpTefDial
Enviando: ATV ID: 31544
ACBrTEFD.Inicializar Executado
Inicio de ADM
Enviando: ATV ID: 31545
Enviando: ADM ID: 31546
BloqueiaMouseTeclado = SIM
ComandaECF: opeAbreGerencial
ACBrTEFD1ComandaECFImprimeVia, Tipo: trGerencial Via: 1
      *** DEMONSTRACAO  PAY&GO ***
           COMPROVANTE DE TEF
    
    ESTABELECIMENTO DE TESTE
    823982346832235/03876463
    
    19/12/2013              08:46:15
    DOC:030096        AUTORIZ:019109
    REF.HOST:08461520381
    
    CANCELAMENTO DE VENDA
    
    DADOS DA VENDA ORIGINAL:
    VENDA CREDITO A VISTA
    DOC:123456
    REF HOST:08461521561
    19/12/2013              08:46:15
    VALOR FINAL: R$ 1,00
    
          A TRANSACAO ORIGINAL
             ESTA CANCELADA.
ComandaECF: opePulaLinhas
ACBrTEFD1ComandaECFImprimeVia, Tipo: trGerencial Via: 2
      *** DEMONSTRACAO  PAY&GO ***
           COMPROVANTE DE TEF
    
    ESTABELECIMENTO DE TESTE
    823982346832235/03876463
    
    19/12/2013              08:46:15
    DOC:030096        AUTORIZ:019109
    REF.HOST:08461520381
    
    CANCELAMENTO DE VENDA
    
    DADOS DA VENDA ORIGINAL:
    VENDA CREDITO A VISTA
    DOC:123456
    REF HOST:08461521561
    19/12/2013              08:46:15
    VALOR FINAL: R$ 1,00
    
          A TRANSACAO ORIGINAL
             ESTA CANCELADA.
ComandaECF: opeFechaGerencial
Enviando: ATV ID: 31547
Enviando: CNF ID: 31548
BloqueiaMouseTeclado = NAO
Confirmado: ADM ID: 31546
Rede: VISANET NSU: 08461520381 Valor: 1,00
Campo 11: 10
ADM executado com sucesso

Verifique por favor se não existe nenhum arquivo marcado em vermelho ou amarelo na sua pasta ACBr, estou achando que você pode estar com versões antigas de arquivos.

TEF_DIAL.txt

  • Curtir 1

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
  • Membros Pro
Postado

Consegui descobrir, e acho que isso vai colaborar com todos:

 

Imagino que o problema estava no padrão utilizado para a geração do arquivo intpos, pelo gerenciador padrão. Usamos a solução Cappta, que intermedia e encapsula os demais gerenciadores padrões. Talvez a forma como eles criaram este arquivo, não esteja sendo tratada pelas classes acbrtef. Vamos aos fatos:

 

1. Problema: o método "ImprimirRelatorio" não era chamado de forma alguma. Como o envio CNF está dentro do método "ImprimirRelatorio" então a transação também não estava sendo confirmada.;

Veja o método ProcessarResposta (ACBrTEFDClass.pas, linha 2042) :

 

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;
 
Percebi que Resp.QtdLinhasComprovante estava zerado. Logo imaginei que o comprovante não estava sendo gerado. Então fui mais a fundo, em busca dos locais onde o comprovante é montado e enviado para a impressão. Encontrei o método "ConteudoToProperty" (ACBrTEFDClass.pas, linha 1252) e percebi que é este método que lê o arquivo de resposta do gerenciador padrão (intpos) e monta os resultados nas estruturas em mémória do objeto da classe ACBrTEFDClass. As identificações do arquivo intpos que interferem no atributo QtdLinhasComprovante são: 28, 710,712. Compreendi, então que 710 é o cupom reduzido. E o 712 é um comprovante que só é impresso caso NÃO exista cupom reduzido.
Para identificar se tem ou não cupom reduzido, o algorítmo utiliza a variável TemReduzido. Esta variável é preenchida no seguinte momento:
(ACBrTEFDClass.Pas, linha 1339)
 
       710 :
         begin
           TemReduzido := True;
           fpImagemComprovante1aVia.Clear;
           fpQtdLinhasComprovante := Linha.Informacao.AsInteger;
         end;
 
Se o algorítmo entrar neste bloco de código (710), então a varíavel será marcada como true e o bloco 712 será ignorado. Veja o bloco 712:
 
       712 :
         begin
           if not TemReduzido then
           begin
              fpImagemComprovante1aVia.Clear;
              fpQtdLinhasComprovante := Linha.Informacao.AsInteger;
           end;
         end;
 
Agora posso explicar o que estava acontecendo comigo:
 
1. o meu arquivo intpos, contém o bloco 710, MESMO NÃO TENDO CUPOM REDUZIDO. Ele apenas gera as linhas, mas deixa em branco. A linha que indica o número de linhas do comprovante (710) informa o valor ZERO. Como a váriavel "TemReduzido" é setada para true sempre que entra no bloco 710, no meu caso ela era interpretada como se o cupom existisse, pois o bloco 710 existe no meu intpos, apesar de estar vazio. No bloco 710 a variável lfpQtdLinhasComprovante é setada para zero. Isso faz com que o bloco 712 seja ignorado e na rotina ProcessarResposta, o método "ImprimriRelatorio" seja ignorado também. 
 
Resumo: a classe ACBRTEFdclass considera que TEM cupom reduzido sempre que existir o 710 no intpos, independente do seu conteúdo. No meu caso, o arquivo contém o 710, mesmo não tendo cupom reduzido, apenas indicando zero linhas de comprovante.
 
Veja o intpos.001 gerado pelo meu gerenciador padrão (observe o 710): 
 
000-000 = ADM
001-000 = 59707
004-000 = 0
009-000 = 0
010-000 = REDECARD-L0500
011-000 = 99
012-000 = 017546
013-000 = 017546
015-000 = 2012163546
016-000 = 2012163548
022-000 = 20122013
023-000 = 163546
027-000 = 12015647028
028-000 = 17
029-001 = ""
029-002 = ""
029-003 = "---------------------------------------"
029-004 = "          EMPRESA 1 FILIAL 1"
029-005 = "          00.000.000/0000-00"
029-006 = ""
029-007 = "           CUPOM DO CLIENTE"
029-008 = "---------------------------------------"
029-009 = "               REDECARD"
029-010 = "             CANCELAMENTO"
029-011 = "COMPROV: 123456789 VALOR:     9.999,99"
029-012 = ""
029-013 = "            CUPOM DA LOJA"
029-014 = "---------------------------------------"
029-015 = "               REDECARD"
029-016 = "             CANCELAMENTO"
029-017 = "COMPROV: 123456789 VALOR:     9.999,99"
030-000 =    APROVADA: 017546  IMPRIMINDO...
040-000 = MAESTRO
710-000 = 0
711-001 = ""
712-000 = 6
713-001 = ""
713-002 = "           CUPOM DO CLIENTE"
713-003 = "---------------------------------------"
713-004 = "               REDECARD"
713-005 = "             CANCELAMENTO"
713-006 = "COMPROV: 123456789 VALOR:     9.999,99"
714-000 = 5
715-001 = "            CUPOM DA LOJA"
715-002 = "---------------------------------------"
715-003 = "               REDECARD"
715-004 = "             CANCELAMENTO"
715-005 = "COMPROV: 123456789 VALOR:     9.999,99"
999-999 = 0
 
SOLUÇÃO
 
A variável TemReduzido somente será setada para TRUE se existir o bloco 710 e TAMBÉM o número nele indicado for MAIOR QUE ZERO:
 
       710 :
         begin
           TemReduzido := True;
           TemReduzido := Linha.Informacao.AsInteger >0;
           fpImagemComprovante1aVia.Clear;
           fpQtdLinhasComprovante := Linha.Informacao.AsInteger;
         end;
 
 
Fiz esta correção na classe e passou a funcionar perfeitamente. Se minha conclusão estiver errada, por favor, me informem.
 
 
Leonardo
  • Moderadores
Postado

Estranho também tenho integração com a Cappta, fiz as homologações e estão rodando nos clientes sem precisar modificar nada!

O bom era saber se mais algum colega consegue relatar o mesmo caso!

Se alguém mais tiver como testar e repassar aqui seria ótimo

 

também peço para que anexe os fontes que fez a alteração para que fique mais prático o merge !

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

  • Membros Pro
Postado

Talvez possa ser alguma versão nova da Cappta, alguma configuração específica que eles fizeram no meu ambiente ou por ser um ambiente de testes. A alteração que fiz foi no arquivo ACBrTEFDClass.pas, linha 1341 (em anexo). Gostaria de saber se esta modificação está correta ou se pode quebrar alguma outra parte do código visto que ainda não domino todos os fontes.

ACBrTEFDClass.pas

  • Curtir 2
  • 2 semanas depois ...
  • Este tópico foi criado há 3979 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.

The popup will be closed in 10 segundos...