Conforme mencionamos na parte anterior, nesta parte estaremos tratando a  situação de queda de energia, quando ocorre durante a impressão da transação TEF  e o que devemos fazer. 
Quando nos deparamos com esta situação, o importante é verificarmos se existe  uma transação pendente, mas como verificar isso se a aplicação foi  reinicializada? Simples! Vamos usar uma lógica externa para tratar este tipo de  situação, criando o arquivo TEF.TXT, toda a vez que iniciarmos a impressão da  transação TEF e elimina-lo quando esta transação for concluída, assim ao  entrarmos na aplicação poderemos verificar a existência deste arquivo e não  confirmar a transação pendente. 
Serão utilizados os códigos já desenvolvidos, incluindo esta nova  implementação e, em anexo, seguirão os códigos completos em Delphi e Visual  Basic. 
- Exemplo em Delphi
// Form Create 
procedure TfrmPrincipal.FormCreate(Sender: TObject); 
var iRetorno: integer; 
begin 
 // Verifica se existe o arquivo TEF.TXT, indicando que há uma 
 // transação pendente. 
 if FileExists( 'TEF.TXT' ) then 
     begin 
       iRetorno := Bematech_FI_FechaComprovanteNaoFiscalVinculado; 
       NaoConfirmaTransacao; 
       if FileExists( 'TEF.TXT' ) then 
         DeleteFile( 'TEF.TXT' ); 
     end; 
end; 
////////////////////////////////////////////////////////////////////////////////  
// Função: ImprimeTransacao 
// Objetivo: Realiza a impressão da Transação TEF 
// Parâmetros: string para a Forma de Pagamento 
//             string para a Valor da Forma de Pagamento 
//             string para o Número do Cupom Fiscal (COO) 
//             TDateTime para identificar o número da transação 
// Retorno: True para OK ou False para não OK 
////////////////////////////////////////////////////////////////////////////////  
function ImprimeTransacao( cFormaPGTO: string; cValorPago: string; 
  cCOO: string; cIdentificacao: TDateTime ): boolean; 
var cLinhaArquivo, cLinha, cSaltaLinha, cConteudo: string; 
  cMensagem: TForm; 
  cArquivo : TextFile; 
  iVezes : integer; 
begin 
 // Neste ponto é criado o arquivo TEF.TXT, indicando que há uma 
  // operação de TEF sendo realizada. Caso ocorra uma queda de energia, 
  // no momento da impressão do TEF, e a aplicação for inicializada, 
  // ao identificar a existência deste arquivo, a transação do TEF 
  // deverá ser concelada. 
  AssignFile( cArquivo, 'TEF.TXT'); 
  ReWrite( cArquivo ); 
  CloseFile( cArquivo ); 
  // Bloqueia o teclado e o mouse para a impressão do TEF 
  iRetorno := Bematech_FI_IniciaModoTEF(); 
  result := true; 
  if FileExists( 'IMPRIME.TXT') then 
      begin 
        iRetorno := Bematech_FI_AbreComprovanteNaoFiscalVinculado( pchar(  
           cFormaPGTO ), pchar( cValorPago ), pchar( cCOO ) ); 
        . 
        . 
        . 
////////////////////////////////////////////////////////////////////////////////  
// Função: ConfirmaTransacao 
// Objetivo: Confirmar a Transação TEF 
// Parâmetros: não há 
// Retorno: True para OK ou False para não OK 
////////////////////////////////////////////////////////////////////////////////  
function ConfirmaTransacao: boolean; 
var cLinhaArquivo, cConteudo: string; 
  cArquivo: TextFile; 
  lFlag : longbool; 
begin 
  cLinhaArquivo := ''; 
  cConteudo := ''; 
  AssignFile( cArquivo, 'C:\TEF_DIAL\RESP\INTPOS.001' ); 
  Reset( cArquivo ); 
  while not EOF( cArquivo ) do 
      begin 
         ReadLn( cArquivo, cLinhaArquivo ); 
        if ( copy( cLinhaArquivo, 1, 3 ) = '001' ) or 
           ( copy( cLinhaArquivo, 1, 3 ) = '002' ) or 
           ( copy( cLinhaArquivo, 1, 3 ) = '010' ) or 
           ( copy( cLinhaArquivo, 1, 3 ) = '012' ) or 
           ( copy( cLinhaArquivo, 1, 3 ) = '027' ) then 
           cConteudo := cConteudo + cLinhaArquivo + #13 + #10; 
        if ( copy( cLinhaArquivo, 1, 3 ) = '999' ) then 
           cConteudo := cConteudo + cLinhaArquivo; 
     end; 
  CloseFile( cArquivo ); 
  cConteudo := '000-000 = CNF' + #13 + #10 + cConteudo; 
  AssignFile( cArquivo, 'INTPOS.001' ); 
  ReWrite( cArquivo ); 
  WriteLn( cArquivo, cConteudo ); 
  CloseFile( cArquivo ); 
  CopyFile( pchar( 'INTPOS.001' ), pchar( 'C:\TEF_DIAL\REQ\INTPOS.001' ),  
      lFlag ); 
  DeleteFile( 'INTPOS.001' ); 
  if ( FileExists( 'C:\TEF_DIAL\RESP\INTPOS.STS' ) ) then 
     DeleteFile( 'C:\TEF_DIAL\RESP\INTPOS.STS' ); 
  if ( FileExists( 'C:\TEF_DIAL\RESP\INTPOS.001' ) ) then 
     DeleteFile( 'C:\TEF_DIAL\RESP\INTPOS.001' ); 
  // Se o arquivo TEF.TXT, que identifica que houve uma transação impressa  
  // existir, o mesmo será exluído. 
  if ( FileExists( 'TEF.TXT' ) ) then 
     DeleteFile( 'TEF.TXT' ); 
