Ir para conteúdo
  • Cadastre-se

Ivan Orosco

Membros Pro
  • Total de ítens

    71
  • Registro em

  • Última visita

Tudo que Ivan Orosco postou

  1. Bom dia a todos. Pessoal, preciso fazer a minha homologação PAF, e como todos, sempre tem o desespero da pergunta "Por onde começo ?!" Pretendo inclusive montar um post descrevendo todos os passos que tive que dar pra ajudar mais futuros aflitos. Minha situação é a seguinte: já tenho TEF homologado com a VesPage (graças a galera do ACBR que me ajudou muito) e meu sistema é bastante simples, controla lojas pequenas (apenas venda a consumidor) atualmente com um caixa só (ótimo exemplo pra quem for começar a implantar PAF) e trabalha com orçamento, ou seja, em meus cliente tem lá 2 terminais para fazer orçamento e o caixa que efetiva estes orçamentos (orçamentos detalhados, inclusive com forma de pagamento e tudo mais), minha base de dados é Postgre e pretendo utilizar a replicação nativa do banco pra atender ao requisito do terminal estar disponível e ter o servidor da retaguarda atras. Já olhei todas as páginas aqui do fórum do PAF e quanto mais leio, mais dúvida aparece Também estou lendo as documentações gigantescas da sefaz, o tal roteiro de teste da versao 1.7 de 09/2011, mas sinto falta de algumas coisas que acredito que só quem já homologou poderia ajudar. Bom, perguntas básicas: 1) Tem algum exemplo no ACBR para gerar esses tal de DAV ? Tem que ser impresso na ECF ou impressoras não fiscais ou impressoras comuns ? 2) Já vi que obrigatoriamente vou ter que implementar o Sintegra, também tenho que implantar NFe ou qualquer outra coisa ? 3) Minha aplicação deverá gerar os arquivos mensais da portaria Cat52 ? Hoje meus clientes fazem isso com o aplicativo das ECFs. Isso que é o tal do RFD ? 4) Essas chaves EAD que vi o pessoal falando, onde consigo isso e como configuro a aplicação pra gerar esses arquivos ? Vi que no exemplo do ACBRECF tem isso lá, mas como funciona e configura pra ver ? é obrigatório para o PAF ? 5) Alguém poderia tentar descrever rapidamente como seria o fluxograma de funcionamento do PAF ? tipo, bem basico: como 1o. faz o DAV, 2o. faz a venda, 3. assina o documento com a chave EAD.... sei la, só pra ter ideia se é que é possível. 6) E essa coisa toda de estoque com o PAF, como que funciona ? 7) Ouvi dizer que na homologação o pessoal analisa o nosso código fonte para saber se tem desvios ilegais, isso é verdade ? Bem, obviamente to mais perdido que cego em tiroteio, mas por enquanto acho que é só, creio que sabendo dessas resposta ai já começo a saber pra que lado fica o precipício Obrigado.
  2. Ok, no ACBR tem algum recurso para se gerar estes arquivos a partir de minha base para poder enviar para o Posto Fiscal ? []'s
  3. Este formato .INI gerado pelo DadosReducaoZ já é o padrão la para envio para o Posto Fiscal ? Posso apenas salvar em arquivo e mandar então ? Este comando deve ser utilizado antes ou depois do envio da redução Z ? []'s
  4. Boa tarde, pessoal, estou com uma dúvida que apesar de ter peneirado não encontrei solução aqui no fórum, também não sei se pesquisei corretamente. O problema é o seguinte: tem como salvar os dados da Redução Z antes de imprimi-la para que meu cliente possa mais tarde enviar estes arquivos para o Posto Fiscal ? Por um acaso seria o uso do comando ACBRECF.DadosReducaoZ e ele já traria a saida no formato correto para salvar em arquivo texto ? Ou meu cliente tme que usar um programinha pra capturar estes arquivos diretamente da impressora ? É isso que é a Nota fiscal Paulista né ? []'s
  5. 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
  6. 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 ). 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
  7. 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 ) []'s
  8. 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
  9. Alterei a Unit do Vespague conforme o Moises da Cemay (empresa que faz homologação) me orientou, as minhas alterações foram as seguintes: Criei as propriedades publicadas chamadas: - ExecutandoVerificacaoTransacoesPendentes - Para controlar a execução da procedure VerificarTransacoesPendentesClass para quando o componente for instanciado - DesabilitarBotaoConfirma - Para setar quando o botão de CONFIRMAR do client do Vespague deverá ser desabilitado (casos de trtamento de transações pendentes) - TinhaPendencias - Para minha aplicação saber se da última vez que o componente foi instanciado se existiam pendencias ou não Alterei a procedure VerificarTransacoesPendentesClass criada por nosso amigo Eddie da seguinte forma: - Fiz uso da propriedade ExecutandoVerificacaoTransacoesPendentes paa saber se deve ser executado ou não, esta alteração foi necessária para evitar que a procedure seja chamada mais de uma vez dentro de uma mesma instância e para setar de minha aplicação antes de ser executada se será executada (para casos em que o usuario acessa o menu do TEF e deseja executar Administração de Pendencias) - Tratei a propriedade DesabilitarBotaoConfirma para que caso seja setada passe o parâmetro TransacaoOpcao:='Confirmar'; para que desabilite o botão confirmar, isso é necessário quando se trata transações pendentes, mas no caso de uso atraves do botao Administração Pendencias o botão Confirmar do client deverá estar habilitado, dai a necessidade de se controlar este recurso de fora da classe do vespague (pela aplicação) - Alterei o local onde é exibida a mensagem de transações pendentes (pedido do homologador), agora a mensagem é exibida dentro do while que executa o ADM, no entanto, tive que criar um controlador para saber se a pergunta já foi realizada ou não. - Tive que colocar uns try..except em alguns pontos, pois existiam exceções ocorridas em algumas chamadas que quebravam a execução do while do ADM Que eu me lembro foi só isso. Segue a unit anexada. []'s ACBrTEFDVeSPague.pas
  10. Pretendo sim, é que ainda estou alterando, pois estou fazendo os últimos ajustes conforme o Moises vai me orientando, assim que estiver pronto eu anexo a Unit. []'s
  11. Eddie, seu código ficou ótimo, no entanto tive que fazer uns pequenos ajustes para passar na homologação, trat-se de dois try..except e uma alteração para que ele exiba a mensagem de transações pendentes caso o usuário informe senha incorreta ou cancele a telinha de login. Também criei uma propriedade nova na classe chamada fTinhaPendencias para poder consultá-la do lado da minha aplicação para saber se devo ou não exibir mensagem de alerta que foram tratadas pendencias no TEF e o usuário apurar a necessidade de cancelamento de cupons ou não. E também enviei o comando na variavel TransacaoOpcao:='Confirmar' para que não habilite o botão confirmar do Client. O código ficou assim: procedure TACBrTEFDVeSPague.VerificarTransacoesPendentesClass; Var ArquivosVerficar : TStringList ; ArqMask : String; Retorno: Integer; MsgPendencias: WideString; perguntou: Boolean; begin 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 ); // if MsgPendencias <> EmptyStr then // begin // MsgPendencias := MsgPendencias+'Favor realizar o DESFAZIMENTO no menu administrativo que será aberto a seguir.'; // TACBrTEFD(Owner).DoExibeMsg( opmOK, MsgPendencias); // end // ; 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 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; TransacaoOpcao:='Confirmar'; FazerRequisicao( fTransacaoPendente, 'ADM') ; 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 de 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 de 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; end; []'s
  12. Será que tem como saber se o usuário confirmou ou cancelou transações pendentes dentro do ADM do Vespague ? Pois se o usuário cancelar comprovante TEF pendente, então o correto é comandar o cancelamento do cupom não fiscal e fiscal que estiver em aberto não seria ? []'s
  13. Daniel, o negócia ta nessa function mesmo, o esquema é chamar a execução com tudo zerado e tirar a variavel ListaParams da jogada que dai a aplicação do Vespague pergunta o NSU. No meu caso ficou assim: execução: ACBrTEFD1.CNC('','',date(),0); na function TACBrTEFDVeSPague.CNC alterei a linha: Retorno := FazerRequisicao( fTransacaoCNC, 'CNC', Valor, '', ListaParams ) ; para: Retorno := FazerRequisicao( fTransacaoCNC, 'CNC', Valor, '', '' ) ; Creio que será necessário alterar o SVN. []'s
  14. Daniel, o Moises da Cemay que faz homologação remota de Vespague, me disse que para efetuar o cancelamento de transações efetuadas não é necessário que a aplicação colha as informações de Rede, NSU, Data, Hora e Valor e que eu devo tirar isso, eu peguei o exemplo do ACBRTEFDemo e la ele usa esse form que tem esses campos. Para que eu possa fazer o cancelamento sem informar esses dados é soh deixar e exibir o form e chamar direto o método ACBrTEFD1.CNC('','',date(),0) ? []'s
  15. Hmmmmm, ok, valeu
  16. Valeu pelo código Daniel E com relação a minha primeira pergunta no post ? sobre não imprimir leitura X caso a impressora seja desligada no meio da impressao do comprovante do TEF, tem como ? []'s
  17. Eddie, estou fazendo a minha homologação com o VeSPague também e creio estar passando por um problema similar... a minha situação é que quando é feita uma transação com dois cartões e a impressora é desligada na impressão da 1a. via do 2o. comprovante, o ACBR até chama o NCN, mas a transação não é desfeita, no entanto, neste ponto o sistema tem que desfazer a transação automaticamente e não chamar o ADM. Como você solucionou isso ? teste 15.8 do roteiro de testes da VeSPague. []'s
  18. Pessoal, estou homologando minha aplicação com o VeSPague também, no entanto com relação a cancelamento e reimpressão de comprovantes TEF, eu vi que o ACBR faz a impressão de uma Leitura X junto, dai falei lá pro minino da VeSPague (Marlon) e ele me informou que isso não é necessário. Como que desativo o componente do TEFD ou ACBRECF para não imprimir a leitura X em casos de cancelamneto e reimpressão de comprovantes ? Outra coisa que identifiquei dentro do roteiro de testes pra homologação... na situação em que é realizado uma venda com 2 cartões, ao se desligar a impressora fiscal na impressao de alguma via do comprovante de TEF e responder a questão "Tentar Novamente" com NAO, então deve ser comandado o cancelamento das transações. Porém, o ACBR estava realizando o cancelamento apenas da última transação. Fiz um desvio grotesco até pois não conheço os fontes do ACBR para corrigir a situação e gostaria de saber dos colegas mais experientes se isso pode ser mantido ou se eu estou fazendo cacá no código, o trecho é o seguinte: Arquivo ACBrTEFDClass.pas, na procedure TACBrTEFDClass.CancelarTransacoesPendentesClass a partir da linha 2118: { Verificando se essa Resposta já foi cancela em outro arquivo } JaCancelado := False ; ///meu desvio... if Tipo<>gpVeSPague then begin I := 0 ; while (not JaCancelado) and (I < RespostasCanceladas.Count) do begin if RespostasCanceladas[I] is TACBrTEFDRespTXT then begin with TACBrTEFDRespTXT( RespostasCanceladas[I] ) do begin JaCancelado := (Resp.Rede = Rede) and (Resp.NSU = NSU) and (Resp.Finalizacao = Finalizacao) and (Resp.ValorTotal = ValorTotal) ; end; end else begin with TACBrTEFDResp( RespostasCanceladas[I] ) do begin JaCancelado := (Resp.DocumentoVinculado = DocumentoVinculado) ; end; end; Inc( I ) ; end; end; Só assim funcionou e conseguir cumprir o roteiro, pois dessa forma a variavel JaCancelado permanece False e realiza o cancelamento de cada transação pendurada senão ele cancelava somente a última e as demais a variável JaCancelado ficava True e não fazia o NCN. Será que tá certo isso ? E aproveitando pra reforçar a minha última pergunta aqui neste tópico... como faço para desativar a impressão da Leitura X na reimpressão de comprovantes TEF cancelados ou reimpressos ? []'s
×
×
  • 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.