Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Boa tarde,

Não estou conseguindo efetuar uma venda TEF em múltiplos cartões, caso eu registre no ECF uma forma de pagamento diferente para cada cartão.

 

Vamos ao cenário de teste e às informações de como reproduzir o problema.

Para começar estou utilizando o Delphi XE5, instalado em um Windows 10 x64. Estou utilizando o ACBR do repositório https://svn.code.sf.net/p/acbr/code/trunk2, e os fontes estão atualizados até a revisão 11791 (liberada em 17/05/2016).

Estou utilizando o emulador da Bematech MP-4200 TH FI.

No emulador estão cadastradas as seguintes formas de pagamento:

Forma Pagto: 1 -> Dinheiro  Permite Vinculado: N
Forma Pagto: 2 -> Duplicatas  Permite Vinculado: S
Forma Pagto: 3 -> Mastercard  Permite Vinculado: S
Forma Pagto: 4 -> Visa  Permite Vinculado: S

A solução TEF utilizada é a versão de demonstração da Pay&Go.

Agora vamos à aplicação TEFDDemo

1 - Deixei a aplicação TEFDDemo configurada conforme imagem 1.png em anexo;

1.png

2 - A guia operação ficou, conforme a imagem 2.png em anexo;

2.png

3 - Cliquei no botão "Abrir";

4 - Em seguida, cliquei no botão "Vende Item";

5 - Em seguida, Cliquei no botão "CRT", (o campo "Indice CARTÃO", da guia "Configuração" preenchido com o valor 4 [Visa] e o campo "Valor TEF", da guia "Operação", preenchido com valor 0,3);

6 - Depois, fui na guia "Configuração" e mudei o valor do campo "Indice CARTAO" para 3, que equivale à forma de pagamento Mastercard, e novamente na guia "Operação", cliquei em "CRT"

7 - Ainda na guia "Operação", mudei o valor do campo "Valor ECF" para 0,3 e cliquei em pagamento. No input seguinte(Digite o Cód. Forma de Pagamento), informei o código 4(que foi a forma de pagamento utilizada no passo 5). Cliquei mais uma vez no botão "Pagamento" e informei o Código da forma de pagamento 3 (passo 6);

8 - Mudei o valor do campo "Valor ECF" para 0,4 e cliquei mais uma vez em "Pagamento", informando dessa vez o código 1 (Dinheiro);

9 - Cliquei em "Fechar" e o cupom ficou como na imagem 3.png;

3.png

10 - Cliquei no botão "ImprimirTransacoesPendentes" e no final da impressão do vinculado, o componente dispara o erro: 'Erro retornado pela Impressora: Categoria: 7-Erro em Relatório Gerencial ou CCD. Motivo: 14-Envio de texto genérico para CCD ou Relatório Gerencial já fechado.'

Fiquei monitorando o trecho 

       trVinculado :
         ACBrECF1.LinhaCupomVinculado( ImagemComprovante.Text )

com breakpoints e percebi, para tentar entender o porque do problema e percebi, que, mesmo após fechado o vinculado, o componente volta novamente e tenta executar a linha informada acima.

O componente está configurado para imprimir duas vias do comprovante. Isso implica que ele deveria executar esse trecho 4 vezes. No entanto ele tenta executar uma quinta vez, daí o erro ocorre.

Obs: Preciso que fique registrado no ECF as diferentes formas de pagamentos utilizadas no processo. e não apenas uma forma de pagamento genérica "cartão".

 

Bug? Estou errando no modo de fazer isso?

 

Desde já grato pelo atendimento à esta demanda.

  • Moderadores
Postado

Já no começo já você informou o problema!

registre em uma única forma de pagamento! não tem problema nenhum não fique colocando em vários .. isso é limite de modelos de ECF

ao final é impresso tudo em um único vinculado!

fazendo isso vai funcionar

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 (editado)

Obrigado por responder. O problema de colocar tudo em uma única forma de pagamento, é que depois como fica a conferência dos totalizadores de "MEIOS DE PAGAMENTOS" da Redução Z? Algumas empresas utilizam essa informação da redução para confrontar com os relatórios da automação. Alguns contadores também utilizam essa informação na Redução Z para fazer os lançamentos nos caixas fiscais.

Nos testes que fiz, o que percebi  foi o componente não verificar que o vinculado já estava fechado e que todas as vias já haviam sido impressas. Poderia explanar melhor sobre o limite de modelos de ECF?

