Ir para conteúdo
  • Cadastre-se

dev botao

Problema ao cancelar pagamento TEF (sitef)


Ver Solução Respondido por Daniel Simoes,

Recommended Posts

Postado (editado)

No caso eu não mandei cancelar, eu mandei o comando de FinalizarTransacao

ACBrTEFAPI1.FinalizarTransacao( AResp.Rede,
                                      AResp.NSU,
                                      AResp.Finalizacao,
                                      tefstsErroDiverso );

Mas também testei o comando de CancelarTransacao

ACBrTEFAPI1.CancelarTransacao( AResp.NSU,
                                     AResp.CodigoAutorizacaoTransacao,
                                     AResp.DataHoraTransacaoHost,
                                     AResp.ValorTotal,
                                     AResp.Finalizacao,
                                     AResp.Rede );

O comportamento foi o seguinte...

Ele cancelou a transação que eu mandei cancelar, confirmou as outras transações pendentes e imprimiu todos os comprovantes

seria esse mesmo o comportamento? ou seria outro comando para estorna?

Editado por Smaili
  • Moderadores
Postado

veja no caso do sitef ele está bufferizando os pagamentos e dai tu consegue por exemplo não confirmar uma transação

onde tendo 3 transações duas são confirmadas e 1 é desfeita.

então no caso tu sempre finalizar confirmando e marcando ou sinalizando que o pagamento não deve ser confirmado mas sim desfeito. e pronto

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
 

 

Postado
1 hora atrás, Juliomar Marchetti disse:

então no caso tu sempre finalizar confirmando e marcando ou sinalizando que o pagamento não deve ser confirmado mas sim desfeito. e pronto

Teria como você colocar um exemplo? pq eu não entendi como eu sinalizo que o pagamento não deve ser confirmado.

Utilizando o exemplo com o componente ACBrTEFD eu faço o mesmo procedimento e só é cancela o pagamento selecionado os outros continuam pendente.

  • Moderadores
Postado
49 minutos atrás, Smaili disse:

Teria como você colocar um exemplo? pq eu não entendi como eu sinalizo que o pagamento não deve ser confirmado.

Utilizando o exemplo com o componente ACBrTEFD eu faço o mesmo procedimento e só é cancela o pagamento selecionado os outros continuam pendente.

então se tu utiliza o exemplo é só fazer igual , lembre-se tu só vai tratar a questão de confirmação ou não. ao finalizar ele manda tudo. senão tem a confirmação ainda ele vai desfazer aquele unico cartão.

 

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
 

 

  • Fundadores
Postado
22 horas atrás, Smaili disse:

No caso eu não mandei cancelar, eu mandei o comando de FinalizarTransacao

ACBrTEFAPI1.FinalizarTransacao( AResp.Rede,
                                      AResp.NSU,
                                      AResp.Finalizacao,
                                      tefstsErroDiverso );

Mas também testei o comando de CancelarTransacao

ACBrTEFAPI1.CancelarTransacao( AResp.NSU,
                                     AResp.CodigoAutorizacaoTransacao,
                                     AResp.DataHoraTransacaoHost,
                                     AResp.ValorTotal,
                                     AResp.Finalizacao,
                                     AResp.Rede );

O comportamento foi o seguinte...

Ele cancelou a transação que eu mandei cancelar, confirmou as outras transações pendentes e imprimiu todos os comprovantes

seria esse mesmo o comportamento? ou seria outro comando para estorna?

a Sequencia parece correta, vá com o Debug e veja se realmente mandou o Status de Finalização como tefstsErroDiverso

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 componente TEFD o documento vinculado a transação era um número aleatório gerado por FormatDateTime('hhmmss',Now), com isso todo pagamento tinha um DocumentoVinculado  único. 

No componente TEFAPI é passado no início do pagamento o parâmetro IdentificadorTransacao(que no TEFAPIdemo é passado o Venda.NumOperacao que é sempre 1). 

A função de FinalizarTransacao do SiTef estorna o pagamento filtrando pelo DocumentoVinculado, no TEFD como o identificador é único ele estorna somente o pagamento enviado na função de FinalizarTransacao, mas no caso TEFAPI é o 1 para todos os pagamentos então ele estorna todos. 

  • Fundadores
Postado
1 hora atrás, Smaili disse:

No componente TEFAPI é passado no início do pagamento o parâmetro IdentificadorTransacao(que no TEFAPIdemo é passado o Venda.NumOperacao que é sempre 1). 

esse valor é incrementado a cada venda

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
3 minutos atrás, Daniel Simoes disse:

esse valor é incrementado a cada venda

Sim, mas digamos que a venda 1 tenha 3 pagamentos, quando o atendente tentar estornar um, o componente vai estornar todos os pagamentos da venda 1

Depois na venda 2 tem dois pagamentos e o atendente tentar estornar um pagamento o componente vai estornar os dois.

  • Fundadores
Postado
28 minutos atrás, Smaili disse:

Sim, mas digamos que a venda 1 tenha 3 pagamentos, quando o atendente tentar estornar um, o componente vai estornar todos os pagamentos da venda 1

sim, essa é dessa forma que o SiTEF funciona...

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.

  • Fundadores
Postado

Você pode usar a propriedade TACBrTEFAPIClassCliSiTef.ParamAdicFinalizacao  para informar que quer estornar apenas um dos pagamentos

https://dev.softwareexpress.com.br/en/docs/clisitef/clisitef_documento_principal/

image.png

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.

  • Fundadores
Postado

Para acessar essa propriedade, você precisaria usar o Typecast

  if (ACBrTEFAPI1.TEF is TACBrTEFAPIClassCliSiTef) then
  begin
    TACBrTEFAPIClassCliSiTef(ACBrTEFAPI1.TEF).ParamAdicFinalizacao.Add('{NumeroPagamentoCupom=XXX}');
    ACBrTEFAPI1.CancelarTransacao();
  end;

 

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

Deu certo fazendo dessa forma

TACBrTEFAPIClassCliSiTef(ACBrTEFAPI1.TEF).ParamAdicFinalizacao.add('{NumeroPagamentoCupom='+IntToStr(AResp.IdPagamento)+'}');
ACBrTEFAPI1.FinalizarTransacao();

Mas o componente já tem essas duas funções para cancelar ou estornar todas as transações  

ACBrTEFAPI1.FinalizarTransacoesPendentes(); 
ACBrTEFAPI1.CancelarOuEstornarTransacoesDiretorioTrabalho;

Acho que a função ACBrTEFAPI1.FinalizarTransacao() está com o comportamento errado

  • Obrigado 1
  • Fundadores
Postado
3 horas atrás, Smaili disse:

Acho que a função ACBrTEFAPI1.FinalizarTransacao() está com o comportamento errado

Não entendi... poderia por favor explicar melhor?

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
Em 25/01/2025 at 11:58, Daniel Simoes disse:

Não entendi... poderia por favor explicar melhor?

Alterar direto na classe TACBrTEFAPIClassCliSiTef

procedure TACBrTEFAPIClassCliSiTef.FinalizarTransacao(const Rede, NSU,
  CodigoFinalizacao: String; AStatus: TACBrTEFStatusTransacao);
var
  Confirma: Boolean;
  i: Integer;
  DocumentoVinculado: String;
  DataHora: TDateTime;
  NumeroPagamentoCupom: String;
begin
  // CliSiTEF não usa Rede, NSU e Finalizacao
  DocumentoVinculado := '';
  DataHora := 0;
  Confirma := (AStatus in [tefstsSucessoAutomatico, tefstsSucessoManual]);
  if (NSU = '') and (CodigoFinalizacao <> '') then  // capturado por 130 em CarregarRespostasPendentes ?
  begin
    DocumentoVinculado := CodigoFinalizacao;
    for i := 0 to fpACBrTEFAPI.RespostasTEF.Count-1 do
    begin
      if fpACBrTEFAPI.RespostasTEF[i].DocumentoVinculado = DocumentoVinculado then
      begin
        DataHora := fpACBrTEFAPI.RespostasTEF[i].DataHoraTransacaoComprovante;
        Break;
      end;
    end;
  end
  else
  begin
    i := fpACBrTEFAPI.RespostasTEF.AcharTransacao(Rede, NSU, CodigoFinalizacao);
    if (i >= 0) then
    begin
      DocumentoVinculado := fpACBrTEFAPI.RespostasTEF[i].DocumentoVinculado;
      DataHora := fpACBrTEFAPI.RespostasTEF[i].DataHoraTransacaoComprovante;
	  if not Confirma then
	  begin
		NumeroPagamentoCupom := '{NumeroPagamentoCupom='+IntToStr(fpACBrTEFAPI.RespostasTEF[i].IdPagamento)+'}';
		ParamAdicFinalizacao.Add(NumeroPagamentoCupom);
	  end;
    end;
  end;

  FinalizarTransacaoSiTef(Confirma, DocumentoVinculado, DataHora);
  
  if not Confirma then
    ParamAdicFinalizacao.Delete(ParamAdicFinalizacao.IndexOf(NumeroPagamentoCupom));
