Uso da Plataforma.Net na Automação Comercial
Este artigo visa esclarecer de forma simples e prática como um ECF funciona e como podemos interfacear com eles em C# aproveitando o potencial que a plataforma .Net nos oferece.
Clique aqui para ler este artigo em pdf
Clique aqui para ler todos os artigos desta edição
Uso da Plataforma.Net na Automação Comercial
por Claudenir C. Andrade
Em nossa profissão de desenvolvedores, em algum momento somos solicitados a desenhar uma solução em software que atenda a contas a pagar, receber, estoque, caixa, etc. Porém, ao desenvolvermos essas soluções usando as ferramentas existentes, chegamos à conclusão de que todos esses sistemas são alimentados com dados provenientes de vendas realizadas no caixa ou no que chamamos de Chek-Out. Então, geralmente resolvemos também oferecer um software que atenda à necessidade da Frente-de-Caixa, ou PDV (Ponto de Venda).
Antes de digitar os códigos, percebemos que – por força da legislação federal – o cliente precisará usar um ECF (Emissor de Cupom fiscal) e que, por sua vez, nosso software precisará “interfacear” com essa impressora de cupom fiscal.
Este artigo visa esclarecer de forma simples e prática como esses periféricos funcionam e como podemos “interfacear” com eles em C# aproveitando o potencial que a plataforma .Net nos oferece.
Comunicação Serial RS232-C
Eis o primeiro mistério. A impressora fiscal não tem a mesma comunicação que as impressoras normais (LX300, Epson, etc) nem são reconhecidas pelo Windows. Todas as impressoras fiscais possuem um protocolo de comunicação serial baseado na revisão C, por isso, a interface usada é o padrão RS232-C. Os periféricos fiscais possuem um set de comandos que responde a uma ação específica solicitada por seu software, ou seja, se plugarmos um ECF (Emissor de Cupom Fiscal) na COM2 e digitarmos “c:\Dir > COM2”, nada acontecerá, pois essa porta [r1] reage apenas aos comandos predefinidos em seu set de comandos. Conclusão: nosso software deverá efetuar uma comunicação serial com o micro e “falar” o protocolo da impressora que nosso cliente estiver usando no momento.
Drivers e DLLs – Middleware Facilitadores
Para nos ajudar a desenvolver o software para um ECF, os fabricantes de impressoras fiscais fornecem drivers, .sys, Dll e outras ferramentas de comunicação. Nesta seção, vamos mostrar como usar a DLL da Daruma.
Contudo, nossa lição de nada servirá se não conhecermos a lógica e as regras de funcionamento de uma impressora fiscal. A regra básica de funcionamento de todo e qualquer periférico fiscal é:
figura 1
Sendo assim, o software precisará estar preparado para assumir como função principal Abrir Cupom, Vender Item e Fechar Cupom. Além dessas operações, existem outros controles que deverão ser adicionados à aplicação que construiremos utilizando C#.
Comunicando com o ECF
O primeiro passo é declarar a dll, cujas especificações podem ser baixadas da página do fabricante ou montadas por você mesmo. Crie uma classe no C# e inclua como namespace a indicação de que estaremos interagindo com uma dll “UnManageCode”.
using System;
using System.IO;
using System.Windows.Forms;
using System.Runtime.InteropServices;
Em seguida, crie uma classe ECF para hospedar todas as funções disponibilizadas pelo fabricante da dll (neste exemplo, dll Daruma32.dll), Adicione o seguinte trecho de código à sua classe:
namespace ECF_CSHARP
{
public class cEcf
{
[DllImport("Daruma32.dll")]
public static extern int Daruma_FI_LeituraX();
[DllImport("Daruma32.dll")]
public static extern int Daruma_FI_AbreCupom( System.String CGC_CPF);
[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_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);
}
}
No formulário form1 você deverá incluir o seguinte namespace (ECF_CSHARP):
using System;
using System.Drawing;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using ECF_CSHARP;
Inclua um botão e, no evento click, adicione as chamadas às funções de acesso ao ECF que acabamos de declarar. Insira os comandos, Abertura, Venda e Fechamento de Cupom. Veja o código a seguir e o resultado na Figura 1:
if(cEcf.Daruma_FI_VendeItem("1234567890123","Produto1", "FF", "I", "10", 2, "100", "$", "0") != 1)
{
System.Windows.Forms.MessageBox.Show("Erro na Execução da Função do ECF");
return;
}
else
System.Windows.Forms.MessageBox.Show("Comando Enviado com sucesso para o ECF");
if(cEcf.Daruma_FI_FechaCupomResumido("Cheque","Obrigado Volte Sempre!!") != 1)
{
System.Windows.Forms.MessageBox.Show("Erro na Execução da Função do ECF");
return;
}
Figura 2 - Resultado do aplicativo que consome a Daruma32.dll para se comunicar como ECF
Claro que aqui temos um exemplo simples de como acessar o ECF, porém, ele já nos permite tirar várias conclusões. Uma delas é a não-obrigatoriedade de chamar a função de Abertura de Cupom, pois a função VendeItem é inteligente o suficiente para abrir o cupom fiscal de forma automática. Se você tiver uma impressora fiscal conectada ao seu PC, observará que acabou de emitir um cupom fiscal e que, para isso, foram chamadas as funções de Venda de Item e de Fechamento de Cupom. Vamos analisar cada parâmetro:
Na Função de Venda de Item, passamos o Código ("1234567890123") que, neste caso, pode ter até 13 caracteres. Os parâmetros passados são: a descrição do produto e a alíquota. FF – FF, II e NN são alíquotas fiscais que já vêm predefinidas no ECF para produtos que possuem Substituição Tributária, Isenção ou Não-Incidência de ICMS. Porém, se o produto que estamos vendendo tiver uma alíquota específica, deveremos passar o valor dessa alíquota com quatro casas, exemplo: “1200” ou “1800”.
Em seguida, temos alguns outros parâmetros, onde o quarto parâmetro foi passado a letra “I”, que indica que vamos trabalhar com a quantidade Inteira, ou seja, vamos vender por unidade, e não por peso (fracionária).
O quinto parâmetro corresponde à quantidade do item que estamos vendendo, acompanhada do parâmetro do número de casas decimais que o produto possui, 2 (duas). Em seguida, o valor unitário do produto (neste caso, R$1,00). Observe que os valores devem ser passados sem formatação, mas mesmo que eles sejam passados com a vírgula, a dll os entenderá e obedecerá as casas de centavos impostas pela vírgula.
Os demais parâmetros são o desconto e o valor do desconto. O desconto de um produto pode ser especificado por valor ou por percentual, ou seja, podemos dar um desconto de 10,00 REAIS ou de 10,00 % (por cento), representados, respectivamente, pelos símbolos “$” e “%” (passados neste exemplo por valor). O último parâmetro indica o montante do desconto, o qual, se for por percentual, deverá ter até quatro casas.
Por fim, chamamos a função de Fechamento de Cupom Fiscal, em que um dos grandes facilitadores é a função de fechamento de cupom fiscal resumido na qual passamos como parâmetro a Forma de Pagamento apresentada por nosso cliente para saldar a compra. O último parâmetro é uma mensagem promocional, que neste exemplo foi a famosa “Obrigado Volte Sempre!!”.
Vale acrescentar que no C# e nas linguagens baseadas no .NET, possuímos as macros de tratamento de erros “Try..Catch...Finally”. Porém, na comunicação com o ECF essas macros não têm efeito. Por isso, como exemplo de tratamento de erro, ao final de cada função disponibilizamos ao usuário um MessageBox que indica que a função não foi executada como esperado. E onde podemos encontrar o retorno das funções, a documentação de cada retorno obtido na chamada da função e também todas as funções de acesso ao ECF? Bem, para isso você deve acessar o Help do fabricante, onde ele descreve passo a passo como é feito o acesso na plataforma .Net do seu produto. Veja o Help interativo da Daruma32.dll (Figura 2).
Figura 3 – Help do fabricante
Conclusão
Acessar o ECF e entrar no mundo da automação comercial está mais fácil com a plataforma .Net, que oferece todos os recursos necessários para deixar o código-fonte legível, programar com OOP por meio de classes de acesso ao ECF e manipular de forma perfeita dlls UnManageCode.
[r1]O correto aqui é a porta, pois vc pode plugar na serial qualquer equipo que responda ao comando dele, que não necessariamente será uma impressora.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo