No artigo passado, vimos as rotinas de  confirmação (CNF) e não confirmação (NCN) da transação TEF, importantes em toda  operação. 
Agora, iremos incluir em nosso desenvolvimento,  a rotina de cancelamento da transação TEF. Rotina utilizada, geralmente, quando  há necessidade de cancelar uma transação já emitida ou após sua confirmação.  
Existem duas maneiras de solicitar este  cancelamento: 
- pelas rotinas administrativas ou;
- gerando o arquivo INTPOS.001 com os dados da  transação que se deseja cancelar. 
Iremos realizar o cancelamento pelo arquivo  INTPOS.001 e veremos o cancelamento pelo modo administrativo em outra edição do  Flash Tip. 
No código, criaremos a função  "CancelaTrancacaoTEF" e as informações da transação serão passadas, através de  seus parâmetros. 
Não esqueça que a resposta deste cancelamento  deverá ser impressa, através do Relatório Gerencial e sua confirmação efetuada.  
Estaremos visualizando este código em dois  exemplos básicos. Um desenvolvido em Delphi e outro em Visual Basic. 
- Exemplo em  Delphi
. 
. 
. 
cNSU       := '103917'; 
cValor     := '100'; // 1,00 
cNomeRede  := 'AMEX'; 
cNumeroDOC := '547012'; 
cData      := '06062005'; // DDMMAAAA  
cHora      := '103917'; // HHMMSS 
CancelaTransacaoTEF( cNSU, cValor, cNomeRede,  cNumeroDOC, cData, cHora ); 
ImprimeGerencial; 
. 
. 
. 
////////////////////////////////////////////////////////////////////////////////  
// Função: CancelaTransacaoTEF 
// Objetivo: Cancelar uma transação já  confirmada 
// Parâmetros: String com o número de  identificação (NSU) 
//             String com o valor da transação  
//             String com o valor da transação  
//             String com o nome e bandeira  (REDE) 
//             String com o número do documento  
//             String com a data da transação no  formato DDMMAAAA 
//             String com a hora da transação no  formato HHSMMSS 
// Retorno: True para OK ou False para não OK  
////////////////////////////////////////////////////////////////////////////////  
function CancelaTransacaoTEF( cNSU: string;  cValor: string; cNomeRede: string; 
        cNumeroDOC: string; cData: string;  cHora: string ): boolean; 
var cConteudo: string; cArquivo: TextFile; lFlag  : longbool; 
begin 
   cConteudo := ''; 
   cConteudo := '000-000 = CNC'           + #13  + #10 + 
               '001-000 = ' + cNSU       + #13 +  #10 + 
               '003-000 = ' + cValor     + #13 +  #10 + 
               '010-000 = ' + cNomeRede  + #13 +  #10 + 
               '012-000 = ' + cNumeroDOC + #13 +  #10 + 
                '022-000 = ' + cData      + #13  + #10 + 
               '023-000 = ' + cHora      + #13 +  #10 + 
               '999-999 = 0'; 
   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' ); 
end; 
////////////////////////////////////////////////////////////////////////////////  
// Função: ImprimeGerencial 
// Objetivo: Imprimir através do Relatório  Gerencial a transação efetuada. 
// Retorno: 1 para OK ou diferente de 1 para não  OK 
////////////////////////////////////////////////////////////////////////////////  
function ImprimeGerencial: integer; 
var cConteudo, cLinha, cSaltaLinha,  cLinhaArquivo: string; 
    cArquivo : TextFile; 
   iTentativas, iVezes: integer; 
   cMensagem : TForm; 
   bTransacao: boolean; 
