Impressora Fiscal - ECF - Conceitos Básicos


Antes de começar eu quero deixar claro que minha intenção ao escrever este artigo é compartilhar a minha pequena experiência no assunto afim de esclarecer aspectos básicos da utilização de uma impressora Fiscal. Como você notou eu não sou um expert no assunto e nem pretendo esgotá-lo neste pequeno artigo , vou apenas mostrar os caminhos das pedras.

Como existem diversos modelos de impressoras fiscais de diversos fabricantes vou focar o artigo nas impressoras fiscais da empresa Bematech - www.bematech.com.br . No site da empresa você vai encontrar muitas informações que eu usei e também muitas informações que eu não usei neste artigo.

Eu não vou me ater aos aspectos legais e jurídicos nem ao blá, blá , blá da padronização ou não dos drivers e DLLs para as impressoras fiscais , que por sinal , até hoje não deu em nada. ( A padronização é bem vinda quando bem discutida e quando tem qualidade e acompanha a evolução tecnológica).

Você deve ter acompanhado a febre dos emissores de cupom fiscal e da automação comercial. O governo obrigou as empresas com faturamento superior a um determinado valor (acho que r$ 120.000,00 ) a usar o ECF - emissor de cupom fiscal e foi aquela correria ...

O que é um ECF ?

Se você ligar uma impressora fiscal em uma porta de comunicação ( COM2, COM3, etc...) e tentar se comunicar com ela quer via comandos do DOS (Ex: c:\dir > prn ) quer via Windows vai ficar frustrado. Simplesmente ela não é reconhecida pelo Windows nem responde aos comandos do DOS.

Então tenha em mente que uma impressora fiscal não tem a mesma comunicação que uma impressora matricial ( LX 300 , Epson , Citizen , etc...). As impressoras fiscais possuem um protocolo de comunicação serial que usa a interface RS232-C ; com isto ela somente vai dar 'sinais de vida' e reagir aos comandos predefinidos em seu set de comandos.

Então para se comunicar com uma impressora Fiscal o nosso programa vai ter que realizar uma comunicação serial com o computador e usar o protocolo da impressora que estiver sendo usada.

Um ECF inicia sua vida fiscal quando é levado a uma assistência autorizada pelo fabricante e pelo governo e são gravados os dados do proprietário e seus números fiscais e em seguida lacrada.

DLLs e Drivers para impressoras Fiscais

Acontece que os fabricantes das impressoras fiscais nos dão uma mãozinha e 'gentilmente' nos fornecem drivers e DLLS para que possamos nos comunicar com suas impressoras fiscais reduzindo assim nosso desespero e mostrando que ainda há gente boa neste mundo.

Assim fica fácil , como escolhi trabalhar com as impressoras da Bematech basta acessar o site da empresa e fazer o download dos drivers, DLLs , documentação e exemplos já prontos que nos mostram como usar um ECF. No site da bematech podemos fazer o download dos seguintes componentes:(vou mencionar somente os relacionados com o VB e o sistema Operacional Windows)

  1. DLL de alto nível que permite a comunicação com o ECF de forma simples e segura. ECFDLL.zip
  2. Emulador de ECF para que possamos testar nosso software na máquina local. Emulador.zip
  3. Um exemplo completo feito em VB5 que mostra como usar todas as funções e declarações da DLL para usar o ECF com o um programa Visual Basic. ExemploVB.zip
  4. Documentação e informação sobre os drivers e DLLs disponíveis. ECFDOC.zip

Eu vou usar basicamente os exemplos e a documentação contidas neste arquivos ( impressoras MP-20 FI II / MP-20 FI II R e MP-20 FI II / MP-20 FI II R) , não vejo porque reinventar a roda. Portanto se você pretende usar uma impressora de outro fabricante deverá ater-se a documentação fornecida pelo mesmo.

O primeiro passo para fazer a impressora funcionar é a conexão física a uma porta COM de seu computador e a seguir a instalação dos drivers e da DLL específica para sua impressora. ( a impressora fiscal precisa ser lacrada e 'batizada' para poder ter sua utilização iniciada).

A lógica padrão de funcionamento de um periférico fiscal (ECF) é muito simples , seu ciclo é o seguinte:

O seu programa deve então incorporar esta lógica e fornecer as funções para realizar estas operações usando a DLL padrão para a impressora.

Para iniciar a comunicação com o ECF vamos precisar dos seguintes arquivos :

Além disto seu programa Visual Basic deverá usar as declarações das funções fornecidas na DLL em um módulo .bas para se comunica com o ECF. Este módulo é fornecido no site da bematech e chama-se -declarações.bas . Abaixo irei mostrar apenas uma parte para você ter uma idéia:

Obs:Cada linguagem de programação possui uma maneira diferente de declarar funções de uma DLL. Consulte sempre o manual de programação de sua linguagem para verificação deste procedimento

Declaração em Visual Basic:(amostra das funções de inicialização da impressora)

' Funções de Inicialização

Public Declare Function Bematech_FI_
AlteraSimboloMoeda Lib "BEMAFI32.DLL" (ByVal SimboloMoeda As String) As Integer

Public Declare Function Bematech_FI_
ProgramaAliquota Lib "BEMAFI32.DLL" (ByVal Aliquota As String, ByVal ICMS_ISS As Integer) As Integer

Public Declare Function Bematech_FI_
ProgramaHorarioVerao Lib "BEMAFI32.DLL" () As Integer

Public Declare Function Bematech_FI_
NomeiaDepartamento Lib "BEMAFI32.DLL" (ByVal Indice As Integer, ByVal Departamento As String
) As Integer

Public Declare Function Bematech_FI_
NomeiaTotalizadorNaoSujeitoIcms Lib "BEMAFI32.DLL" (ByVal Indice As Integer, ByVal Totalizador As String) As Integer

Public Declare Function Bematech_FI_
ProgramaArredondamento Lib "BEMAFI32.DLL" () As Integer

Public Declare Function Bematech_FI_
ProgramaTruncamento Lib "BEMAFI32.DLL" () As Integer

Public Declare Function Bematech_FI_
LinhasEntreCupons Lib "BEMAFI32.DLL" (ByVal Linhas As Integer) As Integer

Public Declare Function Bematech_FI_
EspacoEntreLinhas Lib "BEMAFI32.DLL" (ByVal Dots As Integer) As Integer

Public Declare Function Bematech_FI_
ForcaImpactoAgulhas Lib "BEMAFI32.DLL" (ByVal ForcaImpacto As Integer) As Integer

Cada uma destas funções esta documentada e você deve estudar cada uma antes de utilizá-las no seu programa. Como exemplo mostramos abaixo a documentação da função : Bematech_FI_ProgramaAliquota

Programa alíquota tributária na Impressora Fiscal.

Parâmetros: 
Aliquota: STRING com o valor da alíquota a ser programada.
Vinculo: INTEIRO com o valor "0" para vincular a alíquota ao ICMS e "1" para vincular ao ISS.

Retornos da Função (INTEIRO):

 0 - Erro de comunicação
 1 - Ok
-2 - Parâmetro inválido
-4 - Arquivo ini não encontrado ou parâmetro inválido para o nome da porta
-5 - Erro ao abrir a porta de comunicação

Observação:O cupom fiscal deve estar fechado.

' Exemplo em Visual Basic
iRetorno = Bematech_FI_ProgramaAliquota("0500",1)

Vamos dar um exemplo usando as funções da DLL para uma aplicação Visual Basic que realiza as três operações básicas : Abrir o Cupom , Vender o Item , Fechar o Cupom:

1- A Abertura do Cupom Fiscal deve ser feita usando a função - Bematech_FI_AbreCupom :

Public Declare Function Bematech_FI_AbreCupom Lib "BemaFi32.dll" (ByVal CGC_CPF As String) As Integer

- O parâmetro inicial é o CGC ou CPF do cliente que esta comprando o produto onde CGC_CPF: STRING até 29 caracteres com o CGC ou CPF do cliente. Assim você poderia chamar esta função assim :

Private Sub mnuCupomFiscalAbreCupom_Click()
   iRetorno = Bematech_FI_AbreCupom(txtCGC_CPF.Text)
End Sub
ou
iRetorno = Bematech_FI_AbreCupom("10.123.154-98")
txtCGC_CPF.Text - contém o CPF ou CGC do cliente

2- A venda de um item usa a função - Bematech_FI_VendeItem

Public Declare Function Bematech_FI_VendeItem Lib "BemaFi32.dll" (ByVal Codigo As String, ByVal Descricao As String, ByVal Aliquota As String, ByVal TipoQuantidade As String, ByVal Quantidade As String, ByVal CasasDecimais As Integer, ByVal ValorUnitario As String, ByVal TipoDesconto As String, ByVal Desconto As String) As Integer

- Os parâmetros usados na venda de um item são:

Codigo: STRING até 13 caracteres com o código do produto.

Descricao: STRING até 29 caracteres com a descrição do produto.

Aliquota: STRING com o valor ou o índice da alíquota tributária. Se for o valor deve ser informado com o tamanho de 4 caracteres ou 5 com a vírgula. Se for o índice da alíquota deve ser 2 caracteres. Ex. (18,00 para o valor ou 05 para o índice).

TipoQuantidade
: 1 (um) caracter indicando o tipo de quantidade. I - Inteira e F - Fracionária.

Quantidade: STRING com até 4 dígitos para quantidade inteira e 7 dígitos para quantidade fracionária. Na quantidade fracionária são 3 casas decimais.

CasasDecimais: INTEIRO indicando o número de casas decimais para o valor unitário (2 ou 3).

ValorUnitario: STRING até 8 dígitos para valor unitário.

TipoDesconto: 1 (um) caracter indicando a forma do desconto. '$' desconto por valor e '%' desconto percentual.

ValorDesconto: String com até 8 dígitos para desconto por valor (2 casas decimais) e 4 dígitos para desconto percentual.

Retornos da Função (INTEIRO):

0 – Erro de comunicação
1 – Ok
-2 – Parâmetro inválido
-3 – Alíquota não programada
-4 – Arquivo ini não encontrado ou parâmetro inválido para o nome da porta
-5 – Erro ao abrir a porta de comunicação


Ex: Exemplo em Visual Basic

iRetorno = Bematech_FI_VendeItem("123","Caneta","1200","I","10",2,"0,25","%","0000")
iRetorno = Bematech_FI_VendeItem(txtCodigo, txtDescricao, _
txtAliquota, TipoQuantidade, txtQtde, CasasDecimais, txtValorUnitario, TipoDesconto, txtDesconto)

Obs: Imagine que há duas alíquotas com o valor 12% cadastradas na impressora. A primeira cadastrada na posição 01 como ICMS e a outra na posição 05 como ISS. Se você informar o valor 1200 ou 12,00 no parâmetro “alíquota” a função irá imprimir o item usando a alíquota 01 de ICMS. A função lê as alíquotas da impressora e usa o índice da primeira ocorrência. Para usar a alíquota de ISS você deverá passar o índice 05 e não o valor 1200 ou 12,00. Se você não tiver duas alíquotas com o mesmo valor cadastradas na impressora use sempre o valor no parâmetro alíquota.

3- No fechamento do cupom Fiscal usamos a função - Bematech_FI_FechaCupom

Public Declare Function Bematech_FI_FechaCupom Lib "BEMAFI32.DLL" (ByVal FormaPagamento As String
, ByVal DiscontoAcrecimo As String, ByVal TipoDescontoAcrecimo As String, ByVal ValorAcrecimoDesconto As String, ByVal ValorPago As String, ByVal Mensagem As String) As Integer.

Parâmetros:

FormaPagamento : STRING com o nome da forma de pagamento com no máximo 16 caracteres.
AcrescimoDesconto: Indica se haverá acréscimo ou desconto no cupom. 'A' para acréscimo e 'D' para desconto.
TipoAcrescimoDesconto: Indica se o acréscimo ou desconto é por valor ou por percentual. '$' para desconto por valor e '%' para percentual.
ValorAcrescimoDesconto: STRING com no máximo 14 dígitos para acréscimo ou desconto por valor e 4 dígitos para acréscimo ou desconto por percentual.
ValorPago: STRING com o valor pago com no máximo 14 dígitos.
Mensagem: STRING com a mensagem promocional com até 490 caracteres.
Retornos da Função (INTEIRO):

0 - Erro de comunicação
1 - Ok
-2 - Parâmetro inválido.
-4 - Arquivo ini não encontrado ou parâmetro inválido para o nome da porta
-5 - Erro ao abrir a porta de comunicação

Exemplo de utilização em Visual Basic:

iRetorno = Bematech_FI_FechaCupom("Dinheiro","A","$","0000","35,00","Obrigado, volte sempre !!!")

Observação:

- O cupom deve estar aberto.
- Pelo menos 1 (um) item deve ter sido vendido e não pode ter sido cancelado.
- A utilização essa função elimina a obrigatoriedade de uso das funções
Bematech_FI_IniciaFechamentoCupom, Bematech_FI_EfetuaFormaPagamento e Bematech_FI_TerminaFechamentoCupom que estão implementadas internamente na função.

Acabamos de mostrar como usar as declarações das funções da DLL para as impressoras da Bematech.

Fizemos isto para você ter uma idéia visto que a aplicação de exemplo feita em VB disponilizada no site , que você pode baixar clicando no link - ExemploVB.zip - esta bem mais completa.

Ao lado temos uma tela do programa com as opções para o Cupom Fiscal.

Comprovantes e Relatórios emitidos por um ECF

Vamos ver agora os principais comprovantes e relatórios emitidos por um ECF :

1 - Leitura X - Indica as vendas e a totalização que a impressora efetou até o momento.

2- Redução Z - Fecha o caixa e trava a impressora. Exibe todas as vendas, cancelamentos, descontos , etc e fecha o caixa. Deve ser usada para encerrar o dia . Depois de efetuada você só vai poder realizar operação no dia seguinte.

3- Cupom Fiscal - É o recibo , nota ou cupom . Exibe informações dos produtos adquiridos pelo cliente, o total da compra, o desconto da venda (se houver) a forma de pagamento ; permite exibir uma mensagem promocional.

4- Relatório Gerencial - Permite que o seu programa envia para a impressora Fiscal dados e informações : relatórios de fechamento de caixa , troca de operador, estoque . Neste caso o ECF passa a se comportar como uma impressora padrão.

5- Comprovante não Fiscal não Vinculado - Usado para arrecadação : água , luz, telefone , etc. Como estes valores já foram tributados não necessitam de emissão de cupom fiscal e sim um comprovante não fiscal.

6- Comprovante não Fiscal Vinculado - Utilizado para imprimir informações adicionais ao ECF , por exemplo , você pode incluir informaçãoes adicionais a operação o item 5.

Além disto o ECF usa variáveis para controle e armazenamento de operações ; os totalizadores e contadores que são registrados na memória do ECF . Os totalizadores acumulam valores de venda , recebimentos , cancelamentos , valores fiscais e não fiscais , tributados e não tributados. Alguns totalizadores são diários outros acumulam valores desde a vida útil do ECF. Assim venda bruta , venda liquida , grande total dentro outros não são zerados quando você faz uma redução Z outros totalizadores são zerados na redução Z.

Os contadores são usados como fonte de informação visto que não podemos criar contadores apenas usar os existentes . Assim podemos saber quantos cupons foram cancelados , quantos relatórios foram emitidos , etc...

TEF - Transferência Eletrônica de Fundos

O governo tornou obrigatória a realização da TEF via ECF , ou seja , quando você faz um pagamento via cartão de crédito ou cartão de débito esta fazendo uma operação que é considerada um TEF ; esta operação deve ser realizada usando as impressoras de cada bandeira de cartão de crédito . Acontece que todo o comércio que esta obrigado a usar um ECF deve emitir o comprovante de pagamento em cartão via ECF.

Existem duas maneiras de realizar o TEF :

TEF - discado - O programa de automação comercial deve verificar se o computador tem um modem e uma linha telefônica para efetuar a discagem. Cada computador do estabelecimento deve possuir um modem. Recomendado para estabelecimentos de pequeno porte e com pouco movimento.

TEF - Dedicado - Os equipamentos estão ligados por uma rede e se comunicam com o servidor que possui uma placa de modem e uma linha dedicada que esta preparada para efetuar a operação. Recomendado para estabelecimentos de médio/grande porte com grande movimento.

Abaixo um exemplo de código efetuando uma venda via cartão controlada pelo programa exemplo em VB: A função Bematech_FITEF_VendaCartao(txtNIdentificacao.Text, txtValor.Text) é usada para receber o número do cartão e o valor.

Private Sub cmdOK_Click()

'
A função Bematech_FITEF_VendaCartao, inicia a comunicação
' com a Bandeira para validar os dados do Cartão, assim
' gerando o arquivo INTPOS.001, com os dados da transação.
'
' A função Bematech_FITEF_VendaCartao deve ser usada após a
' função Bematech_FI_IniciaFechamentoCupom.
'
' Após a execução da função Bematech_FITEF_VendaCartao, deve-se
' finalizar o Cupom com as funções: Bematech_FI_EfetuaFormaPagamento e

' Bematech_FI_TerminaFechamentoCupom.


Retorno = Bematech_FITEF_VendaCartao(txtNIdentificacao.Text, txtValor.Text)
Call VerificaRetornoImpressora("", "", "Venda Cartão")
Unload Me
End Sub

Efetuando Sangria e Suprimento

Calma , sangria nada tem a ver com sangue ; suprimento e sangria são funções que usamos para informar ao ECF que vamos retirar ou fornecer dinheiro ao caixa . ( Então o que quer dizer sangria...? )

Sangria é quando retiramos dinheiro do caixa. No exemplo da aplicação VB o código usado é o seguinte: Usamos a função - Bematech_FI_Sangria(txtValor) - que recebe o valor da sangria.

Private Sub cmdOK_Click()
  Retorno = Bematech_FI_Sangria(txtValor)
  Call VerificaRetornoImpressora("", "", "Sangria")
  Unload Me
End Sub

Suprimento é quando fornecemos dinheiro ao caixa. Abaixo o código exemplo em VB: Usamos a função -Bematech_FI_Suprimento(txtValor, txtFormaPagto) - que recebe o valor do suprimento e a forma de pagamento.


Private Sub cmdOK_Click()

Retorno =
Bematech_FI_Suprimento(txtValor, txtFormaPagto)
Call VerificaRetornoImpressora("", "", frmSuprimento.Caption)
If Retorno = 1 Then
Unload Me
End If
End Sub

A forma de pagamento deve ser implementada no seu programa ou cadastrada no ECF. As formas de pagamento podem ser : Cheque , Cartão , Debito , Carnê , Prazo , Vista , etc...

Bem , creio que já demos uma pequena introdução no assunto , a partir daqui você pode andar sozinho. Estaremos voltando ao assunto em breve.

Tchau...


Copyright (c) 2002 - José Carlos Macoratti