end;

 

E verificar se pode remover essa validação na função TACBrTEFAPIClassCliSiTef.FinalizarTransacaoSiTef

if (pos(DoctoStr, fDocumentosFinalizados) > 0) then
  Exit;

Pois ela não deixa estornar mais que um pagamento por venda 

Postado

Pequeno ajuste para validar se variavel NumeroPagamentoCupom esta vazia 

procedure TACBrTEFAPIClassCliSiTef.FinalizarTransacao(const Rede, NSU,
  CodigoFinalizacao: String; AStatus: TACBrTEFStatusTransacao);
var
  Confirma: Boolean;
  i: Integer;
  DocumentoVinculado: String;
  DataHora: TDateTime;
  NumeroPagamentoCupom: String;
begin
  // CliSiTEF não usa Rede, NSU e Finalizacao
  DocumentoVinculado := '';
  DataHora := 0;
  Confirma := (AStatus in [tefstsSucessoAutomatico, tefstsSucessoManual]);
  if (NSU = '') and (CodigoFinalizacao <> '') then  // capturado por 130 em CarregarRespostasPendentes ?
  begin
    DocumentoVinculado := CodigoFinalizacao;
    for i := 0 to fpACBrTEFAPI.RespostasTEF.Count-1 do
    begin
      if fpACBrTEFAPI.RespostasTEF[i].DocumentoVinculado = DocumentoVinculado then
      begin
        DataHora := fpACBrTEFAPI.RespostasTEF[i].DataHoraTransacaoComprovante;
        Break;
      end;
    end;
  end
  else
  begin
    i := fpACBrTEFAPI.RespostasTEF.AcharTransacao(Rede, NSU, CodigoFinalizacao);
    if (i >= 0) then
    begin
      DocumentoVinculado := fpACBrTEFAPI.RespostasTEF[i].DocumentoVinculado;
      DataHora := fpACBrTEFAPI.RespostasTEF[i].DataHoraTransacaoComprovante;

      if not Confirma then
      begin
        NumeroPagamentoCupom := '{NumeroPagamentoCupom='+IntToStr(fpACBrTEFAPI.RespostasTEF[i].IdPagamento)+'}';
        ParamAdicFinalizacao.Add(NumeroPagamentoCupom);
      end;
    end;
  end;

  FinalizarTransacaoSiTef(Confirma, DocumentoVinculado, DataHora);
  
  if not Confirma and (NumeroPagamentoCupom <> '') then
    ParamAdicFinalizacao.Delete(ParamAdicFinalizacao.IndexOf(NumeroPagamentoCupom));
end;

 

  • Moderadores
Postado
14 minutos atrás, Smaili disse:

Pequeno ajuste para validar se variavel NumeroPagamentoCupom esta vazia 

procedure TACBrTEFAPIClassCliSiTef.FinalizarTransacao(const Rede, NSU,
  CodigoFinalizacao: String; AStatus: TACBrTEFStatusTransacao);
var
  Confirma: Boolean;
  i: Integer;
  DocumentoVinculado: String;
  DataHora: TDateTime;
  NumeroPagamentoCupom: String;
