diff --git a/changelog.d/hb-permitted-work.added.md b/changelog.d/hb-permitted-work.added.md new file mode 100644 index 0000000000..1af493ef74 --- /dev/null +++ b/changelog.d/hb-permitted-work.added.md @@ -0,0 +1 @@ +Added a pre-assessed Housing Benefit permitted-work earnings disregard with lone-parent precedence and separate additional-disregard handling. diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_permitted_work.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_permitted_work.yaml new file mode 100644 index 0000000000..fc286a9b1c --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_permitted_work.yaml @@ -0,0 +1,751 @@ +- name: Permitted work replaces rather than maximises the special standard amount + period: 2024 + input: + housing_benefit_special_earnings_disregard_eligible: true + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 500 + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + is_lone_parent: false + is_couple: false + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 500 + +- name: ENGLAND pension regime false ordinary fallback + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 260 + +- name: ENGLAND pension regime false replacement not stacking + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2000 + +- name: ENGLAND pension regime false lone parent precedence + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 1040 + is_lone_parent: true + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 1300 + +- name: ENGLAND pension regime false net earnings cap + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 500 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 500 + +- name: ENGLAND pension regime false additional still applies + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2889.2 + +- name: ENGLAND pension regime false additional earnings boundary + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 2889.19 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2000 + +- name: ENGLAND pension regime false additional exact equality + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 2889.2 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2889.2 + +- name: ENGLAND pension regime true ordinary fallback + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 260 + +- name: ENGLAND pension regime true replacement not stacking + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2000 + +- name: ENGLAND pension regime true lone parent precedence + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 1040 + is_lone_parent: true + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 1300 + +- name: ENGLAND pension regime true net earnings cap + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 500 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 500 + +- name: ENGLAND pension regime true additional still applies + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2889.2 + +- name: ENGLAND pension regime true additional earnings boundary + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 2889.19 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2000 + +- name: ENGLAND pension regime true additional exact equality + period: 2024 + absolute_error_margin: 0.01 + input: + country: ENGLAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 2889.2 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2889.2 + +- name: NORTHERN_IRELAND pension regime false ordinary fallback + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 260 + +- name: NORTHERN_IRELAND pension regime false replacement not stacking + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2000 + +- name: NORTHERN_IRELAND pension regime false lone parent precedence + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 1040 + is_lone_parent: true + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 1300 + +- name: NORTHERN_IRELAND pension regime false net earnings cap + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 500 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 500 + +- name: NORTHERN_IRELAND pension regime false additional still applies + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2889.2 + +- name: NORTHERN_IRELAND pension regime false additional earnings boundary + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 2889.19 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2000 + +- name: NORTHERN_IRELAND pension regime false additional exact equality + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: false + housing_benefit_net_earnings: 2889.2 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2889.2 + +- name: NORTHERN_IRELAND pension regime true ordinary fallback + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 260 + +- name: NORTHERN_IRELAND pension regime true replacement not stacking + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2000 + +- name: NORTHERN_IRELAND pension regime true lone parent precedence + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 1040 + is_lone_parent: true + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 1300 + +- name: NORTHERN_IRELAND pension regime true net earnings cap + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 500 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 500 + +- name: NORTHERN_IRELAND pension regime true additional still applies + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2889.2 + +- name: NORTHERN_IRELAND pension regime true additional earnings boundary + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 2889.19 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2000 + +- name: NORTHERN_IRELAND pension regime true additional exact equality + period: 2024 + absolute_error_margin: 0.01 + input: + country: NORTHERN_IRELAND + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 2889.2 + housing_benefit_permitted_work_disregard: 2000 + is_lone_parent: false + is_couple: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2889.2 + +- name: Permitted work stacks only with separate accommodation amount + period: 2027 + input: + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + housing_benefit_specified_or_temporary_accommodation_disregard: 1000 + housing_benefit_applicable_income_childcare_element: 0 + is_lone_parent: false + is_couple: true + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 3000 + +- name: A reform of the lone parent amount retains precedence + period: 2024 + input: + gov.dwp.housing_benefit.means_test.income_disregard.lone_parent: 50 + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + is_lone_parent: true + is_couple: false + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + output: + housing_benefit_applicable_income_disregard: 2600 + +- name: Passport still disregards all earnings + period: 2024 + input: + housing_benefit_net_earnings: 5000 + housing_benefit_permitted_work_disregard: 2000 + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + is_lone_parent: false + is_couple: false + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: true + output: + housing_benefit_applicable_income_disregard: 5000 + +# The cases below derive special eligibility from severe disablement +# allowance or blindness (housing_benefit_special_earnings_disregard_eligible) +# instead of supplying it, and add a lone parent at the permitted-work +# maximum. Each holds the accommodation, childcare, additional-disregard and +# passport terms at nil, so the output is the standard amount alone. +# +# Specified amount, 2024-25: ESA Regulations 2008 reg 45(4) (NI: SR 2008/280 +# reg 45(4)) and SI 1995/311 reg 17(4) set the limit at 16 x National Minimum +# Wage, rounded up to the next 50p (reg 45(9A), reg 17(10)). The adult rate +# in gov.hmrc.minimum_wage.non_apprentice is £11.44, and +# gov.dwp.ESA.exempt_work.higher_earnings_limit_minimum_wage_hours is 16: +# 16 x £11.44 = £183.04, rounded up to £183.50 a week. +# +# Couples: A does that exempt work for £60 a week, under 16 hours; B, the +# other member, earns £100 a week from other work and does no exempt work. +# Pension-age para 5A(4) (working-age para 10A(4)): A's £60 is under £183.50, +# so B's earnings are also disregarded up to £183.50 - £60 = £123.50, but at +# most £20. Pre-assessed permitted-work amount: (£60 + £20) x 52 = £4,160. +# Net earnings: (£60 + £100) x 52 = £8,320. +# +# Special amount before permitted work: £20 x 52 = £1,040, in place of the +# couple's £10. Para 5A(2): "paragraphs 1 to 5 and 7 do not apply", so the +# disregard is £4,160, not £4,160 + £1,040 = £5,200 and not £1,040. + +# SI 2006/214 Sch 4. The claimant (A, 70) receives severe disablement +# allowance (para 5A(5)(c)) and does exempt work under SI 1995/311 reg 17(4) +# (para 5A(6)(b)). The SDA qualifies the couple for £20 (para 5(1)(a)(ii)). +- name: ENGLAND pension-age SDA recipient's permitted work replaces the special £20 + period: 2024 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_claimant_or_partner: true + sda: 100 + partner: + age: 68 + is_claimant_or_partner: true + sda: 0 + benunits: + couple: + members: [claimant, partner] + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 8320 + housing_benefit_permitted_work_disregard: 4160 + carer_premium: 0 + working_tax_credit: 0 + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + households: + household: + members: [claimant, partner] + country: ENGLAND + output: + is_couple: true + is_lone_parent: false + housing_benefit_special_earnings_disregard_eligible: true + housing_benefit_special_earnings_disregard: 1040 + housing_benefit_applicable_income_disregard: 4160 + +# SR 2006/406 Sch 5, the same facts: SDA (para 5A(5)(c)) and the special +# £20 (para 5(1)(a)(ii)). The NI exempt work is under SR 1995/41 reg 17(4) +# (para 5A(6)(b)). Its revised text on legislation.gov.uk still lists +# unapplied amendments, so the £183.50 limit was not checked against that +# text; the £4,160 input is the pre-assessed amount the case supplies. +- name: NORTHERN_IRELAND pension-age SDA recipient's permitted work replaces the special £20 + period: 2024 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_claimant_or_partner: true + sda: 100 + partner: + age: 68 + is_claimant_or_partner: true + sda: 0 + benunits: + couple: + members: [claimant, partner] + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 8320 + housing_benefit_permitted_work_disregard: 4160 + carer_premium: 0 + working_tax_credit: 0 + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + households: + household: + members: [claimant, partner] + country: NORTHERN_IRELAND + output: + is_couple: true + is_lone_parent: false + housing_benefit_special_earnings_disregard_eligible: true + housing_benefit_special_earnings_disregard: 1040 + housing_benefit_applicable_income_disregard: 4160 + +# SI 2006/214 Sch 4. The claimant (B, 70) is certified blind, which +# qualifies the couple for £20 (para 5(1)(b)), and earns £100 a week. The +# partner (A, 63, under State Pension age) receives contributory ESA (para +# 5A(5)(a)) and does exempt work under ESA Regulations 2008 reg 45(4) (para +# 5A(6)(a)). Neither receives SDA, so blindness is the only special route. +- name: ENGLAND pension-age blind claimant with a partner in permitted work has no stacked £20 + period: 2024 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_claimant_or_partner: true + is_blind: true + sda: 0 + partner: + age: 63 + is_claimant_or_partner: true + is_blind: false + sda: 0 + benunits: + couple: + members: [claimant, partner] + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 8320 + housing_benefit_permitted_work_disregard: 4160 + carer_premium: 0 + working_tax_credit: 0 + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + households: + household: + members: [claimant, partner] + country: ENGLAND + output: + is_couple: true + is_lone_parent: false + housing_benefit_special_earnings_disregard_eligible: true + housing_benefit_special_earnings_disregard: 1040 + housing_benefit_applicable_income_disregard: 4160 + +# SR 2006/406 Sch 5, the same facts: blindness (para 5(1)(b)); the partner's +# contributory ESA (para 5A(5)(a)) and exempt work under SR 2008/280 reg +# 45(4) (para 5A(6)(a)), whose limit is also 16 x National Minimum Wage, +# rounded up under its reg 45(9A). +- name: NORTHERN_IRELAND pension-age blind claimant with a partner in permitted work has no stacked £20 + period: 2024 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_claimant_or_partner: true + is_blind: true + sda: 0 + partner: + age: 63 + is_claimant_or_partner: true + is_blind: false + sda: 0 + benunits: + couple: + members: [claimant, partner] + housing_benefit_pension_age_regulations_apply: true + housing_benefit_net_earnings: 8320 + housing_benefit_permitted_work_disregard: 4160 + carer_premium: 0 + working_tax_credit: 0 + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + housing_benefit_applicable_income_childcare_element: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + households: + household: + members: [claimant, partner] + country: NORTHERN_IRELAND + output: + is_couple: true + is_lone_parent: false + housing_benefit_special_earnings_disregard_eligible: true + housing_benefit_special_earnings_disregard: 1040 + housing_benefit_applicable_income_disregard: 4160 + +# Lone parent at the permitted-work maximum, working age: SI 2006/213 Sch 4 +# (England) and SR 2006/405 Sch 5 (NI). The lone parent receives +# contributory ESA (para 10A(5)(a)) and earns only from exempt work under +# reg 45(4), at its £183.50 limit: the specified amount is £183.50 x 52 = +# £9,542 (para 10A(7)). Para 10A(2): £183.50 is not less than para 4's £25, +# so para 4 does not apply instead, and the selected £25 x 52 = £1,300 gives +# way to the permitted-work amount whether or not the family is otherwise +# special-eligible. Earning exactly the limit, all £9,542 is disregarded +# (columns 1 and 3). Where net earnings are £9,282 (£178.50 a week), the +# disregard is capped at them (columns 2 and 4). +- name: Lone parent at the permitted-work maximum has the specified amount, capped at net earnings + period: 2024 + absolute_error_margin: 0.01 + input: + country: [ENGLAND, ENGLAND, NORTHERN_IRELAND, NORTHERN_IRELAND] + housing_benefit_pension_age_regulations_apply: [false, false, false, false] + housing_benefit_special_earnings_disregard_eligible: [true, false, true, false] + housing_benefit_net_earnings: [9542, 9282, 9542, 9282] + housing_benefit_permitted_work_disregard: [9542, 9542, 9542, 9542] + is_lone_parent: [true, true, true, true] + is_couple: [false, false, false, false] + housing_benefit_specified_or_temporary_accommodation_disregard: [0, 0, 0, 0] + housing_benefit_applicable_income_childcare_element: [0, 0, 0, 0] + meets_housing_benefit_additional_earnings_disregard_conditions: [false, false, false, false] + housing_benefit_on_passporting_benefit: [false, false, false, false] + output: + housing_benefit_special_earnings_disregard: [1300, 1300, 1300, 1300] + housing_benefit_applicable_income_disregard: [9542, 9282, 9542, 9282] diff --git a/policyengine_uk/tests/test_housing_benefit_earnings_disregard_properties.py b/policyengine_uk/tests/test_housing_benefit_earnings_disregard_properties.py index ce2b185f9e..34a3c4a973 100644 --- a/policyengine_uk/tests/test_housing_benefit_earnings_disregard_properties.py +++ b/policyengine_uk/tests/test_housing_benefit_earnings_disregard_properties.py @@ -45,7 +45,13 @@ 8. The selected standard is min(net earnings, 52 times the statutory weekly choice), with £25 lone-parent precedence, then £20 special, then £10 couple, then £5 single. These amounts never stack and the selected - standard stays between zero and net earnings. + standard stays between zero and net earnings. It is the amount before + permitted work, whatever the permitted-work input. With a pre-assessed + permitted-work amount above zero, the standard actually deducted is + min(net earnings, the permitted-work amount), or for a lone parent + min(net earnings, the larger of that amount and £25 x 52): the + permitted-work amount replaces the £20, £10 and £5 (SI 2006/213 Sch 4 + para 10A(2), SI 2006/214 Sch 4 para 5A(2)) and is never added to them. Para 12 is tested on its own: with Income Support, every family has all its net earnings disregarded, at working or pension age. Leaving Income Support can @@ -90,6 +96,14 @@ st.floats(0, 60_000, allow_nan=False), ) LOW_EARNINGS = st.one_of(st.just(0.0), st.floats(0, 12_000, allow_nan=False)) +# A pre-assessed annual permitted-work disregard: none; 52 weeks at the £20 +# exempt-work limit or at 2024-25's £183.50 limit; amounts either side of 52 +# weeks of the lone parent's £25; or any amount in pence up to £20,000. +PERMITTED_WORK = st.one_of( + st.just(0.0), + st.sampled_from([1040.0, 1299.99, 1300.0, 1300.01, 9542.0]), + st.integers(0, 2_000_000).map(lambda pennies: pennies / 100), +) DISREGARD = system.parameters(YEAR).gov.dwp.housing_benefit.means_test.income_disregard MAX_WEEKLY = max(DISREGARD.single, DISREGARD.couple, DISREGARD.lone_parent) MAX_ANNUAL = (MAX_WEEKLY + DISREGARD.worker) * WEEKS @@ -325,6 +339,7 @@ def pension_age_map(age): st.sampled_from(sorted(SHAPES)), st.integers(0, 100_000_000).map(lambda pennies: pennies / 100), st.booleans(), + PERMITTED_WORK, ), min_size=1, max_size=30, @@ -332,17 +347,18 @@ def pension_age_map(age): ) @example( cases=[ - (shape, net, eligible) + (shape, net, eligible, permitted) for shape in SHAPES - for net in (0, 259.99, 260, 500, 520, 1039.99, 1040, 1300, 2000) + for net in (0, 259.99, 260, 500, 520, 1039.99, 1040, 1300, 2000, 9542) for eligible in (False, True) + for permitted in (0, 500, 1040, 1299.99, 1300, 1300.01, 9542) ] ) def test_selected_standard_has_statutory_precedence_and_is_capped_at_net_earnings( cases, ): units = [] - for shape, _, _ in cases: + for shape, _, _, _ in cases: n_adults, n_children = SHAPES[shape] units.append( dict( @@ -370,9 +386,26 @@ def test_selected_standard_has_statutory_precedence_and_is_capped_at_net_earning YEAR, [case[2] for case in cases], ) + sim.set_input( + "housing_benefit_permitted_work_disregard", YEAR, [case[3] for case in cases] + ) + # Hold every other term at nil, so the applied disregard is the standard + # amount after the permitted-work replacement and nothing else. + for variable, value in ( + ("housing_benefit_specified_or_temporary_accommodation_disregard", 0.0), + ("housing_benefit_applicable_income_childcare_element", 0.0), + ("meets_housing_benefit_additional_earnings_disregard_conditions", False), + ("housing_benefit_on_passporting_benefit", False), + ): + sim.set_input(variable, YEAR, np.full(len(cases), value)) selected = sim.calculate("housing_benefit_special_earnings_disregard", YEAR) + applied = sim.calculate("housing_benefit_applicable_income_disregard", YEAR) net_earnings = sim.calculate("housing_benefit_net_earnings", YEAR) - for actual, net, (shape, _, eligible) in zip(selected, net_earnings, cases): + permitted_work = sim.calculate("housing_benefit_permitted_work_disregard", YEAR) + for actual, after, net, permitted, (shape, _, eligible, _) in zip( + selected, applied, net_earnings, permitted_work, cases + ): + case = (shape, net, eligible, permitted) if shape == "lone_parent": weekly = 25 elif eligible: @@ -381,8 +414,22 @@ def test_selected_standard_has_statutory_precedence_and_is_capped_at_net_earning weekly = 10 else: weekly = 5 - assert actual == min(net, WEEKS * weekly), (shape, net, eligible) - assert 0 <= actual <= net, (shape, net, eligible) + # The selected standard is the amount before permitted work, whatever + # the permitted-work input. + assert actual == min(net, WEEKS * weekly), case + assert 0 <= actual <= net, case + if permitted > 0: + # Working-age para 10A(2), pension-age para 5A(2): the specified + # amount replaces paras 3 to 10 (pension age: 1 to 5 and 7), the + # £20 included; a lone parent keeps £25 where that is higher. + floor = WEEKS * 25 if shape == "lone_parent" else 0 + expected = min(net, max(permitted, floor)) + else: + expected = min(net, WEEKS * weekly) + assert abs(after - expected) < 0.01, case + assert -0.01 < after <= net + 0.01, case + # Never stacked: at most the larger of the two amounts, never both. + assert after <= max(permitted, WEEKS * weekly) + 0.01, case @PROPERTY_SETTINGS diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_disregard.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_disregard.py index 7de5c94a3d..8b12285381 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_disregard.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_disregard.py @@ -22,9 +22,10 @@ class housing_benefit_applicable_income_disregard(Variable): "(SI 2006/213 reg 5(1)(b)). The " "£20 standard disregard uses established qualifying routes or an " "explicit full-amount pre-assessment, without reconstructing partial " - "carer/occupation earnings allocations. The permitted-work " - "disregard (Sch 4 para 10A), which replaces paras 3 to 10 but not " - "para 18, is not yet modelled here." + "carer/occupation earnings allocations. A pre-assessed permitted-work amount " + "(housing_benefit_permitted_work_disregard) replaces the ordinary " + "standard amount, retaining a higher lone-parent disregard. It does " + "not replace the separate accommodation or additional disregard." ) definition_period = YEAR unit = GBP @@ -37,6 +38,10 @@ class housing_benefit_applicable_income_disregard(Variable): "https://www.legislation.gov.uk/nisr/2006/405/schedule/5/paragraph/12", "https://www.legislation.gov.uk/uksi/2026/978/regulation/2", "https://www.legislation.gov.uk/nisr/2026/157/regulation/2", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/4/paragraph/10A", + "https://www.legislation.gov.uk/uksi/2006/214/schedule/4/paragraph/5A", + "https://www.legislation.gov.uk/nisr/2006/405/schedule/5/paragraph/10A", + "https://www.legislation.gov.uk/nisr/2006/406/schedule/5/paragraph/5A", ) def formula(benunit, period, parameters): @@ -44,6 +49,18 @@ def formula(benunit, period, parameters): net_earnings = benunit("housing_benefit_net_earnings", period) # Working age Sch 4 paras 4, 7 and 10; pension age Sch 4 paras 2 and 7. standard = benunit("housing_benefit_special_earnings_disregard", period) + # Working-age para 10A(2) / pension-age para 5A(2): replace the + # ordinary amount, except for a higher lone-parent amount. The input + # already applies the statutory work and partner-allocation limits. + permitted = max_(benunit("housing_benefit_permitted_work_disregard", period), 0) + standard = where( + permitted > 0, + min_( + net_earnings, + max_(permitted, benunit("is_lone_parent", period) * standard), + ), + standard, + ) # Working age Sch 4 para 18 (NI Sch 5 para 18), from 5 October 2026: # specified or temporary accommodation. It applies alongside paras 3 # to 10A, none of which excludes it, and takes the earnings they diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_permitted_work_disregard.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_permitted_work_disregard.py new file mode 100644 index 0000000000..11e8d7481c --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_permitted_work_disregard.py @@ -0,0 +1,29 @@ +from policyengine_uk.model_api import * + + +class housing_benefit_permitted_work_disregard(Variable): + value_type = float + entity = BenUnit + definition_period = YEAR + unit = GBP + default_value = 0 + label = "Pre-assessed Housing Benefit permitted-work earnings disregard" + documentation = ( + "Annual amount legally disregarded under the permitted-work provision, " + "before any lone-parent precedence and separate additional or " + "accommodation disregard. The external assessor must establish " + "qualifying benefit/credit status, exempt work, its statutory specified " + "amount, and the earnings available for this deduction, including the " + "partner allocation and limit. This is not gross permitted-work income " + "or an unrestricted exemption of all earnings. Enter zero where the " + "provision does not apply. No dataset mapping has been verified; the " + "zero default retains the ordinary-disregard approximation and may " + "understate qualifying awards. The model caps the supplied amount at " + "net earnings but does not reconstruct permitted-work entitlement." + ) + reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/schedule/4/paragraph/10A", + "https://www.legislation.gov.uk/uksi/2006/214/schedule/4/paragraph/5A", + "https://www.legislation.gov.uk/nisr/2006/405/schedule/5/paragraph/10A", + "https://www.legislation.gov.uk/nisr/2006/406/schedule/5/paragraph/5A", + ) diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_special_earnings_disregard.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_special_earnings_disregard.py index 04d731487a..b3529ffc83 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_special_earnings_disregard.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_special_earnings_disregard.py @@ -11,8 +11,14 @@ class housing_benefit_special_earnings_disregard(Variable): "Standard disregard selected before the additional/accommodation " "amounts: lone-parent precedence, otherwise the special amount for " "a qualifying family, otherwise the ordinary couple/single amount. " - "It is a replacement, not £20 added to £5 or £10. The total standard " - "deduction is capped at the claimant's and partner's net earnings." + "It is a replacement, not £20 added to £5 or £10, and it is capped at " + "the claimant's and partner's net earnings. This is the amount before " + "permitted work: where housing_benefit_permitted_work_disregard is " + "above zero, housing_benefit_applicable_income_disregard deducts that " + "amount in place of this one, keeping this amount only for a lone " + "parent for whom it is higher (SI 2006/213 Sch 4 para 10A(2), SI " + "2006/214 Sch 4 para 5A(2), SR 2006/405 Sch 5 para 10A(2) and SR " + "2006/406 Sch 5 para 5A(2))." ) reference = ( "https://www.legislation.gov.uk/uksi/2006/213/schedule/4",