Li que alguns ECFs não suportam mais de um vinculado. Me parece que só a Daruma suporta. Mas acredito não ser esse o caso, pois o componente não tenta abrir um novo vinculado após o final do primeiro. O que ele tenta é imprimir uma próxima via, indevidamente, quando todas as vias já estão impressas e o vinculado fechado.

Editado por adenilton
Postado (editado)

Juliomar, entendo que todos usam assim, pois se tentassem detalhar os meios de pagamentos, não conseguiriam certo?

Mas o que vos notifico, acredito ser um BUG do componente, não vale a pena avaliar o código e tentar resolver, pra deixar certinho?

Bug deixado solto, pode fugir da gaiola e fazer estrago em outros lugares rsrs.

Editado por adenilton
Postado (editado)

Debugando aqui o componente no método "TACBrTEFD.ImprimirTransacoesPendentes;", para a situação descrita na minha primeira mensagem, vi que o problema está nos seguintes laços:

For K := 0 to Length( GrupoVinc )-1 do
.
.
.
  For J := 0 to RespostasPendentes.Count-1 do
  .
  .
  .
    while I <= NVias do
    .
    .               
    .               

Onde a variável GrupoVinc contém 2 registros, RespostasPendentes.Count vale 2 e NVias vale 2.

2x2x2 = 8. O componente, dessa forma iria tentar imprimir 8 vias em vez de 4. E quando ele imprime as 4 primeiras, ele fecha o vinculado. Depois disso tenta imprimir uma quinta via, no mesmo vinculado. Só que este já está fechado, causando o erro.

Mais detalhes:

Com isso em mãos o componente executa, quatro vezes o trecho abaixo, para o primeiro "GrupoVinc"

if I = 1 then
  ECFImprimeVia( trVinculado, I, ImagemComprovante1aVia )
else
  ECFImprimeVia( trVinculado, I, ImagemComprovante2aVia ) ;

