financial_calculator 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 57f4d8c3b636807234e0abea5bda7cb5137c0bd8147677f9dec480303c68e214
4
- data.tar.gz: 9df5a5db44050c530da5e66bf3afcb2a57dedc5aa28cc96d98520b33a01affdd
3
+ metadata.gz: dbbac869b96fed665ef26160601fa702b89bfa8753f9a36d02b4ad4b37e3054c
4
+ data.tar.gz: 19b4235429baa31c6ef21ed758af7d6355825d5d0ba09a406c800bde628f37e5
5
5
  SHA512:
6
- metadata.gz: b43701fce76029ec660519740cfbc31e0ce3b4b9180a5ec47f2b3bcf080c6d6b7650188d852c6e79d44505ba9704b750227ff9b334a646a2bc43596a412216de
7
- data.tar.gz: 648eaa40c214a467c40fe148be87fc1fb7b2b4ffec7f04cff640904a7720b96709fa28fd0d92333380e2f638eb838579735dd486d3e0b8ebd51bfd0c352d2040
6
+ metadata.gz: 5d8981744d1ffef65c9c2e932c7ad5577a4ec731e138e51cd87596f650176f97cdf6896e5015bf18a3591c38d83c7303b1e9f83891e431956da8db3ff8df5133
7
+ data.tar.gz: 42ef34bd41ea46bb8bfcab9cd56d2bab2221fbef0c8bef74a47e22bf0d4b8cb60b9d544cebba986ed5bbd8cf83ba0e2948121de9159f04ae5705be9107320bbd
@@ -4,7 +4,13 @@ All notable changes to this project will be documented in this file
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased]
7
+ ## [3.3.0] - 2018-07-13
8
+ ### Added
9
+ - New class for NPER
10
+
11
+ ### Removed
12
+
13
+ ### Changed
8
14
 
9
15
  ## [3.2.0] - 2018-06-09
