Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

  • Respostas 66
  • Created
  • Última resposta

Top Posters In This Topic

Postado

Daniel, durante a homologação tive que fazer mais algumas alterações na unit do Vespague e também na ACBrTEFDClass, pois em um teste de cancelamento de transação CNC o ACBRTEFD primeiro faz a impressão do comprovante/relatório e só depois efetua o CNF para confirmar a transação de cancelamento e uma das exigências da Certificadora é que ao ser confirmado o cancelamento pelo client do Vespague, então a transação já deve ser efetivada antes da impressão do relatorio, dai depurando, cheguei no ACBrTEFDClass na linha 2326, procedure TACBrTEFDClass.ImprimirRelatorio onde existe o trecho:


       while FileExists( ArqBackup ) do

       begin

          try

             if ImpressaoOk then

                self.CNF;

             else

                self.NCN ;


             DeleteFile( ArqBackup ) ;


          except

          end;

       end ;


Observe que o try..except que existe dentro do while não faz nada em except, ou seja, caso ocorra algum problema em alguma operação dentro deste bloco a aplicação ficará travada em loop e é o que ocorria com o Vespague, pois eu fui obrigado a enviar o CNF antes da impressão do relatório, o que acabou resultando em EXCEPT quando executava a linha do self.CNF. A minha alteração foi bastante simples veja abaixo:

       while FileExists( ArqBackup ) do

       begin

          try

             try

               if ImpressaoOk then

                  self.CNF

               else

                  self.NCN ;

             except

             end;


             DeleteFile( ArqBackup ) ;


          except

          end;

       end ;

Como o try..except principal já não trata nada mesmo, então coloquei um try..except na execução do comando self.CNF pois se der problema ele ainda continua sendo executado até sair do while.

As alterações na unit do ACBrTEFDVespague foram as seguintes:

- criei uma variável chamada fFlagTransacaoCNC para de dentro da procedure ProcessarResposta poder saber quando a execução partiu de um comando CNC, pois desta forma eu envio o CNF antes da chamada do TACBrTEFDClass.ImprimirRelatorio. A Unit está em anexo.

A propósito, até este post ainda não acabei a homologação, não deu tempo de finalizar todos os testes e ficou do Moises (gente fina) terminá-los na próxima segunda, logo, pode ser que eu poste mais coisas.

[]'s

ACBrTEFDVeSPague.pas

Postado

H O M O L O G A D Í S S I M O ! ! ! !

ufa, finalmente...

Eddie, Daniel, valeu pela ajuda, não teria conseguido sem vocês !!

Daniel, só não esquece das minhas alterações pro meu próximo sync não quebrar (ainda não conferi se já fez ou não, falto coragem :-D )

;-)

[]'s

Postado

Olá Ivan,

Parabéns pela homologação!

Eu continuo na luta aqui, e se não for abusar, gostaria que você nos dissesse como configurou o ACBrTEFD e como implementou os eventos dele.

Obrigado e sucesso!

Itamar Bermond

Ibersoft Sistemas
Governador Valadares, MG

Postado

Pessoal (e principalmente ao Daniel),

Procedimento:

Realizar uma transação de Crédito no valor de R$ 900,00. Desligar a ECF no Comprovante Vinculado (CCD) e após exibir a mensagem “Erro na impressão. Deseja tentar novamente? . ” Desligar o Computador. Após o retorno da energia, manter a ECF Desligada e iniciar a Automação.

Resultado esperado:

Procedimento semelhante ao teste anterior (texto do teste anterior: "A automação deve solicitar o desfazimento da Transação TEF e exibir a seguinte mensagem “A(s) trasanção(s) TEF NSU: XXXXXX e Valor: XX,XX está PENDENTE. Favor realizar o DESFAZIMENTO no menu administrativo. Cancelar o cupom fiscal ! ” - ao confirmar essa mesagem a automação deve abrir o menu ADM - transações pedentes, para DESFAZER a transação."), mas: AO ABRIR A TELA COM A TRANSAÇÃO PENDENTE FECHE SEM TRATAR, E REINICIA A APLICAÇÃO, A APLICAÇÃO DEVE APRESENTAR A MENSAGEM NOVAMENTE.