O resultado é que ele imprime, somente para o primeiro "GrupoVinc", as quatro vias (duas para o primeiro meio de pagamento - visa e duas para o segundo meio de pagamento - mastercard.

Depois disso ele vai para o próximo "GrupoVinc" não tenta abrir um novo vinculado, em lugar disso, com o vinculado já fechado, ele tenta executar novamente o trecho acima e o ECF dispara uma exceção.

Vendo isso, dá pra perceber que quem programou, tentou implementar a impressão do vinculado, levando em conta cada meio de pagamento, mas a implementação acabou ficando bugada. Não me parece que o componente não suporta o fato de ter mais de um meio de pagamento do tipo cartão no ECF. O que parece é que sempre usaram assim por que ficou um bug nesse procedimento que ainda não foi corrigido, e por isso não conseguiam fazer do jeito certo.

Desde já grato pelo atendimento à esta demanda.

Editado por adenilton
  • Moderadores
Postado

Vc tentou no exemplo com a DLL do fabricante abrir mais de um vinculado quando o cupom tem varias formas de pagamento iguais? Pelo que me lembre a Bematech não permite este procedimento, por isso é adotado a SOMA dos pagamentos e a impressão de todos os comprovantes em apenas um vinculado.

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
  • Consultores
Postado
Em 19/05/2016 at 07:09, adenilton disse:

Debugando aqui o componente no método "TACBrTEFD.ImprimirTransacoesPendentes;", para a situação descrita na minha primeira mensagem, vi que o problema está nos seguintes laços:


For K := 0 to Length( GrupoVinc )-1 do
.
.
.
  For J := 0 to RespostasPendentes.Count-1 do
  .
  .
  .
    while I <= NVias do
    .
    .               
    .               

Onde a variável GrupoVinc contém 2 registros, RespostasPendentes.Count vale 2 e NVias vale 2.

2x2x2 = 8. O componente, dessa forma iria tentar imprimir 8 vias em vez de 4. E quando ele imprime as 4 primeiras, ele fecha o vinculado. Depois disso tenta imprimir uma quinta via, no mesmo vinculado. Só que este já está fechado, causando o erro.

Mais detalhes:

Com isso em mãos o componente executa, quatro vezes o trecho abaixo, para o primeiro "GrupoVinc"


if I = 1 then
  ECFImprimeVia( trVinculado, I, ImagemComprovante1aVia )
else
  ECFImprimeVia( trVinculado, I, ImagemComprovante2aVia ) ;

O resultado é que ele imprime, somente para o primeiro "GrupoVinc", as quatro vias (duas para o primeiro meio de pagamento - visa e duas para o segundo meio de pagamento - mastercard.

Depois disso ele vai para o próximo "GrupoVinc" não tenta abrir um novo vinculado, em lugar disso, com o vinculado já fechado, ele tenta executar novamente o trecho acima e o ECF dispara uma exceção.

Vendo isso, dá pra perceber que quem programou, tentou implementar a impressão do vinculado, levando em conta cada meio de pagamento, mas a implementação acabou ficando bugada. Não me parece que o componente não suporta o fato de ter mais de um meio de pagamento do tipo cartão no ECF. O que parece é que sempre usaram assim por que ficou um bug nesse procedimento que ainda não foi corrigido, e por isso não conseguiam fazer do jeito certo.

Desde já grato pelo atendimento à esta demanda.

Se você está propondo uma correção, anexe o arquivo alterado com as devidas correções.

[]'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.
Postado
1 hora atrás, André Ferreira de Moraes disse:

Vc tentou no exemplo com a DLL do fabricante abrir mais de um vinculado quando o cupom tem varias formas de pagamento iguais? Pelo que me lembre a Bematech não permite este procedimento, por isso é adotado a SOMA dos pagamentos e a impressão de todos os comprovantes em apenas um vinculado.

Obrigado por Responder André. O problema não é necessariamente precisar abrir um novo vinculado. Tudo bem se todas as vias forem impressas em um único vinculado. O problema do componente é tentar imprimir mais vias do que o configurado. 

Veja, configurei para imprimir duas vias. Fiz a venda em dois cartões. O número de vias deveria ser 4. O componente imprime as 4, fecha o vinculado e em seguida tenta imprimir mais 4 vias. Somando 8 vias ao todo. E isso é bug.

Quanto ao fato de ter um segundo vinculado ou não, como provavelmente o ECF não devolve essa informação, acredito que o componente deveria ter uma propriedade para escolher isso. 

Talvez uma propriedade chamada "EcfPermiteMultiplosVinculados".

Mas já que a política do componente, por enquanto é imprimir todas as vias num vinculado só, eu ainda não entendi que relação isso tem com o fato de imprimir detalhadamente os meios de pagamentos no Cupom Fiscal. Existe alguma regra que determine que devam existir tantos vinculados quantos meios de pagamentos no cupom?

1 hora atrás, EMBarbosa disse:

Se você está propondo uma correção, anexe o arquivo alterado com as devidas correções.

Desculpa, mas já olhei o código e ele é meio macarrônico. Vou me reservar a reportar e demonstrar o bug. Gostaria se possível que passasse para aqueles que desenvolveram a rotina, pois terão mais afinidade com ela.

Pergunta, alguém já fez o teste que fiz na primeira mensagem? É até rápido de fazer.

  • Moderadores
Postado

adenilton!

usamos o componente a tempos em nossos projetos !

o sr. André e Daniel usam no www.djpdv.com.br dessa forma e não tem problemas!

acredito que seja somente necessário mudar seu ponto de vista e usar conforme indicado e não terá problema algum!

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
 

 

  • Consultores
Postado
Em 20/05/2016 at 18:09, adenilton disse:

Pergunta, alguém já fez o teste que fiz na primeira mensagem? É até rápido de fazer.

Acabei de fazer aqui e não tive nenhum problema conforme você relata. Veja:

1) O componente abriu o primeiro comprovante e imprimiu duas vias do primeiro cartão e fechou o comprovante;

2) O componente abriu o segundo comprovante e imprimiu duas vias do segundo cartão e fechou o comprovante;

3) terminou o processo;

Não houve tentativas de imprimir uma quinta via.

Vou tentar mostrar algumas explicações agora de quando segui o debug, e talvez você possa dizer o que diferente está acontecendo.

Em 19/05/2016 at 07:09, adenilton disse:

Onde a variável GrupoVinc contém 2 registros, RespostasPendentes.Count vale 2 e NVias vale 2.

2x2x2 = 8. O componente, dessa forma iria tentar imprimir 8 vias em vez de 4. E quando ele imprime as 4 primeiras, ele fecha o vinculado. Depois disso tenta imprimir uma quinta via, no mesmo vinculado. Só que este já está fechado, causando o erro.

