O codigo abaixo tem o intuito de ajudar na construção de aplicativos que fazem uso da impressora Fiscal Bematech. Faz uso maciço do Driver Remoto e do Monitor Bematech( Requisitos necessários ).
/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *
* Procedure_: REMOTO.PRG
* Autor_____: Jose Carlos da Rocha - Konectiva Automacao
* Cria‡„o___: 30 de Novembro de 2005
* Objetivo__: Emissao de Cupom Fiscal - Impressora: BEMATECH
* Rotina____: M¢dulo de comandos via Monitor e Bemafi32
* Direitos__: Qualquer alteração neste código pode ser feita deste que
* seja mantida a autoria principal.
* Alterado__: ___/___/____
* por_______: ___________________________________________
* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
#include "FiveWin.ch"
#include "fileio.ch"
#include "status.ch"
static oWnd, iPorta := "COM1"
static cDirDoMonitorBematech := "C:\5Vol\ecf"
static cDirDoGerencidorTEF := "C:\tef_dial"
//----------------------------------------------------------------------------//
function Main()
SET _3DLOOK ON
PUBLIC lInit:=.T., oFnt3
DEFINE FONT oFnt3 NAME "flick bold hollow" SIZE 0,-42 NESCAPEMENT 90*10
DEFINE WINDOW oWnd FROM 0, 0 TO 600, 800 PIXEL ;
TITLE "Bematech Monitor" MENU BuildMenu() ;
MDI
SET MESSAGE OF oWnd TO FWVERSION CLOCK DATE KEYBOARD NOINSET
ACTIVATE WINDOW ownd MAXIMIZED ;
ON PAINT ( Refr_Wnd(hDC,235,0,"© Konectiva Development",oFnt3), SCLogo(hDC, "5Volution Legacy", oFnt3, oWnd ) )
RETURN NIL
//----------------------------------------------------------------------------//
function BuildMenu()
local oMenu
MENU oMenu
MENUITEM "Inicializacao" // Comandos_Inicializacao()
MENU
MENUITEM "Altera Simbolo da Moeda para R$" ACTION ( ;
Comunica_Impressora_Fiscal( "006", " R" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Adiciona uma Aliquota de 17,00%" ACTION ( ;
Comunica_Impressora_Fiscal( "063", "17,00|1" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Ativa/Desativa Horario de Verao" ACTION ( ;
Comunica_Impressora_Fiscal( "066", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Grava Totalizador 'Duplicata'" ACTION ( ;
Comunica_Impressora_Fiscal( "053", "15|Duplicata" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Programa Arredondamento" ACTION ( ;
Comunica_Impressora_Fiscal( "064", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Programa Truncamento" ACTION ( ;
Comunica_Impressora_Fiscal( "069", " R" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Programa salto de 8 linhas entre cupons" ACTION ( ;
Comunica_Impressora_Fiscal( "047", "8" ),;
Retorno_Impressora_Fiscal() )
ENDMENU
MENUITEM "Cupom Fiscal" // Comandos_Cupom_Fiscal()
MENU
MENUITEM "Abre Cupom Fiscal" ACTION ( ;
Comunica_Impressora_Fiscal( "003", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Vende o Item 'Coca-cola'" ACTION ( ;
Comunica_Impressora_Fiscal( "089", "1234567890123|Coca-cola|FF|I|1|2|1,00|%|00,00" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Cancela o Item Vendido" ACTION ( ;
Comunica_Impressora_Fiscal( "011", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Inicia o Fechamento do Cupom" ACTION ( ;
Comunica_Impressora_Fiscal( "040", "A|%|00,00" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Efetua a Forma de Pagamento 'Ticket'" ACTION ( ;
Comunica_Impressora_Fiscal( "023", "Ticket|1,00" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Termina o Fechamento do Cupom" ACTION ( ;
Comunica_Impressora_Fiscal( "082", "Obrigado, volte sempre !" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Cancela o Cupom Fiscal" ACTION ( ;
Comunica_Impressora_Fiscal( "009", "" ),;
Retorno_Impressora_Fiscal() )
ENDMENU
MENUITEM "Operacoes Nao Fiscais" // Comandos_Operacoes_Nao_Fiscais()
MENU
MENUITEM "Relatorio Gerencial" ACTION ( ;
Comunica_Impressora_Fiscal( "072", "TESTE DE IMPRESSAO..." ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Fecha Relatorio Gerencial" ACTION ( ;
Comunica_Impressora_Fiscal( "031", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Efetua Suprimento de '50,00'" ACTION ( ;
Comunica_Impressora_Fiscal( "081", "50,00|Dinheiro" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Efetua Sangria de '30,00'" ACTION ( ;
Comunica_Impressora_Fiscal( "078", "30,00" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Efetua Recebimento no Totalizador '01'" ACTION ( ;
Comunica_Impressora_Fiscal( "070", "01|1,00|Dinheiro" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Abre Comprovante Vinculado ao 'Ticket'" ACTION ( ;
Comunica_Impressora_Fiscal( "002", "Ticket" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Imprime Texto no Comprovante Vinculado" ACTION ( ;
Comunica_Impressora_Fiscal( "084", "TESTE DE IMPRESSAO LINHA 1" + chr( 13 ) + chr( 10 ) + "TESTE DE IMPRESSAO LINHA 2" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Fecha Comprovante Vinculado" ACTION ( ;
Comunica_Impressora_Fiscal( "027", "" ),;
Retorno_Impressora_Fiscal() )
ENDMENU
MENUITEM "Relatorio Fiscais" // Comandos_Relatorios_Fiscais()
MENU
MENUITEM "Emite Leitura X" ACTION ( ;
Comunica_Impressora_Fiscal( "045", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Emite Reducao Z" ACTION ( ;
Comunica_Impressora_Fiscal( "071", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Emite a Leitura da M. F. por Data" ACTION ( ;
Comunica_Impressora_Fiscal( "041", "01/12/03|31/12/03" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Emite a Leitura da M. F. por Reducao" ACTION ( ;
Comunica_Impressora_Fiscal( "042", "0001|0010" ),;
Retorno_Impressora_Fiscal() )
ENDMENU
MENUITEM "Informacoes da Impressora" // Comandos_das_Informacoes_Impressora()
MENU
MENUITEM "Retorna as Aliquotas Cadastradas" ACTION ( ;
Comunica_Impressora_Fiscal( "076", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Numero do Ultimo Cupom" ACTION ( ;
Comunica_Impressora_Fiscal( "055", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Subtotal do Cupom Fiscal" ACTION ( ;
Comunica_Impressora_Fiscal( "080", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Numero de Serie do ECF" ACTION ( ;
Comunica_Impressora_Fiscal( "061", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o GT (Grande Total)" ACTION ( ;
Comunica_Impressora_Fiscal( "034", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Valor de Cancelamentos" ACTION ( ;
Comunica_Impressora_Fiscal( "013", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Valor de Descontos" ACTION ( ;
Comunica_Impressora_Fiscal( "022", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Valor de Acrescimos" ACTION ( ;
Comunica_Impressora_Fiscal( "005", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Outras..."
MENU
MENUITEM "Retorna a Data da Ultima Reducao Z" ACTION ( ;
Comunica_Impressora_Fiscal( "018", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna a Data do Movimento" ACTION ( ;
Comunica_Impressora_Fiscal( "021", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna os Flags Fiscais" ACTION ( ;
Comunica_Impressora_Fiscal( "032", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna a Data e a Hora do ECF" ACTION ( ;
Comunica_Impressora_Fiscal( "019", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Numero de Reducoes Z" ACTION ( ;
Comunica_Impressora_Fiscal( "060", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Valor da Forma 'Dinheiro'" ACTION ( ;
Comunica_Impressora_Fiscal( "086", "Dinheiro" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna os Dados do Mapa Resumo" ACTION ( ;
Comunica_Impressora_Fiscal( "048", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Relatorio Tipo60 Mestre" ACTION ( ;
Comunica_Impressora_Fiscal( "074", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
MENUITEM "Retorna o Relatorio Tipo60 Analitico" ACTION ( ;
Comunica_Impressora_Fiscal( "073", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
ENDMENU
ENDMENU
MENUITEM "Autenticacao e Gaveta" // Comandos_Autenticacao_Gaveta()
MENU
MENUITEM "Autentica Documento" ACTION ( ;
Comunica_Impressora_Fiscal( "008", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Abre Gaveta de Dinheiro" ACTION ( ;
Comunica_Impressora_Fiscal( "004", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Verifica Estado Gaveta de Dinheiro" ACTION ( ;
Comunica_Impressora_Fiscal( "094", "" ),;
Retorno_Impressora_Fiscal(),;
Retorno_Dados_Impressora_Fiscal() )
ENDMENU
MENUITEM "Integracao TEF" // Comandos_Autenticacao_Gaveta()
MENU
MENUITEM "Verifica Gerenciador" ACTION ( ;
MsgStop( "Gerenciador Padrao se encontra "+iif(VerificaGerenciador()=1,"ATIVO","INATIVO") ) )
MENUITEM "Abre Cupom Fiscal" ACTION ( ;
Comunica_Impressora_Fiscal( "003", "" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Vende o Item 'Coca-cola'" ACTION ( ;
Comunica_Impressora_Fiscal( "089", "1234567890123|Coca-cola|FF|I|1|2|1,00|%|00,00" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Inicia o Fechamento do Cupom" ACTION ( ;
Comunica_Impressora_Fiscal( "040", "A|%|00,00" ),;
Retorno_Impressora_Fiscal() )
MENUITEM "Venda Cartao" ACTION VendaCartao()
MENUITEM "Confirma Venda" ACTION FUN() // ACTION ConfirmaVenda()
MENUITEM "Nao Confirma Venda" ACTION FUN() // ACTION NaoConfirmaVenda()
MENUITEM "Cancela Venda" ACTION FUN() // ACTION CancelaVenda()
MENUITEM "Administrativo" ACTION FUN() // ACTION ADM()
MENUITEM "Imprime Relat¢rio" ACTION FUN() // ACTION Relatorio()
ENDMENU
ENDMENU
return oMenu
function fun()
return .t.
/////////////////////////////////////////////////////////////////////////////
// Descricao.: Funcao que comunica com a impressora fiscal Bematech, via
// Driver Remoto
// Parâmetros: STRING com o indice do comando
// STRING com os dados a serem enviados
/////////////////////////////////////////////////////////////////////////////
function Comunica_Impressora_Fiscal( cIndice, cDados )
if empty(cFileName( cDirDoMonitorBematech+"BematechMonitor.exe" ))
MsgStop( "Monitor da Bematech nao encontrado em "+cDirDoMonitorBematech )
return .t.
endif
oWnd:SetMsg( "Aguarde, acionando o monitor..." )
if file( "BemaFI32.cmd" )
delete file( "BemaFI32.cmd" )
endif
cArquivo := fcreate( "BemaFI32.cmd" )
if len( cDados ) = 0
cBuffer := cIndice + "|"
else
cBuffer := cIndice + "|" + cDados + "|"
endif
fwrite( cArquivo, @cBuffer, len( cBuffer ) )
fclose( "BemaFI32.cmd" )
__CopyFile( "BemaFI32.cmd", cDirDoMonitorBematech+"\BemaFI32.tmp" )
FRename( cDirDoMonitorBematech+"\BemaFI32.tmp", cDirDoMonitorBematech+"\BemaFI32.cmd" )
MyWait(5)
return .t.
function MyWait(_tempo_)
_tempo_ := _tempo_*60000
for i = 1 to _tempo_
next
return .t.
/////////////////////////////////////////////////////////////////////////////
// Descricao.: Funcao que retorno o status da impressora fiscal
// Parâmetros: nenhum
/////////////////////////////////////////////////////////////////////////////
function Retorno_Impressora_Fiscal
_vezes_ := 5
do while _vezes_>0
// Verifica se o arquivo Status.txt existe.
// Este arquivo que contém o estado de execução do comando
// enviado.
if file( cDirDoMonitorBematech+"\Status.txt" ) .and. freadstr( file( cDirDoMonitorBematech+"\Status.txt" ) ) <> "0"
cArquivo := fopen( cDirDoMonitorBematech+"\Status.txt" )
cArquivoTamanho := fseek( cArquivo, 0, 2 )
fclose( cArquivo )
if cArquivoTamanho <> 0
cArquivo := fopen( cDirDoMonitorBematech+"\Status.txt" )
cRetorno := " "
cACK := ""
do while .T.
for cProcura := 1 to 3
fread( cArquivo, @cRetorno, 1 )
if cRetorno = ","
cProcura := 4
else
cACK = cACK + cRetorno
endif
next cProcura
if cACK = "0"
MsgStop( "Erro de comunicacao com a impressora fiscal..." )
exit
else
exit
endif
enddo
cST1 := ""
for cProcura := 1 to 3
fread( cArquivo, @cRetorno, 1 )
if cRetorno = ","
cProcura := 4
else
cST1 = cST1 + cRetorno
endif
next cProcura
cST2 := ""
for cProcura := 1 to 3
fread( cArquivo, @cRetorno, 1 )
if cRetorno = "," .or. asc( cRetorno ) = 13
cProcura := 4
else
cST2 = cST2 + cRetorno
endif
next cProcura
fclose( cArquivo )
delete file( cDirDoMonitorBematech+"\Status.txt" )
cST1 := val( cST1 )
cST2 := val( cST2 )
if cST1 <> 0 .or. cST2 <> 0
cMsgRetorno := ""
cMsgRetorno := cMsgRetorno + ST1_BIT_7 + CRLF
cMsgRetorno := cMsgRetorno + ST1_BIT_6 + CRLF
cMsgRetorno := cMsgRetorno + ST1_BIT_5 + CRLF
cMsgRetorno := cMsgRetorno + ST1_BIT_4 + CRLF
cMsgRetorno := cMsgRetorno + ST1_BIT_3 + CRLF
cMsgRetorno := cMsgRetorno + ST1_BIT_2 + CRLF
cMsgRetorno := cMsgRetorno + ST1_BIT_1 + CRLF
cMsgRetorno := cMsgRetorno + ST1_BIT_0 + CRLF
cMsgRetorno := cMsgRetorno + ST2_BIT_7 + CRLF
cMsgRetorno := cMsgRetorno + ST2_BIT_6 + CRLF
cMsgRetorno := cMsgRetorno + ST2_BIT_5 + CRLF
cMsgRetorno := cMsgRetorno + ST2_BIT_4 + CRLF
cMsgRetorno := cMsgRetorno + ST2_BIT_3 + CRLF
cMsgRetorno := cMsgRetorno + ST2_BIT_2 + CRLF
cMsgRetorno := cMsgRetorno + ST2_BIT_1 + CRLF
cMsgRetorno := cMsgRetorno + ST2_BIT_0 + CRLF
// Verificando o ST1
if cSt1 >= 128; cMsgRetorno := cMsgRetorno + ST1_BIT_7 + CRLF ; cSt1 = cSt1 - 128; endif
if cSt1 >= 64; cMsgRetorno := cMsgRetorno + ST1_BIT_6 + CRLF ; cSt1 = cSt1 - 64; endif
if cSt1 >= 32; cMsgRetorno := cMsgRetorno + ST1_BIT_5 + CRLF ; cSt1 = cSt1 - 32; endif
if cSt1 >= 16; cMsgRetorno := cMsgRetorno + ST1_BIT_4 + CRLF ; cSt1 = cSt1 - 16; endif
if cSt1 >= 8; cMsgRetorno := cMsgRetorno + ST1_BIT_3 + CRLF ; cSt1 = cSt1 - 8; endif
if cSt1 >= 4; cMsgRetorno := cMsgRetorno + ST1_BIT_2 + CRLF ; cSt1 = cSt1 - 4; endif
if cSt1 >= 2; cMsgRetorno := cMsgRetorno + ST1_BIT_1 + CRLF ; cSt1 = cSt1 - 2; endif
if cSt1 >= 1; cMsgRetorno := cMsgRetorno + ST1_BIT_0 + CRLF ; cSt1 = cSt1 - 1; endif
// Verificando o ST2
if cSt2 >= 128; cMsgRetorno := cMsgRetorno + ST2_BIT_7 + CRLF ; cSt2 = cSt2 - 128; endif
if cSt2 >= 64; cMsgRetorno := cMsgRetorno + ST2_BIT_6 + CRLF ; cSt2 = cSt2 - 64; endif
if cSt2 >= 32; cMsgRetorno := cMsgRetorno + ST2_BIT_5 + CRLF ; cSt2 = cSt2 - 32; endif
if cSt2 >= 16; cMsgRetorno := cMsgRetorno + ST2_BIT_4 + CRLF ; cSt2 = cSt2 - 16; endif
if cSt2 >= 8; cMsgRetorno := cMsgRetorno + ST2_BIT_3 + CRLF ; cSt2 = cSt2 - 8; endif
if cSt2 >= 4; cMsgRetorno := cMsgRetorno + ST2_BIT_2 + CRLF ; cSt2 = cSt2 - 4; endif
if cSt2 >= 2; cMsgRetorno := cMsgRetorno + ST2_BIT_1 + CRLF ; cSt2 = cSt2 - 2; endif
if cSt2 >= 1; cMsgRetorno := cMsgRetorno + ST2_BIT_0 + CRLF ; cSt2 = cSt2 - 1; endif
MsgStop( cMsgRetorno, "Retorno da Impressora" )
exit
else
exit
endif
else
loop
endif
endif
MyWait(1)
_vezes_--
enddo
return
/////////////////////////////////////////////////////////////////////////////
// Descricao.: Funcao que retorno dados da impressora fiscal
// Parâmetros: nenhum
/////////////////////////////////////////////////////////////////////////////
function Retorno_Dados_Impressora_Fiscal
_vezes_ := 5
cArquivo:= ""
do while _vezes_>0
oWnd:SetMsg( "Verificando a existencia do arquivo Retorno.txt..." )
if file( cDirDoMonitorBematech+"\Retorno.txt" ) .and. freadstr( file( cDirDoMonitorBematech+"\Retorno.txt" ) ) <> "0"
cArquivo := fopen( cDirDoMonitorBematech+"\Retorno.txt" )
cArquivoTamanho := fseek( cArquivo, 0, 2 )
fclose( cArquivo )
if cArquivoTamanho <> 0
cArquivo := fopen( cDirDoMonitorBematech+"\Retorno.txt" )
cRetorno := " "
cDados := ""
for cProcura := 1 to cArquivoTamanho
fread( cArquivo, @cRetorno, 1 )
cDados = cDados + cRetorno
next cProcura
exit
endif
endif
MyWait(1)
_vezes_--
enddo
if !empty(cArquivo)
fclose( cArquivo )
MsgStop( cDados, "Retorno dos Dados da Impressora" )
else
MsgStop( "Nenhum retorno foi encontrado", "Retorno dos Dados da Impressora" )
endif
return
/////////////////////////////////////////////////////////////////////////////
// Descricao: Funcoes de perfumaria
/////////////////////////////////////////////////////////////////////////////
Function SCLogo(hDC,cPrompt,oFont,oWnd) // oWnd:nHeight-300
DrawRotated(hDC, cPrompt, (oWnd:nHeight-110)+1, 1, CLR_WHITE, CLR_BLACK, oFont)
DrawRotated(hDC, cPrompt, (oWnd:nHeight-110)-1, 0, CLR_GRAY , CLR_BLACK, oFont)
return
Function SayRotated(oWnd,Y,X,cPrompt,oFont,nClrText,nClrPane,l3D)
Local hDC:=oWnd:hDC
DEFAULT nClrText:=CLR_BLUE, l3D:=.T.
IF l3D
DrawRotated(hdc, cPrompt, Y + 1, X + 1, CLR_BLACK,nClrPane,oFont)
DrawRotated(hdc, cPrompt, Y - 1, X - 1, nClrText,nClrPane,oFont)
ENDIF
DrawRotated(hdc, cPrompt, Y , X , nClrText,nClrPane,oFont)
return
Function DrawRotated(hDC,cPrompt,Y,X,nClrText,nClrPane,oFont)
Local hOldFont, nOldMode, nOldClrText, nOldClrPane
nOldClrText:=SetTextColor(hDC,nClrText)
if nClrPane<>nil
nOldClrPane:=SetBkColor(hDC,nClrPane)
else
nOldBkMode:=SetBkMode(hDC,1)
endif
hOldFont:=SelectObject(hDC,oFont:hFont)
TextOut(hDC,Y,X,cPrompt,Len(cPrompt))
SelectObject(hDC,hOldFont)
if nClrPane<>nil
SetBkColor(hDC,nOldClrPane)
else
SetBkMode(hDC,nOldBkMode)
endif
SetTextColor(hDC,nOldClrText)
return
Function DrawLogo( oWnd, cBitMap )
local hBmp := LoadBitmap( GetResources(), cBitmap )
DrawBitmap( oWnd:hDC, hBmp, 20, 20 )
DeleteObject( hBmp )
return nil
Function Refr_Wnd(hDC, Y , X, cPrompt , oFont)
LOCAL hWnd, nColor:=255
LOCAL aRect, nSteps
LOCAL oBrush, nI
LOCAL aCoor
IF lInit
aCoor:=GetCoors(GetDeskTopWindow()) // Coordenadas de ventana
IF aCoor[3]>=768 // si > 600x800 la centra
aCoor[1]:=(aCoor[3]-768)/2
aCoor[2]:=(aCoor[4]-1024)/2
aCoor[3]:=600
aCoor[4]:=800
oWnd:Move(aCoor[1],aCoor[2],aCoor[4],aCoor[3])
ELSE
oWnd:Maximize()
ENDIF
lInit:=.F.
ENDIF
hWnd :=oWnd:hWnd
aRect :=GetClientRect(hWnd)
nSteps:=(aRect[3]-aRect[1])/3
aRect[3]=0
FOR nI=1 to nSteps
aRect[3]+=3
DEFINE BRUSH oBrush COLOR RGB(nColor,nColor,nColor)
FillRect(hDC,aRect,oBrush:hBrush)
RELEASE BRUSH oBrush
aRect[1]+=3
nColor-=1
NEXT nI
SetBkMode(hDC,1)
SetTextColor(hDC,CLR_WHITE)
DrawText(hDC,cPrompt,{oWnd:nHeight-135+1,oWnd:nWidth-180+1,oWnd:nHeight-10,oWnd:nWidth-10})
SetTextColor(hDC,CLR_GRAY)
DrawText(hDC,cPrompt,{oWnd:nHeight-135-1,oWnd:nWidth-180-1,oWnd:nHeight-10,oWnd:nWidth-10})
//DrawRotated(hDC, "5Volution", Y+250+2, X+2, CLR_GRAY , CLR_BLACK, oFnt3)
//DrawRotated(hDC, "5Volution", Y+250-2, X-2, CLR_WHITE, CLR_BLACK, oFnt3)
RETURN (NIL)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Exemplo para a utilização das Funções do TEF, utilizando a LIB
// BEMAFI.LIB
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define FileTop(nHandle) (FSEEK(nHandle, 0, 1))
#define FileSize(nHandle, tam) ( tam := FSEEK(nHandle, 0, FS_END) ) //Escreve em tam o tamanho do arquivo
#define FilePos (nHandle, pos) ( pos := FSEEK(nHandle, 0, 1) ) //Escreve em pos a posicao atual
#define FileaPos(nHandle, pos) ( FSEEK(nHandle, pos, FS_SET) ) //Vai para a pos
/////////////////////////////////////////////////////////////////////////////
// Fun‡„o: VerificaGerenciador
// Verifica se o Gerenciador Padr„o est ativo.
/////////////////////////////////////////////////////////////////////////////
function VerificaGerenciador
if empty( cDirDoGerencidorTEF+"\tef_dial.exe" )
MsgStop( "Gerenciador Padrao nao encontrado em "+cDirDoGerencidorTEF )
return 0
endif
oWnd:SetMsg( "Aguarde, acionando o gerenciador padrao..." )
iVezes := 7
sArq := fcreate( "INTPOS.001" )
sPathOrigem := ".\INTPOS.001"
do while iVezes<>0
if file( cDirDoGerencidorTEF+"\RESP\ATIVO.001" )
return 1
exit
else
iVezes--
sLinhas := "000-000 = ATV" + chr( 13 ) + chr( 10 ) + ;
"001-000 = 0000000001" + chr( 13 ) + chr( 10 ) + ;
"999-999 = 0"
fwrite( sArq, @sLinhas, len( sLinhas ) )
__copyfile( sPathOrigem, cDirDoGerencidorTEF+"\RESP\INTPOS.tmp" )
FRename( cDirDoGerencidorTEF+"\RESP\INTPOS.tmp", cDirDoGerencidorTEF+"\RESP\INTPOS.001" )
MyWait(3)
if file( cDirDoGerencidorTEF+"\RESP\INTPOS.STS" )
return 1
exit
endif
endif
enddo
return 0
/////////////////////////////////////////////////////////////////////////////
// Fun‡„o: VendaCartao
// Ativa o Gerenciador Padr„o, gerando o arquivo INTPOS.001, efetuando a
// transa‡„o.
/////////////////////////////////////////////////////////////////////////////
function VendaCartao
delete file( cDirDoGerencidorTEF+"\RESP\INTPOS.001" )
sArq := fcreate( "INTPOS.001" )
sPathOrigem := ".\INTPOS.001"
//////////////////////////////////////
// Recebendo o N£mero do Cupom Fiscal
//////////////////////////////////////
Comunica_Impressora_Fiscal( "055", "" )
sNCupom := ""
sDados := ""
sRetorno := " "
for iConta := 1 to 9
fread_bema( iPorta, @sRetorno, 1 )
sDados += sRetorno
next
sNCupom := right( sDados, 6 )
////////////////////////////////////////
// Recebendo o Subtotal do Cupom Fiscal
////////////////////////////////////////
Comunica_Impressora_Fiscal( "080", "" )
sSubtotal := ""
sDados := ""
sRetorno := " "
for iConta := 1 to 17
fread_bema( iPorta, @sRetorno, 1 )
sDados += sRetorno
next
sSubtotal2 := right( sDados, 14 )
sSubtotal := right( sDados, 12 )
////////////////////////////////
// Prepara o arquivo INTPOS.001
////////////////////////////////
sLinhas := "000-000 = CRT" + chr( 13 ) + chr( 10 ) + ;
"001-000 = 0000000001" + chr( 13 ) + chr( 10 ) + ;
"002-000 = " + sNCupom + chr( 13 ) + chr( 10 ) + ;
"003-000 = " + sSubtotal + chr( 13 ) + chr( 10 ) + ;
"004-000 =" + chr( 13 ) + chr( 10 ) + ;
"999-999 = 0" + chr( 13 ) + chr( 10 )
fwrite( sArq, @sLinhas, len( sLinhas ) )
__copyfile( sPathOrigem, cDirDoGerencidorTEF+"\RESP\INTPOS.tmp" )
FRename( cDirDoGerencidorTEF+"\RESP\INTPOS.tmp", cDirDoGerencidorTEF+"\RESP\INTPOS.001" )
//////////////////////////////////////////////////////////////////
// Recebendo o arquivo INTPOS.001 com as informacoes da Transacao
//////////////////////////////////////////////////////////////////
iVezes := 7
do while iVezes<>0
oWnd:SetMsg( "Recebendo o retorno da transacao..." )
if file( cDirDoGerencidorTEF+"\RESP\INTPOS.001" ) .and. freadstr( file( cDirDoGerencidorTEF+"\RESP\INTPOS.001" ) ) <> "0"
sArq := fopen( cDirDoGerencidorTEF+"\RESP\INTPOS.001" )
iTamArq := fseek( sArq, 0, 2 )
fclose( sArq )
sArq := fopen( cDirDoGerencidorTEF+"\RESP\INTPOS.001" )
sRetorno := " "
sDadosTEF := ""
sDados := ""
for iConta := 1 to iTamArq
sRetorno := " "
fread( sArq, @sRetorno, 1 )
if asc( sRetorno ) = 10
if left( sDados, 3 ) = "029"
sDados := stuff( sDados, 1, 10, "" )
sDados := strtran( sDados, '"', "" )
sDadosTEF += sDados + chr( 10 )
endif
sDados := sRetorno := ""
endif
sDados += sRetorno
next
fclose( sArq )
oWnd:SetMsg( "Imprimindo o TEF..." )
//////////////////////////////////////////////////
// Programa a Forma de Pagamento "Cartao credito"
//////////////////////////////////////////////////
Comunica_Impressora_Fiscal( "053", "15|Cartao credito" )
sRetorno := " "
sDados := ""
for iConta := 1 to 5
fread_bema( iPorta, @sRetorno, 1 )
sDados += sRetorno
next
sIndiceForma := right( sDados, 2 )
////////////////////////////////////////////////
// Efetua a Forma de Pagamento "Cartao credito"
////////////////////////////////////////////////
Comunica_Impressora_Fiscal( "023", sIndiceForma+"|"+sSubtotal2 )
////////////////////////////////////////
// Termina o Fechamento do Cupom Fiscal
////////////////////////////////////////
Comunica_Impressora_Fiscal( "082", "Obrigado, volte sempre !" )
/////////////////////////////////////////////////////////////////
// Simula um retorno do TEF
/////////////////////////////////////////////////////////////////
SimulaTEF()
/////////////////////////////////////////////////////////////////
// Abre Comprovante N„o Fiscal Vinculado para a impress„o do TEF
/////////////////////////////////////////////////////////////////
Comunica_Impressora_Fiscal( "002", "Cartao" )
//////////////////////////
// Imprime o texto do TEF
//////////////////////////
Comunica_Impressora_Fiscal( "200", sDadosTEF )
//////////////////////////////
// Fecha o Comprovante do TEF
//////////////////////////////
Comunica_Impressora_Fiscal( "027", "" )
exit
else
iVezes--
loop
endif
enddo
return
/////////////////////////////////////////////////////////////////////////////
// Fun‡„o: ADM
// Abre a tela Administrativa da Bandeira
/////////////////////////////////////////////////////////////////////////////
function ADM
sArqR := fcreate( "INTPOS.001" )
sPathOrigem := ".\INTPOS.001"
sLinhas := "000-000 = ADM" + chr( 13 ) + chr( 10 ) + ;
"001-000 = 0000000001" + chr( 13 ) + chr( 10 ) + ;
"999-999 = 0"
fwrite( sArqR, @sLinhas, len( sLinhas ) )
__copyfile( sPathOrigem, cDirDoGerencidorTEF+"\RESP\INTPOS.tmp" )
FRename( cDirDoGerencidorTEF+"\RESP\INTPOS.tmp", cDirDoGerencidorTEF+"\RESP\INTPOS.001" )
return
function SimulaTEF()
sArq := fcreate( "INTPOS.001" )
sPathOrigem := ".\INTPOS.001"
sLinhas1 := "000-000 = CRT " + chr( 13 ) + chr( 10 ) + ;
"001-000 = 000005 " + chr( 13 ) + chr( 10 ) + ;
"002-000 = " + chr( 13 ) + chr( 10 ) + ;
"003-000 = 1590 " + chr( 13 ) + chr( 10 ) + ;
"004-000 = 0 " + chr( 13 ) + chr( 10 ) + ;
"009-000 = 0 " + chr( 13 ) + chr( 10 ) + ;
"010-000 = REDECARD " + chr( 13 ) + chr( 10 ) + ;
"011-000 = 10 " + chr( 13 ) + chr( 10 ) + ;
"012-000 = 000000000007 " + chr( 13 ) + chr( 10 ) + ;
"015-000 = 2611155308 " + chr( 13 ) + chr( 10 ) + ;
"022-000 = 26112003 " + chr( 13 ) + chr( 10 ) + ;
"023-000 = 155308 " + chr( 13 ) + chr( 10 ) + ;
"027-000 = 261103000000260007RD01 " + chr( 13 ) + chr( 10 ) + ;
"028-000 = 33 " + chr( 13 ) + chr( 10 ) + ;
"029-001 = ' REDECARD' " + chr( 13 ) + chr( 10 ) + ;
"029-002 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-003 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-004 = '' " + chr( 13 ) + chr( 10 )
sLinhas2 := "029-005 = 'TERMINAL No. RD000000' " + chr( 13 ) + chr( 10 ) + ;
"029-006 = 'ESTAB. No. 000000009999999' " + chr( 13 ) + chr( 10 ) + ;
"029-007 = '------------------------------'" + chr( 13 ) + chr( 10 ) + ;
"029-008 = 'MASTERCARD VENDA-CR' " + chr( 13 ) + chr( 10 ) + ;
"029-009 = '5390581381691605' " + chr( 13 ) + chr( 10 ) + ;
"029-010 = 'DATA/HORA VALIDADE' " + chr( 13 ) + chr( 10 ) + ;
"029-011 = '26/11/03 15:53:08 05/09' " + chr( 13 ) + chr( 10 ) + ;
"029-012 = 'AUTENT:' " + chr( 13 ) + chr( 10 ) + ;
"029-013 = '260007' " + chr( 13 ) + chr( 10 ) + ;
"029-014 = 'C.V.: AUTORIZ.' " + chr( 13 ) + chr( 10 ) + ;
"029-015 = '7 123456' " + chr( 13 ) + chr( 10 ) + ;
"029-016 = '------------------------------'" + chr( 13 ) + chr( 10 ) + ;
"029-017 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-018 = '### OPERACAO SIMULADA ###' " + chr( 13 ) + chr( 10 ) + ;
"029-019 = '### NENHUM VALOR SERA ###' " + chr( 13 ) + chr( 10 )
sLinhas3 := "029-020 = '### CREDITADO OU DEBITADO ###' " + chr( 13 ) + chr( 10 ) + ;
"029-021 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-022 = 'APROVADO' " + chr( 13 ) + chr( 10 ) + ;
"029-023 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-024 = 'VALOR: 1590' " + chr( 13 ) + chr( 10 ) + ;
"029-025 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-026 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-027 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-028 = 'ASSINATURA DO CLIENTE' " + chr( 13 ) + chr( 10 ) + ;
"029-029 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-030 = 'RECONHECO E PAGAREI A' " + chr( 13 ) + chr( 10 ) + ;
"029-031 = 'DIVIDA AQUI APRESENTADA' " + chr( 13 ) + chr( 10 ) + ;
"029-032 = '' " + chr( 13 ) + chr( 10 ) + ;
"029-033 = ' (SiTef)' " + chr( 13 ) + chr( 10 ) + ;
"030-000 = Transacao OK " + chr( 13 ) + chr( 10 ) + ;
"999-999 = 0 " + chr( 13 ) + chr( 10 )
sLinhas := sLinhas1 + sLinhas2 + sLinhas3
fwrite( sArq, @sLinhas, len( sLinhas ) )
__copyfile( sPathOrigem, cDirDoGerencidorTEF+"\RESP\INTPOS.tmp" )
FRename( cDirDoGerencidorTEF+"\RESP\INTPOS.tmp", cDirDoGerencidorTEF+"\RESP\INTPOS.001" )
return .t.
@braços :?)