diff --git a/changelog.d/legacy-award-reader-switches-1966.fixed.md b/changelog.d/legacy-award-reader-switches-1966.fixed.md new file mode 100644 index 0000000000..ef8f2246c8 --- /dev/null +++ b/changelog.d/legacy-award-reader-switches-1966.fixed.md @@ -0,0 +1 @@ +The Childcare Offer for Wales income test now counts only the claimant's and partner's income-related ESA and income-based JSA towards a parent's gross income, not an award that another member of the benefit unit claims in their own right. New tests check that only the applicant's or partner's own income-related ESA gives a single applicant under 25 the higher council tax reduction personal allowance in Scotland and Wales. diff --git a/policyengine_uk/parameters/gov/welsh_government/childcare_offer/income/benunit_gross_income_sources.yaml b/policyengine_uk/parameters/gov/welsh_government/childcare_offer/income/benunit_gross_income_sources.yaml index 7068d78d15..5554cf78f5 100644 --- a/policyengine_uk/parameters/gov/welsh_government/childcare_offer/income/benunit_gross_income_sources.yaml +++ b/policyengine_uk/parameters/gov/welsh_government/childcare_offer/income/benunit_gross_income_sources.yaml @@ -13,8 +13,12 @@ values: # credits or Housing Benefit, so as a modelling convention (not a legal # reading) each is shared equally between the claimant and any partner; the # legacy income-related benefits are shared the same way for consistency. - # A lone parent counts all of it. None of them reads the Childcare Offer, so - # counting them creates no dependency cycle. + # A lone parent counts all of it. Income-related ESA and income-based JSA + # are the claimant's and partner's awards (claimant_or_partner_esa_income + # and claimant_or_partner_jsa_income): another member of the benefit unit + # who claims either in their own right receives that income, not a parent. + # None of them reads the Childcare Offer, so counting them creates no + # dependency cycle. 2019-08-01: - child_benefit - universal_credit @@ -23,5 +27,5 @@ values: - housing_benefit - income_support - pension_credit - - esa_income - - jsa_income + - claimant_or_partner_esa_income + - claimant_or_partner_jsa_income diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/council_tax_reduction_working_age_personal_allowance.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/council_tax_reduction_working_age_personal_allowance.yaml new file mode 100644 index 0000000000..ad6b4c0120 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/council_tax_reduction_working_age_personal_allowance.yaml @@ -0,0 +1,139 @@ +# Scotland and Wales working-age council tax reduction: a single applicant +# under 25 gets the lower personal allowance unless entitled to main phase +# employment and support allowance (SSI 2021/249 Sch 1 para 1; WSI 2013/3029 +# Sch 7 para 1). The model takes receipt of ESA by the applicant or partner as +# the main phase: contributory ESA on their own records, and income-related +# ESA through claimant_or_partner_esa_income where the benefit unit's awards +# are the applicant's. "other" is a member who is neither the applicant, the +# partner nor a child or young person they are responsible for, so their +# income-related ESA is their own claim and leaves the applicant on the lower +# rate. The applicant is the household head, whom the model takes to be +# liable, so the applicant applies with the benefit unit's awards +# (council_tax_reduction_head_applies_alone is false). The cases run in 2025, +# when income-related ESA is paid for the whole year. Weekly rates for 2025-26 +# (x 52): Scotland £72.90 under 25 and £92.05 at 25 or over (SSI 2025/24 reg +# 16(a)); Wales £77.65 and £98.10 (W.S.I. 2025/59 reg 9(a)(i)). + +- name: Scotland, another member's income-related ESA leaves an applicant under 25 on the lower personal allowance + period: 2025 + absolute_error_margin: 0.01 + input: + people: + applicant: + age: 22 + is_claimant_or_partner: true + is_household_head: true + other: + age: 30 + is_claimant_or_partner: false + is_household_head: false + current_education: NOT_IN_EDUCATION + esa_income_reported: 5_000 + benunits: + benunit: + members: [applicant, other] + would_claim_uc: false + households: + household: + members: [applicant, other] + region: SCOTLAND + country: SCOTLAND + output: + council_tax_reduction_head_applies_alone: false + esa_income: 5_000 + claimant_or_partner_esa_income: 0 + # 72.90 * 52 + council_tax_reduction_working_age_personal_allowance: 3_790.80 + +- name: Scotland, the applicant's own income-related ESA gives the higher personal allowance under 25 + period: 2025 + absolute_error_margin: 0.01 + input: + people: + applicant: + age: 22 + is_claimant_or_partner: true + is_household_head: true + esa_income_reported: 5_000 + other: + age: 30 + is_claimant_or_partner: false + is_household_head: false + current_education: NOT_IN_EDUCATION + benunits: + benunit: + members: [applicant, other] + would_claim_uc: false + households: + household: + members: [applicant, other] + region: SCOTLAND + country: SCOTLAND + output: + council_tax_reduction_head_applies_alone: false + esa_income: 5_000 + claimant_or_partner_esa_income: 5_000 + # 92.05 * 52 + council_tax_reduction_working_age_personal_allowance: 4_786.60 + +- name: Wales, another member's income-related ESA leaves an applicant under 25 on the lower personal allowance + period: 2025 + absolute_error_margin: 0.01 + input: + people: + applicant: + age: 22 + is_claimant_or_partner: true + is_household_head: true + other: + age: 30 + is_claimant_or_partner: false + is_household_head: false + current_education: NOT_IN_EDUCATION + esa_income_reported: 5_000 + benunits: + benunit: + members: [applicant, other] + would_claim_uc: false + households: + household: + members: [applicant, other] + region: WALES + country: WALES + output: + council_tax_reduction_head_applies_alone: false + esa_income: 5_000 + claimant_or_partner_esa_income: 0 + # 77.65 * 52 + council_tax_reduction_working_age_personal_allowance: 4_037.80 + +- name: Wales, the applicant's own income-related ESA gives the higher personal allowance under 25 + period: 2025 + absolute_error_margin: 0.01 + input: + people: + applicant: + age: 22 + is_claimant_or_partner: true + is_household_head: true + esa_income_reported: 5_000 + other: + age: 30 + is_claimant_or_partner: false + is_household_head: false + current_education: NOT_IN_EDUCATION + benunits: + benunit: + members: [applicant, other] + would_claim_uc: false + households: + household: + members: [applicant, other] + region: WALES + country: WALES + output: + council_tax_reduction_head_applies_alone: false + esa_income: 5_000 + claimant_or_partner_esa_income: 5_000 + # 98.10 * 52 + council_tax_reduction_working_age_personal_allowance: 5_101.20 diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/wales_childcare_offer.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/wales_childcare_offer.yaml new file mode 100644 index 0000000000..64203dad61 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/wales_childcare_offer.yaml @@ -0,0 +1,137 @@ +# Childcare Offer for Wales: each parent must have gross income of no more +# than £100,000 a year, counting all of that parent's income (guidance for +# local authorities, version 8.3, April 2026, paragraphs 57 and 69; July 2020 +# income guidance, questions 8 and 9). The model shares the benefit unit's +# benefits equally between the claimant and any partner, and a lone parent +# counts all of them (benunit_gross_income_sources). Of income-related ESA and +# income-based JSA it counts the claimant's and partner's awards +# (claimant_or_partner_esa_income, claimant_or_partner_jsa_income). "other" is +# a member who is neither the claimant, the partner nor a child or young person +# they are responsible for, so an award they claim in their own right is their +# income, not the parent's. An award entered for the benefit unit with no +# reports behind it is read as the claimant's or partner's. Child Benefit is +# set to zero so that wages and awards alone decide each case. The lone parent +# earns £96,000, far above 16 hours a week at the National Living Wage. The +# cases run in 2025, when income-related ESA and income-based JSA are paid for +# the whole year. + +- name: Wales, another member's income-related ESA does not count towards a lone parent's gross income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + employment_income: 96_000 + is_claimant_or_partner: true + child: + age: 3 + other: + age: 30 + is_claimant_or_partner: false + current_education: NOT_IN_EDUCATION + esa_income_reported: 8_000 + benunits: + benunit: + members: [parent, child, other] + would_claim_uc: false + child_benefit: 0 + households: + household: + members: [parent, child, other] + region: WALES + country: WALES + output: + esa_income: 8_000 + claimant_or_partner_esa_income: 0 + # 96,000 <= 100,000. Counting the other member's award would give + # 96,000 + 8,000 = 104,000. + wales_childcare_offer_parent_condition: [true, false, false] + wales_childcare_offer_eligible: true + +- name: Wales, another member's income-based JSA does not count towards a lone parent's gross income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + employment_income: 96_000 + is_claimant_or_partner: true + child: + age: 3 + other: + age: 30 + is_claimant_or_partner: false + current_education: NOT_IN_EDUCATION + jsa_income_reported: 8_000 + benunits: + benunit: + members: [parent, child, other] + would_claim_uc: false + child_benefit: 0 + households: + household: + members: [parent, child, other] + region: WALES + country: WALES + output: + jsa_income: 8_000 + claimant_or_partner_jsa_income: 0 + wales_childcare_offer_parent_condition: [true, false, false] + wales_childcare_offer_eligible: true + +- name: Wales, the benefit unit's income-related ESA counts towards the lone parent's gross income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + employment_income: 96_000 + is_claimant_or_partner: true + child: + age: 3 + benunits: + benunit: + members: [parent, child] + would_claim_uc: false + child_benefit: 0 + esa_income: 8_000 + households: + household: + members: [parent, child] + region: WALES + country: WALES + output: + claimant_or_partner_esa_income: 8_000 + # 96,000 + 8,000 = 104,000 > 100,000 + wales_childcare_offer_parent_condition: [false, false] + wales_childcare_offer_eligible: false + +- name: Wales, the benefit unit's income-based JSA counts towards the lone parent's gross income + period: 2025 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + employment_income: 96_000 + is_claimant_or_partner: true + child: + age: 3 + benunits: + benunit: + members: [parent, child] + would_claim_uc: false + child_benefit: 0 + jsa_income: 8_000 + households: + household: + members: [parent, child] + region: WALES + country: WALES + output: + claimant_or_partner_jsa_income: 8_000 + wales_childcare_offer_parent_condition: [false, false] + wales_childcare_offer_eligible: false diff --git a/policyengine_uk/tests/test_legacy_award_readers_properties.py b/policyengine_uk/tests/test_legacy_award_readers_properties.py index 602a71ac26..90c13462d4 100644 --- a/policyengine_uk/tests/test_legacy_award_readers_properties.py +++ b/policyengine_uk/tests/test_legacy_award_readers_properties.py @@ -13,6 +13,10 @@ ESA: HB Regs 2006 Sch 4 para 12, Sch 5 para 4 and Sch 6 para 5. - The working-age council tax reduction passport and non-dependant exemption: CTR (Default Scheme) (England) Regs 2012, Schedule. +- The higher personal allowance for a single applicant under 25 entitled to + main phase employment and support allowance, in Scotland's and Wales's + working-age council tax reduction schemes: SSI 2021/249 Sch 1 para 1; WSI + 2013/3029 Sch 7 para 1. - The tax credit income test: TCA 2002 s.7(2), SI 2002/2008 reg 4. - Scottish Child Payment: SSI 2020/351 reg 18(e)-(f). - The benefit cap exemption: HB Regs 2006 reg 75F(1)(a); UC Regs 2013 reg @@ -29,6 +33,9 @@ 11A(1)(e), 14(4)(b) and 15(4). - The higher Pension Credit earnings disregard for a claimant or partner on employment and support allowance: SPC Regs 2002 Sch VI para 4(1)(a)(vii). +- The Childcare Offer for Wales gross income limit for each parent: Welsh + Government guidance for local authorities, version 8.3 (April 2026), + paragraphs 57 and 69. A member of the benefit unit who is neither the claimant, the partner nor a child or young person they are responsible for (for example a non-dependent @@ -38,7 +45,7 @@ member reports never changes any of these readers for the claimant's family or for its existing members; - adding such a member changes a reader only by ending the family's severe - disability premium, or, for the two Council Tax Reduction readers, by + disability premium, or, for the three Council Tax Reduction readers, by becoming the household head (these families flag none, so the eldest member is the head) who is liable and applies alone, so that the applicant changes (CTR_APPLICANT_READERS). A non-dependant aged 18 or over ends the @@ -128,6 +135,7 @@ "housing_benefit_pension_age_regulations_apply", "has_mixed_age_couple_pension_credit_saving", "pension_credit_earnings_disregard", + "council_tax_reduction_working_age_personal_allowance", ] MEMBER_READERS = [ "is_scp_eligible", @@ -136,6 +144,7 @@ "is_on_income_based_jsa", "is_on_income_support", "extended_childcare_entitlement_limited_capability_or_specified_benefit", + "wales_childcare_offer_parent_condition", ] # Readers built from the members' own ESA and JSA reports, their work and the # household's capital alone, which the severe disability premium cannot reach. @@ -263,13 +272,14 @@ def other_members(draw): # added member older than the claimant and partner becomes the liable head, # who then applies alone (council_tax_reduction_head_applies_alone). Their # presence then changes the applicant, which is intended, so those families -# are left out of the comparison with the family on its own for these two +# are left out of the comparison with the family on its own for these # readers. What the added member reports still never changes them: the first # property compares a silent added member with the member as drawn for every # family. CTR_APPLICANT_READERS = [ "council_tax_reduction_applicable_income", "council_tax_reduction_relevant_income_based_benefit", + "council_tax_reduction_working_age_personal_allowance", ] @@ -499,14 +509,16 @@ def test_adult_non_dependant_ends_the_severe_disability_premium(): # --- Further family shapes (begin) --- # Some readers only bite for a claimant over state pension age (the Housing # Benefit regulations that apply, the mixed-age couple saving), for a single -# applicant under 25, or for parents of a young child of whom only one works -# (the extended childcare partner condition). The families above rarely take -# those shapes, so three more properties check every family and member reader -# on them. The claimant and partner seldom report an award themselves, and on -# the savings drawn below the £16,000 capital limit the added member's award -# survives tariff income, so a reader that wrongly counts it changes (£20,000 -# of savings screens income-related ESA and income-based JSA to nil). The -# shapes pay no rent, so Universal Credit stays far below the benefit cap. +# applicant under 25, for parents of a young child of whom only one works +# (the extended childcare partner condition), or for a parent in Wales with +# gross income just under £100,000 (the Childcare Offer for Wales income +# limit). The families above rarely take those shapes, so four more +# properties check every family and member reader on them. The claimant and +# partner seldom report an award themselves, and on the savings drawn below +# the £16,000 capital limit the added member's award survives tariff income, +# so a reader that wrongly counts it changes (£20,000 of savings screens +# income-related ESA and income-based JSA to nil). The shapes pay no rent, so +# Universal Credit stays far below the benefit cap. # The cap reads only the couple's own awards and the family's # (benefit_cap_reduction), not another member's; the first property checks # that on JSA_COUPLE_WITH_LODGER, a family that an added member's £3,000 of @@ -624,6 +636,43 @@ def working_parent_families(draw): return [working, not_working], [{"age": draw(st.integers(1, 4))}], household +@st.composite +def high_earning_welsh_parent_families(draw): + """Parents of a child aged three or four in Wales, one of whom works and + has gross income just under the Childcare Offer for Wales limit of + £100,000 (guidance paras 57 and 69). The limit counts the benefit unit's + benefits, shared equally between the claimant and any partner, so an + added member's own award of £3,000 or more would take that parent over it + if it counted: the wages leave room for one child's Child Benefit + (£1,354.60 in 2025-26, half each in a couple) but not for the award, even + after tariff income on £7,000 of savings (£208).""" + couple = draw(st.booleans()) + earner = { + "age": draw(st.integers(25, 45)), + "is_parent": True, + "employment_income": 99_000 if couple else 98_000, + **draw(couple_award_reports()), + } + adults = [earner] + if couple: + adults.append( + { + "age": draw(st.integers(25, 45)), + "is_parent": True, + "employment_income": draw(st.sampled_from([0, 20_000])), + "current_education": draw( + st.sampled_from(["NOT_IN_EDUCATION", "TERTIARY"]) + ), + **draw(couple_award_reports()), + } + ) + household = { + "country": "WALES", + "savings": draw(st.sampled_from([0, 7_000])), + } + return adults, [{"age": draw(st.integers(3, 4))}], household + + def _family_readers_never_change(drawn, enter_is_mixed_age_couple=False): without = [(*family, None) for family, _ in drawn] with_other = [(*family, other) for family, other in drawn] @@ -737,6 +786,20 @@ def test_other_members_awards_never_change_the_readers_for_working_parents(drawn _family_readers_never_change(drawn) +@SETTINGS +@given( + st.lists( + st.tuples(high_earning_welsh_parent_families(), other_members_with_awards()), + min_size=1, + max_size=6, + ) +) +def test_other_members_awards_never_change_the_readers_for_welsh_high_earners( + drawn, +): + _family_readers_never_change(drawn) + + # --- Further family shapes (end) --- diff --git a/policyengine_uk/tests/test_wales_childcare_offer_income_sources.py b/policyengine_uk/tests/test_wales_childcare_offer_income_sources.py index f083cb4b4f..67a54f5ae4 100644 --- a/policyengine_uk/tests/test_wales_childcare_offer_income_sources.py +++ b/policyengine_uk/tests/test_wales_childcare_offer_income_sources.py @@ -95,8 +95,8 @@ def sources(name): "housing_benefit", "income_support", "pension_credit", - "esa_income", - "jsa_income", + "claimant_or_partner_esa_income", + "claimant_or_partner_jsa_income", }, }