loan_creator 0.9.0 → 0.9.1

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: fb6c8e7e02bc1349e47dcb07602828d051cfa63ac7fc3e16394604f8dda05e27
4
- data.tar.gz: d103c1e0524641e73b307702eec5bd1cf43029236a3d791805e4d62e7e0732d3
3
+ metadata.gz: e207b2a1a30e9f07b773f9d3071c8df1cb815e17602661efb72d4315ead65dba
4
+ data.tar.gz: c6760d02448a8a9bd6f40fa992aa09f1d716a06b94e2ce5afa8b54eddfeeddf6
5
5
  SHA512:
6
- metadata.gz: c201e2a5fb2a5aaa54b1870b635e11c08b90d35f45258852f4cf61e5faa99756272b54db5a85c470123b5baaf5dedd5a9be79af8577796595997540cad4662b9
7
- data.tar.gz: 00556c176b2e27765ca5112878495c7982cdaeb75abfe3b3956b57c6be57dfcf6c8cf89136bbfa0c94c40e7d43927ff2eafa8c0518f99d0be914e1bd7df1b70d
6
+ metadata.gz: 75d786838e61c1f342da8a3ebf3e0264e42f0e80909bc22ffe63f5c76acf4a1c36e1130ebcbcb4f8c72d87f7a99735c8e3d70f634889935dd57849f92bcdf98d
7
+ data.tar.gz: 768182d707c17e9f5b1f8f748f6dcaf1277e1a1bf0b68c33ed28a178464117272e8dfe294585baeac3fa1d9fb3f28945e1224b7e158fffea66bda89c5cb25dff
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ v0.9.1
2
+ -------------------------
3
+ - add spec importer `scripts/convert_export_to_spec.rb {csv_url}`
4
+ - fix period interests rate for realistic duration period overlapping leap & non leap years
5
+
1
6
  v0.9.0
2
7
  -------------------------
3
8
  - add possibility to pass the argument `term_dates` for `LoanCreator::Bullet`, `LoanCreator::InFine` and `LoanCreator::Linear`
data/README.md CHANGED
@@ -180,8 +180,12 @@ additional term with only interests for the time difference.
180
180
  For example, with a `start_at` in january 2020 and a `interests_start_date` in october 2019, the timetable will include a
181
181
  first term corresponding to 3 months of interests.
182
182
 
183
- `realistic_durations`: Optional. A boolean tha specifies whether or not to use the real number of days in each month when calculating the periodic interests rate. Note that leap years are taken into account. Default: `false`.
184
- The default behaviour is to use the `period` in relation to the number of months in a year (ie: 12)
183
+ `realistic_durations`: Optional. A boolean that specifies whether or not to use the real number of days in each month when calculating the periodic interests rate (ie: for a period between January 1st 2021 and February 1st 2021 the period rate is annual_interests_rate * 31/355).
184
+ Note that leap years are taken into account (ie: for a period between January 1st 2020 and February 1st 2020 the period rate is annual_interests_rate * 31/356). Also, an overlaping period
185
+ take each parts into account (ie: for a period between December 1st 2020 and February 1st 2021, the period rate is (annual_interests_rate * (31/355) + annual_interests_rate * (31/356)))
186
+ Default: `false`.
187
+ The default behaviour is to use the `period` in relation to the number of months in a year (ie: for a monthly timetable annual_interests_rate * 1/12, for quarter annual_interests_rate * 3/12, etc.)
188
+
185
189
 
186
190
  `term_dates`: Optional. Implemented for `LoanCreator::Bullet`, `LoanCreator::InFine` and `LoanCreator::Linear`. Can be used if you want to implement custom due dates for terms. Terms will be compute from date to date. Must be an array with following dates.
187
191
 
@@ -236,12 +236,41 @@ module LoanCreator
236
236
  (interests_start_date && interests_start_date < term_zero_date) && !term_dates?
237
237
  end
238
238
 
239
- def compute_realistic_periodic_interests_rate_percentage_for(date, relative_to_date:)
240
- realistic_days = 365
241
- realistic_days += 1 if date.leap?
242
- realistic_days_in_period = (date - relative_to_date).to_i
239
+ def leap_days_count(date, relative_to_date:)
240
+ start_year = relative_to_date.year
241
+ end_year = date.year
242
+
243
+ (start_year..end_year).sum do |year|
244
+ next 0 unless Date.gregorian_leap?(year)
243
245
 