Eu estive estudando isso aqui, fazendo testes, debugando, e consegui entender algumas coisas:

Quando eu abro o sistema e inicializo o ACBrTEFDVeSPague ele chama automaticamente o método CancelarTransacoesPendentesClass. Tudo funciona certinho se eu seguir essa linha: informo login e senha; confirmo ou cancelo a transação. Se eu escolher a opção *Fechar* no menu e clicar no botão OK do diálogo, o sistema também funciona como esperado, ou seja, ele sai do ADM, exibe novamente a mensagem de que existem transações pendentes e chama o ADM novamente.

Até aqui tudo funciona maravilhosamente bem.

O problema acontece quando:

  • [*:2187jcks]clico no botão cancelar do diálogo de coleta ou do menu do TEF[*:2187jcks]digito login ou senha errados.

Nesses casos, o arquivo de backup é apagado, e então o loop (sair do ADM, exibir a mensagem e voltar ao ADM) não acontece mais.

Não consegui descobrir como tratar o retorno do diálogo de coleta ou do menu do TEF. Creio que se isso puder ser feito (não apagar o arquivo de backup em caso de cancelamento) o código do EddieBR e do Ivan Orosco pode ser descartado. Eu fiz testes com esse código (ainda não oficial) e o sistema trava ao terminar de confirmar ou cancelar as transações.

Alguma sugestão? Obrigado.

Itamar Bermond

Ibersoft Sistemas
Governador Valadares, MG

Postado

Olá Ivan,

Parabéns pela homologação!

Eu continuo na luta aqui, e se não for abusar, gostaria que você nos dissesse como configurou o ACBrTEFD e como implementou os eventos dele.

Obrigado e sucesso!

Olá itamar, basicamente segui o exemplo do ACBRTEFDemo e na minha aplicação criei la uma janelinha para configuração dos vários tipos de TEF suportados pelo ACBRTEFD onde é possível configurar os valores de cada propriedade, observe o print da minha telinha de configuração do tef pro VeSPague em anexo.

Quanto a eventos, propriamente para o Vespague teria la os eventos OnExibeMenu e OnObtemCampo, mas nem utilizei eles pois minha aplicação trabalha com o modo Foreground (aquele que exibe as telinhas do client do Vespague em java), achei melhor para que o usuário saiba distinguir quando é minha aplicação ou quando é o VeSPague que tá no controle da máquina pra não confundir de quem é a responsabilidade no momento (vai que da um pau :-D ).

No botão para "Cancelar Venda efetuada (CNC)", eu comentei todo o código que tem no exemplo e deixei apenas:

 ACBrTEFD1.CNC('','',Date(),0);
Para o botão "Não Conf. de Venda e/ou Imp. (NCN)", fiz a mesma coisa, comentei o código e deixei apenas:
 ACBrTEFD1.NCN('','',' ',0);
Teve também um botão que minha aplicação tinha que ter chamado "Administração Pendente", nele coloquei o código:

  ACBrTEFD1.TEFVeSPague.DesabilitarBotaoConfirma:=false;

  ACBrTEFD1.TEFVeSPague.ExecutandoVerificacaoTransacoesPendentes:=false;

  ACBrTEFD1.TEFVeSPague.VerificarTransacoesPendentesClass;

  if not ACBrTEFD1.TEFVeSPague.TinhaPendencias then

     MessageDlg('Não existem transações pendentes',mtinformation,[mbok],0);

de resto... acho que ficou igual ao ACBRTEFDemo.

Espero ter ajudado.

[]'s

post-649-13548987307897.jpg

Postado

Pessoal (e principalmente ao Daniel),

Procedimento:

Realizar uma transação de Crédito no valor de R$ 900,00. Desligar a ECF no Comprovante Vinculado (CCD) e após exibir a mensagem “Erro na impressão. Deseja tentar novamente? . ” Desligar o Computador. Após o retorno da energia, manter a ECF Desligada e iniciar a Automação.

Resultado esperado:

