Class: SpreadsheetLoanGenerator::Formula

Inherits:
Object
  • Object
show all
Includes:
SpreadsheetConcern
Defined in:
lib/spreadsheet_loan_generator/formula.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(loan:) ⇒ Formula

Returns a new instance of Formula.



7
8
9
10
11
# File 'lib/spreadsheet_loan_generator/formula.rb', line 7

def initialize(loan:)
  @loan = loan
  @interests_formula = loan.interests_formula
  @loan_type_formula = loan.loan_type_formula
end

Instance Attribute Details

#loanObject

Returns the value of attribute loan.



5
6
7
# File 'lib/spreadsheet_loan_generator/formula.rb', line 5

def loan
  @loan
end

Instance Method Details

#accrued_delta_formula(line:) ⇒ Object



139
140
141
142
143
# File 'lib/spreadsheet_loan_generator/formula.rb', line 139

def accrued_delta_formula(line:)
  return excel_float(0.0) if line == 2

  "=#{accrued_delta(line - 1)} + #{delta(line)} - #{amount_to_add(line - 1)}"
end

#amount_to_add_formula(line:) ⇒ Object



145
146
147
# File 'lib/spreadsheet_loan_generator/formula.rb', line 145

def amount_to_add_formula(line:)
  "=TRONQUE(#{accrued_delta(line)}; 2)"
end

#capitalized_interests_end_formula(line:) ⇒ Object



113
114
115
116
117
118
119
120
# File 'lib/spreadsheet_loan_generator/formula.rb', line 113

def capitalized_interests_end_formula(line:)
  term = line - 1
  if term <= loan.deferred_and_capitalized
    "=ARRONDI(#{capitalized_interests_start(line)} + #{period_calculated_interests(line)}; 2)"
  else
    "=ARRONDI(#{capitalized_interests_start(line)} - #{period_reimbursed_capitalized_interests(line)}; 2)"
  end
end

#capitalized_interests_start_formula(line:) ⇒ Object



107
108
109
110
111
# File 'lib/spreadsheet_loan_generator/formula.rb', line 107

def capitalized_interests_start_formula(line:)
  return excel_float(loan.starting_capitalized_interests) if line == 2

  "=ARRONDI(#{capitalized_interests_end(line - 1)}; 2)"
end

#delta_formula(line:) ⇒ Object



135
136
137
# File 'lib/spreadsheet_loan_generator/formula.rb', line 135

def delta_formula(line:)
  "=#{period_theoric_interests(line)} - #{period_interests(line)}"
end

#due_on_formula(line:) ⇒ Object



17
18
19
20
# File 'lib/spreadsheet_loan_generator/formula.rb', line 17

def due_on_formula(line:)
  term = line - 1
  loan.due_on + ((term - 1) * loan.period_duration).months
end

#index_formula(line:) ⇒ Object



13
14
15
# File 'lib/spreadsheet_loan_generator/formula.rb', line 13

def index_formula(line:)
  line - 1
end

#period_calculated_capital_formula(line:) ⇒ Object



50
51
52
53
54
55
56
57
# File 'lib/spreadsheet_loan_generator/formula.rb', line 50

def period_calculated_capital_formula(line:)
  term = line - 1
  if term <= loan.total_deferred_duration
    excel_float(0.0)
  else
    @loan_type_formula.period_calculated_capital_formula(line: line)
  end
end

#period_calculated_interests_formula(line:) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/spreadsheet_loan_generator/formula.rb', line 68

def period_calculated_interests_formula(line:)
  term = line - 1
  if loan.type == 'standard' && loan.total_deferred_duration < term
    return @loan_type_formula.period_calculated_interests_formula(line: line)
  end

  amount_to_capitalize = [
    '(',
    remaining_capital_start(line),
    '+',
    capitalized_interests_start(line),
    ')'
  ].join(' ')

  "=#{amount_to_capitalize} * #{period_rate(line)}"
end

#period_capital_formula(line:) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/spreadsheet_loan_generator/formula.rb', line 22

def period_capital_formula(line:)
  if line == loan.duration + 1
    "=ARRONDI(#{excel_float(loan.amount)} - #{total_paid_capital_end_of_period(line - 1)}; 2)"
  else
    "=ARRONDI(#{period_calculated_capital(line)} - #{period_reimbursed_capitalized_interests(line)}; 2)"
  end
