-
Notifications
You must be signed in to change notification settings - Fork 120
/
Copy pathmarried_couples_allowance_calculator.rb
68 lines (54 loc) · 2.03 KB
/
married_couples_allowance_calculator.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
module SmartAnswer::Calculators
class MarriedCouplesAllowanceCalculator
attr_accessor :validate_income
def initialize(validate_income: true)
@validate_income = validate_income
end
def calculate_adjusted_net_income(income, gross_pension_contributions, net_pension_contributions, gift_aided_donations)
income - gross_pension_contributions - (net_pension_contributions * 1.25) - (gift_aided_donations * 1.25)
end
def calculate_allowance(age_related_allowance, income)
validate(income) if validate_income
income = 1 if income < 1
mca_entitlement = maximum_mca
if income > income_limit_for_personal_allowances
attempted_reduction = (income - income_limit_for_personal_allowances) / 2
# \/ this reduction actually applies across the board for personal allowances,
# but extracting that was more than required for this piece of work. Please see
# note in AgeRelatedAllowanceChooser
maximum_reduction_of_allowances = age_related_allowance - personal_allowance
remaining_reduction = attempted_reduction - maximum_reduction_of_allowances
if remaining_reduction > 0
reduced_mca = maximum_mca - remaining_reduction
if reduced_mca > minimum_mca
mca_entitlement = reduced_mca
else
mca_entitlement = minimum_mca
end
else
mca_entitlement = maximum_mca
end
end
mca = mca_entitlement * 0.1
SmartAnswer::Money.new(mca)
end
def validate(income)
raise SmartAnswer::InvalidResponse if income < 1
end
def maximum_mca
rates.maximum_married_couple_allowance
end
def minimum_mca
rates.minimum_married_couple_allowance
end
def income_limit_for_personal_allowances
rates.income_limit_for_personal_allowances
end
def personal_allowance
rates.personal_allowance
end
def rates
@rates ||= SmartAnswer::Calculators::RatesQuery.from_file('married_couples_allowance').rates
end
end
end