From 9d1790ddc61f1e31f19c8d00aeddf3e5f560e03b Mon Sep 17 00:00:00 2001 From: Anthony Volk <14987227+anth-volk@users.noreply.github.com> Date: Fri, 9 Oct 2026 04:30:28 +0400 Subject: [PATCH 1/2] Exclude disregarded income from Housing Benefit assessment --- changelog.d/hb-income-exclusions.fixed.md | 1 + .../housing_benefit_income_exclusions.yaml | 345 ++++++++++++++++++ .../housing_benefit_applicable_income.py | 21 +- 3 files changed, 358 insertions(+), 9 deletions(-) create mode 100644 changelog.d/hb-income-exclusions.fixed.md create mode 100644 policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_income_exclusions.yaml diff --git a/changelog.d/hb-income-exclusions.fixed.md b/changelog.d/hb-income-exclusions.fixed.md new file mode 100644 index 0000000000..b20caa7ee1 --- /dev/null +++ b/changelog.d/hb-income-exclusions.fixed.md @@ -0,0 +1 @@ +- Excluded Child Benefit, Sure Start Maternity Grants and dependent children's own income from the ordinary Housing Benefit income assessment. diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_income_exclusions.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_income_exclusions.yaml new file mode 100644 index 0000000000..3d3783a8c4 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_income_exclusions.yaml @@ -0,0 +1,345 @@ +# GB Sch 5 paras 31/65 and reg 25(3); NI Sch 6 paras 32/64 and reg 22(3). + +- name: ENGLAND working-age excludes Child Benefit, Social Fund and dependent earnings + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 40 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + child: + age: 17 + is_claimant_or_partner: false + is_child_or_young_person_for_legacy_benefits: true + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, child] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: false + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, child] + country: ENGLAND + output: + housing_benefit_applicable_income: 12000 + +- name: ENGLAND working-age counts partner income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 40 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + partner: + age: 40 + is_claimant_or_partner: true + is_child_or_young_person_for_legacy_benefits: false + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, partner] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: false + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, partner] + country: ENGLAND + output: + housing_benefit_applicable_income: 22400 + +- name: ENGLAND pension-age excludes Child Benefit, Social Fund and dependent earnings + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 75 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + child: + age: 17 + is_claimant_or_partner: false + is_child_or_young_person_for_legacy_benefits: true + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, child] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: true + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, child] + country: ENGLAND + output: + housing_benefit_applicable_income: 12000 + +- name: ENGLAND pension-age counts partner income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 75 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + partner: + age: 40 + is_claimant_or_partner: true + is_child_or_young_person_for_legacy_benefits: false + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, partner] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: true + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, partner] + country: ENGLAND + output: + housing_benefit_applicable_income: 22400 + +- name: NORTHERN_IRELAND working-age excludes Child Benefit, Social Fund and dependent earnings + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 40 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + child: + age: 17 + is_claimant_or_partner: false + is_child_or_young_person_for_legacy_benefits: true + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, child] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: false + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, child] + country: NORTHERN_IRELAND + output: + housing_benefit_applicable_income: 12000 + +- name: NORTHERN_IRELAND working-age counts partner income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 40 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + partner: + age: 40 + is_claimant_or_partner: true + is_child_or_young_person_for_legacy_benefits: false + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, partner] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: false + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, partner] + country: NORTHERN_IRELAND + output: + housing_benefit_applicable_income: 22400 + +- name: NORTHERN_IRELAND pension-age excludes Child Benefit, Social Fund and dependent earnings + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 75 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + child: + age: 17 + is_claimant_or_partner: false + is_child_or_young_person_for_legacy_benefits: true + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, child] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: true + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, child] + country: NORTHERN_IRELAND + output: + housing_benefit_applicable_income: 12000 + +- name: NORTHERN_IRELAND pension-age counts partner income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 75 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + partner: + age: 40 + is_claimant_or_partner: true + is_child_or_young_person_for_legacy_benefits: false + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, partner] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: true + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, partner] + country: NORTHERN_IRELAND + output: + housing_benefit_applicable_income: 22400 diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py index 5496bc0a06..4f9e72ca84 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py @@ -18,6 +18,15 @@ class housing_benefit_applicable_income(Variable): "income under the Housing Benefit rules." ) reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/regulation/25", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/5/paragraph/65", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/5/paragraph/31", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/23", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/29", + "https://www.legislation.gov.uk/nisr/2006/405/regulation/22", + "https://www.legislation.gov.uk/nisr/2006/405/schedule/6/paragraph/64", + "https://www.legislation.gov.uk/nisr/2006/405/schedule/6/paragraph/32", + "https://www.legislation.gov.uk/nisr/2006/406/regulation/27", "https://www.legislation.gov.uk/uksi/2006/213/schedule/5/paragraph/4", "https://www.legislation.gov.uk/nisr/2006/405/schedule/6/paragraph/4", "https://www.legislation.gov.uk/uksi/2006/213/regulation/2", @@ -31,19 +40,14 @@ class housing_benefit_applicable_income(Variable): unit = GBP def formula(benunit, period, parameters): - # Members whose income counts: the claimant and partner and, as the model did - # before, the programme's own children or young persons. The regulations count - # only the claimant's and partner's (HB Regs 2006 reg 25); dropping dependants' - # own income is a follow-up. Anyone else in the benefit unit does not count. + # HB reg 25(3), pension-age reg 23(3) and NI reg 22(3) exclude + # dependent children's own income, even when they share this benefit unit. person = benunit.members - members = person("is_claimant_or_partner", period) | person( - "is_child_or_young_person_for_legacy_benefits", period - ) + members = person("is_claimant_or_partner", period) pension_age_regulations = benunit( "housing_benefit_pension_age_regulations_apply", period ) BENUNIT_MEANS_TESTED_BENEFITS = [ - "child_benefit", "income_support", "jsa_income", "esa_income", @@ -61,7 +65,6 @@ def formula(benunit, period, parameters): "maternity_allowance", "statutory_sick_pay", "statutory_maternity_pay", - "ssmg", ] INCOME_COMPONENTS = [ "employment_income", From d91378be94d5678e4ac40cda5ead37fd3344106e Mon Sep 17 00:00:00 2001 From: Anthony Volk <14987227+anth-volk@users.noreply.github.com> Date: Fri, 9 Oct 2026 17:06:41 +0400 Subject: [PATCH 2/2] Share pre-deduction Housing Benefit income and consolidate regression tests --- .../housing_benefit_applicable_income.yaml | 350 +++++++++++++++++- .../housing_benefit_income_exclusions.yaml | 345 ----------------- .../housing_benefit_applicable_income.py | 117 +++--- 3 files changed, 407 insertions(+), 405 deletions(-) delete mode 100644 policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_income_exclusions.yaml diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income.yaml index f5218d1b0b..064b3a21b1 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income.yaml @@ -23,7 +23,7 @@ output: housing_benefit_applicable_income: 0 -- name: Baseline inputs +- name: Child Benefit is fully disregarded period: 2025 input: would_claim_uc: false # not on Universal Credit, which passports the means test @@ -46,7 +46,7 @@ housing_benefit_applicable_income_disregard: 0 housing_benefit_applicable_income_childcare_element: 0 output: - housing_benefit_applicable_income: 1_000 + housing_benefit_applicable_income: 0 - name: Pension contributions halved # SI 2006/213 reg 36(3)(b): half of the pension contributions come off @@ -127,3 +127,349 @@ housing_benefit_applicable_income_childcare_element: 0 output: housing_benefit_applicable_income: 0 + +# GB Sch 5 paras 31/65 and reg 25(3); NI Sch 6 paras 32/64 and reg 22(3). + +- name: ENGLAND working-age excludes Child Benefit, Social Fund and dependent earnings + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 40 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + child: + age: 17 + is_claimant_or_partner: false + is_child_or_young_person_for_legacy_benefits: true + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, child] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: false + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, child] + country: ENGLAND + output: + housing_benefit_applicable_income: 12000 + +- name: ENGLAND working-age counts partner income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 40 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + partner: + age: 40 + is_claimant_or_partner: true + is_child_or_young_person_for_legacy_benefits: false + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, partner] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: false + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, partner] + country: ENGLAND + output: + housing_benefit_applicable_income: 22400 + +- name: ENGLAND pension-age excludes Child Benefit, Social Fund and dependent earnings + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 75 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + child: + age: 17 + is_claimant_or_partner: false + is_child_or_young_person_for_legacy_benefits: true + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, child] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: true + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, child] + country: ENGLAND + output: + housing_benefit_applicable_income: 12000 + +- name: ENGLAND pension-age counts partner income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 75 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + partner: + age: 40 + is_claimant_or_partner: true + is_child_or_young_person_for_legacy_benefits: false + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, partner] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: true + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, partner] + country: ENGLAND + output: + housing_benefit_applicable_income: 22400 + +- name: NORTHERN_IRELAND working-age excludes Child Benefit, Social Fund and dependent earnings + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 40 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + child: + age: 17 + is_claimant_or_partner: false + is_child_or_young_person_for_legacy_benefits: true + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, child] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: false + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, child] + country: NORTHERN_IRELAND + output: + housing_benefit_applicable_income: 12000 + +- name: NORTHERN_IRELAND working-age counts partner income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 40 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + partner: + age: 40 + is_claimant_or_partner: true + is_child_or_young_person_for_legacy_benefits: false + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, partner] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: false + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, partner] + country: NORTHERN_IRELAND + output: + housing_benefit_applicable_income: 22400 + +- name: NORTHERN_IRELAND pension-age excludes Child Benefit, Social Fund and dependent earnings + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 75 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + child: + age: 17 + is_claimant_or_partner: false + is_child_or_young_person_for_legacy_benefits: true + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, child] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: true + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, child] + country: NORTHERN_IRELAND + output: + housing_benefit_applicable_income: 12000 + +- name: NORTHERN_IRELAND pension-age counts partner income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 75 + is_claimant_or_partner: true + private_pension_income: 12000 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + ssmg: 500 + partner: + age: 40 + is_claimant_or_partner: true + is_child_or_young_person_for_legacy_benefits: false + employment_income: 10400 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + family: + members: [claimant, partner] + child_benefit: 1500 + income_support: 0 + esa_income: 0 + jsa_income: 0 + tax_credits: 0 + housing_benefit_pension_age_regulations_apply: true + in_receipt_of_guarantee_credit: false + in_receipt_of_savings_credit_only: false + housing_benefit_on_passporting_benefit: false + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + households: + home: + members: [claimant, partner] + country: NORTHERN_IRELAND + output: + housing_benefit_applicable_income: 22400 diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_income_exclusions.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_income_exclusions.yaml deleted file mode 100644 index 3d3783a8c4..0000000000 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_income_exclusions.yaml +++ /dev/null @@ -1,345 +0,0 @@ -# GB Sch 5 paras 31/65 and reg 25(3); NI Sch 6 paras 32/64 and reg 22(3). - -- name: ENGLAND working-age excludes Child Benefit, Social Fund and dependent earnings - period: 2025 - absolute_error_margin: 0.01 - input: - people: - claimant: - age: 40 - is_claimant_or_partner: true - private_pension_income: 12000 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - ssmg: 500 - child: - age: 17 - is_claimant_or_partner: false - is_child_or_young_person_for_legacy_benefits: true - employment_income: 10400 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - benunits: - family: - members: [claimant, child] - child_benefit: 1500 - income_support: 0 - esa_income: 0 - jsa_income: 0 - tax_credits: 0 - housing_benefit_pension_age_regulations_apply: false - in_receipt_of_guarantee_credit: false - in_receipt_of_savings_credit_only: false - housing_benefit_on_passporting_benefit: false - housing_benefit_tariff_income: 0 - housing_benefit_applicable_income_disregard: 0 - housing_benefit_applicable_income_childcare_element: 0 - households: - home: - members: [claimant, child] - country: ENGLAND - output: - housing_benefit_applicable_income: 12000 - -- name: ENGLAND working-age counts partner income - period: 2025 - absolute_error_margin: 0.01 - input: - people: - claimant: - age: 40 - is_claimant_or_partner: true - private_pension_income: 12000 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - ssmg: 500 - partner: - age: 40 - is_claimant_or_partner: true - is_child_or_young_person_for_legacy_benefits: false - employment_income: 10400 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - benunits: - family: - members: [claimant, partner] - child_benefit: 1500 - income_support: 0 - esa_income: 0 - jsa_income: 0 - tax_credits: 0 - housing_benefit_pension_age_regulations_apply: false - in_receipt_of_guarantee_credit: false - in_receipt_of_savings_credit_only: false - housing_benefit_on_passporting_benefit: false - housing_benefit_tariff_income: 0 - housing_benefit_applicable_income_disregard: 0 - housing_benefit_applicable_income_childcare_element: 0 - households: - home: - members: [claimant, partner] - country: ENGLAND - output: - housing_benefit_applicable_income: 22400 - -- name: ENGLAND pension-age excludes Child Benefit, Social Fund and dependent earnings - period: 2025 - absolute_error_margin: 0.01 - input: - people: - claimant: - age: 75 - is_claimant_or_partner: true - private_pension_income: 12000 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - ssmg: 500 - child: - age: 17 - is_claimant_or_partner: false - is_child_or_young_person_for_legacy_benefits: true - employment_income: 10400 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - benunits: - family: - members: [claimant, child] - child_benefit: 1500 - income_support: 0 - esa_income: 0 - jsa_income: 0 - tax_credits: 0 - housing_benefit_pension_age_regulations_apply: true - in_receipt_of_guarantee_credit: false - in_receipt_of_savings_credit_only: false - housing_benefit_on_passporting_benefit: false - housing_benefit_tariff_income: 0 - housing_benefit_applicable_income_disregard: 0 - housing_benefit_applicable_income_childcare_element: 0 - households: - home: - members: [claimant, child] - country: ENGLAND - output: - housing_benefit_applicable_income: 12000 - -- name: ENGLAND pension-age counts partner income - period: 2025 - absolute_error_margin: 0.01 - input: - people: - claimant: - age: 75 - is_claimant_or_partner: true - private_pension_income: 12000 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - ssmg: 500 - partner: - age: 40 - is_claimant_or_partner: true - is_child_or_young_person_for_legacy_benefits: false - employment_income: 10400 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - benunits: - family: - members: [claimant, partner] - child_benefit: 1500 - income_support: 0 - esa_income: 0 - jsa_income: 0 - tax_credits: 0 - housing_benefit_pension_age_regulations_apply: true - in_receipt_of_guarantee_credit: false - in_receipt_of_savings_credit_only: false - housing_benefit_on_passporting_benefit: false - housing_benefit_tariff_income: 0 - housing_benefit_applicable_income_disregard: 0 - housing_benefit_applicable_income_childcare_element: 0 - households: - home: - members: [claimant, partner] - country: ENGLAND - output: - housing_benefit_applicable_income: 22400 - -- name: NORTHERN_IRELAND working-age excludes Child Benefit, Social Fund and dependent earnings - period: 2025 - absolute_error_margin: 0.01 - input: - people: - claimant: - age: 40 - is_claimant_or_partner: true - private_pension_income: 12000 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - ssmg: 500 - child: - age: 17 - is_claimant_or_partner: false - is_child_or_young_person_for_legacy_benefits: true - employment_income: 10400 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - benunits: - family: - members: [claimant, child] - child_benefit: 1500 - income_support: 0 - esa_income: 0 - jsa_income: 0 - tax_credits: 0 - housing_benefit_pension_age_regulations_apply: false - in_receipt_of_guarantee_credit: false - in_receipt_of_savings_credit_only: false - housing_benefit_on_passporting_benefit: false - housing_benefit_tariff_income: 0 - housing_benefit_applicable_income_disregard: 0 - housing_benefit_applicable_income_childcare_element: 0 - households: - home: - members: [claimant, child] - country: NORTHERN_IRELAND - output: - housing_benefit_applicable_income: 12000 - -- name: NORTHERN_IRELAND working-age counts partner income - period: 2025 - absolute_error_margin: 0.01 - input: - people: - claimant: - age: 40 - is_claimant_or_partner: true - private_pension_income: 12000 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - ssmg: 500 - partner: - age: 40 - is_claimant_or_partner: true - is_child_or_young_person_for_legacy_benefits: false - employment_income: 10400 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - benunits: - family: - members: [claimant, partner] - child_benefit: 1500 - income_support: 0 - esa_income: 0 - jsa_income: 0 - tax_credits: 0 - housing_benefit_pension_age_regulations_apply: false - in_receipt_of_guarantee_credit: false - in_receipt_of_savings_credit_only: false - housing_benefit_on_passporting_benefit: false - housing_benefit_tariff_income: 0 - housing_benefit_applicable_income_disregard: 0 - housing_benefit_applicable_income_childcare_element: 0 - households: - home: - members: [claimant, partner] - country: NORTHERN_IRELAND - output: - housing_benefit_applicable_income: 22400 - -- name: NORTHERN_IRELAND pension-age excludes Child Benefit, Social Fund and dependent earnings - period: 2025 - absolute_error_margin: 0.01 - input: - people: - claimant: - age: 75 - is_claimant_or_partner: true - private_pension_income: 12000 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - ssmg: 500 - child: - age: 17 - is_claimant_or_partner: false - is_child_or_young_person_for_legacy_benefits: true - employment_income: 10400 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - benunits: - family: - members: [claimant, child] - child_benefit: 1500 - income_support: 0 - esa_income: 0 - jsa_income: 0 - tax_credits: 0 - housing_benefit_pension_age_regulations_apply: true - in_receipt_of_guarantee_credit: false - in_receipt_of_savings_credit_only: false - housing_benefit_on_passporting_benefit: false - housing_benefit_tariff_income: 0 - housing_benefit_applicable_income_disregard: 0 - housing_benefit_applicable_income_childcare_element: 0 - households: - home: - members: [claimant, child] - country: NORTHERN_IRELAND - output: - housing_benefit_applicable_income: 12000 - -- name: NORTHERN_IRELAND pension-age counts partner income - period: 2025 - absolute_error_margin: 0.01 - input: - people: - claimant: - age: 75 - is_claimant_or_partner: true - private_pension_income: 12000 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - ssmg: 500 - partner: - age: 40 - is_claimant_or_partner: true - is_child_or_young_person_for_legacy_benefits: false - employment_income: 10400 - income_tax: 0 - national_insurance: 0 - pension_contributions: 0 - benunits: - family: - members: [claimant, partner] - child_benefit: 1500 - income_support: 0 - esa_income: 0 - jsa_income: 0 - tax_credits: 0 - housing_benefit_pension_age_regulations_apply: true - in_receipt_of_guarantee_credit: false - in_receipt_of_savings_credit_only: false - housing_benefit_on_passporting_benefit: false - housing_benefit_tariff_income: 0 - housing_benefit_applicable_income_disregard: 0 - housing_benefit_applicable_income_childcare_element: 0 - households: - home: - members: [claimant, partner] - country: NORTHERN_IRELAND - output: - housing_benefit_applicable_income: 22400 diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py index 4f9e72ca84..9363f7fa57 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py @@ -1,6 +1,61 @@ from policyengine_uk.model_api import * +def hb_income_before_deductions(benunit, period, parameters): + """Existing ordinary income, before childcare/disregards and the income floor.""" + # HB reg 25(3), pension-age reg 23(3) and NI reg 22(3) exclude + # dependent children's own income, even when they share this benefit unit. + person = benunit.members + members = person("is_claimant_or_partner", period) + BENUNIT_MEANS_TESTED_BENEFITS = [ + "income_support", + "jsa_income", + "esa_income", + ] + PERSONAL_BENEFITS = [ + "carers_allowance", + # The Carer Support Payment component only: the Scottish Carer + # Supplement is disregarded (HB Regs 2006 Sch 5 para 75; HB (SPC) + # Regs 2006 reg 29(1)(j)(xviiha)), so scottish_carer_supplement is + # not listed. + "carer_support_payment", + "esa_contrib", + "jsa_contrib", + "state_pension", + "maternity_allowance", + "statutory_sick_pay", + "statutory_maternity_pay", + ] + INCOME_COMPONENTS = [ + "employment_income", + "self_employment_income", + "property_income_after_finance_costs", + "private_pension_income", + ] + bi = parameters(period).gov.contrib.ubi_center.basic_income + # Add personal benefits, credits and total benefits to income + benefits = add_for_members(benunit, period, BENUNIT_MEANS_TESTED_BENEFITS, members) + income = add_for_members(benunit, period, INCOME_COMPONENTS, members) + personal_benefits = add_for_members(benunit, period, PERSONAL_BENEFITS, members) + credits = add_for_members(benunit, period, ["tax_credits"], members) + increased_income = income + personal_benefits + credits + benefits + + if not bi.interactions.include_in_means_tests: + # Basic income is already in personal benefits, deduct if needed + increased_income -= add_for_members(benunit, period, ["basic_income"], members) + # Reduce increased income by pension contributions and tax + pension_contributions = ( + add_for_members(benunit, period, ["pension_contributions"], members) * 0.5 + ) + TAX_COMPONENTS = ["income_tax", "national_insurance"] + tax = add_for_members(benunit, period, TAX_COMPONENTS, members) + increased_income_reduced_by_tax_and_pensions = ( + increased_income - tax - pension_contributions + ) + tariff_income = benunit("housing_benefit_tariff_income", period) + return increased_income_reduced_by_tax_and_pensions + tariff_income + + class housing_benefit_applicable_income(Variable): value_type = float entity = BenUnit @@ -40,73 +95,19 @@ class housing_benefit_applicable_income(Variable): unit = GBP def formula(benunit, period, parameters): - # HB reg 25(3), pension-age reg 23(3) and NI reg 22(3) exclude - # dependent children's own income, even when they share this benefit unit. - person = benunit.members - members = person("is_claimant_or_partner", period) + income_before_deductions = hb_income_before_deductions( + benunit, period, parameters + ) pension_age_regulations = benunit( "housing_benefit_pension_age_regulations_apply", period ) - BENUNIT_MEANS_TESTED_BENEFITS = [ - "income_support", - "jsa_income", - "esa_income", - ] - PERSONAL_BENEFITS = [ - "carers_allowance", - # The Carer Support Payment component only: the Scottish Carer - # Supplement is disregarded (HB Regs 2006 Sch 5 para 75; HB (SPC) - # Regs 2006 reg 29(1)(j)(xviiha)), so scottish_carer_supplement is - # not listed. - "carer_support_payment", - "esa_contrib", - "jsa_contrib", - "state_pension", - "maternity_allowance", - "statutory_sick_pay", - "statutory_maternity_pay", - ] - INCOME_COMPONENTS = [ - "employment_income", - "self_employment_income", - "property_income_after_finance_costs", - "private_pension_income", - ] - bi = parameters(period).gov.contrib.ubi_center.basic_income - # Add personal benefits, credits and total benefits to income - benefits = add_for_members( - benunit, period, BENUNIT_MEANS_TESTED_BENEFITS, members - ) - income = add_for_members(benunit, period, INCOME_COMPONENTS, members) - personal_benefits = add_for_members(benunit, period, PERSONAL_BENEFITS, members) - credits = add_for_members(benunit, period, ["tax_credits"], members) - increased_income = income + personal_benefits + credits + benefits - - if not bi.interactions.include_in_means_tests: - # Basic income is already in personal benefits, deduct if needed - increased_income -= add_for_members( - benunit, period, ["basic_income"], members - ) - # Reduce increased income by pension contributions and tax - pension_contributions = ( - add_for_members(benunit, period, ["pension_contributions"], members) * 0.5 - ) - TAX_COMPONENTS = ["income_tax", "national_insurance"] - tax = add_for_members(benunit, period, TAX_COMPONENTS, members) - increased_income_reduced_by_tax_and_pensions = ( - increased_income - tax - pension_contributions - ) - tariff_income = benunit("housing_benefit_tariff_income", period) disregard = benunit("housing_benefit_applicable_income_disregard", period) childcare_element = benunit( "housing_benefit_applicable_income_childcare_element", period ) income_under_general_rules = max_( 0, - increased_income_reduced_by_tax_and_pensions - + tariff_income - - disregard - - childcare_element, + income_before_deductions - disregard - childcare_element, ) # SI 2006/214 reg 27 (NI: SR 2006/406 reg 25): where the award of # Pension Credit is savings credit only, the Secretary of State's