Procedimento semelhante ao teste anterior (texto do teste anterior: "A automação deve solicitar o desfazimento da Transação TEF e exibir a seguinte mensagem “A(s) trasanção(s) TEF NSU: XXXXXX e Valor: XX,XX está PENDENTE. Favor realizar o DESFAZIMENTO no menu administrativo. Cancelar o cupom fiscal ! ” - ao confirmar essa mesagem a automação deve abrir o menu ADM - transações pedentes, para DESFAZER a transação."), mas: AO ABRIR A TELA COM A TRANSAÇÃO PENDENTE FECHE SEM TRATAR, E REINICIA A APLICAÇÃO, A APLICAÇÃO DEVE APRESENTAR A MENSAGEM NOVAMENTE.

Eu estive estudando isso aqui, fazendo testes, debugando, e consegui entender algumas coisas:

Quando eu abro o sistema e inicializo o ACBrTEFDVeSPague ele chama automaticamente o método CancelarTransacoesPendentesClass. Tudo funciona certinho se eu seguir essa linha: informo login e senha; confirmo ou cancelo a transação. Se eu escolher a opção *Fechar* no menu e clicar no botão OK do diálogo, o sistema também funciona como esperado, ou seja, ele sai do ADM, exibe novamente a mensagem de que existem transações pendentes e chama o ADM novamente.

Até aqui tudo funciona maravilhosamente bem.

O problema acontece quando:

  • [*:307gwdqh]clico no botão cancelar do diálogo de coleta ou do menu do TEF[*:307gwdqh]digito login ou senha errados.

Nesses casos, o arquivo de backup é apagado, e então o loop (sair do ADM, exibir a mensagem e voltar ao ADM) não acontece mais.

Não consegui descobrir como tratar o retorno do diálogo de coleta ou do menu do TEF. Creio que se isso puder ser feito (não apagar o arquivo de backup em caso de cancelamento) o código do EddieBR e do Ivan Orosco pode ser descartado. Eu fiz testes com esse código (ainda não oficial) e o sistema trava ao terminar de confirmar ou cancelar as transações.

Alguma sugestão? Obrigado.

Não sei se entendi direito (to mó cansadão hoje e raciocinio leeeento), mas sobre o ponto onde ao inicializar a aplicação ele tem que perguntar sobre as transações pendentes existentes dentro do loop, está implementado dentro da procedure VerificarTransacoesPendentesClass, você vai ver que depois do 1o. try..except tem um while que faz justamente isso, ou seja, caso o usuário cancele a operação ou informe login ou senha incorreto, o vespague retorna erro com codigo 3, então ele fica dentro do while chamando o admin novamente e realizando a pergunta sobre transações pendentes.

Observe:


procedure TACBrTEFDVeSPague.VerificarTransacoesPendentesClass;

Var

  ArquivosVerficar    : TStringList ;

  ArqMask             : String;

  Retorno: Integer;

  MsgPendencias: WideString;

  perguntou: Boolean;