244
- annual_interests_rate.div(bigd(realistic_days) / bigd(realistic_days_in_period), BIG_DECIMAL_DIGITS)
246
+ start_date =
247
+ if start_year == year
248
+ relative_to_date
249
+ else
250
+ Date.new(year - 1, 12, 31)
251
+ end
252
+
253
+ end_date =
254
+ if end_year == year
255
+ date
256
+ else
257
+ Date.new(year, 12, 31)
258
+ end
259
+
260
+ end_date - start_date
261
+ end
262
+ end
263
+
264
+ def compute_realistic_periodic_interests_rate_percentage_for(date, relative_to_date:)
265
+ total_days = date - relative_to_date
266
+ leap_days = bigd(leap_days_count(date, relative_to_date: relative_to_date))
267
+ non_leap_days = bigd(total_days - leap_days)
268
+
269
+ annual_interests_rate.mult(
270
+ leap_days.div(366, BIG_DECIMAL_DIGITS) +
271
+ non_leap_days.div(365, BIG_DECIMAL_DIGITS),
272
+ BIG_DECIMAL_DIGITS
273
+ )
245
274
  end
246
275
 
247
276
  def realistic_durations?
@@ -1,3 +1,3 @@
1
1
  module LoanCreator
2
- VERSION = '0.9.0'.freeze
2
+ VERSION = '0.9.1'.freeze
3
3
  end
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+ require 'csv'
3
+ require 'open-uri'
4
+ require 'pry'
5
+ require 'securerandom'
6
+
7
+ csv_url = ARGV[0]
8
+
9
+ spec_order = %i[
10
+ index
11
+ due_on
12
+ crd_beginning_of_period
13
+ crd_end_of_period
14
+ period_theoric_interests
15
+ delta_interests
16
+ accrued_delta_interests
17
+ amount_to_add
18
+ period_interests
19
+ period_capital
20
+ total_paid_capital_end_of_period
21
+ total_paid_interests_end_of_period
22
+ period_amount_to_pay
23
+ due_interests_beginning_of_period
24
+ due_interests_end_of_period
25
+ ]
26
+
27
+ column_getter = {
28
+ index: proc { |r| r['t'].to_i },
29
+ due_on: proc { |r| r['date'] },
30
+ crd_beginning_of_period: proc { |r| r['crd_start'].gsub(',', '.').to_f },
31
+ crd_end_of_period: proc { |r| r['crd_end'].gsub(',', '.').to_f },
32
+ period_theoric_interests: proc { |r| r['period_theoric_interests'].gsub(',', '.').to_f },
33
+ delta_interests: proc { |r| r['delta_interests'].gsub(',', '.').to_f },
34
+ accrued_delta_interests: proc { |r| r['cumulated_delta_interests'].gsub(',', '.').to_f },
35
+ amount_to_add: proc { |r| r['amount_to_add'].gsub(',', '.').to_f },
36
+ period_interests: proc { |r| r['period_interests'].gsub(',', '.').to_f },
37
+ period_capital: proc { |r| r['period_capital'].gsub(',', '.').to_f },
38
+ total_paid_capital_end_of_period: proc { |r| r['total_capital_paid'].gsub(',', '.').to_f },
39
+ total_paid_interests_end_of_period: proc { |r| r['total_interests_paid'].gsub(',', '.').to_f },
40
+ period_amount_to_pay: proc { |r| r['period_total'].gsub(',', '.').to_f },
41
+ due_interests_beginning_of_period: proc { |r| r['due_interests_beginning_of_period'].gsub(',', '.').to_f },
42
+ due_interests_end_of_period: proc { |r| r['due_interests_end_of_period'].gsub(',', '.').to_f }
43
+ }
44
+
45
+ data = CSV.parse(URI.open(csv_url), headers: true).map(&:to_hash)
46
+
47
+ CSV.open("./spec/fixtures/new/#{SecureRandom.alphanumeric}.csv", 'w') do |csv|
48
+ data.each do |row|
49
+ csv << spec_order.map { |column| column_getter[column].call(row) }
50
+ end
51
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loan_creator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - thibaulth
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: exe
14
14
  cert_chain: []
15
- date: 2021-05-07 00:00:00.000000000 Z
15
+ date: 2021-05-11 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: bundler
@@ -182,6 +182,7 @@ files:
182
182
  - lib/loan_creator/uncapitalized_bullet.rb
183
183
  - lib/loan_creator/version.rb
184
184
  - loan_creator.gemspec
185
+ - scripts/convert_export_to_spec.rb
185
186
  homepage: https://github.com/CapSens/loan-creator
186
187
  licenses:
187
188
  - MIT