Business - Automação Comercial

Bematech: Transferência Eletrônica de Fundos (T.E.F.) - Discado - Passo 3/10 - Realizando uma venda com transação TEF

Nesta parte do artigo, iremos fazer a nossa primeira venda de cupom fiscal, com pagamento em cartão e realizar a transação TEF.

por André Luiz R. Munhoz



No artigo passado, iniciamos a nossa primeira comunicação com o Gerenciador Padrão, através de uma função onde era verificado se o mesmo estava ativo, antes de uma transação TEF.
Nesta edição, iremos fazer a nossa primeira venda de cupom fiscal, com pagamento em cartão e realizar a transação TEF.
No código abaixo, estaremos utilizando as funções de impressão do cupom fiscal, tratando o retorno da impressora e realizando a solicitação da transação TEF, com impressão do comprovante. As funções utilizadas, neste código, são:

- Bematech_FI_AbreCupom
- Bematech_FI_VendeItem
- Bematech_FI_IniciaFechamentoCupom
- Bematech_FI_EfetuaFormaPagamento
- Bematech_FI_TerminaFechamentoCupom

Estas funções serão usadas para a impressão do cupom fiscal.

- Bematech_FI_AbreComprovanteNaoFiscalVinculado
- Bematech_FI_UsaComprovanteNaoFiscalVinculado
- Bematech_FI_FechaComprovanteNaoFiscalVinculado

Estas funções serão usadas para a impressão do comprovante da transação TEF.

- Bematech_FI_IniciaModoTEF
- Bematech_FI_FinalizaModoTEF

Estas funções serão usadas para o bloqueio e desbloqueio do teclado e mouse.

Também serão usadas funções extras, definidas como:

- VerificaRetornoFuncaoImpressora
- RealizaTransacao
- ImprimeTransacao

Neste código, estaremos realizando a impressão do cupom fiscal completo com uma transação TEF, mas não estaremos ainda, verificando o tratamento de queda de energia e confirmando a transação.

Estaremos visualizando este código em dois exemplos básicos. Um desenvolvido em Delphi e outro em Visual Basic.

- Exemplo em Delphi

procedure TfrmPrincipal.cmdVendaCupomTEFClick(Sender: TObject);
var cCodigoProduto, cDescricaoProduto, cAliquota, cTipoQtde, cQtde,
cTipoDesconto,cValorItem, cValorDesconto, cAcrescimoDesconto, cTipoAcrescimoDesconto,cValorAcrescimoDesconto, cFormaPGTO,
cMSGPromocional, cValorPago, cNumeroCupom,cSaltaLinha: string;
iTEF: integer;
cIdentificacao: TDateTime;
begin
// Abre Cupom Fiscal, Vende o Item e Fecha Cupom Fiscal.
iRetorno := Bematech_FI_AbreCupom( pchar( "" ) );
if ( VerificaRetornoFuncaoImpressora( iRetorno ) ) then
begin
cCodigoProduto := "1234567890123";
cDescricaoProduto := "Teste de Venda de Item..."; cAliquota := "II";
cTipoQtde := "I"; cQtde := "1"; cValorItem := "1,00";
cTipoDesconto := "%";cValorDesconto := "00,00";
iRetorno := Bematech_FI_VendeItem( pchar( cCodigoProduto ),
pchar( cDescricaoProduto ), pchar( cAliquota ), pchar( cTipoQtde ),
pchar( cQtde ), 2, pchar( cValorItem ), pchar( cTipoDesconto ),
pchar( cValorDesconto ) );
if ( VerificaRetornoFuncaoImpressora( iRetorno ) ) then
begin
cAcrescimoDesconto := "A"; cTipoAcrescimoDesconto := "%";
cValorAcrescimoDesconto := "00,00";
iRetorno := Bematech_FI_IniciaFechamentoCupom( pchar(
cAcrescimoDesconto ),pchar( cTipoAcrescimoDesconto ),
pchar( cValorAcrescimoDesconto ) );
if ( VerificaRetornoFuncaoImpressora( iRetorno ) ) then
begin cFormaPGTO := "Cartao Credito"; cValorPago := "1,00";
SetLength( cNumeroCupom, 6 );
iRetorno := Bematech_FI_NumeroCupom( cNumeroCupom );
VerificaRetornoFuncaoImpressora( iRetorno );
cIdentificacao := Time;
iTEF := RealizaTransacao( cIdentificacao, cNumeroCupom,
FormatFloat( cValorPago, 0 ) );
if ( iTEF = 1 ) then
begin
iRetorno := Bematech_FI_EfetuaFormaPagamento(
pchar(cFormaPGTO ), pchar( cValorPago ) );
if (VerificaRetornoFuncaoImpressora(iRetorno)) then
begin
cMSGPromocional := "Obrigado, volte
sempre !!!";
iRetorno :=
Bematech_FI_TerminaFechamentoCupom(
pchar( cMSGPromocional ) );
VerificaRetornoFuncaoImpressora( iRetorno );
ImprimeTransacao( cFormaPGTO, cValorPago,
cNumeroCupom, cIdentificacao );
end;
end;
if ( iTEF = -1 ) then
Application.MessageBox( "Gerencial Padrão não está
ativo !",
"Atenção", MB_IconError + MB_OK );
// Se a transação não for aprovada, deve-se permitir a
// escolha de outra forma de pagamento. Neste caso, está
// sendo utilizado "Dinheiro" como exemplo.
if ( iTEF = -2 ) or ( iTEF = 0 ) then
begin
cFormaPGTO := "Dinheiro";
iRetorno := Bematech_FI_EfetuaFormaPagamento(pchar(
cFormaPGTO ), pchar( cValorPago ) );
if (VerificaRetornoFuncaoImpressora(iRetorno)) then
begin
cMSGPromocional := "Obrigado, volte
sempre !!!";
iRetorno :=
Bematech_FI_TerminaFechamentoCupom(
pchar( cMSGPromocional ) );
VerificaRetornoFuncaoImpressora( iRetorno );
end;
end;
end;
end;
end;
end;

