Ir para conteúdo
  • Cadastre-se

jackson Lima

Membros
  • Total de ítens

    148
  • Registro em

  • Última visita

Tudo que jackson Lima postou

  1. Pessoal, atualmente eu pego os valor de saque e desconto no evento: DepoisConfirmarTransacoes Porém quando é múltiplos cartões esse evento só é chamado no final de passar todos os cartões, ai se o primeiro cartão retornar reajuste minha tela de pagamentos fica desatualizada. Como eu posso pegar esses valor sem confirmar as transações?
  2. Pessoal, encontrei o problema, o erro era pq um programador alterou o timeout dentro de uma função aqui no nosso sitema.
  3. Pessoal, ao enviar qualquer comando com o integrador fechada o acbr respeita o tempo de timeout Porém ao enviar os dados venda, e fechar o integrador, é como se bugasse esse timeout e fica em um loop infinito dentro do while da função: function TComandoIntegrador.EnviaComando(numeroSessao: Integer; Nome, Comando: String; TimeOutComando : Integer = 0): String; var LocTimeOut, ActualTime, TimeToRetry : TDateTime; NomeArquivoXml, RespostaIntegrador : String; ATimeout: Integer; function CriarXml( NomeArquivo, Comando: String): String; var NomeArquivoTmp, NomeArquivoXml: String; begin NomeArquivoTmp := ChangeFileExt(NomeArquivo, '.tmp'); FOwner.DoLog('Criando arquivo: '+NomeArquivoTmp); WriteToFile(NomeArquivoTmp, Comando); if not FileExists(NomeArquivoTmp) then DoException('Erro ao criar o arquivo: '+NomeArquivoTmp); NomeArquivoXml := ChangeFileExt(NomeArquivoTmp,'.xml'); FOwner.DoLog('Renomeando arquivo: '+NomeArquivoTmp+' para: '+NomeArquivoXml); if not RenameFile(NomeArquivoTmp, NomeArquivoXml) then DoException('Erro ao renomear o arquivo: '+ NomeArquivoTmp+' para: '+NomeArquivoXml); Result := NomeArquivoXml; end; begin Result := ''; Clear; NomeArquivoXml := CriarXml( FPastaInput + LowerCase(Nome) + '-' + IntToStr(numeroSessao), Comando); ActualTime := Now; TimeToRetry := IncSecond(ActualTime,5); if (TimeOutComando > 0) then ATimeout := TimeOutComando else ATimeout := FTimeout; if (ATimeout <= 25) then ATimeout := 25; LocTimeOut := IncSecond(ActualTime, ATimeout); RespostaIntegrador := AguardaArqResposta(numeroSessao); while EstaVazio(RespostaIntegrador) and (ActualTime < LocTimeOut) do // Fica em loop aqui ao fechar integrador no enviardadosvenda begin Sleep(100); RespostaIntegrador := AguardaArqResposta(numeroSessao); ActualTime := Now; if ActualTime > TimeToRetry then //Caso arquivo ainda não tenha sido consumido após 5 segundos, recria o arquivo begin TimeToRetry := IncSecond(ActualTime,5); if FilesExists(NomeArquivoXml) then begin try FOwner.DoLog('Apagando arquivo não processado: '+NomeArquivoXml); DeleteFile(NomeArquivoXml); except end; NomeArquivoXml := CriarXml( FPastaInput + LowerCase(Nome) +'-'+ IntToStr(numeroSessao) + '-' + FormatDateTime('HHNNSS', ActualTime), Comando); end; end; end; if FilesExists(NomeArquivoXml) then // Apaga arquivo não tratado pelo Integrador begin FOwner.DoLog('Apagando arquivo: '+NomeArquivoXml); DeleteFile(NomeArquivoXml); end; if EstaVazio(RespostaIntegrador) then begin FErroTimeout := True; DoException('Sem Resposta do Integrador'); end; FOwner.DoLog('RespostaIntegrador: '+RespostaIntegrador); FResposta:= RespostaIntegrador; FIntegradorResposta.LerResposta(RespostaIntegrador); if (FIntegradorResposta.Codigo <> 'EE') then Result := PegaResposta(FResposta) else Result := FResposta; end; É bem fácil de reproduzir o erro, é só no momento de enviar a função: enviardadosvenda fechar o integrador (isso fara com que ele não retorne nenhuma resposta e fique em loop sem obedecer ao timeout)
  4. Mas não posso alterar se tem uma verificação que as vezes vem ponto e outras vem virgula Queria saber o motivo de ter aquele código. @André Ferreira de Moraes tu lembra por que tu colocou essa verificação?
  5. Ele sempre entra nesse ponto e adiciona o valor com a virgula. Xml: <Integrador> <Identificador> <Valor>795880</Valor> </Identificador> <Componente Nome="VFP-e"> <Metodo Nome="EnviarPagamento"> <Construtor> <Parametros> <Parametro> <Nome>chaveAcessoValidador</Nome> <Valor>25CFE38D-3B92-46C0-91CA-CFF751A82D3D</Valor> </Parametro> </Parametros> </Construtor> <Parametros> <Parametro> <Nome>ChaveRequisicao</Nome> <Valor>26359854-5698-1365-9856-965478231456</Valor> </Parametro> <Parametro> <Nome>Estabelecimento</Nome> <Valor/> </Parametro> <Parametro> <Nome>SerialPos</Nome> <Valor>TEF</Valor> </Parametro> <Parametro> <Nome>Cnpj</Nome> <Valor>14200166000166</Valor> </Parametro> <Parametro> <Nome>IcmsBase</Nome> <Valor>99.99</Valor> </Parametro> <Parametro> <Nome>ValorTotalVenda</Nome> <Valor>99,99</Valor> </Parametro> <Parametro> <Nome>HabilitarMultiplosPagamentos</Nome> <Valor>true</Valor> </Parametro> <Parametro> <Nome>HabilitarControleAntiFraude</Nome> <Valor>false</Valor> </Parametro> <Parametro> <Nome>CodigoMoeda</Nome> <Valor>BRL</Valor> </Parametro> <Parametro> <Nome>EmitirCupomNFCE</Nome> <Valor>false</Valor> </Parametro> <Parametro> <Nome>OrigemPagamento</Nome> <Valor>0000933 Venda para consumidor final.</Valor> </Parametro> </Parametros> </Metodo> </Componente> </Integrador>
  6. Estão atualizados. O estranho que tem a verificação no código de enviar com vírgula ou não, de acordo com a chave acesso validador
  7. Pessoal, analisando o xml de pagamento percebi que o acbr está enviando o valor da venda com vírgula, sendo que os outros valores são com ponto. Parametro.GerarParametro('IcmsBase' , EnviarPagamento.IcmsBase, tcDe2); if EnviarPagamento.ChaveAcessoValidador = cChaveAcessoIntegrador then Parametro.GerarParametro('ValorTotalVenda' ,FloatToString( EnviarPagamento.ValorTotalVenda, ',' ), tcStr) else Parametro.GerarParametro('ValorTotalVenda' , EnviarPagamento.ValorTotalVenda, tcDe2); Esse código colocar a virgula no valor total, função: function TEnviarPagamentoW.GerarXml(): boolean; na unit: pcnVFPeW Qual a razão desse código? Obrigado
  8. Pessoal sei que o integrador não tem nada haver com o acbr, eles apenas trocam informações, porém estou passando por um erro (estou tentando entrar em contato com o pessoal da sefaz, mas até agora nada) e se alguém puder me dar uma força seque o arquivo de log em anexo. O erro é que algumas vezes o integrador não responde, ou retorna erros esquisitos como: estado atual do objeto inválido, erro desconhecido etc, isso principalmente quando é venda no TEF 20181121ACBrSAT.log
  9. Bom dia pessoal. Visualmente, como vocês tem apresentado para o cliente as informações de acréscimo, desconto e troco que podem ser retornado pelo TEF? Caso o TEF retorne saque ou desconto/acréscimo a aplicação de vocês altera os saques ou descontos/acréscimos que foram definidos no fechamento da venda pelo usuário? Nunca ví na tela de pagamento dos sistemas essas informações na tela, geralmente o saque (troco) e reajuste de valores (acréscimo ou desconto) são definidos no fechamento da venda e não nas formas de pagamento.
  10. Você não passa o valor do saque, quem retorna ele é o TEF. dependendo da credenciadora e como foi selecionado no pinpad Passos: Você manda apenas o valor de 10,00 que é o valor original. O TEF vai retornar 14,00 (você não controla isso, pode vir saque ou não). O acbrtefd vai retornar o saque, então, você vai no evento DepoisConfirmarTransacoes ver teve saque: if RespostasPendentes[resp].saque > 0 Se tiver saque retornado pelo tef ai você envia como valor de pagamento no ecf que ela mesma gera troco automaticamente.
  11. Brother, em todos os eventos do ACBRTEFD que tiver o parametro: Resp você pode acessar esse valor do saque e verificar se vem maior que zero. como o mcnonimo falou lá nesse tópico ai antigo, você não pode passar o valor com o saque embutido. Você passa o valor da venda: 10,00 e o gerenciador padrão retorna 14,00 com o saque embutido. Com o retorno do saque pelo gerenciador padrão ai sim você pega esse valor e atualiza suas tabelas e manda para o ecf. Como você vai saber que veio saque? Se você der uma olhada direitinho no componente tef, tem uma propriedade chamada Saque dentro de fTefClass que você pode usá-la para saber se veio saque. Como não uso impressora fiscal, eu pego esse valor no evento: DepoisConfirmarTransacoes do componente ACBrTEFD: for Resp := 0 to RespostasPendentes.Count - 1 do if RespostasPendentes[Resp].Saque > 0 then // aqui eu salvo no meu banco que teve saque ou troco que dá no mesmo Mas você vai testar ai no seu sistema, se você vai pegar o valor do saque no onComandaECF ou outro evento. Espero ter ajudado. ?
  12. Dicas: 1 - Leia os tópicos que te interessem em: https://www.projetoacbr.com.br/forum/forum/13-acbrtefd-e-dúvidas-sobre-tef/ são apenas umas 40 páginas, vai separando o que te interessa, por exemplo: pay&go e tefdial 2 - Estude os 2 aplicativos de exemplo com TEF que vem com o Acbr: ACBr\Exemplos\ACBrTEFD e ACBr\Exemplos\ACBrDFe\ACBrNFe\Delphi - TEF, nesse último tem um exemplo mais enxuto de TEF e NFE. 3 - Estude o componente: analise os métodos e propriedades dele. 4 - Cada passo acima leva 1 dia mais ou menos, depois que entender ai é só implementar, vai levar 1 semana. Resumindo em 2 semanas no máximo você implementa tudo. Espero ter ajudado
  13. Não sei se te ajuda mas dá uma olhada em: https://groups.google.com/forum/#!searchin/sefaz_integrador_fiscal/serviço|sort:date/sefaz_integrador_fiscal/ExdM7cynFWY/LFshR6zfCgAJ Pode ser um norte pra sua resposta.
  14. O PayGo irá pegar o foco, não se preocupe. Entre em contato com a NTK e peça os emuladores do PayGo, quando chamar o CRT o emulador abrirá automaticamente para digitar os dados do cartão.
  15. Desculpem pessoal, encontrei o problema. Tinha uma unit no meu projeto que tinha no uses: ACBrMDFeDAMDFEFR ai por isso que pedia o fast.
  16. Estou instalando o acbr do zero, usando a nfe, nfce e sat mas com o relatório do fortes. Na opção de gerador de relatórios (Fastreport) não selecionei nenhuma opção. Porém ao complicar o sistema recebo: ACBrDAMDFEFR.as(44): F2063 Could not compile used unit 'frxClass' A minha dúvida é se preciso instalar o fast report mesmo que não use ele? Desde já obrigado.
  17. Beleza. Caso ajude, se comentar essa linha em pcnVFPeR: function TRespostaStatusPagamentoR.LerXml: boolean; begin Leitor.Grupo := Leitor.Arquivo; // Linha comentada // RespostaStatusPagamento.Clear; if (Pos(UpperCase('retorno'),UpperCase(Leitor.Arquivo)) <= 0) and (Pos(UpperCase('Integrador'),UpperCase(Leitor.Arquivo)) <= 0) then RespostaStatusPagamento.Retorno := Leitor.Arquivo else begin RespostaStatusPagamento.Retorno := Leitor.rCampo(tcStr, 'retorno'); RespostaStatusPagamento.IntegradorResposta.LerResposta(Leitor.Grupo); end; Result := True; end; E adicionar essa linha em ACBrIntegrador: function TACBrIntegrador.EnviarStatusPagamento( StatusPagamento: TStatusPagamento): TRespostaStatusPagamento; var Comando, Resp : String; begin Result := TRespostaStatusPagamento.Create; GerarNumeroSessao; StatusPagamento.Identificador := numeroSessao; Comando := StatusPagamento.AsXMLString; DoLog('EnviarStatusPagamento( '+Comando+' )'); Resp := FComandoIntegrador.EnviaComando(numeroSessao,'EnviarStatusPagamento',Comando); // LINHA NOVA Result.IntegradorResposta := FComandoIntegrador.FIntegradorResposta; Result.AsXMLString := Resp; end; Ai sim funciona. Mas não parece ser muito aconselhável. kkk
  18. Para reproduzir no demo é só inicializar o SAT e clicar em Enviar Status Pagamento. No showmessage que tem no evento do botão ao invés de: ShowMessage(RespostaStatusPagamento.Retorno); Altere para: ShowMessage(RespostaStatusPagamento.IntegradorResposta.Codigo); Log em anexo. ACBrSAT.log
  19. Para reproduzir é só manda o bin zerado em EnviarStatusPagamento.
  20. Retorno com erro: <Integrador> <Identificador> <Valor>178472</Valor> </Identificador> <IntegradorResposta> <Codigo>EE</Codigo> <Valor>Erro inesperado</Valor> </IntegradorResposta> <Resposta> <retorno>Uma exceção foi acionada pelo destino de uma chamada.</retorno> </Resposta> </Integrador> Retorno com sucesso: <Integrador> <Identificador> <Valor>759788</Valor> </Identificador> <IntegradorResposta> <Codigo>AP</Codigo> <Valor>Arquivo processado</Valor> </IntegradorResposta> <Resposta> <IdPagamento>23322793</IdPagamento> <Mensagem>Pagamento enviado com sucesso ao validador fiscal! O ID da transação para acompanhar o status e identificá-la no portal de ajustes é 23322793</Mensagem> <StatusPagamento>EnviadoAoValidador</StatusPagamento> </Resposta> </Integrador> Eu tento acessar: if RespostaStatusPagamento.IntegradorResposta.Codigo = 'AP' then Mas me retorna vazio.
  21. Bom dia pessoal. Como eu posso saber se deu certo EnviarStatusPagamento? Seria usando: if (RespostaStatusPagamento.IntegradorResposta.Codigo = 'AP') then Obrigado.
  22. Boa tarde pessoal. Na documentação do integrador o campo idfila é descrito como caracter na imagem abaixo. Mas no acbr ele está como integer no objeto TStatusPagamento. É isso mesmo? Estou tentando enviar o NSU retornado pelo TEF para o IDFila. É isso mesmo? Tô meio perdido para enviar o StatusDoPagamento para o Integrador. Desde já obrigado.
  23. Usando o exemplo do posprinter que tem no svn com o acbr, quando envio uma impressão o componente não corta o papel. O checkbox Cortar papel está selecionado. Aqui o log: SetModelo(ppTexto) -------------------------------------------------------------------------------- ATIVAR - 23/04/18 15:37:10:121 - Modelo.: Texto - TimeOut: 3 - Porta..: RAW:ELGIN i9(USB) -------------------------------------------------------------------------------- Imprimir, Copias:1, DecodificarTags:SIM, TraduzirTags:SIM aaaaaaaaaaaaaaaaaaaaaa[CR][LF]aaaaaaaaaaaaaaaaaaaaaa[CR][LF]aaaaaaaaaaaaaaaaaaaaaa EnviarStringDevice - Inicializando: EnviarStringDevice( aaaaaaaaaaaaaaaaaaaaaa[CR][LF]aaaaaaaaaaaaaaaaaaaaaa[CR][LF]aaaaaaaaaaaaaaaaaaaaaa) Como faço para cortar o papel? Já tentei: ACBrPosPrinter1.ImprimirLinha('</corte_total>'); Mas tbm não funcionou.
×
×
  • 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.