Você está na página 1de 11

Bematech: Transferncia Eletrnica de Fundos (T.E.F.

) - Discado - Passo 5/10 -


Cancelando uma transao TEF
Publicado em: 19/10/2005

No artigo passado, vimos as rotinas de confirmao (CNF) e no confirmao (NCN) da


transao TEF, importantes em toda operao.

Agora, iremos incluir em nosso desenvolvimento, a rotina de cancelamento da transao


TEF. Rotina utilizada, geralmente, quando h necessidade de cancelar uma transao j
emitida ou aps sua confirmao.

Existem duas maneiras de solicitar este cancelamento:

- pelas rotinas administrativas ou;


- gerando o arquivo INTPOS.001 com os dados da transao que se deseja cancelar.

Iremos realizar o cancelamento pelo arquivo INTPOS.001 e veremos o cancelamento pelo


modo administrativo em outra edio do Flash Tip.

No cdigo, criaremos a funo "CancelaTrancacaoTEF" e as informaes da transao


sero passadas, atravs de seus parmetros.

No esquea que a resposta deste cancelamento dever ser impressa, atravs do Relatrio
Gerencial e sua confirmao efetuada.

Estaremos visualizando este cdigo em dois exemplos bsicos. 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;
.
.
.

////////////////////////////////////////////////////////////////////////////////
// Funo: CancelaTransacaoTEF
// Objetivo: Cancelar uma transao j confirmada
// Parmetros: String com o nmero de identificao (NSU)
// String com o valor da transao
// String com o valor da transao
// String com o nome e bandeira (REDE)
// String com o nmero do documento
// String com a data da transao no formato DDMMAAAA
// String com a hora da transao no formato HHSMMSS
// Retorno: True para OK ou False para no 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;

////////////////////////////////////////////////////////////////////////////////
// Funo: ImprimeGerencial
// Objetivo: Imprimir atravs do Relatrio Gerencial a transao efetuada.
// Retorno: 1 para OK ou diferente de 1 para no 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 Padro recebeu o INTPOS.001 da solicitao
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 Transao 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 sero
// 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 ) ), 'Ateno', MB_IconInformation +
MB_OK );
result := 0;
end;
end;
break;
end;
end;
// Cria o arquivo temporrio 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 impresso 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;

- Exemplo em Visual Basic

.
.
.
cNSU = "122807"
cValor = "100" ' 1,00
cNomeRede = "AMEX"
cNumeroDOC = "547016"
cData = "06062005" ' DDMMAAAA
cHora = "122807" ' HHMMSS
lRet = CancelaTransacaoTEF(cNSU, cValor, cNomeRede, cNumeroDOC, cData, cHora)
ImprimeGerencial
.
.
.

' Funo: CancelaTransacaoTEF


' Objetivo: Cancelar uma transao j confirmada
' Parmetros: String com o nmero de identificao (NSU)
' String com o valor da transao
' String com o valor da transao
' String com o nome e bandeira (REDE)
' String com o nmero do documento
' String com a data da transao no formato DDMMAAAA
' String com a hora da transao no formato HHSMMSS
' Retorno: True para OK ou False para no OK
Function CancelaTransacaoTEF(cNSU As String, cValor As String, _
cNomeRede As String, cNumeroDOC As String, cData As String, _
cHora As String) As Boolean
Dim cConteudo As String
cConteudo = ""
cConteudo = "000-000 = CNC" + Chr(13) + Chr(10) + _
"001-000 = " + cNSU + Chr(13) + Chr(10) + _
"003-000 = " + cValor + Chr(13) + Chr(10) + _
"010-000 = " + cNomeRede + Chr(13) + Chr(10) + _
"012-000 = " + cNumeroDOC + Chr(13) + Chr(10) + _
"022-000 = " + cData + Chr(13) + Chr(10) + _
"023-000 = " + cHora + Chr(13) + Chr(10) + _
"999-999 = 0"
Open App.Path & "\INTPOS.001" For Binary As #1
Put #1, , cConteudo
Close #1
FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"
Kill App.Path & "\INTPOS.001"
End Function

' Funo: ImprimeGerencial


