dorneles Posted July 1, 2016 Report Share Posted July 1, 2016 alguem tem um funcao para ratear o desconto?estou fazendo assim, ItemVenda->tvendaliq := ROUND(ItemVenda->tvenda-((ItemVenda->tvenda*(Venda->perdesc)/100),2) mas as vezes da diferenca 0.01 no valor unitario do item. Quote Link to comment Share on other sites More sharing options...
crisvam Posted July 1, 2016 Report Share Posted July 1, 2016 alguem tem um funcao para ratear o desconto? estou fazendo assim, ItemVenda->tvendaliq := ROUND(ItemVenda->tvenda-((ItemVenda->tvenda*(Venda->perdesc)/100),2) mas as vezes da diferenca 0.01 no valor unitario do item. Com a nova forma de emitir notas fiscais, a melhor forma é criar um campo para descontos Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 1, 2016 Report Share Posted July 1, 2016 o SET DECIMAL tá como? Quote Link to comment Share on other sites More sharing options...
aferra Posted July 1, 2016 Report Share Posted July 1, 2016 rapaz. eu faço assim e nunca me deu problema. ItemVenda->tvendaliq := IF( <valor_desconto> > 0, ( <valor_desconto> / <valor_total_produtos> ), 0 ) Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 1, 2016 Report Share Posted July 1, 2016 http://fivewin.com.br/index.php?/topic/21899-falha-no-comando-round-do-xharbour/page-2?hl=round Quote Link to comment Share on other sites More sharing options...
microfly Posted July 1, 2016 Report Share Posted July 1, 2016 Eu uso assim If nDatacliente>Date()+10 Memvar->oDlgForm:Update() Endif nVlr := ROUND((Memvar->nVlrParcelar) / nTotPc,2) nDif += ROUND(nVlr,2) FORMPGTO->DATA := nDataCliente //nDataVc Else FORMPGTO->(DBGOTOP()) //preciso apagar tudo que esta na lista WHILE(FORMPGTO->(!EOF())) FORMPGTO->(BloqReg(0)) FORMPGTO->(DBDELETE()) FORMPGTO->(DBSKIP()) END nTotPc := If(Valtype(Memvar->cLimitePC) <> "N", VAL(Memvar->cLimitePC), Memvar->cLimitePC) nDataVc := Date() FOR nNroPc := 1 TO nTotPc nVlr := ROUND((Memvar->nVlrParcelar) / nTotPc,2) nDif += ROUND(nVlr,2) FORMPGTO->(DBAPPEND()) FORMPGTO->FTNPEDI := Pedidos->Ftnpedi FORMPGTO->PARCELA := nNroPc FORMPGTO->DATA := nDataCliente //nDataVc FORMPGTO->VALOR := nVlr FORMPGTO->(DBCOMMIT()) nDataCliente := SOMAMES(nDataCliente,1) NEXT If nDif <> Memvar->nVlrParcelar // Aqui Calcula a diferença da parcela se houver FORMPGTO->(DBGOTOP()) FORMPGTO->(BLOQREG(0)) FORMPGTO->VALOR += (Memvar->nVlrParcelar-nDif) FORMPGTO->(DBUNLOCK()) Endif EndifEndif Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted July 2, 2016 Report Share Posted July 2, 2016 Dorneles, eu faço da mesma forma que você e também estou tendo o mesmo problema. No final do rateio, quando há diferença, estou tendo que eliminar a diferença manualmente. A forma que o Alessandro (Aferra) mostrou seria a solução mas esse tipo de rateio não está sendo proporcional; alguns itens podem ficar com desconto muito alto e outros com desconto muito baixo. A dica do microfly se aplica à parcelas de venda a prazo e não a rateio de desconto. Também faço isso com venda sem problemas mas com rateio de desconto não funciona porque temos de levar em conta a quantidade de itens. Só funcionaria se eu sempre vendesse apenas um item (assim como cada parcela é apenas uma parcela). Resumindo: Também estou tentando desenvolver essa solução. Quando eu conseguir, disponibilizo. Quem conseguir uma funcional primeiro, por favor, compartilhe. Quote Link to comment Share on other sites More sharing options...
Ladinilson Posted July 4, 2016 Report Share Posted July 4, 2016 É sobre o rateio entres os produtos do desconto da NFC-e? Tive muito mas muuuuuuuito problemas com isso! No final a NFC-e era jeitada por causa do valores e tive que fazer além do desconto, uma verificação e acrescentar ou retirar 0.01 a cada produto que poderia haver o problema, sendo assim, o total fica certinho. IF NFE->DESCONTO > 0.00 // vSomaDes <= 0 .AND. vPercDes := (NFE->DESCONTO*100) / NFE->TOTAL_PRO IF vPercDes > 0.00 ConfTotal := 0 Dm := 0.01 Dn := 0.00 - Dm (oAMvendas)->(TRAVAARQ()) (oAMvendas)->(DBGOTOP()) DO WHILE !(oAMvendas)->(EOF()) IF !(oAMvendas)->del vValorDesconto := ((oAMvendas)->valor_unit*vPercDes) / 100 (oAMvendas)->valor_duni := (oAMvendas)->valor_unit-vValorDesconto (oAMvendas)->sub_dtotal := (oAMvendas)->quantidade*(oAMvendas)->valor_duni ConfTotal += (oAMvendas)->sub_dtotal ENDIF (oAMvendas)->(DBSKIP()) ENDDO // IF NFE->TOTAL_NOTA == ConfTotal // ELSE TConf := ConfTotal - NFE->TOTAL_NOTA IF TConf > Dm (oAMvendas)->(DBGOTOP()) DO WHILE !(oAMvendas)->(EOF()) IF !(oAMvendas)->del (oAMvendas)->sub_dtotal -= 0.01 (oAMvendas)->valor_duni := ((oAMvendas)->sub_dtotal/(oAMvendas)->quantidade) ENDIF TCcrec := (oAMvendas)->(RECNO()) ConfTotal := 0 (oAMvendas)->(DBGOTOP()) DO WHILE !(oAMvendas)->(EOF()) IF !(oAMvendas)->del ConfTotal += (oAMvendas)->sub_dtotal ENDIF (oAMvendas)->(DBSKIP()) ENDDO IF NFE->TOTAL_NOTA == ConfTotal EXIT ENDIF (oAMvendas)->(DBGOTO(TCcrec)) (oAMvendas)->(DBSKIP()) IF (oAMvendas)->(EOF()) (oAMvendas)->(DBGOTOP()) ENDIF ENDDO ELSE IF TConf < Dn (oAMvendas)->(DBGOTOP()) DO WHILE !(oAMvendas)->(EOF()) IF !(oAMvendas)->del (oAMvendas)->sub_dtotal += 0.01 (oAMvendas)->valor_duni := ((oAMvendas)->sub_dtotal/(oAMvendas)->quantidade) ENDIF TCcrec := (oAMvendas)->(RECNO()) ConfTotal := 0 (oAMvendas)->(DBGOTOP()) DO WHILE !(oAMvendas)->(EOF()) IF !(oAMvendas)->del ConfTotal += (oAMvendas)->sub_dtotal ENDIF (oAMvendas)->(DBSKIP()) ENDDO IF NFE->TOTAL_NOTA == ConfTotal EXIT ENDIF (oAMvendas)->(DBGOTO(TCcrec)) (oAMvendas)->(DBSKIP()) IF (oAMvendas)->(EOF()) (oAMvendas)->(DBGOTOP()) ENDIF ENDDO ENDIF ENDIF // ENDIF (oAMvendas)->(DBCOMMIT()) (oAMvendas)->(DBUNLOCK()) ENDIF ENDIF FWH 12.08 / BCC 1.2.1 / PELLES Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted July 4, 2016 Report Share Posted July 4, 2016 Eu faço o percentual de desconto no valor total, aplico esse percentual em cada item, somo todos os itens, exceto o último, diminuo o valor do desconto dessa somatória e coloco como desconto do ultimo item, Parece confuso, mas funciona. Quote Link to comment Share on other sites More sharing options...
dorneles Posted July 4, 2016 Author Report Share Posted July 4, 2016 O problema esta no valor unitario que envia para o ECF, porque ele tem 2 CASA DECIMAL. Exemplo:Valor de Venda: 85,63Quantidade : 2Sub-Total :171,26Desconto : 1,61 ----------------------------- Total da Venda: 169,65 Rateio: Vr.Unitario 84,825 COM 3 CASA DECIMALmas para o ecf tenho que mandar com 2 casa decimal, se nao vai dar problema no sped. Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted July 4, 2016 Report Share Posted July 4, 2016 O problema esta no valor unitario que envia para o ECF, porque ele tem 2 CASA DECIMAL. Exemplo: Valor de Venda: 85,63 Quantidade : 2 Sub-Total :171,26 Desconto : 1,61 ----------------------------- Total da Venda: 169,65 Rateio: Vr.Unitario 84,825 COM 3 CASA DECIMAL mas para o ecf tenho que mandar com 2 casa decimal, se nao vai dar problema no sped. Faça do jeito que disse lá em cima, que vc pode arrendondar tudo pra 2 casas decimais que vai ficar garota (vai dar certo) ! Exemplo: Uma venda de 151,68 com os produtos: 1 x 10,57 = 10,57 -> Desconto: 1,06 1 x 79,73 = 79,73 -> Desconto: 7,97 2 x 15,24 = 30,48 -> Desconto: 3,05 1 x 30,90 = 30,90 -> Desconto: 3,09 ( Soma todos os de cima, menos esse, depois diminui do total do desconto) e com desconto de 10% = 15,17 = 136,51 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 4, 2016 Report Share Posted July 4, 2016 Dorneles, seria isso? #include "FiveWin.ch" static oWnd #xtranslate round(<nVal>,<nDec>) => val(str(<nVal>,20,<nDec>)) FUNCTION Main() local oBar DEFINE WINDOW oWnd TITLE "TestE Round()" DEFINE BUTTONBAR oBar _3D OF oWnd DEFINE BUTTON OF oBar ACTION Test_Round() SET MESSAGE OF oWnd TO "TestE Round()" NOINSET CLOCK DATE KEYBOARD ACTIVATE WINDOW oWnd RETURN NIL FUNCTION Test_Round() LOCAL nImp := 0.00, qt := 0.00, preco := 0.00, nNewImp := 00, ; nNewValor := 0.00, totvenda := 0.00, SubTotal := 0.00, ; Desconto := 0.00, Rateio := 0.00 /* Valor de Venda: 85,63 Quantidade : 2 Sub-Total :171,26 Desconto : 1,61 ----------------------------- Total da Venda: 169,65 Rateio: Vr.Unitario 84,825 COM 3 CASA DECIMAL */ Preco := 85.63 Qt := 2.00 Desconto := 1.61 SubTotal := ROUND( Preco, 2 ) * Qt // 171.26 Totvenda := ROUND( SubTotal, 2 ) - ROUND( Desconto, 2 ) // 169.65 Rateio := ROUND( TotVenda, 2 ) / Qt // Vr.Unitario 84.83 RETURN NIL Quote Link to comment Share on other sites More sharing options...
dorneles Posted July 4, 2016 Author Report Share Posted July 4, 2016 Kapiaba,mas assim mudaria o valor total da VENDA para 169,66Anaate da certo, mas no final da venda eu tenho que calcular o valor do desconto por produto, e somar para dar o total da venda.mas o total da venda nao ficaria 169,65 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted July 4, 2016 Report Share Posted July 4, 2016 169,66 ?? aqui deu: 169,65 Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted July 5, 2016 Report Share Posted July 5, 2016 Nossa, que confusão. Me chama no skype, vamos resolver isso! Agora peguei ranso desse desconto! kkkkkkkkkkkk Quote Link to comment Share on other sites More sharing options...
Wellington Vieira Posted July 6, 2016 Report Share Posted July 6, 2016 Bom não sei se irá ajudar ou piorar, mas eu faço assim. // variavel que vai conter o coeficiente a ser aplicado no rateio dos produtos... ftdescontoacrescimo = 0 // variavel que vai conter o valor total do desconto... mftotaldesconto = 0 // variavel que vai somando os descontos aplicados nos itens a partir do coeficiente [ftdescontoacrescimo] mTotal_desconto_somando_nos_item = 0 // A variavel [mTotaldosProdutos] contem o valor total dos produtos da nf-e //mTotaldosProdutos = // o valor total dos produtos da nf-e // neste caso a variável [ ftdescontopercentualvalor ] é um radiobox sendo que 1 - descontonto em percentual 2 - desconto em valor // desconto informado no get em percentual if ftdescontopercentualvalor = 1 // A variavel [ ftvaloroupercentualdesconto] e um campo get que contém o valor do desconto em percentual ftdescontoacrescimo = ftvaloroupercentualdesconto/100 mftotaldesconto = ((mTotaldosProdutos * ftvaloroupercentualdesconto)/100) // round // desconto informado no get em valor elseif ftdescontopercentualvalor = 2 // A variavel [ ftvaloroupercentualdesconto] e um campo get que contém o valor do desconto em reais ftdescontoacrescimo = ftvaloroupercentualdesconto / mTotaldosProdutos mftotaldesconto = ftvaloroupercentualdesconto endif // do while para os itens do pedido para gravar nos itens da nota fiscal do while ..... // variavel a cada produto pega o total do item ftvalortotaldoitem = // round(( quantidade * valor unitario do item),2) ftvalortotaldescontoitem = 0 if ftdescontoacrescimo > 0 ftvalortotaldescontoitem = round((ftvalortotaldoitem * ftdescontoacrescimo),2) // round mTotal_desconto_somando_nos_item = mTotal_desconto_somando_nos_item + ftvalortotaldescontoitem endif // grava o valor do desconto do item que é a variavel [ftvalortotaldescontoitem] skip enddo // aqui regrava o ajuste no desconto para o último item ..... ou não if ftdescontoacrescimo > 0 if mftotaldesconto > mTotal_desconto_somando_nos_item mAjuste = mftotaldesconto - mTotal_desconto_somando_nos_item // regrava o valor do campo desconto + a variavel mAjuste para o ultimo item em questão elseif mTotal_desconto_somando_nos_item > mftotaldesconto mAjuste = mTotal_desconto_somando_nos_item - mftotaldesconto // regrava o valor do campo desconto - a variavel mAjuste para o ultimo item em questão endif endif Quote Link to comment Share on other sites More sharing options...
Ladinilson Posted July 6, 2016 Report Share Posted July 6, 2016 Ana, não sei se estou falando no mesmo assunto, mas o valor do desconto é dados no final da venda e ai temos que repassar para todos os produtos depois que eles já estão inseridos na venda, foi meu caso e acho que é isso o problema ou não é? Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted July 7, 2016 Report Share Posted July 7, 2016 Ladnilson, o problema do colega é exatamente esse: Depois de inserir os produtos, é dado o desconto, e deve ser rateado entre os itens. Eu fiz da forma que citei acima e nunca tive problemas, inclusive na NF-E. Quote Link to comment Share on other sites More sharing options...
ram_bh Posted July 7, 2016 Report Share Posted July 7, 2016 Bom dia! Em um sistema ainda em Clipper/DBF, o desconto é aplicado em cada item separadamente por causa das alíquotas dos impostos que podem ser diferentes conforme o produto ou serviço. Um abraço! Rodrigo Melo Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted July 7, 2016 Report Share Posted July 7, 2016 Bom dia! Em um sistema ainda em Clipper/DBF, o desconto é aplicado em cada item separadamente por causa das alíquotas dos impostos que podem ser diferentes conforme o produto ou serviço. Um abraço! Rodrigo Melo Então se tem 10 produtos, o usuário tem que colocar desconto manual em cada um deles?? É isso? Quote Link to comment Share on other sites More sharing options...
ram_bh Posted July 7, 2016 Report Share Posted July 7, 2016 Ana, Sim, é isso, mas nesse sistema, porque o desconto para vinhos é diferente do desconto para queijos e massas. Regra da empresa. A cada item registrado no momento da venda deve ser informado o % do desconto. Existe também a opção de informar um % de desconto após a finalização dos itens. E nesse caso, os valores são recalculados. Rodrigo Melo Belo Horizonte Quote Link to comment Share on other sites More sharing options...
marcioe Posted July 7, 2016 Report Share Posted July 7, 2016 O que fiz aqui foi mais ou menos o que a Ana indicou. Faço o rateio um a um pelo índice, e jogo a diferença no de maior valor. Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted July 7, 2016 Report Share Posted July 7, 2016 Ana, Sim, é isso, mas nesse sistema, porque o desconto para vinhos é diferente do desconto para queijos e massas. Regra da empresa. A cada item registrado no momento da venda deve ser informado o % do desconto. Existe também a opção de informar um % de desconto após a finalização dos itens. E nesse caso, os valores são recalculados. Rodrigo Melo Belo Horizonte Ah, entendi. Parece interessante, acredito que pelo ramo ser bem diferente do qual eu trabalho, estranhei um pouco kkkkkkk Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted July 8, 2016 Report Share Posted July 8, 2016 Fiquei curioso com as respostas, mas o Dorneles não postou a solução utilizada.Eu faço mais ou menos igual ao Ladinilson, embora ele calcula o valor unitário do desconto e multiplica pela quantidade, enquanto eu calculo pelo valor total de cada item, mas não enxerguei como ele age em relação a produtos com tributação e sem tributação, pq não é interessante vc dar desconto em produtos isentos, quando é permitido a utilização do desconto no cálculo dos tributos.Exemplo:Numa operação de 1.000,00, onde 600,00 é de produto tributado e 400,00 isento e seja permitido desconto no cálculo dos tributos em alguns exemplos postados não enxerguei tratamento diferenciado, para aproveitar o desconto somente nos itens tributados. São aqueles tipos de situação em que as Uf's agem conforme suas regras próprias, um bom exemplo é o frete, algumas isentam o frete dos cálculos em operações internas, enquanto outras exigem que faça parte da base de cálculo, e fica uma boa salada. Posta aí Dorneles depois a solução que vc utilizou, pq todos estão certos, utilizando cada qual uma forma diferente, mas chegando aos mesmos resultados no final. []s, Quote Link to comment Share on other sites More sharing options...
sambomb Posted July 11, 2016 Report Share Posted July 11, 2016 O que fazemos aqui é o seguinte: //-- Aumento a precisão Set Decimals to 20 Set Exact On //Venda de 3 itens: aAdd(aItens,{"Arroz",15,0}) //Arroz R$ 15,00 aAdd(aItens,{"Feijão",35,0}) //Feijão R$ 35,00 aAdd(aItens,{"Carne",50,0}) //Carne R$ 50,00 nDesc := 10 //Desconto de R$ 10,00 //-- Somo o total e verifico o maior valor nTotal := 0 nMaior := 0 nPosMaior := 0 For nItem := 1 to Len(aItens) If aItens[nItem,2] > nMaior nPosMaior := nItem nMaior := aItens[nItem,2] end nTotal += aItens[nItem,2] End //-- Calcular a porcentagem de desconto sobre o valor total nPerc := ( nDesconto / nTotal ) //-- R$ 10,00 / R$ 100,00 => 0,1 => 10% //-- Aplico a porcentagem em cada valor unitário e somo o desconto efetuado nTotDesc := 0 For nItem := 1 to Len(aItens) aItens[nItem,3] := Round(aItens[nItem,2] * nPerc,2) nTotDesc += aItens[nItem,3] End //-- Lanço a diferença no maior item aItens[nPosMaior,3] += ( nDesc - nTotDesc ) Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.