Skip to content

Commit 47e6832

Browse files
authored
Merge pull request #2840 from alphagov/estimate-self-assessment-penalties/change-interest-rate
Update self assessment penalties interest rate
2 parents a6cfbbc + 116944f commit 47e6832

File tree

3 files changed

+112
-56
lines changed

3 files changed

+112
-56
lines changed

lib/smart_answer/calculators/self_assessment_penalties.rb

+19-7
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,14 @@ def late_filing_penalty
106106
end
107107

108108
def interest
109-
if overdue_payment_days <= 0
110-
0
111-
else
112-
SmartAnswer::Money.new(calculate_interest(estimated_bill.value, overdue_payment_days).round(2))
109+
return 0 if overdue_payment_days <= 0
110+
111+
days_with_penalty_interest = payment_deadline..(payment_date - 2)
112+
interest_charges_per_day = days_with_penalty_interest.map do |date|
113+
calculate_interest_for_date(date)
113114
end
115+
116+
SmartAnswer::Money.new(interest_charges_per_day.sum.round(2))
114117
end
115118

116119
def total_owed
@@ -155,9 +158,18 @@ def payment_deadline
155158
DEADLINES[:payment_deadline][tax_year.to_sym]
156159
end
157160

158-
#interest is 3% per annum
159-
def calculate_interest(amount, number_of_days)
160-
(amount * (0.03 / 365) * (number_of_days - 1)).round(10)
161+
def calculate_interest_for_date(date)
162+
estimated_bill.value * daily_rate(date)
163+
end
164+
165+
def daily_rate(date)
166+
# Rate drops from 3% to 2.75% on 23 August 2016
167+
rate_change_date = Date.new(2016, 8, 23)
168+
if date < rate_change_date
169+
0.03 / 365.0
170+
else
171+
0.0275 / 365.0
172+
end
161173
end
162174
end
163175
end

test/data/estimate-self-assessment-penalties-files.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ lib/smart_answer_flows/estimate-self-assessment-penalties/questions/how_submitte
1010
lib/smart_answer_flows/estimate-self-assessment-penalties/questions/when_paid.govspeak.erb: fd629bd5e95648f5a22246a423cfd026
1111
lib/smart_answer_flows/estimate-self-assessment-penalties/questions/when_submitted.govspeak.erb: 590022eac4fbf8db1976da66d777f776
1212
lib/smart_answer_flows/estimate-self-assessment-penalties/questions/which_year.govspeak.erb: 3431fda0cc0bf6c0c7670c04ef38458c
13-
lib/smart_answer/calculators/self_assessment_penalties.rb: 7e48160fc1ae2862c5f08f23f19597ce
13+
lib/smart_answer/calculators/self_assessment_penalties.rb: 2f0cb535afa82d3911d6dfc87adc4c2f

test/unit/calculators/self_assessment_penalties_test.rb

+92-48
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@ def setup
77
online_filing_deadline: {
88
"2012-13": Date.new(2014, 1, 31),
99
"2013-14": Date.new(2015, 1, 31),
10-
"2014-15": Date.new(2015, 1, 31),
11-
"2015-16": Date.new(2017, 1, 31)
10+
"2014-15": Date.new(2016, 1, 31),
11+
"2015-16": Date.new(2017, 1, 31),
1212
},
1313
offline_filing_deadline: {
1414
"2012-13": Date.new(2013, 10, 31),
1515
"2013-14": Date.new(2014, 10, 31),
16-
"2015-16": Date.new(2016, 10, 31)
16+
"2014-15": Date.new(2015, 10, 31),
17+
"2015-16": Date.new(2016, 10, 31),
1718
},
1819
payment_deadline: {
1920
"2012-13": Date.new(2014, 1, 31),
2021
"2013-14": Date.new(2015, 1, 31),
21-
"2015-16": Date.new(2017, 1, 31)
22+
"2014-15": Date.new(2016, 1, 31),
23+
"2015-16": Date.new(2017, 1, 31),
2224
},
2325
}
2426

@@ -116,6 +118,7 @@ def setup
116118
should "confirm payment was made late" do
117119
refute @calculator.paid_on_time?
118120
end
121+
119122
should "calculate late filing penalty" do
120123
# band one
121124
@calculator.filing_date = Date.parse("2014-02-02")
@@ -153,52 +156,93 @@ def setup
153156
assert_equal 1500, @calculator.late_filing_penalty
154157
end
155158

