Jump to content
Fivewin Brasil

ratiar desconto


dorneles

Recommended Posts

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

Link to comment
Share on other sites

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
Endif
Endif

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

É 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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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


Link to comment
Share on other sites

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

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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,

Link to comment
Share on other sites

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 ) 
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...