diff --git a/changelog.d/hb-qualified-childcare.fixed.md b/changelog.d/hb-qualified-childcare.fixed.md new file mode 100644 index 0000000000..cc904f76c9 --- /dev/null +++ b/changelog.d/hb-qualified-childcare.fixed.md @@ -0,0 +1 @@ +- 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 411dd36183..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,242 +1,1311 @@ -- name: One child, capped - period: 2025 - absolute_error_margin: 0.01 +# 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 + 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: "Existing claimant childcare_expenses are used without a new input" + 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 + childcare_expenses: 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: 9000 + +- 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 + childcare_expenses: 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 + childcare_expenses: 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: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 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: 10000 + childcare_expenses: 0 + is_claimant_or_partner: true child0: - age: 8 + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 5000 child1: age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 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 + childcare_expenses: 7800 + child1: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 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: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 9000 + child1: + age: 10 + is_child_or_young_person_for_legacy_benefits: true childcare_expenses: 9000 + 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: 15600 + +- 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: 0 + is_claimant_or_partner: true child0: - age: 15 + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 8000 + child1: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 8000 + child2: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 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 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: "Age-based cap approximation counts both children when only one has recorded spending" + 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 + childcare_expenses: 20000 + child1: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 0 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 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 + # 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: Non-disabled young person aged 17 no longer counts - period: 2025 - absolute_error_margin: 0.01 +- 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: 9000 + childcare_expenses: 0 + is_claimant_or_partner: true child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 20000 + child1: age: 17 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 0 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: + 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 + 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: - # 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: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: -500 + 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: "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: 0 + is_claimant_or_partner: true + child0: + age: 10 + is_child_or_young_person_for_legacy_benefits: true childcare_expenses: 9000 + benunits: + 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: + housing_benefit_applicable_income_childcare_element: 0 + +- name: "Low earnings after standard disregard" + 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 + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 9000 benunits: - benunit: - members: [claimant, child0] + 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: - # 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: 740 -- name: Blind young person aged 16 counts - period: 2025 - absolute_error_margin: 0.01 +- 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 childcare_expenses: 9000 + benunits: + 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: + housing_benefit_applicable_income_childcare_element: 0 + +- name: "WTC payment meets 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: 16 - is_blind: true + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 2000 benunits: - benunit: - members: [claimant, child0] + 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: - # 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: 1240 + +- name: "CTC payment meets 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 + childcare_expenses: 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 + output: + 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 + childcare_expenses: 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: "Permitted work replaces standard amount before childcare" + 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 + childcare_expenses: 2000 + benunits: + 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: Disabled young person aged 17 no longer counts - period: 2025 - absolute_error_margin: 0.01 +- 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 childcare_expenses: 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: 17 - is_disabled_for_benefits: true + age: 10 + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 9000 benunits: - benunit: - members: [claimant, child0] + 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: - # 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: "Special standard amount reduces remaining earnings" + 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 + childcare_expenses: 2000 benunits: - benunit: - members: [claimant, child, young_person] + 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: - 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: 960 -- name: Under-18 claimant is not their own relevant child - period: 2025 +- name: "Higher lone-parent amount is retained over permitted work" + 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 + childcare_expenses: 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 + childcare_expenses: 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 + childcare_expenses: 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 + childcare_expenses: 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 + 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: 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 + childcare_expenses: 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 + childcare_expenses: 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 + childcare_expenses: 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 + 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 + childcare_expenses: 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 + childcare_expenses: 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 + childcare_expenses: 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 + childcare_expenses: 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 + childcare_expenses: 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 + + +- 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: - # 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 -- name: Disabled 16-year-old outside education and training is not a relevant young person - period: 2025 +- 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: 9_000 - young_person: + childcare_expenses: 0 + is_claimant_or_partner: true + child0: age: 16 - is_disabled_for_benefits: true - is_in_non_advanced_education: false - is_in_approved_training: false + is_child_or_young_person_for_legacy_benefits: true + childcare_expenses: 9000 benunits: - benunit: - members: [claimant, young_person] + 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: - # 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: "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 aa7dd6bd65..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 @@ -1,29 +1,45 @@ from policyengine_uk.model_api import * +def hb_capped_childcare_charges(benunit, period, parameters): + """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_(expenses, 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 = ( + "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/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): - 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..54ee4c6087 --- /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/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", + ) + + def formula(benunit, period, parameters): + return hb_childcare_earnings_limit(benunit, period)