From ee202a0ce3dac1c85da236679f9aa55894da08c0 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Wed, 7 Oct 2026 14:14:29 +0100 Subject: [PATCH 1/4] Count other investment income in total_income (#2174) ITA 2007 s. 23 Step 1 sums all income charged to income tax, and the model charges other_investment_income through taxable_savings_interest_income. total_income left it out, so post_tax_income subtracted tax on income it never added, and the Winter Fuel taxable-income test and HB/CTR non-dependant bands missed it. Co-Authored-By: Claude Opus 5.5 --- changelog.d/2174.fixed.md | 1 + ...benefits_individual_non_dep_deduction.yaml | 8 +++++ .../gov/hmrc/income_tax/total_income.yaml | 35 +++++++++++++++++++ .../post_tax_income_other_investment.yaml | 16 +++++++++ .../taxable_income_test.yaml | 19 +++++++++- .../gov/hmrc/income_tax/total_income.py | 1 + 6 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 changelog.d/2174.fixed.md create mode 100644 policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/total_income.yaml create mode 100644 policyengine_uk/tests/policy/baseline/household/post_tax_income_other_investment.yaml diff --git a/changelog.d/2174.fixed.md b/changelog.d/2174.fixed.md new file mode 100644 index 0000000000..03de06233c --- /dev/null +++ b/changelog.d/2174.fixed.md @@ -0,0 +1 @@ +- Count other investment income (National Savings, securities and trust interest) in `total_income`, which income tax already charges, so post-tax income, Winter Fuel Payment and Housing Benefit/Council Tax Reduction non-dependant tests see it (#2174). diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml index 07e7c96efb..aceb44cc30 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml @@ -36,3 +36,11 @@ total_income: 9_517 # just over 183 weekly, the lower edge of the second band output: household_benefits_individual_non_dep_deduction: 45.15 * 52 + +- name: Other investment income counts towards the non-dependant's income + period: 2025 + input: + housing_benefit_individual_non_dep_deduction_eligible: true + other_investment_income: 28_912 # 556 weekly + output: + household_benefits_individual_non_dep_deduction: 124.55 * 52 diff --git a/policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/total_income.yaml b/policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/total_income.yaml new file mode 100644 index 0000000000..339e1ecbb5 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/total_income.yaml @@ -0,0 +1,35 @@ +# ITA 2007 s. 23 Step 1 sums all income charged to income tax. Other +# investment income (National Savings, securities and trust interest) is +# charged as savings income (taxable_savings_interest_income), so it counts. + +- name: Other investment income only counts in total income + period: 2025 + input: + other_investment_income: 20_000 + output: + total_income: 20_000 + taxable_savings_interest_income: 20_000 + adjusted_net_income: 20_000 + +- name: Other investment income adds to savings interest, not double counted + period: 2025 + input: + employment_income: 30_000 + savings_interest_income: 2_000 + other_investment_income: 3_000 + output: + total_income: 35_000 + taxable_savings_interest_income: 5_000 + adjusted_net_income: 35_000 + +- name: Total income matches adjusted net income above the taper threshold + # £90k employment plus £20k other investment income: ANI £110k, so the + # personal allowance is reduced by (110,000 - 100,000) / 2 = £5,000. + period: 2025 + input: + employment_income: 90_000 + other_investment_income: 20_000 + output: + total_income: 110_000 + adjusted_net_income: 110_000 + personal_allowance: 7_570 diff --git a/policyengine_uk/tests/policy/baseline/household/post_tax_income_other_investment.yaml b/policyengine_uk/tests/policy/baseline/household/post_tax_income_other_investment.yaml new file mode 100644 index 0000000000..c406bdf948 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/household/post_tax_income_other_investment.yaml @@ -0,0 +1,16 @@ +- name: Post-tax income adds other investment income and subtracts its tax + # £20,000 of other investment income alone in 2025-26: personal allowance + # £12,570, starting rate for savings £5,000 at 0%, personal savings + # allowance £1,000 at 0%, the remaining £1,430 at 20% = £286. + period: 2025 + input: + people: + person: + age: 40 + other_investment_income: 20_000 + households: + household: + members: [person] + output: + income_tax: [286] + post_tax_income: [19_714] diff --git a/policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml b/policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml index be70a4d8a8..e68ca0ee94 100644 --- a/policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml +++ b/policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml @@ -199,4 +199,21 @@ country: "ENGLAND" total_income: 50000 output: - winter_fuel_allowance: 200 \ No newline at end of file + winter_fuel_allowance: 200 + +- name: Enable income test - other investment income counts towards taxable income + period: 2024 + absolute_error_margin: 1 + input: + gov.dwp.winter_fuel_payment.eligibility.taxable_income_test.use_maximum_taxable_income: true + gov.dwp.winter_fuel_payment.eligibility.taxable_income_test.maximum_taxable_income: 20000 + age: 67 + country: "ENGLAND" + private_pension_income: 15000 + other_investment_income: 10000 + pension_credit: 0 + income_support: 0 + esa_income: 0 + jsa_income: 0 + output: + winter_fuel_allowance: 0 diff --git a/policyengine_uk/variables/gov/hmrc/income_tax/total_income.py b/policyengine_uk/variables/gov/hmrc/income_tax/total_income.py index 0503c8447c..b90dacbb58 100644 --- a/policyengine_uk/variables/gov/hmrc/income_tax/total_income.py +++ b/policyengine_uk/variables/gov/hmrc/income_tax/total_income.py @@ -19,6 +19,7 @@ class total_income(Variable): "self_employment_income", "property_income", "savings_interest_income", + "other_investment_income", "dividend_income", # A miscellaneous loss is never part of total income (ITA 2007 s. 152(4)). "taxable_miscellaneous_income", From 7c693026bfa38d0d56e9a27528757e54058898bc Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Fri, 9 Oct 2026 18:26:32 +0100 Subject: [PATCH 2/4] Gate HB non-dependant income bands on remunerative work (review C1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses María's finding C1 on #2184. Counting other investment income in total_income pushed non-working non-dependants with investment income into the Housing Benefit gross-income bands. HB Regs 2006 reg 74(2) (SPC Regs reg 55(2)) applies those bands only to a non-dependant "in remunerative work"; anyone else aged 18 or over takes the reg 74(1)(b) minimum. Reg 6(1) defines remunerative work as at least 16 paid hours a week. - Add gov.dwp.housing_benefit.non_dep_deduction.remunerative_work_hours (16) and band income only when weekly_hours >= 16; otherwise, and for a worker below the first threshold, deduct the first-bracket (reg 74(1)(b)) amount. - The minimum now also reaches zero-income non-dependants, who previously got 0 because calc(0, right=True) fell below the first bracket. That exposed the missing reg 74(6) / SPC reg 55(6) exemption (claimant or partner blind or on AA, DLA care, PIP daily living or AFIP), so add housing_benefit_non_dep_deduction_exempt and apply it in housing_benefit_non_dep_deductions. The two pension-age severe disability tests pass with their original expected values. - Fix the investment-only test to expect the minimum; add hours to the band tests; add non-worker, worker, 16-hour boundary, zero-income and AA exemption tests. UC's non-dependant housing cost contribution is a flat amount and is unaffected. Co-Authored-By: Claude Opus 5.5 --- changelog.d/2174.fixed.md | 1 + .../remunerative_work_hours.yaml | 15 ++++ ...benefits_individual_non_dep_deduction.yaml | 76 ++++++++++++++++++- .../housing_benefit_non_dep_deductions.yaml | 58 ++++++++++++++ ...d_benefits_individual_non_dep_deduction.py | 23 +++++- ...ousing_benefit_non_dep_deduction_exempt.py | 37 +++++++++ .../housing_benefit_non_dep_deductions.py | 7 +- 7 files changed, 213 insertions(+), 4 deletions(-) create mode 100644 policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/remunerative_work_hours.yaml create mode 100644 policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_exempt.py diff --git a/changelog.d/2174.fixed.md b/changelog.d/2174.fixed.md index 03de06233c..373e8a91f5 100644 --- a/changelog.d/2174.fixed.md +++ b/changelog.d/2174.fixed.md @@ -1 +1,2 @@ - Count other investment income (National Savings, securities and trust interest) in `total_income`, which income tax already charges, so post-tax income, Winter Fuel Payment and Housing Benefit/Council Tax Reduction non-dependant tests see it (#2174). +- Band the Housing Benefit non-dependant deduction by gross income only for a non-dependant in remunerative work (at least 16 hours a week); anyone else aged 18 or over takes the minimum deduction (HB Regs 2006 regs 6 and 74(1)-(2)). Make no deduction where the claimant or partner is blind or receives Attendance Allowance, the DLA care component, the PIP daily living component or Armed Forces Independence Payment (reg 74(6)). diff --git a/policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 0000000000..5f36d98cdf --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,15 @@ +description: A non-dependant who works at least this many hours a week is in remunerative work, so the Housing Benefit non-dependant deduction is banded by their gross income; a non-dependant who works fewer hours takes the minimum deduction. +metadata: + label: Housing Benefit non-dependant deduction remunerative work hours threshold + period: week + unit: hour + reference: + - title: The Housing Benefit Regulations 2006 reg. 6(1) + href: https://www.legislation.gov.uk/uksi/2006/213/regulation/6 + - title: The Housing Benefit (Persons who have attained the qualifying age for state pension credit) Regulations 2006 reg. 6(1) + href: https://www.legislation.gov.uk/uksi/2006/214/regulation/6 + - title: The Housing Benefit Regulations 2006 reg. 74(1)-(2) + href: https://www.legislation.gov.uk/uksi/2006/213/regulation/74 + +values: + 2018-06-18: 16 diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml index aceb44cc30..9eb6777307 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml @@ -2,11 +2,18 @@ # art 23(3); DWP Benefit and pension rates 2025 to 2026): under £183 a week # 19.65; £183-265.99 45.15; £266-347.99 62.00; £348-462.99 101.35; # £463-576.99 115.45; £577 and above 126.65. +# +# HB Regs 2006 reg 74(2): the gross-income bands apply only to a non-dependant +# in remunerative work, which reg 6(1) defines as at least 16 paid hours a +# week. hours_worked: 832 is 832 / 52 = 16.0 hours a week, so the cases that +# test the bands set it. Everyone else takes the reg 74(1)(b) minimum, which +# is £19.65 a week in 2025-26. - name: Reduced rent without LHA period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true + hours_worked: 832 # 16 hours a week total_income: 5_200 # 100 weekly output: household_benefits_individual_non_dep_deduction: 19.65 * 52 @@ -15,6 +22,7 @@ period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true + hours_worked: 832 # 16 hours a week total_income: 30_056 # 578 weekly output: household_benefits_individual_non_dep_deduction: 126.65 * 52 @@ -23,6 +31,7 @@ period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true + hours_worked: 832 # 16 hours a week total_income: 18_148 # 349 weekly output: household_benefits_individual_non_dep_deduction: 101.35 * 52 @@ -33,14 +42,77 @@ period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true + hours_worked: 832 # 16 hours a week total_income: 9_517 # just over 183 weekly, the lower edge of the second band output: household_benefits_individual_non_dep_deduction: 45.15 * 52 -- name: Other investment income counts towards the non-dependant's income +- name: Other investment income counts for a non-dependant in remunerative work period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true + hours_worked: 832 # 16 hours a week other_investment_income: 28_912 # 556 weekly output: - household_benefits_individual_non_dep_deduction: 124.55 * 52 + # 556 is in the £463-576.99 band: 115.45 * 52 = 6,003.40. + household_benefits_individual_non_dep_deduction: 115.45 * 52 + +- name: Non-worker with only investment income takes the minimum deduction + period: 2025 + input: + housing_benefit_individual_non_dep_deduction_eligible: true + other_investment_income: 28_912 # 556 weekly, no hours + output: + # Not in remunerative work, so reg 74(1)(b) applies whatever the income: + # 19.65 * 52 = 1,021.80 (not 115.45 * 52 = 6,003.40). + household_benefits_individual_non_dep_deduction: 19.65 * 52 + +- name: Non-worker with high investment income takes the minimum deduction + period: 2025 + input: + housing_benefit_individual_non_dep_deduction_eligible: true + other_investment_income: 60_000 + dividend_income: 40_000 # 100,000 / 52 = 1,923 weekly, no hours + output: + # 19.65 * 52 = 1,021.80. + household_benefits_individual_non_dep_deduction: 19.65 * 52 + +- name: Worker in remunerative work with earnings keeps the earnings band + period: 2025 + input: + housing_benefit_individual_non_dep_deduction_eligible: true + hours_worked: 1_950 # 37.5 hours a week + employment_income: 28_912 # 556 weekly + output: + # 556 is in the £463-576.99 band: 115.45 * 52 = 6,003.40. + household_benefits_individual_non_dep_deduction: 115.45 * 52 + +- name: Just under 16 hours a week is not remunerative work + period: 2025 + input: + housing_benefit_individual_non_dep_deduction_eligible: true + hours_worked: 831 # 831 / 52 = 15.98 hours a week + employment_income: 28_912 # 556 weekly + output: + # 15.98 < 16, so reg 74(1)(b): 19.65 * 52 = 1,021.80. + household_benefits_individual_non_dep_deduction: 19.65 * 52 + +- name: Exactly 16 hours a week is remunerative work + period: 2025 + input: + housing_benefit_individual_non_dep_deduction_eligible: true + hours_worked: 832 # 832 / 52 = 16.0 hours a week ("not less than 16") + employment_income: 28_912 # 556 weekly + output: + # 16 >= 16, so the reg 74(2) bands apply: 115.45 * 52 = 6,003.40. + household_benefits_individual_non_dep_deduction: 115.45 * 52 + +- name: Worker with no gross income takes the minimum deduction + period: 2025 + input: + housing_benefit_individual_non_dep_deduction_eligible: true + hours_worked: 832 # 16 hours a week + output: + # 0 < 183, so reg 74(2)(a) gives the reg 74(1)(b) amount: + # 19.65 * 52 = 1,021.80. + household_benefits_individual_non_dep_deduction: 19.65 * 52 diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml index 81d1b71bcb..0107592c71 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml @@ -97,3 +97,61 @@ output: # Only person 3 is a non-dependant of the head's family: 3. housing_benefit_non_dep_deductions: [3, 0, 0] + +# HB Regs 2006 reg 74(1)(b) and (2): a non-dependant aged 18 or over who is +# not in remunerative work takes the minimum deduction, £19.30 a week in +# 2025-26, whatever their income. Reg 74(6): no deduction at all if the +# claimant or partner receives Attendance Allowance (among other benefits). +- name: A non-working adult non-dependant with only investment income takes the minimum deduction + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 40 + is_household_head: true + adult_child: + age: 25 + other_investment_income: 28_912 # 556 a week, no hours + benunits: + claimant_family: + members: [claimant] + adult_child_family: + members: [adult_child] + households: + household: + members: [claimant, adult_child] + tenure_type: RENT_FROM_COUNCIL + rent: 15_000 + output: + # 19.30 * 52 = 1,003.60 (the top band would be 124.55 * 52 = 6,476.60). + housing_benefit_non_dep_deductions: [1_003.60, 0] + +- name: A claimant on Attendance Allowance has no non-dependant deduction + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_household_head: true + attendance_allowance: 3_800 + adult_child: + age: 30 + hours_worked: 1_950 # 37.5 hours a week + employment_income: 28_912 # 556 a week + benunits: + claimant_family: + members: [claimant] + adult_child_family: + members: [adult_child] + households: + household: + members: [claimant, adult_child] + tenure_type: RENT_FROM_COUNCIL + rent: 15_000 + output: + housing_benefit_non_dep_deduction_exempt: [true, false] + # Reg 74(6)(b)(i) / SPC reg 55(6)(b)(i): no deduction, although the + # non-dependant alone would take 124.55 * 52 = 6,476.60. + housing_benefit_non_dep_deductions: [0, 0] diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.py index 95b6bcb695..dbcaa96868 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.py @@ -8,9 +8,30 @@ class household_benefits_individual_non_dep_deduction(Variable): definition_period = YEAR unit = GBP defined_for = "housing_benefit_individual_non_dep_deduction_eligible" + reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/regulation/6", + "https://www.legislation.gov.uk/uksi/2006/213/regulation/74", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/6", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/55", + ) def formula(person, period, parameters): p = parameters(period).gov.dwp.housing_benefit.non_dep_deduction + # The gross-income bands apply only to a non-dependant "to whom + # paragraph (1)(a) applies because he is in remunerative work" (HB + # Regs 2006 reg 74(2); SPC Regs reg 55(2)). Anyone else takes the + # minimum deduction under reg 74(1)(b) / 55(1)(b), whatever their + # income. Remunerative work is at least 16 paid hours a week (reg + # 6(1) of both sets of Regulations). The first bracket of the table + # is the reg 74(1)(b) amount; reg 74(2)(a) also gives it to a worker + # whose income is below the first threshold, including zero. Reg + # 6(5)-(8) (absences, income-based benefit receipt, leave, sports + # awards) are not modelled. + in_remunerative_work = ( + person("weekly_hours", period) >= p.remunerative_work_hours + ) weekly_income = person("total_income", period) / WEEKS_IN_YEAR - deduction = p.amount.calc(weekly_income, right=True) + minimum = p.amount.amounts[0] + banded = max_(p.amount.calc(weekly_income, right=True), minimum) + deduction = where(in_remunerative_work, banded, minimum) return deduction * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_exempt.py b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_exempt.py new file mode 100644 index 0000000000..1a36ba6dab --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_exempt.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * + + +class housing_benefit_non_dep_deduction_exempt(Variable): + value_type = bool + entity = BenUnit + label = "No non-dependant deductions from this family's Housing Benefit" + documentation = ( + "Whether no deduction is made for any non-dependant from this " + "family's Housing Benefit because the claimant or partner is blind, " + "or receives Attendance Allowance, the care component of Disability " + "Living Allowance, the daily living component of Personal " + "Independence Payment or Armed Forces Independence Payment. The " + "Scottish equivalents listed in the regulation (Pension Age " + "Disability Payment, Child and Adult Disability Payment, Scottish " + "Adult Disability Living Allowance) are not modelled separately." + ) + definition_period = YEAR + reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/regulation/74", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/55", + ) + + def formula(benunit, period, parameters): + # HB Regs 2006 reg 74(6); SPC Regs 2006 reg 55(6): no deduction for + # any non-dependant if the claimant or partner is blind or receiving + # one of the listed benefits in respect of himself. + person = benunit.members + claimant_or_partner = person("is_claimant_or_partner", period) + exempting = ( + person("is_blind", period) + | (person("attendance_allowance", period) > 0) + | (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + ) + return benunit.any(claimant_or_partner & exempting) diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.py b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.py index e5e9e3a933..69215e891f 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.py @@ -27,4 +27,9 @@ def formula(benunit, period, parameters): "household_benefits_individual_non_dep_deduction", period ) * person("is_non_dependant_of_household_head", period) share = benunit("share_of_household_rent", period) - return share * benunit.max(person.household.sum(deductions)) + # No deduction at all if the claimant or partner is blind or receives + # a listed disability benefit (reg 74(6); SPC reg 55(6)). The + # per-person exemptions in reg 74(7)-(8) (students, under-25s on + # income-based benefits, patients, armed forces) are not modelled. + exempt = benunit("housing_benefit_non_dep_deduction_exempt", period) + return where(exempt, 0, share * benunit.max(person.household.sum(deductions))) From 6a44afbe530a2733e3b861355a83c3b5b4c66cab Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Mon, 12 Oct 2026 08:34:20 +0200 Subject: [PATCH 3/4] Restate non-dependant deduction tests at main's corrected 2025-26 rates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Main now uses the SI 2025/295 bands and amounts (minimum £19.65, £463-576.99 band £115.45), so the remunerative-work cases expect those. Co-Authored-By: Claude Opus 5.5 --- .../housing_benefit_non_dep_deductions.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml index 0107592c71..b03e68ca31 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml @@ -99,7 +99,7 @@ housing_benefit_non_dep_deductions: [3, 0, 0] # HB Regs 2006 reg 74(1)(b) and (2): a non-dependant aged 18 or over who is -# not in remunerative work takes the minimum deduction, £19.30 a week in +# not in remunerative work takes the minimum deduction, £19.65 a week in # 2025-26, whatever their income. Reg 74(6): no deduction at all if the # claimant or partner receives Attendance Allowance (among other benefits). - name: A non-working adult non-dependant with only investment income takes the minimum deduction @@ -124,8 +124,8 @@ tenure_type: RENT_FROM_COUNCIL rent: 15_000 output: - # 19.30 * 52 = 1,003.60 (the top band would be 124.55 * 52 = 6,476.60). - housing_benefit_non_dep_deductions: [1_003.60, 0] + # 19.65 * 52 = 1,021.80 (the £463-576.99 band would be 115.45 * 52 = 6,003.40). + housing_benefit_non_dep_deductions: [1_021.80, 0] - name: A claimant on Attendance Allowance has no non-dependant deduction period: 2025 @@ -153,5 +153,5 @@ output: housing_benefit_non_dep_deduction_exempt: [true, false] # Reg 74(6)(b)(i) / SPC reg 55(6)(b)(i): no deduction, although the - # non-dependant alone would take 124.55 * 52 = 6,476.60. + # non-dependant alone would take 115.45 * 52 = 6,003.40. housing_benefit_non_dep_deductions: [0, 0] From 8c222fa6602915f94c379287aca576235beb7ff5 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Mon, 12 Oct 2026 14:47:22 +0200 Subject: [PATCH 4/4] =?UTF-8?q?Narrow=20to=20total=5Fincome;=20keep=20non-?= =?UTF-8?q?dependant=20deductions=20as=20on=20main;=20WFP=20at=20=C2=A335,?= =?UTF-8?q?000?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review of 21bb4dd06 (hub findings 1-3): the remunerative-work gate gave the reg 74(1)(b) minimum to non-dependants the regulations exempt (full-time students, reg 74(7)(c)-(e) / SPC reg 55(7)(e)) and charged a non-dependant couple twice (reg 74(3)-(4)). Doing that properly is #2007's work, so this drops the gate, the minimum and the claimant exemption from this PR. Housing Benefit and national CTR non-dependant deductions now band on total_income less other_investment_income, so they are unchanged from main for every household until #2007 models the remunerative-work test. That also stops the national CTR deduction banding a non-worker whose only income is investment income (hub finding 3, review C1). Winter Fuel Payment (hub finding 4): ITEPA 2003 s.681I(1)(b) charges only total income that "exceeds £35,000", so the income test is now inclusive. The property-test oracle and the 2024 reform case are updated to match. Co-Authored-By: Claude Opus 5.5 --- changelog.d/2174.fixed.md | 4 +- .../remunerative_work_hours.yaml | 15 ---- .../maximum_taxable_income.yaml | 2 +- .../use_maximum_taxable_income.yaml | 2 +- ...benefits_individual_non_dep_deduction.yaml | 83 ++++--------------- .../housing_benefit_non_dep_deductions.yaml | 41 ++------- .../gov/dwp/winter_fuel_allowance.yaml | 55 ++++++++++++ ...eduction_individual_non_dep_deduction.yaml | 54 ++++++++++++ .../taxable_income_test.yaml | 7 +- .../test_winter_heating_payment_properties.py | 6 +- ...d_benefits_individual_non_dep_deduction.py | 32 +++---- ...ousing_benefit_non_dep_deduction_exempt.py | 37 --------- .../housing_benefit_non_dep_deductions.py | 7 +- .../gov/dwp/winter_fuel_payment_eligible.py | 4 +- ..._reduction_individual_non_dep_deduction.py | 9 +- 15 files changed, 165 insertions(+), 193 deletions(-) delete mode 100644 policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/remunerative_work_hours.yaml create mode 100644 policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.yaml delete mode 100644 policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_exempt.py diff --git a/changelog.d/2174.fixed.md b/changelog.d/2174.fixed.md index 373e8a91f5..f65d91381d 100644 --- a/changelog.d/2174.fixed.md +++ b/changelog.d/2174.fixed.md @@ -1,2 +1,2 @@ -- Count other investment income (National Savings, securities and trust interest) in `total_income`, which income tax already charges, so post-tax income, Winter Fuel Payment and Housing Benefit/Council Tax Reduction non-dependant tests see it (#2174). -- Band the Housing Benefit non-dependant deduction by gross income only for a non-dependant in remunerative work (at least 16 hours a week); anyone else aged 18 or over takes the minimum deduction (HB Regs 2006 regs 6 and 74(1)-(2)). Make no deduction where the claimant or partner is blind or receives Attendance Allowance, the DLA care component, the PIP daily living component or Armed Forces Independence Payment (reg 74(6)). +- Count other investment income (National Savings, securities and trust interest) in `total_income`, which income tax already charges, so post-tax income and the Winter Fuel Payment income test see it. Housing Benefit and national Council Tax Reduction non-dependant deductions keep banding on income without it until the remunerative-work test is modelled (#2007) (#2174). +- Keep the Winter Fuel Payment for a pensioner whose total income is exactly £35,000: the winter fuel payment charge applies only where total income exceeds £35,000 (ITEPA 2003 s.681I(1)(b)). diff --git a/policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/remunerative_work_hours.yaml deleted file mode 100644 index 5f36d98cdf..0000000000 --- a/policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/remunerative_work_hours.yaml +++ /dev/null @@ -1,15 +0,0 @@ -description: A non-dependant who works at least this many hours a week is in remunerative work, so the Housing Benefit non-dependant deduction is banded by their gross income; a non-dependant who works fewer hours takes the minimum deduction. -metadata: - label: Housing Benefit non-dependant deduction remunerative work hours threshold - period: week - unit: hour - reference: - - title: The Housing Benefit Regulations 2006 reg. 6(1) - href: https://www.legislation.gov.uk/uksi/2006/213/regulation/6 - - title: The Housing Benefit (Persons who have attained the qualifying age for state pension credit) Regulations 2006 reg. 6(1) - href: https://www.legislation.gov.uk/uksi/2006/214/regulation/6 - - title: The Housing Benefit Regulations 2006 reg. 74(1)-(2) - href: https://www.legislation.gov.uk/uksi/2006/213/regulation/74 - -values: - 2018-06-18: 16 diff --git a/policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/maximum_taxable_income.yaml b/policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/maximum_taxable_income.yaml index 29e4138a20..78e8908217 100644 --- a/policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/maximum_taxable_income.yaml +++ b/policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/maximum_taxable_income.yaml @@ -1,4 +1,4 @@ -description: Households in England or Wales with pensioners earning under this amount of yearly taxable income are eligible for the Winter Fuel Payment. This stands in for the winter fuel payment charge, which recovers the payment from a person whose own total income exceeds £35,000 and who is not entitled to a relevant benefit. +description: Households in England or Wales with a pensioner whose total income is at or below this amount are eligible for the Winter Fuel Payment. This stands in for the winter fuel payment charge, which recovers the payment from a person whose own total income exceeds £35,000 and who is not entitled to a relevant benefit. values: 2000-01-01: 0 2025-01-01: diff --git a/policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/use_maximum_taxable_income.yaml b/policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/use_maximum_taxable_income.yaml index 594e55d980..bd6ee4612f 100644 --- a/policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/use_maximum_taxable_income.yaml +++ b/policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/use_maximum_taxable_income.yaml @@ -1,4 +1,4 @@ -description: When this is true, households in England or Wales with pensioners earning under the maximum taxable income are eligible for the Winter Fuel Payment. This stands in for the winter fuel payment charge on people with total income over £35,000 (ITEPA 2003 s.681I, from 2025-26). +description: When this is true, households in England or Wales with a pensioner whose total income is at or below the maximum taxable income are eligible for the Winter Fuel Payment. This stands in for the winter fuel payment charge on people with total income over £35,000 (ITEPA 2003 s.681I, from 2025-26). values: 2000-01-01: false 2025-01-01: true diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml index 9eb6777307..5d87d27d68 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml @@ -2,18 +2,11 @@ # art 23(3); DWP Benefit and pension rates 2025 to 2026): under £183 a week # 19.65; £183-265.99 45.15; £266-347.99 62.00; £348-462.99 101.35; # £463-576.99 115.45; £577 and above 126.65. -# -# HB Regs 2006 reg 74(2): the gross-income bands apply only to a non-dependant -# in remunerative work, which reg 6(1) defines as at least 16 paid hours a -# week. hours_worked: 832 is 832 / 52 = 16.0 hours a week, so the cases that -# test the bands set it. Everyone else takes the reg 74(1)(b) minimum, which -# is £19.65 a week in 2025-26. - name: Reduced rent without LHA period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true - hours_worked: 832 # 16 hours a week total_income: 5_200 # 100 weekly output: household_benefits_individual_non_dep_deduction: 19.65 * 52 @@ -22,7 +15,6 @@ period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true - hours_worked: 832 # 16 hours a week total_income: 30_056 # 578 weekly output: household_benefits_individual_non_dep_deduction: 126.65 * 52 @@ -31,7 +23,6 @@ period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true - hours_worked: 832 # 16 hours a week total_income: 18_148 # 349 weekly output: household_benefits_individual_non_dep_deduction: 101.35 * 52 @@ -42,77 +33,33 @@ period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true - hours_worked: 832 # 16 hours a week total_income: 9_517 # just over 183 weekly, the lower edge of the second band output: household_benefits_individual_non_dep_deduction: 45.15 * 52 -- name: Other investment income counts for a non-dependant in remunerative work - period: 2025 - input: - housing_benefit_individual_non_dep_deduction_eligible: true - hours_worked: 832 # 16 hours a week - other_investment_income: 28_912 # 556 weekly - output: - # 556 is in the £463-576.99 band: 115.45 * 52 = 6,003.40. - household_benefits_individual_non_dep_deduction: 115.45 * 52 - -- name: Non-worker with only investment income takes the minimum deduction +# Other investment income counts in total_income (ITA 2007 s. 23), but it is +# left out of the non-dependant band until the reg 74(2) remunerative-work +# test is modelled (#2007). Otherwise a non-worker whose only income is +# investment income would be banded on it, where reg 74(1)(b) gives them the +# minimum whatever their income. +- name: Other investment income does not band a non-worker period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true other_investment_income: 28_912 # 556 weekly, no hours output: - # Not in remunerative work, so reg 74(1)(b) applies whatever the income: - # 19.65 * 52 = 1,021.80 (not 115.45 * 52 = 6,003.40). - household_benefits_individual_non_dep_deduction: 19.65 * 52 - -- name: Non-worker with high investment income takes the minimum deduction - period: 2025 - input: - housing_benefit_individual_non_dep_deduction_eligible: true - other_investment_income: 60_000 - dividend_income: 40_000 # 100,000 / 52 = 1,923 weekly, no hours - output: - # 19.65 * 52 = 1,021.80. - household_benefits_individual_non_dep_deduction: 19.65 * 52 + # The same as a non-dependant with no income. Banding the £556 would give + # 115.45 * 52 = 6,003.40. + household_benefits_individual_non_dep_deduction: 0 -- name: Worker in remunerative work with earnings keeps the earnings band +- name: Other investment income does not move a worker's band period: 2025 input: housing_benefit_individual_non_dep_deduction_eligible: true hours_worked: 1_950 # 37.5 hours a week - employment_income: 28_912 # 556 weekly - output: - # 556 is in the £463-576.99 band: 115.45 * 52 = 6,003.40. - household_benefits_individual_non_dep_deduction: 115.45 * 52 - -- name: Just under 16 hours a week is not remunerative work - period: 2025 - input: - housing_benefit_individual_non_dep_deduction_eligible: true - hours_worked: 831 # 831 / 52 = 15.98 hours a week - employment_income: 28_912 # 556 weekly - output: - # 15.98 < 16, so reg 74(1)(b): 19.65 * 52 = 1,021.80. - household_benefits_individual_non_dep_deduction: 19.65 * 52 - -- name: Exactly 16 hours a week is remunerative work - period: 2025 - input: - housing_benefit_individual_non_dep_deduction_eligible: true - hours_worked: 832 # 832 / 52 = 16.0 hours a week ("not less than 16") - employment_income: 28_912 # 556 weekly - output: - # 16 >= 16, so the reg 74(2) bands apply: 115.45 * 52 = 6,003.40. - household_benefits_individual_non_dep_deduction: 115.45 * 52 - -- name: Worker with no gross income takes the minimum deduction - period: 2025 - input: - housing_benefit_individual_non_dep_deduction_eligible: true - hours_worked: 832 # 16 hours a week + employment_income: 9_517 # just over 183 weekly + other_investment_income: 28_912 # 556 weekly output: - # 0 < 183, so reg 74(2)(a) gives the reg 74(1)(b) amount: - # 19.65 * 52 = 1,021.80. - household_benefits_individual_non_dep_deduction: 19.65 * 52 + # Banded on the £183 of earnings: 45.15 * 52 = 2,347.80. Adding the £556 + # would give the top band, 126.65 * 52 = 6,585.80. + household_benefits_individual_non_dep_deduction: 45.15 * 52 diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml index b03e68ca31..8d5ed07037 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.yaml @@ -98,11 +98,11 @@ # Only person 3 is a non-dependant of the head's family: 3. housing_benefit_non_dep_deductions: [3, 0, 0] -# HB Regs 2006 reg 74(1)(b) and (2): a non-dependant aged 18 or over who is -# not in remunerative work takes the minimum deduction, £19.65 a week in -# 2025-26, whatever their income. Reg 74(6): no deduction at all if the -# claimant or partner receives Attendance Allowance (among other benefits). -- name: A non-working adult non-dependant with only investment income takes the minimum deduction +# The review case on #2184: an existing claimant in council housing with an +# adult child whose only income is £28,912 of other investment income and who +# does no paid work. The deduction is the same as for an adult child with no +# income; reg 74(1)(b) minimum for non-workers comes with #2007. +- name: A non-dependant's investment income does not raise the Housing Benefit deduction period: 2025 absolute_error_margin: 0.01 input: @@ -124,34 +124,5 @@ tenure_type: RENT_FROM_COUNCIL rent: 15_000 output: - # 19.65 * 52 = 1,021.80 (the £463-576.99 band would be 115.45 * 52 = 6,003.40). - housing_benefit_non_dep_deductions: [1_021.80, 0] - -- name: A claimant on Attendance Allowance has no non-dependant deduction - period: 2025 - absolute_error_margin: 0.01 - input: - people: - claimant: - age: 70 - is_household_head: true - attendance_allowance: 3_800 - adult_child: - age: 30 - hours_worked: 1_950 # 37.5 hours a week - employment_income: 28_912 # 556 a week - benunits: - claimant_family: - members: [claimant] - adult_child_family: - members: [adult_child] - households: - household: - members: [claimant, adult_child] - tenure_type: RENT_FROM_COUNCIL - rent: 15_000 - output: - housing_benefit_non_dep_deduction_exempt: [true, false] - # Reg 74(6)(b)(i) / SPC reg 55(6)(b)(i): no deduction, although the - # non-dependant alone would take 115.45 * 52 = 6,003.40. + # Banding the £556 would give 115.45 * 52 = 6,003.40. housing_benefit_non_dep_deductions: [0, 0] diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/winter_fuel_allowance.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/winter_fuel_allowance.yaml index ea2ebcccf7..4d6c77c229 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/winter_fuel_allowance.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/winter_fuel_allowance.yaml @@ -106,3 +106,58 @@ income_support: 80 output: winter_fuel_allowance: 200 + +# ITEPA 2003 s.681I(1)(b): the winter fuel payment charge applies only where +# total income "exceeds £35,000". The model stands in for the charge with the +# income test, so a pensioner with exactly £35,000 keeps the payment. Total +# income is built from pension and other investment income, not input. +- name: Pensioner with total income just under £35,000 keeps WFP + period: 2026 + absolute_error_margin: 1 + input: + age: 70 + country: ENGLAND + private_pension_income: 15_000 + other_investment_income: 19_999 + pension_credit: 0 + output: + total_income: 34_999 + winter_fuel_allowance: 200 + +- name: Pensioner with total income of exactly £35,000 keeps WFP + period: 2026 + absolute_error_margin: 1 + input: + age: 70 + country: ENGLAND + private_pension_income: 15_000 + other_investment_income: 20_000 + pension_credit: 0 + output: + total_income: 35_000 + winter_fuel_allowance: 200 + +- name: Pensioner with total income just over £35,000 loses WFP + period: 2026 + absolute_error_margin: 1 + input: + age: 70 + country: ENGLAND + private_pension_income: 15_000 + other_investment_income: 20_001 + pension_credit: 0 + output: + total_income: 35_001 + winter_fuel_allowance: 0 + +- name: Pensioner with total income of exactly £35,000 keeps WFP in 2025-26 + period: 2025 + absolute_error_margin: 1 + input: + age: 70 + country: ENGLAND + private_pension_income: 35_000 + pension_credit: 0 + output: + total_income: 35_000 + winter_fuel_allowance: 200 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.yaml new file mode 100644 index 0000000000..9bb8d99600 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.yaml @@ -0,0 +1,54 @@ +# The national Council Tax Reduction non-dependant deduction bands on gross +# income, but SI 2012/2885 Sch 1 para 8(2) applies the bands only to a +# non-dependant in remunerative work, which this formula does not yet test +# (#2007). Other investment income, now in total_income, is left out of the +# band until it does, so a non-worker whose only income is investment income +# is not banded on it. + +- name: Other investment income does not band a non-worker for CTR + period: 2025 + input: + council_tax_reduction_individual_non_dep_deduction_eligible: true + other_investment_income: 28_912 # 556 weekly, no hours + output: + # The same as a non-dependant with no income. Banding the £556 would give + # 115.45 * 52 = 6,003.40. + council_tax_reduction_individual_non_dep_deduction: 0 + +- name: Other investment income does not move a worker's CTR band + period: 2025 + input: + council_tax_reduction_individual_non_dep_deduction_eligible: true + hours_worked: 1_950 # 37.5 hours a week + employment_income: 9_517 # just over 183 weekly + other_investment_income: 28_912 # 556 weekly + output: + # Banded on the £183 of earnings: 45.15 * 52 = 2,347.80. + council_tax_reduction_individual_non_dep_deduction: 45.15 * 52 + +- name: A pensioner's CTR is not cut for a non-dependant's investment income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_household_head: true + adult_child: + age: 30 + other_investment_income: 28_912 # 556 a week, no hours + benunits: + claimant_family: + members: [claimant] + adult_child_family: + members: [adult_child] + households: + household: + members: [claimant, adult_child] + tenure_type: RENT_FROM_COUNCIL + rent: 15_000 + council_tax: 2_000 + country: ENGLAND + output: + # Banding the £556 would give 115.45 * 52 = 6,003.40. + council_tax_reduction_non_dep_deductions: [0, 0] diff --git a/policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml b/policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml index e68ca0ee94..87ec0723dc 100644 --- a/policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml +++ b/policyengine_uk/tests/policy/reforms/parametric/winter_fuel_allowance/taxable_income_test.yaml @@ -45,7 +45,10 @@ output: winter_fuel_allowance: 0 -- name: Enable income test - pensioner exactly at threshold gets no WFA +# The limit is inclusive: the winter fuel payment charge the income test stands +# in for applies only where total income "exceeds" the limit (ITEPA 2003 +# s.681I(1)(b)), so income exactly at the limit keeps the payment. +- name: Enable income test - pensioner exactly at threshold keeps WFA period: 2024 absolute_error_margin: 1 input: @@ -59,7 +62,7 @@ esa_income: 0 jsa_income: 0 output: - winter_fuel_allowance: 0 + winter_fuel_allowance: 200 - name: Enable income test - pensioner £1 under threshold gets WFA period: 2024 diff --git a/policyengine_uk/tests/test_winter_heating_payment_properties.py b/policyengine_uk/tests/test_winter_heating_payment_properties.py index d4c368a871..2639d8881b 100644 --- a/policyengine_uk/tests/test_winter_heating_payment_properties.py +++ b/policyengine_uk/tests/test_winter_heating_payment_properties.py @@ -50,7 +50,9 @@ # Ages either side of pensionable age (66 to 67 over these years) and of 80. PENSION_AGES = [67, 70, 79, 80, 85] AGES = [40, 60, *PENSION_AGES] -INCOMES = [5_000, 20_000, 50_000] +# 35,000 is the charge limit itself: ITEPA 2003 s.681I(1)(b) charges only +# total income that "exceeds £35,000". +INCOMES = [5_000, 20_000, 35_000, 50_000] AWARD = 1_000 # The benefit-unit award a couple can be on, and the input that carries it. AWARD_INPUTS = { @@ -336,7 +338,7 @@ def scheme(resident, relevant, means_test, amounts, partner_counts): else: # The model's stand-in for the winter fuel payment charge. wfp_means = country in ("ENGLAND", "WALES") and any( - p[0]["age"] >= 67 and p[0]["total_income"] < INCOME_LIMIT + p[0]["age"] >= 67 and p[0]["total_income"] <= INCOME_LIMIT for p in people ) # Only SI 2024/869 (reg 2(5)) counts the other member's benefit. diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.py index dbcaa96868..b23543c89a 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.py @@ -8,30 +8,18 @@ class household_benefits_individual_non_dep_deduction(Variable): definition_period = YEAR unit = GBP defined_for = "housing_benefit_individual_non_dep_deduction_eligible" - reference = ( - "https://www.legislation.gov.uk/uksi/2006/213/regulation/6", - "https://www.legislation.gov.uk/uksi/2006/213/regulation/74", - "https://www.legislation.gov.uk/uksi/2006/214/regulation/6", - "https://www.legislation.gov.uk/uksi/2006/214/regulation/55", - ) def formula(person, period, parameters): p = parameters(period).gov.dwp.housing_benefit.non_dep_deduction - # The gross-income bands apply only to a non-dependant "to whom - # paragraph (1)(a) applies because he is in remunerative work" (HB - # Regs 2006 reg 74(2); SPC Regs reg 55(2)). Anyone else takes the - # minimum deduction under reg 74(1)(b) / 55(1)(b), whatever their - # income. Remunerative work is at least 16 paid hours a week (reg - # 6(1) of both sets of Regulations). The first bracket of the table - # is the reg 74(1)(b) amount; reg 74(2)(a) also gives it to a worker - # whose income is below the first threshold, including zero. Reg - # 6(5)-(8) (absences, income-based benefit receipt, leave, sports - # awards) are not modelled. - in_remunerative_work = ( - person("weekly_hours", period) >= p.remunerative_work_hours + # Other investment income is left out of the band for now. These bands + # apply only to a non-dependant in remunerative work (HB Regs 2006 reg + # 74(2); SPC Regs reg 55(2)), and the model does not yet test that, so + # counting it would band non-workers whose only income is investment + # income. #2007 implements reg 74 in full and can then read + # total_income directly. + income = person("total_income", period) - person( + "other_investment_income", period ) - weekly_income = person("total_income", period) / WEEKS_IN_YEAR - minimum = p.amount.amounts[0] - banded = max_(p.amount.calc(weekly_income, right=True), minimum) - deduction = where(in_remunerative_work, banded, minimum) + weekly_income = income / WEEKS_IN_YEAR + deduction = p.amount.calc(weekly_income, right=True) return deduction * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_exempt.py b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_exempt.py deleted file mode 100644 index 1a36ba6dab..0000000000 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_exempt.py +++ /dev/null @@ -1,37 +0,0 @@ -from policyengine_uk.model_api import * - - -class housing_benefit_non_dep_deduction_exempt(Variable): - value_type = bool - entity = BenUnit - label = "No non-dependant deductions from this family's Housing Benefit" - documentation = ( - "Whether no deduction is made for any non-dependant from this " - "family's Housing Benefit because the claimant or partner is blind, " - "or receives Attendance Allowance, the care component of Disability " - "Living Allowance, the daily living component of Personal " - "Independence Payment or Armed Forces Independence Payment. The " - "Scottish equivalents listed in the regulation (Pension Age " - "Disability Payment, Child and Adult Disability Payment, Scottish " - "Adult Disability Living Allowance) are not modelled separately." - ) - definition_period = YEAR - reference = ( - "https://www.legislation.gov.uk/uksi/2006/213/regulation/74", - "https://www.legislation.gov.uk/uksi/2006/214/regulation/55", - ) - - def formula(benunit, period, parameters): - # HB Regs 2006 reg 74(6); SPC Regs 2006 reg 55(6): no deduction for - # any non-dependant if the claimant or partner is blind or receiving - # one of the listed benefits in respect of himself. - person = benunit.members - claimant_or_partner = person("is_claimant_or_partner", period) - exempting = ( - person("is_blind", period) - | (person("attendance_allowance", period) > 0) - | (person("pip_dl", period) > 0) - | (person("dla_sc", period) > 0) - | (person("armed_forces_independence_payment", period) > 0) - ) - return benunit.any(claimant_or_partner & exempting) diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.py b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.py index 69215e891f..e5e9e3a933 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deductions.py @@ -27,9 +27,4 @@ def formula(benunit, period, parameters): "household_benefits_individual_non_dep_deduction", period ) * person("is_non_dependant_of_household_head", period) share = benunit("share_of_household_rent", period) - # No deduction at all if the claimant or partner is blind or receives - # a listed disability benefit (reg 74(6); SPC reg 55(6)). The - # per-person exemptions in reg 74(7)-(8) (students, under-25s on - # income-based benefits, patients, armed forces) are not modelled. - exempt = benunit("housing_benefit_non_dep_deduction_exempt", period) - return where(exempt, 0, share * benunit.max(person.household.sum(deductions))) + return share * benunit.max(person.household.sum(deductions)) diff --git a/policyengine_uk/variables/gov/dwp/winter_fuel_payment_eligible.py b/policyengine_uk/variables/gov/dwp/winter_fuel_payment_eligible.py index ff957e3327..a4c3a9c9fd 100644 --- a/policyengine_uk/variables/gov/dwp/winter_fuel_payment_eligible.py +++ b/policyengine_uk/variables/gov/dwp/winter_fuel_payment_eligible.py @@ -54,10 +54,12 @@ def formula(person, period, parameters): "is_on_winter_fuel_payment_relevant_benefit", period ) income_test = p.taxable_income_test + # ITEPA 2003 s.681I(1)(b): the charge applies only where total income + # "exceeds £35,000", so a person with exactly £35,000 keeps the payment. meets_income_test = ( person.household.any( age_eligible - & (person("total_income", period) < income_test.maximum_taxable_income) + & (person("total_income", period) <= income_test.maximum_taxable_income) ) & np.isin(country, ["ENGLAND", "WALES"]) & income_test.use_maximum_taxable_income diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.py index 102c093f63..64458e2319 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.py @@ -11,5 +11,12 @@ class council_tax_reduction_individual_non_dep_deduction(Variable): def formula(person, period, parameters): p = parameters(period).gov.dwp.housing_benefit.non_dep_deduction - weekly_total_income = person("total_income", period) / WEEKS_IN_YEAR + # Other investment income is left out of the band for now, as in + # household_benefits_individual_non_dep_deduction: the bands apply only + # to a non-dependant in remunerative work (SI 2012/2885 Sch 1 para + # 8(2)), which this formula does not yet test (#2007). + income = person("total_income", period) - person( + "other_investment_income", period + ) + weekly_total_income = income / WEEKS_IN_YEAR return p.amount.calc(weekly_total_income, right=True) * WEEKS_IN_YEAR