terça-feira, 4 de janeiro de 2011

TEF - Cancelando uma transação TEF

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