' Objetivo: Imprimir atravs do Relatrio Gerencial a transao efetuada.
' Retorno: 1 para OK ou diferente de 1 para no OK
Function ImprimeGerencial() As Integer
Dim cConteudo As String, cLinha As String, cSaltaLinha As String, _
cLinhaArquivo As String Dim iTentativas As Integer, _
iVezes As Integer, iImprimeGerencial As Integer
Dim bTransacao As Boolean
cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")
If cArquivoTemp <> "" Then
Kill App.Path & "\IMPRIME.TXT"
End If
iImprimeGerencial = 1
For iTentativas = 1 To 7
cLinhaArquivo = ""
cLinha = ""
Do While True
' Verifica se o Gerenciador Padro recebeu o INTPOS.001 da
' solicitao
cArquivoTemp = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")
If cArquivoTemp <> "" Then
cArquivoTemp = Dir("C:\TEF_DIAL\RESP\INTPOS.001")
If cArquivoTemp <> "" Then
Open "C:\TEF_DIAL\RESP\INTPOS.001" For Input As #1
Do While Not EOF(1)
Line Input #1, cLinhaArquivo
' Verifica se a Transao foi Aprovada
If (Mid(cLinhaArquivo, 1, 3) = "009") Then
If (Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) _
- 10)) = "0" Then
bTransacao = True
End If
If (Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)) _
<> "0" Then
bTransacao = False
End If
End If
' Verifica se existem linhas para serem impressas
If (Mid(cLinhaArquivo, 1, 3) = "028") Then
If (Int(Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10)) _
<> 0) And (bTransacao = True) Then
iImprimeGerencial = 1 ' OK
For iVezes = 1 To Int(Mid(cLinhaArquivo, 11, _
Len(cLinhaArquivo) - 10))
Line Input #1, cLinhaArquivo
' Verifica se o campo 029 e armazena as linhas
' que sero impressas
If Mid(cLinhaArquivo, 1, 3) = "029" Then
cLinha = cLinha + Mid(cLinhaArquivo, 12, _
Len(cLinhaArquivo) - 12) + Chr(13) + Chr(10)
End If
Next
End If
End If
' Verifica se o campo o 030 para mostrar a mensagem para
' o operador
If (Mid(cLinhaArquivo, 1, 3) = "030") And (cLinha <> "") Then
' Est sendo usado um form para a exibio desta mensagem
frmMensagem.lblMensagem.Caption = Mid(cLinhaArquivo, 11, _
Len(cLinhaArquivo) - 10)
frmMensagem.Show
frmMensagem.Refresh
Sleep (5000)
Unload frmMensagem
frmPrincipal.Refresh
iImprimeGerencial = 1
End If
If (Mid(cLinhaArquivo, 1, 3) = "030") And (cLinha = "") Then
cArquivoTemp = Dir("C:\TEF_DIAL\REQ\INTPOS.001")
If cArquivoTemp <> "" Then
Kill App.Path & "C:\TEF_DIAL\REQ\INTPOS.001"
End If
MsgBox Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10), _
vbInformation + vbOKOnly, "Ateno"
iImprimeGerencial = 0
End If
Loop
Exit Do
End If
End If
Loop
iTentativas = 8
Sleep (1000)
Next
' Cria o arquivo temporrio IMPRIME.TXT com a imagem do comprovante
If (cLinha <> "") Then
Close #1
Open App.Path & "\IMPRIME.TXT" For Binary As #1
Put #1, , cLinha
Close #1
End If
Sleep (1000)
If (iTentativas = 7) Then
Close #1
iImprimeGerencial = -1
End If
If (iImprimeGerencial = 0) Or (iImprimeGerencial = -2) Then
Close #1
cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")
If (cArquivoSTS <> "") Then
Kill "C:\TEF_DIAL\RESP\INTPOS.STS"
End If
cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")
If (cArquivoSTS <> "") Then
Kill "C:\TEF_DIAL\RESP\INTPOS.001"
End If
End If
' Bloqueia o teclado e o mouse para a impresso do TEF
iRetorno = Bematech_FI_IniciaModoTEF()
cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")
If cArquivoTemp <> "" Then
Open App.Path & "\IMPRIME.TXT" For Input As #1
cConteudo = ""
cLinha = ""
Do While Not EOF(1)
Line Input #1, cLinha
cConteudo = cConteudo + cLinha + Chr(13) + Chr(10)
iRetorno = Bematech_FI_RelatorioGerencial(cLinha + Chr(13))
VerificaRetornoFuncaoImpressora (iRetorno)
If EOF(1) Then
cSaltaLinha = Chr(13) + Chr(10) + Chr(13) + Chr(10) + _
Chr(13) + Chr(10) + Chr(13) + Chr(10) + Chr(13) + Chr(10)
iRetorno = Bematech_FI_RelatorioGerencial(cSaltaLinha)
VerificaRetornoFuncaoImpressora (iRetorno)
' Est sendo usado um form para a exibio desta mensagem
frmMensagem.lblMensagem.Caption = "Por favor, destaque a 1 Via"
frmMensagem.Show
frmMensagem.Refresh
Sleep (5000)
Unload frmMensagem
frmPrincipal.Refresh
iRetorno = Bematech_FI_RelatorioGerencial(cConteudo)
VerificaRetornoFuncaoImpressora (iRetorno)
End If
Loop
Close #1
cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")
If cArquivoTemp <> "" Then
Kill App.Path & "\IMPRIME.TXT"
End If
' Desbloqeia o teclado e o mouse
iRetorno = Bematech_FI_FinalizaModoTEF()
iRetorno = Bematech_FI_FechaRelatorioGerencial()
VerificaRetornoFuncaoImpressora (iRetorno)
End If
End Function

FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"


Kill App.Path & "\INTPOS.001"
cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")
If (cArquivoSTS <> "") Then
Kill "C:\TEF_DIAL\RESP\INTPOS.STS"
End If
cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")
If (cArquivoSTS <> "") Then
Kill "C:\TEF_DIAL\RESP\INTPOS.001"
End If
MsgBox "Cancelada a Transao" + Chr(13) + Chr(13) + "Rede: " + _
cNomeRede + Chr(13) + "Doc N: " + cNSU + Chr(13) + "Valor: " + _
Format(cValor / 100, "#,##0.00"), vbInformation + vbOKOnly, "Ateno"
End Function