PaymentSchedule
PaymentSchedule is a Ruby gem for describing and calculating payment schedules. Its goal is to make implementation and modification of payment schedule algorithms fast and easy to understand.
Requires Ruby 2.4.0 or higher.
Introduction
Easy to use
Simple to keep the algorithm similar to payment schedule's tabular nature. This enables faster changes in the code when the specification changes. At the same time code is clear and readable, even for a person who hasn't got much experience with such algorithms.
Fast
It has good memory and is very lazy — that's why it calculates as little as needed and is very fast.
Example
Take a look at the example, which demostrates the simplicity of the gem.
Example specification (spreadsheet)
Algorithm implemented using a spreadsheet software: amortization_schedule.xlsx
Screenshot:
Example implementation in Ruby
Algorithm implementation in Ruby, based on the spreadsheet: amortization_schedule.rb
Screenshot:
Getting Started
-
Add this line to your application's Gemfile:
gem 'payment_schedule'
-
In project directory, execute:
bundle
-
Create a class which describes the algorithm:
# Description of My Awesome Payment Schedule algorithm. # References spreadsheet examples/amortization_schedule.xlsx MyAwesomeSchedule = PaymentSchedule.new do require_input( :loan_amount, # Cell: C5 :loan_term, # Cell: C6 :interest_rate_year # Cell: C7 ) # Helper required by algorithm for output and summation helper(:first_row_number) do 0 end # Helper required by algorithm for output and summation helper(:last_row_number) do self[:loan_term] end # Cell: C8 helper(:interest_rate_month) do (1 + self[:interest_rate_year].to_d) ** (1 / 12.to_d) - 1 end # Column: G # Note: modified for simplified example component(:balance) do # Cells: G6-G7 rows(0..1) { self[:loan_amount] } default do |n| self[:balance, n - 1] - n * 5 end end # Column: I component(:interest) do # Cell: I6 row(0) { 0 } default do |n| (self[:interest_rate_month] * self[:balance, n]).round(2) end end end
-
Try it out in REPL:
schedule = MyAwesomeSchedule.new( loan_amount: 1000, loan_term: 12, interest_rate_year: 0.1 ) schedule[:balance, 12] # => 615 schedule[:interest_rate_month] # => 0.00797414042890374 puts schedule +----+---------+----------+ | MyAwesomeSchedule | +----+---------+----------+ | No | Balance | Interest | +----+---------+----------+ | 0 | 1000 | 0 | | 1 | 1000 | 7.97 | | 2 | 990 | 7.89 | | 3 | 975 | 7.77 | | 4 | 955 | 7.62 | | 5 | 930 | 7.42 | | 6 | 900 | 7.18 | | 7 | 865 | 6.9 | | 8 | 825 | 6.58 | | 9 | 780 | 6.22 | | 10 | 730 | 5.82 | | 11 | 675 | 5.38 | | 12 | 615 | 4.9 | +----+---------+----------+ # => nil
-
Plug it in to your app
-
Share it with customers
-
Profit! 😎
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/Murdho/payment_schedule. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
Wishlist
Things that would make it even nicer to use.
- Add proper documentation (preferably TomDoc) for lowering the barriers of entry
- Replace
MyClassName = PaymentSchedule.new(&block)
withclass MyClassName < PaymentSchedule::Schedule
(or similar) to enable inheritance for schedule definitions. Definitely needs modifications to instruction finding as well - Algorithm for generating the schedule Ruby code automatically based on spreadsheet file
- Add more commented examples for demonstrating flexibility, readbility and power!
License
The gem is available as open source under the terms of the MIT License.