diff --git a/changelog.d/1933.fixed.md b/changelog.d/1933.fixed.md new file mode 100644 index 0000000000..81752fb1b7 --- /dev/null +++ b/changelog.d/1933.fixed.md @@ -0,0 +1 @@ +Add pensioner child amounts and family premiums to Council Tax Reduction in England, Scotland and Wales, and count a Scottish pensioner's whole capital over £10,000 in tariff income, as SSI 2012/319 reg 27(2) sets no ceiling. diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/child_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/child_limit.yaml new file mode 100644 index 0000000000..438ab70a80 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/child_limit.yaml @@ -0,0 +1,24 @@ +description: Number of children and young persons whose amounts the England Council Tax Reduction prescribed requirements include in a pensioner's applicable amount, unless a Child Tax Credit award includes more. The limit applied to schemes for the financial years 2018-19 to 2024-25. +values: + 2013-04-01: + value: .inf + reference: + - title: SI 2012/2885 Sch. 1 para. 6(1)(b) as made ("any child or young person") + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/6/made + 2018-04-01: + value: 2 + reference: + - title: The Council Tax Reduction Schemes (Amendment) (England) Regulations 2017 (SI 2017/1305) regs. 1(3) and 7, substituting Sch. 1 para. 6(1)(b) and inserting para. 6(1A) to (1C) + href: https://www.legislation.gov.uk/uksi/2017/1305/made + 2025-04-01: + value: .inf + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2025 (SI 2025/39) regs. 1(3) and 5(2) + href: https://www.legislation.gov.uk/uksi/2025/39/made +metadata: + unit: child + period: year + label: England Council Tax Reduction pensioner child limit + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 1 para. 6, as in force on 30 April 2024 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/6/2024-04-30 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/child_or_young_person.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/child_or_young_person.yaml new file mode 100644 index 0000000000..3b5ec77377 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/child_or_young_person.yaml @@ -0,0 +1,65 @@ +description: Weekly amount for each child or young person in the applicant's family in the applicable amount of a pensioner under the England Council Tax Reduction prescribed requirements. The amounts equal the Housing Benefit pension-age child or young person amounts in every year from 2013-14 to 2026-27. +values: + # We take each value from paragraph 2 of the version of Schedule 2 in force + # on 30 April of that year. The Secretary of State sets it for schemes for + # the financial year from 1 April. + 2013-04-01: + value: 65.62 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as in force on 30 April 2013 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2013-04-30 + 2014-04-01: + value: 66.33 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as in force on 30 April 2014 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2014-04-30 + 2015-04-01: + value: 66.9 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as in force on 30 April 2015 (unchanged to 2019-20) + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2015-04-30 + 2020-04-01: + value: 68.27 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as in force on 30 April 2020 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2020-04-30 + 2021-04-01: + value: 68.6 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as in force on 30 April 2021 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2021-04-30 + 2022-04-01: + value: 70.8 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as in force on 30 April 2022 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2022-04-30 + 2023-04-01: + value: 77.78 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as in force on 30 April 2023 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2023-04-30 + 2024-04-01: + value: 83.24 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as in force on 30 April 2024 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2024-04-30 + 2025-04-01: + value: 84.66 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as in force on 30 April 2025 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2025-04-30 + 2026-04-01: + value: 87.88 + reference: + - title: SI 2012/2885 Sch. 2 para. 2, as amended by SI 2026/27 for schemes for 2026-27 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: England Council Tax Reduction pensioner child or young person amount + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 1 para. 6(1)(b) and Sch. 2 para. 2 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 + - title: The Housing Benefit (Persons who have attained the qualifying age for state pension credit) Regulations 2006 Sch. 3 para. 2 (the same amounts) + href: https://www.legislation.gov.uk/uksi/2006/214/schedule/3 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/family_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/family_premium.yaml new file mode 100644 index 0000000000..8ef7a673c4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/family_premium.yaml @@ -0,0 +1,26 @@ +description: Weekly family premium in the applicable amount of a pensioner whose family includes a child or young person, under the England Council Tax Reduction prescribed requirements. The Secretary of State made it nil for reduction weeks beginning after 1 May 2016. +values: + 2013-04-01: + value: 17.4 + reference: + - title: SI 2012/2885 Sch. 2 para. 3, as in force on 30 April 2013 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2013-04-30 + 2014-04-01: + value: 17.45 + reference: + - title: SI 2012/2885 Sch. 2 para. 3, as in force on 30 April 2014 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2014-04-30 + # Reduction weeks begin on a Monday; the first after 1 May 2016 began on + # 2 May 2016. + 2016-05-02: + value: 0 + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2015 (SI 2015/2041) reg. 2(4)(b), substituting Sch. 2 para. 3 + href: https://www.legislation.gov.uk/uksi/2015/2041/regulation/2/made +metadata: + unit: currency-GBP + period: week + label: England Council Tax Reduction pensioner family premium + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 1 para. 6(1)(c) and Sch. 2 para. 3 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/child_or_young_person.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/child_or_young_person.yaml new file mode 100644 index 0000000000..020a7bb0b0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/child_or_young_person.yaml @@ -0,0 +1,67 @@ +description: Weekly amount for each child or young person in the applicant's family in the applicable amount under the Scottish State Pension Credit Council Tax Reduction regulations. From 2017-18 it exceeds the Housing Benefit amount by about a quarter. +values: + # We take each value from paragraph 3 of the version of Schedule 1 in force + # on 30 April of that year. + 2013-04-01: + value: 65.62 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2013 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2013-04-30 + 2014-04-01: + value: 66.33 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2014 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2014-04-30 + 2015-04-01: + value: 66.9 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2015 (unchanged for 2016-17) + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2015-04-30 + 2017-04-01: + value: 83.63 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2017 (unchanged to 2019-20) + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2017-04-30 + 2020-04-01: + value: 85.34 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2020 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2020-04-30 + 2021-04-01: + value: 85.75 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2021 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2021-04-30 + 2022-04-01: + value: 88.5 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2022 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2022-04-30 + 2023-04-01: + value: 97.23 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2023 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2023-04-30 + 2024-04-01: + value: 104.05 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2024 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2024-04-30 + 2025-04-01: + value: 105.85 + reference: + - title: The Council Tax Reduction (Miscellaneous Amendment) (Scotland) Regulations 2025 (SSI 2025/24), amending SSI 2012/319 Sch. 1 para. 3 + href: https://www.legislation.gov.uk/ssi/2025/24/made + 2026-04-01: + value: 109.85 + reference: + - title: SSI 2012/319 Sch. 1 para. 3, as in force on 30 April 2026 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: Scotland Council Tax Reduction pensioner child or young person amount + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 reg. 20(b) and Sch. 1 para. 3 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/family_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/family_premium.yaml new file mode 100644 index 0000000000..f72fcc4d0e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/family_premium.yaml @@ -0,0 +1,24 @@ +description: Weekly family premium in the applicable amount of an applicant whose family includes a child or young person, under the Scottish State Pension Credit Council Tax Reduction regulations. The Scottish Ministers removed it from 1 May 2016. +values: + 2013-04-01: + value: 17.4 + reference: + - title: SSI 2012/319 Sch. 1 Part 2, as in force on 30 April 2013 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2013-04-30 + 2014-04-01: + value: 17.45 + reference: + - title: SSI 2012/319 Sch. 1 Part 2, as in force on 30 April 2014 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2014-04-30 + 2016-05-01: + value: 0 + reference: + - title: The Council Tax Reduction (Scotland) Amendment Regulations 2016 (SSI 2016/81) regs. 1(3) and 18, omitting reg. 20(c) and Sch. 1 Part 2 + href: https://www.legislation.gov.uk/ssi/2016/81/made +metadata: + unit: currency-GBP + period: week + label: Scotland Council Tax Reduction pensioner family premium + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 reg. 20 + href: https://www.legislation.gov.uk/ssi/2012/319/regulation/20 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/child_or_young_person.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/child_or_young_person.yaml new file mode 100644 index 0000000000..d108904dcc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/child_or_young_person.yaml @@ -0,0 +1,56 @@ +description: Weekly amount for each child or young person in the applicant's family in the applicable amount of a pensioner under the Welsh Council Tax Reduction prescribed requirements. The Welsh Ministers did not raise it for 2020-21 or 2021-22, so it differs from the Housing Benefit amount in those years. +values: + # We take each value from paragraph 2 of the version of Schedule 2 in force + # on 30 April of that year, and cite the amending regulations it reflects. + 2013-04-01: + value: 65.62 + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements and Default Scheme) (Wales) (Amendment) Regulations 2013 (WSI 2013/112) reg. 5(b), amending WSI 2012/3144 Sch. 2 para. 2 for schemes for 2013-14 + href: https://www.legislation.gov.uk/wsi/2013/112/made + 2014-04-01: + value: 66.33 + reference: + - title: WSI 2013/3029 Sch. 2 para. 2, as amended by WSI 2014/66 for schemes for 2014-15 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2014-04-30 + 2015-04-01: + value: 66.9 + reference: + - title: WSI 2013/3029 Sch. 2 para. 2, as in force on 30 April 2015 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2015-04-30 + - title: The Council Tax Reduction Schemes (Prescribed Requirements and Default Scheme) (Wales) (Amendment) Regulations 2020 (WSI 2020/16) reg. 8, which leaves para. 2 unchanged for 2020-21 + href: https://www.legislation.gov.uk/wsi/2020/16/made + - title: The Council Tax Reduction Schemes (Prescribed Requirements and Default Scheme) (Wales) (Amendment) Regulations 2021 (WSI 2021/34) reg. 5, which leaves para. 2 unchanged for 2021-22 + href: https://www.legislation.gov.uk/wsi/2021/34/made + 2022-04-01: + value: 70.8 + reference: + - title: WSI 2013/3029 Sch. 2 para. 2, as in force on 30 April 2022 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2022-04-30 + 2023-04-01: + value: 77.78 + reference: + - title: WSI 2013/3029 Sch. 2 para. 2, as in force on 30 April 2023 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2023-04-30 + 2024-04-01: + value: 83.24 + reference: + - title: WSI 2013/3029 Sch. 2 para. 2, as in force on 30 April 2024 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2024-04-30 + 2025-04-01: + value: 84.66 + reference: + - title: WSI 2013/3029 Sch. 2 para. 2, as in force on 30 April 2025 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2025-04-30 + 2026-04-01: + value: 87.88 + reference: + - title: WSI 2013/3029 Sch. 2 para. 2, as in force on 30 April 2026 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: Wales Council Tax Reduction pensioner child or young person amount + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Sch. 1 para. 1(1)(b) and Sch. 2 para. 2 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/family_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/family_premium.yaml new file mode 100644 index 0000000000..5e5c2d1a3b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/family_premium.yaml @@ -0,0 +1,47 @@ +description: Weekly family premium in the applicable amount of a pensioner whose family includes a child or young person, under the Welsh Council Tax Reduction prescribed requirements. The Welsh Ministers kept the premium after the Secretary of State and the Scottish Ministers ended theirs in 2016. +values: + 2013-04-01: + value: 17.4 + reference: + - title: WSI 2012/3144 Sch. 2 para. 3 (schemes for 2013-14), as in force on 30 April 2013 + href: https://www.legislation.gov.uk/wsi/2012/3144/schedule/2/2013-04-30 + - title: WSI 2013/3029 Sch. 2 para. 3, as in force on 30 April 2014 (unchanged for 2014-15) + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2014-04-30 + 2015-04-01: + value: 17.45 + reference: + - title: WSI 2013/3029 Sch. 2 para. 3, as in force on 30 April 2015 (unchanged to 2021-22; WSI 2020/16 reg. 8 and WSI 2021/34 reg. 5 leave it unchanged) + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2015-04-30 + 2022-04-01: + value: 17.85 + reference: + - title: WSI 2013/3029 Sch. 2 para. 3, as in force on 30 April 2022 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2022-04-30 + 2023-04-01: + value: 18.53 + reference: + - title: WSI 2013/3029 Sch. 2 para. 3, as in force on 30 April 2023 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2023-04-30 + 2024-04-01: + value: 19.15 + reference: + - title: WSI 2013/3029 Sch. 2 para. 3, as in force on 30 April 2024 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2024-04-30 + 2025-04-01: + value: 19.48 + reference: + - title: WSI 2013/3029 Sch. 2 para. 3, as in force on 30 April 2025 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2025-04-30 + 2026-04-01: + value: 20.22 + reference: + - title: WSI 2013/3029 Sch. 2 para. 3, as in force on 30 April 2026 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: Wales Council Tax Reduction pensioner family premium + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Sch. 1 para. 1(1)(c) and Sch. 2 para. 3 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2 diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/legacy_means_tests/income_from_capital.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/legacy_means_tests/income_from_capital.yaml index e080bdba36..fa88904dfb 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/legacy_means_tests/income_from_capital.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/legacy_means_tests/income_from_capital.yaml @@ -883,6 +883,50 @@ council_tax_reduction_tariff_income: [312, 312] council_tax_reduction_applicable_income: [12_312, 12_312] +- name: A Scottish pensioner's tariff income counts all capital over 10,000, and an English one's stops at 16,000 + # SSI 2012/319 reg 27(2) sets no ceiling: savings of 20,000 are 10,000 over + # 10,000, 20 steps of 500, so 20 a week, 1,040 a year. SI 2012/2885 Sch 1 + # para 37 counts the excess "not exceeding £16,000": 6,000 / 500 = 12 a + # week, 624 a year. Both pensioners' capital exceeds 16,000, so neither + # gets a reduction (SSI 2012/319 reg 40; SI 2012/2885 reg 11(2)). + period: 2026 + absolute_error_margin: 0.01 + input: + people: + scottish_pensioner: + age: 72 + state_pension: 12_570 + english_pensioner: + age: 72 + state_pension: 12_570 + benunits: + scottish: + members: [scottish_pensioner] + would_claim_pc: false + would_claim_uc: false + english: + members: [english_pensioner] + would_claim_pc: false + would_claim_uc: false + households: + scottish_household: + members: [scottish_pensioner] + country: SCOTLAND + local_authority: GLASGOW_CITY + council_tax: 2_000 + savings: 20_000 + english_household: + members: [english_pensioner] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 20_000 + output: + council_tax_reduction_pensioner: [true, true] + council_tax_reduction_assessable_capital: [20_000, 20_000] + council_tax_reduction_tariff_income: [1_040, 624] + council_tax_reduction: [0, 0] + - name: A savings credit recipient's council tax reduction income does not fall when more sub-tenant rent ends the savings credit # Before: 3,130.54 of sub-tenant rent counts 2,090.54 (less 20 a week). # Pension Credit income is 10,000 + 2,000 + 2,090.54 + 520 deemed income diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_amounts.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_amounts.yaml new file mode 100644 index 0000000000..aa0dc81a1a --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_amounts.yaml @@ -0,0 +1,757 @@ +# Councils include in a pensioner's Council Tax Reduction applicable amount an +# amount for each child or young person in the family and, where the scheme +# keeps one, a family premium: +# +# - England: SI 2012/2885 Sch 1 para 6(1)(b) and (c), Sch 2 paras 2 and 3. +# 2026-27 child or young person amount 87.88 a week (SI 2026/27); the +# Secretary of State made the family premium nil for reduction weeks +# beginning after 1 May 2016. For the 2018-19 to 2024-25 schemes the +# Secretary of State limited the para 6(1)(b) amounts to two children or +# young persons, or those an award of Child Tax Credit included if more (SI +# 2017/1305 reg 7), then removed the limit (SI 2025/39 reg 5(2)). +# - Wales: WSI 2013/3029 Sch 1 para 1(1)(b) and (c), Sch 2 paras 2 and 3. +# 2026-27 amounts 87.88 and a family premium of 20.22. +# - Scotland: SSI 2012/319 reg 20(b), Sch 1 para 3. 2026-27 amount 109.85; +# the Scottish Ministers removed the family premium from 1 May 2016 (SSI +# 2016/81 reg 18). +# +# Each amount runs from birth to the day before the 20th birthday, for a +# Child Benefit qualifying young person. Every person aged 72 or 80 here +# reached State Pension age before 1 April 2021, so councils use a single or +# lone parent personal allowance of 256.00 a week and a couple allowance of +# 383.35 (SI 2012/2885 Sch 2 para 1; WSI 2013/3029 Sch 2 para 1; SSI 2012/319 +# Sch 1 para 2). We multiply each weekly amount by 52. + +- name: Case 1, an English 72-year-old alone gets the personal allowance only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner: true + council_tax_reduction_pensioner_child_amounts: 0 + council_tax_reduction_pensioner_family_premium: 0 + council_tax_reduction_applicable_amount: 256.00 * 52 + +- name: Case 2, an English 72-year-old with a ten-year-old gets the child amount but no family premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner: true + is_child_or_young_person_for_council_tax_reduction: [false, true] + # 87.88 * 52 = 4,569.76. + council_tax_reduction_pensioner_child_amounts: 4_569.76 + council_tax_reduction_pensioner_family_premium: 0 + # 13,312 + 4,569.76. + council_tax_reduction_applicable_amount: 17_881.76 + +- name: Case 3, an English 72-year-old with a 17-year-old at school gets the young person's amount. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + student: + age: 17 + current_education: UPPER_SECONDARY + age_started_or_accepted_current_education_or_training: 16 + benunits: + benunit: + members: [pensioner, student] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, student] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + is_qualifying_young_person_for_child_benefit: [false, true] + is_child_or_young_person_for_council_tax_reduction: [false, true] + council_tax_reduction_pensioner_child_amounts: 87.88 * 52 + council_tax_reduction_applicable_amount: (256.00 + 87.88) * 52 + +- name: Case 4, a Scottish 72-year-old alone gets the personal allowance only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: SCOTLAND + local_authority: GLASGOW_CITY + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_amounts: 0 + council_tax_reduction_applicable_amount: 256.00 * 52 + +- name: Case 5, a Scottish 72-year-old with a ten-year-old gets Scotland's higher child amount. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: SCOTLAND + local_authority: GLASGOW_CITY + council_tax: 2_000 + savings: 0 + output: + # 109.85 * 52 = 5,712.20; no family premium. + council_tax_reduction_pensioner_child_amounts: 5_712.20 + council_tax_reduction_pensioner_family_premium: 0 + # 13,312 + 5,712.20. + council_tax_reduction_applicable_amount: 19_024.20 + +- name: Case 6, a Welsh 72-year-old alone gets the personal allowance only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: WALES + local_authority: CARDIFF + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_amounts: 0 + council_tax_reduction_pensioner_family_premium: 0 + council_tax_reduction_applicable_amount: 256.00 * 52 + +- name: Case 7, a Welsh 72-year-old with a ten-year-old gets the child amount and the family premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + council_tax: 2_000 + savings: 0 + output: + # 87.88 * 52 = 4,569.76. + council_tax_reduction_pensioner_child_amounts: 4_569.76 + # 20.22 * 52 = 1,051.44. + council_tax_reduction_pensioner_family_premium: 1_051.44 + # 13,312 + 4,569.76 + 1,051.44. + council_tax_reduction_applicable_amount: 18_933.20 + +- name: Case 8, an English pensioner couple with two children get two child amounts. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + older: + age: 74 + state_pension: 12_000 + younger: + age: 72 + state_pension: 9_000 + child_1: + age: 8 + child_2: + age: 12 + benunits: + benunit: + members: [older, younger, child_1, child_2] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [older, younger, child_1, child_2] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + # 2 * 87.88 * 52 = 9,139.52. + council_tax_reduction_pensioner_child_amounts: 9_139.52 + # (383.35 + 2 * 87.88) * 52 = 19,934.20 + 9,139.52. + council_tax_reduction_applicable_amount: 29_073.72 + +- name: Case 9, England's 2024-25 scheme counts two of three children without a Child Tax Credit award. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + child_1: + age: 5 + child_2: + age: 7 + child_3: + age: 9 + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + would_claim_CTC: false + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + # SI 2012/2885 Sch 1 para 6(1)(b) as in force for 2024-25: up to two. + # 2 * 83.24 * 52 = 8,656.96. + council_tax_reduction_pensioner_child_amounts: 8_656.96 + +- name: Case 10, England's 2024-25 scheme counts all three where Child Tax Credit includes all three. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + child_1: + age: 5 + is_CTC_child_element_included: true + child_2: + age: 7 + is_CTC_child_element_included: true + child_3: + age: 9 + is_CTC_child_element_included: true + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + would_claim_CTC: true + is_CTC_eligible: true + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + # Para 6(1B) and (1C): the award includes the individual element for + # three, more than two. 3 * 83.24 * 52 = 12,985.44. + council_tax_reduction_pensioner_child_amounts: 12_985.44 + +- name: Case 11, England's 2025-26 scheme counts every child. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + child_1: + age: 5 + child_2: + age: 7 + child_3: + age: 9 + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + # SI 2025/39 reg 5(2) removed the limit. 3 * 84.66 * 52 = 13,206.96. + council_tax_reduction_pensioner_child_amounts: 13_206.96 + +- name: Case 12, Scotland has no two-child limit in 2024-25. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + child_1: + age: 5 + child_2: + age: 7 + child_3: + age: 9 + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: SCOTLAND + local_authority: GLASGOW_CITY + council_tax: 2_000 + savings: 0 + output: + # SSI 2012/319 reg 20(b): any child or young person. 3 * 104.05 * 52. + council_tax_reduction_pensioner_child_amounts: 16_231.80 + +- name: Case 13, Wales kept its 2019-20 child amount and family premium in 2021-22. + period: 2021 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + child: + age: 10 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + council_tax: 2_000 + savings: 0 + output: + # WSI 2021/34 reg 5 leaves Sch 2 paras 2 and 3 at 66.90 and 17.45. + council_tax_reduction_pensioner_child_amounts: 66.90 * 52 + council_tax_reduction_pensioner_family_premium: 17.45 * 52 + +- name: Case 14, England's 2021-22 child amount follows the 2021 amending regulations. + period: 2021 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + child: + age: 10 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_amounts: 68.60 * 52 + council_tax_reduction_pensioner_family_premium: 0 + +- name: Case 15, England's 2015-16 scheme still had the family premium. + period: 2015 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + child: + age: 10 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_amounts: 66.90 * 52 + council_tax_reduction_pensioner_family_premium: 17.45 * 52 + +- name: Case 16, a pensioner household head who applies alone has no children in their family. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + grandmother: + age: 80 + is_household_head: true + mother: + age: 45 + is_parent: true + is_household_head: false + father: + age: 46 + is_parent: true + is_household_head: false + child: + age: 10 + is_household_head: false + benunits: + family: + members: [grandmother, mother, father, child] + would_claim_uc: false + would_claim_pc: false + households: + home: + members: [grandmother, mother, father, child] + country: WALES + local_authority: CARDIFF + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_head_applies_alone: true + council_tax_reduction_pensioner: true + council_tax_reduction_pensioner_child_amounts: 0 + council_tax_reduction_pensioner_family_premium: 0 + +- name: Case 17, a working-age Welsh parent's applicable amount is unchanged. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + employment_income: 15_000 + child: + age: 7 + benunits: + benunit: + members: [parent, child] + would_claim_uc: false + households: + household: + members: [parent, child] + country: WALES + local_authority: CARDIFF + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner: false + council_tax_reduction_pensioner_child_amounts: 0 + council_tax_reduction_pensioner_family_premium: 0 + # Lone parent aged 18 or over, 95.55 * 52, as before. + council_tax_reduction_applicable_amount: 4_968.60 + +- name: Case 18, England's 2024-25 scheme counts all three where a final Child Tax Credit award is entered without a report. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 23_000 + child_1: + age: 10 + child_2: + age: 12 + child_3: + age: 14 + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + child_tax_credit: 9_800.95 + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + # No child_tax_credit_reported, so the model reads no eligibility from + # reports; councils count the entered final award. + is_CTC_eligible: false + child_tax_credit: 9_800.95 + # Each child was born before 6 April 2017, so the model includes each + # one's individual element (is_CTC_child_limit_exempt). + is_CTC_child_element_included: [false, true, true, true] + # SI 2012/2885 Sch 1 para 6(1B) and (1C): an award with individual + # elements for three, more than the two under para 6(1)(b). + # 3 * 83.24 * 52 = 12,985.44. + council_tax_reduction_pensioner_child_amounts: 12_985.44 + +- name: Case 19, England's 2024-25 scheme counts two of three where the family would claim Child Tax Credit but has no award. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 23_000 + child_1: + age: 10 + child_2: + age: 12 + child_3: + age: 14 + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + would_claim_CTC: true + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + # HMRC makes no award on a claim without eligibility: is_CTC_eligible + # needs a report, and the model gives no child_tax_credit without + # eligibility. + is_CTC_eligible: false + child_tax_credit: 0 + is_CTC_child_element_included: [false, true, true, true] + # Para 6(1)(b): up to two. 2 * 83.24 * 52 = 8,656.96. + council_tax_reduction_pensioner_child_amounts: 8_656.96 + +- name: Case 20, England's 2024-25 scheme counts all three on a nil-rate Child Tax Credit award. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 60_000 + child_1: + age: 10 + child_2: + age: 12 + child_3: + age: 14 + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + would_claim_CTC: true + is_CTC_eligible: true + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + # At income of 60,000 HMRC withdraws the whole credit, so it pays nothing. + child_tax_credit: 0 + is_CTC_child_element_included: [false, true, true, true] + # Para 6(1B)(a): an award "whether or not any amount is payable". + # Councils count the three whose individual elements the award includes: + # 3 * 83.24 * 52 = 12,985.44. + council_tax_reduction_pensioner_child_amounts: 12_985.44 + +- name: Case 21, England's 2024-25 scheme counts two of three where the family is eligible for Child Tax Credit but would not claim it. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 23_000 + child_1: + age: 10 + child_2: + age: 12 + child_3: + age: 14 + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + would_claim_CTC: false + is_CTC_eligible: true + child_tax_credit: 0 + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + # Entitlement depends on a claim (TCA 2002 s.3(1)), so HMRC makes no + # award to a family that is eligible but does not claim, and the model + # gives it no final award either. + child_tax_credit: 0 + is_CTC_child_element_included: [false, true, true, true] + # Para 6(1)(b): up to two. 2 * 83.24 * 52 = 8,656.96. + council_tax_reduction_pensioner_child_amounts: 8_656.96 + +- name: Case 22, England's 2024-25 scheme counts two of three where a reform ends tax credits and the family reports Child Tax Credit. + period: 2024 + absolute_error_margin: 0.01 + input: + gov.dwp.tax_credits.active: false + people: + pensioner: + age: 72 + state_pension: 23_000 + child_tax_credit_reported: 1 + child_1: + age: 10 + child_2: + age: 12 + child_3: + age: 14 + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # The model still reads a claim and eligibility from the report, but HMRC + # pays nothing under the closed scheme and has_tax_credit_award infers no + # award. + would_claim_CTC: true + is_CTC_eligible: true + child_tax_credit: 0 + has_tax_credit_award: false + council_tax_reduction_pensioner: true + is_CTC_child_element_included: [false, true, true, true] + # No award, so councils count up to two under para 6(1)(b): + # 2 * 83.24 * 52 = 8,656.96. + council_tax_reduction_pensioner_child_amounts: 8_656.96 + +- name: Case 23, England's 2024-25 scheme counts all three where a reform ends tax credits and the user enters a final Child Tax Credit award. + period: 2024 + absolute_error_margin: 0.01 + input: + gov.dwp.tax_credits.active: false + people: + pensioner: + age: 72 + state_pension: 23_000 + child_tax_credit_reported: 1 + child_1: + age: 10 + child_2: + age: 12 + child_3: + age: 14 + benunits: + benunit: + members: [pensioner, child_1, child_2, child_3] + would_claim_pc: false + would_claim_uc: false + child_tax_credit: 9_800.95 + households: + household: + members: [pensioner, child_1, child_2, child_3] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # Under the reform has_tax_credit_award infers no award from the report, + # but the user entered the final award HMRC made. + child_tax_credit: 9_800.95 + has_tax_credit_award: false + council_tax_reduction_pensioner: true + is_CTC_child_element_included: [false, true, true, true] + # Councils apply SI 2012/2885 Sch 1 para 6(1C) where the applicant "has + # an award of child tax credit" (para 6(1B)(a)) and counting under (1C) + # gives more than para 6(1)(b), so they count the entered award. They + # count each child whose individual element the award includes: three, + # more than the two under para 6(1)(b). The Secretary of State set the + # 2024-25 amount at 83.24 a week (Sch 2 para 2(1), as SI 2024/29 reg 6(3) + # substituted it), so 3 * 83.24 * 52 = 12,985.44. + council_tax_reduction_pensioner_child_amounts: 12_985.44 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_benefit.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_benefit.yaml index dedf76043f..683ae4d2e2 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_benefit.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_benefit.yaml @@ -1,6 +1,8 @@ # Current GB pensioner income exclusions: England Sch1 para16(1)(j)(vi), # Wales Sch1 para10(1)(j)(vi), Scotland reg27(1)(j)(vii). # Model2026: eldest Child Benefit27.05*52=1406.60; aged allowance256*52=13312. +# Councils add 87.88*52=4569.76 for the child to an English pensioner's +# applicable amount (SI 2012/2885 Sch 1 para 6(1)(b) and Sch 2 para 2). # These genuine claim/takeup inputs use the general rules, not PC overrides. - name: England pensioner Child Benefit is excluded before the CTR taper # Aged 72: State Pension age was reached in 2019, before 1 April 2021, so @@ -31,10 +33,12 @@ in_receipt_of_guarantee_credit: false in_receipt_of_savings_credit_only: false council_tax_reduction_applicable_income: 15314 - council_tax_reduction_applicable_amount: 13312 - # 3000 - .2*(16000 - 686 - 13312) = 2599.60. - council_tax_benefit: 2599.60 - council_tax_reduction: 2599.60 + # 13312 + 4569.76 for the child. + council_tax_reduction_applicable_amount: 17881.76 + # 16000 - 686 = 15314 falls short of 17881.76, so the award covers the + # whole 3000. + council_tax_benefit: 3000 + council_tax_reduction: 3000 - name: Scottish pensioner Child Benefit does not reduce the final CTR award period: 2026 @@ -110,7 +114,7 @@ output: child_benefit: 0 council_tax_reduction_applicable_income: 15314 - council_tax_reduction: 2599.60 + council_tax_reduction: 3000 - name: Excluding pensioner Child Benefit retains the zero floor and liability cap period: 2026 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_tariff_income.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_tariff_income.yaml new file mode 100644 index 0000000000..732ae42984 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_tariff_income.yaml @@ -0,0 +1,458 @@ +# Pensioner tariff income from capital, in council_tax_reduction_tariff_income, +# which also carries working-age tariff income in Wales and Scotland (Case 14). +# Councils treat a pensioner's capital as a weekly income of £1 for each £500 +# over £10,000, and £1 for any part of £500: England SI 2012/2885 Sch 1 para +# 37 and Wales WSI 2013/3029 Sch 1 para 31 (each "not exceeding £16,000"), +# Scotland SSI 2012/319 reg 27(2), where the Scottish Ministers set no +# ceiling. The Secretary of State, the Welsh +# Ministers and the Scottish Ministers bar a reduction where capital exceeds +# £16,000 (SI 2012/2885 reg 11(2); WSI 2013/3029 reg 30; SSI 2012/319 reg +# 40). Councils disregard the whole capital and income of an applicant who, +# or whose partner, receives guarantee credit (Sch 1 para 13; Sch 1 para 7; +# reg 24), and on a savings-credit-only award they use the Secretary of +# State's assessment of income (Sch 1 para 14; Sch 1 para 8; reg 25). +# +# Each 72-year-old reached State Pension age before 1 April 2021, so councils +# use an applicable amount of 256.00 * 52 = 13,312. The income tax personal +# allowance covers a State Pension of 12,570, so the pensioner pays no income +# tax on it. Each household owes council tax of 2,000, and councils withdraw +# 20% of income above the applicable amount. + +- name: Case 1, England, capital of 10,000 gives no tariff income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 10_000 + output: + council_tax_reduction_tariff_income: 0 + council_tax_reduction_applicable_income: 12_570 + +- name: Case 2, England, capital of 10,001 gives 1 a week for the part of 500. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 10_001 + output: + council_tax_reduction_tariff_income: 1 * 52 + council_tax_reduction_applicable_income: 12_570 + 52 + +- name: Case 3, England, capital of 16,000 gives 12 a week. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 16_000 + output: + # (16,000 - 10,000) / 500 = 12; 12 * 52 = 624. + council_tax_reduction_tariff_income: 624 + council_tax_reduction_applicable_income: 13_194 + # 13,194 falls short of 13,312, so the council gives the maximum + # reduction, the whole 2,000. + council_tax_reduction: 2_000 + +- name: Case 4, Scotland, capital of 10,000 gives no tariff income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: SCOTLAND + local_authority: GLASGOW_CITY + council_tax: 2_000 + savings: 10_000 + output: + council_tax_reduction_tariff_income: 0 + council_tax_reduction_applicable_income: 12_570 + +- name: Case 5, Scotland, capital of 10,001 gives 1 a week for the part of 500. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: SCOTLAND + local_authority: GLASGOW_CITY + council_tax: 2_000 + savings: 10_001 + output: + council_tax_reduction_tariff_income: 1 * 52 + council_tax_reduction_applicable_income: 12_570 + 52 + +- name: Case 6, Scotland, capital of 16,000 gives 12 a week. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: SCOTLAND + local_authority: GLASGOW_CITY + council_tax: 2_000 + savings: 16_000 + output: + council_tax_reduction_tariff_income: 12 * 52 + council_tax_reduction_applicable_income: 12_570 + 12 * 52 + council_tax_reduction: 2_000 + +- name: Case 7, Wales, capital of 10,000 gives no tariff income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: WALES + local_authority: CARDIFF + council_tax: 2_000 + savings: 10_000 + output: + council_tax_reduction_tariff_income: 0 + council_tax_reduction_applicable_income: 12_570 + +- name: Case 8, Wales, capital of 10,001 gives 1 a week for the part of 500. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: WALES + local_authority: CARDIFF + council_tax: 2_000 + savings: 10_001 + output: + council_tax_reduction_tariff_income: 1 * 52 + council_tax_reduction_applicable_income: 12_570 + 52 + +- name: Case 9, Wales, capital of 16,000 gives 12 a week. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: WALES + local_authority: CARDIFF + council_tax: 2_000 + savings: 16_000 + output: + council_tax_reduction_tariff_income: 12 * 52 + council_tax_reduction_applicable_income: 12_570 + 12 * 52 + council_tax_reduction: 2_000 + +- name: Case 10, England, tariff income reduces an award above the applicable amount. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 15_000 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 16_000 + output: + # Income tax: (15,000 - 12,570) * 0.2 = 486. Income 15,000 - 486 + 624 + # = 15,138. Award 2,000 - 0.2 * (15,138 - 13,312) = 1,634.80. + council_tax_reduction_tariff_income: 624 + council_tax_reduction_applicable_income: 15_138 + council_tax_reduction: 1_634.80 + +- name: Case 11, England, capital over 16,000 ends entitlement and the tariff stops at 16,000. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 20_000 + output: + council_tax_reduction_tariff_income: 624 + council_tax_reduction: 0 + +- name: Case 12, a guarantee credit recipient's capital is wholly disregarded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 8_000 + benunits: + benunit: + members: [pensioner] + would_claim_pc: true + would_claim_uc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 16_000 + output: + in_receipt_of_guarantee_credit: true + council_tax_reduction_assessable_capital: 0 + council_tax_reduction_tariff_income: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction: 2_000 + +- name: Case 13, a savings-credit-only award uses the Pension Credit assessment, with no tariff income on top. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 90 + state_pension: 12_000 + private_pension_income: 1_500 + benunits: + benunit: + members: [pensioner] + claims_all_entitled_benefits: true + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 16_000 + output: + # As in the savings-credit-only case at 16,000 in + # council_tax_reduction_pension_credit.yaml: the Secretary of State + # already counts Pension Credit's deemed income from capital in the + # assessment of income. + in_receipt_of_savings_credit_only: true + council_tax_reduction_tariff_income: 0 + council_tax_reduction_applicable_income: 14_247.02 + +- name: Case 14, a working-age Welsh earner's capital gives the working-age tariff, not the pensioner one. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + earner: + age: 40 + employment_income: 15_000 + benunits: + benunit: + members: [earner] + would_claim_uc: false + households: + household: + members: [earner] + country: WALES + local_authority: CARDIFF + council_tax: 2_000 + savings: 12_000 + output: + council_tax_reduction_pensioner: false + # The Welsh Ministers' working-age tariff (WSI 2013/3029 Sch 6 para 33): + # 1 a week for each 250, or part of 250, over 6,000. + # (12,000 - 6,000) / 250 = 24; 24 * 52 = 1,248. The pensioner tariff + # would give (12,000 - 10,000) / 500 = 4 a week, or 208 a year. + council_tax_reduction_tariff_income: 1_248 + +- name: Case 15, Scotland, capital of 20,000 gives 20 a week, with no ceiling, and the capital limit ends entitlement. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 15_000 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: SCOTLAND + local_authority: GLASGOW_CITY + council_tax: 2_000 + savings: 20_000 + output: + # SSI 2012/319 reg 27(2): (20,000 - 10,000) / 500 = 20; 20 * 1 * 52 = + # 1,040. + council_tax_reduction_tariff_income: 1_040 + # Reg 40: capital over 16,000, so no reduction. + council_tax_reduction: 0 + +- name: Case 16, Wales, capital of 20,000 counts the excess up to 16,000 only, and the capital limit ends entitlement. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: WALES + local_authority: CARDIFF + council_tax: 2_000 + savings: 20_000 + output: + # WSI 2013/3029 Sch 1 para 31, "not exceeding £16,000": + # (16,000 - 10,000) / 500 = 12; 12 * 52 = 624. + council_tax_reduction_tariff_income: 624 + # Reg 30: capital over 16,000, so no reduction. + council_tax_reduction: 0 + +- name: Case 17, England, pension contributions do not reduce tariff income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 0 + pension_contributions: 3_000 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 10_001 + output: + council_tax_reduction_tariff_income: 52 + # Cash income nil; we deduct half the contributions, 0.5 * 3,000 = 1,500, + # and floor the result at nil: max(0, 0 - 1,500) = 0. We add tariff + # income, a separate source, after the floor: 0 + 1 * 52 = 52. + council_tax_reduction_applicable_income: 52 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_young_person.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_young_person.yaml index 1abdbeba87..dc509f3b49 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_young_person.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_young_person.yaml @@ -181,8 +181,10 @@ is_qualifying_young_person_for_universal_credit: [false, false] is_child_or_young_person_for_council_tax_reduction: [false, true] is_council_tax_reduction_lone_parent: true - # Lone parent of pension age: 256.00 * 52. - council_tax_reduction_applicable_amount: 13_312 + # Lone parent of pension age, 256.00 * 52 = 13,312, plus the young + # person's amount (SSI 2012/319 reg 20(b) and Sch 1 para 3), 109.85 * 52 + # = 5,712.20. + council_tax_reduction_applicable_amount: 19_024.20 - name: Case 6, Scotland's working-age scheme used the Child Benefit young person in 2021-22. period: 2021 diff --git a/policyengine_uk/tests/test_council_tax_reduction_child_benefit_properties.py b/policyengine_uk/tests/test_council_tax_reduction_child_benefit_properties.py index b041c55dca..fe5facca0c 100644 --- a/policyengine_uk/tests/test_council_tax_reduction_child_benefit_properties.py +++ b/policyengine_uk/tests/test_council_tax_reduction_child_benefit_properties.py @@ -1,8 +1,9 @@ """Pensioner Child Benefit exclusion and unchanged adjacent CTR contracts. -These model2026 tests use actual Child Benefit claims and family incomes, not -forced applicable income, pensioner status or reduction awards. The 20% cash -relation is conditional on an interior award; the existing floor/cap still apply. +These tests calculate 2026 Council Tax Reduction awards from actual Child +Benefit claims and family incomes. Where the award lies between the floor and +the cap, they check that excluding Child Benefit raises it by 20% of the Child +Benefit. """ from copy import deepcopy @@ -79,7 +80,11 @@ def calculate(data, claim, status_first=False): @settings(max_examples=4, deadline=None, derandomize=True) @given( st.sampled_from(sorted(COUNTRIES)), - st.integers(15000, 19000), + # Income after tax exceeds the applicable amount, which includes the + # children's amounts (up to 2 * 109.85 * 52 in Scotland), so the award + # falls between the floor and the cap, and total income stays under the + # £35,000 Winter Fuel Payment charge threshold. + st.integers(30000, 34000), st.integers(1, 2), st.booleans(), ) diff --git a/policyengine_uk/tests/test_council_tax_reduction_pension_credit_properties.py b/policyengine_uk/tests/test_council_tax_reduction_pension_credit_properties.py index b87444776e..9afdf55140 100644 --- a/policyengine_uk/tests/test_council_tax_reduction_pension_credit_properties.py +++ b/policyengine_uk/tests/test_council_tax_reduction_pension_credit_properties.py @@ -7,8 +7,8 @@ 24). Capital for the 16,000 limit is calculated under the same Part (SI 2012/2885 reg 11(3); WSI 2013/3029 reg 30(2)), so the limit cannot apply. The award is the maximum reduction less non-dependant deductions. -- Savings credit only: the Secretary of State's assessment of income and - capital is used, adjusted for the savings credit payable (SI 2012/2885 Sch 1 +- Savings credit only: councils use the Secretary of State's assessment of + income and capital and add the savings credit payable (SI 2012/2885 Sch 1 para 14; WSI 2013/3029 Sch 1 para 8; SSI 2012/319 reg 25). Invariants, for any generated population of families, where L is the eligible @@ -22,22 +22,22 @@ A) - ND) when the Pension Credit assessment of capital is within 16,000, and nothing otherwise. 4. Differential: everyone else keeps the general formula, max(0, L - 0.2 x - max(0, I - A) - ND) when capital C is within 16,000, where I is the - general income definition plus tariff income on C, both recomputed here - from their components and the regulations rather than read from the - variables under test, less pensioners' Child Benefit and the schemes' - pensioner earnings disregard (recomputed from the statutory sums). C is household savings plus other property at 90% - of its value (SI 2012/2885 Sch 1 para 32(a)), or, for a Welsh Universal - Credit recipient, the Universal Credit assessment of capital (WSI - 2013/3029 Sch 6 para 9(6)), or nil for a Welsh applicant on Income - Support or income-based JSA or ESA (Sch 10 para 8). A UC award includes - one the cap or deductions reduce to nil. Tariff income is 1 a week per - 500, or part, - over 10,000 for pensioners (Sch 1 para 37); for people under pension age - in Wales and Scotland 1 a week per 250, or part, over 6,000 (WSI - 2013/3029 Sch 6 para 33; SSI 2021/249 reg 63(1)(b)), or with Universal - Credit 4.35 a month (UC Regs 2013 reg 72; SSI 2021/249 reg 63(1)(a)), and - nil on Income Support or income-based JSA or ESA. + max(0, I - A) - ND) when capital C is within 16,000, where I is the general + income definition plus tariff income on C, both recomputed here from their + components and the regulations rather than read from the variables under + test, less pensioners' Child Benefit and the schemes' pensioner earnings + disregard (recomputed from the statutory sums). C is household savings plus + other property at 90% of its value (SI 2012/2885 Sch 1 para 32(a)), or, for + a Welsh Universal Credit recipient, the Universal Credit assessment of + capital (WSI 2013/3029 Sch 6 para 9(6)), or nil for a Welsh applicant on + Income Support or income-based JSA or ESA (Sch 10 para 8). A UC award + includes one the cap or deductions reduce to nil. Tariff income is 1 a week + per 500, or part, over 10,000 for pensioners (Sch 1 para 37), counting + capital up to 16,000 except in Scotland (SSI 2012/319 reg 27(2)); for people + under pension age in Wales and Scotland 1 a week per 250, or part, over + 6,000 (WSI 2013/3029 Sch 6 para 33; SSI 2021/249 reg 63(1)(b)), or with + Universal Credit 4.35 a month (UC Regs 2013 reg 72; SSI 2021/249 reg + 63(1)(a)), and nil on Income Support or income-based JSA or ESA. 5. Metamorphic: a guarantee credit recipient's CTR does not change when the State Pension changes. 6. Metamorphic: nor when its savings change. @@ -445,11 +445,14 @@ def expected_capital(unit, values, i): def expected_tariff_income(unit, values, i, capital): - def steps(threshold, step): - return np.ceil(max(0.0, min(capital, CAPITAL_LIMIT) - threshold) / step) + def steps(threshold, step, limit=CAPITAL_LIMIT): + return np.ceil(max(0.0, min(capital, limit) - threshold) / step) if values["council_tax_reduction_pensioner"][i]: - return steps(10_000, 500) * 52 + # SSI 2012/319 reg 27(2) sets no ceiling on a Scottish pensioner's + # counted capital. + limit = np.inf if unit["country"] == "SCOTLAND" else CAPITAL_LIMIT + return steps(10_000, 500, limit) * 52 if unit["country"] == "ENGLAND": return 0.0 if universal_credit_route(values, i): @@ -607,9 +610,10 @@ def test_not_claiming_pension_credit_never_raises_a_recipients_ctr(units, guaran def test_ctr_income_deducts_tax_before_the_winter_fuel_payment_charge(): - """A pensioner with £39,500 of total income is charged the winter fuel - payment (ITEPA 2003 s.681I) through income tax. CTR deducts the tax - before the charge, so the routes agree with the main definition.""" + """This pensioner's total income of £39,500 exceeds £35,000, so they owe + income tax equal to their Winter Fuel Payment (ITEPA 2003 s.681I(1) and + (3); winter_fuel_payment_charge). CTR deducts income tax before that + charge, so the routes agree with the main definition.""" family = dict( shape="single_pension", ages=[70], diff --git a/policyengine_uk/tests/test_council_tax_reduction_pensioner_children_tariff_properties.py b/policyengine_uk/tests/test_council_tax_reduction_pensioner_children_tariff_properties.py new file mode 100644 index 0000000000..fc8e207c69 --- /dev/null +++ b/policyengine_uk/tests/test_council_tax_reduction_pensioner_children_tariff_properties.py @@ -0,0 +1,429 @@ +"""A pensioner's Council Tax Reduction child amounts and tariff income. + +Under their pensioner schemes, councils add an amount for each child or young +person in the family and, in Wales, a family premium (SI 2012/2885 Sch 1 para +6(1)(b)-(c) and Sch 2 paras 2-3; WSI 2013/3029 Sch 1 para 1(1)(b)-(c) and Sch +2 paras 2-3; SSI 2012/319 reg 20(b) and Sch 1 para 3). For 2018-19 to 2024-25 +the Secretary of State limited England's child amounts to two unless a Child +Tax Credit award included more (SI 2017/1305 reg 7; SI 2025/39 reg 5(2)). +Councils treat a pensioner's capital as a weekly income of £1 for each £500, +or part of £500, over £10,000 (SI 2012/2885 Sch 1 para 37; WSI 2013/3029 Sch +1 para 31; SSI 2012/319 reg 27(2)), except on the Pension Credit routes. The +Secretary of State and Welsh Ministers count the excess up to £16,000; the +Scottish Ministers set no ceiling. council_tax_reduction_tariff_income +carries that pensioner tariff, and also the Welsh and Scottish working-age +tariffs, which these tests do not recompute. + +Each invariant holds on a fixed route and status. The generated families +claim no Universal Credit, so neither capital nor a child can move a family +between the pensioner and working-age schemes, and the first invariant's +pensioners claim no Pension Credit, so capital cannot move them onto a +Pension Credit route. Off those routes both can move. For a +savings-credit-only pensioner, councils use the Secretary of State's +assessment, which includes Pension Credit's deemed income from capital, so +capital can raise their applicable income. A mixed-age couple who gain a +child, and so start to receive Universal Credit, move to the working-age +scheme, whose applicable amount can be lower. + +1. For a pensioner off Pension Credit, tariff income is 52 times £1 for each + £500, or part of £500, of capital above £10,000 (up to £16,000 in England + and Wales), and it never falls as capital rises. Capital changes nothing + else in the applicable income, and the award never rises with capital. + Councils give no award where capital exceeds £16,000 (SI 2012/2885 reg + 11(2); WSI 2013/3029 reg 30; SSI 2012/319 reg 40), so Scotland's uncapped + tariff changes no award. +2. For a family that claims no Universal Credit, adding a dependent child + never lowers the applicable amount. For a pensioner, councils add 52 times + the scheme's weekly rate for each extra child they count. In England from + 2018-19 to 2024-25, they count up to two children, or more where a Child + Tax Credit award includes individual elements for more. In Wales, councils + also add the family premium with the first child. The generated families + report no Child Tax Credit, so none has an award. +3. A pensioner with no child and capital up to £10,000 gets no child amount, + family premium or tariff income, and a working-age family gets no child + amount or family premium, so their applicable amount, applicable income + and award match main. An English working-age family also gets no tariff + income here, because its local scheme sets its own. + test_matches_origin_main_on_unchanged_households checks that against + values computed on main. +""" + +import math + +import numpy as np +import pytest +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st + +from policyengine_uk import Simulation + +AUTHORITIES = {"ENGLAND": "MAIDSTONE", "SCOTLAND": "GLASGOW_CITY", "WALES": "CARDIFF"} +# Weekly child or young person amounts and family premiums, from the +# parameter files' sources. +CHILD_AMOUNT = { + ("ENGLAND", 2019): 66.90, + ("ENGLAND", 2021): 68.60, + ("ENGLAND", 2024): 83.24, + ("ENGLAND", 2025): 84.66, + ("ENGLAND", 2026): 87.88, + ("WALES", 2019): 66.90, + ("WALES", 2021): 66.90, + ("WALES", 2024): 83.24, + ("WALES", 2025): 84.66, + ("WALES", 2026): 87.88, + ("SCOTLAND", 2019): 83.63, + ("SCOTLAND", 2021): 85.75, + ("SCOTLAND", 2024): 104.05, + ("SCOTLAND", 2025): 105.85, + ("SCOTLAND", 2026): 109.85, +} +WELSH_FAMILY_PREMIUM = {2019: 17.45, 2021: 17.45, 2024: 19.15, 2025: 19.48, 2026: 20.22} +YEARS = (2019, 2021, 2024, 2025, 2026) +OUTPUTS = ( + "council_tax_reduction_pensioner", + "council_tax_reduction_applicable_amount", + "council_tax_reduction_applicable_income", + "council_tax_reduction_pensioner_child_amounts", + "council_tax_reduction_pensioner_family_premium", + "council_tax_reduction_tariff_income", + "council_tax_benefit", +) +SETTINGS = settings( + max_examples=5, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], +) + + +def situation(households, year): + """Build one benefit unit and household for each specification in one + simulation.""" + data = {"people": {}, "benunits": {}, "households": {}} + for index, spec in enumerate(households): + members = [] + adults = [spec["age"]] + if spec.get("partner_age") is not None: + adults.append(spec["partner_age"]) + for number, age in enumerate(adults): + name = f"adult_{index}_{number}" + income = "state_pension" if age >= 67 else "employment_income" + data["people"][name] = { + "age": {year: age}, + income: {year: spec["income"] if number == 0 else 0}, + } + members.append(name) + for number, age in enumerate(spec.get("children", ())): + name = f"child_{index}_{number}" + data["people"][name] = {"age": {year: age}} + members.append(name) + data["benunits"][f"family_{index}"] = { + "members": members, + "would_claim_pc": {year: spec.get("claims_pc", False)}, + "would_claim_uc": {year: False}, + } + data["households"][f"home_{index}"] = { + "members": members, + "country": {year: spec["country"]}, + "local_authority": { + year: spec.get("local_authority") or AUTHORITIES[spec["country"]] + }, + "tenure_type": {year: "OWNED_OUTRIGHT"}, + "council_tax": {year: 2_000}, + "savings": {year: spec["savings"]}, + } + return data + + +def calculate(households, year, names=OUTPUTS): + simulation = Simulation(situation=situation(households, year)) + return {name: np.asarray(simulation.calculate(name, year)) for name in names} + + +def tariff(capital, country): + # The Secretary of State and the Welsh Ministers count the excess "not + # exceeding £16,000"; the Scottish Ministers set no ceiling in reg 27(2). + counted = capital if country == "SCOTLAND" else min(capital, 16_000) + return 52 * math.ceil(max(0, counted - 10_000) / 500) + + +countries = st.sampled_from(sorted(AUTHORITIES)) +pensioner = st.fixed_dictionaries( + { + "country": countries, + "age": st.integers(70, 95), + "partner_age": st.one_of(st.none(), st.integers(68, 95)), + "children": st.lists(st.integers(0, 15), max_size=3), + "income": st.integers(0, 30_000), + "savings": st.integers(0, 10_000), + } +) +family = st.fixed_dictionaries( + { + "country": countries, + "age": st.one_of(st.integers(25, 60), st.integers(70, 95)), + "partner_age": st.one_of(st.none(), st.integers(25, 60), st.integers(70, 95)), + "children": st.lists(st.integers(0, 15), max_size=3), + "income": st.integers(0, 30_000), + "savings": st.integers(0, 20_000), + "claims_pc": st.booleans(), + } +) + + +@SETTINGS +@given( + base=pensioner, + capitals=st.lists(st.integers(0, 30_000), min_size=2, max_size=6).map(sorted), + year=st.sampled_from(YEARS), +) +def test_tariff_income_is_the_tariff_and_never_falls_as_capital_rises( + base, capitals, year +): + households = [dict(base, savings=capital) for capital in capitals] + result = calculate(households, year) + assert result["council_tax_reduction_pensioner"].all() + tariffs = result["council_tax_reduction_tariff_income"] + np.testing.assert_allclose( + tariffs, [tariff(c, base["country"]) for c in capitals], atol=0.01 + ) + assert (np.diff(tariffs) >= 0).all() + # As capital rises, the model changes only the tariff income within the + # applicable income. + other_income = result["council_tax_reduction_applicable_income"] - tariffs + np.testing.assert_allclose(other_income, other_income[0], atol=0.01) + assert (np.diff(result["council_tax_benefit"]) <= 0.01).all() + # Councils give no award where capital exceeds £16,000, so Scotland's + # uncapped tariff changes no award. + over_limit = np.asarray(capitals) > 16_000 + assert (result["council_tax_benefit"][over_limit] <= 0.01).all() + + +@SETTINGS +@given( + households=st.lists(family, min_size=1, max_size=6), + child_age=st.integers(0, 15), + year=st.sampled_from(YEARS), +) +def test_adding_a_dependent_child_never_lowers_the_applicable_amount( + households, child_age, year +): + with_child = [ + dict(spec, children=[*spec["children"], child_age]) for spec in households + ] + before = calculate(households, year) + after = calculate(with_child, year) + rise = ( + after["council_tax_reduction_applicable_amount"] + - before["council_tax_reduction_applicable_amount"] + ) + assert (rise >= -0.01).all() + for index, spec in enumerate(households): + if not before["council_tax_reduction_pensioner"][index]: + assert after["council_tax_reduction_pensioner_child_amounts"][index] == 0 + continue + children = len(spec["children"]) + counted = ( + min(children + 1, 2) - min(children, 2) + if spec["country"] == "ENGLAND" and 2018 <= year <= 2024 + else 1 + ) + expected = 52 * counted * CHILD_AMOUNT[(spec["country"], year)] + if spec["country"] == "WALES" and children == 0: + expected += 52 * WELSH_FAMILY_PREMIUM[year] + added = ( + after["council_tax_reduction_pensioner_child_amounts"][index] + + after["council_tax_reduction_pensioner_family_premium"][index] + - before["council_tax_reduction_pensioner_child_amounts"][index] + - before["council_tax_reduction_pensioner_family_premium"][index] + ) + assert added == pytest.approx(expected, abs=0.01) + + +@SETTINGS +@given(households=st.lists(family, min_size=1, max_size=8), year=st.sampled_from(YEARS)) +def test_no_new_amounts_without_a_child_or_capital_over_10000_or_at_working_age( + households, year +): + result = calculate(households, year) + pensioner = result["council_tax_reduction_pensioner"] + for index, spec in enumerate(households): + child_amounts = result["council_tax_reduction_pensioner_child_amounts"][index] + premium = result["council_tax_reduction_pensioner_family_premium"][index] + tariff_income = result["council_tax_reduction_tariff_income"][index] + if not pensioner[index]: + assert child_amounts == premium == 0 + if spec["country"] == "ENGLAND": + assert tariff_income == 0 + continue + if not spec["children"]: + assert child_amounts == premium == 0 + if spec["savings"] <= 10_000: + assert tariff_income == 0 + + +def test_northern_ireland_gets_no_new_amounts(): + spec = { + "country": "NORTHERN_IRELAND", + "local_authority": "BELFAST", + "age": 72, + "children": [10], + "income": 12_000, + "savings": 16_000, + } + result = calculate([spec], 2026) + assert result["council_tax_reduction_pensioner_child_amounts"][0] == 0 + assert result["council_tax_reduction_pensioner_family_premium"][0] == 0 + assert result["council_tax_reduction_tariff_income"][0] == 0 + + +# Pensioners with no child and capital up to £10,000, and working-age +# families with and without children and capital, in each nation, including +# English working-age families under the five local schemes the model runs. +UNCHANGED_HOUSEHOLDS = [ + spec + for country in sorted(AUTHORITIES) + for spec in ( + {"country": country, "age": 72, "income": 12_000, "savings": 0}, + { + "country": country, + "age": 80, + "partner_age": 75, + "income": 18_000, + "savings": 10_000, + }, + { + "country": country, + "age": 70, + "income": 9_000, + "savings": 9_999, + "claims_pc": True, + }, + { + "country": country, + "age": 40, + "children": [7], + "income": 15_000, + "savings": 12_000, + }, + { + "country": country, + "age": 35, + "partner_age": 33, + "children": [3, 9], + "income": 25_000, + "savings": 16_000, + }, + {"country": country, "age": 25, "income": 9_000, "savings": 8_000}, + ) +] + [ + { + "country": "ENGLAND", + "local_authority": authority, + "age": 40, + "children": [7], + "income": 12_000, + "savings": 14_000, + } + for authority in ( + "MERTON", + "KINGSTON_UPON_THAMES", + "NEWHAM", + "WESTMINSTER", + "OXFORD", + ) +] +DIFFERENTIAL_OUTPUTS = ( + "council_tax_reduction_applicable_amount", + "council_tax_reduction_applicable_income", + "council_tax_benefit", +) +# We computed these on main at 9dd44e142 for UNCHANGED_HOUSEHOLDS, in order: +# applicable amount, applicable income and council_tax_benefit. In Scotland +# and Wales the working-age families with savings of 12,000, 16,000 and 8,000 +# have working-age tariff income of 1 a week for each 250, or part, over +# 6,000: 24 * 52 = 1,248, 40 * 52 = 2,080 and 8 * 52 = 416 a year. +ORIGIN_MAIN = { + 2019: [ + (9_412, 12_000, 1_482.4), + (14_071.2, 17_150, 1_384.24), + (9_412, 9_592.34, 1_963.93), + (3_801.2, 14_812.24, 0), + (5_972.2, 22_574.64, 0), + (3_801.2, 8_955.84, 0), + (9_412, 12_000, 1_482.4), + (14_071.2, 17_170, 1_380.24), + (9_412, 9_592.34, 1_963.93), + (3_801.2, 16_080.24, 0), + (5_972.2, 24_674.64, 0), + (3_801.2, 9_371.84, 885.87), + (9_412, 12_000, 1_482.4), + (14_071.2, 17_150, 1_384.24), + (9_412, 9_592.34, 1_963.93), + (3_801.2, 16_060.24, 0), + (5_972.2, 24_654.64, 0), + (3_801.2, 9_371.84, 885.87), + (3_801.2, 12_672.24, 225.79), + (3_801.2, 12_672.24, 0), + (3_801.2, 12_672.24, 0), + (3_801.2, 12_672.24, 0), + (3_801.2, 12_672.24, 2_000), + ], + 2024: [ + (12_230.4, 12_000, 2_000), + (18_304, 17_166, 2_000), + (12_230.4, 0, 2_000), + (4_706, 15_650.8, 0), + (7_397, 23_984.2, 0), + (4_706, 9_000, 0), + (12_230.4, 12_000, 2_000), + (18_304, 17_189.06, 2_000), + (12_230.4, 0, 2_000), + (4_706, 16_921.86, 0), + (7_397, 26_087.26, 0), + (4_706, 9_416, 1_058), + (12_230.4, 12_000, 2_000), + (18_304, 17_166, 2_000), + (12_230.4, 0, 2_000), + (4_706, 16_898.8, 0), + (7_397, 26_064.2, 0), + (4_706, 9_416, 1_058), + (4_706, 13_331.2, 274.96), + (4_706, 13_331.2, 0), + (4_706, 13_331.2, 0), + (4_706, 13_331.2, 0), + (4_706, 13_331.2, 2_000), + ], + 2026: [ + (13_312, 12_000, 2_000), + (19_934.2, 17_166, 2_000), + (12_376, 0, 2_000), + (4_968.6, 15_726.2, 0), + (7_807.8, 24_109, 0), + (4_968.6, 9_000, 0), + (13_312, 12_000, 2_000), + (19_934.2, 17_205.67, 2_000), + (13_312, 0, 2_000), + (4_968.6, 16_998.5, 0), + (7_807.8, 26_228.67, 0), + (4_968.6, 9_416, 1_110.52), + (13_312, 12_000, 2_000), + (19_934.2, 17_166, 2_000), + (13_312, 0, 2_000), + (4_968.6, 16_974.2, 0), + (7_807.8, 26_189, 0), + (4_968.6, 9_416, 1_110.52), + (4_968.6, 13_406.6, 312.4), + (4_968.6, 13_406.6, 0), + (4_968.6, 13_406.6, 0), + (4_968.6, 13_406.6, 0), + (4_968.6, 13_406.6, 2_000), + ], +} + + +@pytest.mark.parametrize("year", sorted(ORIGIN_MAIN)) +def test_matches_origin_main_on_unchanged_households(year): + result = calculate(UNCHANGED_HOUSEHOLDS, year, DIFFERENTIAL_OUTPUTS) + observed = np.stack([result[name] for name in DIFFERENTIAL_OUTPUTS], axis=1) + np.testing.assert_allclose(observed, ORIGIN_MAIN[year], atol=0.01, rtol=0) diff --git a/policyengine_uk/tests/test_legacy_means_test_income_from_capital_properties.py b/policyengine_uk/tests/test_legacy_means_test_income_from_capital_properties.py index ee4849fb03..550cf296fd 100644 --- a/policyengine_uk/tests/test_legacy_means_test_income_from_capital_properties.py +++ b/policyengine_uk/tests/test_legacy_means_test_income_from_capital_properties.py @@ -50,8 +50,10 @@ capital there. Each test floors the sum of the deduction over the members it counts at nil. 5. Tariff: the council tax reduction tariff income that replaces the actual - income from capital is never negative, never more than the yield at the - 16,000 capital limit (40 steps of 250 at 4.35 a month, 2,088 a year), nil + income from capital is never negative, never more than the Universal + Credit yield at the 16,000 capital limit (40 steps of 250 at 4.35 a month, + 2,088 a year), which exceeds the uncapped Scottish pensioner tariff on the + generated savings of up to 20,000 (20 steps of 500 at 1 a week, 1,040), nil outside the national schemes (Northern Ireland, and English people under pension age, whose local schemes set their own), and never falls when savings rise while the family stays on the same route (pensioner, UC diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py index 27d9323edb..8507549d97 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py @@ -7,20 +7,25 @@ class council_tax_reduction_applicable_amount(Variable): entity = BenUnit label = "applicable Council Tax Reduction amount" documentation = ( - "The applicant's personal allowance and premiums. Ages, couple status " - "and lone-parent status are those of the Council Tax Reduction " - "applicant and partner (is_council_tax_reduction_applicant_or_partner). " - "Where the household head applies alone " - "(council_tax_reduction_head_applies_alone), the head is a single " - "person with no partner or children, whatever the benefit unit's " - "claimant and partner are. Premiums are council_tax_reduction_premiums." + "We add the personal allowance for the applicant, or for the " + "applicant and partner, and council_tax_reduction_premiums. We take " + "their ages, couple status and lone-parent status from " + "is_council_tax_reduction_applicant_or_partner. When the household " + "head applies alone (council_tax_reduction_head_applies_alone), we " + "treat them as single with no partner or children. " + "For a pensioner we also add an amount for each child or young " + "person in the family (council_tax_reduction_pensioner_child_amounts) " + "and the family premium " + "(council_tax_reduction_pensioner_family_premium)." ) definition_period = YEAR unit = GBP reference = ( "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/6", "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/1", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/2", + "https://www.legislation.gov.uk/ssi/2012/319/regulation/20", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/7", "https://www.legislation.gov.uk/ssi/2012/319/schedule/1", "https://www.legislation.gov.uk/ssi/2021/249/schedule/1", @@ -94,7 +99,19 @@ def formula(benunit, period, parameters): + couple * couple_personal_allowance + lone_parent * lone_parent_personal_allowance ) * WEEKS_IN_YEAR - # The pension-age schedules have only the severe disability and carer - # premiums; the same pensioner test chooses the schedule. + # We currently include the severe disability and carer premiums for + # pensioners, and choose the schedule by the same pensioner test. premiums = benunit("council_tax_reduction_premiums", period) - return personal_allowance + premiums + # A pensioner's amounts for the children and young persons in the + # family and the family premium (SI 2012/2885 Sch 1 para 6(1)(b)-(c); + # WSI 2013/3029 Sch 1 para 1(1)(b)-(c); SSI 2012/319 reg 20(b)). + # We add neither for working-age families here. + child_amounts = add( + benunit, + period, + [ + "council_tax_reduction_pensioner_child_amounts", + "council_tax_reduction_pensioner_family_premium", + ], + ) + return personal_allowance + premiums + child_amounts diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_income.py index 90d36dd6c3..7b84a09992 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_income.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_income.py @@ -10,26 +10,28 @@ class council_tax_reduction_applicable_income(Variable): entity = BenUnit label = "relevant income for Council Tax Reduction means test" documentation = ( - "Income taken into account in the Council Tax Reduction means test. The " - "pensioner schemes disregard the whole income of an applicant who, or " - "whose partner, is in receipt of Pension Credit guarantee credit, and " - "use the Secretary of State's Pension Credit assessment of income, plus " - "the savings credit payable, where the award is savings credit only. " - "Otherwise a pension-age family's net earnings are reduced by the " - "pensioner earnings disregards. Great Britain's pensioner schemes " - "also exclude Child Benefit from general-rule income; statutory sick " - "and maternity pay remain counted as earnings. The other adjustments those " - "provisions allow (childcare charges, the £20 earnings disregards " - "and the rest) are not modelled. Spousal maintenance counts less one " + "We count the applicant's and partner's income " + "(is_council_tax_reduction_applicant_or_partner) in the Council Tax " + "Reduction means test. Under the pensioner schemes, councils " + "disregard the whole income of an applicant who, or whose partner, is " + "in receipt of Pension Credit guarantee credit, and use the Secretary " + "of State's Pension Credit assessment of income, plus the savings " + "credit payable, where the award is savings credit only. Otherwise we " + "deduct the pensioner earnings disregards from a pension-age family's " + "net earnings, and add its tariff income from capital " + "(council_tax_reduction_tariff_income). Councils in Great " + "Britain also exclude Child Benefit from a pensioner's general-rule " + "income and count statutory sick and maternity pay as earnings. We " + "omit the other " + "adjustments these provisions allow (childcare charges, the £20 " + "earnings disregards and the rest). Spousal maintenance counts less one " "£15 weekly disregard where the applicant's family includes a child " "or young person (the statutory family-premium condition in England's " "default and Welsh schemes). " "Widowed Parent's Allowance counts less £15 weekly per recipient. " - "Child maintenance is excluded. Scotland's working-age maintenance " + "We count no child maintenance. Scotland's working-age maintenance " "rule, like Universal Credit, requires a court order or agreement; " - "the input is assumed to meet that condition. " - "The income counted is the Council Tax Reduction applicant's and " - "partner's (is_council_tax_reduction_applicant_or_partner). " + "we assume the input meets that condition. " "Where the household head applies alone " "(council_tax_reduction_head_applies_alone), the benefit unit's own " "awards (Child Benefit, Income Support, income-based JSA, " @@ -38,11 +40,10 @@ class council_tax_reduction_applicable_income(Variable): "head, so none of them counts. Industrial injuries disablement " "benefit, severe disablement allowance and incapacity benefit count " "in every scheme, for the applicant and partner only, not for " - "children or young persons. War pensions and Armed Forces " - "Compensation Scheme payments are not counted: Scotland disregards or " - "omits them, and English and Welsh councils may relieve them beyond " - "the prescribed £10 a week, so the model takes the full disregard. " - "No scheme " + "children or young persons. We disregard war pensions and Armed " + "Forces Compensation Scheme payments in full: Scottish councils count " + "none of them, and English and Welsh councils may relieve them beyond " + "the prescribed £10 a week. No scheme " "counts income derived from capital, such as rent from property, " "interest and dividends, as income, so it is not listed and tax on it " "is not deducted (legacy_means_test_income_tax). The pensioner schemes " @@ -69,6 +70,9 @@ class council_tax_reduction_applicable_income(Variable): "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/13", "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/14", "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/16", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/37", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/31", + "https://www.legislation.gov.uk/ssi/2012/319/regulation/27", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/7", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/8", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/10", @@ -127,7 +131,7 @@ def formula(benunit, period, parameters): # 21(3); SSI 2021/249 reg 36(2)); the other schemes count the # applicant's and partner's alone. Anyone else in the benefit unit does # not count either. A household head who applies alone is the - # applicant, whatever else the benefit unit reads her as. + # applicant, whatever else the benefit unit reads them as. person = benunit.members head_applies_alone = benunit("council_tax_reduction_head_applies_alone", period) applicant_family = ~head_applies_alone diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_amounts.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_amounts.py new file mode 100644 index 0000000000..a3afe5ab76 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_amounts.py @@ -0,0 +1,93 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.household.demographic.country import Country + + +class council_tax_reduction_pensioner_child_amounts(Variable): + value_type = float + entity = BenUnit + label = "Council Tax Reduction pensioner child or young person amounts" + documentation = ( + "Councils add one weekly amount for each child or young person in a " + "pensioner's family to the Council Tax Reduction applicable amount. " + "For the 2018-19 to 2024-25 schemes the Secretary of State limited " + "England's child amounts to two children or young persons, unless " + "the applicant's Child Tax Credit award included the individual " + "element for more of them. We read an award from a positive final " + "child_tax_credit, worked out or entered. While HMRC pays tax credit " + "awards (gov.dwp.tax_credits.active), we also count an award, even a " + "nil-rate one, where the model reads a claim and eligibility from " + "reports. We do not model the transitional protection for families " + "with more than two on 31 March 2018. Where the household head " + "applies alone (council_tax_reduction_head_applies_alone), we assume " + "the head has no children in their family, because we cannot " + "identify their relationships. We give working-age families nil, " + "because we do not model their child amounts here." + ) + definition_period = YEAR + unit = GBP + reference = ( + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/6", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/part/1/paragraph/2", + "https://www.legislation.gov.uk/uksi/2017/1305/regulation/7/made", + "https://www.legislation.gov.uk/uksi/2017/1305/regulation/17/made", + "https://www.legislation.gov.uk/uksi/2025/39/regulation/5/made", + "https://www.legislation.gov.uk/ukpga/2002/21/section/14", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/1", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/paragraph/2", + "https://www.legislation.gov.uk/ssi/2012/319/regulation/20", + "https://www.legislation.gov.uk/ssi/2012/319/schedule/1/paragraph/3", + ) + + def formula(benunit, period, parameters): + local_authorities = parameters(period).gov.local_authorities + england = local_authorities.england.council_tax_reduction.pensioners + wales = local_authorities.wales.council_tax_reduction.pensioners + scotland = local_authorities.scotland.council_tax_reduction.pensioners + country = benunit.household("country", period) + in_england = country == Country.ENGLAND + person = benunit.members + child = person("is_child_or_young_person_for_council_tax_reduction", period) + children = benunit.sum(child) + counted = children + limit = england.applicable_amount.child_limit + if np.isfinite(limit): + # SI 2012/2885 Sch 1 para 6(1)(b) and (1A) to (1C), from SI + # 2017/1305 reg 7: up to two, or those whose individual element + # an award of Child Tax Credit includes where that gives more. + # Every child or young person has the same amount, so counting + # the most children gives the greatest total. + # Councils apply para 6(1B)(a) where the applicant has an award + # of Child Tax Credit "whether or not any amount is payable", and + # HMRC may award it at a nil rate (TCA 2002 s.14(3)). We count a + # positive final child_tax_credit, worked out or entered, as an + # award, and also the claim and eligibility that the model reads + # from reports, whatever amount is payable. As in + # has_tax_credit_award, we infer no award from reports once HMRC + # stops paying awards. + child_tax_credit_award = benunit("child_tax_credit", period) > 0 + if parameters(period).gov.dwp.tax_credits.active: + child_tax_credit_award = child_tax_credit_award | ( + benunit("would_claim_CTC", period) + & benunit("is_CTC_eligible", period) + ) + child_tax_credit_children = benunit.sum( + child & person("is_CTC_child_element_included", period) + ) + limited = min_(children, limit) + counted = where( + in_england & child_tax_credit_award, + max_(limited, child_tax_credit_children), + where(in_england, limited, children), + ) + weekly_amount = select( + [in_england, country == Country.WALES, country == Country.SCOTLAND], + [ + england.applicable_amount.child_or_young_person, + wales.applicable_amount.child_or_young_person, + scotland.applicable_amount.child_or_young_person, + ], + default=0, + ) + pensioner = benunit("council_tax_reduction_pensioner", period) + applicant_family = ~benunit("council_tax_reduction_head_applies_alone", period) + return pensioner * applicant_family * counted * weekly_amount * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_family_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_family_premium.py new file mode 100644 index 0000000000..408607e2b6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_family_premium.py @@ -0,0 +1,59 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.household.demographic.country import Country + + +class council_tax_reduction_pensioner_family_premium(Variable): + value_type = float + entity = BenUnit + label = "Council Tax Reduction pensioner family premium" + documentation = ( + "Councils add the family premium to a pensioner's applicable amount " + "when their family includes a child or young person. The Welsh " + "Ministers retain it. The Secretary of State made England's nil for " + "reduction weeks beginning after 1 May 2016, and the Scottish " + "Ministers removed Scotland's from 1 May 2016. Each kept it for " + "families with a child who had a reduction on 30 April 2016 until " + "they make a new application or have no child; we do not model that " + "protection. We read each year's amount on 30 April, so we keep the " + "premium for the whole of model year 2016." + ) + definition_period = YEAR + unit = GBP + reference = ( + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/6", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/part/2/paragraph/3", + "https://www.legislation.gov.uk/uksi/2015/2041/regulation/3/made", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/1", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/paragraph/3", + "https://www.legislation.gov.uk/ssi/2016/81/regulation/2/made", + "https://www.legislation.gov.uk/ssi/2016/81/regulation/18/made", + "https://www.legislation.gov.uk/ssi/2012/319/regulation/20", + ) + + def formula(benunit, period, parameters): + local_authorities = parameters(period).gov.local_authorities + england = local_authorities.england.council_tax_reduction.pensioners + wales = local_authorities.wales.council_tax_reduction.pensioners + scotland = local_authorities.scotland.council_tax_reduction.pensioners + country = benunit.household("country", period) + weekly_premium = select( + [ + country == Country.ENGLAND, + country == Country.WALES, + country == Country.SCOTLAND, + ], + [ + england.applicable_amount.family_premium, + wales.applicable_amount.family_premium, + scotland.applicable_amount.family_premium, + ], + default=0, + ) + pensioner = benunit("council_tax_reduction_pensioner", period) + # We assume the head who applies alone has no children in their family. + has_child = ~benunit( + "council_tax_reduction_head_applies_alone", period + ) & benunit( + "is_responsible_for_child_or_young_person_for_council_tax_reduction", period + ) + return pensioner * has_child * weekly_premium * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_tariff_income.py index f69ff77239..d660f1e314 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_tariff_income.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_tariff_income.py @@ -8,8 +8,8 @@ def tariff_amount(capital, tariff, capital_limit): # `amount` for each complete `step` of capital above `threshold`, and - # `amount` for any part of a step. Capital above the limit leaves no - # entitlement, so it is not counted. + # `amount` for any part of a step, counting capital up to + # `capital_limit`. excess = max_(0, min_(capital, capital_limit) - tariff.threshold) return np.ceil(excess / tariff.step) * tariff.amount @@ -22,7 +22,10 @@ class council_tax_reduction_tariff_income(Variable): "Income the national Council Tax Reduction schemes (England for " "pensioners, Wales and Scotland) treat capital as yielding, annualised. " "Pensioners: £1 a week for each £500, or part of £500, of capital over " - "£10,000. People under pension age in Wales and Scotland: £1 a week " + "£10,000. The Secretary of State and the Welsh Ministers count capital " + "up to £16,000, the capital limit; the Scottish Ministers set no " + "ceiling (SSI 2012/319 reg 27(2)) and bar a reduction where capital " + "exceeds £16,000 (reg 40). People under pension age in Wales and Scotland: £1 a week " "for each £250, or part of £250, over £6,000; with an award of " "Universal Credit (council_tax_reduction_universal_credit_award, " "including an award the benefit cap or deductions reduce to nil), the " @@ -48,6 +51,7 @@ class council_tax_reduction_tariff_income(Variable): "https://www.legislation.gov.uk/wsi/2013/3029/schedule/6/paragraph/33", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/10/paragraph/8", "https://www.legislation.gov.uk/ssi/2012/319/regulation/27", + "https://www.legislation.gov.uk/ssi/2012/319/regulation/40", "https://www.legislation.gov.uk/ssi/2012/303/regulation/26", "https://www.legislation.gov.uk/ssi/2012/303/regulation/51", "https://www.legislation.gov.uk/ssi/2012/303/schedule/5/paragraph/7", @@ -82,11 +86,9 @@ def formula(benunit, period, parameters): wales_p.tariff_income.pensioner, wales_p.capital_limit, ), - tariff_amount( - capital, - scotland_p.tariff_income.pensioner, - scotland_p.capital_limit, - ), + # SSI 2012/319 reg 27(2) sets no ceiling; reg 40 bars a + # reduction where capital exceeds £16,000. + tariff_amount(capital, scotland_p.tariff_income.pensioner, np.inf), ], default=0, )