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.