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;
Nenhum comentário:
Postar um comentário