diff --git a/changelog.d/hb-family-premium.added.md b/changelog.d/hb-family-premium.added.md new file mode 100644 index 0000000000..a2a0ec3d66 --- /dev/null +++ b/changelog.d/hb-family-premium.added.md @@ -0,0 +1 @@ +Added protected Housing Benefit family premiums with jurisdiction-specific closure dates and an explicit pre-assessed historical category. diff --git a/docs/book/assumptions/housing-benefit-child-allowances.md b/docs/book/assumptions/housing-benefit-child-allowances.md index 6f65002afe..13266dfe74 100644 --- a/docs/book/assumptions/housing-benefit-child-allowances.md +++ b/docs/book/assumptions/housing-benefit-child-allowances.md @@ -4,7 +4,8 @@ PolicyEngine does not currently calculate ordinary child personal allowances in the Housing Benefit applicable amount. This omission applies before, during and after the historical two-child restriction. The model calculates an adult personal allowance from the benefit unit's composition and age, then adds the -premiums selected by `benefits_premiums`. It does not calculate an ordinary +premiums selected by `benefits_premiums`, the child disability premiums and the +protected family premium. It does not calculate an ordinary allowance for either the first two children or additional children. See `housing_benefit_applicable_amount` in [`policyengine_uk/variables/gov/dwp/housing_benefit/`](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_applicable_amount.py). @@ -111,8 +112,9 @@ included-child count is one possible interface for that discussion; it is not a supported model input. This documentation introduces no claim-history or exception inputs and changes no calculation. -Child disability premiums and the protected family premium are separate work -under [#2221](https://github.com/PolicyEngine/policyengine-uk/issues/2221) and -[#2223](https://github.com/PolicyEngine/policyengine-uk/issues/2223). This page +The model adds child disability premiums and the protected family premium +separately, from +[#2221](https://github.com/PolicyEngine/policyengine-uk/pull/2221) and +[#2223](https://github.com/PolicyEngine/policyengine-uk/pull/2223). This page does not revive [closed PR #2198](https://github.com/PolicyEngine/policyengine-uk/pull/2198) or its associated issues. diff --git a/policyengine_uk/parameters/gov/dwp/housing_benefit/README.md b/policyengine_uk/parameters/gov/dwp/housing_benefit/README.md index 60cc6cd1ae..387076d757 100644 --- a/policyengine_uk/parameters/gov/dwp/housing_benefit/README.md +++ b/policyengine_uk/parameters/gov/dwp/housing_benefit/README.md @@ -1,11 +1,11 @@ # Housing Benefit The default `housing_benefit_applicable_amount` calculation includes an adult -personal allowance and selected premiums. It omits ordinary child personal -allowances, including in periods when no two-child restriction applied. +personal allowance, selected adult premiums, child disability premiums and the +protected family premium. It omits ordinary child personal allowances, +including in periods when no two-child restriction applied. See [historical child personal allowances and the deferred implementation](../../../../../docs/book/assumptions/housing-benefit-child-allowances.md) for the Great Britain and Northern Ireland rules, individual-child protection, Child Tax Credit assessment requirements and the missing historical facts. -The documentation adds no model input or calculation. Child disability and -protected family premiums remain separate work. +The documentation adds no model input or calculation. diff --git a/policyengine_uk/parameters/gov/dwp/housing_benefit/premiums/family/amount.yaml b/policyengine_uk/parameters/gov/dwp/housing_benefit/premiums/family/amount.yaml new file mode 100644 index 0000000000..f2958d3b17 --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/housing_benefit/premiums/family/amount.yaml @@ -0,0 +1,55 @@ +description: Weekly Housing Benefit ordinary family premium for legally protected awards. +values: + 2015-04-01: + value: 17.45 + metadata: + reference: + title: Housing Benefit 2015 family premium rate + href: https://www.legislation.gov.uk/uksi/2015/457/article/17/made + 2020-04-01: + value: 17.6 + metadata: + reference: + title: Housing Benefit 2020 family premium rate + href: https://www.gov.uk/government/publications/benefit-and-pension-rates-2020-to-2021/benefit-and-pension-rates-2020-to-2021 + 2021-04-01: + value: 17.65 + metadata: + reference: + title: Housing Benefit 2021 family premium rate + href: https://www.gov.uk/government/publications/benefit-and-pension-rates-2021-to-2022/benefit-and-pension-rates-2021-to-2022 + 2022-04-01: + value: 17.85 + metadata: + reference: + title: Housing Benefit 2022 family premium rate + href: https://www.gov.uk/government/publications/benefit-and-pension-rates-2023-to-2024/benefit-and-pension-rates-2023-to-2024 + 2023-04-01: + value: 18.53 + metadata: + reference: + title: Housing Benefit 2023 family premium rate + href: https://www.gov.uk/government/publications/benefit-and-pension-rates-2023-to-2024/benefit-and-pension-rates-2023-to-2024 + 2024-04-01: + value: 19.15 + metadata: + reference: + title: Housing Benefit 2024 family premium rate + href: https://www.gov.uk/government/publications/benefit-and-pension-rates-2024-to-2025/benefit-and-pension-rates-2024-to-2025 + 2025-04-01: + value: 19.48 + metadata: + reference: + title: Housing Benefit 2025 family premium rate + href: https://www.gov.uk/government/publications/benefit-and-pension-rates-2026-to-2027/proposed-benefit-and-pension-rates-2026-to-2027 + 2026-04-01: + value: 20.22 + metadata: + reference: + title: Housing Benefit 2026 family premium rate + href: https://www.gov.uk/government/publications/benefit-and-pension-rates-2026-to-2027/proposed-benefit-and-pension-rates-2026-to-2027 +metadata: + unit: currency-GBP + period: week + label: Housing Benefit protected family premium + uprating: gov.benefit_uprating_cpi diff --git a/policyengine_uk/parameters/gov/dwp/housing_benefit/premiums/family/lone_parent_protected_amount.yaml b/policyengine_uk/parameters/gov/dwp/housing_benefit/premiums/family/lone_parent_protected_amount.yaml new file mode 100644 index 0000000000..e9e3f0458f --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/housing_benefit/premiums/family/lone_parent_protected_amount.yaml @@ -0,0 +1,12 @@ +description: Weekly Housing Benefit family premium for working-age lone-parent awards satisfying the pre-April 1998 protection conditions. +values: + 2015-04-01: 22.20 +metadata: + unit: currency-GBP + period: week + label: Housing Benefit historical lone-parent family premium + reference: + - title: GB working-age Schedule 3 paragraph 3, before abolition, saved by SI 2015/1857 + href: https://www.legislation.gov.uk/uksi/2006/213/schedule/3/part/2/2015-04-06 + - title: NI working-age Schedule 4 paragraph 3, before abolition, saved by SR 2016/310 + href: https://www.legislation.gov.uk/nisr/2006/405/schedule/4/part/II/2015-04-06 diff --git a/policyengine_uk/parameters/gov/dwp/housing_benefit/premiums/family/new_claim_end.yaml b/policyengine_uk/parameters/gov/dwp/housing_benefit/premiums/family/new_claim_end.yaml new file mode 100644 index 0000000000..d324b71d45 --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/housing_benefit/premiums/family/new_claim_end.yaml @@ -0,0 +1,21 @@ +description: Legal closure dates for Housing Benefit family premiums on new claims, written as YYYYMMDD numbers, with existing qualifying awards protected. +great_britain: + description: GB new-claim closure date. + values: + 2015-01-01: 20160501 + metadata: + unit: date + label: Housing Benefit family premium GB new-claim closure date + reference: + title: SI 2015/1857 regulations 1, 2 and 4 + href: https://www.legislation.gov.uk/uksi/2015/1857/made +northern_ireland: + description: NI new-claim closure date. + values: + 2015-01-01: 20160905 + metadata: + unit: date + label: Housing Benefit family premium NI new-claim closure date + reference: + title: SR 2016/310 regulations 1, 3 and 5 + href: https://www.legislation.gov.uk/nisr/2016/310/made diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/housing_benefit_family_premium.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/housing_benefit_family_premium.yaml new file mode 100644 index 0000000000..7f2821edd6 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/housing_benefit_family_premium.yaml @@ -0,0 +1,220 @@ +# Cases: none; ordinary; historical lone parent; no longer lone parent; no child. +- name: ENGLAND pension regime false protected family categories + period: 2026 + absolute_error_margin: 0.02 + input: + country: [ENGLAND, ENGLAND, ENGLAND, ENGLAND, ENGLAND] + housing_benefit_family_premium_category: [NONE, ORDINARY_PROTECTED, HISTORICAL_LONE_PARENT_PROTECTED, HISTORICAL_LONE_PARENT_PROTECTED, ORDINARY_PROTECTED] + is_child_or_young_person_for_legacy_benefits: [true, true, true, true, false] + is_lone_parent: [false, true, true, false, true] + housing_benefit_pension_age_regulations_apply: [false, false, false, false, false] + housing_benefit_eligible: [true, true, true, true, true] + eldest_claimant_or_partner_age: [40, 40, 40, 40, 40] + is_single_person: [true, false, false, true, false] + is_couple: [false, false, false, false, false] + benefits_premiums: [100, 100, 100, 100, 100] + output: + housing_benefit_family_premium: [0, 1051.44, 1154.3999999999999, 1051.44, 0] + housing_benefit_applicable_amount: [5068.599999999999, 6120.04, 6223, 6120.04, 5068.599999999999] + +# Cases: none; ordinary; historical lone parent; no longer lone parent; no child. +- name: ENGLAND pension regime true protected family categories + period: 2026 + absolute_error_margin: 0.02 + input: + country: [ENGLAND, ENGLAND, ENGLAND, ENGLAND, ENGLAND] + housing_benefit_family_premium_category: [NONE, ORDINARY_PROTECTED, HISTORICAL_LONE_PARENT_PROTECTED, HISTORICAL_LONE_PARENT_PROTECTED, ORDINARY_PROTECTED] + is_child_or_young_person_for_legacy_benefits: [true, true, true, true, false] + is_lone_parent: [false, true, true, false, true] + housing_benefit_pension_age_regulations_apply: [true, true, true, true, true] + # The claimants attained State Pension age before 1 April 2021, so the + # higher pension-age personal allowances apply (SI 2021/188). + housing_benefit_attained_pension_age_before_cutoff: [true, true, true, true, true] + housing_benefit_eligible: [true, true, true, true, true] + eldest_claimant_or_partner_age: [75, 75, 75, 75, 75] + is_single_person: [true, false, false, true, false] + is_couple: [false, false, false, false, false] + benefits_premiums: [100, 100, 100, 100, 100] + output: + housing_benefit_family_premium: [0, 1051.44, 1051.44, 1051.44, 0] + housing_benefit_applicable_amount: [13412, 14463.440000000002, 14463.440000000002, 14463.440000000002, 13412] + +# Cases: none; ordinary; historical lone parent; no longer lone parent; no child. +- name: NORTHERN_IRELAND pension regime false protected family categories + period: 2026 + absolute_error_margin: 0.02 + input: + country: [NORTHERN_IRELAND, NORTHERN_IRELAND, NORTHERN_IRELAND, NORTHERN_IRELAND, NORTHERN_IRELAND] + housing_benefit_family_premium_category: [NONE, ORDINARY_PROTECTED, HISTORICAL_LONE_PARENT_PROTECTED, HISTORICAL_LONE_PARENT_PROTECTED, ORDINARY_PROTECTED] + is_child_or_young_person_for_legacy_benefits: [true, true, true, true, false] + is_lone_parent: [false, true, true, false, true] + housing_benefit_pension_age_regulations_apply: [false, false, false, false, false] + housing_benefit_eligible: [true, true, true, true, true] + eldest_claimant_or_partner_age: [40, 40, 40, 40, 40] + is_single_person: [true, false, false, true, false] + is_couple: [false, false, false, false, false] + benefits_premiums: [100, 100, 100, 100, 100] + output: + housing_benefit_family_premium: [0, 1051.44, 1154.3999999999999, 1051.44, 0] + housing_benefit_applicable_amount: [5068.599999999999, 6120.04, 6223, 6120.04, 5068.599999999999] + +# Cases: none; ordinary; historical lone parent; no longer lone parent; no child. +- name: NORTHERN_IRELAND pension regime true protected family categories + period: 2026 + absolute_error_margin: 0.02 + input: + country: [NORTHERN_IRELAND, NORTHERN_IRELAND, NORTHERN_IRELAND, NORTHERN_IRELAND, NORTHERN_IRELAND] + housing_benefit_family_premium_category: [NONE, ORDINARY_PROTECTED, HISTORICAL_LONE_PARENT_PROTECTED, HISTORICAL_LONE_PARENT_PROTECTED, ORDINARY_PROTECTED] + is_child_or_young_person_for_legacy_benefits: [true, true, true, true, false] + is_lone_parent: [false, true, true, false, true] + housing_benefit_pension_age_regulations_apply: [true, true, true, true, true] + # The claimants attained State Pension age before 1 April 2021, so the + # higher pension-age personal allowances apply (SR 2021/70). + housing_benefit_attained_pension_age_before_cutoff: [true, true, true, true, true] + housing_benefit_eligible: [true, true, true, true, true] + eldest_claimant_or_partner_age: [75, 75, 75, 75, 75] + is_single_person: [true, false, false, true, false] + is_couple: [false, false, false, false, false] + benefits_premiums: [100, 100, 100, 100, 100] + output: + housing_benefit_family_premium: [0, 1051.44, 1051.44, 1051.44, 0] + housing_benefit_applicable_amount: [13412, 14463.440000000002, 14463.440000000002, 14463.440000000002, 13412] + +- name: Ordinary family premium published history 2015 + period: 2015 + absolute_error_margin: 0.01 + input: + housing_benefit_family_premium_category: ORDINARY_PROTECTED + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: false + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium: 17.45 * 52 + +- name: Ordinary family premium published history 2020 + period: 2020 + absolute_error_margin: 0.01 + input: + housing_benefit_family_premium_category: ORDINARY_PROTECTED + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: false + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium: 17.6 * 52 + +- name: Ordinary family premium published history 2021 + period: 2021 + absolute_error_margin: 0.01 + input: + housing_benefit_family_premium_category: ORDINARY_PROTECTED + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: false + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium: 17.65 * 52 + +- name: Ordinary family premium published history 2022 + period: 2022 + absolute_error_margin: 0.01 + input: + housing_benefit_family_premium_category: ORDINARY_PROTECTED + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: false + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium: 17.85 * 52 + +- name: Ordinary family premium published history 2023 + period: 2023 + absolute_error_margin: 0.01 + input: + housing_benefit_family_premium_category: ORDINARY_PROTECTED + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: false + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium: 18.53 * 52 + +- name: Ordinary family premium published history 2024 + period: 2024 + absolute_error_margin: 0.01 + input: + housing_benefit_family_premium_category: ORDINARY_PROTECTED + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: false + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium: 19.15 * 52 + +- name: Ordinary family premium published history 2025 + period: 2025 + absolute_error_margin: 0.01 + input: + housing_benefit_family_premium_category: ORDINARY_PROTECTED + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: false + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium: 19.48 * 52 + +- name: Ordinary family premium published history 2026 + period: 2026 + absolute_error_margin: 0.01 + input: + housing_benefit_family_premium_category: ORDINARY_PROTECTED + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: false + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium: 20.22 * 52 + +- name: Before closure ordinary family premium needs no historical category + period: 2015 + absolute_error_margin: 0.01 + input: + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: true + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium_category: NONE + housing_benefit_family_premium: 17.45 * 52 + +- name: Missing category in closure year does not presume a protected claim + period: 2016 + input: + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: true + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium_category: NONE + housing_benefit_family_premium: 0 + +- name: Parameter reform overrides the protected ordinary amount + period: 2026 + input: + gov.dwp.housing_benefit.premiums.family.amount: 0 + housing_benefit_family_premium_category: ORDINARY_PROTECTED + is_child_or_young_person_for_legacy_benefits: true + is_lone_parent: true + housing_benefit_pension_age_regulations_apply: false + output: + housing_benefit_family_premium: 0 + +- name: Child or young person status excludes an unrelated adult and a looked after child + period: 2026 + input: + people: + parent: + age: 40 + is_claimant_or_partner: true + looked_after: + age: 10 + is_looked_after_by_local_authority: true + unrelated_adult: + age: 30 + benunits: + family: + members: [parent, looked_after, unrelated_adult] + housing_benefit_family_premium_category: ORDINARY_PROTECTED + output: + housing_benefit_family_premium: 0 diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_applicable_amount.py b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_applicable_amount.py index 6edcf26575..e4cc96498a 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_applicable_amount.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_applicable_amount.py @@ -18,6 +18,8 @@ class housing_benefit_applicable_amount(Variable): "https://www.legislation.gov.uk/nisr/2006/405/schedule/4/part/I", "https://www.legislation.gov.uk/nisr/2006/405/schedule/4", "https://www.legislation.gov.uk/nisr/2006/406/schedule/4", + "https://www.legislation.gov.uk/uksi/2015/1857/made", + "https://www.legislation.gov.uk/nisr/2016/310/made", ) def formula(benunit, period, parameters): @@ -93,8 +95,15 @@ def higher_allowance(category): + lone_parent * lone_parent_personal_allowance ) * WEEKS_IN_YEAR premiums = benunit("benefits_premiums", period) + family_premium = benunit("housing_benefit_family_premium", period) child_premiums = benunit("housing_benefit_child_disability_premiums", period) esa_adjustment = benunit( "housing_benefit_main_phase_esa_allowance_adjustment", period ) - return personal_allowance + premiums + child_premiums + esa_adjustment + return ( + personal_allowance + + premiums + + family_premium + + child_premiums + + esa_adjustment + ) diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_family_premium.py b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_family_premium.py new file mode 100644 index 0000000000..b89f2231d1 --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_family_premium.py @@ -0,0 +1,53 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.dwp.housing_benefit.housing_benefit_family_premium_category import ( + HousingBenefitFamilyPremiumCategory, +) + + +class housing_benefit_family_premium(Variable): + value_type = float + entity = BenUnit + definition_period = YEAR + unit = GBP + label = "Housing Benefit protected family premium" + documentation = ( + "Ordinary family premium before the new-claim closure year; from " + "that year it requires the pre-assessed protection category. At least " + "one legally included child or young person is required. The higher " + "historical lone-parent rate is restricted to the working-age " + "schedule and current lone parents. Claim continuity and within-year " + "claim dates are not inferred from current household composition." + ) + reference = ( + "https://www.legislation.gov.uk/uksi/2015/1857/made", + "https://www.legislation.gov.uk/nisr/2016/310/made", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/part/2/2015-04-06", + "https://www.legislation.gov.uk/uksi/2006/214/schedule/3/part/2/2015-04-06", + "https://www.legislation.gov.uk/nisr/2006/405/schedule/4/part/II/2015-04-06", + "https://www.legislation.gov.uk/nisr/2006/406/schedule/4/part/II/2015-04-06", + ) + + def formula(benunit, period, parameters): + p = parameters(period).gov.dwp.housing_benefit.premiums.family + category = benunit("housing_benefit_family_premium_category", period) + categories = HousingBenefitFamilyPremiumCategory + child = benunit.members("is_child_or_young_person_for_legacy_benefits", period) + country = benunit.household("country", period) + # The closure year contains both pre- and post-closure claims. From + # that year, the category must establish legal protection rather + # than treating all claims as having begun before the cutoff. + before_closure_year = where( + country == country.possible_values.NORTHERN_IRELAND, + period.start.year < p.new_claim_end.northern_ireland // 10000, + period.start.year < p.new_claim_end.great_britain // 10000, + ) + eligible = benunit.any(child) & ( + before_closure_year | (category != categories.NONE) + ) + historical_lone_parent = ( + (category == categories.HISTORICAL_LONE_PARENT_PROTECTED) + & benunit("is_lone_parent", period) + & ~benunit("housing_benefit_pension_age_regulations_apply", period) + ) + weekly = where(historical_lone_parent, p.lone_parent_protected_amount, p.amount) + return where(eligible, weekly * WEEKS_IN_YEAR, 0) diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_family_premium_category.py b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_family_premium_category.py new file mode 100644 index 0000000000..f418c22719 --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_family_premium_category.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * + + +class HousingBenefitFamilyPremiumCategory(Enum): + ORDINARY_PROTECTED = "Ordinary protected family premium" + HISTORICAL_LONE_PARENT_PROTECTED = "Protected pre-April 1998 lone-parent premium" + NONE = "No protected family premium" + + +class housing_benefit_family_premium_category(Variable): + value_type = Enum + possible_values = HousingBenefitFamilyPremiumCategory + default_value = HousingBenefitFamilyPremiumCategory.NONE + entity = BenUnit + definition_period = YEAR + label = "Pre-assessed Housing Benefit protected family premium category" + documentation = ( + "Legally assessed family-premium protection, including continuous " + "qualifying entitlement before GB's 1 May 2016 or NI's 5 September " + "2016 new-claim closure and subsequent loss-of-protection conditions. " + "The historical lone-parent category additionally requires the " + "pre-April 1998 continuity conditions, not current lone-parent status " + "alone. It applies only in the working-age schedule. No dataset " + "mapping has been verified: NONE from the closure year omits " + "protected awards and can understate entitlement. This annual " + "pre-assessment does not reconstruct changes within the year." + ) + reference = ( + "https://www.legislation.gov.uk/uksi/2015/1857/made", + "https://www.legislation.gov.uk/nisr/2016/310/made", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/part/2/2015-04-06", + "https://www.legislation.gov.uk/nisr/2006/405/schedule/4/part/II/2015-04-06", + )