Amiguinhos,
Fiz alguns testes usando a Activex e a DLL com Harbour e TOleAuto(). Rodou perfeitamente com o emulador Logger e Serial Virtual Ports.
Exemplo utilizado, compilado usando Harbour tradicional .45 Flex.
/////////////////////////////////////////////////////////////////////////////
//
// ACBR - Funcoes Compativeis com ACBrECF
//
// Autor: Jose Carlos da Rocha
// Data: 30/10/2012
// Email: irochinha@itelefonica.com.br
// MSN: fivolution@hotmail.com
// Linguagem: xBase / Fivewin
// Plataformas: DOS, Windows
// Requerimentos: Harbour/xHarbour
//
// Link Acbr32: http://www.multisistemasnet.com/acbr32/ACBr32.rar
// Link Activex: http://www.multisistemasnet.com/acbr32/ACBr_ActiveX.rar
//
//
/////////////////////////////////////////////////////////////////////////////
#include "fivewin.ch"
#include "dll.ch"
#define hDllECF "ACBr32.dll"
function Main(cModelo)
local fn := Array(5)
default cModelo := "12"
oACBrX := TOleAuto():New( "ACBr_ActiveX.ACBrECF" )
nModelo := val(cModelo)
lCancela := .f.
lVinculado := .f.
//if oACBrX:AcharECF( .t., .t., 3 )
// Encontrou uma ECF
//oACBrX:Device:Baud = 115200
oACBrX:Porta = 'COM1'
//oACBrX:TimeOut = 3
oACBrX:Modelo = nModelo
// 1 Emulador
// 2 Bematech
// 3 Sweda
// 4 Daruma
// 5 Schalter
// 6 Mecaf
// 7 Yanco
// 8 DataRegis
// 9 Urano
// 10 ICash
// 11 Quattro
// 12 FiscNET
// 13 Epson
// 14 NCR
// 15 SwedaSTX
//?"oACBrX:Ativar()"
cACBrAtivar := oACBrX:Ativar()
if cACBrAtivar // empty( cACBrAtivar )
// Ativou ECF
// oACBrX:Ativo()
//?"oACBrX:ModeloStr", oACBrX:ModeloStr()
//?"oACBrX:NumCupom", oACBrX:NumCupom()
//?"oACBrX:NumCOO", oACBrX:NumCOO()
//?"oACBrX:", oACBrX:()
//?"oACBrX:IdentificaConsumidor", oACBrX:IdentificaConsumidor("11898853878","ROCHA","SEM ENDERECO")
//? "TestaPodeAbrirCupom", oACBrX:TestaPodeAbrirCupom()
//?"oACBrX:AbrirCupom()"
nEstadoECF := oACBrX:Estado
do case
Case nEstadoECF = 1
Case nEstadoECF = 2
Case nEstadoECF = 3
Case nEstadoECF = 4
Case nEstadoECF = 5
Case nEstadoECF = 6
? "Reducao Z do dia ja efetuada. ECF travado ate 00:00."
oACBrX:Desativar()
return nil
Case nEstadoECF = 7
? "O ECF precisa realizar REDUÇÃO Z."
if MsgYesNo( "Deseja imprimir Reducao Z?" )
nRetorno := oACBrX:ReducaoZ() // dtoc(date()-1)+" "+time())
else
oACBrX:Desativar()
return nil
endif
Case nEstadoECF = 8
Case nEstadoECF = 9
endcase
cACBrAbrirCupom := oACBrX:AbrirCupom("11898853878","ROCHA","SEM ENDERECO")
if empty( cACBrAbrirCupom ) // AbreCupom("11898853878","ROCHA","SEM ENDERECO")
// Se Abriu o cupom
//?"oACBrX:VendeItemSimples"
//lCancela := oACBrX:VendeItemSimples( "123", "Descricao", 10, 15.45 )
lCancela := oACBrX:VendeItem( "123", "Descricao", "T00", "10", "15,45", "0", "UN", "%", "D" )
// Vendeu um item
//if ! lCancela; oACBrX:CancelaCupom(); endif
//?"oACBrX:SubTotalizaCupom",;
lCancela := oACBrX:SubTotalizaCupom( 0, "Sub Total" )
// Subtotalizou
//if ! lCancela; oACBrX:CancelaCupom(); endif
sNCupom := "100"
sIndiceForma := "1"
//?"oACBrX:EfetuaPagamento",;
lCancela := oACBrX:EfetuaPagamento( sIndiceForma, 200, "DEVE VOLTAR TROCO", lVinculado )
// Subtotalizou
//if ! lCancela; oACBrX:CancelaCupom(); endif
//?"oACBrX:FechaCupom",;
lCancela := oACBrX:FechaCupom( "5Volution Fenix|http://5volution.COM.BR" )
// Subtotalizou
//if ! lCancela; oACBrX:CancelaCupom(); endif
//? "oACBrX:MFD", oACBrX:MFD()
? "AliquotaStr" , oACBrX:AliquotaStr, ;
"LerTotaisAliquota", oACBrX:LerTotaisAliquota,;
"Estado" , oACBrX:Estado , ;
"Modelo" , oACBrX:Modelo , ;
"ModeloStr" , oACBrX:ModeloStr , ;
"CNPJ" , oACBrX:CNPJ , ;
"RFDID" , oACBrX:RFDID
// "GetDadosUltimaReducaoZ", oACBrX:GetDadosUltimaReducaoZ,;
? "oACBrX:NumCupom", oACBrX:NumCupom() , ;
"oACBrX:NumCOO" , oACBrX:NumCOO , ;
"oACBrX:NumCRZ" , oACBrX:NumCRZ() , ;
"oACBrX:SubTotal", ;
sSubtotal := oACBrX:SubTotal
if MsgYesNo( "Leitura Memoria Fiscal Simplificada?" )
nRetorno := oACBrX:LeituraMemoriaFiscalReducao( 1, 1, .t. )
endif
if MsgYesNo( "Leitura Memoria Fiscal Simplificada em Arquivo?" )
nRetorno := oACBrX:LeituraMemoriaFiscalArquivoReducao( 1, 1, "c:\reducao.txt", .t. )
endif
// nRetorno := oACBrX:CancelaItemVendido( Val(valor) )
if MsgYesNo( "Deseja cancelar este cupom?" )
nRetorno := oACBrX:CancelaCupom() // oACBrX:
endif
if MsgYesNo( "Deseja imprimir Leitura X?" )
nRetorno := oACBrX:LeituraX()
endif
//if MsgYesNo( "Deseja imprimir Reducao Z?" )
// nRetorno := oACBrX:ReducaoZ() // dtoc(date()-1)+" "+time())
//endif
//nRetorno := oACBrX:RelatorioGerencial( "teste", 1, "100" )
//nRetorno := oACBrX:EspelhoMFD_DLLPorCOO("50", "150", "c:\temp\mfd.txt", .t.)
if MsgYesNo( "Abre Cupom Vinculado?" )
// O processo do TEF é:
// 1 - Cupom Fiscal, finalizado com uma Forma de Pagamento que permita Cupons Vinculados (no caso da Bematech somente a 01-Dinheiro nao permite)
// 2 - Abra o Cupom NAO Fiscal Vinculado...
// 3 - Imprima as 2 vias do comprovante
// 4 - Feche o Cupom Nao Fiscal Vinculado
// 5 - Se nao houver confirmação do Fechamento do Cupom NAO Fiscal Vinculado (queda de energia (simule desligando o ECF)) va ao passo 6 se tudo estiver OK ao passo 12
// 6 - Emitir msg ao usuário informando o ERRO ao imprimir. Tentar novamente ?
// 7 - Se SIM, Fechar qq Cupom Fiscal Vinculado ou Relatorio Gerencial que esteja aberto
// 8 - Abra um relatorio Gerencial
// 9 - Imprima dentro do Relatorio Gerencial as 2 vias...
// 10 - Feche o relatorio Gerencial
// 11 - Se NAO confirmou a impressao, volte ao passo 6
// 12 - Se tudo OK, Confirmar a impressao correta enviando o CNF ao TEF Discado...
nRetorno := oACBrX:AbreCupomVinculado( sNCupom, sIndiceForma, sSubtotal )
// Imprime o texto do TEF
nRetorno := oACBrX:LinhaCupomVinculado( ' REDECARD' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( 'TERMINAL No. RD000000' )
//LinhaCupomVinculado( 'ESTAB. No. 000000009999999' )
//LinhaCupomVinculado( '------------------------------')
//LinhaCupomVinculado( 'MASTERCARD VENDA-CR' )
//LinhaCupomVinculado( '5390581381691605' )
//LinhaCupomVinculado( 'DATA/HORA VALIDADE' )
//LinhaCupomVinculado( '26/11/03 15:53:08 05/09' )
//LinhaCupomVinculado( 'AUTENT:' )
//LinhaCupomVinculado( '260007' )
//LinhaCupomVinculado( 'C.V.: AUTORIZ.' )
//LinhaCupomVinculado( '7 123456' )
//LinhaCupomVinculado( '------------------------------')
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( '### OPERACAO SIMULADA ###' )
//LinhaCupomVinculado( '### NENHUM VALOR SERA ###' )
//LinhaCupomVinculado( '### CREDITADO OU DEBITADO ###' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( 'APROVADO' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( 'VALOR: 1590' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( 'ASSINATURA DO CLIENTE' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( 'RECONHECO E PAGAREI A' )
//LinhaCupomVinculado( 'DIVIDA AQUI APRESENTADA' )
//LinhaCupomVinculado( '' )
//LinhaCupomVinculado( ' (SiTef)' )
//LinhaCupomVinculado( 'Transacao OK' )
// Fecha o Comprovante do TEF
? "FechaRelatorio", ;
nRetorno := oACBrX:FechaRelatorio()
endif
else
oACBrX:CancelaCupom()
endif
endif
//?"FechaCupom"
//nRetorno := oACBrX:FechaCupom( "5Volution Fenix|http://5volution.COM.BR" )
oACBrX:Desativar()
//oACBrX:ACBr_Destroi() // Desativar()
//endif
return nil
DLL32 FUNCTION CancelaCupom(HANDLE As _DOUBLE) AS _INT PASCAL FROM "ECF_CancelaCupom" LIB hDllECF
#pragma BEGINDUMP
#include
#include
typedef LONG ( * PDLLREGISTERSERVER ) ( void );
HB_FUNC( REGISTERSERVER )
{
HMODULE hDll = LoadLibrary( hb_parc( 1 ) );
LONG lReturn = 0;
if( hDll )
{
FARPROC pRegisterServer = GetProcAddress( hDll, "DllRegisterServer" );
if( pRegisterServer )
lReturn = ( ( PDLLREGISTERSERVER ) pRegisterServer )();
FreeLibrary( hDll );
}
hb_retnl( lReturn );
}
#pragma ENDDUMP
Function Random( nMaximo )
static nRandom
local nTemporal
nMaximo = if( nMaximo == NIL, 65535, nMaximo )
if nRandom == NIL
nRandom = seconds()
endif
nTemporal = ( nRandom * seconds() ) % ( nMaximo + 1 )
nTemporal = if( nTemporal < 1, 1, nTemporal )
nRandom = nTemporal + seconds()
RETURN int( nTemporal )
Function VRandom( nIMaximo, nDMaximo )
static nIRandom, nDRandom
local nITemporal, nDTemporal
nIMaximo = if( nIMaximo == NIL, 65535, nIMaximo )
nDMaximo = if( nDMaximo == NIL, 65535, nDMaximo )
nIRandom = if( nIRandom == NIL, seconds(), nIRandom )
nDRandom = if( nDRandom == NIL, seconds(), nDRandom )
nITemporal = ( nIRandom * seconds() ) % ( nIMaximo + 1 )
nDTemporal = ( nDRandom * seconds() ) % ( nDMaximo + 1 )
nIRandom = nITemporal + seconds()
nDRandom = nDTemporal + seconds()
RETURN int( nITemporal ) + ( int( nDTemporal ) / 100 )