Business - Automação Comercial
Automação Comercial com VB, VB.NET e C# (ECF e TEF) - PARTE I de IV
Esta série de quatro artigos visa esclarecer e levar ao público desenvolvedor o uso de ECFs e a transação eletrônica de Fundos. Este primeiro artigo explicará a interface com o ECF e como operacionalizar isso em três linguagens, VB, VB.NET e C#.
por Claudenir AndradeEm quase toda América Latina é obrigatório o Uso de ECFs, ou de Emissores de Comprovantes Fiscais. Em nosso País, incluindo nesta lista Venezuela e Argentina, a legislação fiscal é todavia mais rígida e não somos o único país a adotar leis que envolvam nós - Os Desenvolvedores. Esta série de quatro artigos visa esclarecer e levar ao publico desenvolvedor o uso de ECFs e a transação eletrônica de Fundos. Este primeiro artigo explicará a interface com o ECF e como operacionalizar isso em três linguagens, VB, VB.NET e C#.
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 em um Class.VB
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 em um Class.cs
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", "%", "0,00") Daruma_RET = Daruma_FI_EfetuaFormaPagametno("Dinheiro", "10,00") 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 em VB C# e VB.Net você poderá encontrar no site www.daruma.com.br.
- DarumaFramework.SO no LinuxAutomação Comercial
- Palavra de status da impressora na DarumaFrameworkAutomação Comercial
- TEF – Comprovante de Crédito ou DébitoAutomação Comercial
- Comunicar com equipamentos Daruma em linguagens 16bits e DOSAutomação Comercial
- Verificando Redução Z nas Impressoras DarumaAutomação Comercial