end; 
////////////////////////////////////////////////////////////////////////////////  
// Função: NaoConfirmaTransacao 
// Objetivo: Não Confirmar a Transação TEF 
// Parâmetros: não há 
// Retorno: True para OK ou False para não OK 
////////////////////////////////////////////////////////////////////////////////  
function NaoConfirmaTransacao: boolean; 
var cLinhaArquivo, cConteudo: string; 
  cArquivo: TextFile; 
  lFlag : longbool; 
  cValor, cNomeRede, cNSU: string; 
begin 
  cLinhaArquivo := ''; 
  cConteudo := ''; 
  AssignFile( cArquivo, 'C:\TEF_DIAL\RESP\INTPOS.001' ); 
  Reset( cArquivo ); 
  while not EOF( cArquivo ) do 
     begin 
        ReadLn( cArquivo, cLinhaArquivo ); 
        if ( copy( cLinhaArquivo, 1, 3 ) = '001' ) then 
           cConteudo := cConteudo + cLinhaArquivo + #13 + #10; 
        if ( copy( cLinhaArquivo, 1, 3 ) = '003' ) then 
           cValor := copy( cLinhaArquivo, 11, Length( cLinhaArquivo ) - 10 );  
        if ( copy( cLinhaArquivo, 1, 3 ) = '010' ) then 
           begin 
              cConteudo := cConteudo + cLinhaArquivo + #13 + #10; 
              cNomeRede := copy( cLinhaArquivo, 11, Length( cLinhaArquivo )  
                 - 10 ); 
           end; 
        if ( copy( cLinhaArquivo, 1, 3 ) = '012' ) then 
           begin 
              cConteudo := cConteudo + cLinhaArquivo + #13 + #10; 
              cNSU := copy( cLinhaArquivo, 11, Length( cLinhaArquivo ) - 10  ); 
           end; 
        if ( copy( cLinhaArquivo, 1, 3 ) = '027' ) then 
           cConteudo := cConteudo + cLinhaArquivo + #13 + #10; 
         if ( copy( cLinhaArquivo, 1, 3 ) = '999' ) then 
           cConteudo := cConteudo + cLinhaArquivo; 
     end; 
   CloseFile( cArquivo ); 
   cConteudo := '000-000 = NCN' + #13 + #10 + cConteudo; 
   AssignFile( cArquivo, 'INTPOS.001' ); 
   ReWrite( cArquivo ); 
   WriteLn( cArquivo, cConteudo ); 
   CloseFile( cArquivo ); 
   CopyFile( pchar( 'INTPOS.001' ), pchar( 'C:\TEF_DIAL\REQ\INTPOS.001' ),  
      lFlag ); 
   DeleteFile( 'INTPOS.001' ); 
   if ( FileExists( 'C:\TEF_DIAL\RESP\INTPOS.STS' ) ) then 
      DeleteFile( 'C:\TEF_DIAL\RESP\INTPOS.STS' ); 
   if ( FileExists( 'C:\TEF_DIAL\RESP\INTPOS.001' ) ) then 
      DeleteFile( 'C:\TEF_DIAL\RESP\INTPOS.001' ); 
  // Se o arquivo TEF.TXT, que identifica que houve uma transação impressa  
   // existir, o mesmo será exluído. 
   if ( FileExists( 'TEF.TXT' ) ) then 
     DeleteFile( 'TEF.TXT' ); 
   Application.MessageBox( pchar( 'Cancelada a Transação' + #13 + #13 + 
     'Rede: ' + cNomeRede + #13 + 'Doc Nº: ' + cNSU + #13 + 'Valor: ' + 
     FormatFloat( '#,##0.00', StrToFloat( cValor ) / 100 ) ), 'Atenção', 
     MB_IconInformation + MB_OK ); 
end; 
Nenhum comentário:
Postar um comentário