end

#period_interests_formula(line:) ⇒ Object



30
31
32
33
34
35
36
37
# File 'lib/spreadsheet_loan_generator/formula.rb', line 30

def period_interests_formula(line:)
  term = line - 1
  if term <= loan.deferred_and_capitalized
    excel_float(0.0)
  else
    "=ARRONDI(#{period_calculated_interests(line)}; 2)"
  end
end

#period_leap_days_formula(line:) ⇒ Object



149
150
151
152
153
154
155
# File 'lib/spreadsheet_loan_generator/formula.rb', line 149

def period_leap_days_formula(line:)
  term = line - 1
  from = loan.due_on + ((term - 2) * loan.period_duration).months
  to = loan.due_on + ((term - 1) * loan.period_duration).months

  (from...to).sum { |d| d.leap? ? 1 : 0 }
end

#period_non_leap_days_formula(line:) ⇒ Object



157
158
159
160
161
162
163
# File 'lib/spreadsheet_loan_generator/formula.rb', line 157

def period_non_leap_days_formula(line:)
  term = line - 1
  from = loan.due_on + ((term - 2) * loan.period_duration).months
  to = loan.due_on + ((term - 1) * loan.period_duration).months

  (from...to).sum { |d| d.leap? ? 0 : 1 }
end

#period_rate_formula(line:) ⇒ Object



131
132
133
# File 'lib/spreadsheet_loan_generator/formula.rb', line 131

def period_rate_formula(line:)
  @interests_formula.period_rate_formula(line: line)
end

#period_reimbursed_capitalized_interests_formula(line:) ⇒ Object



122
123
124
125
126
127
128
129
# File 'lib/spreadsheet_loan_generator/formula.rb', line 122

def period_reimbursed_capitalized_interests_formula(line:)
  term = line - 1
  if term <= loan.total_deferred_duration
    excel_float(0.0)
  else
    "=ARRONDI(MIN(#{period_calculated_capital(line)}; #{capitalized_interests_start(line)}); 2)"
  end
end

#period_theoric_interests_formula(line:) ⇒ Object



59
60
61
62
63
64
65
66
# File 'lib/spreadsheet_loan_generator/formula.rb', line 59

def period_theoric_interests_formula(line:)
  term = line - 1
  if term <= loan.deferred_and_capitalized
    excel_float(0.0)
  else
    "=#{period_calculated_interests(line)}"
  end
end

#period_total_formula(line:) ⇒ Object



39
40
41
42
43
44
45
46
47
48
# File 'lib/spreadsheet_loan_generator/formula.rb', line 39

def period_total_formula(line:)
  total = [
    period_capital(line),
    '+',
    period_interests(line),
    '+',
    period_reimbursed_capitalized_interests(line)
  ].join(' ')
  "=ARRONDI(#{total}; 2)"
end

#remaining_capital_end_formula(line:) ⇒ Object



91
92
93
# File 'lib/spreadsheet_loan_generator/formula.rb', line 91

def remaining_capital_end_formula(line:)
  "=#{excel_float(loan.amount)} - #{total_paid_capital_end_of_period(line)}"
end

#remaining_capital_start_formula(line:) ⇒ Object



85
86
87
88
89
# File 'lib/spreadsheet_loan_generator/formula.rb', line 85

def remaining_capital_start_formula(line:)
  return excel_float(loan.amount) if line == 2

  "=#{excel_float(loan.amount)} - #{total_paid_capital_end_of_period(line - 1)}"
end

#total_paid_capital_end_of_period_formula(line:) ⇒ Object



95
96
97
98
99
# File 'lib/spreadsheet_loan_generator/formula.rb', line 95

def total_paid_capital_end_of_period_formula(line:)
  return "=#{period_capital(line)}" if line == 2

  "=ARRONDI(SOMME(#{column_range(column: period_capital, upto: line)}); 2)"
end

#total_paid_interests_end_of_period_formula(line:) ⇒ Object



101
102
103
104
105
# File 'lib/spreadsheet_loan_generator/formula.rb', line 101

def total_paid_interests_end_of_period_formula(line:)
  return "=#{period_interests(line)}" if line == 2

  "=ARRONDI(SOMME(#{column_range(column: period_interests, upto: line)}); 2)"
end