financial_calculator 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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