Smaili Amorim Postado 23 Janeiro Postado 23 Janeiro Bom dia, ao excluir um pagamento de uma venda, com múltiplos pagamentos utilizando o TACBrTEFAPI . O componente está cancelando todos os pagamentos pendentes.
Moderadores Juliomar Marchetti Postado 23 Janeiro Moderadores Postado 23 Janeiro No caso se está em andamento tu não cancela, somente estorna ela. se tu mandar cancelar vai cancelar todas. no caso tu não confirma essa e sim estorna Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Smaili Amorim Postado 23 Janeiro Autor Postado 23 Janeiro (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 23 Janeiro por Smaili
Moderadores Juliomar Marchetti Postado 23 Janeiro Moderadores Postado 23 Janeiro 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 Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Smaili Amorim Postado 23 Janeiro Autor Postado 23 Janeiro 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 Juliomar Marchetti Postado 23 Janeiro Moderadores Postado 23 Janeiro 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. Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Fundadores Daniel Simoes Postado 24 Janeiro Fundadores Postado 24 Janeiro 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 Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Smaili Amorim Postado 24 Janeiro Autor Postado 24 Janeiro 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 Daniel Simoes Postado 24 Janeiro Fundadores Postado 24 Janeiro 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 Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Smaili Amorim Postado 24 Janeiro Autor Postado 24 Janeiro 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 Daniel Simoes Postado 24 Janeiro Fundadores Postado 24 Janeiro 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... Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Fundadores Daniel Simoes Postado 24 Janeiro Fundadores Postado 24 Janeiro 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/ Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Fundadores Daniel Simoes Postado 24 Janeiro Fundadores Postado 24 Janeiro 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; Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Smaili Amorim Postado 25 Janeiro Autor Postado 25 Janeiro 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 1
Fundadores Daniel Simoes Postado 25 Janeiro Fundadores Postado 25 Janeiro 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? Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Smaili Amorim Postado 27 Janeiro Autor Postado 27 Janeiro 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
Smaili Amorim Postado 27 Janeiro Autor Postado 27 Janeiro 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 Juliomar Marchetti Postado 27 Janeiro Moderadores Postado 27 Janeiro 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 Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Fundadores Daniel Simoes Postado 28 Janeiro Fundadores Postado 28 Janeiro 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 Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Smaili Amorim Postado 28 Janeiro Autor Postado 28 Janeiro 14 horas atrás, Juliomar Marchetti disse: sugestão de mudança? se sim anexe o arquivo ACBrTEFAPICliSiTef.pas
Smaili Amorim Postado 28 Janeiro Autor Postado 28 Janeiro 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 Daniel Simoes Postado 28 Janeiro Fundadores Postado 28 Janeiro 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 Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Membros Pro adriano.quintino Postado 29 Janeiro Membros Pro Postado 29 Janeiro 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 Daniel Simoes Postado 29 Janeiro Fundadores Postado 29 Janeiro 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 Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Smaili Amorim Postado 30 Janeiro Autor Postado 30 Janeiro Em 28/01/2025 at 16:20, Daniel Simoes disse: 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 Adicionado a propriedade EstornarPagamentoIndividual para ligar o novo comportamento ACBrTEFAPICliSiTef.pas ACBrTEFAPIComum.pas
Recommended Posts
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 contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora