Automação comercial com VB, VB.NET e C# - Parte I
Em quase toda América
Latina é obrigatório o Uso de ECFs, ou de Emissores de Comprovantes Fiscais.
Meu Primeiro “Cupom Fiscal”
A
Emissão de cupom fiscal resume-se basicamente em um documento comprobatório da
realização de uma venda, onde a impressora fiscal (ECF – Emissor de Cupom
Fiscal) guarda os valores da venda realizada em memória protegida dentro do ECF
para futura fiscalização da receita estadual. Com isso o Software desenvolvido
para controlar estoque, contas a pagar, etc.. Também deverá ter em seu leque de
funções a comunicação com a impressora Fiscal.
Para
isso incentivamos o uso de Dlls de comunicação ou drivers que seu fabricante
venha a fornecer. Neste caso vamos demonstrar a DLL Daruma32.dll e as
facilidades envolvidas na emissão do cupom fiscal em VB.NET, VB e C# com esta
dll de comunicação. Abra seu Visual Basic, C# ou VB.Net e crie um projeto novo,
um projeto Windows application, após isso você deve declarar os comandos
contidos na dll de comunicação DARUMA32.DLL
Declarando a DLL no VB
dentro de um Modulo .BAS
Public Declare Function
Daruma_FI_VendeItem Lib "Daruma32.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
Public Declare Function
Daruma_FI_FechaCupomResumido Lib "Daruma32.dll" (ByVal FormaPagamento
As String, ByVal Mensagem As String) As Integer
Public Declare Function
Daruma_FI_IdentificaConsumidor Lib "Daruma32.dll" (ByVal Nome As
String, ByVal Endereco As String, ByVal Doc As String) As IntegerPublic Declare
Function Daruma_FI_IniciaFechamentoCupom Lib "Daruma32.dll" (ByVal
AcrescimoDesconto As String, ByVal TipoAcrescimoDesconto As String, ByVal
ValorAcrescimoDesconto As String) As Integer
Public Declare Function
Daruma_FI_EfetuaFormaPagamento Lib "Daruma32.dll" (ByVal
FormaPagamento As String, ByVal ValorFormaPagamento As String) As Integer
Public Declare Function
Daruma_FI_TerminaFechamentoCupom Lib "Daruma32.dll" (ByVal Mensagem
As String) As Integer
Public Declare Function
Daruma_FI_AbreComprovanteNaoFiscalVinculado Lib "Daruma32.dll" (ByVal
FormaPagamento As String, ByVal Valor As String, ByVal NumeroCupom As String)
As Integer
Public Declare Function
Daruma_FI_UsaComprovanteNaoFiscalVinculado Lib "Daruma32.dll" (ByVal
texto As String) As Integer
Public Declare Function
Daruma_FI_FechaComprovanteNaoFiscalVinculado Lib "Daruma32.dll" () As
Integer
Declarando
a dll dentro do VB.NET
Module Funcoes_ECF
Public Declare Function Daruma_FI_VendeItem Lib "Daruma32.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
Public Declare Function
Daruma_FI_IniciaFechamentoCupom Lib "Daruma32.dll" (ByVal
AcrescimoDesconto As String, ByVal TipoAcrescimoDesconto As String, ByVal
ValorAcrescimoDesconto As String) As Integer
Public Declare Function
Daruma_FI_EfetuaFormaPagamento Lib "Daruma32.dll" (ByVal
FormaPagamento As String, ByVal ValorFormaPagamento As String) As Integer
Public Declare Function
Daruma_FI_EfetuaFormaPagamentoDescricaoForma Lib "Daruma32.dll" (ByVal
FormaPagamento As String, ByVal ValorFormaPagamento As String, ByVal
DescricaoOpcional As String) As Integer
Public Declare
Function Daruma_FI_TerminaFechamentoCupom Lib "Daruma32.dll" (ByVal
Mensagem As String) As Integer
Public Declare
Function Daruma_FI_IdentificaConsumidor Lib "Daruma32.dll" (ByVal
Nome As String, ByVal Endereco As String, ByVal Doc As String) As Integer
Public Declare
Function Daruma_FI_AbreComprovanteNaoFiscalVinculado Lib
"Daruma32.dll" (ByVal FormaPagamento As String, ByVal Valor As
String, ByVal NumeroCupom As String) As Integer
Public Declare
Function Daruma_FI_UsaComprovanteNaoFiscalVinculado Lib
"Daruma32.dll" (ByVal texto As String) As Integer
Public Declare
Function Daruma_FI_FechaComprovanteNaoFiscalVinculado Lib
"Daruma32.dll" () As Integer
End Module
Declarando
a dll em C#.NET
using System;
using
System.Runtime.InteropServices;
using System.IO;
namespace
DARUMA_CSharp
{
public
class DARUMA32
{
[DllImport("Daruma32.dll")]
public static extern int Daruma_FI_VendeItem(System.String
Codigo, System.String Descricao, System.String Aliquota, System.String TipoQuantidade, System.String Quantidade, int
CasasDecimais, System.String Vr_Unitario, System.String TipoDesconto,
System.String Desconto);
[DllImport("Daruma32.dll")]
public static extern int
Daruma_FI_IniciaFechamentoCupom(System.String AcrescimoDesconto,System.String
Tipo_AcrescimoDesconto, System.String Valor_AcrescimoDesconto);
[DllImport("Daruma32.dll")]
public static extern int
Daruma_FI_EfetuaFormaPagamento(System.String FormaPagamento, System.String
Valor_FormaPagamento);
[DllImport("Daruma32.dll")]
public static extern int
Daruma_FI_TerminaFechamentoCupom(System.String MensagemPromocional);
[DllImport("Daruma32.dll")]
public static extern int Daruma_FI_FechaCupomResumido(System.String
FormaPagamento, System.String Mensagem);
[DllImport("Daruma32.dll")]
public static extern int
Daruma_FI_AbreComprovanteNaoFiscalVinculado (System.String FormaPagamento, System.String
Valor , System.String NumeroCupom );
[DllImport("Daruma32.dll")]
public static extern int
Daruma_FI_UsaComprovanteNaoFiscalVinculado (System.String texto);
[DllImport("Daruma32.dll")]
public static
extern int Daruma_FI_FechaComprovanteNaoFiscalVinculado ();
}
}
Uma vez que a dll foi declarada em sua respectiva linguagem, agora basta
copiar a dll DARUMA32.DLL para o diretório em que está seu projeto ou o
diretório Windows ou o System32, o que for de sua preferência.
Note que no VB.NET
e no C# criamos uma classe para controlar os métodos da dll, e os mesmos foram
declarados dentro da classe. No caso do C# é necessário a declaração do using System.Runtime.InteropServices; - que permite o uso
de DLLs não geradas dentro do .NET.
Com o uso da
DARUMa32.DLL você não necessita se preocupar com o caso de Abertura, Fechamento
e escrita na Porta serial, não necessita se preocupar com isso porque a dll já
contem todo o trabalho de administração da porta, sem nem mesmo a necessidade
de abrir o cupom fiscal porque o método VendeItem já o faz caso o cupom fiscal
esteja fechado, tornando todavia mais fácil a programação para o ECF.
Sem efetuar nenhum
tipo de configuração apenas adicione a seguinte linha de Código em seu
programa.
Em VB
Private Sub Cupom_Click()
Daruma_RET =
Daruma_FI_VendeItem("1234", "Leite", "FF",
"F", "10", 2, "1,00", "%",
"0")
Daruma_RET =
Daruma_FI_FechaCupomResumido("Dinheiro", "Obrigado Volte
Sempre!!")
End Sub
Em
VB.NET
Private
Sub Cupom_Click_1(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
ECFVBNET.Daruma_FI_VendeItem("1234", "Leite",
"FF", "I", "10", 2, "1,00",
"%", "0")
ECFVBNET.Daruma_FI_FechaCupomResumido("Dinheiro",
"Obrigado Volte Sempre!!")
End Sub
Em C#
private void Cupom_Click(object sender, System.EventArgs e)
{
DARUMA32.RET = DARUMA32.Daruma_FI_VendeItem("12345","Leite","0001","I","10",2,"10,00","%","000");
DARUMA32.Daruma_FI_FechaCupomResumido("Cheque","Espero
que Funcione");
}
Ao executar as funções acima esteja certo que se terá com resultado
final um Cupom Fiscal Completo com apenas duas linhas de código – Vende Item e
Fecha Cupom Resumido. Sem a necessidade de indicar em que porta serial o ECF
esta plugado, sem a necessidade de controlar comunicação ou outro tipo de
programação mais “Baixo Nível”.
O Interessante e um “valor agregado” ao cliente é o fato da Função
VendeItem vender o item passado em uma única linha, ou seja, não faz uso de
duas linha no cupom fiscal para vender o item. Esta função possui uma
inteligência para identificar se o item cabe em uma única linha, se couber
venderá este item em uma linha, caso contrario será em duas linhas como fazem
os ECFs convencionais isso significa mais de 40% de economia de Bobina que seu
cliente terá no ECF utilizado por seu software.
O Uso de “Emuladores” para ECF esta sendo fiscalizado com rigor, por
isso incentivamos que voce procure seu fabricante de ECF para que você possa
adquirir um ECF com valores subsidiados para que voce possa efetuar testes de
desenvolvimento, demonstrações para seu cliente de seu software com o ECF,
homologação de seu software, etc.. tudo isso é melhor e mais preciso quando
realizado com o ECF real ao lado de seu computador de desenvolvimento. No caso
da Daruma voce pode adquirir um ECF para desenvolver pelo valor de 3 x 220
reais apenas.
Identificando o Consumidor no Cupom
Fiscal
Uma Vez que o cupom fiscal Substitui o uso de notas fiscais formatadas
na frente de caixa, como posso então identificar o consumidor no Cupom Fiscal,
com seu nome, Endereço, e numero de CPF ou CNPJ?
Muito bem, para isso voce pode fazer uso da Função IdentificaConsumidor,
porem para isso terá de passar pelas três fases de fechamento de cupom fiscal –
Inicio, meio e Fim.
Vamos substituir a função FechaCupomResumido pelas Funções de
IniciaFechamento, EfetuaFormaPagamento e TerminaFechamenot.
Em VB
Private Sub Cupom_Click()
Daruma_RET =
Daruma_FI_VendeItem("1234", "Leite", "FF",
"F", "10", 2, "1,00", "%",
"0")
‘
COMENTADO Daruma_RET = Daruma_FI_FechaCupomResumido("Dinheiro",
"Obrigado Volte Sempre!!")
Daruma_RET =
Daruma_FI_IniciaFechamentoCupom(“A”, “%”, “
Daruma_RET =
Daruma_FI_EfetuaFormaPagametno(“Dinheiro”, “
Daruma_RET =
Daruma_FI_IndentificaConsumidor(“Claudenir Campos Andrade”, “Blábláblá”,
“123456 Texto”)
Daruma_RET = Daruma_TerminaFechamentoCupom(“Obrigado
Volte Sempre!!”)
End Sub
Em
VB.NET
Private
Sub Cupom_Click_1(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
ECFVBNET.Daruma_FI_VendeItem("1234", "Leite",
"FF", "I", "10", 2, "1,00",
"%", "0")
‘ COMENTADO
ECFVBNET.Daruma_FI_FechaCupomResumido("Dinheiro", "Obrigado
Volte Sempre!!")
ECFVBNET.Daruma_FI_IniciaFechamentoCupom("A",
"%", "0,00")
ECFVBNET.Daruma_FI_EfetuaFormaPagametno("Dinheiro",
"10,00")
ECFVBNET.Daruma_FI_IndentificaConsumidor("Claudenir
Campos Andrade", "Blábláblá", "123456 Texto")
ECFVBNET.Daruma_TerminaFechamentoCupom("Obrigado
Volte Sempre!! ")
End Sub
Em C#
private void Cupom_Click(object sender, System.EventArgs e)
{
DARUMA32.RET = DARUMA32.Daruma_FI_VendeItem("12345","Leite","0001","I","10",2,"10,00","%","000");
// COMENTADO DARUMA32.Daruma_FI_FechaCupomResumido("Cheque","Espero
que Funcione");
DARUMA32.RET = DARUMA32.Daruma_FI_IniciaFechamentoCupom("A",
"%", "0,00");
DARUMA32.RET = DARUMA32.Daruma_FI_EfetuaFormaPagametno("Dinheiro",
"10,00");
DARUMA32.RET = DARUMA32.Daruma_FI_IndentificaConsumidor("Claudenir
Andrade", "Blábláblá", "123456 Texto");
DARUMA32.RET = DARUMA32.Daruma_TerminaFechamentoCupom("Obrigado
Volte Sempre!! ");
}
A Função de identificação
do Consumidor é uma função genérica que permite o uso de três parâmetros que
são eles: Nome, DOC, e Numero. Porem o texto nestes três campos são livres
permitindo que você coloque a informação que você desejar nestas três linhas e
com isso você ganha um espaço dentro do cupom fiscal para colocar dados
referente o consumidor e a venda realizada, local de entrega etc.. sem a
necessidade de utilizar-se do espaço da mensagem promocional para fazer isso.
Adicionando Informações a Venda
realizada
Mas o que fazer quando se
necessita de espaço para inserir informações relativas a venda realizada, por
exemplo, vamos imaginar que você possui em seu estabelecimento comercial um
programa de Fidelização e após a venda realizada deseja imprimir um Extrato
para seu cliente da posição atual da conta dele, ou vamos imaginar outro caso
em que você necessita imprimir os dados completos de seu cliente para a entrega
da mercadoria, com endereços com pontos de referencia, nome de uma ou duas
pessoas para a entrega da mercadoria, ou até mesmo horário de entrega definido
e as taxas de entrega. Claro que no espaço
Mensagem Promocional ( da função TerminaFechamentoCupom) ou no espaço da
função de IdentificaConsumidor, você não conseguira fazer isso, porem nesta
hora entra em cena um novo cupom, que chamamos de Comprovante Não Fiscal
Vinculado.
O Comprovante Não Fiscal
Vinculado – que aqui chamaremos de CNFV -
faz com que o ECF entre em modo “Normal” , ou seja, que aceite texto
livre qualquer texto que seja enviado para o ECF ele será aceito e impresso e
leva o nome de Vinculado porque só pode ser utilizado após um cupom fiscal, sem
qualquer restrição de forma de pagamento realizado anteriormente, se fechou o
cupom com Dinheiro, cheque, etc..você poderá utilizar este recurso para emitir
mais informação do cliente que realizou a compra. Lembrado que a partir da
abertura deste comprovante você terá 2(dois) minutos para enviar todos os
textos necessários.
Vamos ao Código
Aos o Fechamento do Cupom
Fiscal com “Dinheiro” adicione as seguintes linhas de código em seu programa:
Em VB
....
Daruma_RET =
Daruma_TerminaFechamentoCupom(“Obrigado Volte Sempre!!”)
Daruma_RET =
Daruma_AbreComprovanteNaoFiscalVinculado(“Dinheiro”, “”, “”)
Daruma_RET =
Daruma_UsaComprovanteNaoFiscalVinculado(“Blábláblá...”)
Daruma_RET =
Daruma_UsaComprovanteNaoFiscalVinculado(“Blábláblá...”)
....
Daruma_RET =
Daruma_FI_FechaComprovanteNaoFiscalVinculado()
End Sub
Em VB.NET
Private
Sub Cupom_Click_1(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
...
ECFVBNET.Daruma_TerminaFechamentoCupom(“Obrigado
Volte Sempre!!”)
ECFVBNET.Daruma_AbreComprovanteNaoFiscalVinculado(“Dinheiro”,
“”, “”)
ECFVBNET.Daruma_UsaComprovanteNaoFiscalVinculado(“Blábláblá...”)
ECFVBNET.Daruma_UsaComprovanteNaoFiscalVinculado(“Blábláblá...”)
....
ECFVBNET.Daruma_FI_FechaComprovanteNaoFiscalVinculado()
End Sub
Em C#
private
void Cupom_Click(object
sender, System.EventArgs e)
{
...
DARUMA32.RET = DARUMA32.Daruma_TerminaFechamentoCupom(“Obrigado
Volte Sempre!!”);
DARUMA32.RET = DARUMA32.Daruma_AbreComprovanteNaoFiscalVinculado(“Dinheiro”,
“”, “”);
DARUMA32.RET = DARUMA32.Daruma_UsaComprovanteNaoFiscalVinculado(“Blábláblá...”);
DARUMA32.RET = DARUMA32.Daruma_UsaComprovanteNaoFiscalVinculado(“Blábláblá...”);
....
DARUMA32.RET = DARUMA32.Daruma_FI_FechaComprovanteNaoFiscalVinculado();
}
Note que os parâmetros da
Função AbreComprovanteNaoFiscalVinculado foram: Forma de Pagamento (que se voce
utiliza a DARUMA32.dll pode ser “Dinheiro”) e os dois outros parâmetros são
Parâmetros Nulos, passe os parâmetros nulos, pois aqui seriam indicados o
numero do cupom fiscal anterior e o valor, mas isso DARUMA32.DLL já resolve pra
você!
Bem com isso você aprendeu
o caminho das pedras.
No próximo artigo vamos ver
como resolver os erros e tratar os erros do ECF, Vamos fazer um TEF e você verá
como é fácil fazer TEF com a DARUMA32.DLL e também verá como Utilizar XML para
se comunicar com o ECF.
Um Help interativo com
todas as funções e quais são os parâmetros a serem usados e exemplos