10
16
  ### Added
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # FINANCE
1
+ # FINANCIAL CALCULATOR
2
2
  [![Build Status](https://travis-ci.org/mfalzone/financial_calculator.svg?branch=master)](https://travis-ci.org/mfalzone/financial_calculator)
3
3
  [![Coverage Status](https://coveralls.io/repos/github/mfalzone/financial_calculator/badge.svg?branch=master)](https://coveralls.io/github/mfalzone/financial_calculator?branch=master)
4
4
 
@@ -16,6 +16,7 @@ module FinancialCalculator
16
16
  require 'financial_calculator/irr'
17
17
  require 'financial_calculator/ppmt'
18
18
  require 'financial_calculator/pv'
19
+ require 'financial_calculator/nper'
19
20
  require 'financial_calculator/npv'
20
21
  require 'financial_calculator/xnpv'
21
22
  require 'financial_calculator/xirr'
@@ -0,0 +1,70 @@
1
+ module FinancialCalculator
2
+ # Calculates the number of periods in an annuity
3
+ class Nper
4
+ include ::Validator
5
+
6
+ # @return [Numeric] The rate used for calculating the number of payments
7
+ # @api public
8
+ attr_reader :rate
9
+
10
+ # @return [Numeric] The amount of each payment made
11
+ # @api public
12
+ attr_reader :payment
13
+
14
+ # @return [Numeric] The current value of the annuity
15
+ # @api public
16
+ attr_reader :present_value
17
+
18
+ # @return [Numeric] The ending value of the annuity. Defaults to 0
19
+ # @api public
20
+ attr_reader :future_value
21
+
22
+ # @return [Boolean] Whether the payment is made at the beginning of the
23
+ # period (true) or end of the period (false)
24
+ # @api public
25
+ attr_reader :pay_at_beginning
26
+
27
+ # @return [DecNum] Result of the PMT calculation
28
+ # @api public
29
+ attr_reader :result
30
+
31
+ # Create a new object for calculating the periodic payment of an ordinary annuity
32
+ # @param [Numeric] rate The discount (interest) rate
33
+ # @param [Numeric] payment The amount of each payment made
34
+ # @param [Numeric] present_value The current value of the annuity
35
+ # @param [Numeric] future_value The ending value of the annuity
36
+ # @param [Boolean] pay_at_beginning. Whether the payment is made at the beginning
37
+ # of the period (true) or end of the period (false)
38
+ # @return [FinancialCalculator::Nper] An instance of NPER calculation
39
+ def initialize(rate, payment, present_value, future_value = 0, pay_at_beginning = false)
40
+ validate_numerics(rate: rate, payment: payment, present_value: present_value, future_value: future_value)
41
+
42
+ @rate = Flt::DecNum(rate.to_s)
43
+ @payment = Flt::DecNum(payment.to_s)
44
+ @present_value = Flt::DecNum(present_value.to_s)
45
+ @future_value = Flt::DecNum(future_value || "0")
46
+ @pay_at_beginning = pay_at_beginning || false
47
+ @result = solve(@rate, @payment, @present_value, @future_value, @pay_at_beginning)
48
+ end
49
+
50
+ # @return [Boolean] Whether the payments are made at the beginning of each period
51
+ # @api public
52
+ def pays_at_beginning?
53
+ @pay_at_beginning
54
+ end
55
+
56
+ def inspect
57
+ "NPER(#{result})"
58
+ end
59
+
60
+ private
61
+
62
+ def solve(rate, pmt, pv, fv, pay_at_beginning)
63
+ type = pay_at_beginning ? 1 : 0
64
+ initial = pmt * (1 + rate * type)
65
+
66
+ # TODO: Insert better error handling if either argument is negative.
67
+ @result = Math.log((initial - fv * rate) / (initial + pv * rate)) / Math.log(1.0 + rate)
68
+ end
69
+ end
70
+ end
@@ -1,3 +1,3 @@
1
1
  module FinancialCalculator
2
- VERSION = '3.2.0'
2
+ VERSION = '3.3.0'
3
3
  end
@@ -0,0 +1,53 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe "Nper" do
4
+ let(:rate) { 0.1 }
5
+ let(:payment) { 4500 }
6
+ let(:present_value) { 0 }
7
+ let(:future_value) { 0 }
8
+ let(:nper) { Nper.new(rate, payment, present_value, future_value) }
9
+
10
+ subject { Nper.new(rate, payment, present_value, future_value) }
11
+
12
+ it 'has a rate attribute' do
13
+ expect(subject).to have_attributes(rate: rate)
14
+ end
15
+
16
+ it 'has a payment attribute' do
17
+ expect(subject).to have_attributes(payment: payment)
18
+ end
19
+
20
+ it 'has a present_value attribute' do
21
+ expect(subject).to have_attributes(present_value: present_value)
22
+ end
23
+
24
+ it 'has a future_value attribute' do
25
+ expect(subject).to have_attributes(future_value: future_value)
26
+ end
27
+
28
+ it 'has a pays_at_beginning? attribute that defaults to false' do
29
+ expect(subject).to have_attributes(pays_at_beginning?: false)
30
+ end
31
+
32
+ it 'has a result attribute' do
33
+ expect(subject.result).to be_a Numeric
34
+ end
35
+
36
+ context 'when provided a non-numeric rate' do
37
+ let(:rate) { 'string' }
38
+
39
+ it 'raises an ArgumentError' do
40
+ expect { subject }.to raise_error ArgumentError
41
+ end
42
+ end
43
+
44
+ describe '#inspect' do
45
+ subject { nper.inspect }
46
+
47
+ it { is_expected.to be_a String }
48
+ it { is_expected.to include 'NPER' }
49
+ it 'includes the result of the Nper calculation' do
50
+ expect(subject).to include nper.result.to_s
51
+ end
52
+ end
53
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: financial_calculator
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Falzone
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-10 00:00:00.000000000 Z
11
+ date: 2018-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: flt
@@ -163,6 +163,7 @@ files:
163
163
  - lib/financial_calculator/fv.rb
164
164
  - lib/financial_calculator/ipmt.rb
165
165
  - lib/financial_calculator/irr.rb
166
+ - lib/financial_calculator/nper.rb
166
167
  - lib/financial_calculator/npv.rb
167
168
  - lib/financial_calculator/pmt.rb
168
169
  - lib/financial_calculator/ppmt.rb
@@ -177,6 +178,7 @@ files:
177
178
  - spec/fv_spec.rb
178
179
  - spec/ipmt_spec.rb
179
180
  - spec/irr_spec.rb
181
+ - spec/nper_spec.rb
180
182
  - spec/npv_spec.rb
181
183
  - spec/pmt_spec.rb
182
184
  - spec/ppmt_spec.rb
@@ -217,6 +219,7 @@ test_files:
217
219
  - spec/fv_spec.rb
218
220
  - spec/ipmt_spec.rb
219
221
  - spec/irr_spec.rb
222
+ - spec/nper_spec.rb
220
223
  - spec/npv_spec.rb
221
224
  - spec/pmt_spec.rb
222
225
  - spec/ppmt_spec.rb