156-
should "calculate interest and late payment penalty" do
157-
@calculator.estimated_bill = SmartAnswer::Money.new(10000)
158-
@calculator.payment_date = Date.parse("2014-01-01")
159-
assert_equal 0, @calculator.interest
160-
# 1 day after the deadling
161-
@calculator.payment_date = Date.parse("2014-02-01")
162-
assert_equal 0, @calculator.interest
163-
# 31 days after the deadline
164-
@calculator.payment_date = Date.parse("2014-03-03")
165-
assert_equal 24.66, @calculator.interest
166-
assert_equal 500, @calculator.late_payment_penalty
167-
# should calculate PenaltyInterest1
168-
@calculator.payment_date = Date.parse("2014-04-02")
169-
assert_equal 49.32, @calculator.interest #50.14 + 0.04 penalty interest
170-
# one day before late payment penalty 2
171-
@calculator.payment_date = Date.parse("2014-08-01")
172-
assert_equal 1000, @calculator.late_payment_penalty
173-
assert_equal 148.77, @calculator.interest
174-
# should calculate PenaltyInterest2
175-
@calculator.payment_date = Date.parse("2014-09-02")
176-
assert_equal 1000, @calculator.late_payment_penalty
177-
assert_equal 175.07, @calculator.interest
178-
# one day before late payment penalty 3
179-
@calculator.payment_date = Date.parse("2015-02-01")
180-
assert_equal 1500, @calculator.late_payment_penalty
181-
assert_equal 300, @calculator.interest
182-
# should apply late payment penalty 3
183-
@calculator.payment_date = Date.parse("2015-02-02")
184-
assert_equal 1500, @calculator.late_payment_penalty
185-
assert_equal 300.82, @calculator.interest
186-
# should calculate PenaltyInterest3
187-
@calculator.payment_date = Date.parse("2015-03-05")
188-
assert_equal 1500, @calculator.late_payment_penalty
189-
assert_equal 326.3, @calculator.interest
159+
context "pay penalty before rate change on 23 Aug 2016" do
160+
should "calculate interest and late payment penalty" do
161+
@calculator.estimated_bill = SmartAnswer::Money.new(10000)
162+
@calculator.payment_date = Date.parse("2014-01-01")
163+
assert_equal 0, @calculator.interest
164+
# 1 day after the deadline
165+
@calculator.payment_date = Date.parse("2014-02-01")
166+
assert_equal 0, @calculator.interest
167+
# 31 days after the deadline
168+
@calculator.payment_date = Date.parse("2014-03-03")
169+
assert_equal 24.66, @calculator.interest
170+
assert_equal 500, @calculator.late_payment_penalty
171+
# should calculate PenaltyInterest1
172+
@calculator.payment_date = Date.parse("2014-04-02")
173+
assert_equal 49.32, @calculator.interest #50.14 + 0.04 penalty interest
174+
# one day before late payment penalty 2
175+
@calculator.payment_date = Date.parse("2014-08-01")
176+
assert_equal 1000, @calculator.late_payment_penalty
177+
assert_equal 148.77, @calculator.interest
178+
# should calculate PenaltyInterest2
179+
@calculator.payment_date = Date.parse("2014-09-02")
180+
assert_equal 1000, @calculator.late_payment_penalty
181+
assert_equal 175.07, @calculator.interest
182+
# one day before late payment penalty 3
183+
@calculator.payment_date = Date.parse("2015-02-01")
184+
assert_equal 1500, @calculator.late_payment_penalty
185+
assert_equal 300, @calculator.interest
186+
# should apply late payment penalty 3
187+
@calculator.payment_date = Date.parse("2015-02-02")
188+
assert_equal 1500, @calculator.late_payment_penalty
189+
assert_equal 300.82, @calculator.interest
190+
# should calculate PenaltyInterest3
191+
@calculator.payment_date = Date.parse("2015-03-05")
192+
assert_equal 1500, @calculator.late_payment_penalty
193+
assert_equal 326.3, @calculator.interest
194+
end
195+
196+
should "calculate total owed (excludes filing penalty)" do
197+
@calculator.payment_date = Date.parse("2014-02-02")
198+
assert_equal 5000, @calculator.total_owed
199+
@calculator.payment_date = Date.parse("2014-02-04")
200+
assert_equal 5001, @calculator.total_owed
201+
@calculator.payment_date = Date.parse("2014-08-01")
202+
assert_equal 5574, @calculator.total_owed
203+
@calculator.payment_date = Date.parse("2015-02-02")
204+
assert_equal 750, @calculator.late_payment_penalty
205+
assert_equal 5900, @calculator.total_owed
206+
end
190207
end
191208

192-
should "calculate total owed (excludes filing penalty)" do
193-
@calculator.payment_date = Date.parse("2014-02-02")
194-
assert_equal 5000, @calculator.total_owed
195-
@calculator.payment_date = Date.parse("2014-02-04")
196-
assert_equal 5001, @calculator.total_owed
197-
@calculator.payment_date = Date.parse("2014-08-01")
198-
assert_equal 5574, @calculator.total_owed
199-
@calculator.payment_date = Date.parse("2015-02-02")
200-
assert_equal 750, @calculator.late_payment_penalty
201-
assert_equal 5900, @calculator.total_owed
209+
context "pay penalty after rate change on 23 Aug 2016" do
210+
setup do
211+
@calculator.estimated_bill = SmartAnswer::Money.new(1000)
212+
end
213+
214+
context "deadline and payment dates are before rate change date" do
215+
should "have values with rate at 3%" do
216+
@calculator.payment_deadline = Date.parse("2016-01-31")
217+
@calculator.payment_date = Date.parse("2016-08-23")
218+
assert_equal 16.77, @calculator.interest.value.to_f
219+
end
220+
end
221+
222+
context "deadline and payment dates are after rate change date" do
223+
should "have values from rate at 2.75%" do
224+
@calculator.payment_deadline = Date.parse("2016-08-23")
225+
@calculator.payment_date = Date.parse("2016-10-31")
226+
assert_equal 5.12, @calculator.interest.value.to_f
227+
end
228+
end
229+
230+
context "tax year includes rate change, deadline and payment are after rate change" do
231+
should "should have value from rate at 2.75%" do
232+
@calculator.tax_year = "2015-16"
233+
@calculator.payment_deadline = Date.parse("2017-1-31")
234+
@calculator.payment_date = Date.parse("2017-3-1")
235+
assert_equal 2.11, @calculator.interest.value.to_f
236+
end
237+
end
238+
239+
context "deadline is before rate change date, payment is after rate change date" do
240+
should "have value calculated with rates from before and after change" do
241+
@calculator.payment_deadline = Date.parse("2016-01-31")
242+
@calculator.payment_date = Date.parse("2016-10-31")
243+
assert_equal 21.97, @calculator.interest.value.to_f
244+
end
245+
end
202246
end
203247
end # filed or paid late
204248
end # online submission

0 commit comments

Comments
 (0)