class LoanCreator::Linear

Public Instance Methods

lender_timetable() click to toggle source
# File lib/loan_creator/linear.rb, line 4
def lender_timetable
  timetable = new_timetable
  reset_current_term
  @crd_end_of_period = amount

  if term_zero?
    compute_term_zero
    timetable << current_term
  end

  duration_in_periods.times { |idx| timetable << compute_current_term(idx, timetable) }

  timetable
end

Private Instance Methods

compute_current_term(idx, timetable) click to toggle source
# File lib/loan_creator/linear.rb, line 21
def compute_current_term(idx, timetable)
  @index = idx + 1
  @last_period = last_period?(idx)
  @deferred_period = @index <= deferred_in_periods
  @due_on = timetable_term_dates[timetable.next_index]
  computed_periodic_interests_rate = periodic_interests_rate(@due_on, relative_to_date: timetable_term_dates[timetable.next_index - 1])

  # Reminder: CRD beginning of period = CRD end of period **of previous period**
  @crd_beginning_of_period = @crd_end_of_period
  @due_interests_beginning_of_period = @due_interests_end_of_period
  @period_theoric_interests = period_theoric_interests(computed_periodic_interests_rate)
  @delta_interests = @period_theoric_interests - @period_theoric_interests.round(2)
  @accrued_delta_interests += @delta_interests
  @amount_to_add = bigd(
    if @accrued_delta_interests >= bigd('0.01')
      '0.01'
    elsif @accrued_delta_interests <= bigd('-0.01')
      '-0.01'
    else
      '0'
    end
  )
  @accrued_delta_interests -= @amount_to_add
  @period_interests = @period_theoric_interests.round(2) + @amount_to_add
  @period_capital = period_capital
  @total_paid_capital_end_of_period += @period_capital
  @total_paid_interests_end_of_period += @period_interests
  @period_amount_to_pay = @period_interests + @period_capital
  @crd_end_of_period -= @period_capital
  @due_interests_end_of_period -= reimbursed_due_interests

  current_term
end
compute_period_capital() click to toggle source
# File lib/loan_creator/linear.rb, line 86
def compute_period_capital
  ((amount + @initial_due_interests) / (duration_in_periods - deferred_in_periods)).round(2)
end
period_capital() click to toggle source
# File lib/loan_creator/linear.rb, line 63
def period_capital
  if @last_period
    @crd_beginning_of_period
  elsif @deferred_period
    bigd(0)
  elsif @due_interests_beginning_of_period > 0
    compute_period_capital - reimbursed_due_interests
  else
    compute_period_capital
  end
end
period_theoric_interests(computed_periodic_interests_rate) click to toggle source
# File lib/loan_creator/linear.rb, line 55
def period_theoric_interests(computed_periodic_interests_rate)
  if @due_interests_beginning_of_period > 0
    reimbursed_due_interests + compute_period_generated_interests(computed_periodic_interests_rate)
  else
    compute_period_generated_interests(computed_periodic_interests_rate)
  end
end
reimbursed_due_interests() click to toggle source
# File lib/loan_creator/linear.rb, line 75
def reimbursed_due_interests
  if @deferred_period
    bigd(0)
  else
    [
      @due_interests_beginning_of_period,
      compute_period_capital
    ].min
  end
end