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..ef4b8e19f4 --- /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, except where a working-age council tax reduction applicant's income is the Universal Credit assessment. The residential finance-cost tax reduction now comes off the tax on property income. Council tax reduction now counts land and property other than the home as capital, at market value less 10% for the expenses of sale and less any debt secured on it; adds the national schemes' tariff income from capital (England for pensioners, Wales and Scotland); uses the Universal Credit assessment of capital for a working-age applicant with an award of Universal Credit, including one the benefit cap or deductions reduce to nil, where the scheme says so; and disregards the whole capital of an applicant on Income Support, income-based Jobseeker's Allowance or income-related Employment and Support Allowance in Wales, in Scotland before April 2022, and in the Kingston, Merton, Westminster and Oxford schemes. In Pension Credit, the tax that earnings add on interest and dividends stays part of the tax on earnings, which is measured as the extra tax the earnings cause. diff --git a/docs/book/programs/gov/dwp/housing-benefit.ipynb b/docs/book/programs/gov/dwp/housing-benefit.ipynb index a3e9c25f03..e52f34df8e 100644 --- a/docs/book/programs/gov/dwp/housing-benefit.ipynb +++ b/docs/book/programs/gov/dwp/housing-benefit.ipynb @@ -42,7 +42,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 for the Housing Benefit category of dwelling (`housing_benefit_LHA_category`: the shared accommodation rate for a young individual with no non-dependant, or a claimant entitled to one bedroom who lacks exclusive use of self-contained accommodation, unless the severe disability premium applies, reg 13D(2)) 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", " If the claimant or partner is on Universal Credit, Income Support, income-based Jobseeker's Allowance or income-related Employment and Support Allowance (`housing_benefit_on_passporting_benefit`), the whole of the family's earnings, other income and capital is disregarded ([SI 2006/213 Sch. 4 para. 12](https://www.legislation.gov.uk/uksi/2006/213/schedule/4/paragraph/12), [Sch. 5 para. 4](https://www.legislation.gov.uk/uksi/2006/213/schedule/5/paragraph/4) and [Sch. 6 para. 5](https://www.legislation.gov.uk/uksi/2006/213/schedule/6/paragraph/5); Northern Ireland: [SR 2006/405 Sch. 5 para. 12](https://www.legislation.gov.uk/nisr/2006/405/schedule/5/paragraph/12), [Sch. 6 para. 4](https://www.legislation.gov.uk/nisr/2006/405/schedule/6/paragraph/4) and [Sch. 7 para. 5](https://www.legislation.gov.uk/nisr/2006/405/schedule/7/paragraph/5)). `housing_benefit_applicable_income` and `housing_benefit_assessable_capital` are then zero, so the award is that maximum. This applies at any age: a mixed-age couple whose younger member is on one of these benefits is assessed under the working-age regulations ([SI 2006/213 reg. 5(1)(b)](https://www.legislation.gov.uk/uksi/2006/213/regulation/5)). Income Support, income-based Jobseeker's Allowance and income-related Employment and Support Allowance count when a positive amount is paid on the claimant's or partner's award (`in_receipt_of_income_support_jsa_ib_or_esa_ir`, which reads `claimant_or_partner_jsa_income` and `claimant_or_partner_esa_income`). Another member's own award, such as a non-dependant's, is payable to them and does not passport the claimant. A person is on Universal Credit on any day they are entitled to it, whether it is in payment or not ([reg. 2(3B)](https://www.legislation.gov.uk/uksi/2006/213/regulation/2)); PolicyEngine reads that as Universal Credit above nil before the benefit cap and deductions (`is_uc_entitled`), for a family that claims it, so the passport adds no circular dependency through the benefit cap. The universal credit limb applies from 28 October 2013 in Great Britain and 8 May 2018 in Northern Ireland (`gov.dwp.housing_benefit.means_test.universal_credit_passport`). It matters only where Housing Benefit is paid alongside Universal Credit, for specified or temporary accommodation, which the eligibility rules above do not yet model.\n", "4. **Benefit cap** (`housing_benefit`): the post-means-test award is finally reduced by `housing_benefit_benefit_cap_reduction`, the excess of the family's welfare benefits over the Housing Benefit cap (`housing_benefit_benefit_cap`, SI 2006/213 reg 75CA), leaving at least 50 pence a week (reg 75D). The cap does not apply where the claimant or couple is entitled to working tax credit (reg 75E), the claimant or partner receives a benefit listed in reg 75F, or the claim is under the pension-age regulations (reg 5). Universal Credit has its own cap.\n", "\n", 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 eb564bca84..fbf11d6cf9 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: @@ -20,7 +22,11 @@ values: - pension_credit_war_pension_income - state_pension - private_pension_income - - property_income_after_finance_costs + # 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..692911d156 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax_reduction/capital/sale_expenses/rate.yaml @@ -0,0 +1,31 @@ +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, taken from the market value before + any encumbrance secured on the asset is deducted (DMG 29624). The + encumbrance is then deducted where an asset-specific secured-debt input + exists (other residential and non-residential property); those inputs + default to nil because the survey does not record them. +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 + - title: Decision Makers' Guide chapter 29, para. 29624 (sale expenses before encumbrances) + href: https://assets.publishing.service.gov.uk/media/69d8f3a496c86b751317022c/dmg-Ch-29.pdf 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..43cd6052c6 --- /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, such as travel to a building society, are not costs of + sale (DMG 29623, on the identically worded Income Support rule). +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: Decision Makers' Guide chapter 29, para. 29623 (costs of withdrawing money are not costs of sale) + href: https://assets.publishing.service.gov.uk/media/69d8f3a496c86b751317022c/dmg-Ch-29.pdf +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/kingston_upon_thames/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml new file mode 100644 index 0000000000..1243ad537f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml @@ -0,0 +1,17 @@ +description: > + Whether the Kingston upon Thames council tax reduction scheme for people + under pension age disregards the whole capital of an applicant on Income + Support, income-based Jobseeker's Allowance or income-related Employment and + Support Allowance. The council's 2026-27 scheme disregards the whole capital + of an applicant on Income Support, income-based Jobseeker's Allowance or + income-related Employment and Support Allowance (Schedule 10 paragraph 8), + as the default scheme does. +metadata: + label: Kingston upon Thames council tax reduction disregards passported applicants' capital + unit: bool + period: year + reference: + - title: Royal Borough of Kingston upon Thames Council Tax Reduction Scheme 2026-27, Schedule 10 para. 8 + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf +values: + 2026-04-01: true diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml new file mode 100644 index 0000000000..273c993180 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml @@ -0,0 +1,17 @@ +description: > + Whether the Merton council tax reduction scheme for people under pension age + disregards the whole capital of an applicant on Income Support, income-based + Jobseeker's Allowance or income-related Employment and Support Allowance. + The council's 2026-27 scheme disregards the whole capital of an applicant on + Income Support, income-based Jobseeker's Allowance or income-related + Employment and Support Allowance (Schedule 10 paragraph 8), as the default + scheme does. +metadata: + label: Merton council tax reduction disregards passported applicants' capital + unit: bool + period: year + reference: + - title: London Borough of Merton Council Tax Reduction Scheme 2026-27, Schedule 10 para. 8 + href: https://www.merton.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202026-27.pdf +values: + 2026-04-01: true diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml new file mode 100644 index 0000000000..c9eb7ec1d8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml @@ -0,0 +1,18 @@ +description: > + Whether the Newham council tax reduction scheme for people under pension age + disregards the whole capital of an applicant on Income Support, income-based + Jobseeker's Allowance or income-related Employment and Support Allowance. + The council's 2026 scheme omits the default scheme's disregard of the whole + capital of an applicant on Income Support, income-based Jobseeker's + Allowance or income-related Employment and Support Allowance: Schedule 10 + paragraphs 8 and 9 are left blank, so that capital is tested against the + limit. +metadata: + label: Newham council tax reduction disregards passported applicants' capital + unit: bool + period: year + reference: + - title: London Borough of Newham Council Tax Reduction Scheme 2026, Schedule 10 paras. 8-9 + href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 +values: + 2026-04-01: false diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml new file mode 100644 index 0000000000..6a1ff33dd6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml @@ -0,0 +1,24 @@ +description: > + Whether the Scottish council tax reduction scheme for people under pension + age disregards the whole capital of an applicant on Income Support, + income-based Jobseeker's Allowance or income-related Employment and Support + Allowance. The Council Tax Reduction (Scotland) Regulations 2012 did + (Schedule 5 paragraph 7). The Council Tax Reduction (Scotland) Regulations + 2021, in force from 1 April 2022, have no such disregard in Schedule 4: + regulation 13(11) treats a qualifying income-related benefit claimant as + meeting the income conditions, and regulation 13(1) still applies the + capital limit. +metadata: + label: Scotland working-age council tax reduction disregards passported applicants' capital + unit: bool + period: year + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 Schedule 5 para. 7 (as at 1 April 2021) + href: https://www.legislation.gov.uk/ssi/2012/303/schedule/5/paragraph/7/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. 13 + href: https://www.legislation.gov.uk/ssi/2021/249/regulation/13 +values: + 2013-04-01: true + 2022-04-01: false 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/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml new file mode 100644 index 0000000000..ea35f41d5d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/disregards_passported_applicants_capital.yaml @@ -0,0 +1,23 @@ +description: > + Whether the Westminster council tax reduction scheme for people under + pension age disregards the whole capital of an applicant on Income Support, + income-based Jobseeker's Allowance or income-related Employment and Support + Allowance. The council's working-age scheme mirrors the Council Tax + Reduction Schemes (Default Scheme) (England) Regulations 2012 with uprated + amounts and a war pension disregard (cabinet report, 15 December 2025, para. + 4.22), so it keeps the default scheme's disregard of the whole capital of an + applicant on Income Support, income-based Jobseeker's Allowance or income- + related Employment and Support Allowance (the default scheme's Schedule 10 + paragraph 8). The council's full scheme text is not published, so this is + inferred from that statement. +metadata: + label: Westminster council tax reduction disregards passported applicants' capital + unit: bool + period: year + reference: + - title: Westminster City Council cabinet report, 15 December 2025, para. 4.22 + href: https://www.westminster.gov.uk/sites/default/files/media/documents/cabinet-public-pack-15-december-2025.pdf + - title: The Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule (the scheme), Schedule 10 para. 8 + href: https://www.legislation.gov.uk/uksi/2012/2886/schedule +values: + 2026-04-01: true 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..e71f4de87b --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/legacy_means_tests/income_from_capital.yaml @@ -0,0 +1,1789 @@ +# 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 (gross receipts are supplied as property_rental_income, with no +# expenses, so the allowance is deducted by partial relief, ITTOIA 2005 +# s.783BH); 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 + property_rental_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 + property_rental_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 + property_rental_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 + property_rental_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: Pension Credit deducts the tax wages add on dividends, but not the tax on dividends due without wages + # 2025-26. Wages 10,000 and State Pension 12,000: non-savings tax (22,000 - + # 12,570) x 20% = 1,886. Dividends 30,000 fill the rest of the 37,700 basic + # band: 28,270, of which 500 is the dividend allowance, so 27,770 x 8.75% = + # 2,429.875, and 1,730 x 33.75% = 583.875. Income tax 4,899.75. + # Without wages, the 570 of allowance the State Pension leaves covers + # dividends: (30,000 - 570 - 500) x 8.75% = 2,531.375, all tax on dividends, + # which Pension Credit does not count (reg 17(10)(a), Sch IV para 18), so it + # is not deducted. The tax on earnings is the extra tax the wages cause, + # 4,899.75 - 2,531.375 = 2,368.375, including what they add on dividends. + # Net earnings 10,000 - 2,368.375 = 7,631.625; disregard 5 x 52 = 260. + # Income 12,000 + 10,000 - 2,368.375 - 260 = 19,371.625. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person: + age: 70 + state_pension: 12_000 + employment_income: 10_000 + dividend_income: 30_000 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + output: + income_tax: 4_899.75 + pension_credit_employment_income_tax: 2_368.375 + pension_credit_uncounted_income_tax_without_earnings: 2_531.375 + pension_credit_earnings_disregard: 260 + pension_credit_income: 19_371.625 + +- 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 + property_rental_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 + property_rental_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 the supplied income tax is below the charges + # An isolation of the helper's floor with income_tax supplied, not a + # statutory tax calculation. Step 4 tax is 286 on earnings and 1,000 on + # rent; 2,000 of Step 6 reductions leave nil (ITA 2007 s.29(2): only so far + # as there is Step 5 tax), and the 500 Step 7 charge is then added (s.23 + # Step 7), so the statutory liability is 500. Supplied at nil, as the + # model's income_tax currently nets the charge against the reductions, the + # helper gives 0 - 0 (rent's tax after its share of reductions) - 500 + # (the charge), floored at nil; with 500 it gives 500 - 0 - 500 = 0. + period: 2025 + input: + age: 40 + employment_income: 14_000 + property_income: 6_000 + property_rental_income: 6_000 + other_tax_credits: 2_000 + CB_HITC: 500 + income_tax: 0 + output: + earned_income_tax: 286 + property_income_tax: 1_000 + legacy_means_test_income_tax: 0 + +- name: The finance-cost reduction comes off the tax on rent first + # ITTOIA 2005 ss.274A-274AA give the reduction on the property business's + # finance costs, at most its profits, so it relieves the tax on rent. The + # tax components are supplied: 286 on earnings, 1,000 on rent, a 400 + # finance-cost reduction. Income tax 1,286 - 400 = 886; the rent's tax + # after the reduction is 600, so the tax on counted income is 886 - 600 = + # 286 (shared pro rata it would be 197.04). + period: 2025 + absolute_error_margin: 0.01 + input: + age: 40 + earned_income_tax: 286 + property_income_tax: 1_000 + property_finance_cost_relief: 400 + output: + income_tax: 886 + legacy_means_test_income_tax: 286 + +- name: Other reductions are shared pro rata after the finance-cost reduction + # As above with 500 of other tax credits. The finance-cost reduction leaves + # 286 + 600 = 886 of tax; the 500 is shared in proportion to it: counted + # income bears 500 x 286 / 886 = 161.40, leaving 124.60. Income tax is + # 1,286 - 900 = 386, and 386 - (600 - 500 x 600 / 886 = 261.40) = 124.60. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 40 + earned_income_tax: 286 + property_income_tax: 1_000 + property_finance_cost_relief: 400 + other_tax_credits: 500 + output: + income_tax: 386 + legacy_means_test_income_tax: 124.60 + +- 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 + property_rental_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 + claims_universal_credit: false + 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 + claims_universal_credit: false + 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 + +- name: Wales disregards the whole capital of an Income Support recipient + # WSI 2013/3029 Sch 6 para 26(2) and Sch 10 para 8: the whole capital of an + # applicant on Income Support is disregarded, so £20,000 of property (an + # input; £18,000 after sale expenses) does not breach the £16,000 limit. + # The Income Support (an input) is below the applicable amount (an input), + # so the award is the full 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 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 0 + council_tax_reduction: 2_000 + +- name: Scotland disregarded an Income Support recipient's capital before April 2022 + # SSI 2012/303 Sch 5 para 7 (as at 1 April 2021): the whole capital of an + # applicant on Income Support is disregarded. + period: 2021 + 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 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 0 + council_tax_reduction: 2_000 + +- name: From April 2022 Scotland tests an Income Support recipient's capital + # SSI 2021/249 has no disregard of a passported applicant's capital: reg + # 13(11) treats only the income conditions as met, and reg 13(1) applies + # the £16,000 limit. £20,000 of property less 10% sale expenses is 18,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 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 18_000 + council_tax_reduction: 0 + +- name: Kingston upon Thames disregards the whole capital of an Income Support recipient + # The council keeps the disregard (its 2026-27 scheme, Schedule 10 para 8), so the + # household's £18,000 of property (after sale expenses) does not breach the + # £16,000 limit, and the passported award is the full 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 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 18_000 + council_tax_reduction: 2_000 + +- name: Merton disregards the whole capital of an Income Support recipient + # The council keeps the disregard (its 2026-27 scheme, Schedule 10 para 8), so the + # household's £18,000 of property (after sale expenses) does not breach the + # £16,000 limit, and the passported award is the full 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 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: ENGLAND + local_authority: MERTON + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 18_000 + council_tax_reduction: 2_000 + +- name: Westminster disregards the whole capital of an Income Support recipient + # The council keeps the disregard (the default scheme's Schedule 10 para 8, which the council's scheme mirrors), so the + # household's £18,000 of property (after sale expenses) does not breach the + # £16,000 limit, and the passported award is the full 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 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: ENGLAND + local_authority: WESTMINSTER + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 18_000 + council_tax_reduction: 2_000 + +- name: Newham tests an Income Support recipient's capital + # Newham's 2026 scheme leaves the default scheme's Schedule 10 paragraphs 8 + # and 9 blank, so the £18,000 of property (after sale expenses) is tested + # against its £6,000 capital limit and there is no award. + 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 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [person] + country: ENGLAND + local_authority: NEWHAM + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + other_residential_property_value: 20_000 + output: + council_tax_reduction_assessable_capital: 18_000 + council_tax_reduction: 0 + +- name: Wales uses the Universal Credit capital assessment when the benefit cap reduces the award to nil + # The benefit cap reduces a Universal Credit award (UC Regs 2013 reg 81) + # rather than ending it: here a £1,000 award (an input) is capped to nil. + # WSI 2013/3029 Sch 6 para 9(6) still takes capital from the award's + # assessment, £15,000 (an input), not the household's £18,000 of property + # after sale expenses. The UC assumed yield on 9,000 over 6,000: 36 x 4.35 + # x 12 = 1,879.20, below the applicable amount (an input), so the award is + # the full 2,000. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + claims_universal_credit: true + universal_credit_pre_benefit_cap: 1_000 + uc_benefit_cap_reduction_after_floor: 1_000 + 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: 2_000 + other_residential_property_value: 20_000 + output: + universal_credit: 0 + council_tax_reduction_universal_credit_award: true + council_tax_reduction_assessable_capital: 15_000 + council_tax_reduction_tariff_income: 1_879.20 + council_tax_reduction: 2_000 + +- name: Before April 2022 Scotland used the Universal Credit capital assessment for a capped award + # SSI 2012/303 reg 26(6) (reg 26(4) as made), with the award capped to nil + # as above. + period: 2021 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + claims_universal_credit: true + universal_credit_pre_benefit_cap: 1_000 + uc_benefit_cap_reduction_after_floor: 1_000 + 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: 2_000 + other_residential_property_value: 20_000 + output: + universal_credit: 0 + council_tax_reduction_universal_credit_award: true + council_tax_reduction_assessable_capital: 15_000 + council_tax_reduction_tariff_income: 1_879.20 + council_tax_reduction: 2_000 + +- name: Oxford ignores a capped Universal Credit award's capital + # Appendix 3 covers applicants who would be awarded Universal Credit but for + # deductions or other adjustments, and Appendix 6 ignores capital already + # taken into account for it, so the £18,000 of property does not breach + # paragraph 28's £16,000 limit. Weekly income nil: 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 + claims_universal_credit: true + universal_credit_pre_benefit_cap: 1_000 + uc_benefit_cap_reduction_after_floor: 1_000 + uc_reported_capital: 15_000 + council_tax_reduction_applicable_amount: 6_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: 0 + council_tax_reduction_universal_credit_award: true + council_tax_reduction_assessable_capital: 15_000 + oxford_council_tax_reduction: 2_000 + council_tax_reduction: 2_000 + +- name: Oxford adds no tariff income from a capped Universal Credit award's capital + # As above, the award is capped to nil but is still an award (Appendix 3), + # and Appendix 6 ignores the £15,000 taken into account for it, so no tariff + # income is added. Weekly income 24,000 / 52 = 461.54, in band 1 (up to + # £480): 100% of 2,000. Treating the nil payment as no award would add + # ceil((15,000 - 6,000) / 250) = £36 a week, giving 497.54, band 2 (75%). + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + claims_universal_credit: true + universal_credit_pre_benefit_cap: 1_000 + uc_benefit_cap_reduction_after_floor: 1_000 + uc_reported_capital: 15_000 + council_tax_reduction_applicable_amount: 6_000 + council_tax_reduction_applicable_income: 24_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: 0 + council_tax_reduction_universal_credit_award: true + council_tax_reduction_assessable_capital: 15_000 + oxford_council_tax_reduction: 2_000 + council_tax_reduction: 2_000 + +- name: From April 2022 Scotland applies the Universal Credit yield to a capped award on its own capital + # The benefit cap reduces the award rather than ending it (UC Regs 2013 + # reg 81), so there is still an award of Universal Credit. With one, + # unearned income, which includes the assumed yield (reg 57(1)(l)), is + # calculated monthly (reg 64(1)), so reg 63(1)(a) applies the monthly + # yield, £4.35 per £250 over £6,000, to the capital + # the authority calculates, here the £18,000 of property after sale + # expenses (counted up to the limit: 40 x 4.35 x 12 = 2,088). It is over the + # £16,000 limit, so there is no award. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + claims_universal_credit: true + universal_credit_pre_benefit_cap: 1_000 + uc_benefit_cap_reduction_after_floor: 1_000 + 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: 2_000 + other_residential_property_value: 20_000 + output: + universal_credit: 0 + council_tax_reduction_universal_credit_award: true + council_tax_reduction_assessable_capital: 18_000 + council_tax_reduction_tariff_income: 2_088 + council_tax_reduction: 0 + +- name: An English pensioner couple's Universal Credit input does not bring in the working-age capital rules + # Universal Credit needs a claimant under the qualifying age (UC Regs 2013 + # reg 3(2)(a)), so the £1,000 award supplied to a couple aged 71 and 70 is + # disregarded in choosing the scheme (council_tax_reduction_pensioner), + # and the Universal Credit capital assessment (£15,000, an input) is not + # used either: the household's £20,000 of property, valued at £18,000, + # exceeds the £16,000 limit. Pensioner tariff income on capital up to + # £16,000: 12 x 52 = 624. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 71 + partner: + age: 70 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_pc: false + universal_credit: 1_000 + uc_reported_capital: 15_000 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 1_500 + other_residential_property_value: 20_000 + output: + council_tax_reduction_pensioner: true + council_tax_reduction_assessable_capital: 18_000 + council_tax_reduction_tariff_income: 624 + council_tax_reduction: 0 + +- name: A Welsh pensioner couple's Universal Credit input does not bring in the working-age capital rules + # Universal Credit needs a claimant under the qualifying age (UC Regs 2013 + # reg 3(2)(a)), so the £1,000 award supplied to a couple aged 71 and 70 is + # disregarded in choosing the scheme (council_tax_reduction_pensioner), + # and the Universal Credit capital assessment (£15,000, an input) is not + # used either: the household's £20,000 of property, valued at £18,000, + # exceeds the £16,000 limit. Pensioner tariff income on capital up to + # £16,000: 12 x 52 = 624. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 71 + partner: + age: 70 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_pc: false + universal_credit: 1_000 + uc_reported_capital: 15_000 + council_tax_reduction_applicable_amount: 6_000 + households: + household: + members: [claimant, partner] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 1_500 + other_residential_property_value: 20_000 + output: + council_tax_reduction_pensioner: true + council_tax_reduction_assessable_capital: 18_000 + council_tax_reduction_tariff_income: 624 + council_tax_reduction: 0 + +- name: Wales does not count sub-tenant rent for a Universal Credit recipient + # WSI 2013/3029 Sch 6 para 9(1): the authority uses the Secretary of State's assessment of income + # for the award, adjusted only for the award itself and non-dependants. + # Universal Credit's unearned income (UC Regs 2013 reg 66) has no head for + # rent from a sub-tenant, so the £5,200 (£4,160 after the £20 a week + # disregard) does not count. Income is the award, 3,000 (an input), below + # the applicable amount (an input): the full 1,500. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + sublet_income: 5_200 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + universal_credit: 3_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 + output: + legacy_benefits_home_letting_income: 4_160 + council_tax_reduction_applicable_income: 3_000 + council_tax_reduction: 1_500 + +- name: Scotland before April 2022 does not count sub-tenant rent for a Universal Credit recipient + # SSI 2012/303 reg 26(1): the authority uses the Secretary of State's assessment of income + # for the award, adjusted only for the award itself and non-dependants. + # Universal Credit's unearned income (UC Regs 2013 reg 66) has no head for + # rent from a sub-tenant, so the £5,200 (£4,160 after the £20 a week + # disregard) does not count. Income is the award, 3,000 (an input), below + # the applicable amount (an input): the full 1,500. + period: 2021 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + sublet_income: 5_200 + benunits: + benunit: + members: [person] + claims_all_entitled_benefits: true + universal_credit: 3_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 + output: + legacy_benefits_home_letting_income: 4_160 + council_tax_reduction_applicable_income: 3_000 + council_tax_reduction: 1_500 + +- name: Welsh working-age tariff income counts any part of a £250 step + # WSI 2013/3029 Sch 6 para 33: £1 a week for each complete £250 over + # £6,000 and £1 for any part. Savings 6,001, 6,250 and 6,251 give 1, 1 and 2 + # a week: 52, 52 and 104 a year. + period: 2026 + input: + people: + a: + age: 40 + b: + age: 40 + c: + age: 40 + benunits: + ba: + members: [a] + would_claim_uc: false + bb: + members: [b] + would_claim_uc: false + bc: + members: [c] + would_claim_uc: false + households: + ha: + members: [a] + country: WALES + local_authority: CARDIFF + savings: 6_001 + hb: + members: [b] + country: WALES + local_authority: CARDIFF + savings: 6_250 + hc: + members: [c] + country: WALES + local_authority: CARDIFF + savings: 6_251 + output: + council_tax_reduction_tariff_income: [52, 52, 104] + +- name: The Universal Credit yield also counts any part of a £250 step + # UC Regs 2013 reg 72(1): £4.35 a month for each £250 over £6,000 and for + # any part. UC capital 6,001, 6,250 and 6,251 (inputs) give 1, 1 and 2 + # steps: 52.20, 52.20 and 104.40 a year. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + a: + age: 40 + b: + age: 40 + c: + age: 40 + benunits: + ba: + members: [a] + universal_credit: 1_000 + uc_reported_capital: 6_001 + bb: + members: [b] + universal_credit: 1_000 + uc_reported_capital: 6_250 + bc: + members: [c] + universal_credit: 1_000 + uc_reported_capital: 6_251 + households: + ha: + members: [a] + country: WALES + local_authority: CARDIFF + hb: + members: [b] + country: WALES + local_authority: CARDIFF + hc: + members: [c] + country: WALES + local_authority: CARDIFF + output: + council_tax_reduction_tariff_income: [52.20, 52.20, 104.40] + +- name: Debt secured on a let property comes off its value after the sale expenses + # SI 2012/2885 Sch 1 para 32: market value less 10% where there would be + # expenses of sale, then less any encumbrance secured on it. £20,000 less + # £2,000, less £4,000 secured on it (an input), is £14,000, within the + # £16,000 limit. Tariff income (Sch 1 para 37): 4,000 / 500 = 8 a week, 416 + # a year. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 70 + private_pension_income: 14_000 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + other_residential_property_value: 20_000 + other_residential_property_secured_debt: 4_000 + output: + council_tax_reduction_assessable_capital: 14_000 + council_tax_reduction_tariff_income: 416 + +- name: Negative equity in one property does not reduce other capital + # The debt is deducted from the asset it is secured on, and that asset is + # valued at nil, not below: a £10,000 property (£9,000 after sale + # expenses) with £15,000 secured on it adds nothing to £12,000 of savings. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 70 + private_pension_income: 14_000 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + savings: 12_000 + other_residential_property_value: 10_000 + other_residential_property_secured_debt: 15_000 + output: + council_tax_reduction_assessable_capital: 12_000 + +- name: A Scottish mixed-age couple on Income Support is under the working-age scheme + # SSI 2021/249 reg 3(1): the scheme for people under pensionable age applies + # where the applicant has reached pensionable age but the applicant or + # partner has a qualifying income-related benefit, here Income Support (an + # input, with no Universal Credit). Its reg 57(1) has no head for + # sub-tenant rent, so only the Income Support, 3,000, counts. + period: 2026 + input: + people: + claimant: + age: 70 + sublet_income: 5_200 + partner: + age: 40 + benunits: + benunit: + members: [claimant, partner] + income_support: 3_000 + would_claim_uc: false + would_claim_pc: false + households: + household: + members: [claimant, partner] + country: SCOTLAND + local_authority: GLASGOW_CITY + output: + council_tax_reduction_pensioner: false + legacy_benefits_home_letting_income: 4_160 + council_tax_reduction_applicable_income: 3_000 + +- name: A Scottish Income Support recipient's capital counts but yields no tariff income + # SSI 2021/249 has no disregard of a passported applicant's capital, so the + # 10,000 of savings is the applicant's capital (under the 16,000 limit, + # reg 13(1)). But reg 13(11) treats a qualifying income-related benefit + # claimant as meeting the income conditions, so their income, including + # the reg 63 assumed yield, is not assessed: nil 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: SCOTLAND + local_authority: GLASGOW_CITY + savings: 10_000 + output: + council_tax_reduction_assessable_capital: 10_000 + council_tax_reduction_tariff_income: 0 diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_earnings_disregard.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_earnings_disregard.yaml index f3f11f8954..3a3f5a6267 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_earnings_disregard.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_earnings_disregard.yaml @@ -430,12 +430,16 @@ # (12,000 - 4,530 - 1,000 PSA) x 20% = 1,294, giving total tax 1,388. # Without wages tax is 1,086 (next case), so employment tax is 302 and # net earnings/disregard are 1,040 - 302 = 738, below the 1,040 cap. - # PC counts deemed capital income, not interest: 12,000 + 1,040 - 1,388 - # - 738 = 10,914. HMRC: /apply-tax-free-interest-on-savings/how-much-is-tax-free. + # PC counts deemed capital income, not interest, and does not deduct the + # 1,086 of tax on the interest that is due without earnings (reg 17(10)(a), + # Sch IV para 18); the 302 the wages add stays tax on earnings. So the tax + # deducted is 1,388 - 1,086 = 302, and income is 12,000 + 1,040 - 302 - + # 738 = 12,000. HMRC: /apply-tax-free-interest-on-savings/how-much-is-tax-free. income_tax: 1_388 pension_credit_employment_income_tax: 302 + pension_credit_uncounted_income_tax_without_earnings: 1_086 pension_credit_earnings_disregard: 738 - pension_credit_income: 10_914 + pension_credit_income: 12_000 - name: The same claimant with savings and no earnings has the same Pension Credit income. period: 2024 @@ -455,8 +459,10 @@ output: income_tax: 1_086 pension_credit_earnings_disregard: 0 - # 12,000 - 1,086. - pension_credit_income: 10_914 + # The 1,086 is all tax on the interest, which Pension Credit does not + # count, so none of it is deducted: 12,000. + pension_credit_uncounted_income_tax_without_earnings: 1_086 + pension_credit_income: 12_000 - name: Pension contribution relief already available without earnings does not reduce tax attributed to earnings. period: 2024 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 d98e564feb..6b32d58624 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 @@ -63,7 +63,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: @@ -82,8 +87,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 @@ -174,7 +181,7 @@ pension_credit_income: 18_514 pension_credit: 0 -- name: Positive property income still counts in Pension Credit income. +- name: Positive property income does not count in Pension Credit income, nor does its tax. period: 2026 absolute_error_margin: 1 input: @@ -192,8 +199,11 @@ region: WALES tenure_type: OWNED_OUTRIGHT output: - # 20,000 + 3,000, less income tax of 20% of (23,000 - 12,570) = 2,086. - pension_credit_income: 20_914 + # SPC Regs 2002 Sch IV para 18 disregards actual income from capital; the + # let property counts through deemed income instead. Only the tax on the + # pension is deducted (reg 17(10)(a)): 20,000 - 20% x (20,000 - 12,570) = + # 18,514, as without the property. + pension_credit_income: 18_514 pension_credit: 0 # Issue #2255, earnings. A self-employment loss is not set against wages 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 88c83a064e..033ddb88c5 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 @@ -480,7 +480,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: @@ -505,13 +505,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 # Aged 72: State Pension age was reached in 2019, before 1 April 2021, so @@ -537,12 +541,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/policy/baseline/household/income/property_income_after_finance_costs.yaml b/policyengine_uk/tests/policy/baseline/household/income/property_income_after_finance_costs.yaml index 902f7720a1..d232d83771 100644 --- a/policyengine_uk/tests/policy/baseline/household/income/property_income_after_finance_costs.yaml +++ b/policyengine_uk/tests/policy/baseline/household/income/property_income_after_finance_costs.yaml @@ -1,10 +1,12 @@ -# Means tests count property income after the costs of dwelling-related -# loans. Tax credits do so by statute: The Tax Credits (Definition and -# Calculation of Income) Regulations 2002 reg. 11(2A) disregards the ITTOIA -# 2005 s. 272A restriction, and reg. 11(1) counts "annual taxable profits", so -# costs above the profit leave nil rather than a loss. The legacy means tests -# deduct income tax, which the finance-cost reduction lowers, so they count -# the profit after the costs too. +# Tax credits count property income after the costs of dwelling-related +# loans by statute: The Tax Credits (Definition and Calculation of Income) +# Regulations 2002 reg. 11(2A) disregards the ITTOIA 2005 s. 272A +# restriction, and reg. 11(1) counts "annual taxable profits", so costs above +# the profit leave nil rather than a loss. The legacy means tests treat rent +# from a let property as capital (HB Regs 2006 reg 46(4) and Sch 5 para 17; +# HB (SPC) Regs 2006 Sch 5 para 22), so it counts in neither case, and they +# deduct only the tax on the income they count: the finance-cost reduction +# comes off the tax on the rent (legacy_means_test_income_tax). - name: Finance costs are deducted from property income for tax credits period: 2023 @@ -56,8 +58,10 @@ output: # (16,000 + 12,000 + 6,000 - 12,570) x 20%. income_tax: 4_286 - # 16,000 + 12,000 + 6,000 - 4,286, less the 5 a week earnings disregard. - housing_benefit_applicable_income: 29_454 + # The rent does not count, nor its tax: the tax on the earnings and + # pension is (28,000 - 12,570) x 20% = 3,086, so 16,000 + 12,000 - 3,086, + # less the 5 a week earnings disregard. + housing_benefit_applicable_income: 24_654 - name: Housing Benefit, finance costs equal to the profit do not lower it period: 2026 @@ -74,6 +78,7 @@ # 4,286 less the 20% x 6,000 reduction. income_tax: 3_086 property_income_after_finance_costs: 0 - # 16,000 + 12,000 - 3,086 - 260: the property income nets to nil, so the - # lower tax does not raise the income counted. + # 16,000 + 12,000 - 3,086 - 260: the rent does not count, and the 1,200 + # reduction comes off the tax on the rent, so the tax on the earnings and + # pension deducted is still 3,086. housing_benefit_applicable_income: 24_654 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 811373c441..8775695de1 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,12 +21,23 @@ 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 less pensioners' Child Benefit - and the schemes' pensioner earnings disregard, recomputed here (income from its components, - the disregard from the statutory sums) rather than read from the variables - 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, less pensioners' Child Benefit and the schemes' + pensioner earnings disregard (recomputed from the statutory sums). C is household savings plus other property at 90% + of its value (SI 2012/2885 Sch 1 para 32(a)), or, for a Welsh Universal + Credit recipient, the Universal Credit assessment of capital (WSI + 2013/3029 Sch 6 para 9(6)), or nil for a Welsh applicant on Income + Support or income-based JSA or ESA (Sch 10 para 8). A UC award includes + one the cap or deductions reduce to nil. Tariff income is 1 a week per + 500, or part, + over 10,000 for pensioners (Sch 1 para 37); for people under pension age + in Wales and Scotland 1 a week per 250, or part, over 6,000 (WSI + 2013/3029 Sch 6 para 33; SSI 2021/249 reg 63(1)(b)), or with Universal + Credit 4.35 a month (UC Regs 2013 reg 72; SSI 2021/249 reg 63(1)(a)), and + nil on Income Support or income-based JSA or ESA. 5. Metamorphic: a guarantee credit recipient's CTR does not change when the State Pension changes. 6. Metamorphic: nor when its savings change. @@ -83,6 +94,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 @@ -260,16 +272,24 @@ def situation( "pension_credit_income", "pension_credit_assessable_capital", "council_tax_reduction_pensioner", + "council_tax_reduction_relevant_income_based_benefit", + "universal_credit", + "uc_assessable_capital", + "claims_universal_credit", + "universal_credit_pre_benefit_cap", + "council_tax_reduction_head_applies_alone", + "legacy_benefits_home_letting_income", ] -# 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. Since #2033, a pensioner family's -# earnings disregard also comes off before the floor. These GB families now -# exclude Child Benefit on the pensioner general-rules route as well. +# council_tax_reduction_applicable_income outside the Pension Credit routes: +# these incomes and benefits, less the income tax on them, National Insurance, +# half of pension contributions and, for pensioner families, Child Benefit and +# the pensioner earnings disregard (since #2033), 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", @@ -286,7 +306,7 @@ def situation( "esa_income", "universal_credit", ] -MAIN_DEDUCTIONS = ["income_tax", "national_insurance"] +MAIN_DEDUCTIONS = ["legacy_means_test_income_tax", "national_insurance"] # The pensioner earnings disregards in 2026, written out from the law, not # read from the parameters: £25 a week for a lone parent, £10 with a partner, # £5 otherwise, plus £17.10 (SI 2012/2885 Sch 4 paras 2, 8 and 10; WSI @@ -296,6 +316,7 @@ def situation( HOUSEHOLD_VARIABLES = [ "council_tax_reduction_maximum_eligible_liability", "savings", + "other_residential_property_value", ] @@ -382,6 +403,59 @@ def benunit_total(names): return values +def universal_credit_route(values, i): + """A working-age applicant with an award of Universal Credit: paid, or + claimed and entitled before the cap and deductions (UC Regs 2013 reg 81), + unless the household head applies alone.""" + award = values["universal_credit"][i] > 0 or ( + values["claims_universal_credit"][i] + and values["universal_credit_pre_benefit_cap"][i] > 0 + ) + return ( + award + and not values["council_tax_reduction_head_applies_alone"][i] + and not values["council_tax_reduction_pensioner"][i] + ) + + +def passported(values, i): + # council_tax_reduction_relevant_income_based_benefit already leaves out a + # household head who applies alone (#2078). + return ( + values["council_tax_reduction_relevant_income_based_benefit"][i] + and not values["council_tax_reduction_pensioner"][i] + ) + + +def expected_capital(unit, values, i): + # In 2026 Wales takes a UC award's capital from the Secretary of State + # (WSI 2013/3029 Sch 6 para 9(6)) and disregards a passported applicant's + # whole capital (Sch 10 para 8); Scotland does neither (SSI 2021/249). + if unit["country"] == "WALES" and universal_credit_route(values, i): + return values["uc_assessable_capital"][i] + if unit["country"] == "WALES" and passported(values, i): + return 0.0 + 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 universal_credit_route(values, i): + return steps(6_000, 250) * 4.35 * 12 + if passported(values, 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) @@ -438,13 +512,25 @@ 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) + # A UC award's income is the Secretary of State's assessment, which + # has no head for rent from part of the home. + home_letting = ( + values["legacy_benefits_home_letting_income"][i] + if universal_credit_route(values, i) + else 0.0 + ) + income = ( + values["income_under_main_definition"][i] + - home_letting + + 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..c2188fac00 --- /dev/null +++ b/policyengine_uk/tests/test_legacy_means_test_income_from_capital_properties.py @@ -0,0 +1,328 @@ +"""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. + Intended exception: Pension Credit's tax on earnings is the extra tax the + earnings cause, including on savings and dividends (#2019, Max's ruling + d1424). With earnings, income from capital can move that tax: earnings + under the personal allowance can leave dividends taxable. So Pension + Credit income is invariant wherever pension_credit_employment_income_tax + does not move, and elsewhere changes by exactly minus the change in that + tax and in the earnings disregard. The awards that follow Pension Credit + (Pension Credit, and Housing Benefit and council tax reduction for a + family receiving it) are compared wherever it does not move. +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 (pensioner, UC + award, passport, guarantee credit, savings credit only). +""" + +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): + earnings_tax = [ + "pension_credit_employment_income_tax", + "pension_credit_earnings_disregard", + ] + variables = MEANS_TEST_INCOMES + AWARDS + earnings_tax + base = calculate(units, year, variables) + for scale in (0.0, 3.0): + scaled = calculate(units, year, variables, capital_income_scale=scale) + moved = {v: scaled[v] - base[v] for v in earnings_tax} + # Intended: income from capital reaches Pension Credit only through + # the tax the earnings cause on it (#2019, d1424). + steady = np.abs(moved["pension_credit_employment_income_tax"]) < 0.01 + on_pension_credit = (base["pension_credit"] > 0) | ( + scaled["pension_credit"] > 0 + ) + follows_pension_credit = { + "pension_credit_income": ~steady, + "pension_credit": ~steady, + "housing_benefit": ~steady & on_pension_credit, + "housing_benefit_applicable_income": ~steady & on_pension_credit, + "council_tax_benefit": ~steady & on_pension_credit, + "council_tax_reduction_applicable_income": ~steady & on_pension_credit, + } + for v in MEANS_TEST_INCOMES + AWARDS: + compared = ~follows_pension_credit.get(v, np.zeros_like(steady)) + np.testing.assert_allclose( + scaled[v][compared], + base[v][compared], + atol=0.01, + err_msg=f"{v} at scale {scale}", + ) + # Where the tax on earnings moves, Pension Credit income moves by + # exactly minus that change and the disregard's, unless floored. + unfloored = (base["pension_credit_income"] > 0) & ( + scaled["pension_credit_income"] > 0 + ) + np.testing.assert_allclose( + (scaled["pension_credit_income"] - base["pension_credit_income"])[ + unfloored + ], + -( + moved["pension_credit_employment_income_tax"] + + moved["pension_credit_earnings_disregard"] + )[unfloored], + atol=0.01, + err_msg=f"pension_credit_income decomposition 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", + "council_tax_reduction_universal_credit_award", + "council_tax_reduction_relevant_income_based_benefit", + "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) * 16 + + values["council_tax_reduction_universal_credit_award"].astype(int) * 8 + + values["council_tax_reduction_relevant_income_based_benefit"].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/tests/test_pension_credit_earnings_disregard_properties.py b/policyengine_uk/tests/test_pension_credit_earnings_disregard_properties.py index cad0a87ef3..fb6f179f00 100644 --- a/policyengine_uk/tests/test_pension_credit_earnings_disregard_properties.py +++ b/policyengine_uk/tests/test_pension_credit_earnings_disregard_properties.py @@ -204,9 +204,23 @@ def test_statute_bounds_differential_and_monotonicity(case): no_employment = person_values( simulate(without(case, ["employment_income"])), "income_tax" ) - no_earnings = person_values( - simulate(without(case, ["employment_income", "self_employment_income"])), - "income_tax", + no_earnings_sim = simulate( + without(case, ["employment_income", "self_employment_income"]) + ) + no_earnings = person_values(no_earnings_sim, "income_tax") + # Pension Credit income does not deduct the tax on income it does not + # count (interest here) or the Step 7 charges, measured without earnings + # (SPC Regs 2002 reg 17(10)(a), Sch IV para 18): the extra tax the + # earnings cause stays in the tax on earnings. A separate simulation, so + # this also checks the branch the model computes it on. + uncounted_without_earnings = np.maximum( + 0, + no_earnings - person_values(no_earnings_sim, "legacy_means_test_income_tax"), + ) + assert np.allclose( + person_values(sim, "pension_credit_uncounted_income_tax_without_earnings"), + uncounted_without_earnings, + atol=0.01, ) employment_tax = max(0.0, float((income_tax - no_employment)[adult].sum())) self_employment_tax = max(0.0, float((no_employment - no_earnings)[adult].sum())) @@ -233,6 +247,7 @@ def test_statute_bounds_differential_and_monotonicity(case): - actual_self_employment + float(notional[adult].sum()) + float(contributions[adult].sum()) + - float(uncounted_without_earnings[adult].sum()) ) before = max(0.0, total - deductions) assert np.isclose( diff --git a/policyengine_uk/tests/test_trading_loss_properties.py b/policyengine_uk/tests/test_trading_loss_properties.py index 2b0c05f5b3..634a250adf 100644 --- a/policyengine_uk/tests/test_trading_loss_properties.py +++ b/policyengine_uk/tests/test_trading_loss_properties.py @@ -771,6 +771,13 @@ def values(sim, variable): "blind_persons_allowance", "marriage_allowance", "married_couples_allowance_deduction", + # The legacy means tests deduct only the tax on income they count, + # and Pension Credit leaves out the tax on uncounted income due + # without earnings. Both are recomputed from the tax components, so a + # loss that moves interest or dividends between bands would move them + # with income_tax held. Hold them as the tax the tests deduct. + "legacy_means_test_income_tax", + "pension_credit_uncounted_income_tax_without_earnings", ] tax = {v: values(with_loss, v) for v in deductions} # SPC Regs reg 17(11) substitutes CER notional deductions for the tax 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 762b749466..0b91d55af4 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 @@ -15,7 +15,17 @@ class housing_benefit_applicable_income(Variable): "Credit award is savings credit only, it is the Secretary of State's " "assessment of income plus the savings credit payable, less childcare " "charges and the earnings disregards. Otherwise it is the family's " - "income under the Housing Benefit rules." + "income under the Housing Benefit rules. 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." ) reference = ( "https://www.legislation.gov.uk/uksi/2006/213/schedule/5/paragraph/4", @@ -26,6 +36,10 @@ class housing_benefit_applicable_income(Variable): "https://www.legislation.gov.uk/uksi/2006/214/regulation/27", "https://www.legislation.gov.uk/nisr/2006/406/regulation/24", "https://www.legislation.gov.uk/nisr/2006/406/regulation/25", + "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", ) definition_period = YEAR unit = GBP @@ -82,8 +96,8 @@ def formula(benunit, period, parameters): INCOME_COMPONENTS = [ "employment_income", "self_employment_income", - "property_income_after_finance_costs", "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 @@ -106,7 +120,7 @@ def formula(benunit, period, parameters): add_for_members(benunit, period, ["pension_contributions"], members) * p.pension_contribution_deduction_rate ) - 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 b0bad392d8..33e694c856 100644 --- a/policyengine_uk/variables/gov/dwp/income_support_applicable_income.py +++ b/policyengine_uk/variables/gov/dwp/income_support_applicable_income.py @@ -5,12 +5,27 @@ 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", "https://www.legislation.gov.uk/uksi/1987/1967/regulation/36", "https://www.legislation.gov.uk/uksi/1987/1967/regulation/38", + "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/9", ) def formula(benunit, period, parameters): @@ -26,15 +41,18 @@ def formula(benunit, period, parameters): INCOME_COMPONENTS = [ "employment_income", "self_employment_income", - "property_income_after_finance_costs", "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..cf5e1a7488 --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/legacy_means_test_income_tax.py @@ -0,0 +1,106 @@ +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, other tax credits and " + "the residential finance-cost reduction). Most reductions are not " + "tied to any income: s.27 orders them only to give the greatest " + "reduction in liability. Two 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 residential finance-cost reduction is given on at most the " + "property business's profits, plus any current-year estate amounts " + "and within the adjusted total income limit (Income Tax (Trading and " + "Other Income) Act 2005 ss.274A and 274AA). The finance-cost " + "reduction (property_finance_cost_relief) therefore comes off the tax " + "on property income first. The model's other_tax_credits input mixes " + "foreign tax credit relief with other reductions (venture capital " + "trust, enterprise investment and maintenance relief, among others) " + "and records no source, so those reductions are shared in proportion " + "to the Step 4 tax on each kind of income, as a stated convention. 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. The residential finance-cost reduction is relief + # for the property business's costs, given on at most its profits + # (ITTOIA 2005 ss.274A-274AA), so it comes off the tax on property + # income first. The rest have no recorded source and are shared in + # proportion to the Step 4 tax left. + reductions = min_( + add(person, period, p.income_tax_subtractions), before_reductions + ) + finance_cost_relief = min_( + person("property_finance_cost_relief", period), + min_(person("property_income_tax", period), reductions), + ) + general_reductions = reductions - finance_cost_relief + capital_after_relief = capital - finance_cost_relief + tax_after_relief = before_reductions - finance_cost_relief + capital_share = np.divide( + capital_after_relief, + tax_after_relief, + out=np.zeros_like(capital_after_relief, dtype=float), + where=tax_after_relief > 0, + ) + capital_after_reductions = ( + capital_after_relief - general_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_earnings_income_tax.py b/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_earnings_income_tax.py index b922aafcb2..3728b28cb2 100644 --- a/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_earnings_income_tax.py +++ b/policyengine_uk/variables/gov/dwp/pension_credit/pension_credit_earnings_income_tax.py @@ -11,6 +11,14 @@ def income_tax_with_inputs_zeroed(simulation, period, variables): """Each person's income tax with every person's value of each of ``variables`` set to nil, on a branch that is dropped afterwards.""" + return person_variable_with_inputs_zeroed( + simulation, period, variables, "income_tax" + ) + + +def person_variable_with_inputs_zeroed(simulation, period, variables, output): + """Each person's ``output`` with every person's value of each of + ``variables`` set to nil, on a branch that is dropped afterwards.""" name = "pension_credit_without_" + "_and_".join(variables) while name in simulation.branches or name == simulation.branch_name: name += "_" @@ -22,7 +30,7 @@ def income_tax_with_inputs_zeroed(simulation, period, variables): people = branch.populations["person"] for variable in variables: branch.set_input(variable, period, np.zeros(people.count)) - return people("income_tax", period) + return people(output, period) finally: del simulation.branches[name] @@ -126,3 +134,46 @@ def formula(benunit, period, parameters): ) - person("pension_credit_income_tax_without_earnings", period) claimant_or_partner = person("is_claimant_or_partner", period) return max_(0, benunit.sum(added * claimant_or_partner)) + + +class pension_credit_uncounted_income_tax_without_earnings(Variable): + value_type = float + entity = Person + label = "Income tax on income Pension Credit does not count, without earnings" + documentation = ( + "The part of the person's income tax, if nobody in the simulation had " + "employment or self-employment income, that is not tax on income " + "Pension Credit takes into account: the tax on rent from property, " + "interest and dividends, and the Step 7 charges " + "(legacy_means_test_income_tax). SPC Regs 2002 reg. 17(10)(a) " + "disregards tax only on income taken into account, and Schedule IV " + "paragraph 18 disregards actual income from capital, so Pension " + "Credit income does not deduct this tax. It is measured without " + "earnings because the tax on earnings is the extra tax the earnings " + "cause, including on savings and dividends " + "(pension_credit_employment_income_tax and " + "pension_credit_self_employment_income_tax), which Pension Credit " + "income does deduct. " + DECISION + ) + definition_period = YEAR + unit = GBP + reference = ( + "https://www.legislation.gov.uk/uksi/2002/1792/regulation/17", + "https://www.legislation.gov.uk/uksi/2002/1792/schedule/IV", + ) + + def formula(person, period, parameters): + income_tax = person("pension_credit_income_tax_without_earnings", period) + has_earnings = (person("employment_income", period) != 0) | ( + person("self_employment_income", period) != 0 + ) + if not has_earnings.any(): + counted = person("legacy_means_test_income_tax", period) + else: + counted = person_variable_with_inputs_zeroed( + person.simulation, + period, + ["employment_income", "self_employment_income"], + "legacy_means_test_income_tax", + ) + return max_(0, income_tax - counted) 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 86e9504e9c..c64caa5058 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 @@ -65,6 +65,15 @@ def formula(benunit, period, parameters): ) * is_claimant_or_partner ) - benunit("pension_credit_self_employment_income_tax", period) + # Reg 17(10)(a) disregards tax only on income taken into account, and + # Schedule IV paragraph 18 disregards actual income from capital. The + # tax on earnings is the extra tax the earnings cause, so the tax not + # deducted is the tax on uncounted income, and the Step 7 charges, + # that the claimant and partner would pay without earnings. + tax -= benunit.sum( + person("pension_credit_uncounted_income_tax_without_earnings", period) + * is_claimant_or_partner + ) pen_con_deduction_rate = pc.income.pension_contributions_deduction deductions = tax + pension_contributions * pen_con_deduction_rate # Schedule VI earnings disregards (reg. 17(9)). diff --git a/policyengine_uk/variables/gov/dwp/universal_credit/housing_costs_element/non_dep_deduction/uc_non_dep_receives_pension_credit.py b/policyengine_uk/variables/gov/dwp/universal_credit/housing_costs_element/non_dep_deduction/uc_non_dep_receives_pension_credit.py index 84dd97e376..81cea515be 100644 --- a/policyengine_uk/variables/gov/dwp/universal_credit/housing_costs_element/non_dep_deduction/uc_non_dep_receives_pension_credit.py +++ b/policyengine_uk/variables/gov/dwp/universal_credit/housing_costs_element/non_dep_deduction/uc_non_dep_receives_pension_credit.py @@ -31,9 +31,10 @@ def formula(benunit, period, parameters): # through the renter's UC entitlement and pension-age route. simulation = benunit.simulation # Income tax is independent of the UC housing element. Calculate - # both earnings counterfactuals on the parent so this branch and + # the earnings counterfactuals on the parent so this branch and # ordinary Pension Credit share them whichever is requested first. benunit.members("pension_credit_income_tax_without_earnings", period) + benunit.members("pension_credit_uncounted_income_tax_without_earnings", period) name = "uc_non_dep_pension_credit" while name in simulation.branches or name == simulation.branch_name: name += "_" 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 52524b2828..a94df38a99 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 @@ -12,11 +12,11 @@ def is_full_time_student_non_dep(person, period): def applicant_has_universal_credit(benunit, period): """Whether the Council Tax Reduction applicant has the benefit unit's - Universal Credit award. The award belongs to the benefit unit's claimant - and partner, so not to a household head who applies alone.""" - return (benunit("universal_credit", period) > 0) & ~benunit( - "council_tax_reduction_head_applies_alone", period - ) + Universal Credit award (council_tax_reduction_universal_credit_award), + including one the benefit cap or deductions reduce to nil. The award + belongs to the benefit unit's claimant and partner, so not to a household + head who applies alone.""" + return benunit("council_tax_reduction_universal_credit_award", period) def legacy_council_tax_reduction( @@ -62,10 +62,20 @@ def legacy_council_tax_reduction( - excess_income * ctr.means_test.withdrawal_rate - non_dep_deductions, ) + # council_tax_reduction_assessable_capital takes the Universal Credit + # assessment for an award of Universal Credit (the default scheme's + # para 37(6)), including one the benefit cap or deductions reduce to nil. + # Most councils keep the default scheme's disregard of the whole capital of + # an applicant on Income Support, income-based JSA or income-related ESA + # (its Schedule 10 para 8); each scheme says whether it does. + passported_capital_disregarded = ( + relevant_income_based_benefit + & ctr.means_test.disregards_passported_applicants_capital + ) capital = where( - has_uc_award, - benunit("uc_assessable_capital", period), - benunit.household("savings", period), + passported_capital_disregarded, + 0, + 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 2f5010c9bf..3600553451 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, +) from policyengine_uk.variables.household.demographic.country import Country @@ -32,7 +35,26 @@ class council_tax_reduction_applicable_income(Variable): "children or young persons. War pensions and Armed Forces " "Compensation Scheme payments are not counted: Scotland disregards or " "omits them, and English and Welsh councils may relieve them beyond " - "the prescribed £10 a week, so the model takes the full disregard." + "the prescribed £10 a week, so the model takes the full disregard. " + "No scheme " + "counts income derived from capital, such as rent from property, " + "interest and dividends, as income, so it is not listed and tax on it " + "is not deducted (legacy_means_test_income_tax). The pensioner schemes " + "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, on the schemes' own income rules. It does not count " + "where a working-age applicant has an award of Universal Credit, " + "whose income the schemes take from the Secretary of State's " + "Universal Credit assessment (which does not count it), or in the " + "Scottish scheme for people under pension age from April 2022, which " + "does not list it." ) definition_period = YEAR unit = GBP @@ -50,6 +72,17 @@ class council_tax_reduction_applicable_income(Variable): "https://www.legislation.gov.uk/uksi/2012/2885/schedule/4", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/3", "https://www.legislation.gov.uk/ssi/2012/319/schedule/2", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/5", + "https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/37", + "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/6/paragraph/9", + "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/2012/303/regulation/26", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/3", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/63", "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/11", "https://www.legislation.gov.uk/ssi/2012/319/regulation/21", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/5", @@ -173,7 +206,6 @@ def formula(benunit, period, parameters): income_components = [ "employment_income", "self_employment_income", - "property_income_after_finance_costs", "private_pension_income", ] bi = parameters(period).gov.contrib.ubi_center.basic_income @@ -208,6 +240,38 @@ def formula(benunit, period, parameters): ) credits = applicant_family * add(benunit, period, ["tax_credits"]) increased_income = income + personal_benefit_income + credits + benefits + # Rent for letting part of the home counts under the schemes' own + # income rules, less the sub-tenant disregard. Two exceptions: + # - A working-age applicant with an award of Universal Credit: the + # schemes use the Secretary of State's assessment of income for the + # award (SI 2012/2886 Sch para 37(1); WSI 2013/3029 Sch 6 para 9(1); + # SSI 2012/303 reg 26(1)), which does not count it (UC Regs 2013 + # reg 66), and Oxford's Appendix 3 disregards it. + # - The Scottish scheme 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 (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 applicant or + # partner, as Universal Credit itself does (UC Regs 2013 reg + # 3(2)(a)). The model cannot represent reg 3(2)'s other statuses or + # a claim awaiting determination (reg 3(1)(b)(ii), from April 2023). + universal_credit_route = ~pensioner & benunit( + "council_tax_reduction_universal_credit_award", period + ) + scottish_working_age_scheme = is_scotland_scheme(country) & ~pensioner + p_scotland = parameters( + period + ).gov.local_authorities.scotland.council_tax_reduction.means_test + counts_home_letting = ~universal_credit_route & ( + ~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( @@ -222,7 +286,10 @@ def formula(benunit, period, parameters): benunit, period, ["pension_contributions"], members ) * benunit("council_tax_reduction_pension_contribution_deduction_rate", period) tax = add_for_members( - benunit, period, ["income_tax", "national_insurance"], members + benunit, + period, + ["legacy_means_test_income_tax", "national_insurance"], + members, ) # SI 2012/2885 Sch 1 para 17(9) and Sch 4; WSI 2013/3029 Sch 1 para # 11(9) and Sch 3; SSI 2012/319 reg 31(8) and Sch 2: the pensioner @@ -231,9 +298,12 @@ def formula(benunit, period, parameters): earnings_disregard = benunit( "council_tax_reduction_pensioner_earnings_disregard", period ) + # 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 - earnings_disregard - ) + ) + 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 46ef19a7d1..05115192ad 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,17 @@ from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_scotland_scheme, + is_wales_scheme, +) + +# The debt input secured on each capital source. The schemes deduct "the +# amount of any encumbrance secured on it" from that asset after the sale +# expenses, so a source is never valued below nil and negative equity in one +# source does not reduce another. Land has no secured-debt input. +SECURED_DEBT = { + "other_residential_property_value": "other_residential_property_secured_debt", + "non_residential_property_value": "non_residential_property_secured_debt", +} class council_tax_reduction_assessable_capital(Variable): @@ -6,28 +19,54 @@ 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 an applicant who is not a pensioner, or their " + "partner, has an award of Universal Credit " + "(council_tax_reduction_universal_credit_award, which includes an " + "award the benefit cap or deductions reduce to nil), the 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. The Welsh " + "scheme, and the Scottish scheme before April 2022, disregard the " + "whole capital of an applicant on Income Support, income-based " + "Jobseeker's Allowance or income-related Employment and Support " + "Allowance; the English local schemes that do the same apply it in " + "their own formulas. 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, then less any debt secured on that property (which defaults " + "to nil because the survey does not record it). The schemes also " + "count shares and other investments, which in the data are mixed " + "with pension wealth the schemes disregard, so they 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/wsi/2013/3029/schedule/6/paragraph/26", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/10/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/ssi/2012/303/regulation/26", + "https://www.legislation.gov.uk/ssi/2012/303/schedule/5/paragraph/7", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/70", ] def formula(benunit, period, parameters): @@ -41,8 +80,60 @@ def formula(benunit, period, parameters): has_savings_credit_only_award = applicant_family & benunit( "in_receipt_of_savings_credit_only", period ) + country = benunit.household("country", period) + scotland = is_scotland_scheme(country) + wales = is_wales_scheme(country) + p_scotland = parameters( + period + ).gov.local_authorities.scotland.council_tax_reduction.means_test + working_age = ~benunit("council_tax_reduction_pensioner", 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. These are + # working-age rules. SSI 2021/249 has no such rule. + uses_universal_credit_assessment = ~scotland | ( + p_scotland.uses_universal_credit_capital_assessment + ) + universal_credit_route = ( + working_age + & benunit("council_tax_reduction_universal_credit_award", period) + & uses_universal_credit_assessment + ) + # WSI 2013/3029 Sch 10 para 8 and SSI 2012/303 Sch 5 para 7: the whole + # capital of an applicant on Income Support, income-based JSA or + # income-related ESA is disregarded. SSI 2021/249 has no such + # disregard: reg 13(11) treats only the income conditions as met. + passported = working_age & benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + disregards_passported_capital = wales | ( + scotland & p_scotland.disregards_passported_applicants_capital + ) + 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, then less any encumbrance secured on it (SI + # 2012/2885 Sch 1 para 32 and equivalents). + household_capital = 0 + for source in p.sources: + value = max_(0, benunit.household(source, period)) + if source in p.sale_expenses.sources: + value = value * (1 - p.sale_expenses.rate) + if source in SECURED_DEBT: + debt = max_(0, benunit.household(SECURED_DEBT[source], period)) + value = max_(0, value - debt) + 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, + universal_credit_route, + passported & disregards_passported_capital, + ], + [ + 0, + benunit("pension_credit_assessable_capital", period), + benunit("uc_assessable_capital", period), + 0, + ], + 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 f070259c7d..49821a91ec 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 @@ -24,8 +24,10 @@ class council_tax_reduction_pensioner(Variable): "and each claims, a working-age family is assessed under the " "working-age rules even if the household head's family is " "pension-age, and the reverse. The shared applicable allowance uses " - "this test, as does English scheme selection; Welsh and Scottish " - "scheme selection retains its existing approximations." + "this test, as does English scheme selection, the choice between the " + "pensioner and working-age tariff income from capital, and the " + "Scottish income rules; Welsh and Scottish award formulas retain " + "their existing approximations." ) 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..8b76864719 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_tariff_income.py @@ -0,0 +1,138 @@ +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 (council_tax_reduction_universal_credit_award, " + "including an award the benefit cap or deductions reduce to nil), 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) + # An award of Universal Credit, including one the benefit cap or + # deductions reduce to nil, selects the UC assumed yield. + universal_credit_award = benunit( + "council_tax_reduction_universal_credit_award", period + ) + income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + tariff_income = select( + [pensioner, universal_credit_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/council_tax_reduction/council_tax_reduction_universal_credit_award.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_universal_credit_award.py new file mode 100644 index 0000000000..90c2faeb01 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_universal_credit_award.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_universal_credit_award(Variable): + value_type = bool + entity = BenUnit + label = "Council Tax Reduction applicant has an award of Universal Credit" + documentation = ( + "Whether the Council Tax Reduction applicant or partner has an award " + "of Universal Credit: Universal Credit is paid, or the family claims " + "it and is entitled before the benefit cap and deductions, which " + "reduce an award rather than end it (UC Regs 2013 reg 81; Oxford's " + "scheme, Appendix 3, covers applicants who would be awarded it but " + "for deductions). A supplied universal_credit amount counts as an " + "award. From 1 April 2025 the Scottish scheme also counts an award " + "reduced to zero by a sanction and one whose entitlement ended after " + "a nil award due to earnings but is treated as reclaimed (SSI " + "2021/249 reg 10A); neither is modelled. The benefit unit's award " + "belongs to its claimant and partner, " + "so it is not the applicant's where the household head applies " + "alone. The schemes' working-age Universal Credit rules (the " + "Secretary of State's assessments of income and capital, and the " + "Universal Credit assumed yield) apply only to an applicant who is " + "not a pensioner (council_tax_reduction_pensioner)." + ) + definition_period = YEAR + reference = ( + "https://www.legislation.gov.uk/uksi/2013/376/regulation/81", + "https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/37", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/6/paragraph/9", + "https://www.legislation.gov.uk/ssi/2012/303/regulation/26", + "https://www.legislation.gov.uk/ssi/2021/249/regulation/10A", + ) + + def formula(benunit, period, parameters): + paid = benunit("universal_credit", period) > 0 + entitled_claimant = benunit("claims_universal_credit", period) & benunit( + "is_uc_entitled", period + ) + head_applies_alone = benunit("council_tax_reduction_head_applies_alone", period) + return (paid | entitled_claimant) & ~head_applies_alone 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 0a37929f95..4dfe07ca1c 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 @@ -27,7 +27,7 @@ def formula(benunit, period, parameters): benunit("council_tax_reduction_pensioner", period), ) has_uc_award = applicant_has_universal_credit(benunit, period) - 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 274ffa526f..0cee17202c 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 @@ -14,6 +14,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 @@ -27,9 +31,23 @@ def formula(benunit, period, parameters): "council_tax_reduction_claimant_benunit", period ) would_claim = benunit("would_claim_council_tax_reduction", period) + # Appendix 3 covers applicants awarded Universal Credit, or who would + # be but for deductions or other adjustments to the award. has_uc_award = applicant_has_universal_credit(benunit, period) - 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) @@ -44,10 +62,6 @@ def formula(benunit, period, parameters): ) 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 6eaa8c1d74..597554d737 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 @@ -25,7 +25,7 @@ def formula(benunit, period, parameters): benunit("council_tax_reduction_pensioner", period), ) has_uc_award = applicant_has_universal_credit(benunit, period) - 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