terça-feira, 4 de janeiro de 2011

TEF - Tratando a situação de queda de energia

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