begin
  // CliSiTEF não usa Rede, NSU e Finalizacao
  DocumentoVinculado := '';
  DataHora := 0;
  Confirma := (AStatus in [tefstsSucessoAutomatico, tefstsSucessoManual]);
  if (NSU = '') and (CodigoFinalizacao <> '') then  // capturado por 130 em CarregarRespostasPendentes ?
  begin
    DocumentoVinculado := CodigoFinalizacao;
    for i := 0 to fpACBrTEFAPI.RespostasTEF.Count-1 do
    begin
      if fpACBrTEFAPI.RespostasTEF[i].DocumentoVinculado = DocumentoVinculado then
      begin
        DataHora := fpACBrTEFAPI.RespostasTEF[i].DataHoraTransacaoComprovante;
        Break;
      end;
    end;
  end
  else
  begin
    i := fpACBrTEFAPI.RespostasTEF.AcharTransacao(Rede, NSU, CodigoFinalizacao);
    if (i >= 0) then
    begin
      DocumentoVinculado := fpACBrTEFAPI.RespostasTEF[i].DocumentoVinculado;
      DataHora := fpACBrTEFAPI.RespostasTEF[i].DataHoraTransacaoComprovante;

      if not Confirma then
      begin
        NumeroPagamentoCupom := '{NumeroPagamentoCupom='+IntToStr(fpACBrTEFAPI.RespostasTEF[i].IdPagamento)+'}';
        ParamAdicFinalizacao.Add(NumeroPagamentoCupom);
      end;
    end;
  end;

  FinalizarTransacaoSiTef(Confirma, DocumentoVinculado, DataHora);
  
  if not Confirma and (NumeroPagamentoCupom <> '') then
    ParamAdicFinalizacao.Delete(ParamAdicFinalizacao.IndexOf(NumeroPagamentoCupom));
end;

 

sugestão de mudança? se sim anexe o arquivo

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
 

 

  • Fundadores
Postado

Essas modificações parecem que podem causar efeitos colaterais, para quem deseja o comportamento padrão do SiTef, que é Confirmar ou Desfazer todas as transações da mesma venda

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
11 horas atrás, Daniel Simoes disse:

Essas modificações parecem que podem causar efeitos colaterais, para quem deseja o comportamento padrão do SiTef, que é Confirmar ou Desfazer todas as transações da mesma venda

Só que o componente TEFD com o SiTef estorna os pagamentos individuais. 

Eu acho mais fácil ter pessoas que estão usando o componente achando que está estornando os pagamentos individualmente do que estornando todos, pq se alguém olha o comportamento no TEFAPIDemo vai achar que estorna os pagamentos individualmente

 

  • Fundadores
Postado

Mas isso está mudando o comportamento atual...

Seria necessário ter alguma propriedade ou configuração para Ligar o novo modo de funcionamento, para quem assim o desejasse

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.

  • Membros Pro
Postado

Pelo que entendi, se o componente estiver parametrizado pra confirmar a transação ao concluir, conforme for inserindo os cartões e digitando a senha, então o usuário quiser cancelar algum pagamento, deverá ser feito o cancelamento de tudo. Porém, é possível configurar o componente pra deixar a transação pendente e então seria possível cancelar pagamento por pagamento individualmente.

O problema que estou tendo, é porque configurei o componente pra confirmar as transações ao serem concluídas, porém, o usuário pressiona ESC pra retornar a tela anterior, é exibido a tela pra digitar a senha gerencial 9999, mas muitos usuários não sabem dessa senha e pressionam ESC várias vezes e então o componente está apagando tudo que está em memória e o arquivo, a transação não é cancelada e fica impossível cancelar ela posteriormente.

Minha pergunta é: seria possível cancelar todas as transações ou cada uma individualmente, mesmo que estivesse configurado pra confirmar as transações, mas que não solicitasse a senha gerencial nem perguntasse se o cartão é débito ou crédito ? Isso facilitaria bastante a vida do usuário e a nossa também, rsrs.

  • Fundadores
Postado

Cancelamento de Transação e diferente de Desfazimento de Transação...

Se a transação for Confirmada ela precisaria ser Cancelada e isso requer o cartão do Cliente...

Pelo fluxo que você descreveu, você não deveria Confirmar as transações automaticamente, mas sim apenas no final da Venda

Pois nesse caso você poderia rapidamente Desfazer todas as transações pendentes

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.

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.