Skip to content

Commit 635df59

Browse files
authored
Improve Tax-Free Childcare income test (#1602)
1 parent 0dbb4a3 commit 635df59

8 files changed

Lines changed: 83 additions & 14 deletions

File tree

changelog.d/1043.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Improved Tax-Free Childcare expected income and self-employment start-up period handling.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
description: The expected income test for Tax-Free Childcare uses this many weeks in a declaration period.
2+
metadata:
3+
period: year
4+
unit: week
5+
label: Tax-Free Childcare declaration period weeks
6+
reference:
7+
- title: The Childcare Payments (Eligibility) Regulations 2015 - Regulation 9(4)
8+
href: https://www.legislation.gov.uk/uksi/2015/448/regulation/9
9+
values:
10+
2015-01-01: 13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
- name: Expected declaration-period income defaults to annual countable income prorated by declaration weeks
2+
period: 2025
3+
input:
4+
employment_income: 8_000
5+
self_employment_income: 4_000
6+
output:
7+
tax_free_childcare_expected_declaration_period_income: 3_000

policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare_income_condition.yaml

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
period: 2025
2323
input:
2424
age: 18
25-
employment_income: 4_152
25+
tax_free_childcare_expected_declaration_period_income: 2_080
2626
self_employment_income: 0
2727
output:
28-
tax_free_childcare_meets_income_requirements: false
28+
tax_free_childcare_meets_income_requirements: true
2929

3030
# Tests for age 21+ bracket (threshold: £2,379 quarterly)
3131
- name: Under threshold for age 22 - ineligible
@@ -65,4 +65,22 @@
6565
self_employment_income: 17_152
6666
adjusted_net_income: 217_152
6767
output:
68-
tax_free_childcare_meets_income_requirements: false
68+
tax_free_childcare_meets_income_requirements: false
69+
70+
- name: At income limit
71+
period: 2025
72+
input:
73+
age: 22
74+
tax_free_childcare_expected_declaration_period_income: 10_000
75+
adjusted_net_income: 100_000
76+
output:
77+
tax_free_childcare_meets_income_requirements: true
78+
79+
- name: Self-employment start-up period waives minimum income threshold
80+
period: 2025
81+
input:
82+
age: 22
83+
tax_free_childcare_expected_declaration_period_income: 0
84+
tax_free_childcare_self_employment_start_up_period: true
85+
output:
86+
tax_free_childcare_meets_income_requirements: true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from policyengine_uk.model_api import *
2+
3+
4+
class tax_free_childcare_expected_declaration_period_income(Variable):
5+
value_type = float
6+
entity = Person
7+
label = "expected income in the Tax-Free Childcare declaration period"
8+
definition_period = YEAR
9+
unit = GBP
10+
reference = [
11+
"https://www.legislation.gov.uk/uksi/2015/448/regulation/9",
12+
"https://www.legislation.gov.uk/uksi/2015/448/regulation/10",
13+
]
14+
15+
def formula(person, period, parameters):
16+
p = parameters(period).gov.hmrc.tax_free_childcare.income
17+
annual_countable_income = add(person, period, p.countable_sources)
18+
return annual_countable_income * p.declaration_period_weeks / WEEKS_IN_YEAR

policyengine_uk/variables/gov/hmrc/tax_free_childcare/conditions/tax_free_childcare_meets_income_requirements.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,29 @@ class tax_free_childcare_meets_income_requirements(Variable):
77
label = "income eligible for the tax-free childcare"
88
definition_period = YEAR
99

10-
# Legislation: https://www.legislation.gov.uk/ukdsi/2015/9780111127063 , part 9 and 10
11-
# Also, you can check here: https://www.gov.uk/tax-free-childcare
12-
1310
def formula(person, period, parameters):
1411
p = parameters(period).gov.hmrc.tax_free_childcare
1512

16-
# Calculate eligible income by summing countable sources
17-
yearly_eligible_income = add(person, period, p.income.countable_sources)
18-
quarterly_income = yearly_eligible_income / 4
13+
expected_income = person(
14+
"tax_free_childcare_expected_declaration_period_income",
15+
period,
16+
)
1917

2018
# Get minimum wage rate using existing variable
2119
min_wage_rate = person("minimum_wage", period)
2220

23-
# Calculate required threshold (weekly hours * 13 weeks (a quarter) * minimum wage)
24-
# Reference for the quarterly logic: part 9.3 in https://www.legislation.gov.uk/uksi/2015/448/regulation/9
25-
required_threshold = min_wage_rate * p.minimum_weekly_hours * 13
21+
required_threshold = (
22+
min_wage_rate * p.minimum_weekly_hours * p.income.declaration_period_weeks
23+
)
24+
meets_minimum_income = expected_income >= required_threshold
25+
in_start_up_period = person(
26+
"tax_free_childcare_self_employment_start_up_period",
27+
period,
28+
)
2629

2730
# Get adjusted net income and check against max threshold
2831
ani = person("adjusted_net_income", period)
2932

30-
return (quarterly_income > required_threshold) & (ani < p.income.income_limit)
33+
return (meets_minimum_income | in_start_up_period) & (
34+
ani <= p.income.income_limit
35+
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from policyengine_uk.model_api import *
2+
3+
4+
class tax_free_childcare_self_employment_start_up_period(Variable):
5+
value_type = bool
6+
entity = Person
7+
label = "in a self-employment start-up period for Tax-Free Childcare"
8+
definition_period = YEAR
9+
default_value = False
10+
reference = "https://www.legislation.gov.uk/uksi/2015/448/regulation/11"

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)