Não é isso o que acontece no código. Apenas os cartões que estiverem na mesma OrdemPagamento serão impressos. Vou copiar mais o código para você observar:

                 For K := 0 to Length( GrupoVinc )-1 do
                 begin
                    if GrupoVinc[K].OrdemPagamento >= 999 then
                       Gerencial := True;

                    For J := 0 to RespostasPendentes.Count-1 do
                    begin
                       with RespostasPendentes[J] do
                       begin
                          if GrupoVinc[K].OrdemPagamento <> OrdemPagamento then
                             continue ;

                          GPAtual := TipoGP;    // Seleciona a Classe do GP

Observe a linha que compara GrupoVinc[K].OrdemPagamento com OrdemPagamento e se estiverem diferentes, ele simplesmente ignora aquele cartão e suas vias.

 

[]'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.
  • Consultores
Postado

Observando o código, algo que faria sentido acontecer o que você relata é se todos os dois pagamentos tivessem a mesma OrdemPagamento e mesmo assim fosse englobados em grupos diferentes.

[]'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.
Postado

Obrigado mesmo por fazer os testes. Vou refazê-los aqui e postar o resultado mais detalhadamente. Pergunta: Você registrou tudo em uma única forma de pagamento no ECF ou informou-as separadamente (Exemplo: Visa = 1,00; Mastercard = 2,00)? 

  • Consultores
Postado

Formas de pagamento diferentes, cartões diferentes...

[]'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.
Postado

 

EMBarbosa, obrigado por testar. Realmente foi de grande ajuda. Eu consegui fazer aqui. Mas somente com as opções AutoEfetuarPagamento e AutoFinalizarCupom marcadas. Se não for pedir demais, poderia fazer o teste com essas opções DESMARCADAS?

Se der tudo certo, poderia me passar o roteiro que utilizou?

Na minha primeira mensagem eu estava usando o seguinte roteiro:

1º CRT para o primeiro meio de pagamento;

2º outro CRT para o segundo meio de pagamento;

3º Enviava o primeiro pagamento para o ECF;

4º Enviava o segundo pagamento para o ECF;

5º Fechava o cupom;

6º Enviava o comando "ImprimirTransacoesPendentes" para o TEF. Daí ocorria o erro.
 

Realmente com esse roteiro, eu confirmei que o componente tenta imprimir 8 vias.

Dei uma olhada no log, no que o componente fazia quando as duas opções acima estavam marcadas e mudei o fluxo para:

1º CRT para o primeiro meio de pagamento;

2º Enviar o primeiro pagamento para o ECF;

3º Enviar o comando ConfirmarTransacoesPendentes para o TEF, para confirmar as transações pendentes (conferi no manual de especificação técnica do Pay&Go e vi que tem que mandar um CNF antes do segundo cartão) 

4º Enviar o CRT para o segundo meio de pagamento;

4º Enviar o segundo pagamento para o ECF;

5º Fechar o cupom;

6º Enviar o comando "ImprimirTransacoesPendentes" para o TEF.

O resultado desse fluxo é que o componente somente imprimiu a última via.

 

Desde já grato por sua ajuda.

 

Postado

Obs: No demo, nesse segundo roteiro, se eu não executar o passo 3, quando tento enviar a segunda CRT, o componente devolve o erro: Operação TEF deve ser limitada ao Saldo restante a Pagar.

Obs 2: Esses testes foram feitos na aplicação demo com  as opções AutoEfetuarPagamento e AutoFinalizarCupom desmarcadas.

Postado (editado)

Obs 3: Se eu não executar o passo 3 desse segundo roteiro e ajustar OnInfoEcf da aplicação de demonstração, para que o componente não devolva a exceção " Operação TEF deve ser limitada ao Saldo restante a Pagar", daí o componente dá o problema citado na primeira mensagem. Tenta imprimir 8 vias.

EMBarbosa, se puder, teste a aplicação demo sem marcar as duas opções:  AutoEfetuarPagamento e AutoFinalizarCupom e tente vender em múltiplos cartões informando separadamente, no ECF, os meios de pagamentos. Gastei um bom tempo analisando o componente e ainda não descobri por que quando deixo marcada a opção "AutoEfetuarPagamento", as coisas funcionam normalmente. Mas quando desmarco essa opção e faço o pagamento manualmente enfrento problemas. 

 

Estou certo de que estou fazendo algo errado. Grato desde já pela ajuda.

Editado por adenilton
  • Consultores
Postado
5 horas atrás, adenilton disse:

Obs 2: Esses testes foram feitos na aplicação demo com  as opções AutoEfetuarPagamento e AutoFinalizarCupom desmarcadas.

Aqui no meu aplicativo eu uso os dois desmarcados. Não tenho nenum problema.

Você não pode marcar a opção AutoEfetuarPagamento. Ela vai de encontro aos requisitos do TEF atual. Ela foi implementada pois anteriormente assim que se fazia o CRT você devia imprimir a forma de pagamento no cupom fiscal

No Demo veja que tem um TPanel com a descrição "Pagamentos a Fazer". Fica na aba "Operação", ao lado das mensagens ao operador. Todos os pagamentos não TEF devem ser serializados ali, mas não enviados imediatamente ao ECF.

Leia a orientação do TEF, em especial o Fluxo para Multiplos cartões.

Exemplo no Cielo Premia você deve aguardar toda a decisão de forma de pagamentos e envios de CRT pois esses podem resultar em acréscimos ou descontos no cupom que você terá de enviar ao subtotalizar o cupom. Então dificilmente vai conseguir marcando essa opção.

17 horas atrás, adenilton disse:

Na minha primeira mensagem eu estava usando o seguinte roteiro:

1º CRT para o primeiro meio de pagamento;

2º outro CRT para o segundo meio de pagamento;

3º Enviava o primeiro pagamento para o ECF;

4º Enviava o segundo pagamento para o ECF;

5º Fechava o cupom;

6º Enviava o comando "ImprimirTransacoesPendentes" para o TEF. Daí ocorria o erro.

Não foi bem isso que você escreveu no primeiro tópico. Lá você descreve 2 CRT, uma pagamento Dinheiro e clicar no Fechar. Entendi que o "Fechar" era o botão "FinalizarCupom", pois clicar no botão "Fechar" não fecharia o cupom de forma alguma sem fazer os pagamentos dos cartões. Neste caso, você não precisa enviar os pagamentos feitos pelo CRT. O componente cuidará disso. É só você implementar os eventos dele corretamente, principalmente o onComandaECF, onComandaECFPagamento, OnComandaECFSubtotaliza. E no Demo eles estão implementados.

17 horas atrás, adenilton disse:

Dei uma olhada no log, no que o componente fazia quando as duas opções acima estavam marcadas e mudei o fluxo para:

1º CRT para o primeiro meio de pagamento;

2º Enviar o primeiro pagamento para o ECF;

3º Enviar o comando ConfirmarTransacoesPendentes para o TEF, para confirmar as transações pendentes (conferi no manual de especificação técnica do Pay&Go e vi que tem que mandar um CNF antes do segundo cartão) 

4º Enviar o CRT para o segundo meio de pagamento;

4º Enviar o segundo pagamento para o ECF;

5º Fechar o cupom;

6º Enviar o comando "ImprimirTransacoesPendentes" para o TEF.

Conforme acabei de descrever acima, você não pode fazer desse modo. Quando o segundo CRT for enviado, ele pode retornar um desconto para ser enviado ao seu cupom fiscal. Mas como você já enviou o pagamento para o ECF, você não conseguirá fazer o desconto. Com isso você não consegue terminar o processo.

 

[]'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.
Postado

Obrigado EMBarbosa. Era aí que eu estava errando ao consumir a aplicação de demonstração. Eu NÃO estava utilizando o botão "FinalizarCupom" e SIM o botão "Fechar". Dessa forma eu também enviava cada pagamento manualmente para o ECF, por meio do botão "Pagamento". Agora funcionou.

  • Consultores
Postado
48 minutos atrás, adenilton disse:

Obrigado EMBarbosa. Era aí que eu estava errando ao consumir a aplicação de demonstração. Eu NÃO estava utilizando o botão "FinalizarCupom" e SIM o botão "Fechar". Dessa forma eu também enviava cada pagamento manualmente para o ECF, por meio do botão "Pagamento". Agora funcionou.

Que bom que agora está funcionando. Bola pra frente. :)

Só tome cuidado para descrever todos os passos que fizer da próxima vez. ;)

[]'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.
×
×
  • 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.