Class: LoanCreator::Common

Inherits:
Object
  • Object
show all
Extended by:
BorrowerTimetable
Includes:
TimeHelper
Defined in:
lib/loan_creator/common.rb

Direct Known Subclasses

Bullet, InFine, Linear, Standard, UncapitalizedBullet

Constant Summary collapse

PERIODS_IN_MONTHS =
{
  month: 1,
  quarter: 3,
  semester: 6,
  year: 12
}.freeze
REQUIRED_ATTRIBUTES =
[
  :period,
  :amount,
  :annual_interests_rate,
  :starts_on,
  :duration_in_periods
].freeze
REQUIRED_ATTRIBUTES_TERM_DATES =
[
  :amount,
  :annual_interests_rate,
  :starts_on,
  :duration_in_periods,
  :term_dates
].freeze
OPTIONAL_ATTRIBUTES =
{
  # attribute: default_value
  deferred_in_periods: 0,
  interests_start_date: nil,
  initial_values: {},
  realistic_durations: false,
  multi_part_interests_calculation: true
}.freeze

Constants included from BorrowerTimetable

BorrowerTimetable::BORROWER_FINANCIAL_ATTRIBUTES

Class Method Summary collapse

Instance Method Summary collapse

Methods included from BorrowerTimetable

borrower_timetable

Constructor Details

#initialize(**options) ⇒ Common

Returns a new instance of Common.



42
43
44
45
46
47
48
49
50
51
# File 'lib/loan_creator/common.rb', line 42

def initialize(**options)
  @options = options
  require_attributes
  reinterpret_attributes
  set_attributes
  validate_attributes
  set_initial_values
  validate_initial_values
  prepare_custom_term_dates if term_dates?
end

Class Method Details

.bigd(value) ⇒ Object



79
80
81
# File 'lib/loan_creator/common.rb', line 79

def self.bigd(value)
  BigDecimal(value, BIG_DECIMAL_DIGITS)
end

Instance Method Details

#bigd(value) ⇒ Object



83
84
85
# File 'lib/loan_creator/common.rb', line 83

def bigd(value)
  self.class.bigd(value)
end

#lender_timetableObject

Raises:

  • (NotImplementedError)


75
76
77
# File 'lib/loan_creator/common.rb', line 75

def lender_timetable
  raise NotImplementedError
end

#periodic_interests_rate(start_date, end_date) ⇒ Object



53
54
55
56
57
58
59
60
# File 'lib/loan_creator/common.rb', line 53

def periodic_interests_rate(start_date, end_date)
  if realistic_durations?
    compute_realistic_periodic_interests_rate(start_date, end_date, annual_interests_rate)
  else
    @periodic_interests_rate ||=
      annual_interests_rate.div(12 / PERIODS_IN_MONTHS[period], BIG_DECIMAL_DIGITS).div(100, BIG_DECIMAL_DIGITS)
  end
end

#timetable_term_datesObject



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/loan_creator/common.rb', line 62

def timetable_term_dates
  @_timetable_term_dates ||= Hash.new do |dates, index|
    dates[index] =
      if index < 1
        dates[index + 1].advance(months: -PERIODS_IN_MONTHS.fetch(period))
      elsif index == 1
        starts_on
      else
        starts_on.advance(months: PERIODS_IN_MONTHS.fetch(period) * (index - 1))
      end
  end
end