Skip to content

Commit

Permalink
Added computation of amortization schedule and some unit tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
wkranec committed Jun 17, 2011
1 parent 4431705 commit c3b2499
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
17 changes: 16 additions & 1 deletion lib/amortization.rb
@@ -1,17 +1,32 @@
require 'cashflows'

class Amortization
attr_accessor :balance
attr_accessor :rate
attr_accessor :payment
attr_accessor :payments
attr_accessor :periods
attr_accessor :principal

def compute(balance, rate)
@payment = balance * (rate + (rate / ((1 + rate) ** rate.duration - 1)))
@payment = Amortization.payment balance, rate.monthly, rate.duration

rate.duration.times do
@payments << @payment
@balance += (@balance * rate.monthly.round(6)).round(2) + @payment
end
end

def initialize(principal, rate)
@principal = principal
@balance = principal
@rate = rate
@payments = []

compute(@balance, @rate)
end

def Amortization.payment(balance, rate, periods)
-(balance * (rate + (rate / ((1 + rate) ** periods - 1)))).round(2)
end
end
4 changes: 4 additions & 0 deletions lib/rates.rb
Expand Up @@ -59,4 +59,8 @@ def initialize(opts={})
elsif opts.has_key? :nominal: @nominal = decimal(opts[:nominal])
end
end

def monthly
self.effective / 12
end
end
29 changes: 29 additions & 0 deletions test/tc_amortization.rb
@@ -0,0 +1,29 @@
require 'rubygems'
require 'amortization'
require 'flt/d'
require 'rates'
require 'test/unit'

class TestBasicAmortization < Test::Unit::TestCase
def setup
@rate = Rate.new :effective => 0.0375
@rate.duration = 360
@amortization = Amortization.new(D(200000), @rate)
end

def test_balance
assert_equal D(0), @amortization.balance
end

def test_payment
assert_equal D('-926.23'), @amortization.payment
end

def test_payments
assert_equal [ D('-926.23') ] * @rate.duration, @amortization.payments
end

def test_principal
assert_equal D(200000), @amortization.principal
end
end

0 comments on commit c3b2499

Please sign in to comment.