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