Ir para conteúdo
  • Cadastre-se

dev botao

Desconto na NFC-e


Ver Solução Respondido por BigWings,
  • Este tópico foi criado há 1501 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Moderadores

Tópico movido para a área SAC para que o SLA de resposta seja considerado. 


logoacbr.pngConheça o Portal do Projeto ACBr

Ajude o Projeto ACBr crescer - Assine o SAC ACBr
Assine um dos planos de longa duração do SAC ACBr, obtenha Descontos Especiais, Parcele no Cartão e ainda ganhe Brindes Exclusivos. Saiba mais aqui

Conheça o ACBrLib, o ACBr de forma nativa para qualquer linguagem de programação. Saiba mais aqui

 

 

 

 

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, BigWings disse:

No XML está correto?

Se não estiver, provavelmente é algo na sua rotina.

Acredito que seja no arredondamento, mas não sei como resolver;

Tenho outro exemplo aqui:

tenho uma venda de R$ 56,94 aplico o desconto em (R$) de R$ 6,94 então tenho R$ 50,00, faço o rateio que se não me engano em porcentagem é 12,188 arredondando fica 12,20

e o valor do item sem o desconto é R$ 9,49 passando a ser R$ 8,33.

Então o desconto de cada item é de R$ 1,16 que multiplicado por 6 que seria o total de itens na nota fica o total de desconto R$ 6,96

Lembrando que o desconto que apliquei foi de R$ 6,94 na venda e depois faço o rateio!

Como resolver isso?

19 minutos atrás, Adelmo Junior disse:

Justamente faço o rateio no é que é alterado esse valor

Eu carrego do banco para alimentar o componente

Link para o comentário
Compartilhar em outros sites

  • Moderadores
  • Solution
37 minutos atrás, Adelmo Junior disse:

tenho uma venda de R$ 56,94 aplico o desconto em (R$) de R$ 6,94 então tenho R$ 50,00, faço o rateio que se não me engano em porcentagem é 12,188 arredondando fica 12,20

e o valor do item sem o desconto é R$ 9,49 passando a ser R$ 8,33.

Você tem que guardar o resíduo do arredondamento em cada item. Somando os resíduos de arredondamento de cada item você vai ter um valor que deve ser somado ao desconto do item de maior valor.

Ex:

6,94 / 56,94 = 0,1218826835265191

9,49 * 0,1218826835265191 = 1,156666666666667 => desc: 1,15 resíduo: 0,0066666666666667

47,45 * 0,1218826835265191 = 5,783333333333333 => desc: 5,78 resíduo: 0,0033333333333333

resíduo total: 0,0066666666666667 + 0,0033333333333333 = 0,01

desc. total rateado = 6,93 + resíduo total => 6,93 + 0,01 = 6,94

O resíduo total acrescenta no item de maior valor, no exemplo o segundo, ficando o desconto 5,78 + 0,01 = 5,79

 

  • Curtir 1
  • Obrigado 1
Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

39 minutos atrás, BigWings disse:

Você tem que guardar o resíduo do arredondamento em cada item. Somando os resíduos de arredondamento de cada item você vai ter um valor que deve ser somado ao desconto do item de maior valor.

Ex:

6,94 / 56,94 = 0,1218826835265191

9,49 * 0,1218826835265191 = 1,156666666666667 => desc: 1,15 resíduo: 0,0066666666666667

47,45 * 0,1218826835265191 = 5,783333333333333 => desc: 5,78 resíduo: 0,0033333333333333

resíduo total: 0,0066666666666667 + 0,0033333333333333 = 0,01

desc. total rateado = 6,93 + resíduo total => 6,93 + 0,01 = 6,94

O resíduo total acrescenta no item de maior valor, no exemplo o segundo, ficando o desconto 5,78 + 0,01 = 5,79

 

Vou verificar aqui, obrigado pela dica

Link para o comentário
Compartilhar em outros sites

33 minutos atrás, Adelmo Junior disse:

Não funcionou!

     DesctoAcomulado:=0;
      ValorDescto:= 0.00;
      percdescto:= 0.00;
      TotalRealDescto:= 0.00;
      ValorDesctoProduto:=0;

      try

               ValorDesctoProduto:= DataModule1.ClientMestreTOTAL_DESCTO.AsFloat/QtdeTotalItens;
               Maiorvalor:= DataModule1.ClienteDetalheMaior.AsString;

               DataModule1.ClienteDetalhe.DisableControls;
               DataModule1.ClienteDetalhe.First;
               while not DataModule1.ClienteDetalhe.eof do
               begin
                     if DataModule1.ClienteDetalheCANCELADO.AsString ='N' then
                     begin
                       //    percdescto          := DataModule1.ClientMestrePERC_DESCTO.AsFloat;
                       //    ValorDescto     :=  (percdescto * Datamodule1.ClienteDetalheVALOR_TOTAL.AsFloat)/100;
                         try
                           DataModule1.ClienteDetalhe.Edit;
                           DataModule1.ClienteDetalheDESCTO.AsFloat:= percdescto;
                           if DataModule1.ClienteDetalheVALOR_TOTAL.AsFloat < ValorDesctoProduto   then
                              DesctoAcomulado:= DesctoAcomulado + ValorDesctoProduto
                           else
                              DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat:= ValorDesctoProduto;

                           DataModule1.ClienteDetalhe.Post;
                           DataModule1.ClienteDetalhe.ApplyUpdates(-1);
                           TotalRealDescto:= TotalRealDescto +ValorDescto;
                         except

                         end;
                     end;

                     DataModule1.ClienteDetalhe.Next;
               end;

                vDifDescto := DataModule1.ClientMestreTOTAL_DESCTO.AsFloat - fsvDesc;

                if vDifDescto < 0 then
                vDifDescto := vDifDescto * -1;

                Maiorvalor:= DataModule1.ClienteDetalheMaior.AsString;

               DataModule1.ClienteDetalhe.Locate('VALOR_TOTAL',Maiorvalor,[loPartialKey]);
               DataModule1.ClienteDetalhe.Edit;
               DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat :=DesctoAcomulado + DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat;
               DataModule1.ClienteDetalhe.Post;
               DataModule1.ClienteDetalhe.ApplyUpdates(-1);

      finally

             DataModule1.ClienteDetalhe.EnableControls;
      end;

 

Já fiz de tudo não funciona, ão sei o que é exatamente

Link para o comentário
Compartilhar em outros sites

23 minutos atrás, Adelmo Junior disse:

     DesctoAcomulado:=0;
      ValorDescto:= 0.00;
      percdescto:= 0.00;
      TotalRealDescto:= 0.00;
      ValorDesctoProduto:=0;

      try

               ValorDesctoProduto:= DataModule1.ClientMestreTOTAL_DESCTO.AsFloat/QtdeTotalItens;
               Maiorvalor:= DataModule1.ClienteDetalheMaior.AsString;

               DataModule1.ClienteDetalhe.DisableControls;
               DataModule1.ClienteDetalhe.First;
               while not DataModule1.ClienteDetalhe.eof do
               begin
                     if DataModule1.ClienteDetalheCANCELADO.AsString ='N' then
                     begin
                       //    percdescto          := DataModule1.ClientMestrePERC_DESCTO.AsFloat;
                       //    ValorDescto     :=  (percdescto * Datamodule1.ClienteDetalheVALOR_TOTAL.AsFloat)/100;
                         try
                           DataModule1.ClienteDetalhe.Edit;
                           DataModule1.ClienteDetalheDESCTO.AsFloat:= percdescto;
                           if DataModule1.ClienteDetalheVALOR_TOTAL.AsFloat < ValorDesctoProduto   then
                              DesctoAcomulado:= DesctoAcomulado + ValorDesctoProduto
                           else
                              DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat:= ValorDesctoProduto;

                           DataModule1.ClienteDetalhe.Post;
                           DataModule1.ClienteDetalhe.ApplyUpdates(-1);
                           TotalRealDescto:= TotalRealDescto +ValorDescto;
                         except

                         end;
                     end;

                     DataModule1.ClienteDetalhe.Next;
               end;

                vDifDescto := DataModule1.ClientMestreTOTAL_DESCTO.AsFloat - fsvDesc;

                if vDifDescto < 0 then
                vDifDescto := vDifDescto * -1;

                Maiorvalor:= DataModule1.ClienteDetalheMaior.AsString;

               DataModule1.ClienteDetalhe.Locate('VALOR_TOTAL',Maiorvalor,[loPartialKey]);
               DataModule1.ClienteDetalhe.Edit;
               DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat :=DesctoAcomulado + DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat;
               DataModule1.ClienteDetalhe.Post;
               DataModule1.ClienteDetalhe.ApplyUpdates(-1);

      finally

             DataModule1.ClienteDetalhe.EnableControls;
      end;

 

Já fiz de tudo não funciona, ão sei o que é exatamente

 

1 hora atrás, Adelmo Junior disse:

Não funcionou!

Influencia nos tipos de variáveis com currency, extended e double?

estava usando currency e extended vinha com casas decimais com 6 dígitos e agora mudei para double e ja mudou aqui, acredito que seja isso

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...