
Ivan Orosco
Membros-
Total de ítens
63 -
Registro em
-
Última visita
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Tudo que Ivan Orosco postou
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
Hmmmmm, ok, valeu
-
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
-
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
-
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