Olá EOLO !
Você sempre é meticuloso, e eu havia notado a questão das prestações antecipadas ou postecipadas, mas como não mexo muito na HP12C e menos ainda no Excel, fui dar tratos à bola, usando o nosso bom e velho Clipper.
Assim lembrei-me de quando fazia planilhas para FINAME, financiamento que admitia carências no pagamento de prestações e no qual contavam-se os juros, e depois transformava tudo para ORTN (alguém lembra disso ?!!).
Pois bem, fiz a rotina abaixo, que está funcionando bem e que serve para se obter o valor da prestação de uma venda, com entrada ou não, prestação antecipada ou postecipada, com carência ou não, taxa de juros, etc., inclusive
apresenta uma tabela demonstrativa dos valores de capital e juros.
As funções que utilizo são de fácil dedução e podem ser substituídas sem problema.
As questões que havia levantado foram respondidas pela introdução dos juros no período de carência, e que dá diferença grande no cálculo, pois o capital ainda está íntegro e qualquer taxa por menor que seja acaba repercutindo
no valor que vai sofrer amortização e juros compostos, sabe como que é, come mesmo o devedor.
Assim, espero retribuir a atenção que o EOLO e colegas clippeiros deram ao meu pedido, mas sabe como que é, de repente a gente precisa dar uma chacoalhada na cuca, acordar os neurônios que já estão um pouco cansados, até a ficha cair, que foi o que aconteceu comigo.
Código: Selecionar todos
PROCEDURE acha_prestacao
local telin := savescreen()
set escape on
setcolor("w+/b")
boxopen(2,1,23,77,"B")
set color to r+/w
centr_tit(2,2,77,"[ CALCULOS FINANCEIROS - PRESTACAO ]")
setcolor("w+/b,g+/n,,,bg+/b")
divida := prest := meses := taxa := total := carencia := entrada := 0
jrscar := "S"
ok := "S"
ap := "P"
do while .t.
set decimals to 2
@ 3,3 clear to 22,76
@ 4, 4 say "Informar o valor da divida original.: "
@ 5, 4 say "Informar a entrada .................: "
@ 6, 4 say "Prestacao (A)ntecipada (P)ostecipada: "
@ 8, 4 say "Informar num. de meses de carencia .: "
@ 8,50 say "Juros na carencia <SN> "
@ 9, 4 say "Juros calculados no periodo carencia: "
@10, 4 say "Divida com juros carencia embutidos.: "
@11, 4 say "Numero de meses para amortizacao ...: "
clear gets
@ 4,46 get divida pict "@E ##,###,###.##"
read
@ 54,6 get entrada pict "@E ##,###,###.##"
read
xguarda := divida
divida -= entrada
if (lastkey() == 27) .or. divida == 0
restscreen(,,,,telin)
return
endif
@ 6,46 get ap pict "@!K" valid ap $"AP"
read
msgm("A taxa oferecida ‚ pode ser mudada a vontade.")
@ 7, 4 say "Informar a taxa de juros mensal (%).: "
@ 7,52 get taxa pict "@E ##.####")
read
msgm("")
if ap == "P"
msgm("Durante a carencia nao havera prestacoes a pagar.")
@ 8,46 get carencia pict "@E ##"
read
msgm("")
if carencia <> 0
msgm("Na carencia, os juros poderao ou nao ser agregados ao principal.")
@ 8,74 get jrscar pict "@!" valid jrscar $ "SN"
read
msgm("")
else
jrscar := "N"
endif
else
carencia := 0
jrscar := "N"
endif
set decimals to 7
taxa1 := (taxa/100)
if jrscar == "S"
fatorcar := (1+taxa1)**carencia
else
fatorcar := 1
endif
jrs_agreg := divida * (fatorcar - 1)
@ 9,46 get jrs_agreg pict "@E ##,###,###.##"
read
divida += jrs_agreg
@10,46 get divida pict "@E ##,###,###.##"
clear gets
@11,56 get meses pict "@E ###"
read
if (ap == "A")
un := (1+taxa1)**(meses - 1)
else
un := (1+taxa1)**meses
endif
un1 := (1 + taxa1) ** meses
coef := (un * taxa1) / (un1 - 1)
prest := coef * divida
set decimals to 2
prest1 := str(prest,13,2)
total := val(prest1) * meses
efetiv := (((1 + taxa1) ** 12) - 1) * 100
@06,62 say "Efetiva anual" color "bg+/b"
@07,65 say transform(efetiv,"@E ###.#####") + "%" color "gr+/b"
@13,4 say "O coeficiente da prestacao .......: " + transform(coef,"@E #.#######")
@15,4 say "O valor da prestacao e de ...... R$.: " + transform(prest,"@E ##,###,###.##")
@17,4 say "O total das prestacoes e de .....R$.: " + transform(total,"@E ##,###,###.##")
@19,4 say "Os juros correspondem a .........R$.: " + transform(total-divida,"@E ##,###,###.##")
resposta(22,24,"Quer Tabela de Amortizacao ? <SN>","SN")
tx_efet := 0
if f_resp == "S"
tabel_17(meses,carencia)
@ 18,63 say "Jrs Efetivos" color "bg+/b"
@ 19,66 say tx_efet pict "@E ##,###.##" color "gr+/b"
endif
resposta(22,24,"Quer outro calculo ? <SN>","SN")
if f_resp == "N"
restscreen(,,,,telin)
return
endif
divida := xguarda
jrscar := "S"
ap := "P"
enddo
PROCEDURE tabel_17(meses,care)
local telin := savescreen()
local periodo[meses+care]
local saldoef[meses+care]
local pgtopri[meses+care]
local jurospg[meses+care]
local nvsaldo[meses+care]
afill(periodo,0)
afill(saldoef,0)
afill(pgtopri,0)
afill(jurospg,0)
afill(nvsaldo,0)
@ 3,3 clear to 21,76
@ 3,3 to 21,76 double
sombra(3,3,21,76)
setcolor("w+/r")
centr_tit(3,2,76,"[ Tabela Price de Amortizacao ]")
setcolor(var_cor)
@ 4,4 say " Periodo Saldo efetivo Pagto principal Juros pagos Saldo final"
@ 5,4 to 5,75
@ 22,40 say "Juros efetivos: " color "gr+/n"
xlin := 6
for n := 1 to (meses+care)
if n <= care
periodo[n] := n
saldoef[n] := divida
else
periodo[n] := n
saldoef[n] := divida
jurospg[n] := divida * taxa1
endif
if n > care
pgtopri[n] := prest - jurospg[n]
nvsaldo[n] := divida - pgtopri[n]
divida := nvsaldo[n]
else
pgtopri[n] := 0
jurospg[n] := 0
nvsaldo[n] := divida
endif
if n < meses
tx_efet += (jurospg[n] * (1 + taxa1) ** (meses - n))
elseif n == meses
tx_efet += jurospg[n]
endif
if n > care
@ xlin,8 say transform(periodo[n],"@E ###") + " " + ;
transform(saldoef[n],"@E #,###,###.##") + " " + ;
transform(pgtopri[n],"@E ###,###.##") + " " + ;
transform(jurospg[n],"@E ##,###.##") + " " + ;
transform(nvsaldo[n],"@E #,###,###.##")
else
@ xlin,8 say transform(periodo[n],"@E ###") + " " + ;
transform(saldoef[n],"@E #,###,###.##") + " " + ;
transform(pgtopri[n],"@E ###,###.##") + " " + ;
transform(jurospg[n],"@E ##,###.##") + " " + ;
transform(nvsaldo[n],"@E #,###,###.##")
endif
xlin ++
if xlin > 20
xlin := 6
msg_tecla("Pressione algo para continuar...")
scroll(6,8,20,75,0)
endif
@ 22,56 say transform(tx_efet,"@E ##,###.##") color "g+/n"
inkey(1)
next
msg_tecla("Tecle algo para sair ...")
restscreen(,,,,telin)