-
Notifications
You must be signed in to change notification settings - Fork 3
/
tabela-price.rb
executable file
·85 lines (69 loc) · 2.67 KB
/
tabela-price.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/env ruby
# Encoding: UTF-8
# Amortização Price 2015.3.27
# Copyright (c) 2013 Renato Silva
# Licenciado sob os termos da GNU GPLv2
# Texto de ajuda
if ['--help', '-h', nil].include? ARGV[0] then puts "
Este programa calcula o andamento de um empréstimo, feito através do
sistema Price, baseado em amortizações adicionais específicas. Desta forma é
possível prever como certos adiantamentos irão alterar o pagamento do
empréstimo, especialmente o quão antecipadamente ele poderá ser quitado.\n
Modo de usar: #{File.basename($PROGRAM_NAME)} <arquivo de entrada>\n
O arquivo de entrada deve ser um texto UTF-8 no seguinte formato:
Taxa: <taxa de juros>
Parcelas: <número de parcelas>
Saldo: <saldo devedor inicial>
Início: <mês e ano da primeira parcela no formato mm/aaaa>
Adiantamento mm/aaaa: <valor do adiantamento para este mês e ano>\n\n"
exit
end
# Dados de entrada
parcelas, taxa, saldo = 0
adiantamentos = {}
File.readlines(ARGV[0]).each do |linha|
chave, valor = linha.strip.split(':').each { |coluna| coluna.strip! }
next if [chave, valor].include? nil
chave.downcase!
chave.slice!(/adiantamento\s+/)
valor.slice!(/R\$\s*/i)
valor.slice!(/\s*%/)
valor.gsub!('.', '')
valor.sub!(',', '.')
case chave
when 'parcelas' then parcelas = valor.to_i
when 'taxa' then taxa = 1 + (valor.to_f / 100)
when 'saldo' then saldo = valor.to_f
when 'início' then $inicio = valor
when /\d+\/\d+/ then adiantamentos[chave] = valor.to_f
end
end
# Valor da prestação e quitação de acordo com os adiantamentos
class Numeric
def moeda
(self * 100).round.to_f / 100
end
def reais
('R$ %.2f' % self).sub('.', ',').gsub(/(\d)(\d{3}[,$])/, '\\1.\\2')
end
def data
mes_ini, ano_ini = $inicio.split('/')
mes_ord = self + mes_ini.to_i - 2
ano = (mes_ord / 12) + ano_ini.to_i
mes = (mes_ord % 12 + 1).to_s.rjust(2, '0')
"#{mes}/#{ano}"
end
end
amortizacao = 0
prestacao = ((saldo * (taxa - 1)) / (1 - (1 / taxa**parcelas))).moeda
printf "%3s%11s%18s%16s\n", '#', 'Data', 'Saldo devedor', 'Amortizado'
(1..parcelas).each do |parcela|
amortizacao = prestacao + (adiantamentos[parcela.data] || 0)
saldo = (saldo * taxa).moeda
amortizacao = saldo if amortizacao > saldo
printf "%3s%11s%18s%16s\n", parcela, parcela.data, saldo.reais, amortizacao.reais
break if amortizacao == saldo
saldo -= amortizacao
end
puts "\nPrestação: #{prestacao.reais}"
puts "Último adiantamento efetivo: #{(amortizacao - prestacao).reais}" if amortizacao > prestacao