begin 
   if FileExists( 'IMPRIME.TXT') then  DeleteFile( 'IMPRIME.TXT' ); 
   result := 1; 
   for iTentativas := 1 to 7 do 
      begin 
         // Verifica se o Gerenciador Padrão  recebeu o INTPOS.001 da solicitação 
         if ( FileExists(  'C:\TEF_DIAL\RESP\INTPOS.STS' ) ) then 
            begin 
               cLinhaArquivo := ''; 
               cLinha := ''; 
               while True do 
                  begin 
                     // Verifica o arquivo  INTPOS.001 de resposta 
                     if FileExists(  'C:\TEF_DIAL\RESP\INTPOS.001' ) then 
                        begin 
                           AssignFile( cArquivo,  'C:\TEF_DIAL\RESP\INTPOS.001' ); 
                           Reset( cArquivo );  
                           while not EOF(  cArquivo ) do 
                              begin 
                                 ReadLn(  cArquivo, cLinhaArquivo ); 
                                 // Verifica se  a Transação foi Aprovada 
                                 if ( copy(  cLinhaArquivo, 1, 3 ) = '009' ) then 
                                    begin  
                                       if (  copy( cLinhaArquivo, 11, 
                                       Length(  cLinhaArquivo ) - 10 ) ) = '0' 
                                          then  bTransacao := True; 
                                       if (  copy( cLinhaArquivo, 11, 
                                       Length(  cLinhaArquivo ) - 10 ) ) <> '0' 
                                          then  bTransacao := False; 
                                    end;  
                                 // Verifica se  existem linhas para serem 
                                 // impressas  
                                 if ( copy(  cLinhaArquivo, 1, 3 ) = '028' ) then 
                                    begin  
                                       if (  StrToInt( copy( cLinhaArquivo, 11, 
                                       Length(  cLinhaArquivo ) - 10 ) ) <> 0 ) 
                                       and (  bTransacao = True ) then 
                                          begin  
                                              result := 1; // OK 
                                             for  iVezes := 1 to StrToInt( copy( 
                                              cLinhaArquivo, 11, Length( 
                                              cLinhaArquivo ) - 10 ) ) do 
                                              begin 
                                                 ReadLn( cArquivo,cLinhaArquivo ); 
                                                 // Verifica se o campo é 029 e 
                                                 // armazena as linhas que serão 
                                                 // impressas 
                                                 if copy( cLinhaArquivo, 1, 3 ) = 
                                                 '029' then 
                                                 cLinha := cLinha + copy( 
                                                 cLinhaArquivo, 12, Length( 
                                                 cLinhaArquivo)-12)+#13+#10; 
                                              end; 
                                          end;  
                                    end;  
                                 // Verifica se  o campo é o 030 para mostrar a 
                                 // mensagem  para o operador 
                                 if ( copy(  cLinhaArquivo,1,3 ) = '030' ) and 
                                 ( cLinha  <> '' ) then 
                                    begin  
                                       cMensagem  := TForm.Create( Nil ); 
                                       with  cMensagem do 
                                          begin  
                                              with TPanel.Create( Nil ) do 
                                                 begin 
                                                  Parent  := cMensagem; 
                                                  Align  := alClient; 
                                                   cMensagem.Font.Size := 15; 
                                                   Caption:=copy(cLinhaArquivo, 
                                                  11,  Length( cLinhaArquivo ) - 
                                                  10 );  
                                                 end; 
                                              BorderStyle := bsNone; 
                                              Height := 129; Width := 370; 
                                              Position := poScreenCenter; 
                                              Show;Refresh;Sleep( 5000 );Close; 
                                              frmPrincipal.Refresh; 
                                          end;  
                                    end;  
                                 if ( copy(  cLinhaArquivo, 1, 3 ) = '030' ) and 
                                 ( cLinha = '' )  then 
                                 begin  
                                    if (  FileExists( 
                                     'C:\TEF_DIAL\REQ\INTPOS.001' ) ) then 
                                    DeleteFile(  'C:\TEF_DIAL\REQ\INTPOS.001' ); 
                                     Application.MessageBox( pchar( copy( 
                                     cLinhaArquivo, 11, Length( cLinhaArquivo ) 
                                    - 10 ) ),  'Atenção', MB_IconInformation + 
                                    MB_OK );  
                                    result := 0;  
                                 end;  
                              end; 
                           break; 
                        end; 
                  end; 
               // Cria o arquivo temporário  IMPRIME.TXT com a imagem do 
               // comprovante 
               if ( cLinha <> '' ) then  
               begin 
                  CloseFile( cArquivo );  
                  AssignFile( cArquivo,  'IMPRIME.TXT' ); 
                  ReWrite( cArquivo );  
                  WriteLn( cArquivo, cLinha );  
                  CloseFile( cArquivo );  
                  Break; 
               end; 
            end; 
         Sleep( 1000 ); 
         if ( iTentativas = 7 ) then 
            begin 
              CloseFile( cArquivo ); result :=  -1; break; 
            end; 
         if ( result = 0 ) or ( result = -2 )  then 
            begin 
               CloseFile( cArquivo );  
               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' ); 
               break; 
            end; 
      end; 
   // Bloqueia o teclado e o mouse para a  impressão do TEF 
   iRetorno := Bematech_FI_IniciaModoTEF();  
   if FileExists( 'IMPRIME.TXT') then  
      begin 
         AssignFile( cArquivo, 'IMPRIME.TXT' );  
         Reset( cArquivo ); 
         cConteudo := ''; 
         cLinha := ''; 
         while not EOF( cArquivo ) do  
            begin 
               ReadLn( cArquivo, cLinha );  
               cConteudo := cConteudo + cLinha +  #13 + #10; 
               iRetorno :=  Bematech_FI_RelatorioGerencial( pchar( cLinha ) 
                  + #13 ); 
               VerificaRetornoFuncaoImpressora(  iRetorno ); 
               if EOF( cArquivo ) then  
                  begin 
                     cSaltaLinha := #13 + #10 +  #13 + #10 + #13 + #10 + 
                        #13 + #10 + #13 + #10;  
                     iRetorno :=  Bematech_FI_RelatorioGerencial( pchar( 
                        cSaltaLinha) );  
                      VerificaRetornoFuncaoImpressora( iRetorno ); 
                     cMensagem := TForm.Create(  Nil ); 
                     with cMensagem do  
                        begin 
                           with TPanel.Create(  Nil ) do 
                              begin 
                                 Parent :=  cMensagem; Align := alClient; 
                                  cMensagem.Font.Size := 15; 
                                 Caption := 'Por  favor, destaque a 1ª Via'; 
                              end; 
                           BorderStyle :=  bsNone; Height := 129; Width := 370; 
                           Position :=  poScreenCenter; Show; Refresh; 
                           Sleep( 5000 ); Close;  frmPrincipal.Refresh; 
                        end; 
                     iRetorno :=  Bematech_FI_RelatorioGerencial( pchar( 
                     cConteudo ) ); 
                      VerificaRetornoFuncaoImpressora( iRetorno ); 
                  end; 
            end; 
         CloseFile( cArquivo ); 
         DeleteFile( 'IMPRIME.TXT' );  
         // Desbloqueia o teclado e o mouse  
         iRetorno :=  Bematech_FI_FinalizaModoTEF(); 
         iRetorno :=  Bematech_FI_FechaRelatorioGerencial(); 
         VerificaRetornoFuncaoImpressora(  iRetorno ); 
      end; 
end; 
Nenhum comentário:
Postar um comentário