From e4eb40c8a2e7224fe46f1f32dba48336ac484220 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 24 Oct 2026 17:44:59 -0400 Subject: [PATCH 1/2] Count widowed parent's allowance as Pension Credit income MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SPC Regs 2002 reg 15(1) prescribes all social security benefits except a closed list, which excepts bereavement support payment but not widowed parent's allowance; Sch IV disregards none of it. The guarantee credit income list left it out while Carer's Allowance and Carer Support Payment treat it as an overlapping benefit, so a reported award displaced the carer's benefit and Guarantee Credit replaced it pound for pound. Adds YAML cases and property tests: Guarantee Credit falls pound for pound with the allowance net of tax and any carer's benefit it displaces; pension- age Housing Benefit counts it less £15 a week (SI 2006/214 Sch 5 para 7); Savings Credit counts it as qualifying income. Co-Authored-By: Claude Opus 5.5 --- ...-credit-widowed-parents-allowance.fixed.md | 1 + .../guarantee_credit/income.yaml | 9 + ...sion_credit_widowed_parents_allowance.yaml | 137 ++++++++++++ ...it_widowed_parents_allowance_properties.py | 204 ++++++++++++++++++ .../gov/dwp/widowed_parents_allowance.py | 7 +- 5 files changed, 356 insertions(+), 2 deletions(-) create mode 100644 changelog.d/pension-credit-widowed-parents-allowance.fixed.md create mode 100644 policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance.yaml create mode 100644 policyengine_uk/tests/test_pension_credit_widowed_parents_allowance_properties.py diff --git a/changelog.d/pension-credit-widowed-parents-allowance.fixed.md b/changelog.d/pension-credit-widowed-parents-allowance.fixed.md new file mode 100644 index 0000000000..2e258f04e2 --- /dev/null +++ b/changelog.d/pension-credit-widowed-parents-allowance.fixed.md @@ -0,0 +1 @@ +- Counted widowed parent's allowance as Pension Credit income (State Pension Credit Regulations 2002 reg. 15(1)), so an award that displaces Carer's Allowance or Carer Support Payment no longer raises Guarantee Credit by the amount displaced. diff --git a/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml b/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml index 28b819f856..666520e8f7 100644 --- a/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml +++ b/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml @@ -42,3 +42,12 @@ values: - sda - incapacity_benefit - maternity_allowance + # Reg. 15(1) does not list widowed parent's allowance either (it excepts + # bereavement support payment, at (n)), and Sch. IV disregards none of it. + # SSCBA 1992 s.39A(4) and (5) end the allowance at pensionable age and + # suspend it while the recipient lives with a partner, so a lawful award + # should not meet a Pension Credit assessment; a reported one counts in + # full. It overlaps with Carer's Allowance and Carer Support Payment, so + # leaving it out let an award raise Guarantee Credit by the carer's benefit + # it displaced. + - widowed_parents_allowance diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance.yaml new file mode 100644 index 0000000000..72197bf8c6 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance.yaml @@ -0,0 +1,137 @@ +# Widowed parent's allowance (WPA) in Pension Credit and pension-age Housing +# Benefit income. +# +# SPC Regs 2002 reg 15(1): "all social security benefits are prescribed except" +# a closed list. The list excepts bereavement support payment (n) but not WPA, +# Sch IV disregards none of it, and reg 9 does not make it non-qualifying +# income for Savings Credit. HB (SPC) Regs 2006 Sch 5 para 7 disregards £15 a +# week of it for pension-age Housing Benefit. +# +# SSCBA 1992 s.39A(4) and (5) end the allowance at pensionable age and suspend +# it while the recipient lives with a partner, so these pensioners could not +# lawfully be paid it. The cases test how a reported award is counted, not +# whether it would be paid. +# Weekly rates, x 52: SI 2026/148 art 29, standard minimum guarantee 238.00 +# single and 363.25 couple, Savings Credit threshold 208.07 single; Carer's +# Allowance 86.45 from 6 April 2026 +# (gov.dwp.carers_allowance.rate and the up-rating order it cites). +# Nobody pays income tax: each total income is below the personal allowance. + +- name: Case 1, single pensioner with a reported widowed parent's allowance. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + state_pension: 0 + private_pension_income: 1_000 + widowed_parents_allowance_reported: 2_000 + benunits: + benunit: + members: [person1] + households: + household: + members: [person1] + country: ENGLAND + output: + pension_credit_income: 3_000 + # 12,376 - 3,000 = 9,376. + guarantee_credit: 238 * 52 - 3_000 + +- name: Case 2, pensioner couple whose partner has a reported widowed parent's allowance. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + state_pension: 0 + private_pension_income: 5_000 + person2: + age: 70 + state_pension: 0 + widowed_parents_allowance_reported: 3_000 + benunits: + benunit: + members: [person1, person2] + households: + household: + members: [person1, person2] + country: ENGLAND + output: + pension_credit_income: 8_000 + # 18,889 - 8,000 = 10,889. + guarantee_credit: 363.25 * 52 - 8_000 + +- name: Case 3, the allowance displaces Carer's Allowance, so Pension Credit income is unchanged. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + state_pension: 0 + care_hours: 35 + widowed_parents_allowance_reported: 1_000 + benunits: + benunit: + members: [person1] + households: + household: + members: [person1] + country: ENGLAND + output: + # The Overlapping Benefits Regulations reduce Carer's Allowance by the + # 1,000: 4,495.40 - 1,000 = 3,495.40. + carers_allowance: 86.45 * 52 - 1_000 + # 1,000 + 3,495.40 = 4,495.40, the same as with no allowance. + pension_credit_income: 86.45 * 52 + +- name: Case 4, Savings Credit counts the allowance as qualifying income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + # Reached State Pension age before 6 April 2016. + age: 80 + state_pension: 0 + private_pension_income: 9_000 + widowed_parents_allowance_reported: 2_000 + benunits: + benunit: + members: [person1] + households: + household: + members: [person1] + country: ENGLAND + output: + pension_credit_income: 11_000 + savings_credit_income: 11_000 + # Qualifying income is above the threshold (208.07 x 52 = 10,819.64) and + # income below the guarantee (12,376), so 0.6 x 180.36 = 108.22. + savings_credit: 0.6 * (11_000 - 208.07 * 52) + # 12,376 - 11,000 = 1,376. + guarantee_credit: 238 * 52 - 11_000 + +- name: Case 5, pension-age Housing Benefit counts the allowance less £15 a week. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + state_pension: 0 + widowed_parents_allowance_reported: 2_000 + benunits: + benunit: + members: [person1] + households: + household: + members: [person1] + country: ENGLAND + output: + # 2,000 - 15 x 52 = 1,220. + housing_benefit_widowed_parents_allowance_income: 2_000 - 15 * 52 + pension_credit_income: 2_000 diff --git a/policyengine_uk/tests/test_pension_credit_widowed_parents_allowance_properties.py b/policyengine_uk/tests/test_pension_credit_widowed_parents_allowance_properties.py new file mode 100644 index 0000000000..243fa77359 --- /dev/null +++ b/policyengine_uk/tests/test_pension_credit_widowed_parents_allowance_properties.py @@ -0,0 +1,204 @@ +"""Widowed parent's allowance in Pension Credit and Housing Benefit income. + +The State Pension Credit Regulations 2002 reg 15(1) prescribe "all social +security benefits" as income except a closed list. The list excepts +bereavement support payment (n) but not widowed parent's allowance (WPA), +Sch IV disregards none of it, and reg 9 does not make it non-qualifying income +for Savings Credit. Pension-age Housing Benefit counts it less £15 a week +(HB (SPC) Regs 2006 Sch 5 para 7). + +SSCBA 1992 s.39A(4) and (5) end the allowance at pensionable age and suspend +it while the recipient lives with a partner, so a lawful award should not meet +either assessment. The model takes a reported award as given, though, and WPA +overlaps with Carer's Allowance and Carer Support Payment. While Pension Credit +left WPA out, an award that displaced either carer's benefit raised Guarantee +Credit by the amount displaced. + +Draws: the families of test_pension_credit_prescribed_benefits_properties.py +(single people and couples over State Pension age, some with a carer), with a +WPA award added to the first adult. + +Invariants: + +1. Guarantee Credit is non-increasing in WPA, and while it is positive it + falls pound for pound with the extra Pension Credit income, which is the + extra WPA less the extra income tax and National Insurance, less any + Carer's Allowance or Carer Support Payment it displaces. +2. Differential: where neither Guarantee Credit nor Savings Credit is due and + Housing Benefit income is above its zero floor, Housing Benefit applicable + income equals Pension Credit income less the £15 weekly disregard, capped at + the award. +3. Savings Credit income moves with Pension Credit income: WPA is qualifying + income, so adding it changes Savings Credit income by exactly the change in + Pension Credit income wherever neither is at its zero floor. +""" + +import numpy as np +from hypothesis import example, given +from hypothesis import strategies as st + +from policyengine_uk.tests.test_pension_credit_prescribed_benefits_properties import ( + AMOUNTS, + PENSIONS, + PRESCRIBED_BENEFITS, + PROPERTY_SETTINGS, + calculate, + family, + money, +) + +WPA = "widowed_parents_allowance" +# HB (SPC) Regs 2006 Sch 5 para 7: £15 a week, over the model's 52-week year. +HB_DISREGARD = 15 * 52 + + +def carer(country): + """A single pensioner with no State Pension who cares 35 hours a week.""" + return dict( + adults=[dict(age=70, state_pension=0.0)], + benefits={benefit: (0, 0.0) for benefit in PRESCRIBED_BENEFITS}, + carer=0, + by_hours=True, + country=country, + rent=6_000.0, + council_tax=1_500.0, + savings=0.0, + ) + + +# Carer's Allowance in England and Carer Support Payment in Scotland, each +# paid in full until WPA displaces it. +CARERS = [carer("ENGLAND"), carer("SCOTLAND")] + + +def test_an_award_that_displaces_a_carer_benefit_leaves_guarantee_credit_unchanged(): + for fam in CARERS: + g = calculate( + [(fam, 0, {}), (fam, 0, {WPA: 1_000})], + (2,), + [ + "guarantee_credit", + "pension_credit_income", + "carers_allowance", + "carer_support_payment", + "income_tax", + ], + ) + carer_benefit = g["carers_allowance"] + g["carer_support_payment"] + assert np.allclose(np.diff(carer_benefit), -1_000, atol=0.01), (fam, g) + assert np.allclose(g["income_tax"], 0, atol=0.01), (fam, g) + assert g["guarantee_credit"][0] > 1_000, (fam, g) + assert np.allclose(np.diff(g["pension_credit_income"]), 0, atol=0.01), ( + fam, + g, + ) + assert np.allclose(np.diff(g["guarantee_credit"]), 0, atol=0.01), (fam, g) + + +@PROPERTY_SETTINGS +@given(st.lists(family(state_pension=8_000), min_size=1, max_size=4)) +@example(CARERS) +def test_guarantee_credit_falls_pound_for_pound_with_widowed_parents_allowance( + families, +): + rows = [(fam, 0, {WPA: amount}) for fam in families for amount in AMOUNTS] + g = calculate( + rows, + (len(families), len(AMOUNTS)), + [ + "guarantee_credit", + "pension_credit_income", + "income_tax", + "national_insurance", + "carers_allowance", + "carer_support_payment", + ], + ) + gc = g["guarantee_credit"] + pc_income = g["pension_credit_income"] + tax = g["income_tax"] + g["national_insurance"] + carer_benefit = g["carers_allowance"] + g["carer_support_payment"] + assert np.all(np.diff(gc, axis=-1) <= 0.01), (families, gc) + extra_income = np.diff(pc_income, axis=-1) + positive_income = (pc_income[..., :-1] > 0) & (pc_income[..., 1:] > 0) + expected = ( + np.diff(AMOUNTS) - np.diff(tax, axis=-1) + np.diff(carer_benefit, axis=-1) + ) + assert np.allclose( + extra_income[positive_income], expected[positive_income], atol=0.01 + ), (families, pc_income, tax, carer_benefit) + paid = gc[..., 1:] > 0 + assert np.allclose(-np.diff(gc, axis=-1)[paid], extra_income[paid], atol=0.01), ( + families, + gc, + pc_income, + ) + + +@PROPERTY_SETTINGS +@given( + st.lists(family(high=4_000, state_pension=4_000), min_size=1, max_size=4), + money(15_000), +) +def test_housing_benefit_counts_widowed_parents_allowance_less_15_a_week( + families, amount +): + rows = [(fam, pension, {WPA: amount}) for fam in families for pension in PENSIONS] + g = calculate( + rows, + (len(families), len(PENSIONS)), + [ + "guarantee_credit", + "savings_credit", + "pension_credit_income", + "housing_benefit_eligible", + "housing_benefit_applicable_income", + ], + ) + hb_income = g["housing_benefit_applicable_income"] + compared = ( + (g["guarantee_credit"] <= 0) + & (g["savings_credit"] <= 0) + & g["housing_benefit_eligible"].astype(bool) + & (hb_income > 0) + ) + expected = g["pension_credit_income"] - min(amount, HB_DISREGARD) + assert np.allclose(hb_income[compared], expected[compared], atol=0.01), ( + families, + amount, + hb_income[compared], + expected[compared], + ) + + +@PROPERTY_SETTINGS +@given( + st.lists( + family(min_age=77, high=3_000, state_pension=4_000), min_size=2, max_size=4 + ), + # Private pensions that put qualifying income near the Savings Credit + # window, as in the reg 9 property. + st.lists(money(18_000, low=8_000), min_size=4, max_size=4), + money(15_000), +) +def test_savings_credit_income_moves_with_pension_credit_income( + families, pensions, amount +): + rows = [ + (fam, pension, {WPA: added}) + for fam, pension in zip(families, pensions) + for added in (0, amount) + ] + g = calculate( + rows, + (len(families), 2), + ["pension_credit_income", "savings_credit_income"], + ) + pc_income = g["pension_credit_income"] + sc_income = g["savings_credit_income"] + unfloored = np.all(sc_income > 0, axis=-1) + assert np.allclose( + np.diff(sc_income, axis=-1)[unfloored], + np.diff(pc_income, axis=-1)[unfloored], + atol=0.01, + ), (families, amount, pc_income, sc_income) diff --git a/policyengine_uk/variables/gov/dwp/widowed_parents_allowance.py b/policyengine_uk/variables/gov/dwp/widowed_parents_allowance.py index 63f3c32681..543df5aa3b 100644 --- a/policyengine_uk/variables/gov/dwp/widowed_parents_allowance.py +++ b/policyengine_uk/variables/gov/dwp/widowed_parents_allowance.py @@ -16,8 +16,11 @@ class widowed_parents_allowance(Variable): "overlaps with Carer's Allowance and Carer Support Payment. Housing " "Benefit counts it less £15 a week. It is not payable from State " "Pension age or while the recipient lives with a partner (s.39A(4) " - "and (5)), so it never reaches a Pension Credit or pension-age " - "Housing Benefit assessment." + "and (5)), so a lawful award never reaches a Pension Credit or " + "pension-age Housing Benefit assessment. A reported one counts in " + "full for Pension Credit (SPC Regs 2002 reg. 15(1)) and less £15 a " + "week for pension-age Housing Benefit (HB (SPC) Regs 2006 Sch. 5 " + "para. 7)." ) definition_period = YEAR unit = GBP From 352c9e89011bc226ed99f5e33e72383f603b6cc7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 24 Oct 2026 21:21:00 -0400 Subject: [PATCH 2/2] =?UTF-8?q?Disregard=20=C2=A310=20a=20week=20of=20wido?= =?UTF-8?q?wed=20parent's=20allowance=20for=20Pension=20Credit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SPC Regs 2002 Sch IV para 7, applied by reg 17(7), disregards "£10 of any widowed parent's allowance to which the claimant is entitled under section 39A of the 1992 Act". The independent review found the PR counted it in full. A new benefit-unit variable, pension_credit_widowed_parents_allowance_income, counts the claimant's and partner's allowances each less £10 a week (reg 14 applies Part III's references to the claimant equally to a partner), as pension_credit_war_pension_income does for Sch IV para 1, and replaces the raw allowance in the income list. The YAML cases are corrected by hand from SI 2026/148 rates. Case 4 is retuned to stay inside the Savings Credit window. Cases 6 and 7 pin the per-member reading and an allowance under £10 a week. The property tests now expect a displacing award to raise Guarantee Credit by the £520 disregarded, use the pre-charge income tax that main's Pension Credit income deducts, and expect Housing Benefit to differ by the extra £5 a week. Co-Authored-By: Claude Opus 5.5 --- ...-credit-widowed-parents-allowance.fixed.md | 2 +- .../guarantee_credit/income.yaml | 16 +-- .../widowed_parents_allowance_disregard.yaml | 14 +++ ...sion_credit_widowed_parents_allowance.yaml | 104 ++++++++++++++---- ...it_widowed_parents_allowance_properties.py | 58 ++++++---- ...credit_widowed_parents_allowance_income.py | 35 ++++++ .../gov/dwp/widowed_parents_allowance.py | 8 +- 7 files changed, 181 insertions(+), 56 deletions(-) create mode 100644 policyengine_uk/parameters/gov/dwp/pension_credit/income/widowed_parents_allowance_disregard.yaml create mode 100644 policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance_income.py diff --git a/changelog.d/pension-credit-widowed-parents-allowance.fixed.md b/changelog.d/pension-credit-widowed-parents-allowance.fixed.md index 2e258f04e2..49964eb043 100644 --- a/changelog.d/pension-credit-widowed-parents-allowance.fixed.md +++ b/changelog.d/pension-credit-widowed-parents-allowance.fixed.md @@ -1 +1 @@ -- Counted widowed parent's allowance as Pension Credit income (State Pension Credit Regulations 2002 reg. 15(1)), so an award that displaces Carer's Allowance or Carer Support Payment no longer raises Guarantee Credit by the amount displaced. +- Counted widowed parent's allowance as Pension Credit income less £10 a week (State Pension Credit Regulations 2002 reg. 15(1) and Sch. IV para. 7), so an award that displaces Carer's Allowance or Carer Support Payment no longer raises Guarantee Credit by the whole amount displaced. diff --git a/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml b/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml index 666520e8f7..8b169fadd3 100644 --- a/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml +++ b/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml @@ -43,11 +43,11 @@ values: - incapacity_benefit - maternity_allowance # Reg. 15(1) does not list widowed parent's allowance either (it excepts - # bereavement support payment, at (n)), and Sch. IV disregards none of it. - # SSCBA 1992 s.39A(4) and (5) end the allowance at pensionable age and - # suspend it while the recipient lives with a partner, so a lawful award - # should not meet a Pension Credit assessment; a reported one counts in - # full. It overlaps with Carer's Allowance and Carer Support Payment, so - # leaving it out let an award raise Guarantee Credit by the carer's benefit - # it displaced. - - widowed_parents_allowance + # bereavement support payment, at (n)). The claimant's and partner's + # allowances count, each less £10 a week (Sch. IV para. 7). SSCBA 1992 + # s.39A(4) and (5) end the allowance at pensionable age and suspend it + # while the recipient lives with a partner, so a lawful award should not + # meet a Pension Credit assessment; a reported one counts. It overlaps with + # Carer's Allowance and Carer Support Payment, so leaving it out let an + # award raise Guarantee Credit by the carer's benefit it displaced. + - pension_credit_widowed_parents_allowance_income diff --git a/policyengine_uk/parameters/gov/dwp/pension_credit/income/widowed_parents_allowance_disregard.yaml b/policyengine_uk/parameters/gov/dwp/pension_credit/income/widowed_parents_allowance_disregard.yaml new file mode 100644 index 0000000000..c8c003dc48 --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/pension_credit/income/widowed_parents_allowance_disregard.yaml @@ -0,0 +1,14 @@ +description: Weekly amount of a widowed parent's allowance disregarded from income for Pension Credit. +values: + 2003-10-06: 10 +metadata: + unit: currency-GBP + period: week + label: Pension Credit widowed parent's allowance disregard + reference: + - title: State Pension Credit Regulations 2002 Sch. IV para. 7 + href: https://www.legislation.gov.uk/uksi/2002/1792/schedule/IV/paragraph/7 + - title: State Pension Credit Regulations 2002 reg. 17(7) + href: https://www.legislation.gov.uk/uksi/2002/1792/regulation/17 + - title: State Pension Credit Regulations 2002 reg. 1(1) (in force 6 October 2003) + href: https://www.legislation.gov.uk/uksi/2002/1792/regulation/1 diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance.yaml index 72197bf8c6..11b389631f 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance.yaml @@ -2,10 +2,14 @@ # Benefit income. # # SPC Regs 2002 reg 15(1): "all social security benefits are prescribed except" -# a closed list. The list excepts bereavement support payment (n) but not WPA, -# Sch IV disregards none of it, and reg 9 does not make it non-qualifying -# income for Savings Credit. HB (SPC) Regs 2006 Sch 5 para 7 disregards £15 a -# week of it for pension-age Housing Benefit. +# a closed list. The list excepts bereavement support payment (n) but not WPA. +# Reg 17(7) applies Sch IV, whose para 7 disregards "£10 of any widowed +# parent's allowance to which the claimant is entitled under section 39A of +# the 1992 Act", and reg 14 applies Part III's references to the claimant +# equally to a partner, so each member's allowance gets its own £10. Reg 9 +# does not make WPA non-qualifying income for Savings Credit. HB (SPC) Regs +# 2006 Sch 5 para 7 disregards £15 a week of it for pension-age Housing +# Benefit. # # SSCBA 1992 s.39A(4) and (5) end the allowance at pensionable age and suspend # it while the recipient lives with a partner, so these pensioners could not @@ -35,9 +39,12 @@ members: [person1] country: ENGLAND output: - pension_credit_income: 3_000 - # 12,376 - 3,000 = 9,376. - guarantee_credit: 238 * 52 - 3_000 + # 2,000 - 10 x 52 = 1,480. + pension_credit_widowed_parents_allowance_income: 2_000 - 10 * 52 + # 1,000 + 1,480 = 2,480. + pension_credit_income: 2_480 + # 12,376 - 2,480 = 9,896. + guarantee_credit: 238 * 52 - 2_480 - name: Case 2, pensioner couple whose partner has a reported widowed parent's allowance. period: 2026 @@ -60,11 +67,15 @@ members: [person1, person2] country: ENGLAND output: - pension_credit_income: 8_000 - # 18,889 - 8,000 = 10,889. - guarantee_credit: 363.25 * 52 - 8_000 + # The partner's allowance counts (SPCA 2002 s.5), less £10 a week: + # 3,000 - 520 = 2,480. + pension_credit_widowed_parents_allowance_income: 3_000 - 10 * 52 + # 5,000 + 2,480 = 7,480. + pension_credit_income: 7_480 + # 18,889 - 7,480 = 11,409. + guarantee_credit: 363.25 * 52 - 7_480 -- name: Case 3, the allowance displaces Carer's Allowance, so Pension Credit income is unchanged. +- name: Case 3, the allowance displaces Carer's Allowance, so Pension Credit income falls by the £10 a week disregarded. period: 2026 absolute_error_margin: 0.01 input: @@ -85,8 +96,9 @@ # The Overlapping Benefits Regulations reduce Carer's Allowance by the # 1,000: 4,495.40 - 1,000 = 3,495.40. carers_allowance: 86.45 * 52 - 1_000 - # 1,000 + 3,495.40 = 4,495.40, the same as with no allowance. - pension_credit_income: 86.45 * 52 + # (1,000 - 520) + 3,495.40 = 3,975.40: 520 less than the 4,495.40 with + # no allowance. + pension_credit_income: 86.45 * 52 - 10 * 52 - name: Case 4, Savings Credit counts the allowance as qualifying income. period: 2026 @@ -97,7 +109,7 @@ # Reached State Pension age before 6 April 2016. age: 80 state_pension: 0 - private_pension_income: 9_000 + private_pension_income: 9_500 widowed_parents_allowance_reported: 2_000 benunits: benunit: @@ -107,13 +119,14 @@ members: [person1] country: ENGLAND output: - pension_credit_income: 11_000 - savings_credit_income: 11_000 + # 9,500 + (2,000 - 520) = 10,980. + pension_credit_income: 10_980 + savings_credit_income: 10_980 # Qualifying income is above the threshold (208.07 x 52 = 10,819.64) and - # income below the guarantee (12,376), so 0.6 x 180.36 = 108.22. - savings_credit: 0.6 * (11_000 - 208.07 * 52) - # 12,376 - 11,000 = 1,376. - guarantee_credit: 238 * 52 - 11_000 + # income below the guarantee (12,376), so 0.6 x 160.36 = 96.22. + savings_credit: 0.6 * (10_980 - 208.07 * 52) + # 12,376 - 10,980 = 1,396. + guarantee_credit: 238 * 52 - 10_980 - name: Case 5, pension-age Housing Benefit counts the allowance less £15 a week. period: 2026 @@ -134,4 +147,53 @@ output: # 2,000 - 15 x 52 = 1,220. housing_benefit_widowed_parents_allowance_income: 2_000 - 15 * 52 - pension_credit_income: 2_000 + # 2,000 - 10 x 52 = 1,480. + pension_credit_income: 2_000 - 10 * 52 + +- name: Case 6, each member of a couple gets their own £10 a week. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + state_pension: 0 + widowed_parents_allowance_reported: 1_000 + person2: + age: 70 + state_pension: 0 + widowed_parents_allowance_reported: 1_000 + benunits: + benunit: + members: [person1, person2] + households: + household: + members: [person1, person2] + country: ENGLAND + output: + # Reg 14: each allowance less 520, so 2 x 480 = 960. + pension_credit_widowed_parents_allowance_income: 2 * (1_000 - 10 * 52) + pension_credit_income: 960 + # 18,889 - 960 = 17,929. + guarantee_credit: 363.25 * 52 - 960 + +- name: Case 7, an allowance of £10 a week or less counts as nil. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + state_pension: 0 + widowed_parents_allowance_reported: 300 + benunits: + benunit: + members: [person1] + households: + household: + members: [person1] + country: ENGLAND + output: + pension_credit_widowed_parents_allowance_income: 0 + pension_credit_income: 0 + guarantee_credit: 238 * 52 diff --git a/policyengine_uk/tests/test_pension_credit_widowed_parents_allowance_properties.py b/policyengine_uk/tests/test_pension_credit_widowed_parents_allowance_properties.py index 243fa77359..6c481ddf8f 100644 --- a/policyengine_uk/tests/test_pension_credit_widowed_parents_allowance_properties.py +++ b/policyengine_uk/tests/test_pension_credit_widowed_parents_allowance_properties.py @@ -2,17 +2,19 @@ The State Pension Credit Regulations 2002 reg 15(1) prescribe "all social security benefits" as income except a closed list. The list excepts -bereavement support payment (n) but not widowed parent's allowance (WPA), -Sch IV disregards none of it, and reg 9 does not make it non-qualifying income -for Savings Credit. Pension-age Housing Benefit counts it less £15 a week -(HB (SPC) Regs 2006 Sch 5 para 7). +bereavement support payment (n) but not widowed parent's allowance (WPA). +Sch IV para 7 (applied by reg 17(7)) disregards £10 a week of each member's +WPA, and reg 9 does not make it non-qualifying income for Savings Credit. +Pension-age Housing Benefit counts it less £15 a week (HB (SPC) Regs 2006 +Sch 5 para 7). SSCBA 1992 s.39A(4) and (5) end the allowance at pensionable age and suspend it while the recipient lives with a partner, so a lawful award should not meet either assessment. The model takes a reported award as given, though, and WPA overlaps with Carer's Allowance and Carer Support Payment. While Pension Credit left WPA out, an award that displaced either carer's benefit raised Guarantee -Credit by the amount displaced. +Credit by the amount displaced; counted less £10 a week, it raises Guarantee +Credit by at most the disregard. Draws: the families of test_pension_credit_prescribed_benefits_properties.py (single people and couples over State Pension age, some with a carer), with a @@ -20,14 +22,15 @@ Invariants: -1. Guarantee Credit is non-increasing in WPA, and while it is positive it - falls pound for pound with the extra Pension Credit income, which is the - extra WPA less the extra income tax and National Insurance, less any - Carer's Allowance or Carer Support Payment it displaces. +1. Extra Pension Credit income is the extra WPA above £10 a week, less the + extra income tax and National Insurance, less any Carer's Allowance or + Carer Support Payment it displaces. While Guarantee Credit is positive it + falls pound for pound with that income, and it never rises where no + carer's benefit is displaced. 2. Differential: where neither Guarantee Credit nor Savings Credit is due and Housing Benefit income is above its zero floor, Housing Benefit applicable - income equals Pension Credit income less the £15 weekly disregard, capped at - the award. + income equals Pension Credit income less the extra £5 a week Housing + Benefit disregards: min(WPA, £15 x 52) - min(WPA, £10 x 52). 3. Savings Credit income moves with Pension Credit income: WPA is qualifying income, so adding it changes Savings Credit income by exactly the change in Pension Credit income wherever neither is at its zero floor. @@ -41,6 +44,7 @@ AMOUNTS, PENSIONS, PRESCRIBED_BENEFITS, + INCOME_TAX, PROPERTY_SETTINGS, calculate, family, @@ -48,7 +52,9 @@ ) WPA = "widowed_parents_allowance" -# HB (SPC) Regs 2006 Sch 5 para 7: £15 a week, over the model's 52-week year. +# Over the model's 52-week year: SPC Regs 2002 Sch IV para 7, £10 a week; +# HB (SPC) Regs 2006 Sch 5 para 7, £15 a week. +PC_DISREGARD = 10 * 52 HB_DISREGARD = 15 * 52 @@ -71,7 +77,7 @@ def carer(country): CARERS = [carer("ENGLAND"), carer("SCOTLAND")] -def test_an_award_that_displaces_a_carer_benefit_leaves_guarantee_credit_unchanged(): +def test_an_award_that_displaces_a_carer_benefit_raises_guarantee_credit_by_the_disregard(): for fam in CARERS: g = calculate( [(fam, 0, {}), (fam, 0, {WPA: 1_000})], @@ -81,18 +87,22 @@ def test_an_award_that_displaces_a_carer_benefit_leaves_guarantee_credit_unchang "pension_credit_income", "carers_allowance", "carer_support_payment", - "income_tax", + INCOME_TAX, ], ) carer_benefit = g["carers_allowance"] + g["carer_support_payment"] assert np.allclose(np.diff(carer_benefit), -1_000, atol=0.01), (fam, g) - assert np.allclose(g["income_tax"], 0, atol=0.01), (fam, g) + assert np.allclose(g[INCOME_TAX], 0, atol=0.01), (fam, g) assert g["guarantee_credit"][0] > 1_000, (fam, g) - assert np.allclose(np.diff(g["pension_credit_income"]), 0, atol=0.01), ( + # 1,000 of WPA counts as 480 and displaces 1,000 of the carer's + # benefit, so Pension Credit income falls by the 520 disregarded. + assert np.allclose( + np.diff(g["pension_credit_income"]), -PC_DISREGARD, atol=0.01 + ), (fam, g) + assert np.allclose(np.diff(g["guarantee_credit"]), PC_DISREGARD, atol=0.01), ( fam, g, ) - assert np.allclose(np.diff(g["guarantee_credit"]), 0, atol=0.01), (fam, g) @PROPERTY_SETTINGS @@ -108,7 +118,7 @@ def test_guarantee_credit_falls_pound_for_pound_with_widowed_parents_allowance( [ "guarantee_credit", "pension_credit_income", - "income_tax", + INCOME_TAX, "national_insurance", "carers_allowance", "carer_support_payment", @@ -116,13 +126,15 @@ def test_guarantee_credit_falls_pound_for_pound_with_widowed_parents_allowance( ) gc = g["guarantee_credit"] pc_income = g["pension_credit_income"] - tax = g["income_tax"] + g["national_insurance"] + tax = g[INCOME_TAX] + g["national_insurance"] carer_benefit = g["carers_allowance"] + g["carer_support_payment"] - assert np.all(np.diff(gc, axis=-1) <= 0.01), (families, gc) + displaced = np.diff(carer_benefit, axis=-1) < -0.01 + assert np.all(np.diff(gc, axis=-1)[~displaced] <= 0.01), (families, gc) extra_income = np.diff(pc_income, axis=-1) positive_income = (pc_income[..., :-1] > 0) & (pc_income[..., 1:] > 0) + counted = np.maximum(AMOUNTS - PC_DISREGARD, 0) expected = ( - np.diff(AMOUNTS) - np.diff(tax, axis=-1) + np.diff(carer_benefit, axis=-1) + np.diff(counted) - np.diff(tax, axis=-1) + np.diff(carer_benefit, axis=-1) ) assert np.allclose( extra_income[positive_income], expected[positive_income], atol=0.01 @@ -162,7 +174,9 @@ def test_housing_benefit_counts_widowed_parents_allowance_less_15_a_week( & g["housing_benefit_eligible"].astype(bool) & (hb_income > 0) ) - expected = g["pension_credit_income"] - min(amount, HB_DISREGARD) + expected = g["pension_credit_income"] - ( + min(amount, HB_DISREGARD) - min(amount, PC_DISREGARD) + ) assert np.allclose(hb_income[compared], expected[compared], atol=0.01), ( families, amount, diff --git a/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance_income.py b/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance_income.py new file mode 100644 index 0000000000..66fbea0c6f --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance_income.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * + + +class pension_credit_widowed_parents_allowance_income(Variable): + label = "Widowed parent's allowance counted for Pension Credit" + entity = BenUnit + definition_period = YEAR + value_type = float + unit = GBP + documentation = ( + "The claimant's and partner's widowed parent's allowance, each less " + "the Sch. IV para. 7 disregard of £10 a week. Reg. 15(1) prescribes " + "it as income, and reg. 9 does not exclude it from Savings Credit " + "qualifying income. Reg. 14 applies Part III's references to the " + "claimant equally to the partner, so each member's allowance gets its " + "own £10, as each member's war pension does under para. 1. " + "Dependants' and other benefit-unit members' allowances do not count " + "(State Pension Credit Act 2002 s.5). The allowance is not payable " + "from pensionable age or while the recipient lives with a partner " + "(SSCBA 1992 s.39A(4) and (5)), so this counts reported awards." + ) + reference = ( + "https://www.legislation.gov.uk/ukpga/2002/16/section/5", + "https://www.legislation.gov.uk/uksi/2002/1792/regulation/14", + "https://www.legislation.gov.uk/uksi/2002/1792/regulation/15", + "https://www.legislation.gov.uk/uksi/2002/1792/regulation/17", + "https://www.legislation.gov.uk/uksi/2002/1792/schedule/IV/paragraph/7", + ) + + def formula(benunit, period, parameters): + p = parameters(period).gov.dwp.pension_credit.income + person = benunit.members + disregard = p.widowed_parents_allowance_disregard * WEEKS_IN_YEAR + counted = max_(person("widowed_parents_allowance", period) - disregard, 0) + return benunit.sum(counted * person("is_claimant_or_partner", period)) diff --git a/policyengine_uk/variables/gov/dwp/widowed_parents_allowance.py b/policyengine_uk/variables/gov/dwp/widowed_parents_allowance.py index 543df5aa3b..e1556f6d38 100644 --- a/policyengine_uk/variables/gov/dwp/widowed_parents_allowance.py +++ b/policyengine_uk/variables/gov/dwp/widowed_parents_allowance.py @@ -17,10 +17,10 @@ class widowed_parents_allowance(Variable): "Benefit counts it less £15 a week. It is not payable from State " "Pension age or while the recipient lives with a partner (s.39A(4) " "and (5)), so a lawful award never reaches a Pension Credit or " - "pension-age Housing Benefit assessment. A reported one counts in " - "full for Pension Credit (SPC Regs 2002 reg. 15(1)) and less £15 a " - "week for pension-age Housing Benefit (HB (SPC) Regs 2006 Sch. 5 " - "para. 7)." + "pension-age Housing Benefit assessment. A reported one counts less " + "£10 a week for Pension Credit (SPC Regs 2002 reg. 15(1) and Sch. IV " + "para. 7) and less £15 a week for pension-age Housing Benefit (HB " + "(SPC) Regs 2006 Sch. 5 para. 7)." ) definition_period = YEAR unit = GBP