diff --git a/changelog.d/legacy-capital-derived-income.fixed.md b/changelog.d/legacy-capital-derived-income.fixed.md new file mode 100644 index 0000000000..0a97bfbb8f --- /dev/null +++ b/changelog.d/legacy-capital-derived-income.fixed.md @@ -0,0 +1 @@ +Stop counting rent from property, and deducting tax on rent, interest and dividends, in the Income Support, Housing Benefit, Pension Credit and council tax reduction means tests, which treat income derived from capital as capital; count rent for letting part of the home less the £20 weekly sub-tenant disregard. Council tax reduction now counts land and property other than the home as capital, at market value less 10% for the expenses of sale, adds the national schemes' tariff income from capital (England for pensioners, Wales and Scotland), uses the Universal Credit assessment of capital for Universal Credit recipients where the scheme says so, and applies Oxford's disregard of capital already assessed for Universal Credit or income-related benefits. diff --git a/docs/book/programs/gov/dwp/housing-benefit.ipynb b/docs/book/programs/gov/dwp/housing-benefit.ipynb index 01ae7d9a50..1941b9e284 100644 --- a/docs/book/programs/gov/dwp/housing-benefit.ipynb +++ b/docs/book/programs/gov/dwp/housing-benefit.ipynb @@ -40,7 +40,7 @@ "\n", "1. **Eligible rent**: the rent the benunit is liable for (`benunit_rent`). Where the Local Housing Allowance applies (`LHA_eligible`: renting, and no member in social housing), the eligible rent is the maximum rent (LHA), which is the LHA rate or, where the rent is lower, the rent (`LHA_cap`; SI 2006/213 regs [12D(2)(a)](https://www.legislation.gov.uk/uksi/2006/213/regulation/12D) and [13D(5)](https://www.legislation.gov.uk/uksi/2006/213/regulation/13D)).\n", "2. **Applicable amount** (`housing_benefit_applicable_amount`): a personal allowance derived from the benunit's composition (single, couple, lone parent) and age, plus any disability/carer premiums. This is the \"minimum income\" the household needs before HB tapers begin.\n", - "3. **Means test** (`housing_benefit_entitlement`): the appropriate maximum Housing Benefit is the eligible rent less `housing_benefit_non_dep_deductions` for any non-dependant adults living in the household ([reg. 70](https://www.legislation.gov.uk/uksi/2006/213/regulation/70)). The published `withdrawal_rate` (currently 0.65) of the benunit's `housing_benefit_applicable_income` in excess of the applicable amount is deducted from that maximum ([SSCBA 1992 s. 130(3)(b)](https://www.legislation.gov.uk/ukpga/1992/4/section/130), [reg. 71](https://www.legislation.gov.uk/uksi/2006/213/regulation/71)). Because the LHA caps the eligible rent, the taper comes off the LHA: a private tenant with rent above the LHA and income above the applicable amount receives the LHA less the taper, not the lower of the LHA and the rent less the taper. The pension-age regulations (SI 2006/214) have the same rules at regs 12D, 13D, 50 and 51, and the Northern Ireland regulations at SR 2006/405 regs 13C, 14D, 68 and 69 and SR 2006/406 regs 13C, 14D, 48 and 49.\n", + "3. **Means test** (`housing_benefit_entitlement`): the appropriate maximum Housing Benefit is the eligible rent less `housing_benefit_non_dep_deductions` for any non-dependant adults living in the household ([reg. 70](https://www.legislation.gov.uk/uksi/2006/213/regulation/70)). The published `withdrawal_rate` (currently 0.65) of the benunit's `housing_benefit_applicable_income` in excess of the applicable amount is deducted from that maximum ([SSCBA 1992 s. 130(3)(b)](https://www.legislation.gov.uk/ukpga/1992/4/section/130), [reg. 71](https://www.legislation.gov.uk/uksi/2006/213/regulation/71)). Because the LHA caps the eligible rent, the taper comes off the LHA: a private tenant with rent above the LHA and income above the applicable amount receives the LHA less the taper, not the lower of the LHA and the rent less the taper. The pension-age regulations (SI 2006/214) have the same rules at regs 12D, 13D, 50 and 51, and the Northern Ireland regulations at SR 2006/405 regs 13C, 14D, 68 and 69 and SR 2006/406 regs 13C, 14D, 48 and 49. Applicable income counts earnings, pensions and benefits net of the income tax and National Insurance on them. Income derived from capital (rent from property, interest and dividends) is not income: regulation 46(4) of the Housing Benefit Regulations 2006 treats it as capital, and Schedule 5 paragraph 22 of the pension-age regulations disregards it. The capital counts instead through `housing_benefit_tariff_income` and the capital limit. Rent for letting part of the home is the exception: it counts, less £20 a week per occupier.\n", "4. **Benefit cap** (`housing_benefit`): the post-means-test award is finally reduced by `benefit_cap_reduction` if the household's total benefit income exceeds the cap and no cap exemption applies.\n", "\n", "The take-up gate (`would_claim_housing_benefit`) is applied inside `housing_benefit_pre_benefit_cap`." diff --git a/policyengine_uk/parameters/gov/dwp/legacy_means_tests/sub_tenant_rent_disregard/pension_age.yaml b/policyengine_uk/parameters/gov/dwp/legacy_means_tests/sub_tenant_rent_disregard/pension_age.yaml new file mode 100644 index 0000000000..135bc3414d --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/legacy_means_tests/sub_tenant_rent_disregard/pension_age.yaml @@ -0,0 +1,27 @@ +description: > + Weekly amount disregarded from the rent a claimant over the qualifying age + for State Pension Credit receives from a person who occupies part of a + property the claimant lives in, under an agreement to pay rent; rent below + this amount is disregarded in full. Pension Credit and pension-age Housing + Benefit use it, and the pensioner council tax reduction schemes in England, + Wales and Scotland copy it. Before Pension Credit began on 6 October 2003 + there was no separate pension-age amount; Income Support, including for + claimants over 60, disregarded £4 (Schedule 9 paragraph 19 as made). +metadata: + label: Legacy benefits pension-age sub-tenant rent disregard + period: week + unit: currency-GBP + reference: + - title: The State Pension Credit Regulations 2002 Schedule IV para. 9 + href: https://www.legislation.gov.uk/uksi/2002/1792/schedule/IV/paragraph/9 + - title: The Income Support (General) Regulations 1987 Schedule 9 para. 19 (as made) + href: https://www.legislation.gov.uk/uksi/1987/1967/schedule/9/made + - title: The State Pension Credit Regulations 2002 Schedule IV para. 9 (as made) + href: https://www.legislation.gov.uk/uksi/2002/1792/schedule/IV/made + - title: The Housing Benefit (Persons who have attained the qualifying age for state pension credit) Regulations 2006 Schedule 5 para. 10 + href: https://www.legislation.gov.uk/uksi/2006/214/schedule/5/paragraph/10 + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Schedule 5 para. 10 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/5/paragraph/10 +values: + 1988-04-11: 4 + 2003-10-06: 20 diff --git a/policyengine_uk/parameters/gov/dwp/legacy_means_tests/sub_tenant_rent_disregard/working_age.yaml b/policyengine_uk/parameters/gov/dwp/legacy_means_tests/sub_tenant_rent_disregard/working_age.yaml new file mode 100644 index 0000000000..af9db8f7bc --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/legacy_means_tests/sub_tenant_rent_disregard/working_age.yaml @@ -0,0 +1,30 @@ +description: > + Weekly amount disregarded from the rent a working-age claimant receives from + a person who occupies part of the claimant's home under a contractual + liability to pay for it, other than board and lodging; rent below this + amount is disregarded in full. Income Support, income-based Jobseeker's + Allowance, income-related Employment and Support Allowance and working-age + Housing Benefit use it, and the working-age council tax reduction schemes + in Wales and the English default scheme copy it. Before April 2008 the + disregard was £4 plus a further amount where the payment included heating; + the heating amount is not modelled. +metadata: + label: Legacy benefits working-age sub-tenant rent disregard + period: week + unit: currency-GBP + reference: + - title: The Income Support (General) Regulations 1987 Schedule 9 para. 19 + href: https://www.legislation.gov.uk/uksi/1987/1967/schedule/9/paragraph/19 + - title: The Income Support (General) Regulations 1987 Schedule 9 para. 19 (as made) + href: https://www.legislation.gov.uk/uksi/1987/1967/schedule/9/made + - title: The Housing Benefit Regulations 2006 Schedule 5 para. 22 + href: https://www.legislation.gov.uk/uksi/2006/213/schedule/5/paragraph/22 + - title: The Jobseeker's Allowance Regulations 1996 Schedule 7 para. 20 + href: https://www.legislation.gov.uk/uksi/1996/207/schedule/7/paragraph/20 + - title: The Employment and Support Allowance Regulations 2008 Schedule 8 para. 20 + href: https://www.legislation.gov.uk/uksi/2008/794/schedule/8/paragraph/20 + - title: The Social Security (Miscellaneous Amendments) (No. 5) Regulations 2007 regs. 1(2), 1(3), 5(12) and 11(12) + href: https://www.legislation.gov.uk/uksi/2007/2618/regulation/1/made +values: + 1988-04-11: 4 + 2008-04-07: 20 diff --git a/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml b/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml index 474274eadb..2117e470e1 100644 --- a/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml +++ b/policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/income.yaml @@ -9,6 +9,8 @@ metadata: title: State Pension Credit Regulations 2002 reg. 15 - href: https://www.legislation.gov.uk/uksi/2026/246/article/17/made title: SI 2026/246 art. 17 (Scottish Carer Supplement excepted from reg. 15(1)) + - href: https://www.legislation.gov.uk/uksi/2002/1792/schedule/IV/paragraph/18 + title: State Pension Credit Regulations 2002 Schedule IV para. 18 (actual income from capital disregarded) unit: list values: 2002-01-01: @@ -16,7 +18,11 @@ values: - working_tax_credit - state_pension - private_pension_income - - property_income + # Rent from other property is actual income from capital, disregarded by + # Schedule IV para. 18; the property counts through deemed income. Rent for + # part of the claimant's home is reg. 15(5)(i) income, less the Schedule IV + # para. 9 disregard. + - legacy_benefits_home_letting_income - pension_credit_deemed_income - esa_contrib - jsa_contrib diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sale_expenses/rate.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sale_expenses/rate.yaml new file mode 100644 index 0000000000..6ec187b3fb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sale_expenses/rate.yaml @@ -0,0 +1,27 @@ +description: > + Share of the current market or surrender value deducted from council tax + reduction capital where there would be expenses attributable to sale. It is + a flat 10% whatever the actual costs. The amount of any encumbrance secured + on the asset is also deducted, but the data cannot identify debt secured on + property other than the home, so that deduction is not modelled. +values: + 2013-04-01: 0.1 +metadata: + label: Council tax reduction capital sale expense deduction + period: year + unit: /1 + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Schedule 1 para. 32 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/32 + - title: The Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule para. 65 + href: https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/65 + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 1 para. 26 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/26 + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 6 para. 28 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/6/paragraph/28 + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 reg. 42 + href: https://www.legislation.gov.uk/ssi/2012/319/regulation/42 + - title: The Council Tax Reduction (Scotland) Regulations 2012 reg. 46 (persons under pension age, to 31 March 2022) + href: https://www.legislation.gov.uk/ssi/2012/303/regulation/46 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 70 + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/70 diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sale_expenses/sources.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sale_expenses/sources.yaml new file mode 100644 index 0000000000..fda5d09021 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sale_expenses/sources.yaml @@ -0,0 +1,29 @@ +description: > + Council tax reduction capital sources whose sale would incur expenses, so + that they are valued at 90% of market value. Real property always has costs + of sale (R(IS) 21/93, as DMG 29622 applies it to the identically worded + Income Support rule), so `owned_land`, `other_residential_property_value` + and `non_residential_property_value` are listed. `savings` is not: a bank or + building society account is valued at its balance, and the costs of + withdrawing money are not costs of sale (HBGM BW1 Annex F and BP1 F2.03, + on the same words in the Housing Benefit regulations). +metadata: + label: Council tax reduction capital sources with sale expenses + period: year + unit: list + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Schedule 1 para. 32(a) + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/32 + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 6 para. 28(a) + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/6/paragraph/28 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 70(1)(a) + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/70 + - title: Decision Makers' Guide chapter 29, para. 29622 (real property, R(IS) 21/93) + href: https://assets.publishing.service.gov.uk/media/69d8f3a496c86b751317022c/dmg-Ch-29.pdf#page=124 + - title: Housing Benefit Guidance Manual BW1, Annex F + href: https://assets.publishing.service.gov.uk/media/5a749328ed915d0e8e3994c0/hbgm-bw1-assessment-of-capital.pdf#page=93 +values: + 2013-04-01: + - owned_land + - other_residential_property_value + - non_residential_property_value diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sources.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sources.yaml new file mode 100644 index 0000000000..c8d6ee6133 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sources.yaml @@ -0,0 +1,44 @@ +description: > + Household capital counted for the council tax reduction capital limit and + tariff income, outside the Pension Credit and Universal Credit routes. Every + scheme counts the whole of the applicant's capital unless a schedule + disregards it, including land and property other than the home: the + prescribed requirements for pensioners in England (Schedule 1 paragraph + 31(1)) and Wales (Schedule 1 paragraph 25(1)), the Welsh working-age rules + (Schedule 6 paragraph 26(1)), the English default scheme (paragraph 63(1)), + the Scottish pension-age scheme (regulation 41(1)) and the Scottish + working-age schemes (SSI 2012/303 regulation 43(1) to 31 March 2022, then + SSI 2021/249 regulations 67 and 69). `main_residence_value` is left out + because the home is disregarded. `corporate_wealth` is also left out for + now: in the data it is mostly imputed pension wealth, which the schemes + disregard, and it cannot yet be separated (issue 1936). Land and property + are valued less sale expenses (`sale_expenses`). +metadata: + label: Council tax reduction capital sources + unit: list + period: year + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 reg. 11(2) and Schedule 1 para. 31 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/31 + - title: The Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule para. 63 + href: https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/63 + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 reg. 30 + href: https://www.legislation.gov.uk/wsi/2013/3029/regulation/30 + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 1 para. 25 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/25 + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 6 para. 26 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/6/paragraph/26 + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 regs. 40 and 41 + href: https://www.legislation.gov.uk/ssi/2012/319/regulation/41 + - title: The Council Tax Reduction (Scotland) Regulations 2012 reg. 43 (persons under pension age, to 31 March 2022) + href: https://www.legislation.gov.uk/ssi/2012/303/regulation/43 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 67 + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/67 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 69 + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/69 +values: + 2013-04-01: + - savings + - owned_land + - other_residential_property_value + - non_residential_property_value diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/tariff_income/amount.yaml new file mode 100644 index 0000000000..9bcd3e8f7c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income the England Council Tax Reduction pensioner scheme counts for each step of capital, or part of one, above the threshold. +values: + 2013-04-01: 1 +metadata: + unit: currency-GBP + period: year + label: England Council Tax Reduction pensioner weekly tariff income per capital step + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Schedule 1 para. 37 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/37 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/tariff_income/step.yaml new file mode 100644 index 0000000000..92751f8871 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Step of capital above the threshold, or part of one, that the England Council Tax Reduction pensioner scheme treats as yielding one amount of weekly tariff income. +values: + 2013-04-01: 500 +metadata: + unit: currency-GBP + period: year + label: England Council Tax Reduction pensioner tariff income capital step + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Schedule 1 para. 37 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/37 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/tariff_income/threshold.yaml new file mode 100644 index 0000000000..2dc0adce1f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital above which the England Council Tax Reduction pensioner scheme treats capital as yielding a weekly tariff income. +values: + 2013-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: England Council Tax Reduction pensioner tariff income threshold + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Schedule 1 para. 37 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/37 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/pensioner/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/pensioner/amount.yaml new file mode 100644 index 0000000000..0563d2fd66 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/pensioner/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income the Scotland Council Tax Reduction pensioner scheme counts for each step of capital, or part of one, above the threshold. +values: + 2013-04-01: 1 +metadata: + unit: currency-GBP + period: year + label: Scotland Council Tax Reduction pensioner weekly tariff income per capital step + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 reg. 27(2) + href: https://www.legislation.gov.uk/ssi/2012/319/regulation/27 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/pensioner/step.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/pensioner/step.yaml new file mode 100644 index 0000000000..236abcc702 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/pensioner/step.yaml @@ -0,0 +1,10 @@ +description: Step of capital above the threshold, or part of one, that the Scotland Council Tax Reduction pensioner scheme treats as yielding one amount of weekly tariff income. +values: + 2013-04-01: 500 +metadata: + unit: currency-GBP + period: year + label: Scotland Council Tax Reduction pensioner tariff income capital step + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 reg. 27(2) + href: https://www.legislation.gov.uk/ssi/2012/319/regulation/27 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/pensioner/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/pensioner/threshold.yaml new file mode 100644 index 0000000000..cb51a4ec39 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/pensioner/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital above which the Scotland Council Tax Reduction pensioner scheme treats capital as yielding a weekly tariff income. +values: + 2013-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Scotland Council Tax Reduction pensioner tariff income threshold + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 reg. 27(2) + href: https://www.legislation.gov.uk/ssi/2012/319/regulation/27 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/working_age/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/working_age/amount.yaml new file mode 100644 index 0000000000..7ef585b74b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/working_age/amount.yaml @@ -0,0 +1,12 @@ +description: Weekly tariff income the Scotland Council Tax Reduction working-age scheme counts for each step of capital, or part of one, above the threshold. +values: + 2013-04-01: 1 +metadata: + unit: currency-GBP + period: year + label: Scotland Council Tax Reduction working-age weekly tariff income per capital step + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 reg. 51 (persons under pension age, to 31 March 2022) + href: https://www.legislation.gov.uk/ssi/2012/303/regulation/51 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 63(1)(b) + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/63 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/working_age/step.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/working_age/step.yaml new file mode 100644 index 0000000000..64edd8615f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/working_age/step.yaml @@ -0,0 +1,12 @@ +description: Step of capital above the threshold, or part of one, that the Scotland Council Tax Reduction working-age scheme treats as yielding one amount of weekly tariff income. +values: + 2013-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Scotland Council Tax Reduction working-age tariff income capital step + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 reg. 51 (persons under pension age, to 31 March 2022) + href: https://www.legislation.gov.uk/ssi/2012/303/regulation/51 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 63(1)(b) + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/63 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/working_age/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/working_age/threshold.yaml new file mode 100644 index 0000000000..49a77b2b39 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/tariff_income/working_age/threshold.yaml @@ -0,0 +1,12 @@ +description: Capital above which the Scotland Council Tax Reduction working-age scheme treats capital as yielding a weekly tariff income. +values: + 2013-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Scotland Council Tax Reduction working-age tariff income threshold + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 reg. 51 (persons under pension age, to 31 March 2022) + href: https://www.legislation.gov.uk/ssi/2012/303/regulation/51 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 63(1)(b) + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/63 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/uses_universal_credit_capital_assessment.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/uses_universal_credit_capital_assessment.yaml new file mode 100644 index 0000000000..7fc675e578 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/uses_universal_credit_capital_assessment.yaml @@ -0,0 +1,24 @@ +description: > + Whether the Scottish council tax reduction scheme for people under pension + age takes the capital of an applicant with an award of Universal Credit + from the Secretary of State's calculation for that award. The Council Tax + Reduction (Scotland) Regulations 2012 did (regulation 26(4) as made; + regulation 26(6) after SSI 2018/69 substituted the regulation). The Council Tax Reduction (Scotland) Regulations 2021, in force + from 1 April 2022, have no such rule: the authority calculates every + applicant's capital itself (regulations 66 to 70). +metadata: + label: Scotland working-age council tax reduction uses the Universal Credit capital assessment + unit: bool + period: year + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 reg. 26(4) (as made) + href: https://www.legislation.gov.uk/ssi/2012/303/regulation/26/made + - title: The Council Tax Reduction (Scotland) Regulations 2012 reg. 26(6) (as at 1 April 2021) + href: https://www.legislation.gov.uk/ssi/2012/303/regulation/26/2021-04-01 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 1 (commencement, 1 April 2022) + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/1 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 66 + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/66 +values: + 2013-04-01: true + 2022-04-01: false diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/working_age_counts_home_letting_income.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/working_age_counts_home_letting_income.yaml new file mode 100644 index 0000000000..56fee06843 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/working_age_counts_home_letting_income.yaml @@ -0,0 +1,21 @@ +description: > + Whether the Scottish council tax reduction scheme for people under pension + age counts rent from letting part of the applicant's home as income. The + Council Tax Reduction (Scotland) Regulations 2012 did, less £20 a week + (Schedule 4 paragraph 25). The Council Tax Reduction (Scotland) Regulations + 2021, in force from 1 April 2022, list unearned income in full in + regulation 57(1), and the list has no head for it. +metadata: + label: Scotland working-age council tax reduction counts home-letting income + unit: bool + period: year + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 Schedule 4 para. 25 (as at 1 April 2021) + href: https://www.legislation.gov.uk/ssi/2012/303/schedule/4/2021-04-01 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 1 (commencement, 1 April 2022) + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/1 + - title: The Council Tax Reduction (Scotland) Regulations 2021 reg. 57 + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/57 +values: + 2013-04-01: true + 2022-04-01: false diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/pensioner/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/pensioner/amount.yaml new file mode 100644 index 0000000000..dd91c21484 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/pensioner/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income the Wales Council Tax Reduction pensioner scheme counts for each step of capital, or part of one, above the threshold. +values: + 2013-04-01: 1 +metadata: + unit: currency-GBP + period: year + label: Wales Council Tax Reduction pensioner weekly tariff income per capital step + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 1 para. 31 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/31 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/pensioner/step.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/pensioner/step.yaml new file mode 100644 index 0000000000..ad37548b57 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/pensioner/step.yaml @@ -0,0 +1,10 @@ +description: Step of capital above the threshold, or part of one, that the Wales Council Tax Reduction pensioner scheme treats as yielding one amount of weekly tariff income. +values: + 2013-04-01: 500 +metadata: + unit: currency-GBP + period: year + label: Wales Council Tax Reduction pensioner tariff income capital step + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 1 para. 31 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/31 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/pensioner/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/pensioner/threshold.yaml new file mode 100644 index 0000000000..5f1c4de9ce --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/pensioner/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital above which the Wales Council Tax Reduction pensioner scheme treats capital as yielding a weekly tariff income. +values: + 2013-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Wales Council Tax Reduction pensioner tariff income threshold + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 1 para. 31 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/31 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/working_age/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/working_age/amount.yaml new file mode 100644 index 0000000000..8f0e0aba6a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/working_age/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income the Wales Council Tax Reduction working-age scheme counts for each step of capital, or part of one, above the threshold. +values: + 2013-04-01: 1 +metadata: + unit: currency-GBP + period: year + label: Wales Council Tax Reduction working-age weekly tariff income per capital step + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 6 para. 33 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/6/paragraph/33 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/working_age/step.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/working_age/step.yaml new file mode 100644 index 0000000000..c9f3b07f99 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/working_age/step.yaml @@ -0,0 +1,10 @@ +description: Step of capital above the threshold, or part of one, that the Wales Council Tax Reduction working-age scheme treats as yielding one amount of weekly tariff income. +values: + 2013-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Wales Council Tax Reduction working-age tariff income capital step + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 6 para. 33 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/6/paragraph/33 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/working_age/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/working_age/threshold.yaml new file mode 100644 index 0000000000..cbe82c917e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/tariff_income/working_age/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital above which the Wales Council Tax Reduction working-age scheme treats capital as yielding a weekly tariff income. +values: + 2013-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Wales Council Tax Reduction working-age tariff income threshold + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Schedule 6 para. 33 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/6/paragraph/33 diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income.yaml index 135bd6cebc..29588ade54 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/applicable_income/housing_benefit_applicable_income.yaml @@ -70,7 +70,13 @@ output: housing_benefit_applicable_income: 2_500 -- name: Added Tax and income +- name: Added tax credits; rent from let property is capital, not income + # An isolated check of the formula's components, not a full assessment: in + # law an Income Support recipient's whole income is disregarded (Sch 5 + # para 4), as is child benefit (para 65). HB Regs 2006 reg 46(4) treats + # income derived from capital as capital and Sch 5 para 17 disregards it, so + # the £1,000 of property income does not count: 1,000 child benefit + 2,250 + # IS + 1,000 tax credits - 1,500 / 2. period: 2025 input: # Benefits @@ -92,7 +98,7 @@ housing_benefit_applicable_income_disregard: 0 housing_benefit_applicable_income_childcare_element: 0 output: - housing_benefit_applicable_income: 4_500 + housing_benefit_applicable_income: 3_500 - name: Pension contributions capped at 0 period: 2025 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 new file mode 100644 index 0000000000..f3ae83a17e --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/legacy_means_tests/income_from_capital.yaml @@ -0,0 +1,984 @@ +# Income derived from capital in the legacy means tests. +# +# Income Support, Housing Benefit, Pension Credit and council tax reduction +# treat rent, interest and dividends as capital, not income (IS Regs 1987 reg +# 48(4) and Sch 9 para 22; HB Regs 2006 reg 46(4) and Sch 5 para 17; HB (SPC) +# Regs 2006 Sch 5 para 22; SPC Regs 2002 Sch IV para 18; CTR equivalents), and +# disregard tax only on income they take into account (IS Sch 9 para 1; HB Sch 5 +# para 1; HB (SPC) reg 33(12); SPC reg 17(10)(a)). Rent for letting part of the +# home stays income less £20 a week per occupier (IS Sch 9 para 19; HB Sch 5 +# para 22; HB (SPC) Sch 5 para 10; SPC Sch IV para 9). +# +# Tax figures: personal allowance £12,570; basic rate 20%; property allowance +# £1,000; personal savings allowance £1,000 for a basic-rate taxpayer; +# dividend allowance £500; dividend ordinary rate 8.75% in 2025-26 and 10.75% +# in 2026-27 (the model's rate); employee NI 8% above £12,570. + +- name: Income Support, lone parent with earnings and rent from a let property + # Earnings 10,000 use 10,000 of the personal allowance, so the remaining + # 2,570 goes against taxable rent of 5,200 - 1,000 = 4,200. Tax on rent: + # (4,200 - 2,570) x 20% = 326. Tax on earnings and NI: nil. + # Main counted the rent and deducted its tax: 10,000 + 5,200 - 326 - 1,040. + # The law counts neither: 10,000 - 1,040 (the £20 lone parent disregard). + period: 2025 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + employment_income: 10_000 + property_income: 5_200 + income_support_reported: 1 + child: + age: 3 + benunits: + benunit: + members: [parent, child] + households: + household: + members: [parent, child] + output: + income_tax: [326, 0] + property_income_tax: [326, 0] + legacy_means_test_income_tax: [0, 0] + income_support_applicable_income: 8_960 + +- name: Working-age Housing Benefit counts earnings net of the tax on them only + # Earnings 14,000: tax (14,000 - 12,570) x 20% = 286; NI (14,000 - 12,570) + # x 8% = 114.40. Rent 6,000: tax (6,000 - 1,000) x 20% = 1,000. Interest 500 + # is within the personal savings allowance. Dividends 1,000: (1,000 - 500) x + # 8.75% = 43.75. Income tax 1,329.75, of which 286 is on counted income. + # Applicable income: 14,000 - 286 - 114.40 - 260 (the £5 weekly disregard, + # set as an input here) = 13,339.60. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + employment_income: 14_000 + property_income: 6_000 + savings_interest_income: 500 + dividend_income: 1_000 + benunits: + benunit: + members: [person] + housing_benefit_applicable_income_disregard: 260 + households: + household: + members: [person] + output: + income_tax: 1_329.75 + property_income_tax: 1_000 + dividend_income_tax: 43.75 + savings_income_tax: 0 + legacy_means_test_income_tax: 286 + national_insurance: 114.40 + housing_benefit_applicable_income: 13_339.60 + +- name: Pension-age Housing Benefit counts rent from part of the home less £20 a week, not rent from other property + # State Pension 12,000 and private pension 2,000 use the personal allowance + # and leave 1,430 taxable: tax 286. Rent from other property 3,000: taxable + # 2,000, tax 400, not deducted. Sub-tenant rent 5,200 (£100 a week): HB (SPC) + # reg 29(1)(v) less Sch 5 para 10's £20, so 80 x 52 = 4,160. + # Applicable income: 14,000 + 4,160 - 286 = 17,874 (no earnings disregard, + # set to 0). Pension Credit income is the same 17,874, above the £238 x 52 = + # 12,376 guarantee, so there is no guarantee credit passport. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 70 + state_pension: 12_000 + private_pension_income: 2_000 + property_income: 3_000 + sublet_income: 5_200 + benunits: + benunit: + members: [person] + housing_benefit_applicable_income_disregard: 0 + households: + household: + members: [person] + output: + income_tax: 686 + legacy_means_test_income_tax: 286 + legacy_benefits_home_letting_income: 4_160 + pension_credit_income: 17_874 + guarantee_credit: 0 + housing_benefit_applicable_income: 17_874 + +- name: Pension Credit ignores rent from a let property + # SPC Sch IV para 18. Rent 4,000: taxable 3,000, of which 3,000 - (12,570 - + # 10,000) = 430 is taxed: 86, not deducted. Income 10,000 (State Pension). + # Guarantee credit (238 - 10,000 / 52) x 52 = 12,376 - 10,000 = 2,376. + # Savings credit: qualifying income 10,000 is below the threshold of + # 208.07 x 52 = 10,819.64, so nil. Main counted the rent less its tax: + # 13,914, which paid no guarantee credit. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 80 + state_pension: 10_000 + property_income: 4_000 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + output: + income_tax: 86 + legacy_means_test_income_tax: 0 + pension_credit_income: 10_000 + guarantee_credit: 2_376 + savings_credit: 0 + pension_credit: 2_376 + +- name: Pension Credit does not deduct tax on dividends + # State Pension 12,000 leaves 570 of the personal allowance for dividends + # 3,000: taxable 2,430 - 500 allowance = 1,930, at 10.75% = 207.475. That tax + # is on income Pension Credit does not count, so it is not deducted. + # Deemed income on savings 20,000: ceil((20,000 - 10,000) / 500) = £20 a week, + # 1,040 a year. Income 12,000 + 1,040 = 13,040, above 12,376: no guarantee + # credit. Savings credit: threshold 10,819.64; maximum 0.6 x (12,376 - + # 10,819.64) = 933.816; phase-in 0.6 x (13,040 - 10,819.64) = 1,332.22, + # capped at 933.816; less 0.4 x (13,040 - 12,376) = 265.60; 668.216. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 80 + state_pension: 12_000 + dividend_income: 3_000 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + savings: 20_000 + output: + dividend_income_tax: 207.475 + legacy_means_test_income_tax: 0 + pension_credit_deemed_income: 1_040 + pension_credit_income: 13_040 + guarantee_credit: 0 + savings_credit: 668.216 + pension_credit: 668.216 + +- name: English pensioner council tax reduction counts sub-tenant rent less £20, not other rent + # SI 2012/2885 Sch 1 para 16(1)(v) and Sch 5 para 10 for the sub-tenant rent: + # 2,600 / 52 = £50 a week, less £20 = 30 x 52 = 1,560. Sch 5 para 23 + # disregards actual income from capital, so the other rent 4,000 and its tax + # 486 ((15,000 - 12,570) x 20%) are left out: 12,000 + 1,560 = 13,560. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 70 + state_pension: 12_000 + property_income: 4_000 + sublet_income: 2_600 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + region: NORTH_EAST + output: + income_tax: 486 + legacy_means_test_income_tax: 0 + council_tax_reduction_applicable_income: 13_560 + +- name: Scottish working-age council tax reduction counts neither rent from property nor sub-tenant rent + # SSI 2021/249 reg 57(1) lists unearned income in full; it includes the + # assumed yield from capital (reg 63) but no head for actual rent or rent + # from part of the home. Earnings 12,000 are below the personal allowance + # and the NI threshold, so applicable income is 12,000. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + employment_income: 12_000 + property_income: 3_000 + sublet_income: 2_600 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + region: SCOTLAND + output: + legacy_means_test_income_tax: 0 + council_tax_reduction_applicable_income: 12_000 + +- name: Welsh working-age council tax reduction counts sub-tenant rent less £20, not other rent + # WSI 2013/3029 Sch 6 para 27(5) treats income derived from capital as + # capital; Sch 9 para 26 disregards £20 a week of sub-tenant rent: + # 12,000 + (50 - 20) x 52 = 13,560. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + employment_income: 12_000 + property_income: 3_000 + sublet_income: 2_600 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + region: WALES + output: + legacy_means_test_income_tax: 0 + council_tax_reduction_applicable_income: 13_560 + +- name: Sub-tenant rent below £20 a week is disregarded in full + # 1,000 / 52 = 19.23 a week. + period: 2026 + input: + age: 40 + sublet_income: 1_000 + output: + legacy_benefits_home_letting_income: 0 + +- name: Working-age sub-tenant disregard was £4 before April 2008 + # IS Sch 9 para 19 before SI 2007/2618: £4 (the extra heating amount is not + # modelled). (100 - 4) x 52 = 4,992. + period: 2007 + input: + age: 40 + sublet_income: 5_200 + output: + legacy_benefits_home_letting_income: 4_992 + +- name: Working-age sub-tenant disregard is £20 from April 2008 + period: 2009 + input: + age: 40 + sublet_income: 5_200 + output: + legacy_benefits_home_letting_income: 4_160 + +- name: Pension-age sub-tenant disregard was already £20 before 2008 + # SPC Sch IV para 9 as made. + period: 2007 + input: + age: 70 + sublet_income: 5_200 + output: + legacy_benefits_home_letting_income: 4_160 + +- name: A couple's sub-tenant rent is treated as from one occupier + # The data give no count of occupiers, so the model assumes one: + # (2 x 2,600) / 52 = £100 a week, less £20 = 4,160. + period: 2026 + input: + people: + claimant: + age: 40 + sublet_income: 2_600 + partner: + age: 40 + sublet_income: 2_600 + benunits: + benunit: + members: [claimant, partner] + households: + household: + members: [claimant, partner] + output: + legacy_benefits_home_letting_income: 4_160 + +- name: A dependant's sublet rent is not the claimant's + # legacy_benefits_home_letting_income counts the claimant's and partner's + # rent only. + period: 2026 + input: + people: + parent: + age: 40 + young_person: + age: 17 + current_education: UPPER_SECONDARY + sublet_income: 5_200 + benunits: + benunit: + members: [parent, young_person] + households: + household: + members: [parent, young_person] + output: + legacy_benefits_home_letting_income: 0 + +- name: Before Pension Credit, the £4 disregard applied at every age + # IS Regs 1987 Sch 9 para 19 as made; the pension-age £20 starts with + # Pension Credit on 6 October 2003. (100 - 4) x 52 = 4,992. + period: 2002 + input: + age: 70 + sublet_income: 5_200 + output: + legacy_benefits_home_letting_income: 4_992 + +- name: Tax reductions are shared between counted income and income from capital + # ITA 2007 s.23: Step 4 tax is 286 on earnings ((14,000 - 12,570) x 20%) and + # 1,000 on rent ((6,000 - 1,000) x 20%), 1,286 in all; Step 6 deducts a + # 1,000 tax reduction. other_tax_credits records no source, so the model + # shares it in proportion to the Step 4 tax (a stated convention: a credit + # for foreign tax on the rent would relieve only the rent, TIOPA 2010 + # s.18(2)): the rent's share is 1,000 x 1,000 / 1,286 = 777.60, leaving + # 222.40 of tax on rent. Income tax 286 less 222.40 = 63.60 is tax on the earnings, + # and HB applicable income is 14,000 - 63.60 - 114.40 (NI) - 260 = 13,562.00. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + employment_income: 14_000 + property_income: 6_000 + other_tax_credits: 1_000 + benunits: + benunit: + members: [person] + housing_benefit_applicable_income_disregard: 260 + households: + household: + members: [person] + output: + income_tax: 286 + legacy_means_test_income_tax: 63.605 + housing_benefit_applicable_income: 13_561.995 + +- name: Step 7 charges are not tax on counted income + # The High Income Child Benefit Charge is added at Step 7 of ITA 2007 s.23 + # (s.30(1)); it is not tax calculated on any income the means tests count. + # Earnings 20,000: (20,000 - 12,570) x 20% = 1,486. Income tax with a 500 + # charge is 1,986; 1,486 is deducted. + period: 2025 + input: + age: 40 + employment_income: 20_000 + CB_HITC: 500 + output: + income_tax: 1_986 + legacy_means_test_income_tax: 1_486 + +- name: Tax on counted income is floored at nil when reductions exceed the Step 4 tax + # Step 4 tax is 286 on earnings and 1,000 on rent; Step 6 reductions of + # 2,000 exceed it, so income tax is nil even with a 500 Step 7 charge + # (1,786 - 2,000 < 0). The rent's share of the reductions (1,000 of the + # 1,286 used) removes its tax, and the charge is not tax on counted income: + # 0 - 0 - 500 is floored at nil. + period: 2025 + input: + age: 40 + employment_income: 14_000 + property_income: 6_000 + other_tax_credits: 2_000 + CB_HITC: 500 + output: + earned_income_tax: 286 + property_income_tax: 1_000 + income_tax: 0 + legacy_means_test_income_tax: 0 + +- name: Working-age Housing Benefit award with rent from a let property + # A continuing award (2025-26). Earnings 10,000 use 10,000 of the personal + # allowance; taxable rent 5,000 - 1,000 = 4,000, of which 4,000 - 2,570 = + # 1,430 is taxed: 286, all on rent, so none is deducted. NI is nil below + # 12,570. Applicable income: 10,000 - 260 (the £5 disregard, as an input) = + # 9,740. With the single 25-or-over personal allowance of £92.05 a week + # (4,786.60, an input here), HB = 6,000 - 65% x (9,740 - 4,786.60) = + # 6,000 - 3,219.71 = 2,780.29. Counting the rent would leave nothing. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + employment_income: 10_000 + property_income: 5_000 + housing_benefit_reported: 1 + benunits: + benunit: + members: [person] + would_claim_uc: false + housing_benefit_applicable_income_disregard: 260 + housing_benefit_applicable_amount: 4_786.60 + households: + household: + members: [person] + tenure_type: RENT_FROM_COUNCIL + rent: 6_000 + region: NORTH_EAST + output: + property_income_tax: 286 + legacy_means_test_income_tax: 0 + housing_benefit_applicable_income: 9_740 + housing_benefit: 2_780.29 + +- name: An English pensioner with a let property worth more than £16,000 gets no council tax reduction + # The rent no longer counts as income, but the property counts as capital: + # SI 2012/2885 Sch 1 para 31(1) ("the whole of his capital") and reg 11(2) + # (no reduction above 16,000). It is valued less 10% for the expenses of + # sale (para 32(a)): 100,000 x 0.9 = 90,000. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 70 + private_pension_income: 14_000 + property_income: 7_000 + 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 + other_residential_property_value: 100_000 + output: + council_tax_reduction_assessable_capital: 90_000 + council_tax_reduction: 0 + +- name: A Welsh working-age applicant with a let property worth more than £16,000 gets no council tax reduction + # WSI 2013/3029 reg 30: no reduction where capital exceeds 16,000. The + # property is valued less 10% for the expenses of sale (Sch 6 para 28(a)): + # 45,000. Tariff income (Sch 6 para 33) counts capital up to 16,000: + # (16,000 - 6,000) / 250 = 40 a week, 2,080 a year, so income is 9,000 + + # 2,080 = 11,080. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + employment_income: 9_000 + property_income: 5_200 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + would_claim_uc: false + households: + household: + members: [person] + country: WALES + local_authority: CARDIFF + tenure_type: RENT_FROM_COUNCIL + rent: 5_000 + council_tax: 1_500 + other_residential_property_value: 50_000 + output: + council_tax_reduction_assessable_capital: 45_000 + council_tax_reduction_tariff_income: 2_080 + council_tax_reduction_applicable_income: 11_080 + council_tax_reduction: 0 + +- name: A Scottish mixed-age couple on Universal Credit is under the working-age scheme + # SSI 2021/249 reg 3(1)(b)(ii): it applies where the applicant has reached + # pensionable age but the applicant or partner has an award of UC. Its reg + # 57(1) has no head for sub-tenant rent, so only the UC (1,000, an input) + # counts here. + period: 2026 + input: + people: + claimant: + age: 70 + sublet_income: 5_200 + partner: + age: 40 + benunits: + benunit: + members: [claimant, partner] + universal_credit: 1_000 + households: + household: + members: [claimant, partner] + country: SCOTLAND + local_authority: GLASGOW_CITY + output: + legacy_benefits_home_letting_income: 4_160 + council_tax_reduction_applicable_income: 1_000 + +- name: Before April 2022 the Scottish working-age scheme counted sub-tenant rent less £20 + # SSI 2012/303 Sch 4 para 25 (as at 1 April 2021): (100 - 20) x 52 = 4,160. + period: 2021 + input: + people: + person: + age: 40 + sublet_income: 5_200 + benunits: + benunit: + members: [person] + universal_credit: 0 + households: + household: + members: [person] + country: SCOTLAND + local_authority: GLASGOW_CITY + output: + council_tax_reduction_applicable_income: 4_160 + +- name: From April 2022 the Scottish working-age scheme does not count sub-tenant rent + # SSI 2021/249, in force 1 April 2022 (reg 1); reg 57(1) has no head for it. + period: 2023 + input: + people: + person: + age: 40 + sublet_income: 5_200 + benunits: + benunit: + members: [person] + universal_credit: 0 + households: + household: + members: [person] + country: SCOTLAND + local_authority: GLASGOW_CITY + output: + council_tax_reduction_applicable_income: 0 + +- name: Welsh working-age tariff income on a let property below the capital limit + # The rent no longer counts, but the property counts as capital at 90% of + # its value (WSI 2013/3029 Sch 6 para 28(a)): 9,000. Sch 6 para 33 treats it + # as a weekly income of 1 for each 250, or part of 250, over 6,000: 12 a + # week, 624 a year. Earnings 9,000 are below the personal allowance and the + # NI threshold. Income 9,000 + 624 = 9,624. With the applicable amount + # supplied as 6,000, CTR = 1,500 - 20% x (9,624 - 6,000) = 775.20. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + employment_income: 9_000 + property_income: 5_200 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: WALES + local_authority: CARDIFF + tenure_type: RENT_FROM_COUNCIL + rent: 5_000 + council_tax: 1_500 + other_residential_property_value: 10_000 + output: + council_tax_reduction_assessable_capital: 9_000 + council_tax_reduction_tariff_income: 624 + council_tax_reduction_applicable_income: 9_624 + council_tax_reduction: 775.20 + +- name: Scottish working-age assumed yield on a let property below the capital limit + # SSI 2021/249 reg 70(1)(a) values the property less 10%: 9,000. Reg + # 63(1)(b): a weekly income of 1 for each 250 over 6,000 and 1 for any part + # of 250: 12 a week, 624 a year; reg 63(3) treats the actual rent as + # capital. CTR = 1,500 - 20% x (9,624 - 6,000) = 775.20. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + employment_income: 9_000 + property_income: 5_200 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: RENT_FROM_COUNCIL + rent: 5_000 + council_tax: 1_500 + other_residential_property_value: 10_000 + output: + council_tax_reduction_assessable_capital: 9_000 + council_tax_reduction_tariff_income: 624 + council_tax_reduction_applicable_income: 9_624 + council_tax_reduction: 775.20 + +- name: An English pensioner's let property valued less sale expenses stays within the limit + # A 17,000 property is valued at 15,300 (SI 2012/2885 Sch 1 para 32(a)), so + # the 16,000 limit (reg 11(2)) does not exclude the pensioner. Tariff income + # (Sch 1 para 37): 5,300 / 500 = 10.6, so 11 a week, 572 a year. Pension + # 14,000 less its tax 286 ((14,000 - 12,570) x 20%) + 572 = 14,286; the rent + # and its tax (400) do not count (Sch 5 para 23). With the 238 a week + # allowance (12,376) supplied as the applicable amount, CTR = 2,000 - 20% x + # (14,286 - 12,376) = 1,618. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 70 + private_pension_income: 14_000 + property_income: 3_000 + benunits: + benunit: + members: [pensioner] + claims_all_entitled_benefits: true + would_claim_pc: false + council_tax_reduction_applicable_amount: 12_376 + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 17_000 + output: + legacy_means_test_income_tax: 286 + council_tax_reduction_assessable_capital: 15_300 + council_tax_reduction_tariff_income: 572 + council_tax_reduction_applicable_income: 14_286 + council_tax_reduction: 1_618 + +- name: Welsh and Scottish pensioner tariff income is 1 a week per 500 over 10,000 + # WSI 2013/3029 Sch 1 para 31 and SSI 2012/319 reg 27(2): savings 12,600 + # are 2,600 over 10,000, 5.2 steps of 500, so 6 a week, 312 a year. + period: 2026 + input: + people: + welsh_pensioner: + age: 75 + private_pension_income: 12_000 + scottish_pensioner: + age: 75 + private_pension_income: 12_000 + benunits: + welsh: + members: [welsh_pensioner] + would_claim_pc: false + scottish: + members: [scottish_pensioner] + would_claim_pc: false + households: + welsh_household: + members: [welsh_pensioner] + country: WALES + local_authority: CARDIFF + savings: 12_600 + scottish_household: + members: [scottish_pensioner] + country: SCOTLAND + local_authority: GLASGOW_CITY + savings: 12_600 + output: + council_tax_reduction_pensioner: [true, true] + council_tax_reduction_tariff_income: [312, 312] + council_tax_reduction_applicable_income: [12_312, 12_312] + +- 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 + # (savings 15,000: 10 steps of 500 over 10,000) = 14,610.54. Savings credit + # = 60% x (238 - 208.07) x 52 - 40% x (14,610.54 - 238 x 52) = 933.816 - + # 893.816 = 40.00, so the award is savings credit only and council tax + # reduction counts 14,610.54 + 40 = 14,650.54 (SI 2012/2885 Sch 1 para 14). + # CTR = 2,000 - 20% x (14,650.54 - 13,312) = 1,732.29. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 90 + state_pension: 10_000 + private_pension_income: 2_000 + sublet_income: 3_130.54 + 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: 15_000 + output: + pension_credit_income: 14_610.54 + savings_credit: 40 + in_receipt_of_savings_credit_only: true + council_tax_reduction_tariff_income: 0 + council_tax_reduction_applicable_income: 14_650.54 + council_tax_reduction: 1_732.29 + +- name: The same pensioner with 200 more sub-tenant rent is assessed under the general rules with tariff income + # 3,330.54 counts 2,290.54. Pension Credit income 14,810.54 leaves a savings + # credit of 933.816 - 40% x (14,810.54 - 12,376) < 0, so nil. Under the + # general rules: 12,000 + 2,290.54, no tax (12,000 is under the personal + # allowance), plus tariff income on 15,000 (Sch 1 para 37): 10 a week, 520 + # a year = 14,810.54, more than the 14,650.54 counted before. CTR = 2,000 - + # 20% x (14,810.54 - 13,312) = 1,700.29. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 90 + state_pension: 10_000 + private_pension_income: 2_000 + sublet_income: 3_330.54 + 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: 15_000 + output: + savings_credit: 0 + in_receipt_of_savings_credit_only: false + council_tax_reduction_tariff_income: 520 + council_tax_reduction_applicable_income: 14_810.54 + council_tax_reduction: 1_700.29 + +- name: Oxford tests a Universal Credit recipient on the Universal Credit assessment of capital + # The household's let property is worth 20,000 (18,000 after sale + # expenses), but the claimant's Universal Credit capital is 15,000 (a + # reported assessment). Oxford's Appendix 6 ignores capital already taken + # into account for Universal Credit, so the 16,000 limit (paragraph 28) + # does not exclude the claimant. UC: 424.90 - 36 x 4.35 (assumed yield on + # 9,000 over 6,000) = 268.30 a month, 3,219.60 a year, 61.92 a week: band 1, + # 100% of 2,000. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + would_claim_uc: true + uc_reported_capital: 15_000 + households: + household: + members: [person] + country: ENGLAND + local_authority: OXFORD + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 20_000 + output: + universal_credit: 3_219.60 + council_tax_reduction_assessable_capital: 15_000 + oxford_council_tax_reduction: 2_000 + +- name: Oxford ignores the capital of an Income Support recipient + # Appendix 6 also ignores capital already taken into account for Income + # Support, so the household's 18,000 of property (after sale expenses) does + # not exclude the claimant; Income Support recipients' income is nil for the + # bands, so the award is 100% of 2,000. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + would_claim_uc: false + income_support: 4_000 + households: + household: + members: [person] + country: ENGLAND + local_authority: OXFORD + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 18_000 + oxford_council_tax_reduction: 2_000 + +- name: Wales uses the Secretary of State's capital for a Universal Credit recipient + # WSI 2013/3029 Sch 6 para 9(6): with a UC award the authority uses the + # Secretary of State's calculation of capital, 15,000 here (a reported + # assessment), not the household's 18,000 of property after sale expenses. + # The income includes the UC assumed yield (UC Regs 2013 reg 72): 36 x 4.35 + # x 12 = 1,879.20. Income 3,219.60 (UC, an input) + 1,879.20 = 5,098.80 is + # below the applicable amount (6,000, an input), so CTR is the full 1,500. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + universal_credit: 3_219.60 + uc_reported_capital: 15_000 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 1_500 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 15_000 + council_tax_reduction_tariff_income: 1_879.20 + council_tax_reduction_applicable_income: 5_098.80 + council_tax_reduction: 1_500 + +- name: From April 2022 Scotland calculates a Universal Credit recipient's capital itself + # SSI 2021/249 regs 66 to 70 have no rule taking capital from the + # Universal Credit assessment, so the household's property counts: 18,000 + # after sale expenses, over the 16,000 limit. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + universal_credit: 3_219.60 + uc_reported_capital: 15_000 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 1_500 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 18_000 + council_tax_reduction: 0 + +- name: Before April 2022 Scotland used the Universal Credit assessment of capital + # SSI 2012/303 reg 26(6) (reg 26(4) as made): the Secretary of State's + # capital, 15,000. Income 3,219.60 + 1,879.20 assumed yield = 5,098.80, + # below the applicable amount, so CTR is the full 1,500. + period: 2021 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + universal_credit: 3_219.60 + uc_reported_capital: 15_000 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 1_500 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 15_000 + council_tax_reduction_tariff_income: 1_879.20 + council_tax_reduction: 1_500 + +- name: A Welsh Income Support recipient has no tariff income + # WSI 2013/3029 Sch 10 para 8 disregards the whole capital of an applicant + # on Income Support, so it yields no tariff income. + period: 2026 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + would_claim_uc: false + income_support: 4_000 + households: + household: + members: [person] + country: WALES + local_authority: CARDIFF + savings: 10_000 + output: + council_tax_reduction_tariff_income: 0 + +- name: A Scottish couple whose joint Universal Credit award is held only by people over pension age is under the pension-age scheme + # SSI 2021/249 reg 3(2): the working-age scheme does not apply where the + # award is held only by people over pensionable age. Universal Credit + # itself needs a claimant under that age (UC Regs 2013 reg 3(2)(a)), so the + # model treats such an award as not selecting the working-age scheme. SSI + # 2012/319 counts the sub-tenant rent less 20 a week: (100 - 20) x 52 = + # 4,160, plus the UC (1,000, an input) as the model counts it: 5,160. The + # couple do not claim Pension Credit, whose guarantee credit would + # otherwise disregard their whole income. + period: 2026 + input: + people: + claimant: + age: 71 + sublet_income: 5_200 + partner: + age: 70 + benunits: + benunit: + members: [claimant, partner] + universal_credit: 1_000 + would_claim_pc: false + households: + household: + members: [claimant, partner] + country: SCOTLAND + local_authority: GLASGOW_CITY + output: + council_tax_reduction_pensioner: true + council_tax_reduction_applicable_income: 5_160 diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_income.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_income.yaml index b6cf5c9493..154382ab89 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_income.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_income.yaml @@ -59,7 +59,12 @@ pension_credit_deemed_income: 52 pension_credit_income: 52 -- name: Case 4, property income and non-main-home capital count for Pension Credit. +- name: Case 4, rent from a let property is not Pension Credit income; the property counts through deemed income. + # SPC Regs 2002 Sch IV para 18 disregards any actual income from capital, so + # the £10,476 of rent does not count. Deemed income (reg 15(6)): capital + # 55,825 - 10,000 = 45,825, ceil(45,825 / 500) = 92, so £92 a week, 4,784 a + # year. Guarantee credit = (238 - 92) x 52 = 7,592. Savings credit is nil, as + # qualifying income (£92 a week) is below the savings credit threshold. period: 2026 absolute_error_margin: 0.01 input: @@ -78,8 +83,10 @@ output: pension_credit_assessable_capital: 55_825 pension_credit_deemed_income: 4_784 - pension_credit_income: 15_260 - pension_credit: 0 + pension_credit_income: 4_784 + guarantee_credit: 7_592 + savings_credit: 0 + pension_credit: 7_592 - name: Case 5, 2026 Pension Credit uses tariff income with the published guarantee rate. period: 2026 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml index 6e52f66d3d..70033dbbe2 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml @@ -474,7 +474,7 @@ council_tax_reduction_assessable_capital: 17_000 council_tax_reduction: 0 -- name: The same pensioner not claiming Pension Credit is tested on household savings only +- name: The same pensioner not claiming Pension Credit is tested on savings and the second property period: 2026 absolute_error_margin: 0.01 input: @@ -499,13 +499,17 @@ other_residential_property_value: 7_000 output: in_receipt_of_savings_credit_only: false - # Pensioners without Pension Credit are tested on household savings, a - # proxy that leaves out the second property the schemes' own capital rules - # count (SI 2012/2885 Sch 1 Part 6 Chapter 3). So, unlike the claimant - # above, this pensioner keeps CTR: the gap is in the proxy, not the law. - council_tax_reduction_assessable_capital: 10_000 - council_tax_reduction_applicable_income: 13_314 - council_tax_reduction: 1_999.60 + # SI 2012/2885 Sch 1 para 31(1) counts "the whole of his capital", so the + # second property counts as it does for the claimant above, valued less + # 10% for the expenses of sale (para 32(a)): 10,000 + 7,000 x 0.9 = + # 16,300, over the 16,000 limit (reg 11(2)). Shares and other investments + # are still left out of the proxy (issue 1936). + council_tax_reduction_assessable_capital: 16_300 + # 13,500 - 186 tax ((13,500 - 12,570) x 20%) = 13,314, plus tariff income + # (Sch 1 para 37) on capital up to 16,000: 12 x 52 = 624. + council_tax_reduction_tariff_income: 624 + council_tax_reduction_applicable_income: 13_938 + council_tax_reduction: 0 - name: Capital of exactly 16,000 is within the limit for a pensioner without Pension Credit period: 2026 @@ -529,12 +533,16 @@ savings: 16_000 output: # The limit excludes capital that "exceeds" 16,000 (SI 2012/2885 reg 11(2)). - # The award pins the model's current value: it has no pensioner tariff - # income from capital (Sch 1 para 37, 624 a year here), a known gap - # (#1933), so this is not the full legal amount. + # Tariff income (Sch 1 para 37): (16,000 - 10,000) / 500 = 12 a week, 624 + # a year. Income 13,000 - 86 tax ((13,000 - 12,570) x 20%) + 624 = + # 13,538. The award, 2,000 - 0.2 x (13,538 - 13,312) = 1,954.80, uses the + # model's applicable amount of 256 a week; the 238 a week allowance for + # people reaching pensionable age from April 2021 is a known gap (#1933). in_receipt_of_guarantee_credit: false council_tax_reduction_assessable_capital: 16_000 - council_tax_reduction: 2_000 + council_tax_reduction_tariff_income: 624 + council_tax_reduction_applicable_income: 13_538 + council_tax_reduction: 1_954.80 - name: Capital just over 16,000 excludes a pensioner without Pension Credit period: 2026 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 e32f8363e7..173229acf6 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 @@ -21,10 +21,19 @@ 3. Savings-credit-only recipients get max(0, L - 0.2 x max(0, PC income + SC - A) - ND) when the Pension Credit assessment of capital is within 16,000, and nothing otherwise. -4. Differential: everyone else keeps the previous formula, max(0, L - 0.2 x - max(0, I - A) - ND) when household savings are within 16,000, where I is the - income definition on main before this change, recomputed here from its - components rather than read from the variable under test. +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. 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)). 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. 5. Metamorphic: a guarantee credit recipient's CTR does not change when the State Pension changes. 6. Metamorphic: nor when its savings change. @@ -81,6 +90,7 @@ guarantees = st.one_of(st.none(), st.floats(240, 450)) CAPITAL_LIMIT = 16_000 WITHDRAWAL_RATE = 0.2 +SALE_EXPENSES = 0.1 @st.composite @@ -257,14 +267,20 @@ def situation( "savings_credit", "pension_credit_income", "pension_credit_assessable_capital", + "council_tax_reduction_pensioner", + "council_tax_reduction_relevant_income_based_benefit", + "universal_credit", + "uc_assessable_capital", ] -# council_tax_reduction_applicable_income on main before this change (1c5b4d04): -# these incomes and benefits, less income tax, National Insurance and half of -# pension contributions, floored at zero. +# council_tax_reduction_applicable_income outside the Pension Credit routes: +# these incomes and benefits, less the income tax on them, National Insurance +# and half of pension contributions, floored at zero. Rent from property, +# interest and dividends are income from capital and do not count, and nor +# does the tax on them; rent for part of the home counts less £20 a week. MAIN_INCOME_COMPONENTS = [ "employment_income", "self_employment_income", - "property_income", + "legacy_benefits_home_letting_income", "private_pension_income", "carers_allowance", "esa_contrib", @@ -281,11 +297,12 @@ def situation( "esa_income", "universal_credit", ] -MAIN_DEDUCTIONS = ["income_tax", "national_insurance"] +MAIN_DEDUCTIONS = ["legacy_means_test_income_tax", "national_insurance"] HOUSEHOLD_VARIABLES = [ "council_tax_reduction_maximum_eligible_liability", "council_tax_reduction_household_has_pensioner", "savings", + "other_residential_property_value", ] @@ -333,6 +350,30 @@ def benunit_total(names): return values +def expected_capital(unit, values, i): + if unit["country"] == "WALES" and values["universal_credit"][i] > 0: + return values["uc_assessable_capital"][i] + return ( + values["savings"][i] + + (1 - SALE_EXPENSES) * values["other_residential_property_value"][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) + + if values["council_tax_reduction_pensioner"][i]: + return steps(10_000, 500) * 52 + if unit["country"] == "ENGLAND": + return 0.0 + if values["universal_credit"][i] > 0: + return steps(6_000, 250) * 4.35 * 12 + if values["council_tax_reduction_relevant_income_based_benefit"][i]: + return 0.0 + return steps(6_000, 250) * 52 + + def tapered(liability, income, applicable_amount, non_dep): excess = max(0.0, income - applicable_amount) return max(0.0, liability - WITHDRAWAL_RATE * excess - non_dep) @@ -389,13 +430,16 @@ def check_routes(units, values): values["pension_credit_assessable_capital"][i] <= CAPITAL_LIMIT ) else: - income = values["income_under_main_definition"][i] + capital = expected_capital(unit, values, i) + income = values["income_under_main_definition"][i] + expected_tariff_income( + unit, values, i, capital + ) assert ( abs(values["council_tax_reduction_applicable_income"][i] - income) < 0.01 ), unit expected = tapered(liability, income, applicable_amount, non_dep) * ( - values["savings"][i] <= CAPITAL_LIMIT + capital <= CAPITAL_LIMIT ) assert abs(ctr - expected) < 0.01, (unit, ctr, expected) 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 new file mode 100644 index 0000000000..d8541b3ccc --- /dev/null +++ b/policyengine_uk/tests/test_legacy_means_test_income_from_capital_properties.py @@ -0,0 +1,274 @@ +"""Property-based tests for income derived from capital in the legacy means tests. + +Income Support, Housing Benefit, Pension Credit and council tax reduction +treat rent, interest and dividends as capital, not income (IS Regs 1987 reg +48(4) and Sch 9 para 22; HB Regs 2006 reg 46(4) and Sch 5 para 17; HB (SPC) +Regs 2006 Sch 5 para 22; SPC Regs 2002 Sch IV para 18), and disregard tax only +on income they take into account. Rent for letting part of the home stays +income, less £20 a week per occupier. + +Invariants, for any generated population of families: + +1. Invariance: scaling property, savings interest and dividend income (by 0 + and 3) changes none of the four means-test incomes, and none of + Income Support, Housing Benefit, Pension Credit or council tax reduction. + Universal Credit and tax credits, which have their own income rules, are + held fixed. Incomes are kept within the basic rate band, where extra + income from capital cannot change the tax on other income through the + personal allowance taper or the High Income Child Benefit Charge. + Marriage Allowance is held at nil: whether a spouse can transfer it + depends on their income including income from capital, which is a + legitimate way for income from capital to change the tax on counted + income. +2. Bounds: the counted home-letting income is between nil and the rent, and + equals the rent less £20 a week, floored at nil. +3. Monotone: more rent from part of the home never lowers a means-test income + and never raises Income Support, Housing Benefit, Pension Credit or council + tax reduction. +4. Tax: legacy_means_test_income_tax is between nil and both income tax and + the tax on counted income before reductions (earned_income_tax), and + equals income tax when there is no savings, dividend or property income + and no Step 7 charge. +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 + 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. +""" + +import numpy as np +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st + +from policyengine_uk import Simulation + +PROPERTY_SETTINGS = settings( + max_examples=8, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], +) +YEARS = [2025, 2026] +REGIONS = ["NORTH_EAST", "LONDON", "WALES", "SCOTLAND", "NORTHERN_IRELAND"] +TENURES = ["RENT_FROM_COUNCIL", "RENT_PRIVATELY", "OWNED_OUTRIGHT"] +PENSION_AGE = st.integers(67, 95) +WORKING_AGE = st.integers(18, 60) +SHAPES = { + "single_pension": [("adult", PENSION_AGE)], + "couple_pension": [("adult", PENSION_AGE), ("adult", PENSION_AGE)], + "single_working": [("adult", WORKING_AGE)], + "couple_working": [("adult", WORKING_AGE), ("adult", WORKING_AGE)], + "lone_parent": [("adult", WORKING_AGE), ("child", st.integers(0, 5))], +} +MEANS_TEST_INCOMES = [ + "income_support_applicable_income", + "housing_benefit_applicable_income", + "pension_credit_income", + "council_tax_reduction_applicable_income", +] +AWARDS = ["income_support", "housing_benefit", "pension_credit", "council_tax_benefit"] +# Each adult's earnings plus pensions stay below £22,000 and each income from +# capital below £2,000, so even at three times the capital income an adult's +# income stays inside the basic rate band. +small = st.floats(0, 2_000, allow_nan=False, allow_infinity=False) + + +@st.composite +def adults(draw, age): + return dict( + age=age, + employment_income=draw(st.one_of(st.just(0.0), st.floats(0, 12_000))), + state_pension=draw(st.floats(0, 10_000)) if age >= 67 else 0.0, + private_pension_income=draw(st.one_of(st.just(0.0), st.floats(0, 2_000))), + property_income=draw(st.one_of(st.just(0.0), small)), + savings_interest_income=draw(st.one_of(st.just(0.0), small)), + dividend_income=draw(st.one_of(st.just(0.0), small)), + sublet_income=draw(st.one_of(st.just(0.0), st.floats(0, 8_000))), + ) + + +@st.composite +def families(draw): + shape = draw(st.sampled_from(sorted(SHAPES))) + members = [] + for role, age in SHAPES[shape]: + a = draw(age) + members.append((role, draw(adults(a)) if role == "adult" else dict(age=a))) + return dict( + shape=shape, + members=members, + region=draw(st.sampled_from(REGIONS)), + tenure=draw(st.sampled_from(TENURES)), + rent=draw(st.floats(0, 15_000)), + savings=draw(st.one_of(st.just(0.0), st.floats(0, 20_000))), + reported=draw(st.booleans()), + universal_credit=draw(st.sampled_from([0.0, 3_000.0])), + ) + + +populations = st.lists(families(), min_size=1, max_size=4) + + +def situation( + units, year, capital_income_scale=1.0, sublet_extra=0.0, savings_extra=0.0 +): + people, benunits, households = {}, {}, {} + for i, unit in enumerate(units): + names = [] + for j, (role, attrs) in enumerate(unit["members"]): + name = f"p{i}_{j}" + person = {"age": {year: attrs["age"]}} + if role == "adult": + for k, v in attrs.items(): + if k == "age": + continue + if k in ( + "property_income", + "savings_interest_income", + "dividend_income", + ): + v = v * capital_income_scale + if k == "sublet_income" and j == 0: + v = v + sublet_extra + person[k] = {year: v} + person["marriage_allowance"] = {year: 0.0} + if j == 0 and unit["reported"]: + person["income_support_reported"] = {year: 1.0} + person["housing_benefit_reported"] = {year: 1.0} + people[name] = person + names.append(name) + benunits[f"b{i}"] = { + "members": names, + # Universal Credit and tax credits have their own income rules and + # are held fixed here. + "universal_credit": {year: unit["universal_credit"]}, + "tax_credits": {year: 0.0}, + "would_claim_uc": {year: False}, + } + households[f"h{i}"] = { + "members": names, + "region": {year: unit["region"]}, + "tenure_type": {year: unit["tenure"]}, + "rent": {year: unit["rent"]}, + "savings": {year: unit["savings"] + savings_extra}, + "council_tax": {year: 1_500.0}, + } + return {"people": people, "benunits": benunits, "households": households} + + +def calculate(units, year, variables, **kwargs): + sim = Simulation(situation=situation(units, year, **kwargs)) + return {v: np.asarray(sim.calculate(v, year), dtype=float) for v in variables} + + +@PROPERTY_SETTINGS +@given(populations, st.sampled_from(YEARS)) +def test_income_from_capital_changes_no_legacy_means_test(units, year): + variables = MEANS_TEST_INCOMES + AWARDS + base = calculate(units, year, variables) + for scale in (0.0, 3.0): + scaled = calculate(units, year, variables, capital_income_scale=scale) + for v in variables: + np.testing.assert_allclose( + scaled[v], base[v], atol=0.01, err_msg=f"{v} at scale {scale}" + ) + + +@PROPERTY_SETTINGS +@given(populations, st.sampled_from(YEARS + [2007])) +def test_home_letting_income_bounds(units, year): + sim = Simulation(situation=situation(units, year)) + counted = np.asarray(sim.calculate("legacy_benefits_home_letting_income", year)) + rent = np.asarray(sim.calculate("sublet_income", year, map_to="benunit")) + pension_age = np.asarray(sim.calculate("is_SP_age", year, map_to="benunit")) > 0 + disregard = 20 if year >= 2009 else np.where(pension_age, 20, 4) + assert np.all(counted >= 0) + assert np.all(counted <= rent + 0.01) + np.testing.assert_allclose( + counted, np.maximum(0, rent / 52 - disregard) * 52, atol=0.01 + ) + + +@PROPERTY_SETTINGS +@given(populations, st.sampled_from(YEARS), st.floats(1, 10_000)) +def test_home_letting_rent_is_monotone(units, year, extra): + variables = MEANS_TEST_INCOMES + AWARDS + base = calculate(units, year, variables) + more = calculate(units, year, variables, sublet_extra=extra) + for v in MEANS_TEST_INCOMES: + assert np.all(more[v] >= base[v] - 0.01), v + for v in AWARDS: + assert np.all(more[v] <= base[v] + 0.01), v + + +@PROPERTY_SETTINGS +@given(populations, st.sampled_from(YEARS)) +def test_legacy_means_test_income_tax_bounds(units, year): + variables = [ + "legacy_means_test_income_tax", + "income_tax", + "earned_income_tax", + "savings_income_tax", + "dividend_income_tax", + "property_income_tax", + ] + v = calculate(units, year, variables) + tax = v["legacy_means_test_income_tax"] + assert np.all(tax >= 0) + assert np.all(tax <= v["income_tax"] + 0.01) + assert np.all(tax <= v["earned_income_tax"] + 0.01) + no_capital_tax = ( + v["savings_income_tax"] + v["dividend_income_tax"] + v["property_income_tax"] + ) == 0 + np.testing.assert_allclose(tax[no_capital_tax], v["income_tax"][no_capital_tax]) + without = calculate( + units, + year, + ["income_tax", "legacy_means_test_income_tax"], + capital_income_scale=0.0, + ) + np.testing.assert_allclose( + without["legacy_means_test_income_tax"], without["income_tax"], atol=0.01 + ) + + +MAXIMUM_TARIFF_INCOME = 40 * 4.35 * 12 +ENGLISH_REGIONS = {"NORTH_EAST", "LONDON"} + + +@PROPERTY_SETTINGS +@given(populations, st.sampled_from(YEARS), st.floats(1, 20_000)) +def test_council_tax_reduction_tariff_income_is_bounded_and_monotone( + units, year, extra +): + variables = [ + "council_tax_reduction_tariff_income", + "council_tax_reduction_pensioner", + "in_receipt_of_guarantee_credit", + "in_receipt_of_savings_credit_only", + ] + base = calculate(units, year, variables) + more = calculate(units, year, variables, savings_extra=extra) + tariff = base["council_tax_reduction_tariff_income"] + assert np.all(tariff >= 0) + assert np.all(tariff <= MAXIMUM_TARIFF_INCOME + 0.01) + region = np.array([unit["region"] for unit in units]) + pensioner = base["council_tax_reduction_pensioner"].astype(bool) + outside_national_schemes = (region == "NORTHERN_IRELAND") | ( + np.isin(region, list(ENGLISH_REGIONS)) & ~pensioner + ) + assert np.all(tariff[outside_national_schemes] == 0) + + def route(values): + return ( + values["council_tax_reduction_pensioner"].astype(int) * 4 + + values["in_receipt_of_guarantee_credit"].astype(int) * 2 + + values["in_receipt_of_savings_credit_only"].astype(int) + ) + + same_route = route(base) == route(more) + assert np.all( + more["council_tax_reduction_tariff_income"][same_route] + >= tariff[same_route] - 0.01 + ) diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py index 4053330c32..ab6846e972 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/applicable_income/housing_benefit_applicable_income.py @@ -5,8 +5,27 @@ class housing_benefit_applicable_income(Variable): value_type = float entity = BenUnit label = "relevant income for Housing Benefit means test" + documentation = ( + "Income taken into account for Housing Benefit. Income derived from " + "capital, such as rent from property, interest and dividends, is not " + "income: for working-age claimants regulation 46(4) treats it as " + "capital and Schedule 5 paragraph 17 disregards it, and for claimants " + "over the qualifying age for State Pension Credit Schedule 5 paragraph " + "22 of the pension-age regulations disregards any actual income from " + "capital. The capital counts through the capital limit and tariff " + "income. Tax on that income is not deducted. Rent for letting part of " + "the home stays income, less the sub-tenant disregard. Rent from other " + "premises whose value is disregarded also stays income, but the model " + "cannot identify those premises." + ) definition_period = YEAR unit = GBP + reference = [ + "https://www.legislation.gov.uk/uksi/2006/213/regulation/46", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/5", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/29", + "https://www.legislation.gov.uk/uksi/2006/214/schedule/5", + ] def formula(benunit, period, parameters): # Members whose income counts: the claimant and partner and, as the model did @@ -42,8 +61,8 @@ def formula(benunit, period, parameters): INCOME_COMPONENTS = [ "employment_income", "self_employment_income", - "property_income", "private_pension_income", + "legacy_benefits_home_letting_income", ] bi = parameters(period).gov.contrib.ubi_center.basic_income # Add personal benefits, credits and total benefits to income @@ -64,7 +83,7 @@ def formula(benunit, period, parameters): pension_contributions = ( add_for_members(benunit, period, ["pension_contributions"], members) * 0.5 ) - TAX_COMPONENTS = ["income_tax", "national_insurance"] + TAX_COMPONENTS = ["legacy_means_test_income_tax", "national_insurance"] tax = add_for_members(benunit, period, TAX_COMPONENTS, members) increased_income_reduced_by_tax_and_pensions = ( increased_income - tax - pension_contributions diff --git a/policyengine_uk/variables/gov/dwp/income_support_applicable_income.py b/policyengine_uk/variables/gov/dwp/income_support_applicable_income.py index 17aa562d36..4564c1eb2f 100644 --- a/policyengine_uk/variables/gov/dwp/income_support_applicable_income.py +++ b/policyengine_uk/variables/gov/dwp/income_support_applicable_income.py @@ -5,9 +5,26 @@ class income_support_applicable_income(Variable): value_type = float entity = BenUnit label = "Relevant income for Income Support means test" + documentation = ( + "Income taken into account for Income Support. Income derived from " + "capital, such as rent from property, interest and dividends, is " + "treated as capital from the date it is due (regulation 48(4)) and " + "disregarded as income (Schedule 9 paragraph 22); the capital counts " + "through the capital limit and tariff income. Tax on that income is " + "not deducted, as Schedule 9 paragraph 1 disregards tax only on income " + "taken into account. Rent for letting part of the home stays income, " + "less the paragraph 19 disregard. Rent from other premises whose value " + "is disregarded (Schedule 10 paragraphs 2, 4 and 25 to 28) also stays " + "income, but the model cannot identify those premises." + ) definition_period = YEAR unit = GBP - reference = "https://www.legislation.gov.uk/uksi/1987/1967/schedule/8" + reference = [ + "https://www.legislation.gov.uk/uksi/1987/1967/regulation/40", + "https://www.legislation.gov.uk/uksi/1987/1967/regulation/48", + "https://www.legislation.gov.uk/uksi/1987/1967/schedule/8", + "https://www.legislation.gov.uk/uksi/1987/1967/schedule/9", + ] def formula(benunit, period, parameters): # Members whose income counts: the claimant and partner and, as the model did @@ -22,15 +39,18 @@ def formula(benunit, period, parameters): INCOME_COMPONENTS = [ "employment_income", "self_employment_income", - "property_income", "private_pension_income", + "legacy_benefits_home_letting_income", ] bi = parameters(period).gov.contrib.ubi_center.basic_income if bi.interactions.include_in_means_tests: INCOME_COMPONENTS.append("basic_income") income = add_for_members(benunit, period, INCOME_COMPONENTS, members) tax = add_for_members( - benunit, period, ["income_tax", "national_insurance"], members + benunit, + period, + ["legacy_means_test_income_tax", "national_insurance"], + members, ) income += add_for_members(benunit, period, ["social_security_income"], members) income += benunit("income_support_tariff_income", period) diff --git a/policyengine_uk/variables/gov/dwp/legacy_benefits_home_letting_income.py b/policyengine_uk/variables/gov/dwp/legacy_benefits_home_letting_income.py new file mode 100644 index 0000000000..2cf125e315 --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/legacy_benefits_home_letting_income.py @@ -0,0 +1,47 @@ +from policyengine_uk.model_api import * + + +class legacy_benefits_home_letting_income(Variable): + value_type = float + entity = BenUnit + label = "Rent from letting part of the home counted in the legacy means tests" + documentation = ( + "Rent the claimant and any partner receive for letting part of the home " + "they live in (sublet_income), after the weekly sub-tenant disregard. " + "The legacy means tests treat other income derived from capital, such as " + "rent from other property, interest and dividends, as capital, but the " + "home is disregarded capital, so rent for part of it stays income: " + "Income Support Schedule 9 paragraph 19, Housing Benefit Schedule 5 " + "paragraph 22, and for claimants over the qualifying age for State " + "Pension Credit Pension Credit regulation 15(5)(i) with Schedule IV " + "paragraph 9 and pension-age Housing Benefit regulation 29(1)(v) with " + "Schedule 5 paragraph 10. The disregard applies per occupier; the data " + "give one annual amount and no count of occupiers, so the model assumes " + "one. The pension-age amount applies when the claimant or partner is " + "over State Pension age, which stands in for the qualifying age for " + "State Pension Credit; the two amounts have been equal since April " + "2008. The calculation is annual, so a year with an April change uses " + "the amount in force at the start of the year." + ) + definition_period = YEAR + unit = GBP + reference = [ + "https://www.legislation.gov.uk/uksi/1987/1967/schedule/9/paragraph/19", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/5/paragraph/22", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/29", + "https://www.legislation.gov.uk/uksi/2006/214/schedule/5/paragraph/10", + "https://www.legislation.gov.uk/uksi/2002/1792/regulation/15", + "https://www.legislation.gov.uk/uksi/2002/1792/schedule/IV/paragraph/9", + ] + + def formula(benunit, period, parameters): + p = parameters(period).gov.dwp.legacy_means_tests.sub_tenant_rent_disregard + person = benunit.members + claimant_or_partner = person("is_claimant_or_partner", period) + weekly_rent = ( + benunit.sum(person("sublet_income", period) * claimant_or_partner) + / WEEKS_IN_YEAR + ) + pension_age = benunit.any(person("is_SP_age", period) & claimant_or_partner) + disregard = where(pension_age, p.pension_age, p.working_age) + return max_(0, weekly_rent - disregard) * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/dwp/legacy_means_test_income_tax.py b/policyengine_uk/variables/gov/dwp/legacy_means_test_income_tax.py new file mode 100644 index 0000000000..edf28cf15d --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/legacy_means_test_income_tax.py @@ -0,0 +1,88 @@ +from policyengine_uk.model_api import * + + +class legacy_means_test_income_tax(Variable): + value_type = float + entity = Person + label = "Income Tax deducted in the legacy means tests" + documentation = ( + "Income Tax on the income the legacy means tests take into account. The " + "tests disregard tax only on income they count (Income Support Schedule 9 " + "paragraph 1; Housing Benefit Schedule 5 paragraph 1; pension-age Housing " + "Benefit regulation 33(12); Pension Credit regulation 17(10)(a); the " + "council tax reduction schemes' equivalents), and they treat savings " + "interest, dividends and property income as capital, not income. So this " + "is the tax calculated on the person's other income (earned_income_tax, " + "which covers earnings, pensions and taxable benefits) at Step 4 of " + "Income Tax Act 2007 s.23, less that income's share of the Step 6 tax " + "reductions (the married couple's allowance and other tax credits). " + "Most reductions are not tied to any income: s.27 orders them only to " + "give the greatest reduction in liability. Some are: foreign tax " + "credit relief reduces the tax on the income the foreign tax was paid " + "on (Taxation (International and Other Provisions) Act 2010 ss.18(2) " + "and 36), and the relief for residential finance costs is given on at " + "most the property business's profits (Income Tax (Trading and Other " + "Income) Act 2005 ss.274A and 274AA). The model's other_tax_credits " + "input mixes these with other reductions (venture capital trust, " + "enterprise investment and maintenance relief, among others) and " + "records no source, so the model shares all reductions in proportion " + "to the Step 4 tax on each kind of income. A credit for foreign tax " + "on rent is therefore partly attributed to counted income, and the " + "tax deducted is too low. Step 7 charges, such as the High Income " + "Child Benefit Charge and the pension annual allowance charge (s.30), " + "are not tax calculated on any of this income and are not deducted. " + "The result is income_tax less the tax attributed to capital and the " + "charges, floored at nil, so a supplied income_tax value flows " + "through; if it differs from the tax the components imply, the " + "difference falls on the tax on counted income." + ) + definition_period = YEAR + unit = GBP + reference = [ + "https://www.legislation.gov.uk/uksi/1987/1967/schedule/9/paragraph/1", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/5/paragraph/1", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/33", + "https://www.legislation.gov.uk/uksi/2002/1792/regulation/17", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/17", + "https://www.legislation.gov.uk/ukpga/2007/3/section/23", + "https://www.legislation.gov.uk/ukpga/2007/3/section/27", + "https://www.legislation.gov.uk/ukpga/2007/3/section/30", + "https://www.legislation.gov.uk/ukpga/2010/8/section/18", + "https://www.legislation.gov.uk/ukpga/2010/8/section/36", + "https://www.legislation.gov.uk/ukpga/2005/5/section/274A", + "https://www.legislation.gov.uk/ukpga/2005/5/section/274AA", + ] + + def formula(person, period, parameters): + p = parameters(period).gov.hmrc.income_tax + # Step 4 tax on the income the means tests count, and on the income + # they treat as capital. + counted = person("earned_income_tax", period) + capital = add( + person, + period, + ["savings_income_tax", "dividend_income_tax", "property_income_tax"], + ) + before_reductions = counted + capital + # Step 7 charges: everything income tax adds beyond the Step 4 tax. + charges = max_( + 0, add(person, period, p.income_tax_additions) - before_reductions + ) + # Step 6 reductions, shared in proportion to the Step 4 tax. + reductions = min_( + add(person, period, p.income_tax_subtractions), before_reductions + ) + capital_share = np.divide( + capital, + before_reductions, + out=np.zeros_like(capital, dtype=float), + where=before_reductions > 0, + ) + capital_after_reductions = capital - reductions * capital_share + # Starting from income tax keeps any supplied income_tax value: the + # result is the tax on counted income less its share of reductions + # whenever income tax is calculated. + return max_( + 0, + person("income_tax", period) - capital_after_reductions - charges, + ) diff --git a/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_income.py b/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_income.py index 1160800f3a..ba59a392f4 100644 --- a/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_income.py +++ b/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_income.py @@ -40,8 +40,10 @@ def formula(benunit, period, parameters): pension_contributions = benunit.sum( person("pension_contributions", period) * is_claimant_or_partner ) + # Reg 17(10)(a) disregards tax only on income taken into account, and + # Schedule IV paragraph 18 disregards actual income from capital. tax = benunit.sum( - add(person, period, ["income_tax", "national_insurance"]) + add(person, period, ["legacy_means_test_income_tax", "national_insurance"]) * is_claimant_or_partner ) pen_con_deduction_rate = pc.income.pension_contributions_deduction diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/_legacy.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/_legacy.py index 54883e9b4b..da61b358c9 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/_legacy.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/_legacy.py @@ -54,7 +54,7 @@ def legacy_council_tax_reduction( capital = where( has_uc_award, benunit("uc_assessable_capital", period), - benunit.household("savings", period), + benunit("council_tax_reduction_assessable_capital", period), ) capital_eligible = capital <= ctr.means_test.capital_limit return ( 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 fc1e3ea7b4..deeda0fdcc 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 @@ -1,4 +1,7 @@ from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_scotland_scheme, +) class council_tax_reduction_applicable_income(Variable): @@ -12,7 +15,21 @@ class council_tax_reduction_applicable_income(Variable): "use the Secretary of State's Pension Credit assessment of income, plus " "the savings credit payable, where the award is savings credit only. " "The other adjustments those provisions allow (childcare charges, lone " - "parent and maintenance disregards, and the rest) are not modelled." + "parent and maintenance disregards, and the rest) are not modelled. " + "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. The pensioner schemes disregard any actual " + "income from capital; the Welsh working-age scheme and the English " + "default scheme treat it as capital; the Scottish working-age scheme " + "counts only the unearned income it lists, which includes the assumed " + "yield from capital but not actual rent, interest or dividends. " + "Instead, the national schemes (England for pensioners, Wales and " + "Scotland) count the tariff income they treat capital as yielding " + "(council_tax_reduction_tariff_income); the English local schemes for " + "people under pension age add their own. Rent for letting part of the " + "home counts, less the sub-tenant disregard, except in the Scottish " + "scheme for people under pension age from April 2022, which does not " + "list it." ) definition_period = YEAR unit = GBP @@ -23,6 +40,16 @@ class council_tax_reduction_applicable_income(Variable): "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/8", "https://www.legislation.gov.uk/ssi/2012/319/regulation/24", "https://www.legislation.gov.uk/ssi/2012/319/regulation/25", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/16", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/5", + "https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/64", + "https://www.legislation.gov.uk/uksi/2012/2886/schedule/8", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/4", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/9", + "https://www.legislation.gov.uk/ssi/2012/319/schedule/3", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/3", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/57", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/63", ] def formula(benunit, period, parameters): @@ -55,7 +82,6 @@ def formula(benunit, period, parameters): income_components = [ "employment_income", "self_employment_income", - "property_income", "private_pension_income", ] bi = parameters(period).gov.contrib.ubi_center.basic_income @@ -68,6 +94,31 @@ def formula(benunit, period, parameters): ) credits = add_for_members(benunit, period, ["tax_credits"], members) increased_income = income + personal_benefit_income + credits + benefits + # Rent for letting part of the home counts in every scheme except the + # Scottish one for people under pension age from 1 April 2022 (SSI + # 2021/249, whose reg 57(1) list has no head for it). That scheme + # applies under reg 3(1) to everyone the pension-age scheme does not + # cover: an applicant under pensionable age, or over it where the + # applicant or partner has a qualifying income-related benefit or an + # award of universal credit (council_tax_reduction_pensioner). An award + # held only by people over pensionable age does not count (reg 3(2)); + # the selector stands this in by requiring a younger claimant or + # partner, as Universal Credit itself does (UC Regs 2013 reg 3(2)(a)). + scotland = is_scotland_scheme(benunit.household("country", period)) + scottish_working_age_scheme = scotland & ~benunit( + "council_tax_reduction_pensioner", period + ) + p_scotland = parameters( + period + ).gov.local_authorities.scotland.council_tax_reduction.means_test + counts_home_letting = ~scottish_working_age_scheme | ( + p_scotland.working_age_counts_home_letting_income + ) + increased_income += where( + counts_home_letting, + benunit("legacy_benefits_home_letting_income", period), + 0, + ) if not bi.interactions.include_in_means_tests: increased_income -= add_for_members( @@ -78,11 +129,17 @@ def formula(benunit, period, parameters): add_for_members(benunit, period, ["pension_contributions"], members) * 0.5 ) tax = add_for_members( - benunit, period, ["income_tax", "national_insurance"], members + benunit, + period, + ["legacy_means_test_income_tax", "national_insurance"], + members, ) + # The national schemes also treat capital as yielding a tariff income + # (council_tax_reduction_tariff_income); the English local schemes for + # people under pension age add their own. income_under_general_rules = max_( 0, increased_income - tax - pension_contributions - ) + ) + benunit("council_tax_reduction_tariff_income", period) # SI 2012/2885 Sch 1 para 13, WSI 2013/3029 Sch 1 para 7 and SSI # 2012/319 reg 24: a guarantee credit recipient's whole income is # disregarded. Para 14, para 8 and reg 25: in savings-credit-only cases diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_assessable_capital.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_assessable_capital.py index 16b63ab2a9..eccfbe7d08 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_assessable_capital.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_assessable_capital.py @@ -1,4 +1,7 @@ from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_scotland_scheme, +) class council_tax_reduction_assessable_capital(Variable): @@ -6,28 +9,44 @@ class council_tax_reduction_assessable_capital(Variable): entity = BenUnit label = "capital for the Council Tax Reduction capital limit" documentation = ( - "Capital tested against the Council Tax Reduction capital limit. The " - "pensioner schemes disregard the whole capital 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 capital where " - "the award is savings credit only. Otherwise household savings stand in " - "for the applicant's capital; the schemes' own capital rules also count " - "other property and investments, so this understates capital for " - "pensioners without Pension Credit. The recalculation when capital rises " - "above the limit during an assessed income period is not modelled." + "Capital tested against the Council Tax Reduction capital limit and " + "used for tariff income. The pensioner schemes disregard the whole " + "capital 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 capital where the award is savings " + "credit only. Where the applicant or partner has an award of Universal " + "Credit, the working-age schemes use the Secretary of State's " + "assessment of capital for that award (uc_assessable_capital), except " + "the Scottish scheme from April 2022, under which the authority " + "calculates capital itself. Otherwise the household's capital stands " + "in for the applicant's: savings, land and property other than the " + "home (gov.local_authorities.council_tax_reduction.capital.sources), " + "with land and property valued at market value less 10% for the " + "expenses of sale. The schemes also deduct any encumbrance secured on " + "an asset, which the data cannot identify for property other than the " + "home, and count shares and other investments, which in the data are " + "mixed with pension wealth the schemes disregard; both are left out " + "for now. The recalculation when capital rises above the limit during " + "an assessed income period is not modelled." ) definition_period = YEAR unit = GBP quantity_type = STOCK reference = [ "https://www.legislation.gov.uk/uksi/2012/2885/regulation/11", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/31", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/32", "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/2886/schedule/paragraph/37", "https://www.legislation.gov.uk/wsi/2013/3029/regulation/30", "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/6/paragraph/9", "https://www.legislation.gov.uk/ssi/2012/319/regulation/24", "https://www.legislation.gov.uk/ssi/2012/319/regulation/25", + "https://www.legislation.gov.uk/ssi/2012/303/regulation/26", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/70", ] def formula(benunit, period, parameters): @@ -37,8 +56,37 @@ def formula(benunit, period, parameters): has_savings_credit_only_award = benunit( "in_receipt_of_savings_credit_only", period ) + # SI 2012/2886 Sch para 37(6), WSI 2013/3029 Sch 6 para 9(6) and SSI + # 2012/303 reg 26: with an award of Universal Credit, the authority + # uses the Secretary of State's calculation of capital. SSI 2021/249 + # has no such rule. + p_scotland = parameters( + period + ).gov.local_authorities.scotland.council_tax_reduction.means_test + scotland = is_scotland_scheme(benunit.household("country", period)) + uses_universal_credit_assessment = ~scotland | ( + p_scotland.uses_universal_credit_capital_assessment + ) + has_uc_award = benunit("universal_credit", period) > 0 + p = parameters(period).gov.local_authorities.council_tax_reduction.capital + # Capital is valued at market value less 10% where there would be + # expenses of sale (SI 2012/2885 Sch 1 para 32(a) and equivalents). + household_capital = 0 + for source in p.sources: + value = benunit.household(source, period) + if source in p.sale_expenses.sources: + value = value * (1 - p.sale_expenses.rate) + household_capital = household_capital + value return select( - [in_receipt_of_guarantee_credit, has_savings_credit_only_award], - [0, benunit("pension_credit_assessable_capital", period)], - default=benunit.household("savings", period), + [ + in_receipt_of_guarantee_credit, + has_savings_credit_only_award, + has_uc_award & uses_universal_credit_assessment, + ], + [ + 0, + benunit("pension_credit_assessable_capital", period), + benunit("uc_assessable_capital", period), + ], + default=household_capital, ) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner.py index a9da7f9aa3..097ed4ca7a 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner.py @@ -13,7 +13,9 @@ class council_tax_reduction_pensioner(Variable): "Employment and Support Allowance, or has an award of Universal Credit. " "A mixed-age couple on Universal Credit is therefore not a pensioner in " "England, Wales or Scotland. The model routes English schemes on this " - "test; the Welsh and Scottish formulas do not yet use it." + "test, and uses it to choose the pensioner or working-age tariff " + "income and the Scottish income rules; the Welsh and Scottish award " + "formulas do not otherwise use it yet." ) definition_period = YEAR reference = ( 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 new file mode 100644 index 0000000000..0a58306ba8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_tariff_income.py @@ -0,0 +1,132 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_scotland_scheme, + is_wales_scheme, +) +from policyengine_uk.variables.household.demographic.country import Country + + +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. + excess = max_(0, min_(capital, capital_limit) - tariff.threshold) + return np.ceil(excess / tariff.step) * tariff.amount + + +class council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Council Tax Reduction tariff income from capital" + documentation = ( + "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 " + "for each £250, or part of £250, over £6,000; with an award of " + "Universal Credit, the Universal Credit assumed yield of £4.35 a month " + "for each £250, or part, over £6,000, which the Welsh scheme and the " + "Scottish scheme to March 2022 take from the Secretary of State's " + "assessment of income and the Scottish scheme from April 2022 sets at " + "the same rate. Nil for the Pension Credit routes, whose income " + "already includes the Pension Credit deemed income (or is wholly " + "disregarded), for people on Income Support, income-based " + "Jobseeker's Allowance or income-related Employment and Support " + "Allowance, whose whole capital the Welsh scheme and the Scottish " + "scheme to March 2022 disregard and whose income the Scottish scheme " + "from April 2022 does not assess, and for English people under " + "pension age, whose local schemes set their own tariff income." + ) + definition_period = YEAR + unit = GBP + reference = [ + "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/wsi/2013/3029/schedule/6/paragraph/9", + "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/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", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/13", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/63", + "https://www.legislation.gov.uk/uksi/2013/376/regulation/72", + ] + + def formula(benunit, period, parameters): + local_authorities = parameters(period).gov.local_authorities + england_p = local_authorities.england.council_tax_reduction.pensioners + wales_p = local_authorities.wales.council_tax_reduction.means_test + scotland_p = local_authorities.scotland.council_tax_reduction.means_test + uc_tariff = parameters( + period + ).gov.dwp.universal_credit.means_test.capital.tariff_income + country = benunit.household("country", period) + england = country == Country.ENGLAND + wales = is_wales_scheme(country) + scotland = is_scotland_scheme(country) + capital = benunit("council_tax_reduction_assessable_capital", period) + pensioner_weekly = select( + [england, wales, scotland], + [ + tariff_amount( + capital, + england_p.means_test.tariff_income, + england_p.means_test.capital_limit, + ), + tariff_amount( + capital, + wales_p.tariff_income.pensioner, + wales_p.capital_limit, + ), + tariff_amount( + capital, + scotland_p.tariff_income.pensioner, + scotland_p.capital_limit, + ), + ], + default=0, + ) + working_age_weekly = select( + [wales, scotland], + [ + tariff_amount( + capital, + wales_p.tariff_income.working_age, + wales_p.capital_limit, + ), + tariff_amount( + capital, + scotland_p.tariff_income.working_age, + scotland_p.capital_limit, + ), + ], + default=0, + ) + universal_credit_monthly = select( + [wales, scotland], + [ + tariff_amount(capital, uc_tariff, wales_p.capital_limit), + tariff_amount(capital, uc_tariff, scotland_p.capital_limit), + ], + default=0, + ) + pensioner = benunit("council_tax_reduction_pensioner", period) + has_uc_award = benunit("universal_credit", period) > 0 + income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + tariff_income = select( + [pensioner, has_uc_award, income_based_benefit], + [ + pensioner_weekly * WEEKS_IN_YEAR, + universal_credit_monthly * MONTHS_IN_YEAR, + 0, + ], + default=working_age_weekly * WEEKS_IN_YEAR, + ) + pension_credit_route = benunit( + "in_receipt_of_guarantee_credit", period + ) | benunit("in_receipt_of_savings_credit_only", period) + return where(pension_credit_route, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction.py index 7f9b1b7663..0979df1f26 100644 --- a/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction.py +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction.py @@ -26,7 +26,7 @@ def formula(benunit, period, parameters): household("council_tax_reduction_household_has_pensioner", period), ) has_uc_award = benunit("universal_credit", period) > 0 - capital = household("savings", period) + capital = benunit("council_tax_reduction_assessable_capital", period) weekly_tariff_income = np.ceil( max_(0, capital - ctr.means_test.tariff_income_threshold) / ctr.means_test.tariff_income_step diff --git a/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction.py index 332b9781c0..4bc9c3c35b 100644 --- a/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction.py +++ b/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction.py @@ -11,6 +11,10 @@ class oxford_council_tax_reduction(Variable): label = "Oxford Council Tax Reduction" definition_period = YEAR unit = GBP + reference = ( + "https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27", + "https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27/4", + ) def formula(benunit, period, parameters): ctr = parameters(period).gov.local_authorities.oxford.council_tax_reduction @@ -25,7 +29,19 @@ def formula(benunit, period, parameters): universal_credit = benunit("universal_credit", period) has_uc_award = universal_credit > 0 - capital = household("savings", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + # Scheme paragraphs 28-29 apply the limit to capital not ignored by + # Appendix 6, which ignores capital already taken into account for + # Universal Credit, Income Support, income-based Jobseeker's Allowance + # or income-related Employment and Support Allowance. + capital = where( + has_uc_award | relevant_income_based_benefit, + 0, + benunit("council_tax_reduction_assessable_capital", period), + ) capital_eligible = capital <= ctr.means_test.capital_limit weekly_tariff_income = np.ceil( max_(0, capital - ctr.means_test.tariff_income_threshold) @@ -36,10 +52,6 @@ def formula(benunit, period, parameters): child_benefit = benunit("child_benefit", period) weekly_income = max_(0, annual_income - child_benefit) / WEEKS_IN_YEAR weekly_income += where(has_uc_award, 0, weekly_tariff_income) - relevant_income_based_benefit = benunit( - "council_tax_reduction_relevant_income_based_benefit", - period, - ) weekly_income = where( relevant_income_based_benefit & ~has_uc_award, 0, weekly_income ) diff --git a/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction.py index 3c86931aee..c0f7e16487 100644 --- a/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction.py +++ b/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction.py @@ -24,7 +24,7 @@ def formula(benunit, period, parameters): household("council_tax_reduction_household_has_pensioner", period), ) has_uc_award = benunit("universal_credit", period) > 0 - capital = household("savings", period) + capital = benunit("council_tax_reduction_assessable_capital", period) weekly_tariff_income = np.ceil( max_(0, capital - ctr.means_test.tariff_income_threshold) / ctr.means_test.tariff_income_step