From d84c026f4705a1d7e1085b4722c893274429a3c4 Mon Sep 17 00:00:00 2001 From: Anthony Volk <14987227+anth-volk@users.noreply.github.com> Date: Fri, 9 Oct 2026 16:59:29 +0400 Subject: [PATCH 1/2] Limit Housing Benefit childcare to qualifying charges and earnings residuals --- changelog.d/hb-qualified-childcare.fixed.md | 1 + ...t_applicable_income_childcare_element.yaml | 1230 +++++++++++++++-- ...fit_applicable_income_childcare_element.py | 43 +- ...ousing_benefit_childcare_earnings_limit.py | 58 + ...ng_benefit_qualifying_childcare_charges.py | 25 + 5 files changed, 1211 insertions(+), 146 deletions(-) create mode 100644 changelog.d/hb-qualified-childcare.fixed.md create mode 100644 policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_childcare_earnings_limit.py create mode 100644 policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_qualifying_childcare_charges.py diff --git a/changelog.d/hb-qualified-childcare.fixed.md b/changelog.d/hb-qualified-childcare.fixed.md new file mode 100644 index 0000000000..d5d87c2075 --- /dev/null +++ b/changelog.d/hb-qualified-childcare.fixed.md @@ -0,0 +1 @@ +- Limit Housing Benefit childcare deductions to pre-assessed qualifying charges, the paid-care child-count cap, and remaining earnings plus tax-credit payments. diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.yaml index 411dd36183..06bf811f4a 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.yaml @@ -1,242 +1,1212 @@ -- name: One child, capped - period: 2025 - absolute_error_margin: 0.01 +# Qualifying charges are externally pre-assessed; these tests isolate the +# count/cap/residual calculation. Cap inputs reproduce #1925, not another fix. +- name: "No children and no qualifying charges" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + benunits: + family: + members: ["claimant"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 0 + +- name: "Generic expenditure alone is not a qualifying assessment" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true childcare_expenses: 9000 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 0 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 0 + +- name: "One child below weekly cap" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true child0: age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9000 benunits: - benunit: - members: [claimant, child0] + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # Annual age limits are <16, or <17 if disabled/blind (HB reg 28(6)). - # With 1 relevant children the deduction is min(cost, weekly cap * 52). - num_relevant_children_for_housing_benefit_childcare: 1 housing_benefit_applicable_income_childcare_element: 9000 -- name: Two child, capped - period: 2025 - absolute_error_margin: 0.01 +- name: "One child at weekly cap" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9100 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 9100 + +- name: "One child above weekly cap" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 10000 + childcare_expenses: 0 + is_claimant_or_partner: true child0: - age: 8 + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 20000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 9100 + +- name: "Two children below multiple-child cap" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 5000 child1: age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 5000 benunits: - benunit: - members: [claimant, child0, child1] + family: + members: ["claimant","child0","child1"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # Annual age limits are <16, or <17 if disabled/blind (HB reg 28(6)). - # With 2 relevant children the deduction is min(cost, weekly cap * 52). - num_relevant_children_for_housing_benefit_childcare: 2 housing_benefit_applicable_income_childcare_element: 10000 -- name: No children - period: 2025 - absolute_error_margin: 0.01 +- name: "Two children at multiple-child cap" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 30000 + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 7800 + child1: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 7800 benunits: - benunit: - members: [claimant] + family: + members: ["claimant","child0","child1"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # Annual age limits are <16, or <17 if disabled/blind (HB reg 28(6)). - # With 0 relevant children the deduction is min(cost, weekly cap * 52). - num_relevant_children_for_housing_benefit_childcare: 0 - housing_benefit_applicable_income_childcare_element: 0 + housing_benefit_applicable_income_childcare_element: 15600 -- name: Non-disabled child aged 15 remains within annual age approximation - period: 2025 - absolute_error_margin: 0.01 +- name: "Two children above multiple-child cap" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 9000 + childcare_expenses: 0 + is_claimant_or_partner: true child0: - age: 15 + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9000 + child1: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9000 benunits: - benunit: - members: [claimant, child0] + family: + members: ["claimant","child0","child1"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # Annual age limits are <16, or <17 if disabled/blind (HB reg 28(6)). - # With 1 relevant children the deduction is min(cost, weekly cap * 52). - num_relevant_children_for_housing_benefit_childcare: 1 - housing_benefit_applicable_income_childcare_element: 9000 + housing_benefit_applicable_income_childcare_element: 15600 -- name: Non-disabled young person aged 16 no longer counts - period: 2025 - absolute_error_margin: 0.01 +- name: "Three paid-care children do not increase the family cap" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 9000 + childcare_expenses: 0 + is_claimant_or_partner: true child0: - age: 16 + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 8000 + child1: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 8000 + child2: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 8000 benunits: - benunit: - members: [claimant, child0] + family: + members: ["claimant","child0","child1","child2"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # Annual age limits are <16, or <17 if disabled/blind (HB reg 28(6)). - # With 0 relevant children the deduction is min(cost, weekly cap * 52). - num_relevant_children_for_housing_benefit_childcare: 0 - housing_benefit_applicable_income_childcare_element: 0 + housing_benefit_applicable_income_childcare_element: 15600 -- name: Non-disabled young person aged 17 no longer counts - period: 2025 - absolute_error_margin: 0.01 +- name: "Two children but paid care for only one use one-child cap" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 9000 + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 20000 + child1: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 0 + benunits: + family: + members: ["claimant","child0","child1"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 9100 + +- name: "Older child without qualifying care does not increase cap" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 20000 + child1: + age: 17 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 0 + benunits: + family: + members: ["claimant","child0","child1"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 9100 + +- name: "Charges for an excluded young person are not counted" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true child0: age: 17 + is_child_or_young_person_for_legacy_benefits: false + housing_benefit_qualifying_childcare_charges: 9000 benunits: - benunit: - members: [claimant, child0] + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # Annual age limits are <16, or <17 if disabled/blind (HB reg 28(6)). - # With 0 relevant children the deduction is min(cost, weekly cap * 52). - num_relevant_children_for_housing_benefit_childcare: 0 housing_benefit_applicable_income_childcare_element: 0 -- name: Disabled young person aged 16 counts - period: 2025 - absolute_error_margin: 0.01 +- name: "Negative supplied charges are floored" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 9000 + childcare_expenses: 0 + is_claimant_or_partner: true child0: - age: 16 - is_disabled_for_benefits: true + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: -500 benunits: - benunit: - members: [claimant, child0] + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # Annual age limits are <16, or <17 if disabled/blind (HB reg 28(6)). - # With 1 relevant children the deduction is min(cost, weekly cap * 52). - num_relevant_children_for_housing_benefit_childcare: 1 - housing_benefit_applicable_income_childcare_element: 9000 + housing_benefit_applicable_income_childcare_element: 0 -- name: Blind young person aged 16 counts - period: 2025 - absolute_error_margin: 0.01 +- name: "Zero earnings and no tax credits give no deduction" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 9000 + childcare_expenses: 0 + is_claimant_or_partner: true child0: - age: 16 - is_blind: true + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9000 benunits: - benunit: - members: [claimant, child0] + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 0 + housing_benefit_special_earnings_disregard: 0 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # Annual age limits are <16, or <17 if disabled/blind (HB reg 28(6)). - # With 1 relevant children the deduction is min(cost, weekly cap * 52). - num_relevant_children_for_housing_benefit_childcare: 1 - housing_benefit_applicable_income_childcare_element: 9000 + housing_benefit_applicable_income_childcare_element: 0 -- name: Disabled young person aged 17 no longer counts - period: 2025 - absolute_error_margin: 0.01 +- name: "Low earnings after standard disregard" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 9000 + childcare_expenses: 0 + is_claimant_or_partner: true child0: - age: 17 - is_disabled_for_benefits: true + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 740 + +- name: "Standard disregard exhausts earnings" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9000 benunits: - benunit: - members: [claimant, child0] + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 260 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # Annual age limits are <16, or <17 if disabled/blind (HB reg 28(6)). - # With 0 relevant children the deduction is min(cost, weekly cap * 52). - num_relevant_children_for_housing_benefit_childcare: 0 housing_benefit_applicable_income_childcare_element: 0 -- name: One relevant child and an older young person use the one-child cap - period: 2025 - absolute_error_margin: 0.01 +- name: "WTC payment meets residual" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 30_000 - child: + childcare_expenses: 0 + is_claimant_or_partner: true + child0: age: 10 - young_person: - age: 17 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 benunits: - benunit: - members: [claimant, child, young_person] + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 500 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - num_relevant_children_for_housing_benefit_childcare: 1 - # Reg 27(3) selects the one-child cap: min(30,000, 312.0555942 * 52). - # The existing uprated WTC cap is retained; its difference from the - # statutory HB cap of 175/week is outside this classification change. - housing_benefit_applicable_income_childcare_element: 16_226.8908984 + housing_benefit_applicable_income_childcare_element: 1240 -- name: Under-18 claimant is not their own relevant child - period: 2025 +- name: "CTC payment meets residual" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: - age: 17 - childcare_expenses: 9_000 + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 benunits: - benunit: - members: [claimant] + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 800 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # 0 dependants implies 0 childcare cap (HB reg 27(3)). - num_relevant_children_for_housing_benefit_childcare: 0 - housing_benefit_applicable_income_childcare_element: 0 + housing_benefit_applicable_income_childcare_element: 1540 + +- name: "Both tax credit payments may meet residual under DWP W2.180" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 500 + child_tax_credit: 600 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 1840 -- name: Disabled 16-year-old outside education and training is not a relevant young person - period: 2025 +- name: "Permitted work replaces standard amount before childcare" + period: 2024 + absolute_error_margin: 0.02 input: people: claimant: age: 40 is_parent: true - childcare_expenses: 9_000 - young_person: - age: 16 - is_disabled_for_benefits: true - is_in_non_advanced_education: false - is_in_approved_training: false + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 benunits: - benunit: - members: [claimant, young_person] + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 500 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 500 + +- name: "Accommodation disregard reduces available earnings" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 500 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 240 + +- name: "Accommodation amount is capped at earnings left" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 1000 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - # HB reg 28(6) requires a child of the family, including a qualifying - # young person; the disability age extension does not create that status. - num_relevant_children_for_housing_benefit_childcare: 0 housing_benefit_applicable_income_childcare_element: 0 + +- name: "Special standard amount reduces remaining earnings" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 2000 + housing_benefit_special_earnings_disregard: 1040 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 960 + +- name: "Higher lone-parent amount is retained over permitted work" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 2000 + housing_benefit_special_earnings_disregard: 1300 + housing_benefit_permitted_work_disregard: 500 + is_lone_parent: true + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 700 + +- name: "Additional disregard qualifies at exact childcare-inclusive threshold" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 1000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 2149.2 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 1000 + housing_benefit_applicable_income_disregard: 1149.2 + +- name: "Additional disregard fails just below childcare-inclusive threshold" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 1000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 2149.19 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 1000 + housing_benefit_applicable_income_disregard: 260 + +- name: "Childcare does not recurse through additional disregard with low earnings" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 1000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: true + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 740 + housing_benefit_applicable_income_disregard: 260 + +- name: "Explicit one-child cap reform wins" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 9000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 100 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 5200 + +- name: "ENGLAND pension regulations false earnings and CTC residual" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 800 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + households: + household: + members: ["claimant","child0"] + country: "ENGLAND" + output: + housing_benefit_applicable_income_childcare_element: 1540 + +- name: "ENGLAND pension regulations true earnings and CTC residual" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 800 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: true + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + households: + household: + members: ["claimant","child0"] + country: "ENGLAND" + output: + housing_benefit_applicable_income_childcare_element: 1540 + +- name: "SCOTLAND pension regulations false earnings and CTC residual" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 800 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + households: + household: + members: ["claimant","child0"] + country: "SCOTLAND" + output: + housing_benefit_applicable_income_childcare_element: 1540 + +- name: "SCOTLAND pension regulations true earnings and CTC residual" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 800 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: true + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + households: + household: + members: ["claimant","child0"] + country: "SCOTLAND" + output: + housing_benefit_applicable_income_childcare_element: 1540 + +- name: "WALES pension regulations false earnings and CTC residual" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 800 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + households: + household: + members: ["claimant","child0"] + country: "WALES" + output: + housing_benefit_applicable_income_childcare_element: 1540 + +- name: "WALES pension regulations true earnings and CTC residual" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 800 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: true + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + households: + household: + members: ["claimant","child0"] + country: "WALES" + output: + housing_benefit_applicable_income_childcare_element: 1540 + +- name: "NORTHERN_IRELAND pension regulations false earnings and CTC residual" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 800 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + households: + household: + members: ["claimant","child0"] + country: "NORTHERN_IRELAND" + output: + housing_benefit_applicable_income_childcare_element: 1540 + +- name: "NORTHERN_IRELAND pension regulations true earnings and CTC residual" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + housing_benefit_qualifying_childcare_charges: 2000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 1000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 800 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: true + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + households: + household: + members: ["claimant","child0"] + country: "NORTHERN_IRELAND" + output: + housing_benefit_applicable_income_childcare_element: 1540 diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.py index aa7dd6bd65..64c182fb67 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.py @@ -1,29 +1,40 @@ from policyengine_uk.model_api import * +def hb_capped_childcare_charges(benunit, period, parameters): + """Qualifying paid care only; one-child or multiple-child family cap.""" + person = benunit.members + charges = max_(person("housing_benefit_qualifying_childcare_charges", period), 0) + included = person("is_child_or_young_person_for_legacy_benefits", period) + count = benunit.sum(included & (charges > 0)) + p = parameters(period).gov.dwp.tax_credits.working_tax_credit.elements + cap = select([count == 1, count > 1], [p.childcare_1, p.childcare_2], default=0) + return min_(benunit.sum(charges * included), cap * WEEKS_IN_YEAR) + + class housing_benefit_applicable_income_childcare_element(Variable): value_type = float entity = BenUnit label = "Housing Benefit applicable income childcare element" definition_period = YEAR unit = GBP - reference = "https://www.legislation.gov.uk/uksi/2006/213/regulation/27" + documentation = ( + "Qualifying pre-assessed charges, capped by the number of included " + "children with paid care and by remaining earnings plus WTC/CTC " + "payments. Provider/work/age and continuation conditions are delegated " + "to housing_benefit_qualifying_childcare_charges. Generic " + "childcare_expenses are not treated as qualifying by default. The " + "annual calculation assumes constant household circumstances." + ) + reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/regulation/27", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/30", + "https://www.legislation.gov.uk/nisr/2006/405/regulation/25", + "https://www.legislation.gov.uk/nisr/2006/406/regulation/28", + ) def formula(benunit, period, parameters): - p = parameters(period).gov.dwp.tax_credits.working_tax_credit.elements - relevant_children = benunit( - "num_relevant_children_for_housing_benefit_childcare", period - ) - childcare_amount_1 = (relevant_children == 1) * p.childcare_1 - childcare_amount_2 = (relevant_children > 1) * p.childcare_2 - max_weekly_childcare_amount = childcare_amount_1 + childcare_amount_2 - # Assuming that no children leads to no childcare element - capped_max_childcare_amount = where( - relevant_children == 0, 0, max_weekly_childcare_amount - ) - max_childcare_amount = capped_max_childcare_amount * WEEKS_IN_YEAR - childcare_expenses = add(benunit, period, ["childcare_expenses"]) return min_( - max_childcare_amount, - childcare_expenses, + hb_capped_childcare_charges(benunit, period, parameters), + benunit("housing_benefit_childcare_earnings_limit", period), ) diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_childcare_earnings_limit.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_childcare_earnings_limit.py new file mode 100644 index 0000000000..1a37c7fa5a --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_childcare_earnings_limit.py @@ -0,0 +1,58 @@ +from policyengine_uk.model_api import * + + +def hb_standard_earnings_disregard(benunit, period): + """Selected standard amount, including the permitted-work replacement.""" + net = max_(benunit("housing_benefit_net_earnings", period), 0) + standard = benunit("housing_benefit_special_earnings_disregard", period) + permitted = max_(benunit("housing_benefit_permitted_work_disregard", period), 0) + return where( + permitted > 0, + min_(net, max_(permitted, benunit("is_lone_parent", period) * standard)), + standard, + ) + + +def hb_childcare_earnings_limit(benunit, period, accommodation=None): + """Remaining earnings and tax credits, without an additional-disregard loop.""" + net = max_(benunit("housing_benefit_net_earnings", period), 0) + standard = hb_standard_earnings_disregard(benunit, period) + if accommodation is None: + accommodation = benunit( + "housing_benefit_specified_or_temporary_accommodation_disregard", period + ) + accommodation = min_(max_(accommodation, 0), max_(0, net - standard)) + # DWP BW2 W2.179–W2.182 permits the residual against any WTC/CTC in + # payment, not other income. Both amounts are benefit-unit payments. + credits = max_(benunit("working_tax_credit", period), 0) + max_( + benunit("child_tax_credit", period), 0 + ) + return max_(0, net - standard - accommodation) + credits + + +class housing_benefit_childcare_earnings_limit(Variable): + value_type = float + entity = BenUnit + definition_period = YEAR + unit = GBP + label = "Housing Benefit childcare earnings and tax-credit limit" + documentation = ( + "Net claimant/partner earnings after the selected standard, permitted-work " + "and accommodation disregards, plus WTC/CTC payments. Unrelated income " + "cannot meet remaining childcare charges. The additional earnings " + "disregard is conditional on earnings covering the childcare deduction " + "as well as that disregard: when it applies the full capped childcare " + "charge already fits, so this calculation need not depend on it. This " + "avoids a circular calculation through the childcare deduction." + ) + reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/regulation/27", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/30", + "https://www.legislation.gov.uk/nisr/2006/405/regulation/25", + "https://www.legislation.gov.uk/nisr/2006/406/regulation/28", + "https://assets.publishing.service.gov.uk/media/5a7c7cf7ed915d6969f4538d/hbgm-bw2-assessment-of-income.pdf", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/4/paragraph/17", + ) + + def formula(benunit, period, parameters): + return hb_childcare_earnings_limit(benunit, period) diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_qualifying_childcare_charges.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_qualifying_childcare_charges.py new file mode 100644 index 0000000000..3a572c94be --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_qualifying_childcare_charges.py @@ -0,0 +1,25 @@ +from policyengine_uk.model_api import * + + +class housing_benefit_qualifying_childcare_charges(Variable): + value_type = float + entity = Person + definition_period = YEAR + unit = GBP + default_value = 0 + label = "pre-assessed qualifying Housing Benefit childcare charges" + documentation = ( + "Annual qualifying charges for this child, before the family cap and " + "earnings limit. The supplied amount must already satisfy the relevant " + "provider, paid-care, age, work, leave, incapacity and continuation rules " + "(GB working-age regulation 28, pension-age regulation 31; NI 26/29). " + "It is not generic childcare expenditure. Missing values give no " + "deduction and may understate awards; zero does not establish that no " + "qualifying charges exist. No dataset source has been verified." + ) + reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/regulation/28", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/31", + "https://www.legislation.gov.uk/nisr/2006/405/regulation/26", + "https://www.legislation.gov.uk/nisr/2006/406/regulation/29", + ) From c5e5f88471395f09d1ecd0770cbaee2c938c7807 Mon Sep 17 00:00:00 2001 From: Anthony Volk <14987227+anth-volk@users.noreply.github.com> Date: Fri, 9 Oct 2026 21:36:49 +0400 Subject: [PATCH 2/2] Retain childcare_expenses and defer Housing Benefit qualifying-care rules --- changelog.d/hb-qualified-childcare.fixed.md | 2 +- ...t_applicable_income_childcare_element.yaml | 195 +++++++++++++----- ...g_benefit_applicable_income_disregard.yaml | 7 +- ...fit_applicable_income_childcare_element.py | 31 +-- ...ousing_benefit_childcare_earnings_limit.py | 2 +- ...ng_benefit_qualifying_childcare_charges.py | 25 --- 6 files changed, 171 insertions(+), 91 deletions(-) delete mode 100644 policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_qualifying_childcare_charges.py diff --git a/changelog.d/hb-qualified-childcare.fixed.md b/changelog.d/hb-qualified-childcare.fixed.md index d5d87c2075..cc904f76c9 100644 --- a/changelog.d/hb-qualified-childcare.fixed.md +++ b/changelog.d/hb-qualified-childcare.fixed.md @@ -1 +1 @@ -- Limit Housing Benefit childcare deductions to pre-assessed qualifying charges, the paid-care child-count cap, and remaining earnings plus tax-credit payments. +- Limited Housing Benefit childcare deductions to remaining earnings plus tax-credit payments while retaining childcare_expenses and the existing age-based cap approximation; deferred detailed qualifying-care rules without adding an input. diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.yaml index 06bf811f4a..7d4692788e 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.yaml @@ -1,5 +1,6 @@ -# Qualifying charges are externally pre-assessed; these tests isolate the -# count/cap/residual calculation. Cap inputs reproduce #1925, not another fix. +# Detailed provider, charge-type and work/leave conditions are deferred. +# Aggregate childcare_expenses and age-eligible child counts retain the +# existing annual approximation. Cap inputs reproduce #1925, not another fix. - name: "No children and no qualifying charges" period: 2024 absolute_error_margin: 0.02 @@ -28,7 +29,7 @@ output: housing_benefit_applicable_income_childcare_element: 0 -- name: "Generic expenditure alone is not a qualifying assessment" +- name: "Existing claimant childcare_expenses are used without a new input" period: 2024 absolute_error_margin: 0.02 input: @@ -41,7 +42,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 0 + childcare_expenses: 0 benunits: family: members: ["claimant","child0"] @@ -58,7 +59,7 @@ gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - housing_benefit_applicable_income_childcare_element: 0 + housing_benefit_applicable_income_childcare_element: 9000 - name: "One child below weekly cap" period: 2024 @@ -73,7 +74,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 benunits: family: members: ["claimant","child0"] @@ -105,7 +106,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9100 + childcare_expenses: 9100 benunits: family: members: ["claimant","child0"] @@ -137,7 +138,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 20000 + childcare_expenses: 20000 benunits: family: members: ["claimant","child0"] @@ -169,11 +170,11 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 5000 + childcare_expenses: 5000 child1: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 5000 + childcare_expenses: 5000 benunits: family: members: ["claimant","child0","child1"] @@ -205,11 +206,11 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 7800 + childcare_expenses: 7800 child1: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 7800 + childcare_expenses: 7800 benunits: family: members: ["claimant","child0","child1"] @@ -241,11 +242,11 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 child1: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 benunits: family: members: ["claimant","child0","child1"] @@ -277,15 +278,15 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 8000 + childcare_expenses: 8000 child1: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 8000 + childcare_expenses: 8000 child2: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 8000 + childcare_expenses: 8000 benunits: family: members: ["claimant","child0","child1","child2"] @@ -304,7 +305,7 @@ output: housing_benefit_applicable_income_childcare_element: 15600 -- name: "Two children but paid care for only one use one-child cap" +- name: "Age-based cap approximation counts both children when only one has recorded spending" period: 2024 absolute_error_margin: 0.02 input: @@ -317,11 +318,11 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 20000 + childcare_expenses: 20000 child1: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 0 + childcare_expenses: 0 benunits: family: members: ["claimant","child0","child1"] @@ -338,7 +339,9 @@ gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 output: - housing_benefit_applicable_income_childcare_element: 9100 + # Spending attribution is not assessed: two age-eligible children give + # the multiple-child cap even when costs are recorded on only one child. + housing_benefit_applicable_income_childcare_element: 15600 - name: "Older child without qualifying care does not increase cap" period: 2024 @@ -353,11 +356,11 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 20000 + childcare_expenses: 20000 child1: age: 17 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 0 + childcare_expenses: 0 benunits: family: members: ["claimant","child0","child1"] @@ -389,7 +392,7 @@ child0: age: 17 is_child_or_young_person_for_legacy_benefits: false - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 benunits: family: members: ["claimant","child0"] @@ -421,7 +424,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: -500 + childcare_expenses: -500 benunits: family: members: ["claimant","child0"] @@ -453,7 +456,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 benunits: family: members: ["claimant","child0"] @@ -485,7 +488,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 benunits: family: members: ["claimant","child0"] @@ -517,7 +520,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 benunits: family: members: ["claimant","child0"] @@ -549,7 +552,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -581,7 +584,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -613,7 +616,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -645,7 +648,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -677,7 +680,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 benunits: family: members: ["claimant","child0"] @@ -709,7 +712,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 benunits: family: members: ["claimant","child0"] @@ -741,7 +744,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -773,7 +776,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -805,7 +808,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 1000 + childcare_expenses: 1000 benunits: family: members: ["claimant","child0"] @@ -838,7 +841,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 1000 + childcare_expenses: 1000 benunits: family: members: ["claimant","child0"] @@ -871,7 +874,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 1000 + childcare_expenses: 1000 benunits: family: members: ["claimant","child0"] @@ -904,7 +907,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 9000 + childcare_expenses: 9000 benunits: family: members: ["claimant","child0"] @@ -936,7 +939,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -972,7 +975,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -1008,7 +1011,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -1044,7 +1047,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -1080,7 +1083,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -1116,7 +1119,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -1152,7 +1155,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -1175,6 +1178,8 @@ output: housing_benefit_applicable_income_childcare_element: 1540 + + - name: "NORTHERN_IRELAND pension regulations true earnings and CTC residual" period: 2024 absolute_error_margin: 0.02 @@ -1188,7 +1193,7 @@ child0: age: 10 is_child_or_young_person_for_legacy_benefits: true - housing_benefit_qualifying_childcare_charges: 2000 + childcare_expenses: 2000 benunits: family: members: ["claimant","child0"] @@ -1210,3 +1215,97 @@ country: "NORTHERN_IRELAND" output: housing_benefit_applicable_income_childcare_element: 1540 + + +- name: "Recorded spending without age-eligible children gives no deduction" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 5000 + is_claimant_or_partner: true + benunits: + family: + members: ["claimant"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 0 + +- name: "Standard age limit excludes a child aged 16" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 16 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 9000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 0 + +- name: "Disability extends the annual child age limit to include age 16" + period: 2024 + absolute_error_margin: 0.02 + input: + people: + claimant: + age: 40 + is_parent: true + childcare_expenses: 0 + is_claimant_or_partner: true + child0: + age: 16 + is_disabled_for_benefits: true + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 9000 + benunits: + family: + members: ["claimant","child0"] + housing_benefit_net_earnings: 20000 + housing_benefit_special_earnings_disregard: 260 + housing_benefit_permitted_work_disregard: 0 + is_lone_parent: false + housing_benefit_specified_or_temporary_accommodation_disregard: 0 + working_tax_credit: 0 + child_tax_credit: 0 + meets_housing_benefit_additional_earnings_disregard_conditions: false + housing_benefit_on_passporting_benefit: false + housing_benefit_pension_age_regulations_apply: false + gov.dwp.tax_credits.working_tax_credit.elements.childcare_1: 175 + gov.dwp.tax_credits.working_tax_credit.elements.childcare_2: 300 + output: + housing_benefit_applicable_income_childcare_element: 9000 diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_disregard.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_disregard.yaml index 7cf5e90192..a34303ce8e 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_disregard.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income_disregard.yaml @@ -363,9 +363,10 @@ would_claim_uc: false # not on Universal Credit, which passports the means test members: [parent, child] output: - # Childcare deducted is min(£4,160, one-child maximum) = £4,160. - # £5,200 < £1,300 + £4,160 + £889.20 = £6,349.20, so only £25 a week. - housing_benefit_applicable_income_childcare_element: 4_160 + # Reg 27(1)(c): after the £1,300 standard disregard, only £3,900 of + # earnings remain. With no tax credits, min(£4,160, £3,900) = £3,900. + # £5,200 < £1,300 + £3,900 + £889.20 = £6,089.20, so only £25 a week. + housing_benefit_applicable_income_childcare_element: 3_900 housing_benefit_applicable_income_disregard: 1_300 - name: Lone parent whose earnings cover the disregards and childcare gets the additional disregard diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.py index 64c182fb67..1c91664139 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income_childcare_element.py @@ -2,14 +2,12 @@ def hb_capped_childcare_charges(benunit, period, parameters): - """Qualifying paid care only; one-child or multiple-child family cap.""" - person = benunit.members - charges = max_(person("housing_benefit_qualifying_childcare_charges", period), 0) - included = person("is_child_or_young_person_for_legacy_benefits", period) - count = benunit.sum(included & (charges > 0)) + """Aggregate childcare spending capped using the existing age-based count.""" + expenses = max_(add(benunit, period, ["childcare_expenses"]), 0) + count = benunit("num_relevant_children_for_housing_benefit_childcare", period) p = parameters(period).gov.dwp.tax_credits.working_tax_credit.elements cap = select([count == 1, count > 1], [p.childcare_1, p.childcare_2], default=0) - return min_(benunit.sum(charges * included), cap * WEEKS_IN_YEAR) + return min_(expenses, cap * WEEKS_IN_YEAR) class housing_benefit_applicable_income_childcare_element(Variable): @@ -19,18 +17,25 @@ class housing_benefit_applicable_income_childcare_element(Variable): definition_period = YEAR unit = GBP documentation = ( - "Qualifying pre-assessed charges, capped by the number of included " - "children with paid care and by remaining earnings plus WTC/CTC " - "payments. Provider/work/age and continuation conditions are delegated " - "to housing_benefit_qualifying_childcare_charges. Generic " - "childcare_expenses are not treated as qualifying by default. The " - "annual calculation assumes constant household circumstances." + "Aggregate childcare_expenses, capped using the existing age-eligible " + "child count and limited by remaining earnings plus WTC/CTC payments. " + "Provider eligibility, excluded charge types, work/leave conditions " + "and incapacity/continuation exceptions are not assessed. The child " + "count approximates children with paid care and can overstate the " + "cap when only one of several eligible children receives paid care. " + "These qualifying-care rules are deferred in " + "https://github.com/PolicyEngine/policyengine-uk/issues/2236. " + "The annual calculation assumes constant household circumstances." ) reference = ( "https://www.legislation.gov.uk/uksi/2006/213/regulation/27", "https://www.legislation.gov.uk/uksi/2006/214/regulation/30", - "https://www.legislation.gov.uk/nisr/2006/405/regulation/25", + "https://www.legislation.gov.uk/nisr/2006/405/regulation/24", "https://www.legislation.gov.uk/nisr/2006/406/regulation/28", + "https://www.legislation.gov.uk/uksi/2006/213/regulation/28", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/31", + "https://www.legislation.gov.uk/nisr/2006/405/regulation/25", + "https://www.legislation.gov.uk/nisr/2006/406/regulation/29", ) def formula(benunit, period, parameters): diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_childcare_earnings_limit.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_childcare_earnings_limit.py index 1a37c7fa5a..54ee4c6087 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_childcare_earnings_limit.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_childcare_earnings_limit.py @@ -48,7 +48,7 @@ class housing_benefit_childcare_earnings_limit(Variable): reference = ( "https://www.legislation.gov.uk/uksi/2006/213/regulation/27", "https://www.legislation.gov.uk/uksi/2006/214/regulation/30", - "https://www.legislation.gov.uk/nisr/2006/405/regulation/25", + "https://www.legislation.gov.uk/nisr/2006/405/regulation/24", "https://www.legislation.gov.uk/nisr/2006/406/regulation/28", "https://assets.publishing.service.gov.uk/media/5a7c7cf7ed915d6969f4538d/hbgm-bw2-assessment-of-income.pdf", "https://www.legislation.gov.uk/uksi/2006/213/schedule/4/paragraph/17", diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_qualifying_childcare_charges.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_qualifying_childcare_charges.py deleted file mode 100644 index 3a572c94be..0000000000 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_qualifying_childcare_charges.py +++ /dev/null @@ -1,25 +0,0 @@ -from policyengine_uk.model_api import * - - -class housing_benefit_qualifying_childcare_charges(Variable): - value_type = float - entity = Person - definition_period = YEAR - unit = GBP - default_value = 0 - label = "pre-assessed qualifying Housing Benefit childcare charges" - documentation = ( - "Annual qualifying charges for this child, before the family cap and " - "earnings limit. The supplied amount must already satisfy the relevant " - "provider, paid-care, age, work, leave, incapacity and continuation rules " - "(GB working-age regulation 28, pension-age regulation 31; NI 26/29). " - "It is not generic childcare expenditure. Missing values give no " - "deduction and may understate awards; zero does not establish that no " - "qualifying charges exist. No dataset source has been verified." - ) - reference = ( - "https://www.legislation.gov.uk/uksi/2006/213/regulation/28", - "https://www.legislation.gov.uk/uksi/2006/214/regulation/31", - "https://www.legislation.gov.uk/nisr/2006/405/regulation/26", - "https://www.legislation.gov.uk/nisr/2006/406/regulation/29", - )