begin

  if not fExecutandoVerificacaoTransacoesPendentes then

     begin

        fExecutandoVerificacaoTransacoesPendentes:=true;

        GravaLog( Name +' VerificarTransacoesPendentesClass ');

        //exibe as pendencias

        ArquivosVerficar    := TStringList.Create;

        MsgPendencias := EmptyStr;


        try

           ArquivosVerficar.Clear;


           { Achando Arquivos de Backup deste GP }

           ArqMask := TACBrTEFD(Owner).PathBackup + PathDelim + 'ACBr_' + Self.Name + '_*.tef' ;

           FindFiles( ArqMask, ArquivosVerficar, True );


           { Adicionando Arquivo de Resposta deste GP (se ainda não foi apagado) }

           if FileExists( ArqResp ) then

              ArquivosVerficar.Add( ArqResp );


           { Monta a mensagem de todos os arquivos encontrados }

           if ArquivosVerficar.Count > 0 then

             begin

                MsgPendencias := 'Transações TEF a seguir estão PENDENTES:'+SLineBreak+SLineBreak;

             end

           ;


           while ArquivosVerficar.Count > 0 do

           begin

              if not FileExists( ArquivosVerficar[ 0 ] ) then

              begin

                 ArquivosVerficar.Delete( 0 );

                 Continue;

              end;


              Resp.LeArquivo( ArquivosVerficar[ 0 ] );


              {  Verificando se essa Resposta já foi cancela em outro arquivo }

              MsgPendencias := MsgPendencias+'Rede: '+Resp.Rede+SLineBreak+'NSU: '+Resp.NSU+SLineBreak+'Valor: '+FloatToStrF(Resp.ValorTotal, ffCurrency, 18, 2)+SLineBreak+SLineBreak;

              ArquivosVerficar.Delete( 0 );

           end;

        finally

           ArquivosVerficar.Free;

        end;


        //verifica pendencias

        if MsgPendencias <> EmptyStr then

          begin

            Retorno := 0;

            perguntou:=false;

            while Retorno <> 1 do

              begin

                try

                  if (not perguntou) and (fDesabilitarBotaoConfirma) then

                     begin

                       //MsgPendencias := MsgPendencias+'Favor realizar o DESFAZIMENTO no menu administrativo que será aberto a seguir.';

                       TACBrTEFD(Owner).DoExibeMsg( opmOK,'Favor realizar o DESFAZIMENTO no menu administrativo que será aberto a seguir.' {MsgPendencias});

                       fTinhaPendencias:=True;

                       perguntou:=true;

                     end;


                  if fDesabilitarBotaoConfirma then

                     TransacaoOpcao:='Confirmar';


                  try

                  FazerRequisicao( fTransacaoPendente, 'ADM') ;

                  except on e:Exception do

                    begin

                       MessageDlg('Erro no tratamento e transações pendentes: '+#13+e.Message,mtError,[mbOK],0);

                    end;

                  end;

                  if RespVS.Servico = 'executar' then

                    begin

                      Retorno := RespVS.Retorno;

                    end;

                except on e:Exception do

                  begin

                    if RespVS.Retorno<>3 then

                       MessageDlg('Erro no tratamento e transações pendentes: '+#13+e.Message,mtError,[mbOK],0);

                    perguntou:=false;

                  end;

                end;

                if RespVS.IsColeta then Retorno := 0;

                if RespVS.GetParamString('mensagem') = 'Nao ha transacoes pendentes para este terminal.' then

                  begin

                    Retorno := 1;

                  end

                ;

      //          ShowMessage('Retorno: '+IntToStr(Retorno));

                try

                  ProcessarResposta ;         { Faz a Impressão e / ou exibe Mensagem ao Operador }

                except on e:Exception do

                  begin

                    if e.message<>'Nenhuma Requisição Iniciada' then

                       MessageDlg('Erro no tratamento e transações pendentes: '+#13+e.Message,mtError,[mbOK],0);

                  end;

                end;

                sleep(250);

              end

            ;

            if Retorno = 0 then  Retorno := ContinuarRequisicao( True ) ;  { True = Imprimir Comprovantes agora }

          end

        ;


        //apaga os arquivos de backup das pendencias

        ArquivosVerficar    := TStringList.Create;


        try

           ArquivosVerficar.Clear;


           { Achando Arquivos de Backup deste GP }

           ArqMask := TACBrTEFD(Owner).PathBackup + PathDelim + 'ACBr_' + Self.Name + '_*.tef' ;

           FindFiles( ArqMask, ArquivosVerficar, True );



           { Adicionando Arquivo de Resposta deste GP (se ainda não foi apagado) }

           if FileExists( ArqResp ) then

              ArquivosVerficar.Add( ArqResp );


           { Apaga todos os arquivos encontrados }

           while ArquivosVerficar.Count > 0 do

           begin

              if not FileExists( ArquivosVerficar[ 0 ] ) then

              begin

                 ArquivosVerficar.Delete( 0 );

                 Continue;

              end;

              DeleteFile( PWideChar(ArquivosVerficar[ 0 ]) );

              ArquivosVerficar.Delete( 0 );

           end;

        finally

           ArquivosVerficar.Free;

        end;

       fExecutandoVerificacaoTransacoesPendentes:=false;

     end;

end;

É isso ou eu viajei ?

[]'s

Postado

Olá Ivan, obrigado pela atenção.

Não sei se entendi direito (to mó cansadão hoje e raciocinio leeeento), mas sobre o ponto onde ao inicializar a aplicação ele tem que perguntar sobre as transações pendentes existentes dentro do loop, está implementado dentro da procedure VerificarTransacoesPendentesClass, você vai ver que depois do 1o. try..except tem um while que faz justamente isso, ou seja, caso o usuário cancele a operação ou informe login ou senha incorreto, o vespague retorna erro com codigo 3, então ele fica dentro do while chamando o admin novamente e realizando a pergunta sobre transações pendentes.

Eu coloquei o código novo de vocês pra rodar aqui, e ele realmente faz o loop, mas ao confirmar ou desfazer a transação o sistema trava. Tem um post acima que fala sobre um try..except que resolve esse problema do travamento, mas eu testei também sem sucesso. Então resolvi voltar ao código "oficial" e tentar entendê-lo. Isso é meio complicado por causa do raciocínio lento causado pelo volume de trabalho e a pressão.

O ACBrTEFD faz o loop automaticamente sem esse código novo de vocês, desde que o arquivo de backup esteja na pasta. Só que se o processo for cancelado, propositalmente ou não, ele apaga o backup. Eu continuo aqui debugando e tentando entender como fazer para tratar o retorno do diálogo de forma que ao cancelar ele não apague o backup. Não apagando, o resto ele faz sem problemas.

Itamar Bermond

Ibersoft Sistemas
Governador Valadares, MG

Postado

Quando eu fiz as modificações pro VeSPague (primeiramente na classe TEFDial para trabalhar no modo File, e depois na classe do VesPague) eu nao encontrei problemas de travamento nem de apagar os arquivos no caso de cancelamento. O loop ficava la ate vir a mensagem "Nao existem transacoes pendentes".

Uma coisa que venho observando sobre as transações pendentes é o seguinte. Tem casos em que a transacao nao é confirmada, ficando como pendencia, porem o arquivo de backup da transacao é excluido normalmente. No modo file isso acontecia direto (problemas do gerenciador deles) e no modo background acontece raramente. Ainda não consegui pegar o que acontece.

No modo file eu tinha feito essa rotina ai diferente. Primeiro fazia dessa forma, verificando a existencia de arquivos de backup ao inicializar, e depois eu enviava o comando de transacoes pendentes.

Eu parei de usar essa funcao por 2 motivos. Primeiro.. de vez em quando ao executar o transacoes pendentes o client simplesmente nao responde, ou demora muito tempo. Segundo, pela demora de alguns segundos a mais toda vez que inicia o sistema.

Nao vi se foram feitas alteracoes recentes na classe, mas quando eu fiz a rotina o CancelarTransacoesPendentesClass nao chamava a funcao ADM de tratamento de pendencias, portanto nao abria login/senha. A classe fazia um loop e enviava um CNC para cada arquivo de backup encontrado, o que não funciona no VeSPague apos o reinicio do client.

Tem alguns outros detalhes que eu mudei referente a tratamento das mensagens ao operador na classe (e no processamento do meu PDV), assim que conseguir uma folga aqui eu posto alguma coisa e ja aproveito pra mudar algumas coisas.

Postado

Parabens pela homologação Ivan.

Quando fiz a minha apanhei bastante heheh mas com a ajuda do Moises e algumas noites sem dormir deu tudo certo... homologuei multiplos cartoes de primeira! heheh fiquei aqui no teamviewer só olhando.

Postado

Ah.. mais uma coisa que lembrei, que em produção enche bastante a paciencia.

Em caso de queda da internet por exemplo... o client perde comunicacao e nao retorna sozinho. Eu resolvi da seguinte forma. Antes de solicitar uma transacao de cartao, eu chamo um ATV, que nao responde caso o client esteja sem comunicacao, e chamo um arquivo .bat que mata o processo do VeSPague e roda novamente.

Seria +- assim:

Timeout de 10s (nao lembro qual o padrao).

- Solicito ATV.

Se nao responder ao ATV eu coloco o timeout maior, pois o client demora ate reconectar.

E faco um loop ate que o ATV responda ou o operador cancele a operacao. Dentro desse loop com o timeout maior, eu mostro uma mensagem e chamo o .bat que reinicia o client.

E apenas solicito o CRT quando o ATV responder OK.

Como em produção o client roda atraves de uma VPN, tem tambem o OpenVPN que as vezes desconecta tmb em caso de queda de internet.. mas é bem mais dificil.

  • Fundadores
Postado

Oi Ivan,

Em relação a Unit ACBrTEFDClass.pas

...dai depurando, cheguei no ACBrTEFDClass na linha 2326, procedure TACBrTEFDClass.ImprimirRelatorio onde existe o trecho:

Acho que podemos deixar apenas o Try Except que vc introduziu...


{ Enviando CNF ou NCN e apagando Arquivo de Backup }
ArqBackup := Resp.ArqBackup ;
while FileExists( ArqBackup ) do
begin
try
if ImpressaoOk then
self.CNF
else
self.NCN ;
except
end;

DeleteFile( ArqBackup ) ;
end ;
[/code]

Em relação a V&SPague... o que eles exigem durante a Inicialização da Aplicação quando há Transações Pendentes ?

Se não me engano (não me lembro direito) no V&SPague tem um comando que retorna se há transações pendentes... não é preferível usa-lo ao invés dos arquivos de Backup ?

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

Bom dia!

Estou com o seguinte problema:

Quando eu mudei para Background e estou usando o VesPagueClient e tento cancelar uma transação TEF

ele pede o login e a senha! Assim que eu coloco a senha e o login ele me retorna senha inválida!

[000555]: Usuário e/ou senha inválido.

Mesmo pelo demo está me retornando isso!

Mais quando eu uso o Simulador do V&SPague ele não me retorna esta menssagem!

Já falei com o pessoa do suporte do V&SPague e eles me disseram que não mudaram a senha e o login para testes,

continua login:logista e senha:logista!

Postado

Era isso mesmo, aviam me passado o login e senha errados! Obrigado!

Estou tendo um probleminha aqui quando tento realizar uma tranzação

com cartão de credito onde o valor que tento pagar com o cartão de

credito é maior que o Saldo a Pagar, dando a seguinte menssagem:

'Operação TEF deve ser igual ao Saldo a Pagar'

O pessoal da Homologadora do V&SPague disse que para o TEF Dedicado deles é

obrigatório permitir troco pela forma de pagamento CARTÃO!

Oque devo fazer? Obrigado!

Postado

O teste é o 32 do roteiro de pre-homologacao do V&SPague:

A transação será aprovada. O valor da venda: R$ 100,00 , Deve lançar o valor de R$ 100,00 em DINHEIRO e R$ 50,00 no CARTÃO (tef). Deverá ser impresso = R$50,00 em Dinheiro, R$ 50,00 no Cartão e R$ 50,00 como TROCO. ( PARA NÃO DAR ERRO NO FECHAMENTO, ENVIE PRIMEIRO PARA ECF CARTÃO(tef) E DEPOIS DINHEIRO )

Total: .................................... 100,00

Cartão: .....................................50,00

Dinheiro: ...............................100,00

Soma: .................................... 150,00

Troco: .......................................50,00

Quanto eu coloco 50,00 na forma de pagamento dinheiro e 100,00 na forma de pagamento cartão em uma venda de 100,00

ele me retorna: Operação TEF deve ser igual ao Saldo a Pagar

Oque devo fazer? Obrigado!

Postado

anfm

Como eu faço isso se a forma de pagamento cartão tem que ser a ultima forma de pagamento usada

pois quando coloco a forma de pagamento cartão tem que fechar o cupom e imprime o vinculado?

  • Moderadores
Postado

Se vc fizer o primeiro pagamento em dinheiro no valor de R$ 100,00 o cupom já será fechado automaticamente pelo ECF.

No próprio texto que vc passou tem a seguinte informação: ( PARA NÃO DAR ERRO NO FECHAMENTO, ENVIE PRIMEIRO PARA ECF CARTÃO(tef) E DEPOIS DINHEIRO )

djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.xpos.com.br
Postado

anfm,

Fiz o teste agora como vc falou e ele imprimiu as formas de pagamento cartão e dinheiro e o troco

mais não está chamando o os eventos do ACBrTEFD para imprimir a forma de pagamento

e as vias da transação do cartão, mesmo quando o cartão é a provado! Eu tive que tirar a forma

de pagamento do evento 'OnComandaECFPagamento' e colocar depois da a provação

do cartão para que ela foce impressa no cupom! O evento 'OnComandaECFImprimeVia' não está sendo executado!

Oque posso está fazendo de errado?

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