“Faltou 0,01 centavo pra fechar o cupom...”

Já ouvimos esta frase várias vezes, seja com impressora Daruma ou de outras marcas. Motivo? O tal do Arredondamento e Truncamento. O software arredonda e o ECF Trunca, ou o contrário, e aí sempre falta um centavo ou dois no final do cupom.

Quando isso acontece o sistema apresenta um erro e não fecha o cupom ou utiliza-se o velho recurso de “troco” para fechar o cupom o que causa uma péssima impressão ao cliente que está levando seu cupom fiscal.

Muito bem, este Escovando Bits visa explicar como eliminar de uma vez por todas esta situação, sem cálculo, sem erros de arredondamento ou truncamento e válido para toda linha de impressoras Urmet Daruma (FS600 1.05, toda a linha FS700 e toda a linha MACH (Aquela que possui o modo Pré-Venda).

Para tal vamos colocar alguns casos e depois vamos mostrar de forma direta e simples como manter o sistema fazendo o mesmo cálculo do ECF:

Caso 01 - Venda com desconto

Um Item vendido com os seguintes parâmetros, por exemplo:

Valor Unitário R$1,87 Um Real e Oitenta e Sete centavos
Quantidade 1,763 Um Quilo setecentos e sessenta e três gramas
Desconto 5,76% Cinco vírgula setenta e seis por cento

A fórmula de cálculo do preço final é:

1,87 * 1,763 = 3,29681
3,29681 * (5,76%) = 0,189896256
3,29681 - 0,189896256 = R$ 3,106913744 (Valor Final)

Caso 02 - Venda de item com desconto posterior

Como sabem, nossa linha de ECF permite que seja aplicado um desconto ou acréscimo em um item já vendido, vamos imaginar a seguinte situação:

  • Item já vendido no cupom valor total e final, já registrado no cupom, de: R$3,87 (três reais e oitenta e sete centavos)
  • Vamos aplicar um desconto no valor de 9,67%. A Fórmula é: R$3,87 * 9,67% =R$ 0,374229 (este seria o valor do desconto)
Caso 03 - Cancelamento parcial

Imagine, para complicar um pouco mais os cálculos, que no item da Situação de número 01 você deseja CANCELAR 0.500 (quinhentos gramas), ou seja, você cancela parcialmente o item e não o item inteiro. Isso é possível? SIM, em toda a linha de ECF Daruma. Para isso você tem que:

  • Calcular o valor Grama do item 01 já vendido. Multiplicar por 0,500 gramas, e no valor final subtrair do valor total do item, tudo isso para manter seu sistema sincronizado com o ECF
Caso 04 - Cancelamento Total de Item

Uma outra situação muito corriqueira no PDV. Você cancela o item, qualquer item do cupom já vendido, e deseja saber quanto foi o valor deste cancelamento. Para manter o sistema sincronizado com o ECF você teria que resgatar estes dados do banco de dados e por sua vez seu sistema efetuar os cálculos.

Caso 05 - Encerramento de Cupom Fiscal com aplicação de Desconto ou Acréscimo

Exemplo de Encerramento com aplicação de Desconto ou Acréscimo no final do cupom fiscal.

  • Total do cupom: R$103,78  com desconto de 13% a fórmula é:
    • R$ 103,78 * 13% = R$13,4914
    • R$ 103,78 – R$13,4914 = R$90,2886
Todas as situações acima são potenciais para que seu sistema calcule de forma diferente do ECF e haja problemas no encerramento do cupom fiscal.

Como resolver isso fazendo o cálculo igual da impressora?

A Boa noticia é que através da DarumaFrameWork.dll e das versões FS600 1.05 e toda a linha FS700 e MACH, você não necessita calcular nada! Nem necessita se preocupar se ela está arredondando ou truncando! O ECF devolve sempre pra você como resposta e você pode obter isso através da DarumaFrameWork.DLL, o valor de todas as operações.

Ou seja, em todas as operações o ECF irá devolver pra você o valor final, já com duas casas decimais, já arredondado ou truncado (conforme a configuração dela), e será este valor que você ira usar na contabilidade de seu sistema, na tela para o usuário e no campo “valor a pagar” que aparece na tela!

Não se preocupe com questões de arredondamento ou truncamento.

Configure o ECF do jeito que você necessita (Arredondando ou Truncando) e os valores finais não necessitam ser calculados, receba isso já calculado do ECF.

Vamos ver isso na prática simulando as situações acima em Delphi e C#.
Solução Caso 01 - Venda com desconto

Venda de item com os seguintes parâmetros:

Valor Unitário R$1,87 Um Real e Oitenta e Sete centavos
Quantidade 1,763 Um Quilo setecentos e sessenta e três gramas
Desconto 5,76% Cinco vírgula setenta e seis por cento

Na DarumaFramework.DLL você possui uma função que devolve o valor líquido do item, já exatamente como calculado pela impressora.

Na prática:


//Declaracao

[DllImport("DarumaFrameWork.dll")]
        public static extern int rInfoEstentida_ECF_Daruma(int iinfo, StringBuilder rsinfo);

//Chamada

private void BT_Enviar_Click(object sender, EventArgs e)
        {          
           
            StringBuilder Str_Informacao = new StringBuilder();
            Str_Informacao.Length = 100;
           
            Declaracoes.iRetorno = Declaracoes.iCFVender_ECF_Daruma("F1", "1,763", "1,87", "D%", "5,76", "0298391283", "UND", "Povilho");
            Declaracoes.iRetorno = Declaracoes.rInfoEstentida_ECF_Daruma(3, Str_Informacao);

            Declaracoes.TrataRetorno(Declaracoes.iRetorno);

        }

Podemos observar que o valor é o mesmo impresso no cupom fiscal:

Solução Caso 02 - Venda de item com desconto posterior

Capturando o valor líquido de um item que recebeu desconto após seu registro.
Utilizando o método de informação estendida é possível que capturemos o valor líquido de um item mesmo após este ter sofrido um acréscimo ou desconto no decorrer do cupom fiscal.

Na prática:


//Declaracao

[DllImport("DarumaFrameWork.dll")]
        public static extern int rInfoEstentida_ECF_Daruma(int iinfo, StringBuilder rsinfo);

//Chamada

     private void BT_Enviar_Click(object sender, EventArgs e)
        {
          
           
            StringBuilder Str_Informacao = new StringBuilder();
            Str_Informacao.Length = 100;
           
            Declaracoes.iRetorno = Declaracoes.iCFVender_ECF_Daruma("F1", "1", "3,87", "A%", "0,00", "9849085", "KG", "Trigo");
            Declaracoes.iRetorno = Declaracoes.iCFLancarDescontoItem_ECF_Daruma("1", "D%", "9,67"); 
            Declaracoes.iRetorno = Declaracoes.rInfoEstentida_ECF_Daruma(3, Str_Informacao);

            Declaracoes.TrataRetorno(Declaracoes.iRetorno);

        }

Um item que em seu registro tem o valor líquido de R$ 3,87 e recebe um desconto de9,67% sendo: (3,87-0,374229). O valor será igual a:3,495771, conforme o a tabela de arredondamento de casas decimais o valor terá o valor da segunda casa decimal aumentado em uma unidade, totalizando o valor liquido do item em3,50.

Utilizar o método de informação estendida economiza todo o trabalho de cálculo e de análise das casas decimais para o arredondamento ou truncamento e a principal vantagem é igualar o valor do sistema com o calculado pela impressora.

Podemos observar que o valor é o mesmo impresso no cupom fiscal:

Solução Caso 03 - Cancelamento parcial

Na situação 1 foram vendidos um quilo setecentos e sessenta e três gramas, suponhamos que fosse necessário cancelar 500 gramas da quantidade já registrada.
Já imaginou o trabalho que daria para que o sistema calculasse o valor atual do item?
Com os métodos de informação estendida na DarumaFramework.DLL você consegue capturar o valor líquido do item após o cancelamento parcial para que o valor em seu sistema seja igual ao da impressora.

Na prática: 

//Declaracao

[DllImport("DarumaFrameWork.dll")]
        public static extern int rInfoEstentida_ECF_Daruma(int iinfo, StringBuilder rsinfo);

//Chamada
  

        private void BT_Enviar_Click(object sender, EventArgs e)
        {
          
           
            StringBuilder Str_Informacao = new StringBuilder();
            Str_Informacao.Length = 100;

            Declaracoes.iRetorno = Declaracoes.iCFVender_ECF_Daruma("F1", "1,763", "1,87", "D%", "0,00", "0298391283", "UND", "Povilho");
            Declaracoes.iRetorno = Declaracoes.iCFCancelarItemParcial_ECF_Daruma("001", "0,500");
            Declaracoes.iRetorno = Declaracoes.rInfoEstentida_ECF_Daruma(1, Str_Informacao);
           
          
            Declaracoes.TrataRetorno(Declaracoes.iRetorno);

        }



Sendo que:
Item lançado: 1,763*1,87 =3,296
Valor a ser cancelado: 0,500 * 1,87 =0,94

Solução Caso 04 - Cancelamento Total de Item

Outra situação na qual você teria que resgatar o valor do banco de dados, para assim subtrai-lo do cálculo da totalização do cupom fiscal.
Com os métodos de informação estendida na DarumaFramework.DLL você consegue capturar o valor líquido do item que acabou de ser cancelado, para que o valor em seu sistema seja igual ao da impressora.

Na prática: 

//Declaracao

[DllImport("DarumaFrameWork.dll")]
        public static extern int rInfoEstentida_ECF_Daruma(int iinfo, StringBuilder rsinfo);

//Chamada

     private void BT_Enviar_Click(object sender,EventArgs e)
        {          
           
            StringBuilder Str_Informacao =new StringBuilder();
            Str_Informacao.Length = 100;

            Declaracoes.iRetorno =Declaracoes.iCFVender_ECF_Daruma("F1", "1", "10,00", "D%", "0,00", "764364283", "UND", "Cabo USB");
            Declaracoes.iRetorno =Declaracoes.iCFVender_ECF_Daruma("F1", "1", "25,00", "D%", "0,00", "43542832", "UND", "Teclado");
            Declaracoes.iRetorno =Declaracoes.iCFCancelarItem_ECF_Daruma("002");
            Declaracoes.iRetorno =Declaracoes.rInfoEstentida_ECF_Daruma(2, Str_Informacao);           
          
            Declaracoes.TrataRetorno(Declaracoes.iRetorno);

        }

Veja a os fontes em Delphi para atender os casos de 1 até 4 utilizando o método de informação estendida:

DELPHI:

//Declaracao
function rInfoEstendida_ECF_Daruma(int:integer; char:string): Integer; StdCall; External 'DarumaFramework.dll';

//Chamada
SetLength (Str_InfoEstendida,30);

Int_Retorno := rInfoEstendida_ECF_Daruma(1 ,Str_InfoEstendida);

Confira todos os retornos de informação estendida em nosso Help Online: Clique aqui
Solução Caso 05 - Encerramento de Cupom Fiscal com aplicação de Desconto ou Acréscimo

Dá um certo trabalho ratear o desconto/acréscimo entre todos os itens vendidos e calcular o valor final do cupom fiscal.

A DarumaFramework.DLL dispõe de um método para fazer todos os cálculos necessários após a totalização do cupom fiscal e nos devolve o valor exatamente igual ao calculado da impressora! Que maravilha não é?

Chega de problemas no fechamento do cupom fiscal, o método rCFSubTotal_ECF_Daruma retorna o valor final do cupom fiscal.

Clique aqui e confira as especificações da função em nosso Help

Em um cupom em que o valor final de seus itens tenha sido de R$103,78 e logo na totalização dado um desconto de 13% ao valor final.

Você certamente iria precisaria fazer os seguintes cálculos:

R$ 103,78 * 13% = R$13,4914
R$ 103,78 – R$13,4914 = R$90,2886


Na prática: 

//Declaracao

[DllImport("DarumaFrameWork.dll")]
        public static extern int rCFSubTotal_ECF_Daruma(StringBuilder pszValor);


//Chamada

        private void BT_Enviar_Click(object sender, EventArgs e)
        {
          
           
            StringBuilder Str_Total = new StringBuilder();
            Str_Total.Length = 100;

            Declaracoes.iRetorno = Declaracoes.iCFVender_ECF_Daruma("F1", "1", "3,78", "D%", "0,00", "764364283", "UND", "Pasta Térmica");
            Declaracoes.iRetorno = Declaracoes.iCFVender_ECF_Daruma("F1", "1", "65,00", "D%", "0,00", "34243432", "UND", "Gabinete 4 Baias");
            Declaracoes.iRetorno = Declaracoes.iCFVender_ECF_Daruma("F1", "1", "35,00", "D%", "0,00", "35211232", "UND", "Placa de Rede");
            Declaracoes.iRetorno = Declaracoes.iCFTotalizarCupom_ECF_Daruma("D%", "13,00");
            Declaracoes.iRetorno = Declaracoes.rCFSubTotal_ECF_Daruma(Str_Total);
            
//No trecho acima atribuimos o valor total do cupom já com o desconto rateado entre os itens a variável Str_Total.

            Declaracoes.iRetorno = Declaracoes.iCFEfetuarPagamento_ECF_Daruma("Visa Débito", (Convert.ToString(Str_Total)), "Volte sempre!"); 
            Declaracoes.iRetorno = Declaracoes.iCFEncerrarPadrao_ECF_Daruma();
          
            Declaracoes.TrataRetorno(Declaracoes.iRetorno);

        }
 }

DELPHI:

//Declaracao
function rCFSubTotal_ECF_Daruma(pszValor:string):Integer; StdCall; External 'DarumaFramework.dll';

//Chamada
SetLength (Str_Subtotal,12); Int_Retorno := rCFSubTotal_ECF_Daruma(Str_Subtotal);

Viu só como é fácil resolver o problema da diferença de valores no fechamento do cupom fiscal?

Duvidas estamos à disposição!

Um abraço,