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..49964eb043 --- /dev/null +++ b/changelog.d/pension-credit-widowed-parents-allowance.fixed.md @@ -0,0 +1 @@ +- 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 28b819f856..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 @@ -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)). 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 new file mode 100644 index 0000000000..11b389631f --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_widowed_parents_allowance.yaml @@ -0,0 +1,199 @@ +# 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. +# 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 +# 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: + # 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 + 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: + # 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 falls by the £10 a week disregarded. + 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 - 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 + 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_500 + widowed_parents_allowance_reported: 2_000 + benunits: + benunit: + members: [person1] + households: + household: + members: [person1] + country: ENGLAND + output: + # 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 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 + 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 + # 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 new file mode 100644 index 0000000000..6c481ddf8f --- /dev/null +++ b/policyengine_uk/tests/test_pension_credit_widowed_parents_allowance_properties.py @@ -0,0 +1,218 @@ +"""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 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; 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 +WPA award added to the first adult. + +Invariants: + +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 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. +""" + +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, + INCOME_TAX, + PROPERTY_SETTINGS, + calculate, + family, + money, +) + +WPA = "widowed_parents_allowance" +# 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 + + +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_raises_guarantee_credit_by_the_disregard(): + 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) + # 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, + ) + + +@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"] + 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(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 + ), (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) - min(amount, PC_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/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 63f3c32681..e1556f6d38 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 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