//////////////////////////////////////////////////////////
// Função: RealizaTransacao
// Objetivo: Realiza a transação TEF
// Parâmetros: TDateTime para identificar o número da transação
// string para o Número do Cupom Fiscal (COO)
// string para a Valor da Forma de Pagamento
// Retorno: True para OK ou False para não OK
////////////////////////////////////////////////////////// function RealizaTransacao( cIdentificacao: TDateTime; cNumeroCupom : string;
cValorPago: string ): integer;
var cConteudoArquivo, cLinhaArquivo, cLinha: string;
cArquivo: TextFile; lFlag : longbool; iTentativas, iVezes: integer;
cMensagem : TForm; bTransacao: boolean;
begin
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" );
AssignFile( cArquivo, "INTPOS.001");
// Conteúdo do arquivo INTPOS.001 para solicitar a transação TEF.
cConteudoArquivo := "";
cConteudoArquivo := "000-000 = CRT" + #13 + #10 + "001-000 = " +
FormatDateTime( "hhmmss", cIdentificacao ) + #13 + #10 + "002-000 = " +
cNumeroCupom + #13 + #10 + "003-000 = " + cValorPago + #13 + #10 +
"999-999 = 0";
ReWrite( cArquivo );
WriteLn( cArquivo, cConteudoArquivo );
CloseFile( cArquivo );
CopyFile( pchar( "INTPOS.001" ), pchar( "C:\TEF_DIAL\REQ\INTPOS.001" ),
lFlag );
DeleteFile( "INTPOS.001" );
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 o campo de identificação é o mesmo
// do solicitado.
if ( copy( cLinhaArquivo, 1, 3 ) = "001" ) and
( copy( cLinhaArquivo, 11, Length(cLinhaArquivo)
- 10 ) <> FormatDateTime( "hhmmss",
cIdentificacao ) ) then
begin
result := 0;
exit;
end;
// 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 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 ); break;
end;
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
// Bloqueia o teclado e o mouse para a impressão do TEF.
iRetorno := Bematech_FI_IniciaModoTEF();
if FileExists( "IMPRIME.TXT") then
begin
iRetorno := Bematech_FI_AbreComprovanteNaoFiscalVinculado( pchar(
cFormaPGTO ), pchar( cValorPago ), pchar( cCOO ) );
VerificaRetornoFuncaoImpressora( iRetorno )
end;
AssignFile( cArquivo, "IMPRIME.TXT" );
begin
Reset( cArquivo );
cConteudo := "";cLinha := "";
while not EOF( cArquivo ) do
begin
ReadLn( cArquivo, cLinha );
cConteudo := cConteudo + cLinha + #13 + #10;
iRetorno := Bematech_FI_UsaComprovanteNaoFiscalVinculado( pchar(
cLinha ) + #13 );
VerificaRetornoFuncaoImpressora( iRetorno );
if EOF( cArquivo ) then
begin
cSaltaLinha := #13 + #10 + #13 + #10 + #13 + #10 +
#13 + #10 + #13 + #10;
iRetorno := Bematech_FI_UsaComprovanteNaoFiscalVinculado(
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_UsaComprovanteNaoFiscalVinculado(
pchar( cConteudo ) );
VerificaRetornoFuncaoImpressora( iRetorno );
end;
end;
end;
// Desbloqeia o teclado e o mouse.
iRetorno := Bematech_FI_FinalizaModoTEF();
CloseFile( cArquivo ); DeleteFile( "IMPRIME.TXT" );
iRetorno := Bematech_FI_FechaComprovanteNaoFiscalVinculado();
VerificaRetornoFuncaoImpressora( iRetorno );
end;

//////////////////////////////////////////////////////////
// Função: VerificaRetornoFuncaoImpressora
// Objetivo: Verificar o retorno da impressora e da função utilizada
// Retorno: True para OK ou False para não OK
////////////////////////////////////////////////////////// function VerificaRetornoFuncaoImpressora( iRetorno: integer ): boolean;
var cMSGErro: string;
begin
cMSGErro := "";
result := False;
case iRetorno of
0: cMSGErro := "Erro de Comunicação !";
-1: cMSGErro := "Erro de execução na Função !";
-2: cMSGErro := "Parâmetro inválido na Função !";
-3: cMSGErro := "Alíquota não Programada !";
-4: cMSGErro := "Arquivo BEMAFI32.INI não Encontrado !";
-5: cMSGErro := "Erro ao abrir a Porta de Comunicação !";
-6: cMSGErro := "Impressora Desligada ou Cabo de Comunicação Desconectado!";
-7: cMSGErro := "Código do Banco não encontrado no arquivo BEMAFI32.INI !";
-8: cMSGErro := "Erro ao criar arquivo STATUS.TXT ou RETORNO.TXT!";
-27: cMSGErro := "Status diferente de 6, 0, 0 !";
-30: cMSGErro := "Função incompatível com a impressora fiscal YANCO !";
end;
if ( cMSGErro <> "" ) then
begin
Application.MessageBox( pchar( cMSGErro ), "Atenção", MB_IconError
+ MB_OK );
result := False;
end;
cMSGErro := "";
if ( iRetorno = 1 ) then
begin
Bematech_FI_RetornoImpressora( iACK, iST1, iST2 );
if ( iACK = 21 ) then
begin
Application.MessageBox( "A Impressora retornou NAK !" + #13 +
"Erro de Protocolo de Comunicação !", "Atenção", MB_IconError +
MB_OK );
result := False;
end
else
if ( iST1 <> 0 ) or ( iST2 <> 0 ) then
begin
// Analisa ST1
if ( iST1 >= 128 ) then
begin
iST1 := iST1 - 128;
cMSGErro := cMSGErro + "Fim de Papel" + #13;
end;
if ( iST1 >= 64 ) then
begin
iST1 := iST1 - 64;
cMSGErro := cMSGErro + "Pouco Papel" + #13;
end;
if ( iST1 >= 32 ) then
begin
iST1 := iST1 - 32;
cMSGErro := cMSGErro + "Erro no Relógio" + #13;
end;
if ( iST1 >= 16 ) then
begin iST1 := iST1 - 16;
cMSGErro := cMSGErro + "Impressora em Erro" + #13;
end;
if ( iST1 >= 8 ) then
begin
iST1 := iST1 - 8;
cMSGErro := cMSGErro + "Primeiro Dado do Comando não foi ESC"
+ #13;
end;
if iST1 >= 4 then
begin
iST1 := iST1 - 4;
cMSGErro := cMSGErro + "Comando Inexistente" + #13;
end;
if iST1 >= 2 then
begin
iST1 := iST1 - 2;
cMSGErro := cMSGErro + "Cupom Fiscal Aberto" + #13;
end;
if iST1 >= 1 then
begin
iST1 := iST1 - 1;
cMSGErro := cMSGErro + "Número de Parâmetros Inválidos" + #13;
end;
// Analisa ST2
if iST2 >= 128 then
begin
iST2 := iST2 - 128;
cMSGErro := cMSGErro + "Tipo de Parâmetro de Comando Inválido"
+ #13;
end;
if iST2 >= 64 then
begin iST2 := iST2 - 64;
cMSGErro := cMSGErro + "Memória Fiscal Lotada" + #13;
end;
if iST2 >= 32 then
begin
iST2 := iST2 - 32;
cMSGErro := cMSGErro + "Erro na CMOS" + #13;
end;
if iST2 >= 16 then
begin
iST2 := iST2 - 16;
cMSGErro := cMSGErro + "Alíquota não Programada" + #13;
end;
if iST2 >= 8 then
begin iST2 := iST2 - 8;
cMSGErro := cMSGErro + "Capacidade de Alíquota Programáveis
Lotada" + #13;
end;
if iST2 >= 4 then
begin
iST2 := iST2 - 4;
cMSGErro := cMSGErro + "Cancelamento não permitido" + #13;
end;
if iST2 >= 2 then
begin iST2 := iST2 - 2;
cMSGErro := cMSGErro + "CGC/IE do Proprietário não
Programados" + #13;
end;
if iST2 >= 1 then
begin iST2 := iST2 - 1;
cMSGErro := cMSGErro + "Comando não executado" + #13;
end;
if ( cMSGErro <> "" ) then
begin
Application.MessageBox( pchar( cMSGErro ), "Atenção",
MB_IconError + MB_OK );
result := False;
end;
end
else
result := True;
end;
end;

- Exemplo em Visual Basic

" Declaração da função Sleep (API kernel32)
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub cmdVendaTEF_Click()
Dim cIdentificacao As String, cNumeroCupom As String, cValorPago As String
Dim cFormaPGTO As String
" Abre Cupom Fiscal, Vende o Item e Fecha Cupom Fiscal
iRetorno = Bematech_FI_AbreCupom("")
If (VerificaRetornoFuncaoImpressora(iRetorno)) Then
iRetorno = Bematech_FI_VendeItem("1234567890123", _
"Teste de Venda de Item...", "II", "I", "1", 2, "1,00", "%", "00,00")
If (VerificaRetornoFuncaoImpressora(iRetorno)) Then
iRetorno = Bematech_FI_IniciaFechamentoCupom("A", "%", "00,00")
If (VerificaRetornoFuncaoImpressora(iRetorno)) Then
cFormaPGTO = "Cartao Credito"
cValorPago = "100"
cNumeroCupom = Space(6)
iRetorno = Bematech_FI_NumeroCupom(cNumeroCupom)
VerificaRetornoFuncaoImpressora (iRetorno)
cIdentificacao = Time()
iTEF = RealizaTransacao(cIdentificacao, cNumeroCupom, cValorPago)
If (iTEF = 1) Then
iRetorno = Bematech_FI_EfetuaFormaPagamento(cFormaPGTO, cValorPago)
If (VerificaRetornoFuncaoImpressora(iRetorno)) Then
cMSGPromocional = "Obrigado, volte sempre !!!"
iRetorno = Bematech_FI_TerminaFechamentoCupom(cMSGPromocional)
VerificaRetornoFuncaoImpressora (iRetorno)
iTemp = ImprimeTransacao(cFormaPGTO, cValorPago, cNumeroCupom, _
cIdentificacao)
End If
End If
If (iTEF = -1) Then
MsgBox "Gerencial Padrão não está ativo !", vbOKOnly + _
vbInformation, "Atenção"
End If
" Se a transação não for aprovada, deve-se permitir a escolha de outra
" forma de pagamento. Neste caso, está sendo utilizado "Dinheiro"
" como exemplo
If (iTEF = -2) Or (iTEF = 0) Then
cFormaPGTO = "Dinheiro"
iRetorno = Bematech_FI_EfetuaFormaPagamento(cFormaPGTO, cValorPago)
If (VerificaRetornoFuncaoImpressora(iRetorno)) Then
cMSGPromocional = "Obrigado, volte sempre !!!"
iRetorno = Bematech_FI_TerminaFechamentoCupom(cMSGPromocional)
VerificaRetornoFuncaoImpressora (iRetorno)
End If
End If
End If
End If
End If
End Sub

" Função: RealizaTransacao
" Objetivo: Realiza a transação TEF
" Parâmetros: TDateTime para identificar o número da transação
" string para o Número do Cupom Fiscal (COO)
" string para a Valor da Forma de Pagamento
" Retorno: True para OK ou False para não OK
Function RealizaTransacao(cIdentificacao As String, cNumeroCupom As String, _
cValorPago As String) As Integer
Dim cConteudoArquivo As String, cLinhaArquivo As String, cLinha As String
Dim iTentativas As Integer, iVezes As Integer
Dim bTransacao As Boolean
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
Open App.Path & "\INTPOS.001" For Binary As #1
" Conteúdo do arquivo INTPOS.001 para solicitar a transação TEF
cConteudoArquivo = ""
cConteudoArquivo = "000-000 = CRT" + Chr(13) + Chr(10) + _
"001-000 = " + Format(cIdentificacao, "hhmmss") + Chr(13) + Chr(10) + _
"002-000 = " + cNumeroCupom + Chr(13) + Chr(10) + _
"003-000 = " + cValorPago + Chr(13) + Chr(10) + _
"999-999 = 0"
Put #1, , cConteudoArquivo
Close #1
FileCopy App.Path & "\INTPOS.001", "C:\TEF_DIAL\REQ\INTPOS.001"
Kill App.Path & "\INTPOS.001"
cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")
If cArquivoTemp <> "" Then
Kill App.Path & "\IMPRIME.TXT"
End If
RealizaTransacao = 1
For iTentativas = 1 To 7
" Verifica se o Gerenciador Padrão recebeu o INTPOS.001 da solicitação
cArquivoSTS = Dir("C:\TEF_DIAL\RESP\INTPOS.STS")
If (cArquivoSTS <> "") Then
cLinhaArquivo = ""
cLinha = ""
Do While True
" Verifica o arquivo INTPOS.001 de resposta
cArquivoINTPOS = Dir("C:\TEF_DIAL\RESP\INTPOS.001")
If (cArquivoINTPOS <> "") Then
Open "C:\TEF_DIAL\RESP\INTPOS.001" For Input As #1
Do While Not EOF(1)
Line Input #1, cLinhaArquivo
" Verifica se o campo de identificação é o mesmo do solicitado
If (Mid(cLinhaArquivo, 1, 3) = "001") And _
(Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10) <> _
Format(cIdentificacao, "hhmmss")) Then
RealizaTransacao = 0
Exit Do
End If
" Verifica se a Transação 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
RealizaTransacao = 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
" serão 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 exibição desta mensagem
frmMensagem.lblMensagem.Caption = Mid(cLinhaArquivo, 11, _
Len(cLinhaArquivo) - 10)
frmMensagem.Show
frmMensagem.Refresh
Sleep (5000)
Unload frmMensagem
frmPrincipal.Refresh
End If
If (Mid(cLinhaArquivo, 1, 3) = "030") And (cLinha = "") Then
cArquivoINTPOS = Dir("C:\TEF_DIAL\REQ\INTPOS.001")
If (cArquivoINTPOS <> "") Then
Kill "C:\TEF_DIAL\REQ\INTPOS.001"
End If
MsgBox Mid(cLinhaArquivo, 11, Len(cLinhaArquivo) - 10), _
vbOKOnly + vbInformation, "Atenção"
RealizaTransacao = 0
End If
Loop
Exit Do
End If
Loop
iTentativas = 8
End If
Sleep (1000)
Next
" Cria o arquivo temporário 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
RealisaTransacao = -1
End If
If (RealisaTransacao = 0) Or (RealisaTransacao = -2) Then
Close #1
End If
End Function

" 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 As String, cValorPago As String, _
cCOO As String, cIdentificacao As String) As Integer
Dim cLinhaArquivo As String
Dim cLinha As String
Dim cSaltaLinha As String
Dim cConteudo As String
Dim iVezes As Integer
" Bloqueia o teclado e o mouse para a impressão do TEF
iRetorno = Bematech_FI_IniciaModoTEF()
cArquivoTemp = Dir(App.Path & "\IMPRIME.TXT")
If cArquivoTemp <> "" Then
iRetorno = Bematech_FI_AbreComprovanteNaoFiscalVinculado(cFormaPGTO, _
cValorPago, cCOO)
VerificaRetornoFuncaoImpressora (iRetorno)
End If
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_UsaComprovanteNaoFiscalVinculado(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_UsaComprovanteNaoFiscalVinculado(cSaltaLinha)
VerificaRetornoFuncaoImpressora (iRetorno)
" Está sendo usado um form para a exibição desta mensagem
frmMensagem.lblMensagem.Caption = "Por favor, destaque a 1ª Via"
frmMensagem.Show
frmMensagem.Refresh
Sleep (5000)
Unload frmMensagem
frmPrincipal.Refresh
iRetorno = Bematech_FI_UsaComprovanteNaoFiscalVinculado(cConteudo)
VerificaRetornoFuncaoImpressora (iRetorno)
End If
Loop
" Desbloqeia o teclado e o mouse
iRetorno = Bematech_FI_FinalizaModoTEF()
Close #1
Kill App.Path & "\IMPRIME.TXT"
iRetorno = Bematech_FI_FechaComprovanteNaoFiscalVinculado()
VerificaRetornoFuncaoImpressora (iRetorno)
End Function

" Função: VerificaRetornoFuncaoImpressora
" Objetivo: Verificar o retorno da impressora e da função utilizada
" Retorno: True para OK ou False para não OK
Function VerificaRetornoFuncaoImpressora(iRetorno As Integer) As Boolean
Dim cMSGErro As String
Dim iACK, ST1, ST2 As Integer
cMSGErro = ""
VerificaRetornoFuncaoImpressora = False
Select Case iRetorno
Case Is = 0
cMSGErro = "Erro de Comunicação !"
Case Is = -1
cMSGErro = "Erro de execução na Função !"
Case Is = -2
cMSGErro = "Parâmetro inválido na Função !"
Case Is = -3
cMSGErro = "Alíquota não Programada !"
Case Is = -4
cMSGErro = "Arquivo BEMAFI32.INI não Encontrado !"
Case Is = -5
cMSGErro = "Erro ao abrir a Porta de Comunicação !"
Case Is = -6
cMSGErro = "Impressora Desligada ou Cabo de Comunicação Desconectado !"
Case Is = -7
cMSGErro = "Código do Banco não encontrado no arquivo BEMAFI32.INI !"
Case Is = -8
cMSGErro = "Erro ao criar ou gravar arquivo STATUS.TXT ou RETORNO.TXT !"
Case Is = -27
cMSGErro = "Status diferente de 6, 0, 0 !"
Case Is = -30
cMSGErro = "Função incompatível com a impressora fiscal YANCO !"
End Select
If cMSGErro <> "" Then
MsgBox cMSGErro, vbOKOnly + vbInformation, "Atenção"
VerificaRetornoFuncaoImpressora = False
End If
cMSGErro = ""
If iRetorno = 1 Then
x = Bematech_FI_RetornoImpressora(iACK, iST1, iST2)
If (iACK = 21) Then
MsgBox "A Impressora retornou NAK !" & Chr(13) & _
"Erro de Protocolo de Comunicação !", vbOKOnly + vbCritical, "Atenção"
VerificaRetornoFuncaoImpressora = False
Else
If (iST1 <> 0) Or (iST2 <> 0) Then
" Analisa ST1
If (iST1 >= 128) Then
iST1 = iST1 - 128
cMSGErro = cMSGErro + "Fim de Papel" + Chr(13)
ElseIf (iST1 >= 64) Then
iST1 = iST1 - 64
cMSGErro = cMSGErro + "Pouco Papel" + Chr(13)
ElseIf (iST1 >= 32) Then
iST1 = iST1 - 32
cMSGErro = cMSGErro + "Erro no Relógio" + Chr(13)
ElseIf (iST1 >= 16) Then
iST1 = iST1 - 16
cMSGErro = cMSGErro + "Impressora em Erro" + Chr(13)
ElseIf (iST1 >= 8) Then
iST1 = iST1 - 8
cMSGErro = cMSGErro + "Primeiro Dado do Comando não foi ESC" + _
Chr(13)
ElseIf iST1 >= 4 Then
iST1 = iST1 - 4
cMSGErro = cMSGErro + "Comando Inexistente" + Chr(13)
ElseIf iST1 >= 2 Then
iST1 = iST1 - 2
cMSGErro = cMSGErro + "Cupom Fiscal Aberto" + Chr(13)
ElseIf iST1 >= 1 Then
iST1 = iST1 - 1
cMSGErro = cMSGErro + "Número de Parâmetros Inválidos" + Chr(13)
End If
" Analisa ST2
If iST2 >= 128 Then
iST2 = iST2 - 128
cMSGErro = cMSGErro + "Tipo de Parâmetro de Comando Inválido" + _
Chr(13)
ElseIf iST2 >= 64 Then
iST2 = iST2 - 64
cMSGErro = cMSGErro + "Memória Fiscal Lotada" + Chr(13)
ElseIf iST2 >= 32 Then
iST2 = iST2 - 32
cMSGErro = cMSGErro + "Erro na CMOS" + Chr(13)
ElseIf iST2 >= 16 Then
iST2 = iST2 - 16
cMSGErro = cMSGErro + "Alíquota não Programada" + Chr(13)
ElseIf iST2 >= 8 Then
iST2 = iST2 - 8
cMSGErro = cMSGErro + "Capacidade de Alíquota Programáveis " + _
"Lotada" + Chr(13)
ElseIf iST2 >= 4 Then
iST2 = iST2 - 4
cMSGErro = cMSGErro + "Cancelamento não permitido" + Chr(13)
ElseIf iST2 >= 2 Then
iST2 = iST2 - 2
cMSGErro = cMSGErro + "CGC/IE do Proprietário não Programados" + _
Chr(13)
ElseIf iST2 >= 1 Then
iST2 = iST2 - 1
cMSGErro = cMSGErro + "Comando não executado" + Chr(13)
ElseIf (cMSGErro <> "") Then
MsgBox cMSGErro, vbOKOnly + vbCritical, "Atenção"
VerificaRetornoFuncaoImpressora = False
End If
Else
VerificaRetornoFuncaoImpressora = True
End If
End If
End If
End Function
André Luiz R. Munhoz

André Luiz R. Munhoz - Bematech: DSP - Desenvolvimento de Software e Parcerias.
Visite o site: http://www.bematech.com.br.