diff --git a/changelog.d/council-tax-reduction.added.md b/changelog.d/council-tax-reduction.added.md new file mode 100644 index 000000000..22fe08840 --- /dev/null +++ b/changelog.d/council-tax-reduction.added.md @@ -0,0 +1,51 @@ +Added an initial `council_tax_reduction` framework covering Wales, Scotland, English pension-age households, and explicit working-age overrides for Stroud and Dudley, and netted Council Tax Reduction against household council tax in downstream income measures. + +Added further source-linked working-age local scheme overrides, including Southend-on-Sea's and Colchester's 2026/27 income-banded Council Tax Reduction schemes, and Thurrock's, Chelmsford's, and Cheshire West and Chester's 2026/27 legacy means-tested Local Council Tax Support schemes. + +Added Chichester's 2026/27 hybrid Council Tax Reduction scheme, combining a legacy non-UC means test with tariff income and prescribed non-dependant deductions, plus UC household-type income bands and the local Class F flat non-dependant deduction. + +Added Coventry's 2026/27 excess-income banded Council Tax Reduction scheme, including UC assessed income and capital treatment, pension-age UC local-scheme cases, and gross-income non-dependant deductions. + +Added Bassetlaw's 2026/27 weekly net-income banded Council Tax Reduction scheme, including Band C liability cap, UC assessed income and capital treatment, pension-age UC protection flags, childcare deductions, tariff income, and flat non-dependant deductions. + +Added Ashford's 2026/27 weekly net-income banded Council Tax Reduction scheme, including Band D liability cap, Schedule 2 and 3 income disregards, UC award element disregards, pension-age UC protection flags, tariff income, and flat final-award non-dependant deductions. + +Added Arun's 2026/27 weekly net-income banded Council Tax Reduction scheme, including the live 100 percent maximum support table, UC award element disregards, UC-assessed capital treatment, Schedule 5 worker earnings disregards, eligible childcare deductions, pension-age UC protection flags, and flat pre-percentage non-dependant deductions. + +Added Dartford's 2026/27 weekly net-income banded Council Tax Reduction scheme, including household-type band tables, non-UC earnings disregard, UC assessed-income and capital treatment, source-listed income disregards with a local source input, minimum award, and strict capital cutoff. + +Added Derby's 2026/27 legacy means-tested Council Tax Support scheme, including the Band B liability cap, 80 percent maximum support, 6,000 pound capital cutoff, 4 pound weekly minimum award, and Housing Benefit-aligned non-dependant deductions. + +Added South Derbyshire's 2026/27 excess-income banded Council Tax Reduction scheme, including the 100 percent to zero weekly excess-income support table, 16,000 pound capital limit, tariff income above 6,000 pounds, 1 pound weekly minimum award, UC assessed-income and capital treatment, mixed-age pensioner carve-outs, applicant/partner capital source input, and flat 6.25 pound weekly working-age non-dependant deductions. + +Added South Gloucestershire's working-age earned-income banded Council Tax Reduction scheme, including the 77 percent to zero weekly earnings table, formal 6,000 pound capital boundary, UC assessed-earnings and capital treatment, pension-age UC protection flags, applicant/partner capital source input, and 3.50/14 pound weekly non-dependant deductions after the support percentage. + +Added Gloucester's 2026 Local Council Tax Support scheme, including full ordinary maximum support, the 20 percent taper, tariff income, 16,000 pound capital limit, UC assessed-income and capital treatment, pension-age UC local-scheme cases, and local working-age non-dependant deductions. + +Added Bath and North East Somerset's 2026/27 Council Tax Reduction scheme, including the ordinary 78 percent non-UC maximum with a Band D cap, protected 100 percent support and 16,000 pound capital limit, 20 percent taper, tariff income, UC Class F income bands with child increments, UC-assessed capital treatment, and pension-age UC local-scheme cases. + +Added Rushmoor Borough Council's 2026/27 default-style Council Tax Reduction scheme, including full support, the Band D liability cap, the 20 percent weekly taper, the strict 6,000 pound capital cutoff, UC assessed income/capital treatment, pension-age UC source exceptions, and prescribed 2026/27 gross-income non-dependant deductions. + +Added Hart District Council's 2026/27 default-style Council Tax Support scheme, including full support, the 20 percent weekly taper, the 16,000 pound capital cutoff, UC assessed income/capital treatment, pension-age UC source exceptions, prescribed 2026/27 gross-income non-dependant deductions, and the UC-couple exception to the one-deduction non-dependant rule. + +Added Maldon District Council's 2026/27 default-style Council Tax Reduction scheme, including 80 percent maximum support, the Band D liability cap, the 20 percent weekly taper, the strict 6,000 pound capital cutoff, UC assessed income/capital treatment, pension-age UC source exceptions, and a flat 10 pound weekly non-dependant deduction. + +Added Hartlepool Borough Council's 2026/27 banded Discount Council Tax Reduction scheme, including six household-type weekly net-income tables, 90/70/40/20/0 percent discount bands, the strict 10,000 pound capital cutoff, the 25 pound weekly earnings disregard, half pension-contribution deduction from earnings, UC assessed income/capital treatment, pension-age UC regulation 60A source exception, and a flat 5 pound weekly non-dependant deduction. + +Added Hertsmere Borough Council's 2026/27 hybrid Council Tax Reduction scheme, including the Class D/E non-UC default means test, the section 57.1A protected-group 100 percent maximum, the Band D liability cap, the 20 percent weekly taper, the 16,000 pound capital cutoff, the Class G Schedule 6 UC banded scheme, Schedule 3 earnings disregards, UC-assessed capital treatment, protected and non-protected non-dependant deduction tables, and pension-age UC source exceptions. + +Added East Hampshire District Council's 2026/27 default-style Council Tax Support scheme, including full support, the 20 percent weekly taper, the 16,000 pound capital cutoff, UC assessed income/capital treatment, pension-age UC source exceptions, and prescribed 2026/27 gross-income non-dependant deductions. + +Added Brentwood Borough Council's 2026/27 banded Discount Council Tax Reduction scheme, including three household-type weekly income tables (no/one/two-or-more dependants), discount rates from 75 percent to 0 percent under a 100 percent maximum, the Schedule 1 paragraph 3 protected-group 100 percent uplift covering DLA, PIP, Attendance Allowance, UC LCWRA, AFIP, and SDA recipients (with Brentwood-scoped source-input booleans for the UC LCW element, Working Tax Credit disability element and ESA Support Component, since PolicyEngine UK does not model those facts directly), the Schedule 1 paragraph 9 income-based-benefit auto-Band 1 routing, the paragraph 6 working-age homeowner exclusion in Bands F, G and H, the strict 6,000 pound capital cutoff, countable income other than earnings, the 20 pound weekly earnings disregard, the paragraph 12 DWP-assessed UC income and capital treatment with the gross UC award, and pension-age UC local-scheme cases with the regulation 60A source exception. Paragraph 45 states there are no non-dependant deductions, so none are modeled. + +Added West Berkshire Council's 2026/27 Council Tax Reduction Scheme, including the six local working-age amendments to the prescribed Default Scheme - paragraph 29(1)A capital cutoff at 6,000 pounds or above, paragraph 29A Band C liability cap, paragraph 29B 70 percent maximum support, paragraph 29C 10 pound weekly minimum award, paragraph 17 30 percent Class E taper, and paragraph 18 removal of the working-age Class F second adult rebate - and the paragraph 29D protected vulnerable category (claimant or partner with Disability Premium / Enhanced Disability Premium / Severe Disability Premium / Disabled Child Premium / any component of ESA / War Pension / UC LCW element) that keeps 100 percent support, no Band C cap, the default 16,000 pound capital limit, no minimum award, and a 20 percent Class E1 taper from paragraph 17A. The vulnerable test is keyed off the claimant or partner only, so a disabled non-dependant does not uplift the claimant's scheme. UC cases use paragraph 37 UC-assessed income/capital, pension-age UC cases include the paragraph 3 relevant-period and regulation 60A source exceptions, and UC non-dependant couples follow paragraph 30's exception to the one-deduction couple rule. West Berkshire-scoped source-input booleans cover War Pension, UC LCW element, Disabled Child Premium, and pension-age UC source exceptions because PolicyEngine UK does not model those facts directly. + +Added Tendring District Council's 2026/27 Council Tax Reduction Scheme, including the prescribed Default Scheme template with local maximum-support amendments: paragraph 57.1 caps the ordinary working-age maximum at 80 percent, paragraph 57.1A caps applicants or partners who have received Jobseeker's Allowance for three years or more at 60 percent through a Tendring-scoped source input, paragraph 33 keeps the 16,000 pound capital limit, paragraph 59 keeps the 20 percent weekly Class E taper, section 14 mirrors the UC applicable amount rule, paragraph 15 counts household members' non-child income/capital in non-UC cases, paragraph 58 is "Not Used" so no working-age non-dependant deductions are modeled, and paragraph 3.2 gives pension-age UC local cases relevant-period and regulation 60A source exceptions. + +Added St Helens Borough Council's 2026/27 Council Tax Reduction Scheme, including the prescribed Default Scheme template with four local working-age amendments: paragraph 9 caps the working-age maximum at 80 percent of council tax liability with a Band D liability cap for Band F, G and H dwellings, paragraph 40 cancels any working-age award calculated at less than 1 pound per week, paragraph 49 removes all working-age non-dependant deductions, paragraphs 10 and 28 keep the 16,000 pound capital limit, paragraphs 9 and 37 keep the prescribed 20 percent weekly taper, paragraph 62 uses the UC maximum award as the applicable amount, paragraph 63 uses the DWP-assessed UC income plus the actual UC award and the DWP-assessed UC capital, and footnote 1 with cabinet paper paragraph 4.4.1(b) keeps pension-age UC recipients whose award arises from Working Tax Credit closure on the prescribed pensioner scheme via a regulation 60A source exception. + +Added Tewkesbury Borough Council's 2026/27 Council Tax Reduction Scheme. Tewkesbury Borough Council has remained on the Default Scheme since 1 April 2013, and the Cabinet's Council Tax Reduction Scheme Report dated January 2026 confirms no proposed changes for 2026/27, so the working-age maximum support is 100 percent of council tax liability (Default Scheme paragraph 29), the capital limit is 16,000 pounds (paragraph 23), the Class E taper is 2 6/7 per cent daily (equivalent to 20 per cent weekly, paragraph 17), and paragraph 30 sets the gross-income non-dependant deduction schedule as amended by SI 2012/3085 of 3.65 / 7.25 / 9.15 / 10.95 pounds weekly with paragraph 30(3) excluding Universal Credit non-dependant couples from the one-deduction couple rule. UC cases use the UC maximum award as the applicable amount with DWP-assessed UC income plus the actual UC award and DWP-assessed UC capital, and pension-age UC cases include the current Prescribed Requirements regulation 3 relevant-period and regulation 60A source exceptions. + +Added Forest of Dean District Council's 2026/27 Local Council Tax Support Scheme for Working Age Customers. Paragraph 1.4 confirms a banded discount scheme with two classes - Class A non-protected at 90 percent maximum support (paragraph 57.1) and Class B protected at 95 percent maximum support (paragraph 57.6), with both classes' eligible liability capped at the Band E equivalent for the dwelling. Paragraph 59.1 sets Class A's six income bands at 90 / 70 / 50 / 30 / 10 / 0 per cent and paragraph 59.3 sets Class B's at 95 / 75 / 55 / 35 / 15 / 0 per cent, each with separate Single, Couple, Lone Parent and Couple with Children weekly net-income tables. Class A/Class B criterion (g) places applicants on Income Support / income-based JSA / income-related ESA in the top income band. Section 15A uses DWP-assessed UC income plus the UC award and UC-assessed capital for UC claimants. Capital is excluded at 16,000 pounds (paragraph 33 / Class A and B criterion (f)). Section 58 keeps the prescribed Default Scheme gross-income non-dependant deductions of 5.20 / 10.60 / 13.30 / 15.95 pounds weekly with paragraph 58.3 applying the one-deduction couple rule to all couples including Universal Credit. Class B is keyed off the claimant, partner or any dependant (Class B paragraphs (h) and (i)) receiving Armed Forces Independence Payment / Attendance Allowance / Disability Living Allowance / Employment and Support Allowance / Personal Independence Payment / Severe Disability Allowance, plus Forest of Dean-scoped source inputs for War Pension / War Widow's Pension and the Work Capability Element of Universal Credit because PolicyEngine UK does not model those facts directly. Pension-age applicants without a working-age income-related benefit go to the prescribed pensioner scheme. + +Added Braintree District Council's 2026/27 Banded Discount Council Tax Reduction Scheme. Paragraph 48.1 caps the working-age maximum at 77 percent of council tax liability with no Band cap and no non-dependant deductions. Schedule 1 paragraph 1 sets weekly net-income ranges across six household types (Single / Couple x no / one / two-or-more children) with discount rates from 77 per cent down to 0 per cent, and Schedule 1 paragraph 7 places passported Income Support / income-related ESA / income-based JSA applicants at Band 1 (77 per cent). Paragraph 26.1 and Schedule 1 paragraph 5 exclude applicants whose capital is 10,000 pounds or greater. Paragraphs 12.2 to 12.5 use DWP-assessed Universal Credit income (annualised by multiplying by 12 and dividing by 52) plus the actual UC award and DWP-assessed UC capital. Paragraph 3 routes pension-age applicants on Universal Credit, Income Support, income-related ESA or income-based JSA into the local banded scheme, with relevant-period and regulation 60A Universal Credit source exceptions; pension-age applicants outside those local cases go to the prescribed pensioner scheme. diff --git a/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..aa1190bd6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the Adur Council Tax Support scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Adur Council Tax Support maximum support rate + reference: + - title: Adur Council Tax Support 2026-27 + href: https://www.adur-worthing.gov.uk/media/Media,174007,smxx.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..f048a1c0f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Adur Council Tax Support scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Adur Council Tax Support capital limit + reference: + - title: Adur Council Tax Support 2026-27 + href: https://www.adur-worthing.gov.uk/media/Media,174007,smxx.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..4d71a5eab --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Adur Council Tax Support scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Adur Council Tax Support withdrawal rate + reference: + - title: Adur Council Tax Support 2026-27 + href: https://www.adur-worthing.gov.uk/media/Media,174007,smxx.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..817c3e296 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/adur/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Adur Council Tax Support scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Adur Council Tax Support non-dependant deduction schedule + reference: + - title: Adur Council Tax Support 2026-27 + href: https://www.adur-worthing.gov.uk/media/Media,174007,smxx.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..0488195fa --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,11 @@ +description: Maximum weekly childcare deduction for one child under Arun's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + period: week + label: Arun Council Tax Reduction one-child childcare cap + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, section 38 + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..f3228a8d6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare deduction for two or more children under Arun's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + period: week + label: Arun Council Tax Reduction two-or-more-child childcare cap + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, section 38 + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/childcare/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/childcare/work_hours.yaml new file mode 100644 index 000000000..78a655573 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/childcare/work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly work hours threshold for childcare deductions under Arun's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Arun Council Tax Reduction childcare work hours + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, section 38 + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/additional_working.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/additional_working.yaml new file mode 100644 index 000000000..5e89a0785 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/additional_working.yaml @@ -0,0 +1,11 @@ +description: Additional weekly earnings disregard for source working-tax-credit or hours cases under Arun's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 17.10 +metadata: + unit: currency-GBP + period: week + label: Arun Council Tax Reduction additional working earnings disregard + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, Schedule 5 paragraph 18 + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/couple.yaml new file mode 100644 index 000000000..adc4da41c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/couple.yaml @@ -0,0 +1,11 @@ +description: Weekly earnings disregard for couples under Arun's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Arun Council Tax Reduction couple earnings disregard + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, Schedule 5 paragraph 8 + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/disability_or_carer.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/disability_or_carer.yaml new file mode 100644 index 000000000..163d0077b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/disability_or_carer.yaml @@ -0,0 +1,11 @@ +description: Weekly earnings disregard for source disability or carer cases under Arun's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Arun Council Tax Reduction disability or carer earnings disregard + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, Schedule 5 paragraphs 4 and 6 + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/lone_parent.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/lone_parent.yaml new file mode 100644 index 000000000..28d161131 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/lone_parent.yaml @@ -0,0 +1,11 @@ +description: Weekly earnings disregard for lone parents under Arun's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Arun Council Tax Reduction lone-parent earnings disregard + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, Schedule 5 paragraph 5 + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/standard.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/standard.yaml new file mode 100644 index 000000000..794c3c2c0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/earnings_disregard/standard.yaml @@ -0,0 +1,11 @@ +description: Standard weekly earnings disregard under Arun's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Arun Council Tax Reduction standard earnings disregard + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, Schedule 5 paragraph 11 + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/income_band/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/income_band/amount.yaml new file mode 100644 index 000000000..2e1de6c4f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/income_band/amount.yaml @@ -0,0 +1,38 @@ +description: Council Tax Reduction support rate by weekly net income band under Arun's working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 224 + amount: + 2026-04-01: 0.70 + - threshold: + 2026-04-01: 291 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 360 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 422 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 490 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Arun Council Tax Reduction weekly income support rate + reference: + - title: Arun District Council, Council Tax Reduction, working-age table + href: https://www.arun.gov.uk/council-tax-reduction/ + - title: Arun District Council, Changes are coming to the council tax reduction scheme, 16 February 2026 + href: https://www.arun.gov.uk/news-archive/changes-are-coming-to-the-council-tax-reduction-scheme-10380/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..153fb74cc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Working-age capital limit under Arun's Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Arun Council Tax Reduction capital limit + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, sections 1.7 and 19.0, Schedule 3 paragraph 6 + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/means_test/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/means_test/minimum_award.yaml new file mode 100644 index 000000000..6af8d9b8c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/means_test/minimum_award.yaml @@ -0,0 +1,13 @@ +description: Minimum weekly Council Tax Reduction award payable under Arun's working-age scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Arun Council Tax Reduction minimum weekly award + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, section 21.0(7) + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + - title: Arun District Council, Changes are coming to the council tax reduction scheme, 16 February 2026 + href: https://www.arun.gov.uk/news-archive/changes-are-coming-to-the-council-tax-reduction-scheme-10380/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..1cf02bb1d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,11 @@ +description: Weekly flat non-dependant deduction under Arun's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Arun Council Tax Reduction non-dependant deduction + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, section 22.0(1) + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..327b6cdf6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/arun/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly hours threshold for remunerative work under Arun's Council Tax Reduction scheme. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Arun Council Tax Reduction remunerative work hours + reference: + - title: Arun District Council Tax Reduction Scheme 2026/27, interpretation of remunerative work + href: https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819 + diff --git a/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..54add7d84 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard under Ashford's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Ashford Council Tax Reduction earnings disregard + reference: + - title: Ashford Borough Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..bee92970b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,35 @@ +description: Council Tax Reduction support rate by weekly income band for couples under Ashford's working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.90 + - threshold: + 2026-04-01: 168.76 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 232.31 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 295.86 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 359.42 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 422.97 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Ashford Council Tax Reduction couple weekly income support rate + reference: + - title: Ashford Borough Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..6a7749bb1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,35 @@ +description: Council Tax Reduction support rate by weekly income band for single applicants under Ashford's working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.90 + - threshold: + 2026-04-01: 127.12 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 190.67 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 254.22 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 317.78 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 381.33 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Ashford Council Tax Reduction single weekly income support rate + reference: + - title: Ashford Borough Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/income_disregard/disability_or_carer.yaml b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/income_disregard/disability_or_carer.yaml new file mode 100644 index 000000000..56a6c675b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/income_disregard/disability_or_carer.yaml @@ -0,0 +1,10 @@ +description: Weekly income disregard where the applicant, partner, or dependant receives DLA, PIP, or Carer's Allowance under Ashford's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 40 +metadata: + unit: currency-GBP + period: week + label: Ashford Council Tax Reduction disability or carer income disregard + reference: + - title: Ashford Borough Council Tax Reduction Scheme 2026/27, Schedule 3 paragraph 70 + href: https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..b964113ed --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Maximum English council tax band ratio eligible for Ashford Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Ashford Council Tax Reduction Band D liability cap ratio + reference: + - title: Ashford Borough Council Tax Reduction Scheme 2026/27, section 57 + href: https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..b5c5fa991 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under Ashford's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Ashford Council Tax Reduction capital limit + reference: + - title: Ashford Borough Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/means_test/tariff_income_increment.yaml b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/means_test/tariff_income_increment.yaml new file mode 100644 index 000000000..4843de1d5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/means_test/tariff_income_increment.yaml @@ -0,0 +1,10 @@ +description: Capital increment for each pound of weekly tariff income under Ashford's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Ashford Council Tax Reduction tariff income increment + reference: + - title: Ashford Borough Council Tax Reduction Scheme 2026/27, section 45 + href: https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..1c2a32958 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income applies under Ashford's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Ashford Council Tax Reduction tariff income threshold + reference: + - title: Ashford Borough Council Tax Reduction Scheme 2026/27, section 45 + href: https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..55ff406a8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ashford/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly working-age non-dependant deduction under Ashford's Council Tax Reduction scheme. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Ashford Council Tax Reduction non-dependant deduction + reference: + - title: Ashford Borough Council Tax Reduction Scheme 2026/27, section 58 + href: https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..a878cb2a7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum Council Tax Reduction rate under the Babergh working-age scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Babergh Council Tax Reduction maximum support rate + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, paragraph 57.1 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..3304eba97 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under the Babergh working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Babergh Council Tax Reduction capital limit + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, paragraphs 1.9.7, 1.10.7, 1.11.7, and 34.1 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/minimum_award.yaml new file mode 100644 index 000000000..1275a4856 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Weekly minimum payable Council Tax Reduction under the Babergh working-age scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Babergh Council Tax Reduction minimum weekly award + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, paragraph 57.7 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..fe769cfaf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income amount per capital step under the Babergh working-age Council Tax Reduction scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Babergh Council Tax Reduction tariff income amount + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, paragraph 42.1 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..385abb007 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step used to calculate tariff income under the Babergh working-age Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Babergh Council Tax Reduction tariff income capital step + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, paragraph 42.1 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..1534b0e32 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income applies under the Babergh working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Babergh Council Tax Reduction tariff income threshold + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, paragraph 42.1 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..2294c92ed --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate applied to excess income under the Babergh working-age Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Babergh Council Tax Reduction excess income withdrawal rate + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, paragraph 59.1 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..860765cc0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,31 @@ +description: Weekly non-dependant deduction schedule under the Babergh working-age Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + threshold_unit: currency-GBP + period: week + type: single_amount + label: Babergh Council Tax Reduction non-dependant deduction amount + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, paragraph 58.1 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf + - title: Babergh Council Tax Reduction live page, non-dependant deductions for 2026/27 + href: https://www.babergh.gov.uk/w/council-tax-reduction-low-income + - title: Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2026, regulation 5(3) + href: https://www.legislation.gov.uk/uksi/2026/27/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..f119fcc6e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly hours threshold for remunerative work under the Babergh working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Babergh Council Tax Reduction remunerative work hours threshold + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, paragraphs 6.1 and 58.1 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/uc_earnings_contribution/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/uc_earnings_contribution/amount.yaml new file mode 100644 index 000000000..5800bedf3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/uc_earnings_contribution/amount.yaml @@ -0,0 +1,37 @@ +description: Weekly Council Tax Reduction contribution by monthly Universal Credit assessed earnings under the Babergh working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0 + - threshold: + 2026-04-01: 326 + amount: + 2026-04-01: 12.46 + - threshold: + 2026-04-01: 686 + amount: + 2026-04-01: 23.54 + - threshold: + 2026-04-01: 1_306 + amount: + 2026-04-01: 33.46 + - threshold: + 2026-04-01: 2_077 + amount: + 2026-04-01: 49.85 + - threshold: + 2026-04-01: 2_669 + amount: + 2026-04-01: 65.31 +metadata: + amount_unit: currency-GBP + threshold_unit: currency-GBP + period: week + type: single_amount + label: Babergh Council Tax Reduction UC earnings contribution amount + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, Schedule 5 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf + - title: Babergh Council Tax Reduction live page, income bands and contribution rates for 2026/27 + href: https://www.babergh.gov.uk/w/council-tax-reduction-low-income diff --git a/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/uc_earnings_contribution/no_entitlement_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/uc_earnings_contribution/no_entitlement_threshold.yaml new file mode 100644 index 000000000..ec4d1ce2d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/babergh/council_tax_reduction/uc_earnings_contribution/no_entitlement_threshold.yaml @@ -0,0 +1,12 @@ +description: Monthly Universal Credit assessed earnings threshold at which the Babergh working-age scheme gives no Council Tax Reduction. +values: + 2026-04-01: 3_000 +metadata: + unit: currency-GBP + period: month + label: Babergh Council Tax Reduction UC no-entitlement earnings threshold + reference: + - title: Babergh Council Tax Reduction Scheme 2026/27, Schedule 5 + href: https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf + - title: Babergh Council Tax Reduction live page, income bands and contribution rates for 2026/27 + href: https://www.babergh.gov.uk/w/council-tax-reduction-low-income diff --git a/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..3a609cc02 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net income band for Barking and Dagenham couple working-age households. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.63 + - threshold: + 2026-04-01: 174.01 + amount: + 2026-04-01: 0.48 + - threshold: + 2026-04-01: 219.01 + amount: + 2026-04-01: 0.33 + - threshold: + 2026-04-01: 261.01 + amount: + 2026-04-01: 0.18 + - threshold: + 2026-04-01: 289.01 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 308.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Barking and Dagenham couple weekly net-income CTR rate + reference: + - title: Barking and Dagenham CTSS 2026/27 Appendix 2, Table 1 + href: https://lbbd.moderngov.co.uk/documents/s178487/CTSS%202026-27%20-%20App%202.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/couple_one_child.yaml new file mode 100644 index 000000000..3313952be --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/couple_one_child.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net income band for Barking and Dagenham couple working-age households with one child or qualifying young person. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.63 + - threshold: + 2026-04-01: 265.01 + amount: + 2026-04-01: 0.48 + - threshold: + 2026-04-01: 321.01 + amount: + 2026-04-01: 0.33 + - threshold: + 2026-04-01: 374.01 + amount: + 2026-04-01: 0.18 + - threshold: + 2026-04-01: 404.01 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 432.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Barking and Dagenham couple one-child weekly net-income CTR rate + reference: + - title: Barking and Dagenham CTSS 2026/27 Appendix 2, Table 1 + href: https://lbbd.moderngov.co.uk/documents/s178487/CTSS%202026-27%20-%20App%202.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/couple_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/couple_two_or_more_children.yaml new file mode 100644 index 000000000..92ddd1ecd --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/couple_two_or_more_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net income band for Barking and Dagenham couple working-age households with two or more children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.63 + - threshold: + 2026-04-01: 367.01 + amount: + 2026-04-01: 0.48 + - threshold: + 2026-04-01: 446.01 + amount: + 2026-04-01: 0.33 + - threshold: + 2026-04-01: 495.01 + amount: + 2026-04-01: 0.18 + - threshold: + 2026-04-01: 549.01 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 589.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Barking and Dagenham couple two-child weekly net-income CTR rate + reference: + - title: Barking and Dagenham CTSS 2026/27 Appendix 2, Table 1 + href: https://lbbd.moderngov.co.uk/documents/s178487/CTSS%202026-27%20-%20App%202.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..e8d112af3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net income band for Barking and Dagenham single working-age households. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.63 + - threshold: + 2026-04-01: 102.01 + amount: + 2026-04-01: 0.48 + - threshold: + 2026-04-01: 152.01 + amount: + 2026-04-01: 0.33 + - threshold: + 2026-04-01: 182.01 + amount: + 2026-04-01: 0.18 + - threshold: + 2026-04-01: 205.01 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 231.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Barking and Dagenham single weekly net-income CTR rate + reference: + - title: Barking and Dagenham CTSS 2026/27 Appendix 2, Table 1 + href: https://lbbd.moderngov.co.uk/documents/s178487/CTSS%202026-27%20-%20App%202.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/single_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/single_one_child.yaml new file mode 100644 index 000000000..fac027bf4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/single_one_child.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net income band for Barking and Dagenham single working-age households with one child or qualifying young person. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.63 + - threshold: + 2026-04-01: 192.01 + amount: + 2026-04-01: 0.48 + - threshold: + 2026-04-01: 244.01 + amount: + 2026-04-01: 0.33 + - threshold: + 2026-04-01: 280.01 + amount: + 2026-04-01: 0.18 + - threshold: + 2026-04-01: 323.01 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 357.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Barking and Dagenham single one-child weekly net-income CTR rate + reference: + - title: Barking and Dagenham CTSS 2026/27 Appendix 2, Table 1 + href: https://lbbd.moderngov.co.uk/documents/s178487/CTSS%202026-27%20-%20App%202.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/single_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/single_two_or_more_children.yaml new file mode 100644 index 000000000..01b2cee0f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/income_band/single_two_or_more_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net income band for Barking and Dagenham single working-age households with two or more children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.63 + - threshold: + 2026-04-01: 292.01 + amount: + 2026-04-01: 0.48 + - threshold: + 2026-04-01: 362.01 + amount: + 2026-04-01: 0.33 + - threshold: + 2026-04-01: 414.01 + amount: + 2026-04-01: 0.18 + - threshold: + 2026-04-01: 467.01 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 500.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Barking and Dagenham single two-child weekly net-income CTR rate + reference: + - title: Barking and Dagenham CTSS 2026/27 Appendix 2, Table 1 + href: https://lbbd.moderngov.co.uk/documents/s178487/CTSS%202026-27%20-%20App%202.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..06f19710f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Working-age capital limit for Barking and Dagenham Council Tax Support. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Barking and Dagenham working-age CTS capital limit + reference: + - title: Barking and Dagenham Council Tax Reduction Scheme 2025/26, paragraph 11 and Appendix 3 + href: https://www.lbbd.gov.uk/sites/default/files/2025-09/Barking%20and%20Dagenham%20CTS%20scheme%202025-26.pdf + - title: Barking and Dagenham CTSS 2026/27 Appendix 2 + href: https://lbbd.moderngov.co.uk/documents/s178487/CTSS%202026-27%20-%20App%202.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..c265e8432 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barking_and_dagenham/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,12 @@ +description: Flat weekly working-age non-dependant deduction for Barking and Dagenham Council Tax Support. +values: + 2026-04-01: 15 +metadata: + unit: currency-GBP + period: week + label: Barking and Dagenham working-age CTS non-dependant deduction + reference: + - title: Barking and Dagenham Council Tax Reduction Scheme 2025/26, paragraph 53 and Appendix 3 + href: https://www.lbbd.gov.uk/sites/default/files/2025-09/Barking%20and%20Dagenham%20CTS%20scheme%202025-26.pdf + - title: Barking and Dagenham CTSS 2026/27 Appendix 2 + href: https://lbbd.moderngov.co.uk/documents/s178487/CTSS%202026-27%20-%20App%202.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/income_band/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/income_band/maximum_support_rate.yaml new file mode 100644 index 000000000..c13bbe60a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/income_band/maximum_support_rate.yaml @@ -0,0 +1,37 @@ +description: Council Tax Support rate by monthly earned income band for ordinary working-age Barnet applicants. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.70 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 500.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 800.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 1_400.01 + amount: + 2026-04-01: 0.12 + - threshold: + 2026-04-01: 2_000.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: month + threshold_unit: currency-GBP + type: single_amount + label: Barnet monthly earnings CTR rate + reference: + - title: Barnet Council Tax Reduction Scheme 2026-2027, paragraph 9 + href: https://barnet.moderngov.co.uk/documents/s94210/Appendix%20O%20-%20202627%20Council%20Tax%20Support%20Scheme.pdf + - title: Barnet Council Tax Support public summary + href: https://www.barnet.gov.uk/council-tax/discounts-exemptions-and-refunds/council-tax-support-low-income-benefits diff --git a/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..3da9bdecc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,11 @@ +description: Maximum English council tax band ratio eligible for ordinary working-age Barnet Council Tax Support. +values: + 2026-04-01: 0.8888888889 +metadata: + unit: /1 + label: Barnet CTR Band C liability cap ratio + reference: + - title: Barnet Council Tax Reduction Scheme 2026-2027, paragraphs 11 and 34-35 + href: https://barnet.moderngov.co.uk/documents/s94210/Appendix%20O%20-%20202627%20Council%20Tax%20Support%20Scheme.pdf + - title: Barnet Council Tax Support public summary + href: https://www.barnet.gov.uk/council-tax/discounts-exemptions-and-refunds/council-tax-support-low-income-benefits diff --git a/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..84421cfbe --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Working-age capital limit for Barnet Council Tax Support. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Barnet working-age CTS capital limit + reference: + - title: Barnet Council Tax Reduction Scheme 2026-2027, paragraphs 12 and 26 + href: https://barnet.moderngov.co.uk/documents/s94210/Appendix%20O%20-%20202627%20Council%20Tax%20Support%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..55dc38e3c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/barnet/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,21 @@ +description: Working-age non-dependant deduction by weekly gross income for Barnet Council Tax Support. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5 + - threshold: + 2026-04-01: 200 + amount: + 2026-04-01: 11 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Barnet working-age CTS non-dependant deduction + reference: + - title: Barnet Council Tax Reduction Scheme 2026-2027, paragraphs 47-49 + href: https://barnet.moderngov.co.uk/documents/s94210/Appendix%20O%20-%20202627%20Council%20Tax%20Support%20Scheme.pdf + - title: Barnet Council Tax Support public summary + href: https://www.barnet.gov.uk/council-tax/discounts-exemptions-and-refunds/council-tax-support-low-income-benefits diff --git a/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..9ee7e95d0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from earnings for Basildon Council Tax Reduction with one eligible child. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + period: week + label: Basildon Council Tax Reduction one-child weekly childcare deduction cap + reference: + - title: Basildon Council Tax Reduction Scheme 2026/27, paragraph 14.3 + href: https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763 diff --git a/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..8aa94a653 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from earnings for Basildon Council Tax Reduction with two or more eligible children. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + period: week + label: Basildon Council Tax Reduction two-or-more-child weekly childcare deduction cap + reference: + - title: Basildon Council Tax Reduction Scheme 2026/27, paragraph 14.3 + href: https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763 diff --git a/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..261453300 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard under the Basildon working-age Council Tax Reduction scheme. +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Basildon Council Tax Reduction earnings disregard + reference: + - title: Basildon Council Tax Reduction Scheme 2026/27, paragraphs 12.6, 23.2, and 25.2 + href: https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763 diff --git a/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/income_band/no_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/income_band/no_dependants.yaml new file mode 100644 index 000000000..0717e7d25 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/income_band/no_dependants.yaml @@ -0,0 +1,29 @@ +description: Council Tax Reduction rate by weekly income band for Basildon working-age households with no dependent children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 100.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 175.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 250.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Basildon no-dependant weekly income-band CTR rate + reference: + - title: Basildon Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763 + - title: Basildon Working Age Claimant Council Tax Reduction + href: https://www.basildon.gov.uk/article/7377/Working-Age-Claimant-Council-Tax-Reduction diff --git a/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/income_band/one_dependent.yaml b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/income_band/one_dependent.yaml new file mode 100644 index 000000000..cab815ae1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/income_band/one_dependent.yaml @@ -0,0 +1,33 @@ +description: Council Tax Reduction rate by weekly income band for Basildon working-age households with one dependent child or qualifying young person. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 100.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 175.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 250.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 325.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Basildon one-dependent weekly income-band CTR rate + reference: + - title: Basildon Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763 + - title: Basildon Working Age Claimant Council Tax Reduction + href: https://www.basildon.gov.uk/article/7377/Working-Age-Claimant-Council-Tax-Reduction diff --git a/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/income_band/two_or_more_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/income_band/two_or_more_dependants.yaml new file mode 100644 index 000000000..2cab6252e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/income_band/two_or_more_dependants.yaml @@ -0,0 +1,37 @@ +description: Council Tax Reduction rate by weekly income band for Basildon working-age households with two or more dependent children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 100.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 175.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 250.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 325.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 400.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Basildon two-or-more-dependant weekly income-band CTR rate + reference: + - title: Basildon Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763 + - title: Basildon Working Age Claimant Council Tax Reduction + href: https://www.basildon.gov.uk/article/7377/Working-Age-Claimant-Council-Tax-Reduction diff --git a/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..5134abb6b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basildon/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit under the Basildon working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Basildon Council Tax Reduction capital limit + reference: + - title: Basildon Council Tax Reduction Scheme 2026/27, Class D, paragraph 30.1, and Schedule 1 paragraph 6 + href: https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763 + - title: Basildon Working Age Claimant Council Tax Reduction + href: https://www.basildon.gov.uk/article/7377/Working-Age-Claimant-Council-Tax-Reduction diff --git a/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..60b181521 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the Basingstoke and Deane Council Tax Support scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Basingstoke and Deane Council Tax Support maximum support rate + reference: + - title: Basingstoke and Deane Council Tax Support Scheme 2026/27 + href: https://www.basingstoke.gov.uk/content/page/77332/Basingstoke%20S13A%202026%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..ed8fe6d0d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Basingstoke and Deane Council Tax Support scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Basingstoke and Deane Council Tax Support capital limit + reference: + - title: Basingstoke and Deane Council Tax Support Scheme 2026/27 + href: https://www.basingstoke.gov.uk/content/page/77332/Basingstoke%20S13A%202026%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..be8953d4e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Basingstoke and Deane Council Tax Support scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Basingstoke and Deane Council Tax Support withdrawal rate + reference: + - title: Basingstoke and Deane Council Tax Support Scheme 2026/27 + href: https://www.basingstoke.gov.uk/content/page/77332/Basingstoke%20S13A%202026%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..6d13a8990 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Basingstoke and Deane Council Tax Support scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Basingstoke and Deane Council Tax Support non-dependant deduction schedule + reference: + - title: Basingstoke and Deane Council Tax Support Scheme 2026/27 + href: https://www.basingstoke.gov.uk/content/page/77332/Basingstoke%20S13A%202026%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..22d0ee2ad --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from income for Bassetlaw Council Tax Reduction with one eligible child. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + period: week + label: Bassetlaw Council Tax Reduction one-child weekly childcare deduction cap + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraph 41 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..afcbe5fe2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from income for Bassetlaw Council Tax Reduction with two or more eligible children. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + period: week + label: Bassetlaw Council Tax Reduction two-or-more-child weekly childcare deduction cap + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraph 41 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/childcare/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/childcare/work_hours.yaml new file mode 100644 index 000000000..b763f8060 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/childcare/work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly work hours threshold for Bassetlaw Council Tax Reduction childcare deductions. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Bassetlaw Council Tax Reduction childcare work hours + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraphs 10 and 42 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/couple.yaml new file mode 100644 index 000000000..a44e419eb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/couple.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Bassetlaw couples not qualifying for a higher disregard. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Bassetlaw Council Tax Reduction couple earnings disregard + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, Schedule 3 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/disabled_or_carer.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/disabled_or_carer.yaml new file mode 100644 index 000000000..9f6c76a97 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/disabled_or_carer.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Bassetlaw disabled-premium or carer cases. +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Bassetlaw Council Tax Reduction disabled or carer earnings disregard + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, Schedule 3 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/lone_parent.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/lone_parent.yaml new file mode 100644 index 000000000..8717dc50e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/lone_parent.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Bassetlaw lone parents. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Bassetlaw Council Tax Reduction lone-parent earnings disregard + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, Schedule 3 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/single.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/single.yaml new file mode 100644 index 000000000..49f5523cc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/single.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Bassetlaw single claimants not qualifying for a higher disregard. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Bassetlaw Council Tax Reduction single earnings disregard + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, Schedule 3 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/worker_addition.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/worker_addition.yaml new file mode 100644 index 000000000..8c073b16c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/earnings_disregard/worker_addition.yaml @@ -0,0 +1,10 @@ +description: Additional weekly earnings disregard for Bassetlaw qualifying worker cases. +values: + 2026-04-01: 17.10 +metadata: + unit: currency-GBP + period: week + label: Bassetlaw Council Tax Reduction qualifying worker earnings disregard addition + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, Schedule 3 paragraph 18 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/income_band/support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/income_band/support_rate.yaml new file mode 100644 index 000000000..6f62f3182 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/income_band/support_rate.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction support rate by weekly income band under Bassetlaw's working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.88 + - threshold: + 2026-04-01: 103.80 + amount: + 2026-04-01: 0.65 + - threshold: + 2026-04-01: 232.73 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 308.58 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 421.75 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Bassetlaw Council Tax Reduction weekly income support rate + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraph 27 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/income_band/vulnerable_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/income_band/vulnerable_support_rate.yaml new file mode 100644 index 000000000..3f55b458b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/income_band/vulnerable_support_rate.yaml @@ -0,0 +1,10 @@ +description: Council Tax Reduction support rate for Bassetlaw vulnerable Class G claimants. +values: + 2026-04-01: 0.95 +metadata: + unit: /1 + period: year + label: Bassetlaw Council Tax Reduction vulnerable class support rate + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraphs 15 and 25 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..3632418af --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Maximum English council tax band ratio eligible for Bassetlaw Council Tax Reduction. +values: + 2026-04-01: 0.888888889 +metadata: + unit: /1 + period: year + label: Bassetlaw Council Tax Reduction Band C liability cap ratio + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraph 25 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..65e08c7c3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under Bassetlaw's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Bassetlaw Council Tax Reduction capital limit + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraph 21 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/means_test/tariff_income_increment.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/means_test/tariff_income_increment.yaml new file mode 100644 index 000000000..d8aa37a83 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/means_test/tariff_income_increment.yaml @@ -0,0 +1,10 @@ +description: Capital increment for each pound of weekly tariff income under Bassetlaw's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Bassetlaw Council Tax Reduction tariff income increment + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraph 56 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..48c0b04c9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income applies under Bassetlaw's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Bassetlaw Council Tax Reduction tariff income threshold + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraph 56 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/non_dep_deduction/non_working_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/non_dep_deduction/non_working_amount.yaml new file mode 100644 index 000000000..f7e76d77b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/non_dep_deduction/non_working_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly non-dependant deduction for Bassetlaw non-remunerative-work non-dependants. +values: + 2026-04-01: 4 +metadata: + unit: currency-GBP + period: week + label: Bassetlaw Council Tax Reduction non-working non-dependant deduction + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraph 26 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/non_dep_deduction/remunerative_work_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/non_dep_deduction/remunerative_work_amount.yaml new file mode 100644 index 000000000..86b920f64 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/non_dep_deduction/remunerative_work_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly non-dependant deduction for Bassetlaw remunerative-work non-dependants. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Bassetlaw Council Tax Reduction remunerative-work non-dependant deduction + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraph 26 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..8d5d6abe7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bassetlaw/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly hours threshold for remunerative work in Bassetlaw Council Tax Reduction. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Bassetlaw Council Tax Reduction remunerative work hours + reference: + - title: Bassetlaw District Council Tax Reduction Scheme 2026/27, paragraphs 10 and 26 + href: https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/income_band/child_increment.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/income_band/child_increment.yaml new file mode 100644 index 000000000..0419f85c9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/income_band/child_increment.yaml @@ -0,0 +1,10 @@ +description: Weekly UC Class F income-band threshold increase for each child or young person, capped at two children, under Bath and North East Somerset's Council Tax Reduction scheme. +values: + 2026-04-01: 50 +metadata: + unit: currency-GBP + period: week + label: Bath and North East Somerset Council Tax Reduction child income-band increment + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/income_band/couple/support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/income_band/couple/support_rate.yaml new file mode 100644 index 000000000..8a704a78e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/income_band/couple/support_rate.yaml @@ -0,0 +1,35 @@ +description: UC Class F support rates by weekly income for couples under Bath and North East Somerset's Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 153.93 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 253.93 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 353.93 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 453.93 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 503.93 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Bath and North East Somerset couple UC CTR support rate + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/income_band/single/support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/income_band/single/support_rate.yaml new file mode 100644 index 000000000..5bfb16122 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/income_band/single/support_rate.yaml @@ -0,0 +1,35 @@ +description: UC Class F support rates by weekly income for single applicants under Bath and North East Somerset's Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 98.06 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 198.06 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 298.06 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 398.06 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 448.06 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Bath and North East Somerset single UC CTR support rate + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..541d74cb1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Ordinary maximum Council Tax band ratio under Bath and North East Somerset's non-UC working-age Council Tax Reduction scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Bath and North East Somerset Council Tax Reduction ordinary maximum liability band ratio + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..345cbf7ae --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Ordinary maximum support rate under Bath and North East Somerset's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 0.78 +metadata: + unit: /1 + period: year + label: Bath and North East Somerset Council Tax Reduction ordinary maximum support rate + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..c2e8e86d8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Ordinary non-UC capital limit under Bath and North East Somerset's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Bath and North East Somerset Council Tax Reduction ordinary capital limit + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/protected_capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/protected_capital_limit.yaml new file mode 100644 index 000000000..7133b0e7c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/protected_capital_limit.yaml @@ -0,0 +1,10 @@ +description: Protected non-UC capital limit under Bath and North East Somerset's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Bath and North East Somerset Council Tax Reduction protected capital limit + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..75358739d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income amount per complete capital block under Bath and North East Somerset's non-UC working-age Council Tax Reduction scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Bath and North East Somerset Council Tax Reduction tariff income amount + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..1aeeb94a3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Complete capital block size for tariff income under Bath and North East Somerset's non-UC working-age Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Bath and North East Somerset Council Tax Reduction tariff income step + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..6fe65c302 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income applies under Bath and North East Somerset's non-UC working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Bath and North East Somerset Council Tax Reduction tariff income threshold + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/uc_capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/uc_capital_limit.yaml new file mode 100644 index 000000000..21ec9bb3c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/uc_capital_limit.yaml @@ -0,0 +1,10 @@ +description: Universal Credit capital limit under Bath and North East Somerset's Class F Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Bath and North East Somerset Council Tax Reduction UC capital limit + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..5095114f5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate on income above the applicable amount under Bath and North East Somerset's non-UC working-age Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Bath and North East Somerset Council Tax Reduction withdrawal rate + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/protected_maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/protected_maximum_support_rate.yaml new file mode 100644 index 000000000..af8897c15 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/protected_maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Protected maximum support rate under Bath and North East Somerset's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Bath and North East Somerset Council Tax Reduction protected maximum support rate + reference: + - title: Bath and North East Somerset Council Tax Reduction Scheme 2026/27 + href: https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..b93f20f0c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the Bolton Council Tax Reduction scheme. +values: + 2026-04-01: 0.825 +metadata: + unit: /1 + period: year + label: Bolton Council Tax Reduction maximum support rate + reference: + - title: Bolton Council Tax Reduction Scheme 2026/27 + href: https://www.bolton.gov.uk/downloads/file/745/bolton-council-tax-reduction-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..399dcfe29 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Bolton Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Bolton Council Tax Reduction capital limit + reference: + - title: Bolton Council Tax Reduction Scheme 2026/27 + href: https://www.bolton.gov.uk/downloads/file/745/bolton-council-tax-reduction-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..5c1e17aa4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Bolton Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Bolton Council Tax Reduction withdrawal rate + reference: + - title: Bolton Council Tax Reduction Scheme 2026/27 + href: https://www.bolton.gov.uk/downloads/file/745/bolton-council-tax-reduction-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..5b11a5145 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bolton/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Bolton Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Bolton Council Tax Reduction non-dependant deduction schedule + reference: + - title: Bolton Council Tax Reduction Scheme 2026/27 + href: https://www.bolton.gov.uk/downloads/file/745/bolton-council-tax-reduction-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/couple_no_children.yaml b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/couple_no_children.yaml new file mode 100644 index 000000000..5fc717bda --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/couple_no_children.yaml @@ -0,0 +1,27 @@ +description: Braintree weekly income-band CTR rate for couples with no children. Schedule 1 paragraph 1 sets the table at 77/50/25/0/0 per cent across the GBP 0.00-125.00, GBP 125.01-200.00, GBP 200.01-275.00, GBP 275.01-350.00 and GBP 350.01-450.00 net weekly income bands, with 0 per cent above GBP 450. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.77 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Braintree weekly income-band CTR rate, couple no children + reference: + - title: Braintree District Council - Council Tax Reduction Scheme 2026/27, Schedule 1 paragraph 1 + href: https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/couple_one_child.yaml new file mode 100644 index 000000000..475f7a7d7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/couple_one_child.yaml @@ -0,0 +1,31 @@ +description: Braintree weekly income-band CTR rate for couples with one child. Schedule 1 paragraph 1 sets the table at 77/50/25/15/0 per cent across the GBP 0.00-125.00, GBP 125.01-200.00, GBP 200.01-275.00, GBP 275.01-350.00 and GBP 350.01-450.00 net weekly income bands, with 0 per cent above GBP 450. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.77 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 350.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Braintree weekly income-band CTR rate, couple one child + reference: + - title: Braintree District Council - Council Tax Reduction Scheme 2026/27, Schedule 1 paragraph 1 + href: https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/couple_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/couple_two_or_more_children.yaml new file mode 100644 index 000000000..f769c27c1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/couple_two_or_more_children.yaml @@ -0,0 +1,31 @@ +description: Braintree weekly income-band CTR rate for couples with two or more children. Schedule 1 paragraph 1 sets the table at 77/77/50/25/15 per cent across the GBP 0.00-125.00, GBP 125.01-200.00, GBP 200.01-275.00, GBP 275.01-350.00 and GBP 350.01-450.00 net weekly income bands, with 0 per cent above GBP 450. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.77 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 350.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 450.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Braintree weekly income-band CTR rate, couple two or more children + reference: + - title: Braintree District Council - Council Tax Reduction Scheme 2026/27, Schedule 1 paragraph 1 + href: https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/single_no_children.yaml b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/single_no_children.yaml new file mode 100644 index 000000000..836ab8928 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/single_no_children.yaml @@ -0,0 +1,27 @@ +description: Braintree weekly income-band CTR rate for single applicants with no children. Schedule 1 paragraph 1 sets the table at 77/50/25/0/0 per cent across the GBP 0.00-125.00, GBP 125.01-200.00, GBP 200.01-275.00, GBP 275.01-350.00 and GBP 350.01-450.00 net weekly income bands, with 0 per cent above GBP 450. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.77 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Braintree weekly income-band CTR rate, single applicant no children + reference: + - title: Braintree District Council - Council Tax Reduction Scheme 2026/27, Schedule 1 paragraph 1 + href: https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/single_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/single_one_child.yaml new file mode 100644 index 000000000..fc9c0e7c5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/single_one_child.yaml @@ -0,0 +1,31 @@ +description: Braintree weekly income-band CTR rate for single applicants with one child. Schedule 1 paragraph 1 sets the table at 77/50/25/15/0 per cent across the GBP 0.00-125.00, GBP 125.01-200.00, GBP 200.01-275.00, GBP 275.01-350.00 and GBP 350.01-450.00 net weekly income bands, with 0 per cent above GBP 450. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.77 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 350.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Braintree weekly income-band CTR rate, single applicant one child + reference: + - title: Braintree District Council - Council Tax Reduction Scheme 2026/27, Schedule 1 paragraph 1 + href: https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/single_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/single_two_or_more_children.yaml new file mode 100644 index 000000000..ddee5ce68 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/income_band/single_two_or_more_children.yaml @@ -0,0 +1,31 @@ +description: Braintree weekly income-band CTR rate for single applicants with two or more children. Schedule 1 paragraph 1 sets the table at 77/77/50/25/15 per cent across the GBP 0.00-125.00, GBP 125.01-200.00, GBP 200.01-275.00, GBP 275.01-350.00 and GBP 350.01-450.00 net weekly income bands, with 0 per cent above GBP 450. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.77 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 350.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 450.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Braintree weekly income-band CTR rate, single applicant two or more children + reference: + - title: Braintree District Council - Council Tax Reduction Scheme 2026/27, Schedule 1 paragraph 1 + href: https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..f68998c17 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Braintree maximum Council Tax Reduction rate. Paragraph 48.1 sets the working-age maximum at 77 per cent of council tax liability, without any Band cap or non-dependant deduction. +values: + 2026-04-01: 0.77 +metadata: + unit: /1 + period: year + label: Braintree Council Tax Reduction maximum support rate + reference: + - title: Braintree District Council - Council Tax Reduction Scheme 2026/27, paragraph 48.1 + href: https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..dcb55e923 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/braintree/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Braintree Council Tax Reduction working-age capital limit. Paragraph 26.1 and Schedule 1 paragraph 5 exclude applicants whose capital is 10,000 pounds or greater. +values: + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Braintree Council Tax Reduction capital limit + reference: + - title: Braintree District Council - Council Tax Reduction Scheme 2026/27, paragraph 26.1 and Schedule 1 paragraph 5 + href: https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..616629051 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Breckland Council Tax Reduction scheme. +values: + 2025-04-01: 0.915 + 2026-04-01: 0.915 +metadata: + unit: /1 + period: year + label: Breckland Council Tax Reduction maximum support rate + reference: + - title: Breckland Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Breckland-Council-Tax-Reduction-Scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..4aee06819 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the Breckland Council Tax Reduction scheme. +values: + 2025-04-01: 10_000 + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Breckland Council Tax Reduction capital limit + reference: + - title: Breckland Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Breckland-Council-Tax-Reduction-Scheme-2025-26.pdf + - title: Anglia Revenues Partnership Apply for Council Tax Reduction and or Housing Benefit + href: https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ diff --git a/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..995cd8ce0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate for working-age households under the Breckland Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Breckland Council Tax Reduction withdrawal rate + reference: + - title: Breckland Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Breckland-Council-Tax-Reduction-Scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..1f09424d4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/breckland/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly non-dependant deduction under the Breckland Council Tax Reduction scheme for working-age households. +values: + 2025-04-01: 8.03 + 2026-04-01: 8.34 +metadata: + unit: currency-GBP + period: week + label: Breckland Council Tax Reduction working-age non-dependant deduction amount + reference: + - title: Breckland Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Breckland-Council-Tax-Reduction-Scheme-2025-26.pdf + - title: Anglia Revenues Partnership Council Tax Reduction non-dependant deductions + href: https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm diff --git a/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/income_band/support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/income_band/support_rate.yaml new file mode 100644 index 000000000..364498b2a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/income_band/support_rate.yaml @@ -0,0 +1,31 @@ +description: Council Tax Support rate by weekly claimant and partner earnings for ordinary working-age Brent applicants. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.65 + - threshold: + 2026-04-01: 81 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 110.01 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 151 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 250.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Brent weekly earnings Council Tax Support rate + reference: + - title: Brent Council Tax Support + href: https://www.brent.gov.uk/council-tax/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..4311c0ad4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,9 @@ +description: Savings limit for working-age Brent Council Tax Support. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + label: Brent working-age Council Tax Support savings limit + reference: + - title: Brent Council Tax Support + href: https://www.brent.gov.uk/council-tax/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/non_dep_deduction/not_working_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/non_dep_deduction/not_working_amount.yaml new file mode 100644 index 000000000..e24146675 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/non_dep_deduction/not_working_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly non-dependant deduction for Brent Council Tax Support when the non-dependant is not working. +values: + 2026-04-01: 8 +metadata: + unit: currency-GBP + period: week + label: Brent non-working non-dependant weekly Council Tax Support deduction + reference: + - title: Brent Council Tax Support + href: https://www.brent.gov.uk/council-tax/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/non_dep_deduction/working_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/non_dep_deduction/working_amount.yaml new file mode 100644 index 000000000..92cc9aa55 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/brent/council_tax_reduction/non_dep_deduction/working_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly non-dependant deduction for Brent Council Tax Support when the non-dependant is working. +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Brent working non-dependant weekly Council Tax Support deduction + reference: + - title: Brent Council Tax Support + href: https://www.brent.gov.uk/council-tax/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/income_band/no_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/income_band/no_dependants.yaml new file mode 100644 index 000000000..6f28dfb34 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/income_band/no_dependants.yaml @@ -0,0 +1,27 @@ +description: Council Tax Reduction discount rate by weekly income band for Brentwood single applicants and couples without dependants. From the Schedule 1 banded discount table - Band 1 (75%) for weekly income up to GBP 75, then 75/50/25/0/0 across the higher bands. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 150.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Brentwood weekly income-band CTR rate, no dependants + reference: + - title: Brentwood Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/income_band/one_dependant.yaml b/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/income_band/one_dependant.yaml new file mode 100644 index 000000000..c09ca99e1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/income_band/one_dependant.yaml @@ -0,0 +1,27 @@ +description: Council Tax Reduction discount rate by weekly income band for Brentwood single applicants and couples with one dependant. From the Schedule 1 banded discount table - Band 1 (75%) for weekly income up to GBP 75, then 75/50/50/25/25 across the higher bands. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 150.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 450.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Brentwood weekly income-band CTR rate, one dependant + reference: + - title: Brentwood Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/income_band/two_or_more_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/income_band/two_or_more_dependants.yaml new file mode 100644 index 000000000..ca2cf7a77 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/income_band/two_or_more_dependants.yaml @@ -0,0 +1,27 @@ +description: Council Tax Reduction discount rate by weekly income band for Brentwood single applicants and couples with two or more dependants. Schedule 1 paragraph 5 caps the dependant count at two for band selection. Discount rates 75/75/50/50/25 across the bands. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 450.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Brentwood weekly income-band CTR rate, two or more dependants + reference: + - title: Brentwood Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..f57c3971b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/brentwood/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Brentwood Borough Council Council Tax Reduction Scheme. No reduction is granted when the applicant has capital greater than this level. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Brentwood Council Tax Reduction capital limit + reference: + - title: Brentwood Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 30.1 and Schedule 1 paragraph 6 + href: https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..d6ee1c26b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered by Bristol working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Bristol working-age Council Tax Reduction maximum support rate + reference: + - title: Bristol Council Tax Reduction Scheme 2026-27, paragraph 33 + href: https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file diff --git a/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..459dc66e5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for Bristol working-age Council Tax Reduction. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Bristol working-age Council Tax Reduction capital limit + reference: + - title: Bristol Council Tax Reduction Scheme 2026-27, paragraph 25 + href: https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file diff --git a/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..54968071d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly assumed income per capital step for Bristol working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Bristol Council Tax Reduction tariff income per step + reference: + - title: Bristol Council Tax Reduction Scheme 2026-27, paragraph 32 + href: https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file diff --git a/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..989759bc5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step for Bristol working-age Council Tax Reduction tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Bristol Council Tax Reduction tariff income capital step + reference: + - title: Bristol Council Tax Reduction Scheme 2026-27, paragraph 32 + href: https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file diff --git a/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..152de9882 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which Bristol assumes tariff income for working-age Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Bristol Council Tax Reduction tariff income threshold + reference: + - title: Bristol Council Tax Reduction Scheme 2026-27, paragraph 32 + href: https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file diff --git a/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..c715efb1f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate on excess income for Bristol working-age Council Tax Reduction. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Bristol Council Tax Reduction excess-income withdrawal rate + reference: + - title: Bristol Council Tax Reduction Scheme 2026-27, paragraph 35 + href: https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file diff --git a/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..f125a04bb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bristol/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction by gross weekly income for Bristol working-age Council Tax Reduction. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Bristol Council Tax Reduction non-dependant deduction amount + reference: + - title: Bristol Council Tax Reduction Scheme 2026-27, paragraph 39 + href: https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file diff --git a/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..2ce3694a4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,13 @@ +description: Maximum share of eligible Council Tax liability covered under the Broadland Council Tax Reduction scheme. +values: + 2025-04-01: 0.87 + 2026-04-01: 0.87 +metadata: + unit: /1 + period: year + label: Broadland Council Tax Reduction maximum support rate + reference: + - title: Broadland District Council Council Tax Reduction Scheme 2025/26 + href: https://www.southnorfolkandbroadland.gov.uk/asset-library/broadland-ctr-scheme-2025-26.pdf + - title: Broadland Council Tax Reduction Scheme 2026/27 report + href: https://southnorfolkandbroadland.moderngov.co.uk/documents/s12491/CTAX%20Reduction%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..522fcd42d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the Broadland Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Broadland Council Tax Reduction capital limit + reference: + - title: Broadland District Council Council Tax Reduction Scheme 2025/26 + href: https://www.southnorfolkandbroadland.gov.uk/asset-library/broadland-ctr-scheme-2025-26.pdf + - title: Broadland Council Tax Reduction Scheme 2026/27 report + href: https://southnorfolkandbroadland.moderngov.co.uk/documents/s12491/CTAX%20Reduction%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..c61e081f7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,13 @@ +description: Withdrawal rate for working-age households under the Broadland Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Broadland Council Tax Reduction withdrawal rate + reference: + - title: Broadland District Council Council Tax Reduction Scheme 2025/26 + href: https://www.southnorfolkandbroadland.gov.uk/asset-library/broadland-ctr-scheme-2025-26.pdf + - title: Broadland Council Tax Reduction Scheme 2026/27 report + href: https://southnorfolkandbroadland.moderngov.co.uk/documents/s12491/CTAX%20Reduction%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..de75cbf75 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/broadland/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly non-dependant deduction under the Broadland Council Tax Reduction scheme for working-age households. +values: + 2025-04-01: 7 + 2026-04-01: 7 +metadata: + unit: currency-GBP + period: week + label: Broadland Council Tax Reduction working-age non-dependant deduction amount + reference: + - title: Broadland District Council Council Tax Reduction Scheme 2025/26 + href: https://www.southnorfolkandbroadland.gov.uk/asset-library/broadland-ctr-scheme-2025-26.pdf + - title: Broadland Council Tax Reduction Scheme 2026/27 report + href: https://southnorfolkandbroadland.moderngov.co.uk/documents/s12491/CTAX%20Reduction%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..d56cbbc37 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: Maximum English council tax band ratio eligible for Bromley working-age Council Tax Support. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Bromley Council Tax Support Band D liability cap ratio + reference: + - title: Bromley Local Council Tax Reduction Scheme from 1 April 2025, paragraph 29 + href: https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 diff --git a/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..0b1115b67 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered by Bromley working-age Council Tax Support. +values: + 2026-04-01: 0.5 +metadata: + unit: /1 + period: year + label: Bromley working-age Council Tax Support maximum support rate + reference: + - title: Bromley Council Tax Support Scheme 2026-27 report + href: https://cds.bromley.gov.uk/documents/s50125675/Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: Bromley Local Council Tax Reduction Scheme from 1 April 2025, paragraph 29 + href: https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 diff --git a/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..ee28fe253 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for Bromley working-age Council Tax Support. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Bromley working-age Council Tax Support capital limit + reference: + - title: Bromley Local Council Tax Reduction Scheme from 1 April 2025, paragraph 23 + href: https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 diff --git a/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..adb5cb709 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly assumed income per capital step for Bromley working-age Council Tax Support. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Bromley Council Tax Support tariff income per step + reference: + - title: Bromley Local Council Tax Reduction Scheme from 1 April 2025, paragraph 72 + href: https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 diff --git a/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..0781b46a5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step for Bromley working-age Council Tax Support tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Bromley Council Tax Support tariff income capital step + reference: + - title: Bromley Local Council Tax Reduction Scheme from 1 April 2025, paragraph 72 + href: https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 diff --git a/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..ca49c792d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which Bromley assumes tariff income for working-age Council Tax Support. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Bromley Council Tax Support tariff income threshold + reference: + - title: Bromley Local Council Tax Reduction Scheme from 1 April 2025, paragraph 72 + href: https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 diff --git a/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..949195377 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate on excess income for Bromley working-age Council Tax Support. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Bromley Council Tax Support excess-income withdrawal rate + reference: + - title: Bromley Local Council Tax Reduction Scheme from 1 April 2025, paragraph 67 + href: https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 diff --git a/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..3459a198a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule for Bromley working-age Council Tax Support. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5 + - threshold: + 2026-04-01: 266 + amount: + 2026-04-01: 10.20 + - threshold: + 2026-04-01: 463 + amount: + 2026-04-01: 12.80 + - threshold: + 2026-04-01: 577 + amount: + 2026-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Bromley working-age Council Tax Support non-dependant deduction + reference: + - title: Bromley Local Council Tax Reduction Scheme from 1 April 2025, paragraph 30 + href: https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 diff --git a/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..f25bb2913 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bromley/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Bromley working-age Council Tax Support non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Bromley Council Tax Support non-dependant remunerative-work hours + reference: + - title: Bromley Local Council Tax Reduction Scheme from 1 April 2025, paragraph 7 + href: https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..f9ca154db --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,33 @@ +description: Council Tax Reduction rate by weekly net income band for Buckinghamshire couple working-age households without children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 175.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 325.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Buckinghamshire couple weekly net-income CTR rate + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, income bands for 2026 to 2027 + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/couple_one_child.yaml new file mode 100644 index 000000000..0fd61aaf1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/couple_one_child.yaml @@ -0,0 +1,33 @@ +description: Council Tax Reduction rate by weekly net income band for Buckinghamshire couple working-age households with one child or qualifying young person. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 325.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 425.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Buckinghamshire couple one-child weekly net-income CTR rate + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, income bands for 2026 to 2027 + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/couple_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/couple_two_or_more_children.yaml new file mode 100644 index 000000000..dd459db57 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/couple_two_or_more_children.yaml @@ -0,0 +1,33 @@ +description: Council Tax Reduction rate by weekly net income band for Buckinghamshire couple working-age households with two or more children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 350.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 400.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 450.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 500.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Buckinghamshire couple two-child weekly net-income CTR rate + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, income bands for 2026 to 2027 + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..331ef128b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,33 @@ +description: Council Tax Reduction rate by weekly net income band for Buckinghamshire single working-age households without children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 175.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Buckinghamshire single weekly net-income CTR rate + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, income bands for 2026 to 2027 + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/single_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/single_one_child.yaml new file mode 100644 index 000000000..bc96f573a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/single_one_child.yaml @@ -0,0 +1,33 @@ +description: Council Tax Reduction rate by weekly net income band for Buckinghamshire single working-age households with one child or qualifying young person. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 325.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Buckinghamshire single one-child weekly net-income CTR rate + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, income bands for 2026 to 2027 + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/single_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/single_two_or_more_children.yaml new file mode 100644 index 000000000..88ca633e9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_band/single_two_or_more_children.yaml @@ -0,0 +1,33 @@ +description: Council Tax Reduction rate by weekly net income band for Buckinghamshire single working-age households with two or more children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 350.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 400.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 450.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Buckinghamshire single two-child weekly net-income CTR rate + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, income bands for 2026 to 2027 + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_disregard/disability.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_disregard/disability.yaml new file mode 100644 index 000000000..6b3f117c6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_disregard/disability.yaml @@ -0,0 +1,12 @@ +description: Weekly disability-related income disregard under the Buckinghamshire Council Tax Reduction scheme. +values: + 2026-04-01: 50 +metadata: + unit: currency-GBP + period: week + label: Buckinghamshire Council Tax Reduction disability income disregard + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, Schedule 2 paragraph 72 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, additional disregarded income + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_disregard/earnings.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_disregard/earnings.yaml new file mode 100644 index 000000000..b8e3e1d44 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/income_disregard/earnings.yaml @@ -0,0 +1,12 @@ +description: Weekly earnings disregard under the Buckinghamshire Council Tax Reduction scheme. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Buckinghamshire Council Tax Reduction earnings disregard + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, Schedule 4 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, additional disregarded income + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..0d54704b5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit under the Buckinghamshire working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6000 +metadata: + unit: currency-GBP + period: year + label: Buckinghamshire Council Tax Reduction capital limit + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, section 26.1 and Schedule 1 paragraph 5 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, capital rules + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..dee2f8039 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/buckinghamshire/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,12 @@ +description: Flat weekly non-dependant deduction under the Buckinghamshire working-age Council Tax Reduction scheme. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Buckinghamshire Council Tax Reduction non-dependant deduction + reference: + - title: Buckinghamshire Council Tax Reduction Scheme 2026/27, section 48.5 + href: https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf + - title: Buckinghamshire Council Tax Reduction live page, non-dependants + href: https://www.buckinghamshire.gov.uk/council-tax/help-available-if-you-are-struggling-to-pay-your-council-tax/if-you-are-having-difficulty-paying-your-council-tax/ diff --git a/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..d383c5061 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by monthly net earned income band for working-age couples without children under the Bury scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.80 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 100.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 600.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 1000.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: month + threshold_unit: currency-GBP + type: single_amount + label: Bury couple monthly net earned-income CTR rate + reference: + - title: Bury Council Tax Support Scheme Policy 2026/27, paragraph 9 + href: https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/couple_one_child.yaml new file mode 100644 index 000000000..acf9f3d6d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/couple_one_child.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by monthly net earned income band for working-age couples with one child under the Bury scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.80 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 700.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 1100.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: month + threshold_unit: currency-GBP + type: single_amount + label: Bury couple with one child monthly net earned-income CTR rate + reference: + - title: Bury Council Tax Support Scheme Policy 2026/27, paragraph 9 + href: https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/couple_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/couple_two_or_more_children.yaml new file mode 100644 index 000000000..29d46e1d1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/couple_two_or_more_children.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by monthly net earned income band for working-age couples with two or more children under the Bury scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.80 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 800.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 1200.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: month + threshold_unit: currency-GBP + type: single_amount + label: Bury couple with two or more children monthly net earned-income CTR rate + reference: + - title: Bury Council Tax Support Scheme Policy 2026/27, paragraph 9 + href: https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..d8c5db144 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by monthly net earned income band for single working-age households under the Bury scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.80 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 100.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 500.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 900.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: month + threshold_unit: currency-GBP + type: single_amount + label: Bury single monthly net earned-income CTR rate + reference: + - title: Bury Council Tax Support Scheme Policy 2026/27, paragraph 9 + href: https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/single_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/single_one_child.yaml new file mode 100644 index 000000000..de2b297aa --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/single_one_child.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by monthly net earned income band for single working-age households with one child under the Bury scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.80 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 700.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 1100.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: month + threshold_unit: currency-GBP + type: single_amount + label: Bury single with one child monthly net earned-income CTR rate + reference: + - title: Bury Council Tax Support Scheme Policy 2026/27, paragraph 9 + href: https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/single_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/single_two_or_more_children.yaml new file mode 100644 index 000000000..3bc12293e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/income_band/single_two_or_more_children.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by monthly net earned income band for single working-age households with two or more children under the Bury scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.80 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 800.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 1200.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: month + threshold_unit: currency-GBP + type: single_amount + label: Bury single with two or more children monthly net earned-income CTR rate + reference: + - title: Bury Council Tax Support Scheme Policy 2026/27, paragraph 9 + href: https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..74fcfd53f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: Maximum English council tax band ratio eligible for ordinary working-age Bury Council Tax Support before protected-group exemptions. +values: + 2026-04-01: 0.7777777778 +metadata: + unit: /1 + label: Bury CTR Band B liability cap ratio + reference: + - title: Bury Council Tax Support Scheme Policy 2026/27, paragraphs 11 and 35-37 + href: https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..c19258fd1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,9 @@ +description: Capital limit for working-age Bury Council Tax Support. +values: + 2026-04-01: 8_000 +metadata: + unit: currency-GBP + label: Bury working-age CTR capital limit + reference: + - title: Bury Council Tax Support Scheme Policy 2026/27, paragraphs 13 and 27 + href: https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/non_dep_deduction/monthly_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/non_dep_deduction/monthly_amount.yaml new file mode 100644 index 000000000..6d5a19cf9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/bury/council_tax_reduction/non_dep_deduction/monthly_amount.yaml @@ -0,0 +1,10 @@ +description: Monthly non-dependant deduction for working-age Bury Council Tax Support. +values: + 2026-04-01: 40 +metadata: + unit: currency-GBP + period: month + label: Bury working-age CTR monthly non-dependant deduction + reference: + - title: Bury Council Tax Support Scheme Policy 2026/27, paragraph 51 + href: https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..7b7e9e997 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,9 @@ +description: Maximum weekly childcare costs deducted from earnings for working-age Camden Council Tax Support with one child. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + label: Camden Council Tax Support one-child weekly childcare deduction cap + reference: + - title: Camden Council, Council Tax Support + href: https://www.camden.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..676a790d4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,9 @@ +description: Maximum weekly childcare costs deducted from earnings for working-age Camden Council Tax Support with two or more children. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + label: Camden Council Tax Support two-or-more-child weekly childcare deduction cap + reference: + - title: Camden Council, Council Tax Support + href: https://www.camden.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/childcare/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/childcare/work_hours.yaml new file mode 100644 index 000000000..5768b556c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/childcare/work_hours.yaml @@ -0,0 +1,9 @@ +description: Minimum weekly work hours for Camden Council Tax Support childcare costs to be deducted from earnings. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Camden Council Tax Support childcare deduction weekly work-hours threshold + reference: + - title: Camden Council, Council Tax Support + href: https://www.camden.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/income_band/disabled_or_carer.yaml b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/income_band/disabled_or_carer.yaml new file mode 100644 index 000000000..c444a4419 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/income_band/disabled_or_carer.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly gross earnings band for working-age Camden households where the claimant or partner is disabled or a carer. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 118.40 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 236.80 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 532.80 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 586.08 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 666.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Camden disabled-or-carer weekly gross earnings CTR rate + reference: + - title: Camden Council, Council Tax Support + href: https://www.camden.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/income_band/no_children.yaml b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/income_band/no_children.yaml new file mode 100644 index 000000000..bd99668e3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/income_band/no_children.yaml @@ -0,0 +1,27 @@ +description: Council Tax Support rate by weekly gross earnings band for working-age Camden households without children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 118.40 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 236.80 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 532.80 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Camden no-child weekly gross earnings CTR rate + reference: + - title: Camden Council, Council Tax Support + href: https://www.camden.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/income_band/with_children.yaml b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/income_band/with_children.yaml new file mode 100644 index 000000000..911dbe816 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/income_band/with_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly gross earnings band for working-age Camden households with children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 118.40 + amount: + 2026-04-01: 0.65 + - threshold: + 2026-04-01: 236.80 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 532.80 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 586.08 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 666.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Camden with-children weekly gross earnings CTR rate + reference: + - title: Camden Council, Council Tax Support + href: https://www.camden.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..220dbc969 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,9 @@ +description: Savings and assets limit for working-age Camden Council Tax Support. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + label: Camden working-age Council Tax Support savings and assets limit + reference: + - title: Camden Council, Council Tax Support + href: https://www.camden.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/non_dep_deduction/earnings_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/non_dep_deduction/earnings_threshold.yaml new file mode 100644 index 000000000..b3372d245 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/non_dep_deduction/earnings_threshold.yaml @@ -0,0 +1,9 @@ +description: Weekly earned income threshold above which Camden applies a non-dependant deduction. +values: + 2026-04-01: 110.80 +metadata: + unit: currency-GBP + label: Camden Council Tax Support non-dependant weekly earnings threshold + reference: + - title: Camden Council, Council Tax Support + href: https://www.camden.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/non_dep_deduction/liability_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/non_dep_deduction/liability_rate.yaml new file mode 100644 index 000000000..ef36c93fb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/camden/council_tax_reduction/non_dep_deduction/liability_rate.yaml @@ -0,0 +1,9 @@ +description: Share of Council Tax liability deducted for each Camden non-dependant above the weekly earned income threshold. +values: + 2026-04-01: 0.30 +metadata: + unit: /1 + label: Camden Council Tax Support non-dependant liability deduction rate + reference: + - title: Camden Council, Council Tax Support + href: https://www.camden.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/carer.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/carer.yaml new file mode 100644 index 000000000..01dd69f32 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/carer.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Chelmsford working-age Local Council Tax Support applicants with a carer premium. +values: + 2026-04-01: 30 +metadata: + unit: currency-GBP + period: week + label: Chelmsford carer LCTS earnings disregard + reference: + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, Schedule 3 paragraphs 5 and 6 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/couple.yaml new file mode 100644 index 000000000..e4d00b6e5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/couple.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Chelmsford couple working-age Local Council Tax Support applicants without a higher source-listed disregard. +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Chelmsford couple LCTS earnings disregard + reference: + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, Schedule 3 paragraph 7 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/disability_or_esa_component.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/disability_or_esa_component.yaml new file mode 100644 index 000000000..85f5e9054 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/disability_or_esa_component.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Chelmsford working-age Local Council Tax Support applicants with a disability premium, severe disability premium, work-related activity component, or support component. +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Chelmsford disability or ESA component LCTS earnings disregard + reference: + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, Schedule 3 paragraph 3 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/lone_parent.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/lone_parent.yaml new file mode 100644 index 000000000..4a31821ab --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/lone_parent.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Chelmsford lone-parent working-age Local Council Tax Support applicants. +values: + 2026-04-01: 35 +metadata: + unit: currency-GBP + period: week + label: Chelmsford lone-parent LCTS earnings disregard + reference: + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, Schedule 3 paragraph 4 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/single.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/single.yaml new file mode 100644 index 000000000..e4457a893 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/single.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Chelmsford single working-age Local Council Tax Support applicants. +values: + 2026-04-01: 15 +metadata: + unit: currency-GBP + period: week + label: Chelmsford single LCTS earnings disregard + reference: + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, Schedule 3 paragraph 10 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/special_occupation.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/special_occupation.yaml new file mode 100644 index 000000000..3a5692be3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/earnings_disregard/special_occupation.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Chelmsford working-age Local Council Tax Support applicants with source-listed special occupations. +values: + 2026-04-01: 30 +metadata: + unit: currency-GBP + period: week + label: Chelmsford special occupation LCTS earnings disregard + reference: + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, Schedule 3 paragraphs 8 and 9 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..3a932d62e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,11 @@ +description: Maximum English council tax band ratio eligible for Chelmsford working-age Local Council Tax Support. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Chelmsford LCTS Band D liability cap ratio + reference: + - title: Chelmsford Local Council Tax Support Scheme 2026/27 report, Appendix 1 + href: https://www.chelmsford.gov.uk/media/g2nbyt31/62-local-council-tax-support-lcts-scheme-2026-27.pdf + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, section 57.1 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..0340604dc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered by Chelmsford working-age Local Council Tax Support. +values: + 2026-04-01: 0.77 +metadata: + unit: /1 + period: year + label: Chelmsford working-age Local Council Tax Support maximum support rate + reference: + - title: Chelmsford Local Council Tax Support Scheme 2026/27 report, paragraphs 2.1 and 6.1 + href: https://www.chelmsford.gov.uk/media/g2nbyt31/62-local-council-tax-support-lcts-scheme-2026-27.pdf + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, section 57.1 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..63e45644e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit for Chelmsford working-age Local Council Tax Support. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Chelmsford working-age Local Council Tax Support capital limit + reference: + - title: Chelmsford Local Council Tax Support Scheme 2026/27 report, Appendix 1 + href: https://www.chelmsford.gov.uk/media/g2nbyt31/62-local-council-tax-support-lcts-scheme-2026-27.pdf + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, sections 1.7 and 33.1 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..5994d4622 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,12 @@ +description: Withdrawal rate on excess income for Chelmsford working-age Local Council Tax Support. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Chelmsford Local Council Tax Support excess-income withdrawal rate + reference: + - title: Chelmsford Local Council Tax Support Scheme 2026/27 report, Appendix 1 + href: https://www.chelmsford.gov.uk/media/g2nbyt31/62-local-council-tax-support-lcts-scheme-2026-27.pdf + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, section 59.1 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..5fc9fc70a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction by gross weekly income for Chelmsford remunerative-work non-dependants. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 4.95 + - threshold: + 2026-04-01: 266 + amount: + 2026-04-01: 9.83 + - threshold: + 2026-04-01: 463 + amount: + 2026-04-01: 12.38 + - threshold: + 2026-04-01: 577 + amount: + 2026-04-01: 14.85 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Chelmsford Local Council Tax Support remunerative-work non-dependant deduction amount + reference: + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, sections 58.1 and 58.2 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/non_dep_deduction/not_remunerative_work.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/non_dep_deduction/not_remunerative_work.yaml new file mode 100644 index 000000000..9e7416410 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/non_dep_deduction/not_remunerative_work.yaml @@ -0,0 +1,10 @@ +description: Weekly non-dependant deduction for Chelmsford non-dependants who are not in remunerative work. +values: + 2026-04-01: 6.60 +metadata: + unit: currency-GBP + period: week + label: Chelmsford Local Council Tax Support non-working non-dependant deduction + reference: + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, section 58.1 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..e01ce2184 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chelmsford/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Chelmsford working-age Local Council Tax Support non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Chelmsford Local Council Tax Support non-dependant remunerative-work hours + reference: + - title: Chelmsford City Council Tax Reduction Scheme 2025/26, section 6.1 + href: https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933 diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..40eab3500 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from earnings for Cheltenham Council Tax Support with one eligible child. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + period: week + label: Cheltenham Council Tax Support one-child weekly childcare deduction cap + reference: + - title: Cheltenham Borough Council Council Tax Support Scheme 2026/27, section 14.3 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..d6eb38429 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from earnings for Cheltenham Council Tax Support with two or more eligible children. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + period: week + label: Cheltenham Council Tax Support two-or-more-child weekly childcare deduction cap + reference: + - title: Cheltenham Borough Council Council Tax Support Scheme 2026/27, section 14.3 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/childcare/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/childcare/work_hours.yaml new file mode 100644 index 000000000..d25270fc4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/childcare/work_hours.yaml @@ -0,0 +1,11 @@ +description: Minimum weekly work hours for Cheltenham Council Tax Support childcare costs to be deducted from earnings. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Cheltenham Council Tax Support childcare deduction weekly work-hours threshold + reference: + - title: Cheltenham Borough Council Council Tax Support Scheme 2026/27, sections 6 and 15 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/disabled_child_disregard/weekly_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/disabled_child_disregard/weekly_amount.yaml new file mode 100644 index 000000000..cb1ac3470 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/disabled_child_disregard/weekly_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly disabled child income disregard under Cheltenham Council Tax Support. +values: + 2026-04-01: 200 +metadata: + unit: currency-GBP + period: week + label: Cheltenham Council Tax Support disabled child weekly income disregard + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, Schedule 3 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/earnings_disregard/maximum.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/earnings_disregard/maximum.yaml new file mode 100644 index 000000000..e4f10c2e0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/earnings_disregard/maximum.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly earnings disregard under Cheltenham Council Tax Support. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Cheltenham Council Tax Support weekly earnings disregard + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, Schedule 1 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..3760add14 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,23 @@ +description: Council Tax Support rate by weekly net income band for Cheltenham couples with no children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 178.01} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 233.01} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 292.01} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 355.01} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 425.01} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheltenham couple weekly net-income CTS rate + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, section 1.9 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple_four_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple_four_or_more_children.yaml new file mode 100644 index 000000000..dac8f86f4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple_four_or_more_children.yaml @@ -0,0 +1,23 @@ +description: Council Tax Support rate by weekly net income band for Cheltenham couples with four or more children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 436.01} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 500.01} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 565.01} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 630.01} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 700.01} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheltenham couple four-or-more-child weekly net-income CTS rate + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, section 1.9 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple_three_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple_three_children.yaml new file mode 100644 index 000000000..e180f2738 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple_three_children.yaml @@ -0,0 +1,23 @@ +description: Council Tax Support rate by weekly net income band for Cheltenham couples with three children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 366.01} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 430.01} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 495.01} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 560.01} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 630.01} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheltenham couple three-child weekly net-income CTS rate + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, section 1.9 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple_up_to_two_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple_up_to_two_children.yaml new file mode 100644 index 000000000..61f9a5c2d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/couple_up_to_two_children.yaml @@ -0,0 +1,23 @@ +description: Council Tax Support rate by weekly net income band for Cheltenham couples with up to two children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 296.01} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 360.01} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 425.01} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 488.01} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 560.01} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheltenham couple up-to-two-child weekly net-income CTS rate + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, section 1.9 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/lone_parent_four_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/lone_parent_four_or_more_children.yaml new file mode 100644 index 000000000..a411533a1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/lone_parent_four_or_more_children.yaml @@ -0,0 +1,23 @@ +description: Council Tax Support rate by weekly net income band for Cheltenham lone-parent households with four or more children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 375.01} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 426.01} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 480.01} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 530.01} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 600.01} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheltenham lone-parent four-or-more-child weekly net-income CTS rate + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, section 1.9 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/lone_parent_three_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/lone_parent_three_children.yaml new file mode 100644 index 000000000..2d44763c4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/lone_parent_three_children.yaml @@ -0,0 +1,25 @@ +description: Council Tax Support rate by weekly net income band for Cheltenham lone-parent households with three children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 305.01} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 356.01} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 410.01} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 460.01} + amount: {2026-04-01: 0} + - threshold: {2026-04-01: 480.01} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 525.01} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheltenham lone-parent three-child weekly net-income CTS rate + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, section 1.9 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/lone_parent_up_to_two_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/lone_parent_up_to_two_children.yaml new file mode 100644 index 000000000..95a0e20ad --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/lone_parent_up_to_two_children.yaml @@ -0,0 +1,23 @@ +description: Council Tax Support rate by weekly net income band for Cheltenham lone-parent households with up to two children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 235.01} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 286.01} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 340.01} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 392.01} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 455.01} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheltenham lone-parent up-to-two-child weekly net-income CTS rate + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, section 1.9 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..d22297dde --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,23 @@ +description: Council Tax Support rate by weekly net income band for Cheltenham single-person households. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 115.01} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 160.01} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 190.01} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 222.01} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 255.01} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheltenham single weekly net-income CTS rate + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, section 1.9 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..4801bb2cb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Maximum English council tax band ratio eligible for Cheltenham Council Tax Support. +values: + 2026-04-01: 1.222222222 +metadata: + unit: /1 + period: year + label: Cheltenham Council Tax Support Band E liability cap ratio + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, sections 1.8 and 54.1 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..52d14b740 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for Cheltenham Council Tax Support. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Cheltenham Council Tax Support capital limit + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, sections 1.6 and 31.1 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..930786335 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction under the Cheltenham Council Tax Support scheme by gross weekly income where the non-dependant is in remunerative work. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5 + - threshold: + 2026-04-01: 266 + amount: + 2026-04-01: 10.20 + - threshold: + 2026-04-01: 463 + amount: + 2026-04-01: 12.80 + - threshold: + 2026-04-01: 577 + amount: + 2026-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheltenham Council Tax Support weekly non-dependant deduction + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, sections 55.1 and 55.2 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..4d187b9ea --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheltenham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly hours threshold for remunerative work in Cheltenham Council Tax Support non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Cheltenham Council Tax Support non-dependant remunerative work hours + reference: + - title: Cheltenham Borough Council Tax Support Scheme 2026/27, sections 6.1 and 55.1 + href: https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..d966b79f9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Cheshire West and Chester working-age Council Tax Reduction. +values: + 2026-04-01: 30 +metadata: + unit: currency-GBP + period: week + label: Cheshire West and Chester working-age CTR earnings disregard + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraph 6.5 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..927abb21a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,11 @@ +description: Maximum English council tax band ratio eligible for ordinary and protected Cheshire West and Chester working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Cheshire West and Chester CTR Band D liability cap ratio + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraph 9.0 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraphs 5.1 and 6.3 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_support_rate/protected.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_support_rate/protected.yaml new file mode 100644 index 000000000..b1d17f15a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_support_rate/protected.yaml @@ -0,0 +1,11 @@ +description: Maximum Council Tax Reduction rate for protected Cheshire West and Chester working-age applicants in Classes C and D. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Cheshire West and Chester protected working-age CTR maximum support rate + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraph 3.7 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraphs 4.3-4.4 and 6.1-6.3 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_support_rate/standard.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_support_rate/standard.yaml new file mode 100644 index 000000000..a321c6d17 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_support_rate/standard.yaml @@ -0,0 +1,11 @@ +description: Maximum Council Tax Reduction rate for ordinary Cheshire West and Chester working-age applicants. +values: + 2026-04-01: 0.75 +metadata: + unit: /1 + label: Cheshire West and Chester ordinary working-age CTR maximum support rate + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraph 3.5 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraph 5.1 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_support_rate/war_pensioner.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_support_rate/war_pensioner.yaml new file mode 100644 index 000000000..20fc1e01a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/maximum_support_rate/war_pensioner.yaml @@ -0,0 +1,11 @@ +description: Maximum Council Tax Reduction rate for Cheshire West and Chester working-age war pensioners. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Cheshire West and Chester working-age war pensioner CTR maximum support rate + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraphs 3.7 and 5.0 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraphs 6.1-6.3 and 7.5 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..831cff616 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Ordinary and protected working-age capital limit for Cheshire West and Chester Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + label: Cheshire West and Chester ordinary working-age CTR capital limit + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraphs 7.2-7.3 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraphs 3.6 and 4.1-4.4 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..48631d08a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly assumed income per capital step for Cheshire West and Chester working-age war pensioner Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Cheshire West and Chester war pensioner CTR tariff income per step + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraphs 35.1-35.4 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..b15b84e4a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step for Cheshire West and Chester working-age war pensioner Council Tax Reduction tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Cheshire West and Chester war pensioner CTR tariff income capital step + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraphs 35.1-35.4 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..842c98387 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which Cheshire West and Chester assumes tariff income for working-age war pensioner Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Cheshire West and Chester war pensioner CTR tariff income threshold + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraphs 35.1-35.4 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/war_pensioner_capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/war_pensioner_capital_limit.yaml new file mode 100644 index 000000000..d619c1f75 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/war_pensioner_capital_limit.yaml @@ -0,0 +1,11 @@ +description: Working-age war pensioner capital limit for Cheshire West and Chester Council Tax Reduction. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + label: Cheshire West and Chester working-age war pensioner CTR capital limit + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraphs 5.0 and 7.2 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraph 7.5 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..899f32d88 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate on annual excess income for Cheshire West and Chester Council Tax Reduction. +values: + 2026-04-01: 0.20 +metadata: + unit: /1 + label: Cheshire West and Chester CTR excess-income withdrawal rate + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraph 9.2 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraphs 4.2 and 4.4 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/minimum_award.yaml new file mode 100644 index 000000000..fce4be870 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/minimum_award.yaml @@ -0,0 +1,12 @@ +description: Minimum weekly Council Tax Reduction award payable under the Cheshire West and Chester working-age scheme. +values: + 2026-04-01: 2 +metadata: + unit: currency-GBP + period: week + label: Cheshire West and Chester Council Tax Reduction minimum weekly award + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraph 3.10 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraph 34.2 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..583788243 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,21 @@ +description: Weekly non-dependant deduction by gross weekly income for Cheshire West and Chester remunerative-work non-dependants. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cheshire West and Chester CTR remunerative-work non-dependant deduction + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraph 10.2 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraphs 33.1-33.1A + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/non_dep_deduction/not_remunerative_work.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/non_dep_deduction/not_remunerative_work.yaml new file mode 100644 index 000000000..19ecaff88 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/non_dep_deduction/not_remunerative_work.yaml @@ -0,0 +1,12 @@ +description: Weekly non-dependant deduction for Cheshire West and Chester non-dependants who are not in remunerative work. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Cheshire West and Chester CTR non-working non-dependant deduction + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraph 10.2 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, paragraph 33.1 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..3eff01dbb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly hours threshold for remunerative work in Cheshire West and Chester working-age Council Tax Reduction non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Cheshire West and Chester CTR non-dependant remunerative-work hours + reference: + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 1, paragraph 10.2 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf + - title: Cheshire West and Chester Council Tax Reduction Summary 2026-2027 Annex A Part 2, section 11 + href: https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..fbb3c5252 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Chesterfield Council Tax Support scheme. +values: + 2025-04-01: 0.915 +metadata: + unit: /1 + period: year + label: Chesterfield Council Tax Support maximum support rate + reference: + - title: Council Tax Support + href: https://www.chesterfield.gov.uk/council-tax-and-business-rates/council-tax/council-tax-support + - title: Chesterfield Borough Council Council Tax Support Scheme + href: https://www.chesterfield.gov.uk/media/zuxllbgk/chesterfield-borough-council-council-tax-support-scheme-2019-20.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..91a43f918 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit under the Chesterfield Council Tax Support means test. +values: + 2025-04-01: 16000 +metadata: + unit: currency-GBP + period: year + label: Chesterfield Council Tax Support capital limit + reference: + - title: Council Tax Support + href: https://www.chesterfield.gov.uk/council-tax-and-business-rates/council-tax/council-tax-support + - title: Chesterfield Borough Council Council Tax Support Scheme + href: https://www.chesterfield.gov.uk/media/zuxllbgk/chesterfield-borough-council-council-tax-support-scheme-2019-20.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..cb2e2bb4d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,12 @@ +description: Withdrawal rate under the Chesterfield Council Tax Support means test. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Chesterfield Council Tax Support withdrawal rate + reference: + - title: Council Tax Support + href: https://www.chesterfield.gov.uk/council-tax-and-business-rates/council-tax/council-tax-support + - title: Chesterfield Borough Council Council Tax Support Scheme + href: https://www.chesterfield.gov.uk/media/zuxllbgk/chesterfield-borough-council-council-tax-support-scheme-2019-20.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..f5b4851a9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chesterfield/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,29 @@ +description: Weekly non-dependant deduction schedule under the Chesterfield Council Tax Support scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 4 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 8.1 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 12.2 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Chesterfield Council Tax Support non-dependant deduction schedule + reference: + - title: Council Tax Support + href: https://www.chesterfield.gov.uk/council-tax-and-business-rates/council-tax/council-tax-support + - title: Chesterfield Borough Council Council Tax Support Scheme + href: https://www.chesterfield.gov.uk/media/zuxllbgk/chesterfield-borough-council-council-tax-support-scheme-2019-20.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..c70e1916d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,37 @@ +description: Council Tax Reduction rate by weekly UC-assessed income band for Chichester couple working-age Class F households without children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 182.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 206.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 229.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 253.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 276.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Chichester couple weekly UC-income CTR rate + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.4 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf + - title: Chichester Local Council Tax Reduction Scheme Rules 2025-2026, section 5.4 + href: https://chichester.moderngov.co.uk/documents/s28429/Determination%20of%20the%20Council%20Tax%20Reduction%20Scheme%202025-2026%20-%20Appendix.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/one_child.yaml new file mode 100644 index 000000000..d51cd462f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/one_child.yaml @@ -0,0 +1,35 @@ +description: Council Tax Reduction rate by weekly UC-assessed income band for Chichester working-age Class F households with one child. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 248.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 271.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 294.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 318.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 341.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Chichester one-child weekly UC-income CTR rate + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.4 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..3b2641f61 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,35 @@ +description: Council Tax Reduction rate by weekly UC-assessed income band for Chichester single working-age Class F households. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 124.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 147.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 171.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 194.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 218.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Chichester single weekly UC-income CTR rate + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.4 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/two_or_more_children.yaml new file mode 100644 index 000000000..9f5f28a02 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/income_band/two_or_more_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Reduction rate by weekly UC-assessed income band for Chichester working-age Class F households with two or more children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 306.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 330.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 353.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 377.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 400.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Chichester two-or-more-children weekly UC-income CTR rate + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.4 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..ba693abf8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered under the Chichester Council Tax Reduction scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Chichester Council Tax Reduction maximum support rate + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, working-age classes D and F + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf + - title: Chichester Council Tax Reduction Scheme for 2026-2027 report + href: https://chichester.moderngov.co.uk/documents/s30862/09.0%20Local%20Council%20Tax%20Reduction%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..50656f48a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Chichester Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Chichester Council Tax Reduction capital limit + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, sections 1.4 to 1.6 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..869b05c48 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly assumed income per capital step for Chichester non-UC working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Chichester Council Tax Reduction tariff income per step + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.11 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..d9329a8ac --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step for Chichester non-UC working-age Council Tax Reduction tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Chichester Council Tax Reduction tariff income capital step + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.11 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..bf6bfb6c4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which Chichester assumes tariff income for non-UC working-age Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Chichester Council Tax Reduction tariff income threshold + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.11 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..3aac24f3b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age non-UC households under the Chichester Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Chichester Council Tax Reduction withdrawal rate + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.8 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..da5a4449a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,29 @@ +description: Weekly prescribed non-dependant deduction schedule used for Chichester working-age classes D and E. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Chichester Council Tax Reduction prescribed non-dependant deduction schedule + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.7 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf + - title: Adur Council Tax Support 2026-27 + href: https://www.adur-worthing.gov.uk/media/Media,174007,smxx.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..3155ea81a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly hours threshold for remunerative work under the Chichester Council Tax Reduction scheme's Class F non-dependant deduction. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Chichester Council Tax Reduction remunerative work hours threshold + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.7 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/non_dep_deduction/uc_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/non_dep_deduction/uc_amount.yaml new file mode 100644 index 000000000..6915b2f07 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/chichester/council_tax_reduction/non_dep_deduction/uc_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly flat non-dependant deduction for Chichester working-age Class F households. +values: + 2026-04-01: 3.9 +metadata: + unit: currency-GBP + period: week + label: Chichester Council Tax Reduction Class F non-dependant deduction + reference: + - title: Chichester Local Council Tax Reduction Scheme Rules 2026-2027, section 5.7 + href: https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..837f7a5f1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,11 @@ +description: Maximum weekly childcare deduction for Colchester CTR households with one child receiving childcare. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + period: week + label: Colchester CTR one-child childcare deduction cap + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 4 paragraph 20(c) + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..f96e18284 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare deduction for Colchester CTR households with two or more children receiving childcare. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + period: week + label: Colchester CTR two-or-more-child childcare deduction cap + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 4 paragraph 20(c) + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/childcare/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/childcare/work_hours.yaml new file mode 100644 index 000000000..ba8273faf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/childcare/work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly hours threshold for remunerative work in Colchester CTR childcare deductions. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Colchester CTR childcare work hours threshold + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 4 paragraph 20(d) + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..9944ce5ac --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,11 @@ +description: Weekly earnings disregard for Colchester working-age Council Tax Reduction. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Colchester CTR earnings disregard + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 4 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..b30a255a1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,34 @@ +description: Council Tax Reduction rate by weekly income band for Colchester working-age couple households with no children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Colchester couple no-child weekly income-band CTR rate + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + - title: Colchester City Council Local Council Tax Support working-age page, reviewed 1 April 2026 + href: https://www.colchester.gov.uk/housing-benefit-local-council-tax-support/lcts-working-age/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/couple_one_child.yaml new file mode 100644 index 000000000..6c25c2a88 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/couple_one_child.yaml @@ -0,0 +1,38 @@ +description: Council Tax Reduction rate by weekly income band for Colchester working-age couple households with one child. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 425.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Colchester couple one-child weekly income-band CTR rate + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + - title: Colchester City Council Local Council Tax Support working-age page, reviewed 1 April 2026 + href: https://www.colchester.gov.uk/housing-benefit-local-council-tax-support/lcts-working-age/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/couple_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/couple_two_or_more_children.yaml new file mode 100644 index 000000000..afa94ac7b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/couple_two_or_more_children.yaml @@ -0,0 +1,42 @@ +description: Council Tax Reduction rate by weekly income band for Colchester working-age couple households with two or more children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 425.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 475.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Colchester couple two-or-more-child weekly income-band CTR rate + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + - title: Colchester City Council Local Council Tax Support working-age page, reviewed 1 April 2026 + href: https://www.colchester.gov.uk/housing-benefit-local-council-tax-support/lcts-working-age/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/protected.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/protected.yaml new file mode 100644 index 000000000..bab7309ae --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/protected.yaml @@ -0,0 +1,22 @@ +description: Council Tax Reduction rate by weekly income band for Colchester working-age protected households. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 475.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Colchester protected weekly income-band CTR rate + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + - title: Colchester City Council Local Council Tax Support working-age page, reviewed 1 April 2026 + href: https://www.colchester.gov.uk/housing-benefit-local-council-tax-support/lcts-working-age/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..2af724d39 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,34 @@ +description: Council Tax Reduction rate by weekly income band for Colchester working-age single households with no children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Colchester single no-child weekly income-band CTR rate + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + - title: Colchester City Council Local Council Tax Support working-age page, reviewed 1 April 2026 + href: https://www.colchester.gov.uk/housing-benefit-local-council-tax-support/lcts-working-age/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/single_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/single_one_child.yaml new file mode 100644 index 000000000..681af4b8d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/single_one_child.yaml @@ -0,0 +1,38 @@ +description: Council Tax Reduction rate by weekly income band for Colchester working-age single households with one child. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 425.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Colchester single one-child weekly income-band CTR rate + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + - title: Colchester City Council Local Council Tax Support working-age page, reviewed 1 April 2026 + href: https://www.colchester.gov.uk/housing-benefit-local-council-tax-support/lcts-working-age/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/single_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/single_two_or_more_children.yaml new file mode 100644 index 000000000..0798efe82 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/income_band/single_two_or_more_children.yaml @@ -0,0 +1,42 @@ +description: Council Tax Reduction rate by weekly income band for Colchester working-age single households with two or more children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 425.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 475.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Colchester single two-or-more-child weekly income-band CTR rate + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + - title: Colchester City Council Local Council Tax Support working-age page, reviewed 1 April 2026 + href: https://www.colchester.gov.uk/housing-benefit-local-council-tax-support/lcts-working-age/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..ac45f0fa0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,11 @@ +description: Maximum English council tax band ratio used to cap Colchester CTR eligible liability. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Colchester CTR Band D liability cap ratio + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, section 48.1 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..5df38fd1b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/colchester/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for Colchester working-age Council Tax Reduction. +values: + 2026-04-01: 6000 +metadata: + unit: currency-GBP + period: year + label: Colchester CTR capital limit + reference: + - title: Colchester City Council Council Tax Reduction Scheme 2026/27, sections 1.7 and 26.1, Schedule 1 paragraph 6 + href: https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + - title: Colchester City Council Local Council Tax Support working-age page, reviewed 1 April 2026 + href: https://www.colchester.gov.uk/housing-benefit-local-council-tax-support/lcts-working-age/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..947f3d73a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from earnings for Cotswold Council Tax Support with one eligible child. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + period: week + label: Cotswold Council Tax Support one-child weekly childcare deduction cap + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 14.3 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..d44b515a8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from earnings for Cotswold Council Tax Support with two or more eligible children. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + period: week + label: Cotswold Council Tax Support two-or-more-child weekly childcare deduction cap + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 14.3 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/childcare/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/childcare/work_hours.yaml new file mode 100644 index 000000000..cc7340209 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/childcare/work_hours.yaml @@ -0,0 +1,11 @@ +description: Minimum weekly work hours for Cotswold Council Tax Support childcare costs to be deducted from earnings. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Cotswold Council Tax Support childcare deduction weekly work-hours threshold + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, sections 6 and 22 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/additional.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/additional.yaml new file mode 100644 index 000000000..316e77d66 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/additional.yaml @@ -0,0 +1,10 @@ +description: Additional weekly earnings disregard for Cotswold Council Tax Support where source conditions apply. +values: + 2026-04-01: 17.10 +metadata: + unit: currency-GBP + period: week + label: Cotswold additional CTS earnings disregard + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, Schedule 1 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/carer_or_disability.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/carer_or_disability.yaml new file mode 100644 index 000000000..f0672ec0a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/carer_or_disability.yaml @@ -0,0 +1,11 @@ +description: Weekly earnings disregard for Cotswold Council Tax Support applicants who qualify through carer, disability, or listed special-work conditions. +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Cotswold carer or disability CTS earnings disregard + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, Schedule 1 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/couple.yaml new file mode 100644 index 000000000..3fadd2bf0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/couple.yaml @@ -0,0 +1,11 @@ +description: Weekly earnings disregard for Cotswold couple Council Tax Support applicants. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Cotswold couple CTS earnings disregard + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, Schedule 1 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/lone_parent.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/lone_parent.yaml new file mode 100644 index 000000000..845bfffcc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/lone_parent.yaml @@ -0,0 +1,11 @@ +description: Weekly earnings disregard for Cotswold lone-parent Council Tax Support applicants. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Cotswold lone-parent CTS earnings disregard + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, Schedule 1 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/single.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/single.yaml new file mode 100644 index 000000000..a211cc145 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/earnings_disregard/single.yaml @@ -0,0 +1,11 @@ +description: Weekly earnings disregard for Cotswold single Council Tax Support applicants. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Cotswold single CTS earnings disregard + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, Schedule 1 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..5d38366fe --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,24 @@ +description: Council Tax Support rate by weekly net income band for Cotswold couple households with no children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 183.09} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 223.09} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 273.09} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 323.09} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 373.09} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold couple no-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_four_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_four_or_more_children.yaml new file mode 100644 index 000000000..0f7feca00 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_four_or_more_children.yaml @@ -0,0 +1,23 @@ +description: Council Tax Support rate by weekly net income band for Cotswold couple households with four or more children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 371.90} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 421.90} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 471.90} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 521.90} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 571.90} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold couple four-or-more-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_one_child.yaml new file mode 100644 index 000000000..c15b66a2a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_one_child.yaml @@ -0,0 +1,24 @@ +description: Council Tax Support rate by weekly net income band for Cotswold couple households with one child. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 280.36} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 330.36} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 380.36} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 430.36} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 480.36} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold couple one-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_three_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_three_children.yaml new file mode 100644 index 000000000..669f14429 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_three_children.yaml @@ -0,0 +1,24 @@ +description: Council Tax Support rate by weekly net income band for Cotswold couple households with three children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 326.13} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 376.13} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 426.13} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 476.13} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 526.13} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold couple three-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_two_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_two_children.yaml new file mode 100644 index 000000000..622215549 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/couple_two_children.yaml @@ -0,0 +1,24 @@ +description: Council Tax Support rate by weekly net income band for Cotswold couple households with two children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 303.25} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 353.25} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 403.25} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 453.25} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 503.25} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold couple two-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_four_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_four_or_more_children.yaml new file mode 100644 index 000000000..df246946b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_four_or_more_children.yaml @@ -0,0 +1,24 @@ +description: Council Tax Support rate by weekly net income band for Cotswold lone-parent households with four or more children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 303.25} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 338.25} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 388.25} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 438.25} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 488.25} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold lone-parent four-or-more-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_one_child.yaml new file mode 100644 index 000000000..81f6f7d90 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_one_child.yaml @@ -0,0 +1,24 @@ +description: Council Tax Support rate by weekly net income band for Cotswold lone-parent households with one child. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 211.70} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 246.70} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 296.70} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 346.70} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 396.70} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold lone-parent one-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_three_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_three_children.yaml new file mode 100644 index 000000000..a609bec87 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_three_children.yaml @@ -0,0 +1,24 @@ +description: Council Tax Support rate by weekly net income band for Cotswold lone-parent households with three children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 257.48} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 292.48} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 342.48} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 392.48} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 442.48} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold lone-parent three-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_two_children.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_two_children.yaml new file mode 100644 index 000000000..45aec1690 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/lone_parent_two_children.yaml @@ -0,0 +1,24 @@ +description: Council Tax Support rate by weekly net income band for Cotswold lone-parent households with two children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 234.59} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 269.59} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 319.59} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 369.59} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 419.59} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold lone-parent two-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..8dc5497ea --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,24 @@ +description: Council Tax Support rate by weekly net income band for Cotswold single households with no children. +brackets: + - threshold: {2026-04-01: 0} + amount: {2026-04-01: 1} + - threshold: {2026-04-01: 154.49} + amount: {2026-04-01: 0.8} + - threshold: {2026-04-01: 204.49} + amount: {2026-04-01: 0.6} + - threshold: {2026-04-01: 254.49} + amount: {2026-04-01: 0.4} + - threshold: {2026-04-01: 304.49} + amount: {2026-04-01: 0.2} + - threshold: {2026-04-01: 354.49} + amount: {2026-04-01: 0} +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold single no-child weekly net-income CTS rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 1.9 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..495d54110 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,11 @@ +description: Maximum English council tax band ratio eligible for Cotswold Council Tax Support. +values: + 2026-04-01: 1.222222222 +metadata: + unit: /1 + period: year + label: Cotswold Council Tax Support Band E liability cap ratio + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, sections 1.7 and 57.1 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..a25c2c888 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under the Cotswold working-age Council Tax Support scheme. +values: + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Cotswold Council Tax Support capital limit + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, section 30.1 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..16c3652d9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income for each part capital step above the Cotswold Council Tax Support tariff threshold. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Cotswold Council Tax Support tariff income amount + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, sections 39.1-39.2 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..af033f5e1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step used to compute Cotswold Council Tax Support tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Cotswold Council Tax Support tariff income capital step + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, sections 39.1-39.2 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..db909b86c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which Cotswold Council Tax Support tariff income applies. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Cotswold Council Tax Support tariff income threshold + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, sections 39.1-39.2 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..437b4ef49 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate applied to excess income for Cotswold protected-group Council Tax Support. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Cotswold protected Council Tax Support withdrawal rate + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, sections 1.7 and Schedule 5 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..31494de78 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,28 @@ +description: Weekly non-dependant deduction under the Cotswold Council Tax Support scheme by gross weekly income where the non-dependant is in remunerative work. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cotswold Council Tax Support weekly non-dependant deduction + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, sections 55.1 and 58 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..544f62999 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cotswold/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,11 @@ +description: Minimum weekly hours for remunerative work under the Cotswold Council Tax Support non-dependant deduction rules. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Cotswold Council Tax Support non-dependant remunerative-work hours threshold + reference: + - title: Cotswold District Council Council Tax Support Scheme 2026/27, sections 6 and 55 + href: https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/coventry/council_tax_reduction/income_band/support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/coventry/council_tax_reduction/income_band/support_rate.yaml new file mode 100644 index 000000000..f82ca6bc4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/coventry/council_tax_reduction/income_band/support_rate.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction support rate by weekly excess-income band under Coventry's working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 15 + amount: + 2026-04-01: 0.65 + - threshold: + 2026-04-01: 40 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 70 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 80 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Coventry Council Tax Reduction weekly excess-income support rate + reference: + title: Coventry City Council Tax Reduction Scheme 2026/27, Schedule 2 + href: https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027 diff --git a/policyengine_uk/parameters/gov/local_authorities/coventry/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/coventry/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..b9ddda52b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/coventry/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under Coventry's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Coventry Council Tax Reduction capital limit + reference: + title: Coventry City Council Tax Reduction Scheme 2026/27, sections 1.7 and 33.1 + href: https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027 diff --git a/policyengine_uk/parameters/gov/local_authorities/coventry/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/coventry/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..3aaf850d4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/coventry/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,30 @@ +description: Weekly non-dependant deduction under Coventry's working-age Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + threshold_unit: currency-GBP + period: week + type: single_amount + label: Coventry Council Tax Reduction non-dependant deduction + reference: + title: Coventry City Council Tax Reduction Scheme 2026/27, section 58 + href: https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027 +documentation: |- + The 2026/27 scheme states a default GBP 15.95 weekly deduction for remunerative-work non-dependants, reduced to GBP 5.20, GBP 10.60, or GBP 13.30 for the listed gross-income bands. + This scale is keyed to normal gross weekly income, with the GBP 605+ bracket returning the default full working deduction. diff --git a/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..14aeabbac --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the Crawley Council Tax Reduction scheme. +values: + 2025-04-01: 1 +metadata: + unit: /1 + period: year + label: Crawley Council Tax Reduction maximum support rate + reference: + - title: Crawley Council Tax Reduction Scheme 2025/26 + href: https://crawley.gov.uk/sites/default/files/2025-02/Council%20Tax%20Reduction%20scheme%202025%20to%202026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..6337e71d4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Crawley Council Tax Reduction scheme. +values: + 2025-04-01: 9_000 +metadata: + unit: currency-GBP + period: year + label: Crawley Council Tax Reduction capital limit + reference: + - title: Crawley Council Tax Reduction Scheme 2025/26 + href: https://crawley.gov.uk/sites/default/files/2025-02/Council%20Tax%20Reduction%20scheme%202025%20to%202026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..0f8f1aa1f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Crawley Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Crawley Council Tax Reduction withdrawal rate + reference: + - title: Crawley Council Tax Reduction Scheme 2025/26 + href: https://crawley.gov.uk/sites/default/files/2025-02/Council%20Tax%20Reduction%20scheme%202025%20to%202026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..0acbc1f58 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/crawley/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Crawley Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 100 + amount: + 2025-04-01: 10 + - threshold: + 2025-04-01: 200 + amount: + 2025-04-01: 15 + - threshold: + 2025-04-01: 300 + amount: + 2025-04-01: 20 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Crawley Council Tax Reduction non-dependant deduction schedule + reference: + - title: Crawley Council Tax Reduction Scheme 2025/26 + href: https://crawley.gov.uk/sites/default/files/2025-02/Council%20Tax%20Reduction%20scheme%202025%20to%202026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/disabled_working_weekly_income_disregard.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/disabled_working_weekly_income_disregard.yaml new file mode 100644 index 000000000..442e34f08 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/disabled_working_weekly_income_disregard.yaml @@ -0,0 +1,11 @@ +description: Weekly income disregard for Croydon disability claims where the claimant or partner is working. +values: + 2026-04-01: 50 +metadata: + unit: currency-GBP + label: Croydon Council Tax Support disabled working weekly income disregard + reference: + - title: Croydon Council, How we work out the amount of Council Tax support + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support + - title: Croydon Council, Example support calculations + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/example-support-calculations diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/income_band/disabled_not_working.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/income_band/disabled_not_working.yaml new file mode 100644 index 000000000..bcc727568 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/income_band/disabled_not_working.yaml @@ -0,0 +1,15 @@ +description: Council Tax Support rate by weekly household income for Croydon disabled non-working claimants. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Croydon disabled non-working weekly household income CTS rate + reference: + - title: Croydon Council, How we work out the amount of Council Tax support + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/income_band/lone_parent_child_under_5.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/income_band/lone_parent_child_under_5.yaml new file mode 100644 index 000000000..3f72ab8e6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/income_band/lone_parent_child_under_5.yaml @@ -0,0 +1,43 @@ +description: Council Tax Support rate by weekly household income for working-age Croydon lone parents with a child under age 5. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.80 + - threshold: + 2026-04-01: 158 + amount: + 2026-04-01: 0.70 + - threshold: + 2026-04-01: 208 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 258 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 308 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 358 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 408 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 458 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Croydon lone-parent-under-5 weekly household income CTS rate + reference: + - title: Croydon Council, How we work out the amount of Council Tax support + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/income_band/standard.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/income_band/standard.yaml new file mode 100644 index 000000000..a4ab71dec --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/income_band/standard.yaml @@ -0,0 +1,43 @@ +description: Council Tax Support rate by weekly household income for standard working-age Croydon claimants. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 158 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 208 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 258 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 308 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 358 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 408 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 458 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Croydon standard weekly household income CTS rate + reference: + - title: Croydon Council, How we work out the amount of Council Tax support + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..7d6ef949c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: Highest Council Tax band ratio eligible for standard working-age Croydon Council Tax Support. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Croydon Council Tax Support maximum eligible Band D ratio + reference: + - title: Croydon Council, How we work out the amount of Council Tax support + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/means_test/capital_limit/disabled_not_working.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/means_test/capital_limit/disabled_not_working.yaml new file mode 100644 index 000000000..dca316ec1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/means_test/capital_limit/disabled_not_working.yaml @@ -0,0 +1,9 @@ +description: Capital limit for Croydon disabled non-working Council Tax Support claimants. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + label: Croydon disabled non-working Council Tax Support capital limit + reference: + - title: Croydon Council, Your capital - savings, investments and property + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/your-capital-savings-investments-and-property diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/means_test/capital_limit/standard.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/means_test/capital_limit/standard.yaml new file mode 100644 index 000000000..5c1b17834 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/means_test/capital_limit/standard.yaml @@ -0,0 +1,9 @@ +description: Capital limit for standard working-age Croydon Council Tax Support claimants. +values: + 2026-04-01: 8_000 +metadata: + unit: currency-GBP + label: Croydon standard Council Tax Support capital limit + reference: + - title: Croydon Council, Your capital - savings, investments and property + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/your-capital-savings-investments-and-property diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/non_dep_deduction/not_working_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/non_dep_deduction/not_working_amount.yaml new file mode 100644 index 000000000..4ac93f18e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/non_dep_deduction/not_working_amount.yaml @@ -0,0 +1,9 @@ +description: Weekly non-dependant deduction for Croydon Council Tax Support where the non-dependant is not working. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + label: Croydon Council Tax Support non-dependant not-working deduction + reference: + - title: Croydon Council, Other people who live with you + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/other-people-who-live-you diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/non_dep_deduction/working_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/non_dep_deduction/working_amount.yaml new file mode 100644 index 000000000..08e74525a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/non_dep_deduction/working_amount.yaml @@ -0,0 +1,19 @@ +description: Weekly non-dependant deduction by annualised earned income for Croydon Council Tax Support where the non-dependant is working. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 10 + - threshold: + 2026-04-01: 24_000 + amount: + 2026-04-01: 30 +metadata: + amount_unit: currency-GBP + period: year + threshold_unit: currency-GBP + type: single_amount + label: Croydon Council Tax Support working non-dependant deduction + reference: + - title: Croydon Council, Other people who live with you + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/other-people-who-live-you diff --git a/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/universal_credit/ignored_carer_element_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/universal_credit/ignored_carer_element_rate.yaml new file mode 100644 index 000000000..32c181bf0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/croydon/council_tax_reduction/universal_credit/ignored_carer_element_rate.yaml @@ -0,0 +1,9 @@ +description: Share of the Universal Credit carer element ignored when calculating Croydon Council Tax Support income. +values: + 2026-04-01: 0.5 +metadata: + unit: /1 + label: Croydon Council Tax Support ignored Universal Credit carer element rate + reference: + - title: London Borough of Croydon, Council Tax support scheme booklet + href: https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..f4d3d79d0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered by Cumberland working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Cumberland working-age Council Tax Reduction maximum support rate + reference: + - title: Cumberland Council Tax Reduction Scheme 2026/27, section 57.1 + href: https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..f29dca635 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for Cumberland working-age Council Tax Reduction. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Cumberland working-age Council Tax Reduction capital limit + reference: + - title: Cumberland Council Tax Reduction Scheme 2026/27, section 4.1(g) + href: https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..45e8baafc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly assumed income per capital step for Cumberland working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Cumberland Council Tax Reduction tariff income per step + reference: + - title: Cumberland Council Tax Reduction Scheme 2026/27, section 42.1 + href: https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..cdbd80b2f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step for Cumberland working-age Council Tax Reduction tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Cumberland Council Tax Reduction tariff income capital step + reference: + - title: Cumberland Council Tax Reduction Scheme 2026/27, section 42.1 + href: https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..61e845377 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which Cumberland assumes tariff income for working-age Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Cumberland Council Tax Reduction tariff income threshold + reference: + - title: Cumberland Council Tax Reduction Scheme 2026/27, section 42.1 + href: https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..f138c9229 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate on excess income for Cumberland working-age Council Tax Reduction. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Cumberland Council Tax Reduction excess-income withdrawal rate + reference: + - title: Cumberland Council Tax Reduction Scheme 2026/27, sections 4.1 and 59.1 + href: https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..f9a79513c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction by gross weekly income for Cumberland working-age Council Tax Reduction. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Cumberland Council Tax Reduction non-dependant deduction amount + reference: + - title: Cumberland Council Tax Reduction Scheme 2026/27, sections 58.1 and 58.2 + href: https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..10581ff6f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/cumberland/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Cumberland working-age Council Tax Reduction non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Cumberland Council Tax Reduction non-dependant remunerative-work hours + reference: + - title: Cumberland Council Tax Reduction Scheme 2026/27, sections 2.1 and 6.1 + href: https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..a154c9dc5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Darlington Council Tax Support scheme. +values: + 2025-04-01: 0.8 +metadata: + unit: /1 + period: year + label: Darlington Council Tax Support maximum support rate + reference: + - title: Darlington Council Tax Support scheme 2025-26 + href: https://www.darlington.gov.uk/media/czqfj5rz/council-tax-support-scheme-25-26-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..5ea9b5e7e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Darlington Council Tax Support scheme. +values: + 2025-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Darlington Council Tax Support capital limit + reference: + - title: Darlington Council Tax Support scheme 2025-26 + href: https://www.darlington.gov.uk/media/czqfj5rz/council-tax-support-scheme-25-26-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..6e03d1d55 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Darlington Council Tax Support scheme. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Darlington Council Tax Support withdrawal rate + reference: + - title: Darlington Council Tax Support scheme 2025-26 + href: https://www.darlington.gov.uk/media/czqfj5rz/council-tax-support-scheme-25-26-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..8385820d4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/darlington/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Darlington Council Tax Support scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 12.8 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Darlington Council Tax Support non-dependant deduction schedule + reference: + - title: Darlington Council Tax Support scheme 2025-26 + href: https://www.darlington.gov.uk/media/czqfj5rz/council-tax-support-scheme-25-26-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..146369076 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,11 @@ +description: Dartford Council Tax Reduction weekly earnings disregard for non-Universal Credit claimants +metadata: + unit: currency-GBP + period: week + reference: + - title: Dartford Borough Council Council Tax Reduction web page, working-age rules + href: https://www.dartford.gov.uk/benefits/council-tax-reduction-1 + - title: Dartford Borough Council Local Council Tax Reduction Scheme 2026/27, paragraph 19.1 + href: https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027 +values: + 2026-04-01: 25 diff --git a/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..47455afc7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,31 @@ +description: Dartford Council Tax Reduction weekly income band support rates for couples without children +metadata: + unit: /1 + type: single_amount + threshold_unit: currency-GBP + amount_unit: /1 + period: week + reference: + - title: Dartford Borough Council Local Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027 +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 155 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 219 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 284 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 385 + amount: + 2026-04-01: 0 diff --git a/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/one_child.yaml new file mode 100644 index 000000000..087eb5b5f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/one_child.yaml @@ -0,0 +1,31 @@ +description: Dartford Council Tax Reduction weekly income band support rates for couples or lone parents with one child or young person +metadata: + unit: /1 + type: single_amount + threshold_unit: currency-GBP + amount_unit: /1 + period: week + reference: + - title: Dartford Borough Council Local Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027 +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 233 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 297 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 360 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 490 + amount: + 2026-04-01: 0 diff --git a/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..e4d9f6a55 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,31 @@ +description: Dartford Council Tax Reduction weekly income band support rates for single claimants +metadata: + unit: /1 + type: single_amount + threshold_unit: currency-GBP + amount_unit: /1 + period: week + reference: + - title: Dartford Borough Council Local Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027 +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 104 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 168 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 233 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 334 + amount: + 2026-04-01: 0 diff --git a/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/two_or_more_children.yaml new file mode 100644 index 000000000..b071cb12f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/income_band/two_or_more_children.yaml @@ -0,0 +1,31 @@ +description: Dartford Council Tax Reduction weekly income band support rates for couples or lone parents with two or more children or young persons +metadata: + unit: /1 + type: single_amount + threshold_unit: currency-GBP + amount_unit: /1 + period: week + reference: + - title: Dartford Borough Council Local Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027 +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 309 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 385 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 450 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 578 + amount: + 2026-04-01: 0 diff --git a/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..1eb5d9ebf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,9 @@ +description: Dartford Council Tax Reduction capital limit +metadata: + unit: currency-GBP + period: year + reference: + - title: Dartford Borough Council Local Council Tax Reduction Scheme 2026/27, paragraph 27.1 and Schedule 1 paragraph 5 + href: https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027 +values: + 2026-04-01: 6_000 diff --git a/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/means_test/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/means_test/minimum_award.yaml new file mode 100644 index 000000000..19ea1232d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dartford/council_tax_reduction/means_test/minimum_award.yaml @@ -0,0 +1,9 @@ +description: Dartford Council Tax Reduction weekly minimum award +metadata: + unit: currency-GBP + period: week + reference: + - title: Dartford Borough Council Local Council Tax Reduction Scheme 2026/27, paragraph 39.5 + href: https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027 +values: + 2026-04-01: 1 diff --git a/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..b1f5fa6fd --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Maximum council tax band ratio used to cap eligible liability for working-age households under Derby's Council Tax Support scheme. +values: + 2026-04-01: 0.777777778 +metadata: + unit: /1 + period: year + label: Derby Council Tax Support capped Band B ratio + reference: + - title: Derby City Council Tax Support Scheme 2026/2027, section 3 + href: https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..e8a2f159c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of Band B-capped eligible Council Tax liability covered under Derby's Council Tax Support scheme. +values: + 2026-04-01: 0.8 +metadata: + unit: /1 + period: year + label: Derby Council Tax Support maximum support rate + reference: + - title: Derby City Council Tax Support Scheme 2026/2027, section 3 + href: https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..350b5a449 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under Derby's Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Derby Council Tax Support capital limit + reference: + - title: Derby City Council Tax Support Scheme 2026/2027, section 4 + href: https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/means_test/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/means_test/minimum_award.yaml new file mode 100644 index 000000000..3806fcd46 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/means_test/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly Council Tax Support award under Derby's working-age scheme. +values: + 2026-04-01: 4 +metadata: + unit: currency-GBP + period: week + label: Derby Council Tax Support minimum weekly award + reference: + - title: Derby City Council Tax Support Scheme 2026/2027, section 4 + href: https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..a137bfaba --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,12 @@ +description: Withdrawal rate for working-age households under Derby's Council Tax Support scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Derby Council Tax Support withdrawal rate + reference: + - title: Derby City Council Tax Support Scheme 2026/2027, section 3 + href: https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf + - title: The Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule 1 paragraph 39 + href: https://www.legislation.gov.uk/uksi/2012/2886/schedule/1 diff --git a/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..e142511a1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,31 @@ +description: Weekly Housing Benefit-aligned non-dependant deduction schedule retained under Derby's Council Tax Support scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 20.40 + - threshold: + 2026-04-01: 192 + amount: + 2026-04-01: 46.85 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 64.35 + - threshold: + 2026-04-01: 365 + amount: + 2026-04-01: 105.20 +metadata: + amount_unit: currency-GBP + threshold_unit: currency-GBP + period: week + type: single_amount + label: Derby Council Tax Support non-dependant deduction schedule + reference: + - title: Derby City Council Tax Support Scheme 2026/2027, section 4 + href: https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf + - title: Benefit and pension rates 2026 to 2027, Housing Benefit non-dependant deductions + href: https://www.gov.uk/government/publications/benefit-and-pension-rates-2026-to-2027/proposed-benefit-and-pension-rates-2026-to-2027 +documentation: |- + Derby aligns Council Tax Support non-dependant rules and deduction rates to the Housing Benefit scheme, but does not use the two highest Housing Benefit deduction rates. The GBP 485 and GBP 605 Housing Benefit rates are therefore capped to the GBP 365-to-GBP 484.99 rate in this table. Derby also substitutes a GBP 4 weekly deduction for working non-dependants with gross weekly income below GBP 100 and for non-working passported or UC non-dependants. diff --git a/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/non_dep_deduction/low_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/non_dep_deduction/low_amount.yaml new file mode 100644 index 000000000..1400c8350 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/non_dep_deduction/low_amount.yaml @@ -0,0 +1,10 @@ +description: Derby weekly non-dependant deduction for non-dependants with low earnings or non-working passported or UC status. +values: + 2026-04-01: 4 +metadata: + unit: currency-GBP + period: week + label: Derby Council Tax Support low non-dependant deduction + reference: + - title: Derby City Council Tax Support Scheme 2026/2027, section 4 + href: https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/non_dep_deduction/low_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/non_dep_deduction/low_income_threshold.yaml new file mode 100644 index 000000000..f2c09b33b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/derby/council_tax_reduction/non_dep_deduction/low_income_threshold.yaml @@ -0,0 +1,10 @@ +description: Gross weekly income threshold below which Derby applies its local low non-dependant deduction for working non-dependants. +values: + 2026-04-01: 100 +metadata: + unit: currency-GBP + period: week + label: Derby Council Tax Support low non-dependant income threshold + reference: + - title: Derby City Council Tax Support Scheme 2026/2027, section 4 + href: https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..ce09e72d6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,12 @@ +description: Maximum council tax band ratio used to cap eligible liability for working-age households under the Dudley Council Tax Reduction scheme. +values: + 2025-04-01: 0.888888889 +metadata: + unit: /1 + period: year + label: Dudley Council Tax Reduction capped band ratio + reference: + - title: Council Tax Reduction Scheme + href: https://www.dudley.gov.uk/residents/benefits/council-tax-reduction-scheme/ + - title: Dudley MBC Council Tax Reduction Scheme 2025-26 + href: https://www.dudley.gov.uk/media/khllf4zc/dudley-council-tax-reduction-scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..b3df2c118 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Dudley Council Tax Reduction scheme. +values: + 2025-04-01: 0.4 +metadata: + unit: /1 + period: year + label: Dudley Council Tax Reduction maximum support rate + reference: + - title: Council Tax Reduction Scheme + href: https://www.dudley.gov.uk/residents/benefits/council-tax-reduction-scheme/ + - title: Dudley MBC Council Tax Reduction Scheme 2025-26 + href: https://www.dudley.gov.uk/media/khllf4zc/dudley-council-tax-reduction-scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..208f93c6e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit under the Dudley Council Tax Reduction means test. +values: + 2025-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Dudley Council Tax Reduction capital limit + reference: + - title: Council Tax Reduction Scheme + href: https://www.dudley.gov.uk/residents/benefits/council-tax-reduction-scheme/ + - title: Dudley MBC Council Tax Reduction Scheme 2025-26 + href: https://www.dudley.gov.uk/media/khllf4zc/dudley-council-tax-reduction-scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..1e74d6b2b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,12 @@ +description: Withdrawal rate under the Dudley Council Tax Reduction means test. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Dudley Council Tax Reduction withdrawal rate + reference: + - title: Council Tax Reduction Scheme + href: https://www.dudley.gov.uk/residents/benefits/council-tax-reduction-scheme/ + - title: Dudley MBC Council Tax Reduction Scheme 2025-26 + href: https://www.dudley.gov.uk/media/khllf4zc/dudley-council-tax-reduction-scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..959982c24 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/dudley/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,12 @@ +description: Weekly non-dependant deduction under the Dudley Council Tax Reduction scheme. +values: + 2025-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Dudley Council Tax Reduction non-dependant deduction amount + reference: + - title: Council Tax Reduction Scheme + href: https://www.dudley.gov.uk/residents/benefits/council-tax-reduction-scheme/ + - title: Dudley MBC Council Tax Reduction Scheme 2025-26 + href: https://www.dudley.gov.uk/media/khllf4zc/dudley-council-tax-reduction-scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/earnings_disregard/couple_or_lone_parent.yaml b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/earnings_disregard/couple_or_lone_parent.yaml new file mode 100644 index 000000000..98572978e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/earnings_disregard/couple_or_lone_parent.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Ealing Council Tax Reduction claimants who are not single and not receiving Universal Credit. +values: + 2026-04-01: 38.54 +metadata: + unit: currency-GBP + period: week + label: Ealing CTR couple or lone-parent earnings disregard + reference: + - title: Ealing Council Tax Reduction Scheme Effective April 2026, Income + href: https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/income_band/non_protected.yaml b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/income_band/non_protected.yaml new file mode 100644 index 000000000..e7d90a2cb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/income_band/non_protected.yaml @@ -0,0 +1,43 @@ +description: Ealing non-protected working-age Council Tax Reduction award rate by weekly income band. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.80 + - threshold: + 2026-04-01: 154.19 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 179.90 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 205.59 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 231.30 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 257 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 282.68 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 308.40 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Ealing non-protected weekly income CTR award rate + reference: + - title: Ealing Council Tax Reduction Scheme Effective April 2026, Council Tax Reduction Calculation Table + href: https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/income_band/protected.yaml b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/income_band/protected.yaml new file mode 100644 index 000000000..78dfe51f3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/income_band/protected.yaml @@ -0,0 +1,47 @@ +description: Ealing protected working-age Council Tax Reduction award rate by weekly income band. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 154.19 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 179.90 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 205.59 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 231.30 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 257 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 282.68 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 308.40 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 334.09 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Ealing protected weekly income CTR award rate + reference: + - title: Ealing Council Tax Reduction Scheme Effective April 2026, Council Tax Reduction Calculation Table + href: https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..3450c389e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Working-age capital limit for Ealing Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Ealing working-age CTR capital limit + reference: + - title: Ealing Council Tax Reduction Scheme Effective April 2026, Classes of persons + href: https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/minimum_award.yaml new file mode 100644 index 000000000..3b93711c1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly award for Ealing Council Tax Reduction. +values: + 2026-04-01: 2 +metadata: + unit: currency-GBP + period: week + label: Ealing CTR minimum weekly award + reference: + - title: Ealing Council Tax Reduction Scheme Effective April 2026, Minimum Council Tax Reduction + href: https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..59be443f3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ealing/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,23 @@ +description: Ealing working-age non-dependant deduction by weekly gross earned income. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 8.35 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 15.42 + - threshold: + 2026-04-01: 235.16 + amount: + 2026-04-01: 23.13 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Ealing working-age CTR non-dependant deduction + reference: + - title: Ealing Council Tax Reduction Scheme Effective April 2026, Non-dependant deductions + href: https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..fa323a670 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of eligible Council Tax liability covered under the East Cambridgeshire Council Tax Reduction scheme. +values: + 2025-04-01: 0.915 + 2026-04-01: 0.915 +metadata: + unit: /1 + period: year + label: East Cambridgeshire Council Tax Reduction maximum support rate + reference: + - title: East Cambridgeshire District Council Council Tax Reduction Schemes 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Cambridgeshire-District-Council-Council-Tax-Reduction-Schemes-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..b048ab5c5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the East Cambridgeshire Council Tax Reduction scheme. +values: + 2025-04-01: 10_000 + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: East Cambridgeshire Council Tax Reduction capital limit + reference: + - title: East Cambridgeshire District Council Council Tax Reduction Schemes 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Cambridgeshire-District-Council-Council-Tax-Reduction-Schemes-2025-26.pdf + - title: Anglia Revenues Partnership Apply for Council Tax Reduction and or Housing Benefit + href: https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ diff --git a/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..fb893f118 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate for working-age households under the East Cambridgeshire Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: East Cambridgeshire Council Tax Reduction withdrawal rate + reference: + - title: East Cambridgeshire District Council Council Tax Reduction Schemes 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Cambridgeshire-District-Council-Council-Tax-Reduction-Schemes-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..e612e2c74 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_cambridgeshire/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly non-dependant deduction under the East Cambridgeshire Council Tax Reduction scheme for working-age households. +values: + 2025-04-01: 8.03 + 2026-04-01: 8.34 +metadata: + unit: currency-GBP + period: week + label: East Cambridgeshire Council Tax Reduction working-age non-dependant deduction amount + reference: + - title: East Cambridgeshire District Council Council Tax Reduction Schemes 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Cambridgeshire-District-Council-Council-Tax-Reduction-Schemes-2025-26.pdf + - title: Anglia Revenues Partnership Council Tax Reduction non-dependant deductions + href: https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm diff --git a/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..faa7fb8e6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: East Hampshire Council Tax Support maximum support rate +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: East Hampshire Council Tax Support maximum support rate + reference: + - title: East Hampshire District Council - Council Tax Support Scheme 2026/27, paragraph 29 + href: https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..882ad9864 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: East Hampshire Council Tax Support capital limit +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: East Hampshire Council Tax Support capital limit + reference: + - title: East Hampshire District Council - Council Tax Support Scheme 2026/27, paragraph 23 + href: https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..86ec44e19 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: East Hampshire Council Tax Support excess income withdrawal rate +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: East Hampshire Council Tax Support withdrawal rate + reference: + - title: East Hampshire District Council - Council Tax Support Scheme 2026/27, Class E + href: https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..9f77ea7ff --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: East Hampshire weekly non-dependant deduction by weekly gross income +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: East Hampshire Council Tax Support non-dependant deduction + reference: + - title: East Hampshire District Council - Council Tax Support Scheme 2026/27, paragraph 30 + href: https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..043cb965a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_hampshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: East Hampshire non-dependant remunerative work threshold +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: East Hampshire non-dependant remunerative work hours + reference: + - title: East Hampshire District Council - Council Tax Support Scheme 2026/27, paragraphs 10 and 30 + href: https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..75be49823 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the East Hertfordshire Council Tax Reduction scheme. +values: + 2025-04-01: 0.915 +metadata: + unit: /1 + period: year + label: East Hertfordshire Council Tax Reduction maximum support rate + reference: + - title: Council Tax Support + href: https://www.eastherts.gov.uk/benefits-and-financial-support/council-tax-support + - title: East Hertfordshire District Council Council Tax Reduction Scheme 2025/26 + href: https://cdn-eastherts.onwebcurl.com/s3fs-public/2025-03/East%20Herts%20S13a%20202526%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..a55b3f569 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under the East Hertfordshire Council Tax Reduction means test. +values: + 2025-04-01: 16000 +metadata: + unit: currency-GBP + period: year + label: East Hertfordshire Council Tax Reduction capital limit + reference: + - title: East Hertfordshire District Council Council Tax Reduction Scheme 2025/26 + href: https://cdn-eastherts.onwebcurl.com/s3fs-public/2025-03/East%20Herts%20S13a%20202526%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..6a98ffe1c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate under the East Hertfordshire Council Tax Reduction means test. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: East Hertfordshire Council Tax Reduction withdrawal rate + reference: + - title: East Hertfordshire District Council Council Tax Reduction Scheme 2025/26 + href: https://cdn-eastherts.onwebcurl.com/s3fs-public/2025-03/East%20Herts%20S13a%20202526%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..7ea9e233f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_hertfordshire/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the East Hertfordshire Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 12.8 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: East Hertfordshire Council Tax Reduction non-dependant deduction schedule + reference: + - title: East Hertfordshire District Council Council Tax Reduction Scheme 2025/26 + href: https://cdn-eastherts.onwebcurl.com/s3fs-public/2025-03/East%20Herts%20S13a%20202526%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..72e5aeffb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the East Suffolk Council Tax Reduction scheme. +values: + 2025-04-01: 0.915 + 2026-04-01: 0.915 +metadata: + unit: /1 + period: year + label: East Suffolk Council Tax Reduction maximum support rate + reference: + - title: East Suffolk Council Council Tax Reduction Scheme 2025/2026 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..2f3c3547b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the East Suffolk Council Tax Reduction scheme. +values: + 2025-04-01: 10_000 + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: East Suffolk Council Tax Reduction capital limit + reference: + - title: East Suffolk Council Council Tax Reduction Scheme 2025/2026 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf + - title: Anglia Revenues Partnership Apply for Council Tax Reduction and or Housing Benefit + href: https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ diff --git a/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..fae0d8b4e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate for working-age households under the East Suffolk Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: East Suffolk Council Tax Reduction withdrawal rate + reference: + - title: East Suffolk Council Council Tax Reduction Scheme 2025/2026 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..eb80f43ec --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/east_suffolk/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly non-dependant deduction under the East Suffolk Council Tax Reduction scheme for working-age households. +values: + 2025-04-01: 8.03 + 2026-04-01: 8.34 +metadata: + unit: currency-GBP + period: week + label: East Suffolk Council Tax Reduction working-age non-dependant deduction amount + reference: + - title: East Suffolk Council Council Tax Reduction Scheme 2025/2026 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf + - title: Anglia Revenues Partnership Council Tax Reduction non-dependant deductions + href: https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..2670cb830 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: Maximum English council tax band ratio eligible for Enfield working-age Council Tax Reduction. +values: + 2026-04-01: 0.8888888889 +metadata: + unit: /1 + label: Enfield CTR Band C liability cap ratio + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 9 + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/maximum_support_rate/non_protected.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/maximum_support_rate/non_protected.yaml new file mode 100644 index 000000000..009c6ee1b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/maximum_support_rate/non_protected.yaml @@ -0,0 +1,9 @@ +description: Maximum Council Tax Reduction rate for Enfield working-age applicants who do not receive Universal Credit and are not in a protected group. +values: + 2026-04-01: 0.50 +metadata: + unit: /1 + label: Enfield non-protected maximum CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 39 + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/maximum_support_rate/protected.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/maximum_support_rate/protected.yaml new file mode 100644 index 000000000..d4bc182f9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/maximum_support_rate/protected.yaml @@ -0,0 +1,9 @@ +description: Maximum Council Tax Reduction rate for Enfield working-age protected-group applicants who do not receive Universal Credit. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Enfield protected maximum CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 39 + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..de1cfdda1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Working-age capital limit for Enfield Council Tax Reduction. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Enfield working-age CTR capital limit + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraphs 12, 30, and Appendix 3 overall conditions + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..868a663df --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly assumed income per capital step for Enfield non-Universal Credit working-age CTR. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Enfield non-UC CTR tariff income per step + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 37 + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..441f3dd22 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step for Enfield non-Universal Credit working-age CTR tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Enfield non-UC CTR tariff income capital step + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 37 + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..2c7098d89 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which Enfield assumes tariff income for non-Universal Credit working-age Council Tax Reduction applicants. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Enfield non-UC CTR tariff income threshold + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 37 + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..8fa508c39 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,9 @@ +description: Excess-income withdrawal rate for Enfield working-age applicants who do not receive Universal Credit. +values: + 2026-04-01: 0.225 +metadata: + unit: /1 + label: Enfield non-UC CTR withdrawal rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 41 and footnote 14 + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/minimum_award.yaml new file mode 100644 index 000000000..c3a6a878e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly award for Enfield working-age Council Tax Reduction. +values: + 2026-04-01: 0.50 +metadata: + unit: currency-GBP + period: week + label: Enfield CTR minimum weekly award + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 43 + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..8a1c8d691 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Enfield working-age non-dependant deduction by weekly gross earnings. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.52 + - threshold: + 2026-04-01: 236 + amount: + 2026-04-01: 11.28 + - threshold: + 2026-04-01: 410 + amount: + 2026-04-01: 14.16 + - threshold: + 2026-04-01: 511 + amount: + 2026-04-01: 24.60 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Enfield working-age CTR non-dependant deduction + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraphs 47-48 + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/couple.yaml new file mode 100644 index 000000000..dc639d05e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/couple.yaml @@ -0,0 +1,31 @@ +description: Enfield Universal Credit weekly net-earnings CTR rate for couple working-age households outside the protected group. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 55.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 148.65 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 203.70 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 258.75 + amount: + 2026-04-01: 0.10 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Enfield UC couple non-protected CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 10 and Appendix 3 earnings bands + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/family_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/family_one_child.yaml new file mode 100644 index 000000000..5b50556ce --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/family_one_child.yaml @@ -0,0 +1,31 @@ +description: Enfield Universal Credit weekly net-earnings CTR rate for working-age families or lone parents with one child outside the protected group. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 55.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 203.70 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 258.75 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 313.80 + amount: + 2026-04-01: 0.10 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Enfield UC one-child non-protected CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 10 and Appendix 3 earnings bands + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/family_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/family_two_or_more_children.yaml new file mode 100644 index 000000000..74b9fee78 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/family_two_or_more_children.yaml @@ -0,0 +1,31 @@ +description: Enfield Universal Credit weekly net-earnings CTR rate for working-age families or lone parents with two or more children outside the protected group. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 55.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 258.75 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 313.80 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 368.85 + amount: + 2026-04-01: 0.10 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Enfield UC two-child non-protected CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 10 and Appendix 3 earnings bands + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/single.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/single.yaml new file mode 100644 index 000000000..3153b1ff2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/non_protected/single.yaml @@ -0,0 +1,31 @@ +description: Enfield Universal Credit weekly net-earnings CTR rate for single working-age households outside the protected group. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 55.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 104.61 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 159.66 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 214.71 + amount: + 2026-04-01: 0.10 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Enfield UC single non-protected CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 10 and Appendix 3 earnings bands + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/couple.yaml new file mode 100644 index 000000000..7aa4fc0db --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/couple.yaml @@ -0,0 +1,31 @@ +description: Enfield Universal Credit weekly net-earnings CTR rate for protected working-age couple households. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 55.01 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 148.65 + amount: + 2026-04-01: 0.70 + - threshold: + 2026-04-01: 203.70 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 258.75 + amount: + 2026-04-01: 0.40 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Enfield UC couple protected CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 10 and Appendix 3 earnings bands + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/family_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/family_one_child.yaml new file mode 100644 index 000000000..a16469353 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/family_one_child.yaml @@ -0,0 +1,31 @@ +description: Enfield Universal Credit weekly net-earnings CTR rate for protected working-age families or lone parents with one child. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 55.01 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 203.70 + amount: + 2026-04-01: 0.70 + - threshold: + 2026-04-01: 258.75 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 313.80 + amount: + 2026-04-01: 0.40 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Enfield UC one-child protected CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 10 and Appendix 3 earnings bands + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/family_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/family_two_or_more_children.yaml new file mode 100644 index 000000000..6974a5ec7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/family_two_or_more_children.yaml @@ -0,0 +1,31 @@ +description: Enfield Universal Credit weekly net-earnings CTR rate for protected working-age families or lone parents with two or more children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 55.01 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 258.75 + amount: + 2026-04-01: 0.70 + - threshold: + 2026-04-01: 313.80 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 368.85 + amount: + 2026-04-01: 0.40 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Enfield UC two-child protected CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 10 and Appendix 3 earnings bands + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/single.yaml b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/single.yaml new file mode 100644 index 000000000..a854c3b5d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/enfield/council_tax_reduction/uc_income_band/protected/single.yaml @@ -0,0 +1,31 @@ +description: Enfield Universal Credit weekly net-earnings CTR rate for protected working-age single households. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 55.01 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 104.61 + amount: + 2026-04-01: 0.70 + - threshold: + 2026-04-01: 159.66 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 214.71 + amount: + 2026-04-01: 0.40 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Enfield UC single protected CTR rate + reference: + - title: Enfield Council Tax Reduction Scheme 2026-2027, paragraph 10 and Appendix 3 earnings bands + href: https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax/band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax/band_ratio.yaml new file mode 100644 index 000000000..ce9a12756 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax/band_ratio.yaml @@ -0,0 +1,38 @@ +A: + values: + 0001-01-01: 0.666666667 +B: + values: + 0001-01-01: 0.777777778 +C: + values: + 0001-01-01: 0.888888889 +D: + values: + 0001-01-01: 1 +E: + values: + 0001-01-01: 1.222222222 +F: + values: + 0001-01-01: 1.444444444 +G: + values: + 0001-01-01: 1.666666667 +H: + values: + 0001-01-01: 2 +I: + values: + 0001-01-01: 2.333333333 +description: England Council Tax band ratios relative to Band D. +metadata: + unit: /1 + period: year + label: England Council Tax band ratios + propagate_metadata_to_children: true + reference: + - title: Council Tax bands + href: https://www.gov.uk/council-tax-bands + - title: The Local Government Finance Act 1992 (Consequential Amendments) Regulations 2012 explanatory memorandum + href: https://www.legislation.gov.uk/uksi/2012/2914/pdfs/uksiem_20122914_en.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/maximum_support_rate.yaml new file mode 100644 index 000000000..bb0c52367 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered for pensioner households under the England Council Tax Reduction scheme. +values: + 2013-04-01: 1 +metadata: + unit: /1 + period: year + label: England Council Tax Reduction pensioner maximum support rate + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 + href: https://www.legislation.gov.uk/uksi/2012/2885/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/capital_limit.yaml new file mode 100644 index 000000000..c6543dad0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for pensioner households under the England Council Tax Reduction scheme. +values: + 2013-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: England Council Tax Reduction pensioner capital limit + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 + href: https://www.legislation.gov.uk/uksi/2012/2885/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..c8ca6101a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for pensioner households under the England Council Tax Reduction scheme. +values: + 2013-04-01: 0.2 +metadata: + unit: /1 + period: year + label: England Council Tax Reduction pensioner withdrawal rate + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 + href: https://www.legislation.gov.uk/uksi/2012/2885/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..818a34b24 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of eligible Council Tax liability covered under the Fenland Council Tax Reduction scheme. +values: + 2025-04-01: 1 + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Fenland Council Tax Reduction maximum support rate + reference: + - title: Fenland District Council Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Fenland-District-Council-Council-Tax-Reduction-Scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..731a5b189 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the Fenland Council Tax Reduction scheme. +values: + 2025-04-01: 10_000 + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Fenland Council Tax Reduction capital limit + reference: + - title: Fenland District Council Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Fenland-District-Council-Council-Tax-Reduction-Scheme-2025-26.pdf + - title: Anglia Revenues Partnership Apply for Council Tax Reduction and or Housing Benefit + href: https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ diff --git a/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..590e881f4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate for working-age households under the Fenland Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Fenland Council Tax Reduction withdrawal rate + reference: + - title: Fenland District Council Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Fenland-District-Council-Council-Tax-Reduction-Scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..53083b836 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/fenland/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly non-dependant deduction under the Fenland Council Tax Reduction scheme for working-age households. +values: + 2025-04-01: 8.03 + 2026-04-01: 8.34 +metadata: + unit: currency-GBP + period: week + label: Fenland Council Tax Reduction working-age non-dependant deduction amount + reference: + - title: Fenland District Council Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Fenland-District-Council-Council-Tax-Reduction-Scheme-2025-26.pdf + - title: Anglia Revenues Partnership Council Tax Reduction non-dependant deductions + href: https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/couple.yaml new file mode 100644 index 000000000..c0b3bd5c3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/couple.yaml @@ -0,0 +1,35 @@ +description: Forest of Dean weekly income-band CTS maximum percentage for Class A (non-protected) couple applicants without children. Paragraph 59.1 sets the six-band couple table (90/70/50/30/10/0 per cent) using net weekly income tiers up to GBP 141.22, GBP 176.22, GBP 226.22, GBP 276.22, GBP 326.22 and above. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 141.23 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 176.23 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 226.23 + amount: + 2026-04-01: 0.3 + - threshold: + 2026-04-01: 276.23 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 326.23 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Forest of Dean Class A weekly income-band CTS rate, couple without children + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraph 59.1 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/couple_with_children.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/couple_with_children.yaml new file mode 100644 index 000000000..3efb79285 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/couple_with_children.yaml @@ -0,0 +1,35 @@ +description: Forest of Dean weekly income-band CTS maximum percentage for Class A (non-protected) couples with children. Paragraph 59.1 sets the six-band couple-with-children table (90/70/50/30/10/0 per cent) using net weekly income tiers up to GBP 237.25, GBP 287.25, GBP 337.25, GBP 387.25, GBP 437.25 and above. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 237.26 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 287.26 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 337.26 + amount: + 2026-04-01: 0.3 + - threshold: + 2026-04-01: 387.26 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 437.26 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Forest of Dean Class A weekly income-band CTS rate, couple with children + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraph 59.1 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/lone_parent.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/lone_parent.yaml new file mode 100644 index 000000000..a6df9edad --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/lone_parent.yaml @@ -0,0 +1,35 @@ +description: Forest of Dean weekly income-band CTS maximum percentage for Class A (non-protected) lone-parent applicants. Paragraph 59.1 sets the six-band lone-parent table (90/70/50/30/10/0 per cent) using net weekly income tiers up to GBP 180.76, GBP 205.76, GBP 255.76, GBP 305.76, GBP 355.76 and above. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 180.77 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 205.77 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 255.77 + amount: + 2026-04-01: 0.3 + - threshold: + 2026-04-01: 305.77 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 355.77 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Forest of Dean Class A weekly income-band CTS rate, lone parent + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraph 59.1 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/single.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/single.yaml new file mode 100644 index 000000000..d3e48e106 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/non_protected/single.yaml @@ -0,0 +1,35 @@ +description: Forest of Dean weekly income-band CTS maximum percentage for Class A (non-protected) single applicants. Paragraph 59.1 sets the six-band single-applicant table (90/70/50/30/10/0 per cent) using net weekly income tiers up to GBP 90.38, GBP 115.38, GBP 140.38, GBP 165.38, GBP 190.38 and above. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 90.39 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 115.39 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 140.39 + amount: + 2026-04-01: 0.3 + - threshold: + 2026-04-01: 165.39 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 190.39 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Forest of Dean Class A weekly income-band CTS rate, single applicant + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraph 59.1 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/couple.yaml new file mode 100644 index 000000000..9cbda5d6e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/couple.yaml @@ -0,0 +1,35 @@ +description: Forest of Dean weekly income-band CTS maximum percentage for Class B (protected) couple applicants without children. Paragraph 59.3 sets the six-band couple table (95/75/55/35/15/0 per cent) using net weekly income tiers up to GBP 141.22, GBP 176.22, GBP 226.22, GBP 276.22, GBP 326.22 and above. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.95 + - threshold: + 2026-04-01: 141.23 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 176.23 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 226.23 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 276.23 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 326.23 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Forest of Dean Class B weekly income-band CTS rate, couple without children + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraph 59.3 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/couple_with_children.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/couple_with_children.yaml new file mode 100644 index 000000000..281b5b3fb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/couple_with_children.yaml @@ -0,0 +1,35 @@ +description: Forest of Dean weekly income-band CTS maximum percentage for Class B (protected) couples with children. Paragraph 59.3 sets the six-band couple-with-children table (95/75/55/35/15/0 per cent) using net weekly income tiers up to GBP 237.25, GBP 287.25, GBP 337.25, GBP 387.25, GBP 437.25 and above. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.95 + - threshold: + 2026-04-01: 237.26 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 287.26 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 337.26 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 387.26 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 437.26 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Forest of Dean Class B weekly income-band CTS rate, couple with children + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraph 59.3 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/lone_parent.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/lone_parent.yaml new file mode 100644 index 000000000..b0e79746c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/lone_parent.yaml @@ -0,0 +1,35 @@ +description: Forest of Dean weekly income-band CTS maximum percentage for Class B (protected) lone-parent applicants. Paragraph 59.3 sets the six-band lone-parent table (95/75/55/35/15/0 per cent) using net weekly income tiers up to GBP 180.76, GBP 205.76, GBP 255.76, GBP 305.76, GBP 355.76 and above. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.95 + - threshold: + 2026-04-01: 180.77 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 205.77 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 255.77 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 305.77 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 355.77 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Forest of Dean Class B weekly income-band CTS rate, lone parent + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraph 59.3 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/single.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/single.yaml new file mode 100644 index 000000000..4b01f3c32 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/income_band/protected/single.yaml @@ -0,0 +1,35 @@ +description: Forest of Dean weekly income-band CTS maximum percentage for Class B (protected) single applicants. Paragraph 59.3 sets the six-band single-applicant table (95/75/55/35/15/0 per cent) using net weekly income tiers up to GBP 90.38, GBP 115.38, GBP 140.38, GBP 165.38, GBP 190.38 and above. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.95 + - threshold: + 2026-04-01: 90.39 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 115.39 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 140.39 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 165.39 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 190.39 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Forest of Dean Class B weekly income-band CTS rate, single applicant + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraph 59.3 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..6a3ca9c92 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: Forest of Dean Council Tax band ratio used to cap working-age maximum eligible liability at the Band E equivalent. Paragraph 57.1(a) and 57.6(a) cap working-age eligible liability at "a Band E equivalent" for both Class A and Class B applicants. The Band E ratio in the English council-tax band schedule is 11/9 (about 1.222) of Band D. +values: + 2026-04-01: 1.222222222222222 +metadata: + unit: /1 + label: Forest of Dean Council Tax Support Band E cap ratio + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraphs 57.1(a) and 57.6(a) + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..4abdf9bdf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Forest of Dean Local Council Tax Support working-age capital limit. Paragraph 33 and the Class A/B criterion (f) exclude applicants whose capital savings exceed 16,000 pounds. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Forest of Dean Council Tax Support capital limit + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraph 33 and Class A/B (f) + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..0d1d9376d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Forest of Dean weekly non-dependant deduction by weekly gross income. Section 58 reproduces the prescribed Default Scheme schedule (footnote 18 directs that the amounts be uprated in line with the Council Tax Reduction Schemes (Prescribed Requirements) Regulations 2012), giving GBP 5.20 out-of-work or low-income, then GBP 10.60 / GBP 13.30 / GBP 15.95 for higher gross-income brackets. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Forest of Dean Council Tax Support non-dependant deduction + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, paragraphs 58.1 and 58.2 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..0f85c3f2c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/forest_of_dean/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Forest of Dean non-dependant remunerative work threshold. Section 6 uses a 16 hour weekly threshold for remunerative work, mirroring the prescribed Default Scheme. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Forest of Dean non-dependant remunerative work hours + reference: + - title: Forest of Dean District Council - Local Council Tax Support Scheme for Working Age Customers 2026/27, section 6 + href: https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..71f69c867 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Gateshead Local Council Tax Support scheme. +values: + 2025-04-01: 0.915 +metadata: + unit: /1 + period: year + label: Gateshead Local Council Tax Support maximum support rate + reference: + - title: Gateshead Council Local Council Tax Support Scheme 2025 to 26 + href: https://www.gateshead.gov.uk/article/27582/Part-7-Maximum-council-tax-reduction-for-the-purposes-of-calculating-eligibility-for-a-reduction-under-this-scheme-and-the-amount-of-reduction diff --git a/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..cac36188f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Gateshead Local Council Tax Support scheme. +values: + 2025-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Gateshead Local Council Tax Support capital limit + reference: + - title: Gateshead Council Local Council Tax Support Scheme 2025 to 26 + href: https://www.gateshead.gov.uk/article/27578/Part-5-Classes-of-person-excluded-from-this-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..8ba56619e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Gateshead Local Council Tax Support scheme. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Gateshead Local Council Tax Support withdrawal rate + reference: + - title: Gateshead Council Local Council Tax Support Scheme 2025 to 26 + href: https://www.gateshead.gov.uk/article/27575/Part-4-Classes-of-person-entitled-to-a-reduction-under-this-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..3194c1cd7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gateshead/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Gateshead Local Council Tax Support scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 4.9 + - threshold: + 2025-04-01: 256 + amount: + 2025-04-01: 10.05 + - threshold: + 2025-04-01: 445 + amount: + 2025-04-01: 12.6 + - threshold: + 2025-04-01: 554 + amount: + 2025-04-01: 15.1 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Gateshead Local Council Tax Support non-dependant deduction schedule + reference: + - title: Gateshead Council Local Council Tax Support Scheme 2025 to 26 + href: https://www.gateshead.gov.uk/article/27582/Part-7-Maximum-council-tax-reduction-for-the-purposes-of-calculating-eligibility-for-a-reduction-under-this-scheme-and-the-amount-of-reduction diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..f58bcaa72 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of eligible Council Tax liability covered under Gloucester's working-age Local Council Tax Support scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Gloucester Local Council Tax Support maximum support rate + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..2a8790dd5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit under Gloucester's working-age Local Council Tax Support scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Gloucester Local Council Tax Support capital limit + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..9d1d2f151 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,11 @@ +description: Weekly tariff income amount per capital block under Gloucester's working-age Local Council Tax Support scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Gloucester Local Council Tax Support tariff income amount + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..a6c8844c7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,11 @@ +description: Capital block size for tariff income under Gloucester's working-age Local Council Tax Support scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Gloucester Local Council Tax Support tariff income step + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..5525192bf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,11 @@ +description: Capital threshold above which tariff income applies under Gloucester's working-age Local Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Gloucester Local Council Tax Support tariff income threshold + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..3d561d6ec --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate on income above the applicable amount under Gloucester's working-age Local Council Tax Support scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Gloucester Local Council Tax Support withdrawal rate + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/high_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/high_amount.yaml new file mode 100644 index 000000000..4dc6f9475 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/high_amount.yaml @@ -0,0 +1,11 @@ +description: Weekly high non-dependant deduction under Gloucester's working-age Local Council Tax Support scheme. +values: + 2026-04-01: 12.40 +metadata: + unit: currency-GBP + period: week + label: Gloucester Local Council Tax Support high non-dependant deduction + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/high_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/high_income_threshold.yaml new file mode 100644 index 000000000..b4d6c4374 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/high_income_threshold.yaml @@ -0,0 +1,11 @@ +description: Weekly gross income threshold for Gloucester's high working-age non-dependant deduction. +values: + 2026-04-01: 377 +metadata: + unit: currency-GBP + period: week + label: Gloucester Local Council Tax Support high non-dependant deduction income threshold + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/low_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/low_amount.yaml new file mode 100644 index 000000000..ce606c3f9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/low_amount.yaml @@ -0,0 +1,11 @@ +description: Weekly low non-dependant deduction under Gloucester's working-age Local Council Tax Support scheme. +values: + 2026-04-01: 6 +metadata: + unit: currency-GBP + period: week + label: Gloucester Local Council Tax Support low non-dependant deduction + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..dd2f2d8c4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/gloucester/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly hours threshold for remunerative work under Gloucester's working-age Local Council Tax Support scheme. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Gloucester Local Council Tax Support remunerative work hours + reference: + - title: Gloucester City Council Local Council Tax Support Policy 2026 + href: https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..71e4cc5bc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of Council Tax liability covered for working-age households under the Royal Greenwich Local Council Tax Support scheme. +values: + 2026-04-01: 0.80 +metadata: + unit: /1 + period: year + label: Greenwich Local Council Tax Support maximum support rate + reference: + - title: How much you can get + href: https://www.royalgreenwich.gov.uk/help-money/get-help-paying-your-housing-costs-and-council-tax/apply-help-pay-your-council-tax/how-much + diff --git a/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..ec433a3ae --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit under the Royal Greenwich Local Council Tax Support scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Greenwich Local Council Tax Support capital limit + reference: + - title: Who can claim Local Council Tax Support + href: https://www.royalgreenwich.gov.uk/help-money/get-help-paying-your-housing-costs-and-council-tax/apply-help-pay-your-council-tax/who + diff --git a/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/tariff_income_step.yaml b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/tariff_income_step.yaml new file mode 100644 index 000000000..9b2293388 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/tariff_income_step.yaml @@ -0,0 +1,11 @@ +description: Capital step above which one pound of weekly tariff income is added for working-age non-Universal Credit claimants under the Greenwich Local Council Tax Support scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: week + label: Greenwich Local Council Tax Support tariff income step + reference: + - title: Who can claim Local Council Tax Support + href: https://www.royalgreenwich.gov.uk/help-money/get-help-paying-your-housing-costs-and-council-tax/apply-help-pay-your-council-tax/who + diff --git a/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..828023921 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,11 @@ +description: Capital threshold above which tariff income is added for working-age non-Universal Credit claimants under the Greenwich Local Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Greenwich Local Council Tax Support tariff income threshold + reference: + - title: Who can claim Local Council Tax Support + href: https://www.royalgreenwich.gov.uk/help-money/get-help-paying-your-housing-costs-and-council-tax/apply-help-pay-your-council-tax/who + diff --git a/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..12bcfbf7f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Income taper rate for working-age households under the Royal Greenwich Local Council Tax Support scheme. +values: + 2026-04-01: 0.25 +metadata: + unit: /1 + period: year + label: Greenwich Local Council Tax Support withdrawal rate + reference: + - title: How much you can get + href: https://www.royalgreenwich.gov.uk/help-money/get-help-paying-your-housing-costs-and-council-tax/apply-help-pay-your-council-tax/how-much + diff --git a/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..d69bf1e79 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/greenwich/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,11 @@ +description: Weekly working-age non-dependant deduction under the Royal Greenwich Local Council Tax Support scheme. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Greenwich Local Council Tax Support non-dependant deduction + reference: + - title: How much you can get + href: https://www.royalgreenwich.gov.uk/help-money/get-help-paying-your-housing-costs-and-council-tax/apply-help-pay-your-council-tax/how-much + diff --git a/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..4a0279725 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of Council Tax liability covered for working-age households under the Hackney Council Tax Reduction scheme. +values: + 2026-04-01: 0.90 +metadata: + unit: /1 + period: year + label: Hackney Council Tax Reduction maximum support rate + reference: + - title: Housing Benefit and Council Tax Reduction explained + href: https://www.hackney.gov.uk/council-tax-and-benefits/benefits/benefits-explained/housing-benefit-and-council-tax-reduction-explained + diff --git a/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..aed7f9a1f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit under the Hackney Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Hackney Council Tax Reduction capital limit + reference: + - title: Housing Benefit and Council Tax Reduction explained + href: https://www.hackney.gov.uk/council-tax-and-benefits/benefits/benefits-explained/housing-benefit-and-council-tax-reduction-explained + diff --git a/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/tariff_income_step.yaml b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/tariff_income_step.yaml new file mode 100644 index 000000000..09c62447f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/tariff_income_step.yaml @@ -0,0 +1,11 @@ +description: Capital step above which one pound of weekly tariff income is added for working-age non-Universal Credit claimants under the Hackney Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: week + label: Hackney Council Tax Reduction tariff income step + reference: + - title: Housing Benefit and Council Tax Reduction explained + href: https://www.hackney.gov.uk/council-tax-and-benefits/benefits/benefits-explained/housing-benefit-and-council-tax-reduction-explained + diff --git a/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..7dea016f4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,11 @@ +description: Capital threshold above which tariff income is added for working-age non-Universal Credit claimants under the Hackney Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Hackney Council Tax Reduction tariff income threshold + reference: + - title: Housing Benefit and Council Tax Reduction explained + href: https://www.hackney.gov.uk/council-tax-and-benefits/benefits/benefits-explained/housing-benefit-and-council-tax-reduction-explained + diff --git a/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..f0773aafa --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate for working-age households under the Hackney Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Hackney Council Tax Reduction withdrawal rate + reference: + - title: Applicable amounts + href: https://www.hackney.gov.uk/applicable-amounts/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..b295b61ac --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,28 @@ +description: Weekly working-age non-dependant deduction schedule under the Hackney Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hackney Council Tax Reduction non-dependant deduction schedule + reference: + - title: Non-dependant deductions explained + href: https://www.hackney.gov.uk/council-tax-and-benefits/benefits/how-we-assess-your-benefits-claim/non-dependant-deductions-explained + diff --git a/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..5fb478e85 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hackney/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly hours threshold for remunerative work in the Hackney Council Tax Reduction non-dependant deduction schedule. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Hackney Council Tax Reduction remunerative work hours + reference: + - title: Non-dependant deductions explained + href: https://www.hackney.gov.uk/council-tax-and-benefits/benefits/how-we-assess-your-benefits-claim/non-dependant-deductions-explained + diff --git a/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..ad6d08101 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of Council Tax liability covered for working-age households under the Hammersmith and Fulham Council Tax Support scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Hammersmith and Fulham Council Tax Support maximum support rate + reference: + - title: Council Tax Support Scheme 2026/27 + href: https://democracy.lbhf.gov.uk/documents/s133438/Council%20Tax%20Support%20Scheme%202026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..08b620bc4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit under the Hammersmith and Fulham Council Tax Support scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Hammersmith and Fulham Council Tax Support capital limit + reference: + - title: Appendix 1 Council Tax Support Scheme 2025-26 + href: https://democracy.lbhf.gov.uk/documents/s133439/Appendix%201%20Council%20Tax%20Support%20Scheme%202025-26.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/tariff_income_step.yaml b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/tariff_income_step.yaml new file mode 100644 index 000000000..f4f9a3c4e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/tariff_income_step.yaml @@ -0,0 +1,11 @@ +description: Capital step above which one pound of weekly tariff income is added for working-age non-Universal Credit claimants under the Hammersmith and Fulham Council Tax Support scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: week + label: Hammersmith and Fulham Council Tax Support tariff income step + reference: + - title: Appendix 1 Council Tax Support Scheme 2025-26 + href: https://democracy.lbhf.gov.uk/documents/s133439/Appendix%201%20Council%20Tax%20Support%20Scheme%202025-26.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..f7de29ff9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,11 @@ +description: Capital threshold above which tariff income is added for working-age non-Universal Credit claimants under the Hammersmith and Fulham Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Hammersmith and Fulham Council Tax Support tariff income threshold + reference: + - title: Appendix 1 Council Tax Support Scheme 2025-26 + href: https://democracy.lbhf.gov.uk/documents/s133439/Appendix%201%20Council%20Tax%20Support%20Scheme%202025-26.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..400ba9b39 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,13 @@ +description: Withdrawal rate for working-age households under the Hammersmith and Fulham Council Tax Support scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Hammersmith and Fulham Council Tax Support withdrawal rate + reference: + - title: Council Tax Support Scheme 2026/27 + href: https://democracy.lbhf.gov.uk/documents/s133438/Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: Appendix 1 Council Tax Support Scheme 2025-26 + href: https://democracy.lbhf.gov.uk/documents/s133439/Appendix%201%20Council%20Tax%20Support%20Scheme%202025-26.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..bde21b27b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,30 @@ +description: Weekly working-age non-dependant deduction schedule under the Hammersmith and Fulham Council Tax Support scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hammersmith and Fulham Council Tax Support non-dependant deduction schedule + reference: + - title: Council Tax Support Scheme 2026/27 + href: https://democracy.lbhf.gov.uk/documents/s133438/Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: Appendix 1 Council Tax Support Scheme 2025-26 + href: https://democracy.lbhf.gov.uk/documents/s133439/Appendix%201%20Council%20Tax%20Support%20Scheme%202025-26.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..fee1aba5a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly hours threshold for remunerative work in the Hammersmith and Fulham Council Tax Support non-dependant deduction schedule. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Hammersmith and Fulham Council Tax Support remunerative work hours + reference: + - title: Appendix 1 Council Tax Support Scheme 2025-26 + href: https://democracy.lbhf.gov.uk/documents/s133439/Appendix%201%20Council%20Tax%20Support%20Scheme%202025-26.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..694f71f6c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,9 @@ +description: Maximum weekly childcare costs deducted from earnings for Haringey Council Tax Reduction with one child. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + label: Haringey CTR one-child weekly childcare deduction cap + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraph 57(3) + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..8cbc3ac31 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,9 @@ +description: Maximum weekly childcare costs deducted from earnings for Haringey Council Tax Reduction with two or more children. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + label: Haringey CTR two-or-more-child weekly childcare deduction cap + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraph 57(3) + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/childcare/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/childcare/work_hours.yaml new file mode 100644 index 000000000..2ce63fa74 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/childcare/work_hours.yaml @@ -0,0 +1,9 @@ +description: Minimum weekly work hours for Haringey Council Tax Reduction childcare costs to be deducted from earnings. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Haringey CTR childcare deduction weekly work-hours threshold + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraph 58A + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/maximum_support_rate/non_protected.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/maximum_support_rate/non_protected.yaml new file mode 100644 index 000000000..80fe2ca73 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/maximum_support_rate/non_protected.yaml @@ -0,0 +1,9 @@ +description: Maximum Council Tax Reduction rate for Haringey working-age applicants outside the protected groups. +values: + 2026-04-01: 0.802 +metadata: + unit: /1 + label: Haringey non-protected maximum CTR rate + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraph 29 + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/maximum_support_rate/protected.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/maximum_support_rate/protected.yaml new file mode 100644 index 000000000..53c607173 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/maximum_support_rate/protected.yaml @@ -0,0 +1,9 @@ +description: Maximum Council Tax Reduction rate for Haringey working-age applicants in protected groups. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Haringey protected maximum CTR rate + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraph 29 + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..b770ee185 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for Haringey working-age Council Tax Reduction. +values: + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Haringey working-age CTR capital limit + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraph 23 + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..d548fa5a9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly assumed income per capital step for Haringey working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Haringey CTR tariff income per step + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, Schedule 7 + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..b2146f10c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step for Haringey working-age Council Tax Reduction tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Haringey CTR tariff income capital step + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, Schedule 7 + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..2eb50db91 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which Haringey assumes tariff income for working-age Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Haringey CTR tariff income threshold + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, Schedule 7 + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..ce26abc41 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,9 @@ +description: Excess-income withdrawal rate for Haringey working-age Council Tax Reduction. +values: + 2026-04-01: 0.20 +metadata: + unit: /1 + label: Haringey working-age CTR withdrawal rate + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraphs 29 and 37 + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/minimum_award.yaml new file mode 100644 index 000000000..23cb44e13 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly award for Haringey working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Haringey CTR minimum weekly award + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraph 37 + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..3bd1acf7b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Haringey working-age non-dependant deduction by weekly gross income. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Haringey working-age CTR non-dependant deduction + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraphs 30 and 30A + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..26665b244 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/haringey/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly hours threshold for remunerative work in the Haringey Council Tax Reduction non-dependant deduction schedule. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Haringey CTR non-dependant remunerative-work hours + reference: + - title: Haringey Council Tax Reduction Scheme 2026-2027, paragraphs 30A and 53 + href: https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/disabled/earnings_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/disabled/earnings_limit.yaml new file mode 100644 index 000000000..a3a0ebe11 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/disabled/earnings_limit.yaml @@ -0,0 +1,10 @@ +description: Weekly claimant and partner earned-income limit for Harrow's working-age disabled Council Tax Support group. +values: + 2026-04-01: 440 +metadata: + unit: currency-GBP + period: week + label: Harrow CTS disabled group earnings limit + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Appendix A + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..b3fa6578b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: Maximum English council tax band ratio eligible for ordinary Harrow working-age Council Tax Support. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Harrow CTS Band D liability cap ratio + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 2 and Section 3 paragraph 25A + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/maximum_support_rate/disabled.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/maximum_support_rate/disabled.yaml new file mode 100644 index 000000000..064ba7642 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/maximum_support_rate/disabled.yaml @@ -0,0 +1,9 @@ +description: Maximum Council Tax Support rate for Harrow working-age disabled claimants. +values: + 2026-04-01: 0.86 +metadata: + unit: /1 + label: Harrow disabled working-age CTS maximum rate + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 2.1 and Section 3 paragraph 25B + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/maximum_support_rate/standard.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/maximum_support_rate/standard.yaml new file mode 100644 index 000000000..3b856fad7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/maximum_support_rate/standard.yaml @@ -0,0 +1,9 @@ +description: Maximum Council Tax Support rate for ordinary Harrow working-age claimants outside the Universal Credit earnings bands. +values: + 2026-04-01: 0.50 +metadata: + unit: /1 + label: Harrow ordinary working-age CTS maximum rate + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 1.4 and Section 3 paragraph 25A + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..64be3f6be --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,9 @@ +description: Capital limit for Harrow working-age Council Tax Support. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + label: Harrow working-age CTS capital limit + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 8 and Section 3 paragraph 21 + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/means_test/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/means_test/minimum_award.yaml new file mode 100644 index 000000000..b5b918a75 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/means_test/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly Harrow Council Tax Support award. +values: + 2026-04-01: 2 +metadata: + unit: currency-GBP + period: week + label: Harrow CTS minimum award + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 1.3 and Section 3 summary + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..c927fe771 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,9 @@ +description: Excess-income withdrawal rate for Harrow non-Universal Credit working-age Council Tax Support. +values: + 2026-04-01: 0.30 +metadata: + unit: /1 + label: Harrow non-UC working-age CTS withdrawal rate + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 3 summary and classes E/G + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/legacy_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/legacy_amount.yaml new file mode 100644 index 000000000..3838f0682 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/legacy_amount.yaml @@ -0,0 +1,27 @@ +description: Harrow non-Universal Credit working-age non-dependant deduction by weekly gross income. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 9.50 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 18.75 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 23.50 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 27.75 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Harrow non-UC working-age CTS non-dependant deduction + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 3 paragraph 26A + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/legacy_income_based_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/legacy_income_based_amount.yaml new file mode 100644 index 000000000..105a87ea3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/legacy_income_based_amount.yaml @@ -0,0 +1,10 @@ +description: Harrow non-Universal Credit working-age non-dependant deduction for income-based benefit, Guaranteed Pension Credit, or maximum Universal Credit non-dependants. +values: + 2026-04-01: 4.75 +metadata: + unit: currency-GBP + period: week + label: Harrow non-UC income-based non-dependant deduction + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 3 paragraph 26A + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..8b2028214 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Harrow working-age Council Tax Support non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Harrow CTS non-dependant remunerative-work hours + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 3 rule 10 + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/uc_high_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/uc_high_amount.yaml new file mode 100644 index 000000000..52fcb34d3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/uc_high_amount.yaml @@ -0,0 +1,10 @@ +description: Harrow Universal Credit scheme high non-dependant deduction. +values: + 2026-04-01: 18.75 +metadata: + unit: currency-GBP + period: week + label: Harrow UC CTS high non-dependant deduction + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 3 + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/uc_high_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/uc_high_income_threshold.yaml new file mode 100644 index 000000000..a24c0a896 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/uc_high_income_threshold.yaml @@ -0,0 +1,10 @@ +description: Weekly gross-income threshold for Harrow's high Universal Credit scheme non-dependant deduction. +values: + 2026-04-01: 144 +metadata: + unit: currency-GBP + period: week + label: Harrow UC CTS high non-dependant income threshold + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 3 + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/uc_low_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/uc_low_amount.yaml new file mode 100644 index 000000000..0e6f2d503 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/non_dep_deduction/uc_low_amount.yaml @@ -0,0 +1,10 @@ +description: Harrow Universal Credit scheme low non-dependant deduction. +values: + 2026-04-01: 4.75 +metadata: + unit: currency-GBP + period: week + label: Harrow UC CTS low non-dependant deduction + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 3 + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/childless_couple.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/childless_couple.yaml new file mode 100644 index 000000000..67791475c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/childless_couple.yaml @@ -0,0 +1,31 @@ +description: Harrow Universal Credit Council Tax Support rate for childless couples by weekly net earnings. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 75.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 175.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Harrow UC childless couple CTS rate + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 1.5 Table D + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/couple_three_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/couple_three_or_more_children.yaml new file mode 100644 index 000000000..78f1d8182 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/couple_three_or_more_children.yaml @@ -0,0 +1,35 @@ +description: Harrow Universal Credit Council Tax Support rate for couples with three or more children by weekly net earnings. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 150.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Harrow UC couple with three or more children CTS rate + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 1.5 Table F2 + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/couple_up_to_two_children.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/couple_up_to_two_children.yaml new file mode 100644 index 000000000..b20b0830b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/couple_up_to_two_children.yaml @@ -0,0 +1,35 @@ +description: Harrow Universal Credit Council Tax Support rate for couples with up to two children by weekly net earnings. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 165.01 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 250.01 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Harrow UC couple with up to two children CTS rate + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 1.5 Table F1 + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/lone_parent_three_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/lone_parent_three_or_more_children.yaml new file mode 100644 index 000000000..897069ef8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/lone_parent_three_or_more_children.yaml @@ -0,0 +1,35 @@ +description: Harrow Universal Credit Council Tax Support rate for lone parents with three or more children by weekly net earnings. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 100.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 150.01 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 325.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Harrow UC lone parent with three or more children CTS rate + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 1.5 Table E2 + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/lone_parent_up_to_two_children.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/lone_parent_up_to_two_children.yaml new file mode 100644 index 000000000..c14db5849 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/lone_parent_up_to_two_children.yaml @@ -0,0 +1,35 @@ +description: Harrow Universal Credit Council Tax Support rate for lone parents with up to two children by weekly net earnings. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 100.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 140.01 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 175.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.10 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Harrow UC lone parent with up to two children CTS rate + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 1.5 Table E1 + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/single.yaml b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/single.yaml new file mode 100644 index 000000000..8fd12a108 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/harrow/council_tax_reduction/uc_earnings/single.yaml @@ -0,0 +1,27 @@ +description: Harrow Universal Credit Council Tax Support rate for single claimants without children by weekly net earnings. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 75.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.20 + - threshold: + 2026-04-01: 175.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Harrow UC single claimant CTS rate + reference: + - title: Harrow Council Tax Support Scheme 2026/27, Section 2 rule 1.5 Table C + href: https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..1ebe59e38 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Hart maximum Council Tax Support rate +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Hart Council Tax Support maximum support rate + reference: + - title: Hart District Council - Council Tax Support Scheme 2026/27, paragraph 29 + href: https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..ea606dd11 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Hart Council Tax Support working-age capital limit +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Hart Council Tax Support capital limit + reference: + - title: Hart District Council - Council Tax Support Scheme 2026/27, paragraph 23 + href: https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..559cbdae0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Hart Council Tax Support excess income withdrawal rate +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Hart Council Tax Support withdrawal rate + reference: + - title: Hart District Council - Council Tax Support Scheme 2026/27, Class E + href: https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..38536435b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Hart weekly non-dependant deduction by weekly gross income +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hart Council Tax Support non-dependant deduction + reference: + - title: Hart District Council - Council Tax Support Scheme 2026/27, paragraph 30 + href: https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..ad924ee68 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hart/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Hart non-dependant remunerative work threshold +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Hart non-dependant remunerative work hours + reference: + - title: Hart District Council - Council Tax Support Scheme 2026/27, paragraph 30 + href: https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..65613d632 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,10 @@ +description: Hartlepool standard weekly earnings disregard +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Hartlepool Council Tax Reduction earnings disregard + reference: + - title: Hartlepool Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 4 + href: https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..415de5c20 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,31 @@ +description: Hartlepool weekly net-income support rates for a couple +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 162.70 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 278.90 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 337.00 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 395.09 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hartlepool couple income bands + reference: + - title: Hartlepool Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/couple_one_dependant.yaml b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/couple_one_dependant.yaml new file mode 100644 index 000000000..c0d4ff5a2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/couple_one_dependant.yaml @@ -0,0 +1,31 @@ +description: Hartlepool weekly net-income support rates for a couple with one dependant +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 238.24 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 326.54 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 371.86 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 429.96 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hartlepool couple with one dependant income bands + reference: + - title: Hartlepool Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/couple_two_or_more_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/couple_two_or_more_dependants.yaml new file mode 100644 index 000000000..2328516e8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/couple_two_or_more_dependants.yaml @@ -0,0 +1,31 @@ +description: Hartlepool weekly net-income support rates for a couple with two or more dependants +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 302.14 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 395.10 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 464.83 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 557.78 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hartlepool couple with two or more dependants income bands + reference: + - title: Hartlepool Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..e5c277af6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,31 @@ +description: Hartlepool weekly net-income support rates for a single claimant +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 116.21 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 209.18 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 249.85 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 296.33 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hartlepool single claimant income bands + reference: + - title: Hartlepool Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/single_one_dependant.yaml b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/single_one_dependant.yaml new file mode 100644 index 000000000..f3c6c5812 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/single_one_dependant.yaml @@ -0,0 +1,31 @@ +description: Hartlepool weekly net-income support rates for a single claimant with one dependant +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 185.93 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 278.90 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 296.33 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 325.37 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hartlepool single claimant with one dependant income bands + reference: + - title: Hartlepool Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/single_two_or_more_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/single_two_or_more_dependants.yaml new file mode 100644 index 000000000..339cede8b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/income_band/single_two_or_more_dependants.yaml @@ -0,0 +1,31 @@ +description: Hartlepool weekly net-income support rates for a single claimant with two or more dependants +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 255.66 + amount: + 2026-04-01: 0.7 + - threshold: + 2026-04-01: 342.82 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 406.72 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 522.92 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hartlepool single claimant with two or more dependants income bands + reference: + - title: Hartlepool Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..c57a6f868 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Hartlepool Council Tax Reduction working-age capital limit +values: + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: Hartlepool Council Tax Reduction capital limit + reference: + - title: Hartlepool Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 26.1 + href: https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..57f4697e7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hartlepool/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,10 @@ +description: Hartlepool flat weekly non-dependant deduction +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Hartlepool Council Tax Reduction non-dependant deduction + reference: + - title: Hartlepool Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 48.5 + href: https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..96300455f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: Maximum English council tax band ratio eligible for ordinary working-age Havering Council Tax Support. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Havering CTS Band D liability cap ratio + reference: + - title: Havering Summary of the Council Tax Support Scheme 2026/27, Appendix I + href: https://democracy.havering.gov.uk/documents/s83106/12%20-%20Appendix%20I%20%20Summary%20of%20the%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_support_rate/disabled.yaml b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_support_rate/disabled.yaml new file mode 100644 index 000000000..8e0a4744f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_support_rate/disabled.yaml @@ -0,0 +1,9 @@ +description: Maximum Council Tax Support rate for disabled working-age Havering applicants. +values: + 2026-04-01: 0.80 +metadata: + unit: /1 + label: Havering disabled working-age CTS maximum rate + reference: + - title: Havering Summary of the Council Tax Support Scheme 2026/27, Appendix I + href: https://democracy.havering.gov.uk/documents/s83106/12%20-%20Appendix%20I%20%20Summary%20of%20the%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_support_rate/full.yaml b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_support_rate/full.yaml new file mode 100644 index 000000000..efebcf9d6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_support_rate/full.yaml @@ -0,0 +1,11 @@ +description: Maximum Council Tax Support rate for working-age Havering applicants in the care-leaver or protected war-pension classes. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Havering full-support working-age CTS maximum rate + reference: + - title: Havering Council Tax Support Scheme 2025-2026, paragraph 29A(8) + href: https://www.havering.gov.uk/downloads/file/6930/council-tax-support-scheme-2025-2026 + - title: Havering 2026/27 Budget Report, paragraphs 11.2.1-11.2.2 + href: https://democracy.havering.gov.uk/documents/s83059/0-1%20-%20Budget%20report%20cabinet%202026%202.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_support_rate/standard.yaml b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_support_rate/standard.yaml new file mode 100644 index 000000000..85a7e2121 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/maximum_support_rate/standard.yaml @@ -0,0 +1,9 @@ +description: Maximum Council Tax Support rate for working-age Havering applicants who are not disabled and not in a full-support class. +values: + 2026-04-01: 0.75 +metadata: + unit: /1 + label: Havering standard working-age CTS maximum rate + reference: + - title: Havering Summary of the Council Tax Support Scheme 2026/27, Appendix I + href: https://democracy.havering.gov.uk/documents/s83106/12%20-%20Appendix%20I%20%20Summary%20of%20the%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..036a8830d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit for working-age Havering Council Tax Support outside qualifying income-related benefit passporting. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + label: Havering working-age CTS capital limit + reference: + - title: Havering Summary of the Council Tax Support Scheme 2026/27, Appendix I + href: https://democracy.havering.gov.uk/documents/s83106/12%20-%20Appendix%20I%20%20Summary%20of%20the%20Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: Havering Council Tax Support Scheme 2025-2026, paragraph 23 + href: https://www.havering.gov.uk/downloads/file/6930/council-tax-support-scheme-2025-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..d7cb68a5d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,9 @@ +description: Excess-income withdrawal rate for Havering working-age Council Tax Support. +values: + 2026-04-01: 0.20 +metadata: + unit: /1 + label: Havering working-age CTS withdrawal rate + reference: + - title: Havering Summary of the Council Tax Support Scheme 2026/27, Appendix I + href: https://democracy.havering.gov.uk/documents/s83106/12%20-%20Appendix%20I%20%20Summary%20of%20the%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..9bf19ce95 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,29 @@ +description: Havering working-age non-dependant deduction by weekly gross income. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 6 + - threshold: + 2026-04-01: 224 + amount: + 2026-04-01: 9 + - threshold: + 2026-04-01: 389 + amount: + 2026-04-01: 15 + - threshold: + 2026-04-01: 484 + amount: + 2026-04-01: 20 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Havering working-age CTS non-dependant deduction + reference: + - title: Havering Summary of the Council Tax Support Scheme 2026/27, Appendix I + href: https://democracy.havering.gov.uk/documents/s83106/12%20-%20Appendix%20I%20%20Summary%20of%20the%20Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: Havering Council Tax Support Scheme 2025-2026, paragraph 30A + href: https://www.havering.gov.uk/downloads/file/6930/council-tax-support-scheme-2025-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..b100f58b2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/havering/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Havering working-age Council Tax Support non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Havering CTS non-dependant remunerative-work hours + reference: + - title: Havering Council Tax Support Scheme 2025-2026, paragraph 10 + href: https://www.havering.gov.uk/downloads/file/6930/council-tax-support-scheme-2025-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..f84014e5a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered by Herefordshire working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Herefordshire working-age Council Tax Reduction maximum support rate + reference: + - title: Herefordshire 2026/27 Council Tax Reduction Scheme report + href: https://councillors.herefordshire.gov.uk/documents/s50131817/202627%20Council%20Tax%20Reduction%20Scheme.pdf + - title: Herefordshire approved Council Tax Reduction Scheme, section 57.1 + href: https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..cff436e6c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit for Herefordshire working-age Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Herefordshire working-age Council Tax Reduction capital limit + reference: + - title: Herefordshire 2026/27 Council Tax Reduction Scheme report + href: https://councillors.herefordshire.gov.uk/documents/s50131817/202627%20Council%20Tax%20Reduction%20Scheme.pdf + - title: Herefordshire approved Council Tax Reduction Scheme, sections 1.7 and 33.1 + href: https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..21d1a61ab --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,12 @@ +description: Withdrawal rate on excess income for Herefordshire working-age Council Tax Reduction. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Herefordshire Council Tax Reduction excess-income withdrawal rate + reference: + - title: Herefordshire 2026/27 Council Tax Reduction Scheme report + href: https://councillors.herefordshire.gov.uk/documents/s50131817/202627%20Council%20Tax%20Reduction%20Scheme.pdf + - title: Herefordshire approved Council Tax Reduction Scheme, sections 1.7 and 59.1 + href: https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..1dcb6efed --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,29 @@ +description: Weekly non-dependant deduction by gross weekly income for Herefordshire working-age Council Tax Reduction. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 4.90 + - threshold: + 2026-04-01: 256 + amount: + 2026-04-01: 10.05 + - threshold: + 2026-04-01: 445 + amount: + 2026-04-01: 12.60 + - threshold: + 2026-04-01: 554 + amount: + 2026-04-01: 15.10 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Herefordshire Council Tax Reduction non-dependant deduction amount + reference: + - title: Herefordshire 2026/27 Council Tax Reduction Scheme report + href: https://councillors.herefordshire.gov.uk/documents/s50131817/202627%20Council%20Tax%20Reduction%20Scheme.pdf + - title: Herefordshire approved Council Tax Reduction Scheme, sections 58.1 and 58.2 + href: https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..e10dac866 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/herefordshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Herefordshire working-age Council Tax Reduction non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Herefordshire Council Tax Reduction non-dependant remunerative-work hours + reference: + - title: Herefordshire approved Council Tax Reduction Scheme, sections 2.1 and 6.1 + href: https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/additional_working.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/additional_working.yaml new file mode 100644 index 000000000..80d3c5c68 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/additional_working.yaml @@ -0,0 +1,10 @@ +description: Hertsmere additional weekly working earnings disregard +values: + 2026-04-01: 17.10 +metadata: + unit: currency-GBP + period: week + label: Hertsmere additional working earnings disregard + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 3 paragraph 16 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/couple.yaml new file mode 100644 index 000000000..b589a278b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/couple.yaml @@ -0,0 +1,10 @@ +description: Hertsmere weekly earnings disregard for a couple +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Hertsmere couple earnings disregard + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 3 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/disabled_or_support_component.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/disabled_or_support_component.yaml new file mode 100644 index 000000000..b2ea6a9ec --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/disabled_or_support_component.yaml @@ -0,0 +1,10 @@ +description: Hertsmere weekly earnings disregard for disability or support component cases +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Hertsmere disability earnings disregard + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 3 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/lone_parent.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/lone_parent.yaml new file mode 100644 index 000000000..cd1852b8f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/lone_parent.yaml @@ -0,0 +1,10 @@ +description: Hertsmere weekly earnings disregard for a lone parent +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Hertsmere lone parent earnings disregard + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 3 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/single.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/single.yaml new file mode 100644 index 000000000..9594d005c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/earnings_disregard/single.yaml @@ -0,0 +1,10 @@ +description: Hertsmere weekly earnings disregard for a single claimant +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Hertsmere single claimant earnings disregard + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 3 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..ed03fca7f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Hertsmere Council Tax Reduction maximum eligible liability band ratio +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Hertsmere Council Tax Reduction liability cap band ratio + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 57.1(a) + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..baec467f4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Hertsmere ordinary maximum Council Tax Reduction support rate +values: + 2026-04-01: 0.8 +metadata: + unit: /1 + period: year + label: Hertsmere ordinary Council Tax Reduction maximum support rate + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 57.1 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..b7d69d714 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Hertsmere Council Tax Reduction capital limit +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Hertsmere Council Tax Reduction capital limit + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 33.1 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..cfbf9e94a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Hertsmere Council Tax Reduction excess income withdrawal rate +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Hertsmere Council Tax Reduction withdrawal rate + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 59.1 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..23853b62a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Hertsmere weekly non-dependant deduction by weekly gross income +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hertsmere Council Tax Reduction non-dependant deduction + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 58 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..47d6f83ec --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Hertsmere non-dependant remunerative work threshold +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Hertsmere non-dependant remunerative work hours + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 58 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/non_protected_non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/non_protected_non_dep_deduction/amount.yaml new file mode 100644 index 000000000..b444cc6a6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/non_protected_non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Hertsmere non-protected UC weekly non-dependant deduction by weekly gross income +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 10.40 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 21.20 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 26.60 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 31.90 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hertsmere non-protected UC non-dependant deduction + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 6 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/out_of_work_support_rate/non_protected.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/out_of_work_support_rate/non_protected.yaml new file mode 100644 index 000000000..48605a70a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/out_of_work_support_rate/non_protected.yaml @@ -0,0 +1,10 @@ +description: Hertsmere non-protected UC out-of-work support rate +values: + 2026-04-01: 0.8 +metadata: + unit: /1 + period: year + label: Hertsmere non-protected UC out-of-work support rate + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 6 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/out_of_work_support_rate/protected.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/out_of_work_support_rate/protected.yaml new file mode 100644 index 000000000..0b0c6e49c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/out_of_work_support_rate/protected.yaml @@ -0,0 +1,10 @@ +description: Hertsmere protected UC out-of-work support rate +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Hertsmere protected UC out-of-work support rate + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 6 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/protected_non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/protected_non_dep_deduction/amount.yaml new file mode 100644 index 000000000..5181eadbf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/protected_non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Hertsmere protected UC weekly non-dependant deduction by weekly gross income +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 577 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hertsmere protected UC non-dependant deduction + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 6 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/support_rate/non_protected.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/support_rate/non_protected.yaml new file mode 100644 index 000000000..964602397 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/support_rate/non_protected.yaml @@ -0,0 +1,31 @@ +description: Hertsmere non-protected UC support rate by weekly earnings +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 80 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 250.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 498.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hertsmere non-protected UC earnings support rate + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 6 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/support_rate/protected.yaml b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/support_rate/protected.yaml new file mode 100644 index 000000000..dab2b4556 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hertsmere/council_tax_reduction/uc_banded_scheme/support_rate/protected.yaml @@ -0,0 +1,31 @@ +description: Hertsmere protected UC support rate by weekly earnings +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 80 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 125.01 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 250.01 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 498.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hertsmere protected UC earnings support rate + reference: + - title: Hertsmere Borough Council - Council Tax Reduction Scheme 2026/27, Schedule 6 + href: https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..e3ad513cf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,12 @@ +description: Weekly earnings disregard for Hillingdon Council Tax Reduction where earnings are included and the claimant is not on Universal Credit. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Hillingdon CTR earnings disregard + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands + - title: Hillingdon Council Tax Reduction Scheme Working Age 2026, point 88 + href: https://pre.hillingdon.gov.uk/downloads/file/8/working-age-scheme-rules diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..5588eb954 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,33 @@ +description: Hillingdon Council Tax Reduction rate by weekly net income band for couple working-age households not in the vulnerable Band 2 group. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 130.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 170.01 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 210.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 250.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hillingdon couple weekly net-income CTR rate + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands + - title: Hillingdon Council Tax Reduction Scheme Working Age 2026, Banding Scheme + href: https://pre.hillingdon.gov.uk/downloads/file/8/working-age-scheme-rules diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/family_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/family_one_child.yaml new file mode 100644 index 000000000..3af37ef69 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/family_one_child.yaml @@ -0,0 +1,33 @@ +description: Hillingdon Council Tax Reduction rate by weekly net income band for working-age families with one child or qualifying young person not in the vulnerable Band 2 group. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 150.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 210.01 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 270.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 330.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hillingdon one-child weekly net-income CTR rate + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands + - title: Hillingdon Council Tax Reduction Scheme Working Age 2026, Banding Scheme + href: https://pre.hillingdon.gov.uk/downloads/file/8/working-age-scheme-rules diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/family_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/family_two_or_more_children.yaml new file mode 100644 index 000000000..5d48c5fe2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/family_two_or_more_children.yaml @@ -0,0 +1,33 @@ +description: Hillingdon Council Tax Reduction rate by weekly net income band for working-age families with two or more children or qualifying young people not in the vulnerable Band 2 group. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 260.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 340.01 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 420.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 500.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hillingdon two-child weekly net-income CTR rate + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands + - title: Hillingdon Council Tax Reduction Scheme Working Age 2026, Banding Scheme + href: https://pre.hillingdon.gov.uk/downloads/file/8/working-age-scheme-rules diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..bf57b1a8b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,33 @@ +description: Hillingdon Council Tax Reduction rate by weekly net income band for single working-age households not in the vulnerable Band 2 group. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 90.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 120.01 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 150.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 180.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hillingdon single weekly net-income CTR rate + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands + - title: Hillingdon Council Tax Reduction Scheme Working Age 2026, Banding Scheme + href: https://pre.hillingdon.gov.uk/downloads/file/8/working-age-scheme-rules diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..e5408d107 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,11 @@ +description: Maximum English council tax band ratio eligible for Hillingdon Band 3 to Band 6 working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Hillingdon CTR Band D liability cap ratio + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands + - title: Hillingdon Council Tax Reduction Scheme Working Age 2026, Banding Scheme summary + href: https://pre.hillingdon.gov.uk/downloads/file/8/working-age-scheme-rules diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..e9d8bedfb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Working-age capital limit for Hillingdon Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Hillingdon working-age CTR capital limit + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands + - title: Hillingdon Council Tax Reduction Scheme Working Age 2026, Capital limit + href: https://pre.hillingdon.gov.uk/downloads/file/8/working-age-scheme-rules diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/minimum_award.yaml new file mode 100644 index 000000000..c2bcb4a99 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/minimum_award.yaml @@ -0,0 +1,12 @@ +description: Minimum weekly award for Hillingdon Council Tax Reduction. +values: + 2026-04-01: 3 +metadata: + unit: currency-GBP + period: week + label: Hillingdon CTR minimum weekly award + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands + - title: Hillingdon Council Tax Reduction Scheme Working Age 2026, point 40 and point 11 + href: https://pre.hillingdon.gov.uk/downloads/file/8/working-age-scheme-rules diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..09dc111c3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,12 @@ +description: Flat weekly working-age non-dependant deduction for Hillingdon Council Tax Reduction. +values: + 2026-04-01: 12 +metadata: + unit: currency-GBP + period: week + label: Hillingdon working-age CTR non-dependant deduction + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands + - title: Hillingdon Council Tax Reduction Scheme Working Age 2026, point 41 + href: https://pre.hillingdon.gov.uk/downloads/file/8/working-age-scheme-rules diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/couple.yaml new file mode 100644 index 000000000..0902fa77e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/couple.yaml @@ -0,0 +1,10 @@ +description: Hillingdon vulnerable Band 2 weekly net income upper limit for couple working-age households. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: week + label: Hillingdon couple vulnerable Band 2 upper income limit + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/family_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/family_one_child.yaml new file mode 100644 index 000000000..d28c4acc8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/family_one_child.yaml @@ -0,0 +1,10 @@ +description: Hillingdon vulnerable Band 2 weekly net income upper limit for working-age families with one child or qualifying young person. +values: + 2026-04-01: 330 +metadata: + unit: currency-GBP + period: week + label: Hillingdon one-child vulnerable Band 2 upper income limit + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/family_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/family_two_or_more_children.yaml new file mode 100644 index 000000000..bfa3cd66b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/family_two_or_more_children.yaml @@ -0,0 +1,10 @@ +description: Hillingdon vulnerable Band 2 weekly net income upper limit for working-age families with two or more children or qualifying young people. +values: + 2026-04-01: 500 +metadata: + unit: currency-GBP + period: week + label: Hillingdon two-child vulnerable Band 2 upper income limit + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands diff --git a/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/single.yaml b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/single.yaml new file mode 100644 index 000000000..c1c93a188 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hillingdon/council_tax_reduction/vulnerable_upper_limit/single.yaml @@ -0,0 +1,10 @@ +description: Hillingdon vulnerable Band 2 weekly net income upper limit for single working-age households. +values: + 2026-04-01: 180 +metadata: + unit: currency-GBP + period: week + label: Hillingdon single vulnerable Band 2 upper income limit + reference: + - title: Hillingdon working age bands from 1 April 2026 + href: https://pre.hillingdon.gov.uk/benefits/working-age-bands diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/carer_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/carer_support_rate.yaml new file mode 100644 index 000000000..5f79c0af2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/carer_support_rate.yaml @@ -0,0 +1,11 @@ +description: Council Tax Support rate for Hounslow working-age households where the claimant or partner receives Carer's Allowance or the Universal Credit carer element. +values: + 2026-04-01: 0.90 +metadata: + unit: /1 + label: Hounslow carer Council Tax Support rate + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 16 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 + - title: Hounslow Council Tax Support + href: https://www.hounslow.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..03218792c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,37 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Hounslow couples without children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 101 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 141 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 181 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 221 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 261 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hounslow couple weekly net earnings CTS rate + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 16 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 + - title: Hounslow Council Tax Support + href: https://www.hounslow.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/couple_one_child.yaml new file mode 100644 index 000000000..340db0734 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/couple_one_child.yaml @@ -0,0 +1,37 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Hounslow couples with one child. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 111 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 151 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 191 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 231 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 271 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hounslow couple one-child weekly net earnings CTS rate + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 16 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 + - title: Hounslow Council Tax Support + href: https://www.hounslow.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/couple_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/couple_two_or_more_children.yaml new file mode 100644 index 000000000..eacad5dd2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/couple_two_or_more_children.yaml @@ -0,0 +1,37 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Hounslow couples with two or more children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 131 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 171 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 211 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 251 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 291 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hounslow couple two-or-more-child weekly net earnings CTS rate + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 16 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 + - title: Hounslow Council Tax Support + href: https://www.hounslow.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..ecd224df2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,37 @@ +description: Council Tax Support rate by weekly net earnings band for single working-age Hounslow households without children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 81 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 121 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 161 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 201 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 241 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hounslow single weekly net earnings CTS rate + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 16 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 + - title: Hounslow Council Tax Support + href: https://www.hounslow.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/single_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/single_one_child.yaml new file mode 100644 index 000000000..90e7782a6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/single_one_child.yaml @@ -0,0 +1,37 @@ +description: Council Tax Support rate by weekly net earnings band for single working-age Hounslow households with one child. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 91 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 131 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 171 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 211 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 251 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hounslow single one-child weekly net earnings CTS rate + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 16 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 + - title: Hounslow Council Tax Support + href: https://www.hounslow.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/single_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/single_two_or_more_children.yaml new file mode 100644 index 000000000..70fc0a683 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/income_band/single_two_or_more_children.yaml @@ -0,0 +1,37 @@ +description: Council Tax Support rate by weekly net earnings band for single working-age Hounslow households with two or more children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 111 + amount: + 2026-04-01: 0.60 + - threshold: + 2026-04-01: 151 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 191 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 231 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 271 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Hounslow single two-or-more-child weekly net earnings CTS rate + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 16 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 + - title: Hounslow Council Tax Support + href: https://www.hounslow.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..899e623c9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,9 @@ +description: Capital limit for working-age Hounslow Council Tax Support. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + label: Hounslow working-age CTS capital limit + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 21 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/non_dep_deduction/non_working_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/non_dep_deduction/non_working_amount.yaml new file mode 100644 index 000000000..036c2fba8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/non_dep_deduction/non_working_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly non-dependant deduction for Hounslow working-age Council Tax Support when the non-dependant is not in remunerative work. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Hounslow non-working non-dependant weekly CTS deduction + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 27 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..656b4b2b7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Hounslow working-age Council Tax Support non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Hounslow CTS non-dependant remunerative-work hours + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraphs 10 and 27 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/non_dep_deduction/working_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/non_dep_deduction/working_amount.yaml new file mode 100644 index 000000000..ecaa63e11 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/hounslow/council_tax_reduction/non_dep_deduction/working_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly non-dependant deduction for Hounslow working-age Council Tax Support when the non-dependant is in remunerative work. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Hounslow working non-dependant weekly CTS deduction + reference: + - title: Hounslow Council Tax Reduction Scheme 2025 to 2026, paragraph 27 + href: https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..45a9a3033 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum Council Tax Reduction rate under the Ipswich working-age scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Ipswich Council Tax Reduction maximum support rate + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, paragraph 57.1 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..55a54490e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under the Ipswich working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Ipswich Council Tax Reduction capital limit + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, paragraphs 1.9.7, 1.10.7, 1.11.7, and 34.1 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/minimum_award.yaml new file mode 100644 index 000000000..b4035f41d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Weekly minimum payable Council Tax Reduction under the Ipswich working-age scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Ipswich Council Tax Reduction minimum weekly award + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, paragraph 57.7 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..816de9ae9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income amount per capital step under the Ipswich working-age Council Tax Reduction scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Ipswich Council Tax Reduction tariff income amount + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, paragraph 42.1 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..0deb3389f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step used to calculate tariff income under the Ipswich working-age Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Ipswich Council Tax Reduction tariff income capital step + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, paragraph 42.1 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..1faa3649f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income applies under the Ipswich working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Ipswich Council Tax Reduction tariff income threshold + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, paragraph 42.1 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..ba3ba68e5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate applied to excess income under the Ipswich working-age Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Ipswich Council Tax Reduction excess income withdrawal rate + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, paragraph 59.1 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..93619a443 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,31 @@ +description: Weekly non-dependant deduction schedule under the Ipswich working-age Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + threshold_unit: currency-GBP + period: week + type: single_amount + label: Ipswich Council Tax Reduction non-dependant deduction amount + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, paragraph 58.1 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf + - title: Ipswich Council Tax Reduction live page, non-dependant deductions for 2026/27 + href: https://www.ipswich.gov.uk/benefits/council-tax-reduction-low-income + - title: Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2026, regulation 5(3) + href: https://www.legislation.gov.uk/uksi/2026/27/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..b7c069bbb --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly hours threshold for remunerative work under the Ipswich working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Ipswich Council Tax Reduction remunerative work hours threshold + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, paragraphs 6.1 and 58.1 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/uc_earnings_contribution/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/uc_earnings_contribution/amount.yaml new file mode 100644 index 000000000..e26ed5de7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/uc_earnings_contribution/amount.yaml @@ -0,0 +1,37 @@ +description: Weekly Council Tax Reduction contribution by monthly Universal Credit assessed earnings under the Ipswich working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0 + - threshold: + 2026-04-01: 309 + amount: + 2026-04-01: 10.85 + - threshold: + 2026-04-01: 650 + amount: + 2026-04-01: 21.92 + - threshold: + 2026-04-01: 1_237 + amount: + 2026-04-01: 31.62 + - threshold: + 2026-04-01: 1_968 + amount: + 2026-04-01: 47.54 + - threshold: + 2026-04-01: 2_528 + amount: + 2026-04-01: 61.15 +metadata: + amount_unit: currency-GBP + threshold_unit: currency-GBP + period: week + type: single_amount + label: Ipswich Council Tax Reduction UC earnings contribution amount + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, Schedule 5 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf + - title: Ipswich Council Tax Reduction live page, income bands and contribution rates for 2026/27 + href: https://www.ipswich.gov.uk/benefits/council-tax-reduction-low-income diff --git a/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/uc_earnings_contribution/no_entitlement_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/uc_earnings_contribution/no_entitlement_threshold.yaml new file mode 100644 index 000000000..ce1140f0b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/ipswich/council_tax_reduction/uc_earnings_contribution/no_entitlement_threshold.yaml @@ -0,0 +1,12 @@ +description: Monthly Universal Credit assessed earnings threshold at which the Ipswich working-age scheme gives no Council Tax Reduction. +values: + 2026-04-01: 3_000 +metadata: + unit: currency-GBP + period: month + label: Ipswich Council Tax Reduction UC no-entitlement earnings threshold + reference: + - title: Ipswich Council Tax Reduction Scheme 2026/27, Schedule 5 + href: https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf + - title: Ipswich Council Tax Reduction live page, income bands and contribution rates for 2026/27 + href: https://www.ipswich.gov.uk/benefits/council-tax-reduction-low-income diff --git a/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/couple_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/couple_two_or_more_children.yaml new file mode 100644 index 000000000..02ba17ebe --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/couple_two_or_more_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Islington couples with two or more children. +brackets: + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 153.08 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 211.14 + amount: + 2026-04-01: 0.65 + - threshold: + 2026-04-01: 253.37 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 295.58 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 337.82 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Islington couple two-or-more-child weekly net earnings CTR rate + reference: + - title: Islington Council, Council Tax support + href: https://www.islington.gov.uk/benefits-and-support/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/single_no_children.yaml b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/single_no_children.yaml new file mode 100644 index 000000000..989c28046 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/single_no_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Islington single claimants without children. +brackets: + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 26.41 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 84.46 + amount: + 2026-04-01: 0.65 + - threshold: + 2026-04-01: 126.69 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 168.91 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 211.14 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Islington single no-child weekly net earnings CTR rate + reference: + - title: Islington Council, Council Tax support + href: https://www.islington.gov.uk/benefits-and-support/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/single_one_child_or_couple_no_children.yaml b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/single_one_child_or_couple_no_children.yaml new file mode 100644 index 000000000..47462016e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/single_one_child_or_couple_no_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Islington single claimants with one child or couples without children. +brackets: + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 68.63 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 126.69 + amount: + 2026-04-01: 0.65 + - threshold: + 2026-04-01: 168.91 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 211.14 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 253.37 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Islington single-one-child or couple-no-child weekly net earnings CTR rate + reference: + - title: Islington Council, Council Tax support + href: https://www.islington.gov.uk/benefits-and-support/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/single_two_or_more_children_or_couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/single_two_or_more_children_or_couple_one_child.yaml new file mode 100644 index 000000000..07d972031 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/income_band/single_two_or_more_children_or_couple_one_child.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Islington single claimants with two or more children or couples with one child. +brackets: + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.85 + - threshold: + 2026-04-01: 110.86 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 168.91 + amount: + 2026-04-01: 0.65 + - threshold: + 2026-04-01: 211.13 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 253.37 + amount: + 2026-04-01: 0.35 + - threshold: + 2026-04-01: 295.59 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Islington single-two-child or couple-one-child weekly net earnings CTR rate + reference: + - title: Islington Council, Council Tax support + href: https://www.islington.gov.uk/benefits-and-support/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..3860b0c30 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,9 @@ +description: Savings and investments limit for working-age Islington Council Tax Support. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + label: Islington working-age Council Tax Support savings and investments limit + reference: + - title: Islington Council, Council Tax support + href: https://www.islington.gov.uk/benefits-and-support/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..43381b65a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,9 @@ +description: Weekly non-dependant deduction under the Islington working-age Council Tax Support scheme. +values: + 2026-04-01: 7.92 +metadata: + unit: currency-GBP + label: Islington working-age Council Tax Support non-dependant deduction + reference: + - title: Islington Council, Council Tax support + href: https://www.islington.gov.uk/benefits-and-support/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/non_working/default_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/non_working/default_support_rate.yaml new file mode 100644 index 000000000..c6ce76bc0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/non_working/default_support_rate.yaml @@ -0,0 +1,9 @@ +description: Council Tax Support rate for working-age Islington claimants who are not working and not in a protected zero-earnings group. +values: + 2026-04-01: 0.95 +metadata: + unit: /1 + label: Islington non-working default Council Tax Support rate + reference: + - title: Islington Council, Council Tax support + href: https://www.islington.gov.uk/benefits-and-support/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/non_working/protected_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/non_working/protected_support_rate.yaml new file mode 100644 index 000000000..1c2d9d472 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/islington/council_tax_reduction/non_working/protected_support_rate.yaml @@ -0,0 +1,9 @@ +description: Council Tax Support rate for working-age Islington claimants who are not working and are in a protected zero-earnings group. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: Islington non-working protected Council Tax Support rate + reference: + - title: Islington Council, Council Tax support + href: https://www.islington.gov.uk/benefits-and-support/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..255e34028 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,13 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the King's Lynn and West Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 1 + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: King's Lynn and West Norfolk Council Tax Reduction maximum support rate + reference: + - title: Borough Council of King's Lynn & West Norfolk Council Tax Reduction Scheme 2025 to 2026 + href: https://www.west-norfolk.gov.uk/download/downloads/id/9853/council_tax_reduction_scheme_2025_to_2026.pdf + - title: Borough Council of King's Lynn & West Norfolk Council Tax Reduction Scheme 2026 to 2027 + href: https://www.west-norfolk.gov.uk/download/downloads/id/3330/council_tax_support_regulations.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..9f7f4882a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the King's Lynn and West Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: King's Lynn and West Norfolk Council Tax Reduction capital limit + reference: + - title: Borough Council of King's Lynn & West Norfolk Council Tax Reduction Scheme 2025 to 2026 + href: https://www.west-norfolk.gov.uk/download/downloads/id/9853/council_tax_reduction_scheme_2025_to_2026.pdf + - title: Borough Council of King's Lynn & West Norfolk Council Tax Reduction Scheme 2026 to 2027 + href: https://www.west-norfolk.gov.uk/download/downloads/id/3330/council_tax_support_regulations.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..c4fe3dfee --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,13 @@ +description: Withdrawal rate for working-age households under the King's Lynn and West Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: King's Lynn and West Norfolk Council Tax Reduction withdrawal rate + reference: + - title: Borough Council of King's Lynn & West Norfolk Council Tax Reduction Scheme 2025 to 2026 + href: https://www.west-norfolk.gov.uk/download/downloads/id/9853/council_tax_reduction_scheme_2025_to_2026.pdf + - title: Borough Council of King's Lynn & West Norfolk Council Tax Reduction Scheme 2026 to 2027 + href: https://www.west-norfolk.gov.uk/download/downloads/id/3330/council_tax_support_regulations.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..6f02ec200 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,39 @@ +description: Weekly non-dependant deduction schedule under the King's Lynn and West Norfolk Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + 2026-04-01: 0 + amount: + 2025-04-01: 5 + 2026-04-01: 5.2 + - threshold: + 2025-04-01: 266 + 2026-04-01: 279 + amount: + 2025-04-01: 10.2 + 2026-04-01: 10.6 + - threshold: + 2025-04-01: 463 + 2026-04-01: 485 + amount: + 2025-04-01: 12.8 + 2026-04-01: 13.3 + - threshold: + 2025-04-01: 577 + 2026-04-01: 605 + amount: + 2025-04-01: 15.35 + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: King's Lynn and West Norfolk Council Tax Reduction non-dependant deduction schedule + reference: + - title: Borough Council of King's Lynn & West Norfolk Council Tax Reduction Scheme 2025 to 2026 + href: https://www.west-norfolk.gov.uk/download/downloads/id/9853/council_tax_reduction_scheme_2025_to_2026.pdf + - title: Borough Council of King's Lynn & West Norfolk Council Tax Reduction Scheme 2026 to 2027 + href: https://www.west-norfolk.gov.uk/download/downloads/id/3330/council_tax_support_regulations.pdf + - title: Borough Council of King's Lynn & West Norfolk Council Tax Support - Non-dependants + href: https://www.west-norfolk.gov.uk/info/20019/council_tax_support/29/council_tax_support_-_non-dependants diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..89e7c29a5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered by Kingston upon Hull working-age Council Tax Reduction. +values: + 2026-04-01: 0.8 +metadata: + unit: /1 + period: year + label: Kingston upon Hull working-age Council Tax Reduction maximum support rate + reference: + - title: Hull 2026/27 Locally Defined Discounts report, section 8.1 + href: https://cmis.hullcc.gov.uk/CMIS/Document.ashx?FgPlIEJYlotS%2BYGoBi5olA%3D%3D=NHdURQburHA%3D&WGewmoAfeNQ16B2MHuCpMRKZMwaG1PaO=ctNJFf55vVA%3D&WGewmoAfeNR9xqBux0r1Q8Za60lavYmz=ctNJFf55vVA%3D&czJKcaeAi5tUFL1DTL2UE4zNRBcoShgo=3iPoNPAMkX0oMDpDWuq94FvyHESpS8C4W4BwpivUryCOIyTQ6%2B%2BMwQ%3D%3D&d9Qjj0ag1Pd993jsyOJqFvmyB7X0CSQK=ctNJFf55vVA%3D&kCx1AnS9%2FpWZQ40DXFvdEw%3D%3D=hFflUdN3100%3D&mCTIbCubSFfXsDGW9IXnlg%3D%3D=hFflUdN3100%3D&rUzwRPf%2BZ3zd4E7Ikn8Lyw%3D%3D=pwRE6AGJFLDNlh225F5QMaQWCtPHwdhUfCZ%2FLUQzgA2uL5jNRG4jdQ%3D%3D&uJovDxwdjMPoYv%2BAJvYtyA%3D%3D=ctNJFf55vVA%3D + - title: Hull Council Tax Reduction Scheme 2025/26 + href: https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..4c29fc6da --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit for Kingston upon Hull working-age Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Kingston upon Hull working-age Council Tax Reduction capital limit + reference: + - title: Hull Council Tax Reduction Scheme 2025/26, paragraph 22 + href: https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026 + - title: Hull live Council Tax Reduction page + href: https://www.hull.gov.uk/council-tax-reduction/help-pay-council-tax diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..8007b3f16 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate on excess income for Kingston upon Hull working-age Council Tax Reduction. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Kingston upon Hull Council Tax Reduction excess-income withdrawal rate + reference: + - title: Hull Council Tax Reduction Scheme 2025/26, paragraphs 16 and 17 + href: https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..c9a94d242 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction by gross weekly income for Kingston upon Hull working-age Council Tax Reduction. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5 + - threshold: + 2026-04-01: 266 + amount: + 2026-04-01: 10.20 + - threshold: + 2026-04-01: 463 + amount: + 2026-04-01: 12.80 + - threshold: + 2026-04-01: 577.01 + amount: + 2026-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Kingston upon Hull Council Tax Reduction non-dependant deduction amount + reference: + - title: Hull Council Tax Reduction Scheme 2025/26, paragraph 29 + href: https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..3721d3ec8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_hull/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Kingston upon Hull working-age Council Tax Reduction non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Kingston upon Hull Council Tax Reduction non-dependant remunerative-work hours + reference: + - title: Hull Council Tax Reduction Scheme 2025/26, paragraph 10 + href: https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..fe59e8879 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Kingston upon Thames Council Tax Reduction scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Kingston upon Thames Council Tax Reduction maximum support rate + reference: + - title: Council Tax Reduction Scheme 2026 - 2027 + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..767865e95 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit for working-age households under the Kingston upon Thames Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Kingston upon Thames Council Tax Reduction capital limit + reference: + - title: Council Tax Reduction Scheme 2026 - 2027 + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/tariff_income_step.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/tariff_income_step.yaml new file mode 100644 index 000000000..ccfdeed76 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/tariff_income_step.yaml @@ -0,0 +1,11 @@ +description: Capital step above which one pound of weekly tariff income is added for working-age non-Universal Credit claimants under the Kingston upon Thames Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: week + label: Kingston upon Thames Council Tax Reduction tariff income step + reference: + - title: Council Tax Reduction Scheme 2026 - 2027 + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..3fe425f86 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,11 @@ +description: Capital threshold above which tariff income is added for working-age non-Universal Credit claimants under the Kingston upon Thames Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Kingston upon Thames Council Tax Reduction tariff income threshold + reference: + - title: Council Tax Reduction Scheme 2026 - 2027 + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..bc85e1a95 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate for working-age households under the Kingston upon Thames Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Kingston upon Thames Council Tax Reduction withdrawal rate + reference: + - title: Council Tax Reduction Scheme 2026 - 2027 + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..80bdf0967 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,28 @@ +description: Weekly working-age non-dependant deduction schedule under the Kingston upon Thames Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.64 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 11.50 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 14.43 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 17.31 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Kingston upon Thames Council Tax Reduction non-dependant deduction schedule + reference: + - title: Council Tax Reduction Scheme 2026 - 2027 + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..cb24bfaed --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly hours threshold for remunerative work in the Kingston upon Thames Council Tax Reduction non-dependant deduction schedule. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Kingston upon Thames Council Tax Reduction remunerative work hours + reference: + - title: Council Tax Reduction Scheme 2026 - 2027 + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/five_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/five_or_more_children.yaml new file mode 100644 index 000000000..2a8fcf1dd --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/five_or_more_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Lambeth households with five or more children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.735 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 250.01 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 350.01 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 450.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 530.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Lambeth five-or-more-child weekly net earnings CTR rate + reference: + - title: Lambeth Council, How much Council Tax Support you can get + href: https://www.lambeth.gov.uk/about-housing-benefit-council-tax-support/council-tax-support/how-much-council-tax-support-you-can-get diff --git a/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/four_children.yaml b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/four_children.yaml new file mode 100644 index 000000000..df9a431ec --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/four_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Lambeth households with four children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.735 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 220.01 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 320.01 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 420.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 500.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Lambeth four-child weekly net earnings CTR rate + reference: + - title: Lambeth Council, How much Council Tax Support you can get + href: https://www.lambeth.gov.uk/about-housing-benefit-council-tax-support/council-tax-support/how-much-council-tax-support-you-can-get diff --git a/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/no_children.yaml b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/no_children.yaml new file mode 100644 index 000000000..dc4962485 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/no_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Lambeth households without children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.735 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 100.01 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 200.01 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 300.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 380.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Lambeth no-child weekly net earnings CTR rate + reference: + - title: Lambeth Council, How much Council Tax Support you can get + href: https://www.lambeth.gov.uk/about-housing-benefit-council-tax-support/council-tax-support/how-much-council-tax-support-you-can-get diff --git a/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/one_child.yaml new file mode 100644 index 000000000..c08ccf43b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/one_child.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Lambeth households with one child. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.735 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 130.01 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 230.01 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 330.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 410.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Lambeth one-child weekly net earnings CTR rate + reference: + - title: Lambeth Council, How much Council Tax Support you can get + href: https://www.lambeth.gov.uk/about-housing-benefit-council-tax-support/council-tax-support/how-much-council-tax-support-you-can-get diff --git a/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/three_children.yaml b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/three_children.yaml new file mode 100644 index 000000000..b04f0e4ad --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/three_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Lambeth households with three children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.735 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 190.01 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 290.01 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 390.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 470.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Lambeth three-child weekly net earnings CTR rate + reference: + - title: Lambeth Council, How much Council Tax Support you can get + href: https://www.lambeth.gov.uk/about-housing-benefit-council-tax-support/council-tax-support/how-much-council-tax-support-you-can-get diff --git a/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/two_children.yaml b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/two_children.yaml new file mode 100644 index 000000000..f303e8c81 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/income_band/two_children.yaml @@ -0,0 +1,35 @@ +description: Council Tax Support rate by weekly net earnings band for working-age Lambeth households with two children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.735 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 160.01 + amount: + 2026-04-01: 0.45 + - threshold: + 2026-04-01: 260.01 + amount: + 2026-04-01: 0.30 + - threshold: + 2026-04-01: 360.01 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 440.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Lambeth two-child weekly net earnings CTR rate + reference: + - title: Lambeth Council, How much Council Tax Support you can get + href: https://www.lambeth.gov.uk/about-housing-benefit-council-tax-support/council-tax-support/how-much-council-tax-support-you-can-get diff --git a/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..a6f20e2da --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,9 @@ +description: Savings limit for working-age Lambeth Council Tax Support. +values: + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + label: Lambeth working-age Council Tax Support savings limit + reference: + - title: Lambeth Council, Council Tax Support + href: https://www.lambeth.gov.uk/benefits-financial-support/housing-benefit-council-tax-support/about-housing-benefit-council-tax-support/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..fa1ba3dc3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lambeth/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,19 @@ +description: Weekly non-dependant deduction by weekly earned income under the Lambeth working-age Council Tax Support scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 10 + - threshold: + 2026-04-01: 0.01 + amount: + 2026-04-01: 16 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Lambeth working-age Council Tax Support non-dependant deduction + reference: + - title: Lambeth Council, How much Council Tax Support you can get + href: https://www.lambeth.gov.uk/about-housing-benefit-council-tax-support/council-tax-support/how-much-council-tax-support-you-can-get diff --git a/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..fd01fd9bd --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the Lancaster Council Tax Reduction scheme. +values: + 2025-04-01: 1 +metadata: + unit: /1 + period: year + label: Lancaster Council Tax Reduction maximum support rate + reference: + - title: Lancaster City Council Council Tax Support Scheme 2025/26 + href: https://www.lancaster.gov.uk/assets/attach/14831/lancaster-city-council-2025-26-council-tax-support-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..0c2d63dff --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Lancaster Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Lancaster Council Tax Reduction capital limit + reference: + - title: Lancaster City Council Council Tax Support Scheme 2025/26 + href: https://www.lancaster.gov.uk/assets/attach/14831/lancaster-city-council-2025-26-council-tax-support-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..a2e015ebc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Lancaster Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Lancaster Council Tax Reduction withdrawal rate + reference: + - title: Lancaster City Council Council Tax Support Scheme 2025/26 + href: https://www.lancaster.gov.uk/assets/attach/14831/lancaster-city-council-2025-26-council-tax-support-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..47d6c2b8c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lancaster/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Lancaster Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 12.8 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Lancaster Council Tax Reduction non-dependant deduction schedule + reference: + - title: Lancaster City Council Council Tax Support Scheme 2025/26 + href: https://www.lancaster.gov.uk/assets/attach/14831/lancaster-city-council-2025-26-council-tax-support-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..c9fe18256 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum Council Tax Reduction rate for working-age Lewisham claimants. +values: + 2026-04-01: 0.75 +metadata: + unit: /1 + label: Lewisham working-age Council Tax Reduction maximum support rate + reference: + - title: Lewisham Council, Council Tax Reduction Scheme + href: https://lewisham.gov.uk/myservices/benefits/council-tax-reduction-scheme + - title: Lewisham Council, 2026/27 budget report + href: https://lewisham.moderngov.co.uk/documents/s123568/2026-27%20PASC%20Draft%20Budget%20Report.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..cd12c1cea --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit for working-age Lewisham Council Tax Reduction. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + label: Lewisham Council Tax Reduction capital limit + reference: + - title: Lewisham Council, Council Tax Reduction Scheme + href: https://lewisham.gov.uk/myservices/benefits/council-tax-reduction-scheme + - title: Lewisham Council Tax Reduction Scheme 2024-2025 + href: https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..6c8d24b47 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,9 @@ +description: Weekly tariff income added for each Lewisham Council Tax Reduction capital step. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + label: Lewisham Council Tax Reduction weekly tariff income amount + reference: + - title: Lewisham Council Tax Reduction Scheme 2024-2025 + href: https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..c7f0f6312 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,9 @@ +description: Capital step used to calculate Lewisham Council Tax Reduction tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + label: Lewisham Council Tax Reduction tariff income capital step + reference: + - title: Lewisham Council Tax Reduction Scheme 2024-2025 + href: https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..157663c5a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,9 @@ +description: Capital threshold above which Lewisham Council Tax Reduction tariff income is added. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + label: Lewisham Council Tax Reduction tariff income threshold + reference: + - title: Lewisham Council Tax Reduction Scheme 2024-2025 + href: https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..bed1af30b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,9 @@ +description: Annual excess-income withdrawal rate for working-age Lewisham Council Tax Reduction. +values: + 2026-04-01: 0.20 +metadata: + unit: /1 + label: Lewisham Council Tax Reduction excess-income withdrawal rate + reference: + - title: Lewisham Council Tax Reduction Scheme 2024-2025 + href: https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..0702a8206 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction by gross weekly income for Lewisham Council Tax Reduction. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 4.90 + - threshold: + 2026-04-01: 256 + amount: + 2026-04-01: 10.05 + - threshold: + 2026-04-01: 445 + amount: + 2026-04-01: 12.60 + - threshold: + 2026-04-01: 554 + amount: + 2026-04-01: 15.10 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Lewisham Council Tax Reduction non-dependant deduction amount + reference: + - title: Lewisham Council Tax Reduction Scheme 2024-2025 + href: https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..4aa10da5e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Lewisham Council Tax Reduction non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Lewisham Council Tax Reduction non-dependant remunerative work threshold + reference: + - title: Lewisham Council Tax Reduction Scheme 2024-2025 + href: https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/universal_credit/weekly_earnings_disregard.yaml b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/universal_credit/weekly_earnings_disregard.yaml new file mode 100644 index 000000000..a2088917d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/lewisham/council_tax_reduction/universal_credit/weekly_earnings_disregard.yaml @@ -0,0 +1,9 @@ +description: Weekly earnings disregard for Lewisham Council Tax Reduction claimants whose income is assessed from Universal Credit. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + label: Lewisham Council Tax Reduction Universal Credit weekly earnings disregard + reference: + - title: Lewisham Council Tax Reduction Scheme 2024-2025 + href: https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..2bba542fe --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Maldon Council Tax Reduction maximum eligible liability band ratio +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Maldon Council Tax Reduction liability cap band ratio + reference: + - title: Maldon District Council - Council Tax Reduction Scheme 2026/27 + href: https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..b394484a6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maldon maximum Council Tax Reduction support rate +values: + 2026-04-01: 0.8 +metadata: + unit: /1 + period: year + label: Maldon Council Tax Reduction maximum support rate + reference: + - title: Maldon District Council - Council Tax Reduction Scheme 2026/27 + href: https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..0346c804b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Maldon Council Tax Reduction working-age capital limit +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Maldon Council Tax Reduction capital limit + reference: + - title: Maldon District Council - Council Tax Reduction Scheme 2026/27 + href: https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..cd68b986d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Maldon Council Tax Reduction excess income withdrawal rate +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Maldon Council Tax Reduction withdrawal rate + reference: + - title: Maldon District Council - Council Tax Reduction Scheme 2026/27 + href: https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..1d9c64846 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/maldon/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,10 @@ +description: Maldon flat weekly non-dependant deduction +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Maldon Council Tax Reduction non-dependant deduction + reference: + - title: Maldon District Council - Council Tax Reduction Scheme 2026/27 + href: https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..44bd680cd --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Merton Council Tax Support scheme. +values: + 2025-04-01: 1 +metadata: + unit: /1 + period: year + label: Merton Council Tax Support maximum support rate + reference: + - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2025 + href: https://www.merton.gov.uk/sites/default/files/2025-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..684958eb4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Merton Council Tax Support scheme. +values: + 2025-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Merton Council Tax Support capital limit + reference: + - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2025 + href: https://www.merton.gov.uk/sites/default/files/2025-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..d47ae34ed --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Merton Council Tax Support scheme. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Merton Council Tax Support withdrawal rate + reference: + - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2025 + href: https://www.merton.gov.uk/sites/default/files/2025-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..71b45658f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Merton Council Tax Support scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 12.8 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Merton Council Tax Support non-dependant deduction schedule + reference: + - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2025 + href: https://www.merton.gov.uk/sites/default/files/2025-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..b6478f32b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum Council Tax Reduction rate under the Mid Suffolk working-age scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Mid Suffolk Council Tax Reduction maximum support rate + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, paragraph 57.1 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..545375126 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under the Mid Suffolk working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Mid Suffolk Council Tax Reduction capital limit + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, paragraphs 1.9.7, 1.10.7, 1.11.7, and 34.1 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/minimum_award.yaml new file mode 100644 index 000000000..bcf39ea5a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Weekly minimum payable Council Tax Reduction under the Mid Suffolk working-age scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Mid Suffolk Council Tax Reduction minimum weekly award + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, paragraph 57.7 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..b0e3ecfa3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income amount per capital step under the Mid Suffolk working-age Council Tax Reduction scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Mid Suffolk Council Tax Reduction tariff income amount + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, paragraph 42.1 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..6c2bc61c9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step used to calculate tariff income under the Mid Suffolk working-age Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Mid Suffolk Council Tax Reduction tariff income capital step + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, paragraph 42.1 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..cb01424c5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income applies under the Mid Suffolk working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Mid Suffolk Council Tax Reduction tariff income threshold + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, paragraph 42.1 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..b80786d15 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate applied to excess income under the Mid Suffolk working-age Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Mid Suffolk Council Tax Reduction excess income withdrawal rate + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, paragraph 59.1 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..60452529b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,31 @@ +description: Weekly non-dependant deduction schedule under the Mid Suffolk working-age Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + threshold_unit: currency-GBP + period: week + type: single_amount + label: Mid Suffolk Council Tax Reduction non-dependant deduction amount + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, paragraph 58.1 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf + - title: Mid Suffolk Council Tax Reduction live page, non-dependant deductions for 2026/27 + href: https://www.midsuffolk.gov.uk/w/council-tax-reduction-low-income + - title: Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2026, regulation 5(3) + href: https://www.legislation.gov.uk/uksi/2026/27/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..e3ea0e7f3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly hours threshold for remunerative work under the Mid Suffolk working-age Council Tax Reduction scheme. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Mid Suffolk Council Tax Reduction remunerative work hours threshold + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, paragraphs 6.1 and 58.1 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/uc_earnings_contribution/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/uc_earnings_contribution/amount.yaml new file mode 100644 index 000000000..b4d96af6c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/uc_earnings_contribution/amount.yaml @@ -0,0 +1,37 @@ +description: Weekly Council Tax Reduction contribution by monthly Universal Credit assessed earnings under the Mid Suffolk working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0 + - threshold: + 2026-04-01: 326 + amount: + 2026-04-01: 12 + - threshold: + 2026-04-01: 686 + amount: + 2026-04-01: 23.08 + - threshold: + 2026-04-01: 1_306 + amount: + 2026-04-01: 32.77 + - threshold: + 2026-04-01: 2_077 + amount: + 2026-04-01: 48.69 + - threshold: + 2026-04-01: 2_669 + amount: + 2026-04-01: 64.15 +metadata: + amount_unit: currency-GBP + threshold_unit: currency-GBP + period: week + type: single_amount + label: Mid Suffolk Council Tax Reduction UC earnings contribution amount + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, Schedule 5 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf + - title: Mid Suffolk Council Tax Reduction live page, income bands and contribution rates for 2026/27 + href: https://www.midsuffolk.gov.uk/w/council-tax-reduction-low-income diff --git a/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/uc_earnings_contribution/no_entitlement_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/uc_earnings_contribution/no_entitlement_threshold.yaml new file mode 100644 index 000000000..fe7770e23 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/mid_suffolk/council_tax_reduction/uc_earnings_contribution/no_entitlement_threshold.yaml @@ -0,0 +1,12 @@ +description: Monthly Universal Credit assessed earnings threshold at which the Mid Suffolk working-age scheme gives no Council Tax Reduction. +values: + 2026-04-01: 3_000 +metadata: + unit: currency-GBP + period: month + label: Mid Suffolk Council Tax Reduction UC no-entitlement earnings threshold + reference: + - title: Mid Suffolk Council Tax Reduction Scheme 2026/27, Schedule 5 + href: https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf + - title: Mid Suffolk Council Tax Reduction live page, income bands and contribution rates for 2026/27 + href: https://www.midsuffolk.gov.uk/w/council-tax-reduction-low-income diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..a980e0367 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Newham Council Tax Reduction scheme. +values: + 2026-04-01: 0.70 +metadata: + unit: /1 + period: year + label: Newham Council Tax Reduction maximum support rate + reference: + - title: Council Tax Reduction Scheme 2026 + href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 + diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..3a9d1cbda --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit for working-age households under the Newham Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Newham Council Tax Reduction capital limit + reference: + - title: Council Tax Reduction Scheme 2026 + href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 + diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..1bea9acba --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Newham Council Tax Reduction scheme. +values: + 2026-04-01: 0.25 +metadata: + unit: /1 + period: year + label: Newham Council Tax Reduction withdrawal rate + reference: + - title: Council Tax Reduction Scheme 2026 + href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..217adca1f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,28 @@ +description: Weekly working-age non-dependant deduction schedule under the Newham Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 7.54 + - threshold: + 2026-04-01: 183 + amount: + 2026-04-01: 14.96 + - threshold: + 2026-04-01: 316 + amount: + 2026-04-01: 18.84 + - threshold: + 2026-04-01: 394 + amount: + 2026-04-01: 22.61 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Newham Council Tax Reduction non-dependant deduction schedule + reference: + - title: Council Tax Reduction Scheme 2026 + href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 + diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..d58958b6b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly hours threshold for remunerative work in the Newham Council Tax Reduction non-dependant deduction schedule. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Newham Council Tax Reduction remunerative work hours + reference: + - title: Council Tax Reduction Scheme 2026 + href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 + diff --git a/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..981242dbd --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,13 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the North Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 0.915 + 2026-04-01: 0.915 +metadata: + unit: /1 + period: year + label: North Norfolk Council Tax Reduction maximum support rate + reference: + - title: North Norfolk District Council Council Tax Reduction Scheme 2025/26 + href: https://www.north-norfolk.gov.uk/media/10894/north-norfolk-council-tax-reduction-scheme-for-2025-to-2026.pdf + - title: North Norfolk District Council Housing Benefit and Council Tax Support rates from April 2026 + href: https://www.north-norfolk.gov.uk/tasks/benefits/housing-benefit-and-council-tax-support-rates-from-april-2026/ diff --git a/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..9326aa254 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the North Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: North Norfolk Council Tax Reduction capital limit + reference: + - title: North Norfolk District Council Council Tax Reduction Scheme 2025/26 + href: https://www.north-norfolk.gov.uk/media/10894/north-norfolk-council-tax-reduction-scheme-for-2025-to-2026.pdf + - title: North Norfolk District Council Housing Benefit and Council Tax Support rates from April 2026 + href: https://www.north-norfolk.gov.uk/tasks/benefits/housing-benefit-and-council-tax-support-rates-from-april-2026/ diff --git a/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..361f72eec --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,13 @@ +description: Withdrawal rate for working-age households under the North Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: North Norfolk Council Tax Reduction withdrawal rate + reference: + - title: North Norfolk District Council Council Tax Reduction Scheme 2025/26 + href: https://www.north-norfolk.gov.uk/media/10894/north-norfolk-council-tax-reduction-scheme-for-2025-to-2026.pdf + - title: North Norfolk District Council Housing Benefit and Council Tax Support rates from April 2026 + href: https://www.north-norfolk.gov.uk/tasks/benefits/housing-benefit-and-council-tax-support-rates-from-april-2026/ diff --git a/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..51b94db9e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_norfolk/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly non-dependant deduction under the North Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 10 + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: North Norfolk Council Tax Reduction non-dependant deduction amount + reference: + - title: North Norfolk District Council Council Tax Reduction Scheme 2025/26 + href: https://www.north-norfolk.gov.uk/media/10894/north-norfolk-council-tax-reduction-scheme-for-2025-to-2026.pdf + - title: North Norfolk District Council Housing Benefit and Council Tax Support rates from April 2026 + href: https://www.north-norfolk.gov.uk/tasks/benefits/housing-benefit-and-council-tax-support-rates-from-april-2026/ diff --git a/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..3f8aeab82 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered under the North Northamptonshire Council Tax Support scheme for working-age claimants. +values: + 2026-04-01: 0.75 +metadata: + unit: /1 + period: year + label: North Northamptonshire Council Tax Support maximum support rate + reference: + - title: North Northamptonshire Local Council Tax Support Scheme 2026/27 report, sections 3.1 and 4.4 + href: https://northnorthants.moderngov.co.uk/documents/s34359/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: North Northamptonshire Council Tax Reduction Scheme 2023/24, paragraph 29.2 + href: https://cms.northnorthants.gov.uk/media/4157/download diff --git a/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..a28a229e7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit under the North Northamptonshire Council Tax Support scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: North Northamptonshire Council Tax Support capital limit + reference: + - title: North Northamptonshire Local Council Tax Support Scheme 2026/27 report, section 3.1 + href: https://northnorthants.moderngov.co.uk/documents/s34359/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: North Northamptonshire Council Tax Reduction Scheme 2023/24, paragraph 23 + href: https://cms.northnorthants.gov.uk/media/4157/download diff --git a/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..c3701b339 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly tariff income per capital increment under the North Northamptonshire Council Tax Support scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: North Northamptonshire Council Tax Support tariff income amount + reference: + - title: North Northamptonshire Council Tax Reduction Scheme 2023/24, paragraph 72 + href: https://cms.northnorthants.gov.uk/media/4157/download diff --git a/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..91f7dacf8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital increment, including any partial increment, that adds tariff income under the North Northamptonshire Council Tax Support scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: North Northamptonshire Council Tax Support tariff income step + reference: + - title: North Northamptonshire Council Tax Reduction Scheme 2023/24, paragraph 72 + href: https://cms.northnorthants.gov.uk/media/4157/download diff --git a/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..dafa47840 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income is imputed under the North Northamptonshire Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: North Northamptonshire Council Tax Support tariff income threshold + reference: + - title: North Northamptonshire Council Tax Reduction Scheme 2023/24, paragraph 72 + href: https://cms.northnorthants.gov.uk/media/4157/download diff --git a/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..dfce225a5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,12 @@ +description: Withdrawal rate on excess income under the North Northamptonshire Council Tax Support scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: North Northamptonshire Council Tax Support withdrawal rate + reference: + - title: North Northamptonshire Local Council Tax Support Scheme 2026/27 report, section 3.1 + href: https://northnorthants.moderngov.co.uk/documents/s34359/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: North Northamptonshire Council Tax Reduction Scheme 2023/24, legacy means-test rules + href: https://cms.northnorthants.gov.uk/media/4157/download diff --git a/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..474f30e17 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,31 @@ +description: Weekly non-dependant deduction schedule under the North Northamptonshire Council Tax Support scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: North Northamptonshire Council Tax Support non-dependant deduction amount + reference: + - title: North Northamptonshire Local Council Tax Support Scheme 2026/27 report, section 3.1 + href: https://northnorthants.moderngov.co.uk/documents/s34359/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: North Northamptonshire Council Tax Reduction Scheme 2023/24, paragraph 30 + href: https://cms.northnorthants.gov.uk/media/4157/download + - title: Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2026, regulation 5(3) + href: https://www.legislation.gov.uk/uksi/2026/27/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..f7e418141 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_northamptonshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly hours threshold for remunerative work in North Northamptonshire Council Tax Support non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + period: week + label: North Northamptonshire Council Tax Support non-dependant remunerative-work hours + reference: + - title: North Northamptonshire Council Tax Reduction Scheme 2023/24, paragraphs 10 and 30 + href: https://cms.northnorthants.gov.uk/media/4157/download diff --git a/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/earnings_disregard/couple_or_lone_parent.yaml b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/earnings_disregard/couple_or_lone_parent.yaml new file mode 100644 index 000000000..9faa90c98 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/earnings_disregard/couple_or_lone_parent.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for North Yorkshire Council Tax Reduction couple and lone-parent applicants. +values: + 2026-04-01: 50 +metadata: + unit: currency-GBP + period: week + label: North Yorkshire couple or lone-parent CTR weekly earnings disregard + reference: + - title: North Yorkshire Council Tax Reduction Scheme 2026/27, section 22.2 + href: https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/earnings_disregard/single.yaml b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/earnings_disregard/single.yaml new file mode 100644 index 000000000..f7f6e6753 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/earnings_disregard/single.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for single North Yorkshire Council Tax Reduction applicants. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: North Yorkshire single CTR weekly earnings disregard + reference: + - title: North Yorkshire Council Tax Reduction Scheme 2026/27, section 22.2 + href: https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..ffe4cf8b1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by weekly income band for North Yorkshire couples without children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 208.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 259.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 325.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 389.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: North Yorkshire couple weekly income-band CTR rate + reference: + - title: North Yorkshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/family_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/family_one_child.yaml new file mode 100644 index 000000000..2f844540f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/family_one_child.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by weekly income band for North Yorkshire families with one child. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 273.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 325.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 376.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 441.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: North Yorkshire one-child family weekly income-band CTR rate + reference: + - title: North Yorkshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/family_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/family_two_or_more_children.yaml new file mode 100644 index 000000000..b99a3401a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/family_two_or_more_children.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by weekly income band for North Yorkshire families with two or more children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 338.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 389.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 441.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 491.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: North Yorkshire two-or-more-child family weekly income-band CTR rate + reference: + - title: North Yorkshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..63ba04925 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,31 @@ +description: Council Tax Reduction rate by weekly income band for single North Yorkshire applicants. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 151.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 201.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 263.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 331.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: North Yorkshire single weekly income-band CTR rate + reference: + - title: North Yorkshire Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..14184cf20 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for ordinary North Yorkshire working-age Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: North Yorkshire ordinary working-age Council Tax Reduction capital limit + reference: + - title: North Yorkshire Council Tax Reduction Scheme 2026/27, section 26.1 and Schedule 1 paragraph 5 + href: https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/means_test/passported_capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/means_test/passported_capital_limit.yaml new file mode 100644 index 000000000..33ce36190 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/north_yorkshire/council_tax_reduction/means_test/passported_capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for North Yorkshire Council Tax Reduction applicants on income-based passporting benefits. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: North Yorkshire passported working-age Council Tax Reduction capital disregard limit + reference: + - title: North Yorkshire Council Tax Reduction Scheme 2026/27, Schedule 3 paragraph 7 + href: https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..a32eb823e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,13 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Norwich Council Tax Reduction scheme. +values: + 2025-04-01: 1 + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Norwich Council Tax Reduction maximum support rate + reference: + - title: Norwich City Council Council Tax Reduction Scheme 2025/26 + href: https://www.norwich.gov.uk/download/downloads/id/10735/council_tax_reduction_scheme_2025-26.pdf + - title: Norwich City Council Council Tax Reduction Scheme 2026 + href: https://www.norwich.gov.uk/sites/default/files/2026-03/Council-Tax-Reduction-Scheme-2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..051d05df3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the Norwich Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Norwich Council Tax Reduction capital limit + reference: + - title: Norwich City Council Council Tax Reduction Scheme 2025/26 + href: https://www.norwich.gov.uk/download/downloads/id/10735/council_tax_reduction_scheme_2025-26.pdf + - title: Norwich City Council Council Tax Reduction Scheme 2026 + href: https://www.norwich.gov.uk/sites/default/files/2026-03/Council-Tax-Reduction-Scheme-2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..478f190fe --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,13 @@ +description: Withdrawal rate for working-age households under the Norwich Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Norwich Council Tax Reduction withdrawal rate + reference: + - title: Norwich City Council Council Tax Reduction Scheme 2025/26 + href: https://www.norwich.gov.uk/download/downloads/id/10735/council_tax_reduction_scheme_2025-26.pdf + - title: Norwich City Council Council Tax Reduction Scheme 2026 + href: https://www.norwich.gov.uk/sites/default/files/2026-03/Council-Tax-Reduction-Scheme-2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..491df7965 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/norwich/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,37 @@ +description: Weekly non-dependant deduction schedule under the Norwich Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + 2026-04-01: 0 + amount: + 2025-04-01: 5.18 + 2026-04-01: 5.38 + - threshold: + 2025-04-01: 261.96 + 2026-04-01: 271.91 + amount: + 2025-04-01: 10.42 + 2026-04-01: 10.82 + - threshold: + 2025-04-01: 454.61 + 2026-04-01: 471.89 + amount: + 2025-04-01: 13.15 + 2026-04-01: 13.65 + - threshold: + 2025-04-01: 565.46 + 2026-04-01: 586.95 + amount: + 2025-04-01: 15.74 + 2026-04-01: 16.34 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Norwich Council Tax Reduction non-dependant deduction schedule + reference: + - title: Norwich City Council Council Tax Reduction Scheme 2025/26 + href: https://www.norwich.gov.uk/download/downloads/id/10735/council_tax_reduction_scheme_2025-26.pdf + - title: Norwich City Council Council Tax Reduction Scheme 2026 + href: https://www.norwich.gov.uk/sites/default/files/2026-03/Council-Tax-Reduction-Scheme-2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..ec11e8e06 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Maximum council tax band ratio used to cap eligible liability for working-age households under the Oldham Council Tax Reduction scheme. +values: + 2025-04-01: 0.666666667 +metadata: + unit: /1 + period: year + label: Oldham Council Tax Reduction capped Band A ratio + reference: + - title: Oldham Council Tax Reduction Scheme 2025/26 + href: https://www.oldham.gov.uk/download/downloads/id/2632/council_tax_reduction_scheme_2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..2e74dca65 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of Band A-capped eligible Council Tax liability covered under the Oldham Council Tax Reduction scheme. +values: + 2025-04-01: 0.85 +metadata: + unit: /1 + period: year + label: Oldham Council Tax Reduction maximum support rate + reference: + - title: Oldham Council Tax Reduction Scheme 2025/26 + href: https://www.oldham.gov.uk/download/downloads/id/2632/council_tax_reduction_scheme_2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..519bf0a25 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Oldham Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Oldham Council Tax Reduction capital limit + reference: + - title: Oldham Council Tax Reduction Scheme 2025/26 + href: https://www.oldham.gov.uk/download/downloads/id/2632/council_tax_reduction_scheme_2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..ccd8984b9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Oldham Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Oldham Council Tax Reduction withdrawal rate + reference: + - title: Oldham Council Tax Reduction Scheme 2025/26 + href: https://www.oldham.gov.uk/download/downloads/id/2632/council_tax_reduction_scheme_2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..2af2e5bb0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oldham/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Oldham Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 12.8 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Oldham Council Tax Reduction non-dependant deduction schedule + reference: + - title: Oldham Council Tax Reduction Scheme 2025/26 + href: https://www.oldham.gov.uk/download/downloads/id/2632/council_tax_reduction_scheme_2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/income_band/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/income_band/maximum_support_rate.yaml new file mode 100644 index 000000000..79ca552e6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/income_band/maximum_support_rate.yaml @@ -0,0 +1,31 @@ +description: Maximum Council Tax Reduction rate by weekly income band under the Oxford working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 480.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 530.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 580.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 660.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Oxford Council Tax Reduction weekly income-band maximum support rate + reference: + - title: Oxford City Council Council Tax Reduction Scheme 2026 to 2027 + href: https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..dfbd2ed46 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Oxford Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Oxford Council Tax Reduction capital limit + reference: + - title: Oxford City Council Council Tax Reduction Scheme 2026 to 2027 + href: https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/means_test/tariff_income_step.yaml b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/means_test/tariff_income_step.yaml new file mode 100644 index 000000000..fe030a695 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/means_test/tariff_income_step.yaml @@ -0,0 +1,10 @@ +description: Capital step that adds one pound of weekly tariff income under the Oxford Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: week + label: Oxford Council Tax Reduction tariff income capital step + reference: + - title: Oxford City Council Council Tax Reduction Scheme 2026 to 2027 + href: https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..52247d769 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income is added under the Oxford Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: week + label: Oxford Council Tax Reduction tariff income threshold + reference: + - title: Oxford City Council Council Tax Reduction Scheme 2026 to 2027 + href: https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..dd320305a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly working-age non-dependant deduction schedule under the Oxford Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Oxford Council Tax Reduction working-age non-dependant deduction schedule + reference: + - title: Oxford City Council Council Tax Reduction Scheme 2026 to 2027 + href: https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..e998c8bc4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/oxford/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly hours for remunerative work under the Oxford Council Tax Reduction non-dependant deduction rules. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Oxford Council Tax Reduction remunerative work hours threshold + reference: + - title: Oxford City Council Council Tax Reduction Scheme 2026 to 2027 + href: https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..fe5f0bb08 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from earnings for Plymouth Council Tax Support with one eligible child. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + period: week + label: Plymouth Council Tax Support one-child weekly childcare deduction cap + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, paragraph 15.3 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..67514093a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from earnings for Plymouth Council Tax Support with two or more eligible children. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + period: week + label: Plymouth Council Tax Support two-or-more-child weekly childcare deduction cap + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, paragraph 15.3 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/childcare/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/childcare/work_hours.yaml new file mode 100644 index 000000000..a3e3186b0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/childcare/work_hours.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly work hours for Plymouth Council Tax Support childcare costs to be deducted from earnings. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Plymouth Council Tax Support childcare deduction weekly work-hours threshold + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, sections 6 and 18 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/couple.yaml new file mode 100644 index 000000000..b01a34dbe --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/couple.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Plymouth couple working-age Council Tax Support applicants without dependent children. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Plymouth couple CTS earnings disregard + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 2 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/disability_or_esa_component.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/disability_or_esa_component.yaml new file mode 100644 index 000000000..97463b6b9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/disability_or_esa_component.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Plymouth working-age Council Tax Support applicants with a disability premium, severe disability premium, work-related activity component, or support component. +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Plymouth disability or ESA component CTS earnings disregard + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 2 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/lone_parent_or_couple_with_child.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/lone_parent_or_couple_with_child.yaml new file mode 100644 index 000000000..a2ba08a80 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/lone_parent_or_couple_with_child.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Plymouth lone-parent or couple working-age Council Tax Support applicants with a dependent child or qualifying young person. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Plymouth family CTS earnings disregard + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 2 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/single.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/single.yaml new file mode 100644 index 000000000..5ed5aa95b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/earnings_disregard/single.yaml @@ -0,0 +1,10 @@ +description: Weekly earnings disregard for Plymouth single working-age Council Tax Support applicants. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Plymouth single CTS earnings disregard + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 2 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/child_under_5.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/child_under_5.yaml new file mode 100644 index 000000000..47aa1da5e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/child_under_5.yaml @@ -0,0 +1,33 @@ +description: Council Tax Support rate by weekly income band for Plymouth working-age households with at least one dependent child under age 5. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 329 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 393 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 524 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 719 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Plymouth under-5-child weekly income-band CTS rate + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 1 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf + - title: Plymouth City Council Tax Support 2026/2027 + href: https://www.plymouth.gov.uk/council-tax-support-20262027 diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..0e2449442 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,33 @@ +description: Council Tax Support rate by weekly income band for Plymouth couple working-age households with no dependent children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 158 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 222 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 290 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 393 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Plymouth couple weekly income-band CTS rate + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 1 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf + - title: Plymouth City Council Tax Support 2026/2027 + href: https://www.plymouth.gov.uk/council-tax-support-20262027 diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/one_child.yaml new file mode 100644 index 000000000..561ff9e27 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/one_child.yaml @@ -0,0 +1,33 @@ +description: Council Tax Support rate by weekly income band for Plymouth working-age households with one dependent child or qualifying young person. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 263 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 329 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 458 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 590 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Plymouth one-child weekly income-band CTS rate + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 1 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf + - title: Plymouth City Council Tax Support 2026/2027 + href: https://www.plymouth.gov.uk/council-tax-support-20262027 diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..435d78c6e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,33 @@ +description: Council Tax Support rate by weekly income band for Plymouth single working-age households with no dependent children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 105 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 171 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 237 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 340 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Plymouth single weekly income-band CTS rate + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 1 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf + - title: Plymouth City Council Tax Support 2026/2027 + href: https://www.plymouth.gov.uk/council-tax-support-20262027 diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/two_or_more_children.yaml new file mode 100644 index 000000000..ef3a1685f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/two_or_more_children.yaml @@ -0,0 +1,33 @@ +description: Council Tax Support rate by weekly income band for Plymouth working-age households with two or more dependent children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 329 + amount: + 2026-04-01: 0.6 + - threshold: + 2026-04-01: 393 + amount: + 2026-04-01: 0.4 + - threshold: + 2026-04-01: 524 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 719 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Plymouth two-or-more-child weekly income-band CTS rate + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 1 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf + - title: Plymouth City Council Tax Support 2026/2027 + href: https://www.plymouth.gov.uk/council-tax-support-20262027 diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/war_pensioner.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/war_pensioner.yaml new file mode 100644 index 000000000..243b83dfa --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/income_band/war_pensioner.yaml @@ -0,0 +1,21 @@ +description: Council Tax Support rate by weekly income band for Plymouth working-age households in the war pensioner class. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.8 + - threshold: + 2026-04-01: 653.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Plymouth war-pensioner weekly income-band CTS rate + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Schedule 1 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf + - title: Plymouth City Council Tax Support 2026/2027 + href: https://www.plymouth.gov.uk/council-tax-support-20262027 diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..86e401f44 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,12 @@ +description: Maximum English council tax band ratio eligible for Plymouth working-age Council Tax Support. +values: + 2026-04-01: 1.222222222 +metadata: + unit: /1 + period: year + label: Plymouth Council Tax Support Band E liability cap ratio + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, paragraph 57.1 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf + - title: Plymouth City Council Tax Support 2026/2027 + href: https://www.plymouth.gov.uk/council-tax-support-20262027 diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..10da2c255 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit under the Plymouth working-age Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Plymouth Council Tax Support capital limit + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, Class D and Schedule 1 paragraphs 5-6 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf + - title: Plymouth City Council Tax Support 2026/2027 + href: https://www.plymouth.gov.uk/council-tax-support-20262027 diff --git a/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..e09a1c289 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/plymouth/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,12 @@ +description: Weekly non-dependant deduction under the Plymouth working-age Council Tax Support scheme. +values: + 2026-04-01: 5.20 +metadata: + unit: currency-GBP + period: week + label: Plymouth Council Tax Support weekly non-dependant deduction + reference: + - title: Plymouth City Council Tax Support Scheme 2026/27, paragraph 58.1 + href: https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf + - title: Plymouth City Council Tax Support 2026/2027 + href: https://www.plymouth.gov.uk/council-tax-support-20262027 diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/earnings_threshold/with_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/earnings_threshold/with_dependants.yaml new file mode 100644 index 000000000..4a4f05712 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/earnings_threshold/with_dependants.yaml @@ -0,0 +1,10 @@ +description: Redbridge weekly net earnings threshold for the working-age class with dependants. +values: + 2026-04-01: 313 +metadata: + unit: currency-GBP + period: week + label: Redbridge with-dependants weekly net earnings threshold + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, Schedule 3 + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/earnings_threshold/without_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/earnings_threshold/without_dependants.yaml new file mode 100644 index 000000000..293b6442f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/earnings_threshold/without_dependants.yaml @@ -0,0 +1,10 @@ +description: Redbridge weekly net earnings threshold for the working-age class without dependants. +values: + 2026-04-01: 234 +metadata: + unit: currency-GBP + period: week + label: Redbridge without-dependants weekly net earnings threshold + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, Schedule 3 + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..5214c1259 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,9 @@ +description: Redbridge capital limit for working-age Council Tax Reduction. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + label: Redbridge working-age CTR capital limit + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, paragraph 23 + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/minimum_award/weekly_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/minimum_award/weekly_amount.yaml new file mode 100644 index 000000000..929164ad7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/minimum_award/weekly_amount.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly Redbridge Council Tax Reduction award for working-age applicants. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Redbridge minimum weekly CTR award + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, paragraph 32A + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/non_dep_deduction/not_working_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/non_dep_deduction/not_working_amount.yaml new file mode 100644 index 000000000..799058b3a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/non_dep_deduction/not_working_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly Redbridge working-age Council Tax Reduction deduction for a non-dependant not in remunerative work. +values: + 2026-04-01: 10.59 +metadata: + unit: currency-GBP + period: week + label: Redbridge non-working non-dependant weekly CTR deduction + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, paragraph 30A + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/non_dep_deduction/working_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/non_dep_deduction/working_amount.yaml new file mode 100644 index 000000000..052abe80b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/non_dep_deduction/working_amount.yaml @@ -0,0 +1,10 @@ +description: Weekly Redbridge working-age Council Tax Reduction deduction for a non-dependant in remunerative work. +values: + 2026-04-01: 21.18 +metadata: + unit: currency-GBP + period: week + label: Redbridge working non-dependant weekly CTR deduction + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, paragraph 30A + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/disability.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/disability.yaml new file mode 100644 index 000000000..313a07538 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/disability.yaml @@ -0,0 +1,9 @@ +description: Redbridge Council Tax Reduction support rate for working-age applicants in the disability benefit class. +values: + 2026-04-01: 0.73 +metadata: + unit: /1 + label: Redbridge disability CTR support rate + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, Schedule 3 + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/not_working_with_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/not_working_with_dependants.yaml new file mode 100644 index 000000000..8926abf4b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/not_working_with_dependants.yaml @@ -0,0 +1,9 @@ +description: Redbridge Council Tax Reduction support rate for working-age passported or Universal Credit applicants with dependants who are not in remunerative work. +values: + 2026-04-01: 0.60 +metadata: + unit: /1 + label: Redbridge not-working with dependants CTR support rate + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, Schedule 3 + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/not_working_without_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/not_working_without_dependants.yaml new file mode 100644 index 000000000..2c5181637 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/not_working_without_dependants.yaml @@ -0,0 +1,9 @@ +description: Redbridge Council Tax Reduction support rate for working-age passported or Universal Credit applicants without dependants who are not in remunerative work. +values: + 2026-04-01: 0.50 +metadata: + unit: /1 + label: Redbridge not-working without dependants CTR support rate + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, Schedule 3 + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/working_with_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/working_with_dependants.yaml new file mode 100644 index 000000000..0c1b2de0b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/working_with_dependants.yaml @@ -0,0 +1,9 @@ +description: Redbridge Council Tax Reduction support rate for working-age applicants with dependants and weekly net earnings below the local threshold. +values: + 2026-04-01: 0.46 +metadata: + unit: /1 + label: Redbridge working with dependants CTR support rate + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, Schedule 3 + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/working_without_dependants.yaml b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/working_without_dependants.yaml new file mode 100644 index 000000000..eaab8b5a6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/redbridge/council_tax_reduction/support_rate/working_without_dependants.yaml @@ -0,0 +1,9 @@ +description: Redbridge Council Tax Reduction support rate for working-age applicants without dependants and weekly net earnings below the local threshold. +values: + 2026-04-01: 0.36 +metadata: + unit: /1 + label: Redbridge working without dependants CTR support rate + reference: + - title: Redbridge Council Tax Reduction Scheme 2026-2027, Schedule 3 + href: https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..398c25653 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Rushmoor Council Tax Reduction maximum eligible liability band ratio +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Rushmoor Council Tax Reduction liability cap band ratio + reference: + - title: Rushmoor Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 57.1(a) + href: https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..2c361fcfd --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Rushmoor maximum Council Tax Reduction support rate +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Rushmoor Council Tax Reduction maximum support rate + reference: + - title: Rushmoor Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 57.1 + href: https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..14d1bed8b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Rushmoor Council Tax Reduction working-age capital limit +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Rushmoor Council Tax Reduction capital limit + reference: + - title: Rushmoor Borough Council - Council Tax Reduction Scheme 2026/27, Classes D and E + href: https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..fee554633 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Rushmoor Council Tax Reduction excess income withdrawal rate +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Rushmoor Council Tax Reduction withdrawal rate + reference: + - title: Rushmoor Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 59.1 + href: https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..b02e56f04 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Rushmoor weekly non-dependant deduction by weekly gross income +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Rushmoor Council Tax Reduction non-dependant deduction + reference: + - title: Rushmoor Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 58.1 + href: https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..4e4e6ad33 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/rushmoor/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Rushmoor non-dependant remunerative work threshold +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Rushmoor non-dependant remunerative work hours + reference: + - title: Rushmoor Borough Council - Council Tax Reduction Scheme 2026/27, paragraph 58.1 + href: https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..d2042b610 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the Scotland Council Tax Reduction scheme. +values: + 2013-04-01: 1 +metadata: + unit: /1 + period: year + label: Scotland Council Tax Reduction maximum support rate + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 + href: https://www.legislation.gov.uk/ssi/2012/303/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..8a659bb8a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under the Scotland Council Tax Reduction scheme. +values: + 2013-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Scotland Council Tax Reduction capital limit + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 + href: https://www.legislation.gov.uk/ssi/2012/303/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..21e164870 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate under the Scotland Council Tax Reduction scheme. +values: + 2013-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Scotland Council Tax Reduction withdrawal rate + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 + href: https://www.legislation.gov.uk/ssi/2012/303/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..6c4e1092c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the Sefton Council Tax Reduction scheme. +values: + 2026-04-01: 0.84 +metadata: + unit: /1 + period: year + label: Sefton Council Tax Reduction maximum support rate + reference: + - title: Sefton Council Tax Reduction Scheme 2026/27 + href: https://www.sefton.gov.uk/media/occbaemk/ctr-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..378bad0f5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Sefton Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Sefton Council Tax Reduction capital limit + reference: + - title: Sefton Council Tax Reduction Scheme 2026/27 + href: https://www.sefton.gov.uk/media/occbaemk/ctr-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..49b753852 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Sefton Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Sefton Council Tax Reduction withdrawal rate + reference: + - title: Sefton Council Tax Reduction Scheme 2026/27 + href: https://www.sefton.gov.uk/media/occbaemk/ctr-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..e48e0e66b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,19 @@ +description: Weekly working-age non-dependant deduction schedule under the Sefton Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 2 + - threshold: + 2026-04-01: 195 + amount: + 2026-04-01: 5 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Sefton Council Tax Reduction working-age non-dependant deduction schedule + reference: + - title: Sefton Council Tax Reduction Scheme 2026/27 + href: https://www.sefton.gov.uk/media/occbaemk/ctr-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..c1ce4b5b0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/sefton/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly hours for remunerative work under the Sefton Council Tax Reduction non-dependant deduction rules. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Sefton Council Tax Reduction remunerative work hours threshold + reference: + - title: Sefton Council Tax Reduction Scheme 2026/27 + href: https://www.sefton.gov.uk/media/occbaemk/ctr-scheme-2026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/income_band/no_earned_income_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/income_band/no_earned_income_support_rate.yaml new file mode 100644 index 000000000..aeb7cad47 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/income_band/no_earned_income_support_rate.yaml @@ -0,0 +1,11 @@ +description: Council Tax Support rate when a Slough working-age claimant has no earned income. +values: + 2026-04-01: 0.7 +metadata: + unit: /1 + label: Slough Council Tax Support no-earned-income support rate + reference: + - title: Slough Borough Council Council Tax Support Scheme 2026/27, Schedule 1 paragraphs 3 and 9 + href: https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27 + - title: Slough Borough Council, key features of the Council Tax Support Scheme + href: https://www.slough.gov.uk/council-tax-support/calculate-council-tax-support-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/income_band/support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/income_band/support_rate.yaml new file mode 100644 index 000000000..3c273e05f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/income_band/support_rate.yaml @@ -0,0 +1,41 @@ +description: Council Tax Support rate by weekly earned income band under the Slough working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 115.39 + amount: + 2026-04-01: 0.32 + - threshold: + 2026-04-01: 184.62 + amount: + 2026-04-01: 0.2 + - threshold: + 2026-04-01: 253.85 + amount: + 2026-04-01: 0.15 + - threshold: + 2026-04-01: 323.08 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 392.31 + amount: + 2026-04-01: 0.05 + - threshold: + 2026-04-01: 461.54 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: Slough Council Tax Support weekly earnings band support rate + reference: + - title: Slough Borough Council Council Tax Support Scheme 2026/27, Schedule 1 + href: https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27 + - title: Slough Borough Council, income bands for Council Tax Support 2026-27 + href: https://www.slough.gov.uk/council-tax-support/calculate-council-tax-support-2026-27/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..60f72e85c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: Maximum English council tax band ratio eligible for Slough working-age Council Tax Support. +values: + 2026-04-01: 0.8888888889 +metadata: + unit: /1 + label: Slough Council Tax Support Band C liability cap ratio + reference: + - title: Slough Borough Council Council Tax Support Scheme 2026/27, paragraph 55.1 + href: https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..a729d0805 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit under the Slough working-age Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Slough Council Tax Support capital limit + reference: + - title: Slough Borough Council Council Tax Support Scheme 2026/27, paragraph 30.1 and Schedule 1 paragraph 7 + href: https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27 + - title: Slough Borough Council, key features of the Council Tax Support Scheme + href: https://www.slough.gov.uk/council-tax-support/calculate-council-tax-support-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/means_test/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/means_test/minimum_award.yaml new file mode 100644 index 000000000..d6fd89a7b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/means_test/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Weekly minimum payable Council Tax Support under the Slough working-age scheme. +values: + 2026-04-01: 0.01 +metadata: + unit: currency-GBP + period: week + label: Slough Council Tax Support minimum weekly award + reference: + - title: Slough Borough Council, income bands for Council Tax Support 2026-27 + href: https://www.slough.gov.uk/council-tax-support/calculate-council-tax-support-2026-27/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/earnings_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/earnings_threshold.yaml new file mode 100644 index 000000000..93a0f9f58 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/earnings_threshold.yaml @@ -0,0 +1,12 @@ +description: Weekly gross earnings threshold for the high Slough working-age non-dependant deduction. +values: + 2026-04-01: 200 +metadata: + unit: currency-GBP + period: week + label: Slough Council Tax Support high non-dependant deduction earnings threshold + reference: + - title: Slough Borough Council Council Tax Support Scheme 2026/27, paragraph 56.1 + href: https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27 + - title: Slough Borough Council, key features of the Council Tax Support Scheme + href: https://www.slough.gov.uk/council-tax-support/calculate-council-tax-support-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/high_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/high_amount.yaml new file mode 100644 index 000000000..e9ad613a5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/high_amount.yaml @@ -0,0 +1,12 @@ +description: High weekly non-dependant deduction under the Slough working-age Council Tax Support scheme. +values: + 2026-04-01: 11 +metadata: + unit: currency-GBP + period: week + label: Slough Council Tax Support high non-dependant deduction + reference: + - title: Slough Borough Council Council Tax Support Scheme 2026/27, paragraph 56.1 + href: https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27 + - title: Slough Borough Council, key features of the Council Tax Support Scheme + href: https://www.slough.gov.uk/council-tax-support/calculate-council-tax-support-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/low_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/low_amount.yaml new file mode 100644 index 000000000..3217b9593 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/low_amount.yaml @@ -0,0 +1,12 @@ +description: Low weekly non-dependant deduction under the Slough working-age Council Tax Support scheme. +values: + 2026-04-01: 5 +metadata: + unit: currency-GBP + period: week + label: Slough Council Tax Support low non-dependant deduction + reference: + - title: Slough Borough Council Council Tax Support Scheme 2026/27, paragraph 56.1 + href: https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27 + - title: Slough Borough Council, key features of the Council Tax Support Scheme + href: https://www.slough.gov.uk/council-tax-support/calculate-council-tax-support-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/work_hours.yaml new file mode 100644 index 000000000..94f9faa4b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/slough/council_tax_reduction/non_dep_deduction/work_hours.yaml @@ -0,0 +1,12 @@ +description: Weekly work-hours threshold for the high Slough working-age non-dependant deduction. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Slough Council Tax Support high non-dependant deduction work-hours threshold + reference: + - title: Slough Borough Council Council Tax Support Scheme 2026/27, paragraph 56.1 + href: https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27 + - title: Slough Borough Council, key features of the Council Tax Support Scheme + href: https://www.slough.gov.uk/council-tax-support/calculate-council-tax-support-2026-27 diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/disabled_income_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/disabled_income_disregard/amount.yaml new file mode 100644 index 000000000..d0b5664d1 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/disabled_income_disregard/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly income disregard for Somerset CTR households that would qualify for a disability premium or disabled child premium. +values: + 2026-04-01: 30 +metadata: + unit: currency-GBP + period: week + label: Somerset CTR disabled household income disregard + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, Schedule 2 paragraph 72 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 income disregards + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..2b08a9c3f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly net earnings disregard for Somerset Council Tax Reduction. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Somerset CTR weekly earnings disregard + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, paragraph 20.2 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 income disregards + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..d5615893e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,34 @@ +description: Council Tax Reduction rate by weekly income band for Somerset couple working-age households without children. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 159.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 238.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 294.01 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 350.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Somerset couple weekly income CTR rate + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 income bands + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/couple_one_child.yaml new file mode 100644 index 000000000..0e8fe32c4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/couple_one_child.yaml @@ -0,0 +1,34 @@ +description: Council Tax Reduction rate by weekly income band for Somerset couple working-age households with one child or qualifying young person. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 227.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 294.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 334.01 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 374.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Somerset couple one-child weekly income CTR rate + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 income bands + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/couple_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/couple_two_or_more_children.yaml new file mode 100644 index 000000000..96be843a7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/couple_two_or_more_children.yaml @@ -0,0 +1,34 @@ +description: Council Tax Reduction rate by weekly income band for Somerset couple working-age households with two or more children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 294.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 374.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 463.01 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 587.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Somerset couple two-or-more-child weekly income CTR rate + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 income bands + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..ef19c5edf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,34 @@ +description: Council Tax Reduction rate by weekly income band for Somerset single working-age households. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 108.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 176.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 215.01 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 266.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Somerset single weekly income CTR rate + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 income bands + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/single_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/single_one_child.yaml new file mode 100644 index 000000000..809265efe --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/single_one_child.yaml @@ -0,0 +1,34 @@ +description: Council Tax Reduction rate by weekly income band for Somerset single working-age households with one child or qualifying young person. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 181.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 249.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 289.01 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 329.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Somerset single one-child weekly income CTR rate + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 income bands + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/single_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/single_two_or_more_children.yaml new file mode 100644 index 000000000..24869956f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/income_band/single_two_or_more_children.yaml @@ -0,0 +1,34 @@ +description: Council Tax Reduction rate by weekly income band for Somerset single working-age households with two or more children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 249.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 329.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 418.01 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 542.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Somerset single two-or-more-child weekly income CTR rate + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, Schedule 1 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 income bands + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..f0b0f3045 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,13 @@ +description: Maximum English council tax band ratio used to cap Somerset CTR eligible liability. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Somerset CTR Band D liability cap ratio + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, paragraph 48.1 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 Band D cap + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..1cba28198 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Working-age capital limit for Somerset Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Somerset CTR working-age capital limit + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, paragraph 26.1 and Schedule 1 paragraph 5 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 capital rule + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/means_test/passported_capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/means_test/passported_capital_limit.yaml new file mode 100644 index 000000000..16b0c87ad --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/means_test/passported_capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit for Somerset CTR applicants on Income Support, income-based JSA, or income-related ESA whose capital is disregarded up to this amount. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Somerset CTR income-based benefit capital-disregard limit + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, Schedule 3 paragraph 7 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..77c0f88cf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/somerset/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,13 @@ +description: Flat weekly non-dependant deduction for Somerset Council Tax Reduction. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: Somerset CTR non-dependant deduction + reference: + - title: Somerset Council Tax Reduction Scheme 2026/27, Schedule 1 paragraphs 8 to 10 + href: https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + - title: Somerset Council Tax Reduction live 2026/27 non-dependant deduction + href: https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ + diff --git a/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/income_band/support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/income_band/support_rate.yaml new file mode 100644 index 000000000..5a4039b1e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/income_band/support_rate.yaml @@ -0,0 +1,51 @@ +description: Council Tax Reduction support rate by weekly excess-income band under South Derbyshire's working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 1 + - threshold: + 2026-04-01: 5.01 + amount: + 2026-04-01: 0.9 + - threshold: + 2026-04-01: 20.01 + amount: + 2026-04-01: 0.78 + - threshold: + 2026-04-01: 35.01 + amount: + 2026-04-01: 0.66 + - threshold: + 2026-04-01: 50.01 + amount: + 2026-04-01: 0.54 + - threshold: + 2026-04-01: 65.01 + amount: + 2026-04-01: 0.42 + - threshold: + 2026-04-01: 80.01 + amount: + 2026-04-01: 0.3 + - threshold: + 2026-04-01: 95.01 + amount: + 2026-04-01: 0.18 + - threshold: + 2026-04-01: 110.01 + amount: + 2026-04-01: 0.1 + - threshold: + 2026-04-01: 140.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: South Derbyshire Council Tax Reduction weekly excess-income support rate + reference: + title: South Derbyshire Council Tax Reduction Scheme 2026-2027, paragraph 10 + href: https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..c5dd14da8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under South Derbyshire's Council Tax Reduction scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: South Derbyshire Council Tax Reduction capital limit + reference: + title: South Derbyshire Council Tax Reduction Scheme 2026-2027, paragraphs 11 and 29 + href: https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/minimum_award.yaml b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/minimum_award.yaml new file mode 100644 index 000000000..c3e56f575 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/minimum_award.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly Council Tax Reduction award payable under South Derbyshire's working-age scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: South Derbyshire Council Tax Reduction minimum weekly award + reference: + title: South Derbyshire Council Tax Reduction Scheme 2026-2027, paragraph 40 + href: https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/tariff_income_increment.yaml b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/tariff_income_increment.yaml new file mode 100644 index 000000000..dfb3c548b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/tariff_income_increment.yaml @@ -0,0 +1,10 @@ +description: Capital increment for each pound of weekly tariff income under South Derbyshire's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: South Derbyshire Council Tax Reduction tariff income increment + reference: + title: South Derbyshire Council Tax Reduction Scheme 2026-2027, paragraph 36 + href: https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..d6d611c7c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income applies under South Derbyshire's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: South Derbyshire Council Tax Reduction tariff income threshold + reference: + title: South Derbyshire Council Tax Reduction Scheme 2026-2027, paragraph 36 + href: https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..5901a3a34 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_derbyshire/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly non-dependant deduction under South Derbyshire's working-age Council Tax Reduction scheme. +values: + 2026-04-01: 6.25 +metadata: + unit: currency-GBP + period: week + label: South Derbyshire Council Tax Reduction non-dependant deduction + reference: + title: South Derbyshire Council Tax Reduction Scheme 2026-2027, paragraph 55 + href: https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/income_band/support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/income_band/support_rate.yaml new file mode 100644 index 000000000..9cda3988f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/income_band/support_rate.yaml @@ -0,0 +1,41 @@ +description: Council Tax Reduction rate by weekly earned income under the South Gloucestershire working-age scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 0.77 + - threshold: + 2025-04-01: 0.01 + amount: + 2025-04-01: 0.60 + - threshold: + 2025-04-01: 50.01 + amount: + 2025-04-01: 0.40 + - threshold: + 2025-04-01: 100.01 + amount: + 2025-04-01: 0.20 + - threshold: + 2025-04-01: 140.01 + amount: + 2025-04-01: 0.15 + - threshold: + 2025-04-01: 190.01 + amount: + 2025-04-01: 0.10 + - threshold: + 2025-04-01: 230.01 + amount: + 2025-04-01: 0 +metadata: + amount_unit: /1 + threshold_unit: currency-GBP + period: week + type: single_amount + label: South Gloucestershire Council Tax Reduction weekly earnings band support rate + reference: + - title: South Gloucestershire Council, Council tax reduction, working-age applicant table + href: https://beta.southglos.gov.uk/apply-for-council-tax-reduction/ + - title: South Gloucestershire Council Tax Reduction Scheme Rules 2025 (working age applicants), paragraph 8 + href: https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..4dd17067c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit under the South Gloucestershire working-age Council Tax Reduction scheme. The live page says savings of 6,000 pounds or more are excluded, but the formal rules exclude capital that exceeds 6,000 pounds; this parameter follows the formal scheme boundary. +values: + 2025-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: South Gloucestershire Council Tax Reduction capital limit + reference: + - title: South Gloucestershire Council Tax Reduction Scheme Rules 2025 (working age applicants), paragraph 6(a) + href: https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf + - title: South Gloucestershire Council, Council tax reduction + href: https://beta.southglos.gov.uk/apply-for-council-tax-reduction/ diff --git a/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/non_dep_deduction/high_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/non_dep_deduction/high_amount.yaml new file mode 100644 index 000000000..90c94788d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/non_dep_deduction/high_amount.yaml @@ -0,0 +1,10 @@ +description: High weekly non-dependant deduction under the South Gloucestershire working-age Council Tax Reduction scheme. +values: + 2025-04-01: 14 +metadata: + unit: currency-GBP + period: week + label: South Gloucestershire high non-dependant deduction + reference: + - title: South Gloucestershire Council Tax Reduction Scheme Rules 2025 (working age applicants), Appendix 3 paragraph 8(4) + href: https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/non_dep_deduction/low_amount.yaml b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/non_dep_deduction/low_amount.yaml new file mode 100644 index 000000000..424b82017 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/non_dep_deduction/low_amount.yaml @@ -0,0 +1,10 @@ +description: Low weekly non-dependant deduction under the South Gloucestershire working-age Council Tax Reduction scheme. +values: + 2025-04-01: 3.50 +metadata: + unit: currency-GBP + period: week + label: South Gloucestershire low non-dependant deduction + reference: + - title: South Gloucestershire Council Tax Reduction Scheme Rules 2025 (working age applicants), Appendix 3 paragraph 8(4) + href: https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..af3cb0313 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly work-hours threshold for South Gloucestershire remunerative work. +values: + 2025-04-01: 16 +metadata: + unit: hour + period: week + label: South Gloucestershire remunerative work hours threshold + reference: + - title: South Gloucestershire Council Tax Reduction Scheme Rules 2025 (working age applicants), Appendix 3 paragraph 9 + href: https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/self_employment_floor/hourly_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/self_employment_floor/hourly_rate.yaml new file mode 100644 index 000000000..a19207862 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/self_employment_floor/hourly_rate.yaml @@ -0,0 +1,10 @@ +description: Hourly rate used in the South Gloucestershire self-employed nil-income floor. +values: + 2025-04-01: 5 +metadata: + unit: currency-GBP + period: hour + label: South Gloucestershire self-employed nil-income floor hourly rate + reference: + - title: South Gloucestershire Council Tax Reduction Scheme Rules 2025 (working age applicants), Appendix 3 paragraph 14(13) + href: https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/self_employment_floor/weekly_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/self_employment_floor/weekly_hours.yaml new file mode 100644 index 000000000..75d904acc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_gloucestershire/council_tax_reduction/self_employment_floor/weekly_hours.yaml @@ -0,0 +1,10 @@ +description: Weekly hours used in the South Gloucestershire self-employed nil-income floor. +values: + 2025-04-01: 30 +metadata: + unit: hour + period: week + label: South Gloucestershire self-employed nil-income floor weekly hours + reference: + - title: South Gloucestershire Council Tax Reduction Scheme Rules 2025 (working age applicants), Appendix 3 paragraph 14(13) + href: https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..014fa2095 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,13 @@ +description: Maximum share of eligible Council Tax liability covered under the South Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 0.87 + 2026-04-01: 0.87 +metadata: + unit: /1 + period: year + label: South Norfolk Council Tax Reduction maximum support rate + reference: + - title: South Norfolk Council Council Tax Reduction Scheme 2025/26 + href: https://www.southnorfolkandbroadland.gov.uk/asset-library/south-norfolk-ctr-scheme-2025-26.pdf + - title: South Norfolk Cabinet Council Tax Reduction Scheme 2026/27 minutes + href: https://southnorfolkandbroadland.moderngov.co.uk/documents/g1058/Printed%20minutes%2024th-Nov-2025%2009.00%20South%20Norfolk%20Cabinet.pdf?T=1 diff --git a/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..7df317ad4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the South Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: South Norfolk Council Tax Reduction capital limit + reference: + - title: South Norfolk Council Council Tax Reduction Scheme 2025/26 + href: https://www.southnorfolkandbroadland.gov.uk/asset-library/south-norfolk-ctr-scheme-2025-26.pdf + - title: South Norfolk Cabinet Council Tax Reduction Scheme 2026/27 minutes + href: https://southnorfolkandbroadland.moderngov.co.uk/documents/g1058/Printed%20minutes%2024th-Nov-2025%2009.00%20South%20Norfolk%20Cabinet.pdf?T=1 diff --git a/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..fa7441d78 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,13 @@ +description: Withdrawal rate for working-age households under the South Norfolk Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: South Norfolk Council Tax Reduction withdrawal rate + reference: + - title: South Norfolk Council Council Tax Reduction Scheme 2025/26 + href: https://www.southnorfolkandbroadland.gov.uk/asset-library/south-norfolk-ctr-scheme-2025-26.pdf + - title: South Norfolk Cabinet Council Tax Reduction Scheme 2026/27 minutes + href: https://southnorfolkandbroadland.moderngov.co.uk/documents/g1058/Printed%20minutes%2024th-Nov-2025%2009.00%20South%20Norfolk%20Cabinet.pdf?T=1 diff --git a/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..122c0fd9b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/south_norfolk/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly non-dependant deduction under the South Norfolk Council Tax Reduction scheme for working-age households. +values: + 2025-04-01: 7 + 2026-04-01: 7 +metadata: + unit: currency-GBP + period: week + label: South Norfolk Council Tax Reduction working-age non-dependant deduction amount + reference: + - title: South Norfolk Council Council Tax Reduction Scheme 2025/26 + href: https://www.southnorfolkandbroadland.gov.uk/asset-library/south-norfolk-ctr-scheme-2025-26.pdf + - title: South Norfolk Cabinet Council Tax Reduction Scheme 2026/27 minutes + href: https://southnorfolkandbroadland.moderngov.co.uk/documents/g1058/Printed%20minutes%2024th-Nov-2025%2009.00%20South%20Norfolk%20Cabinet.pdf?T=1 diff --git a/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/childcare/weekly_maximum/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/childcare/weekly_maximum/one_child.yaml new file mode 100644 index 000000000..923f1c6bc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/childcare/weekly_maximum/one_child.yaml @@ -0,0 +1,11 @@ +description: Maximum weekly childcare costs deducted from earnings for Southend-on-Sea Council Tax Reduction with one eligible child. +values: + 2026-04-01: 175 +metadata: + unit: currency-GBP + period: week + label: Southend-on-Sea Council Tax Reduction one-child weekly childcare deduction cap + reference: + - title: Southend-on-Sea Borough Council Council Tax Reduction S13A Scheme 2026/27, Schedule 4 paragraph 20(c) + href: https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme + diff --git a/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml new file mode 100644 index 000000000..98d57e24e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/childcare/weekly_maximum/two_or_more_children.yaml @@ -0,0 +1,10 @@ +description: Maximum weekly childcare costs deducted from earnings for Southend-on-Sea Council Tax Reduction with two or more eligible children. +values: + 2026-04-01: 300 +metadata: + unit: currency-GBP + period: week + label: Southend-on-Sea Council Tax Reduction two-or-more-child weekly childcare deduction cap + reference: + - title: Southend-on-Sea Borough Council Council Tax Reduction S13A Scheme 2026/27, Schedule 4 paragraph 20(c) + href: https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/childcare/work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/childcare/work_hours.yaml new file mode 100644 index 000000000..89b750439 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/childcare/work_hours.yaml @@ -0,0 +1,10 @@ +description: Minimum weekly work hours for Southend-on-Sea Council Tax Reduction childcare costs to be deducted from earnings. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Southend-on-Sea Council Tax Reduction childcare deduction weekly work-hours threshold + reference: + - title: Southend-on-Sea Borough Council Council Tax Reduction S13A Scheme 2026/27, Schedule 4 paragraph 20(d) + href: https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..390318d23 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,11 @@ +description: Weekly earnings disregard under the Southend-on-Sea working-age Council Tax Reduction scheme. +values: + 2026-04-01: 20 +metadata: + unit: currency-GBP + period: week + label: Southend-on-Sea Council Tax Reduction earnings disregard + reference: + - title: Southend-on-Sea Borough Council Council Tax Reduction S13A Scheme 2026/27, Schedule 4 + href: https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme + diff --git a/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/income_band/no_children.yaml b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/income_band/no_children.yaml new file mode 100644 index 000000000..6de7e8038 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/income_band/no_children.yaml @@ -0,0 +1,28 @@ +description: Council Tax Reduction rate by weekly income band for Southend-on-Sea working-age households with no dependent children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 110.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 185.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 260.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Southend-on-Sea no-child weekly income-band CTR rate + reference: + - title: Southend-on-Sea Borough Council Council Tax Reduction S13A Scheme 2026/27, Schedule 1 + href: https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme + diff --git a/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/income_band/one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/income_band/one_child.yaml new file mode 100644 index 000000000..6644cdc3a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/income_band/one_child.yaml @@ -0,0 +1,32 @@ +description: Council Tax Reduction rate by weekly income band for Southend-on-Sea working-age households with one dependent child or qualifying young person. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 110.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 185.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 260.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 335.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Southend-on-Sea one-child weekly income-band CTR rate + reference: + - title: Southend-on-Sea Borough Council Council Tax Reduction S13A Scheme 2026/27, Schedule 1 + href: https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme + diff --git a/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/income_band/two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/income_band/two_or_more_children.yaml new file mode 100644 index 000000000..cf24dce9e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/income_band/two_or_more_children.yaml @@ -0,0 +1,36 @@ +description: Council Tax Reduction rate by weekly income band for Southend-on-Sea working-age households with two or more dependent children or qualifying young people. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 110.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 185.01 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 260.01 + amount: + 2026-04-01: 0.5 + - threshold: + 2026-04-01: 335.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 410.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Southend-on-Sea two-or-more-child weekly income-band CTR rate + reference: + - title: Southend-on-Sea Borough Council Council Tax Reduction S13A Scheme 2026/27, Schedule 1 + href: https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme + diff --git a/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..eb5152936 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southend_on_sea/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital threshold at which Southend-on-Sea working-age Council Tax Reduction is denied. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Southend-on-Sea Council Tax Reduction capital exclusion threshold + reference: + - title: Southend-on-Sea Borough Council Council Tax Reduction S13A Scheme 2026/27, section 26.1 and Schedule 1 paragraph 5 + href: https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme + diff --git a/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..036317e00 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Southwark Council Tax Reduction scheme. +values: + 2025-04-01: 0.85 +metadata: + unit: /1 + period: year + label: Southwark Council Tax Reduction maximum support rate + reference: + - title: Southwark Council Tax Reduction Scheme 2025 + href: https://www.southwark.gov.uk/sites/default/files/2025-03/Southwark%20Council%20Tax%20Reduction%20Policy%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..cc7f3bdb5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Southwark Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Southwark Council Tax Reduction capital limit + reference: + - title: Southwark Council Tax Reduction Scheme 2025 + href: https://www.southwark.gov.uk/sites/default/files/2025-03/Southwark%20Council%20Tax%20Reduction%20Policy%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..c743c540f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Southwark Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Southwark Council Tax Reduction withdrawal rate + reference: + - title: Southwark Council Tax Reduction Scheme 2025 + href: https://www.southwark.gov.uk/sites/default/files/2025-03/Southwark%20Council%20Tax%20Reduction%20Policy%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..e1dada5f5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/southwark/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Southwark Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 12.8 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Southwark Council Tax Reduction non-dependant deduction schedule + reference: + - title: Southwark Council Tax Reduction Scheme 2025 + href: https://www.southwark.gov.uk/sites/default/files/2025-03/Southwark%20Council%20Tax%20Reduction%20Policy%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..3b7ee1160 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the St Albans Council Tax Reduction scheme for non-Universal Credit working-age households. +values: + 2025-04-01: 1 +metadata: + unit: /1 + period: year + label: St Albans Council Tax Reduction maximum support rate + reference: + - title: St Albans Council Tax Reduction Scheme 2025/26 + href: https://www.stalbans.gov.uk/sites/default/files/attachments/St%20Albans%20S13A%20202526%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..e506122ca --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the St Albans Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: St Albans Council Tax Reduction capital limit + reference: + - title: St Albans Council Tax Reduction Scheme 2025/26 + href: https://www.stalbans.gov.uk/sites/default/files/attachments/St%20Albans%20S13A%20202526%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..5e5ee0ef0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for non-Universal Credit working-age households under the St Albans Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: St Albans Council Tax Reduction withdrawal rate + reference: + - title: St Albans Council Tax Reduction Scheme 2025/26 + href: https://www.stalbans.gov.uk/sites/default/files/attachments/St%20Albans%20S13A%20202526%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..f37a7e87c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the St Albans Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 12.8 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: St Albans Council Tax Reduction non-dependant deduction schedule + reference: + - title: St Albans Council Tax Reduction Scheme 2025/26 + href: https://www.stalbans.gov.uk/sites/default/files/attachments/St%20Albans%20S13A%20202526%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/uc_earnings/contribution.yaml b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/uc_earnings/contribution.yaml new file mode 100644 index 000000000..fc355945a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/uc_earnings/contribution.yaml @@ -0,0 +1,49 @@ +description: Monthly Council Tax contribution for Universal Credit claimants under the St Albans Council Tax Reduction scheme, based on claimant and partner monthly earnings. +brackets: + - threshold: + 2025-04-01: 0 + 2026-04-01: 0 + amount: + 2025-04-01: 0 + 2026-04-01: 0 + - threshold: + 2025-04-01: 350 + 2026-04-01: 370 + amount: + 2025-04-01: 45 + 2026-04-01: 45 + - threshold: + 2025-04-01: 715 + 2026-04-01: 750 + amount: + 2025-04-01: 95 + 2026-04-01: 100 + - threshold: + 2025-04-01: 1_360 + 2026-04-01: 1_440 + amount: + 2025-04-01: 145 + 2026-04-01: 150 + - threshold: + 2025-04-01: 2_170 + 2026-04-01: 2_285 + amount: + 2025-04-01: 220 + 2026-04-01: 230 + - threshold: + 2025-04-01: 2_790 + 2026-04-01: 2_940 + amount: + 2025-04-01: 280 + 2026-04-01: 295 +metadata: + amount_unit: currency-GBP + period: month + threshold_unit: currency-GBP + type: single_amount + label: St Albans Council Tax Reduction Universal Credit earnings contribution schedule + reference: + - title: St Albans Council Tax Reduction Scheme 2025/26 + href: https://www.stalbans.gov.uk/sites/default/files/attachments/St%20Albans%20S13A%20202526%20Final.pdf + - title: St Albans Council Tax Support + href: https://www.stalbans.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/uc_earnings/no_entitlement_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/uc_earnings/no_entitlement_threshold.yaml new file mode 100644 index 000000000..6b14c5580 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_albans/council_tax_reduction/uc_earnings/no_entitlement_threshold.yaml @@ -0,0 +1,13 @@ +description: Monthly earnings threshold above which Universal Credit claimants have no entitlement under the St Albans Council Tax Reduction scheme. +values: + 2025-04-01: 3_415 + 2026-04-01: 3_600 +metadata: + unit: currency-GBP + period: month + label: St Albans Council Tax Reduction Universal Credit no-entitlement earnings threshold + reference: + - title: St Albans Council Tax Reduction Scheme 2025/26 + href: https://www.stalbans.gov.uk/sites/default/files/attachments/St%20Albans%20S13A%20202526%20Final.pdf + - title: St Albans Council Tax Support + href: https://www.stalbans.gov.uk/council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..d297b5fe5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: St Helens Council Tax band ratio used to cap working-age maximum eligible liability at the Band D amount. Paragraph 9 restricts working-age support in Bands F, G and H to the Band D liability for the dwelling. The Band D ratio in the English council-tax band schedule is 1. +values: + 2026-04-01: 1 +metadata: + unit: /1 + label: St Helens Council Tax Reduction Band D cap ratio + reference: + - title: St Helens Borough Council - Council Tax Reduction Scheme 2026-2027, paragraph 9 + href: https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..d7d9c5b36 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: St Helens maximum Council Tax Reduction rate for working-age applicants. Paragraph 9 sets the low-income maximum at 80 per cent of Council Tax liability, with Band F-H households additionally capped at the Band D liability for the dwelling. +values: + 2026-04-01: 0.8 +metadata: + unit: /1 + period: year + label: St Helens Council Tax Reduction maximum support rate + reference: + - title: St Helens Borough Council - Council Tax Reduction Scheme 2026-2027, paragraph 9 + href: https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..a241f6e10 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: St Helens Council Tax Reduction working-age capital limit. Paragraph 10 lists capital not exceeding 16,000 pounds among the overall conditions for an award. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: St Helens Council Tax Reduction capital limit + reference: + - title: St Helens Borough Council - Council Tax Reduction Scheme 2026-2027, paragraphs 10 and 28 + href: https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/means_test/minimum_weekly_award.yaml b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/means_test/minimum_weekly_award.yaml new file mode 100644 index 000000000..3207ac963 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/means_test/minimum_weekly_award.yaml @@ -0,0 +1,10 @@ +description: St Helens Council Tax Reduction working-age minimum weekly award. Paragraph 40 cancels working-age awards calculated at less than 1 pound per week. +values: + 2026-04-01: 1.0 +metadata: + unit: currency-GBP + period: week + label: St Helens Council Tax Reduction minimum weekly award + reference: + - title: St Helens Borough Council - Council Tax Reduction Scheme 2026-2027, paragraph 40 + href: https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..51cbaa847 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/st_helens/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: St Helens Council Tax Reduction weekly taper. Paragraph 9 mirrors the prescribed Default Scheme 20 per cent withdrawal of any excess of income over the amount for living expenses, applied weekly. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: St Helens Council Tax Reduction withdrawal rate + reference: + - title: St Helens Borough Council - Council Tax Reduction Scheme 2026-2027, paragraphs 9 and 37 + href: https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..5d4624f49 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Stevenage Council Tax Reduction scheme. +values: + 2025-04-01: 0.915 +metadata: + unit: /1 + period: year + label: Stevenage Council Tax Reduction maximum support rate + reference: + - title: Stevenage Borough Council Council Tax Reduction Scheme 2025/26 + href: https://www.stevenage.gov.uk/documents/council-tax/council-tax-support-scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..a50412072 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under the Stevenage Council Tax Reduction means test. +values: + 2025-04-01: 16000 +metadata: + unit: currency-GBP + period: year + label: Stevenage Council Tax Reduction capital limit + reference: + - title: Stevenage Borough Council Council Tax Reduction Scheme 2025/26 + href: https://www.stevenage.gov.uk/documents/council-tax/council-tax-support-scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..a44940a93 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate under the Stevenage Council Tax Reduction means test. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Stevenage Council Tax Reduction withdrawal rate + reference: + - title: Stevenage Borough Council Council Tax Reduction Scheme 2025/26 + href: https://www.stevenage.gov.uk/documents/council-tax/council-tax-support-scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..448c37276 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stevenage/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Stevenage Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 12.8 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Stevenage Council Tax Reduction non-dependant deduction schedule + reference: + - title: Stevenage Borough Council Council Tax Reduction Scheme 2025/26 + href: https://www.stevenage.gov.uk/documents/council-tax/council-tax-support-scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/maximum_liability/standard_cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/maximum_liability/standard_cap_band_ratio.yaml new file mode 100644 index 000000000..2fd833981 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/maximum_liability/standard_cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Council Tax band ratio used to cap eligible liability for most working-age households under the Stockport Council Tax Support scheme. +values: + 2026-04-01: 0.666666667 +metadata: + unit: /1 + period: year + label: Stockport Council Tax Support standard Band A cap ratio + reference: + - title: Stockport Council Tax Support Scheme 2026 to 2027 + href: https://www.stockport.gov.uk/council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/maximum_liability/three_bedroom_cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/maximum_liability/three_bedroom_cap_band_ratio.yaml new file mode 100644 index 000000000..ed47dfc7b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/maximum_liability/three_bedroom_cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Council Tax band ratio used to cap eligible liability for working-age households needing at least three bedrooms under the Stockport Council Tax Support scheme. +values: + 2026-04-01: 0.777777778 +metadata: + unit: /1 + period: year + label: Stockport Council Tax Support three-bedroom Band B cap ratio + reference: + - title: Stockport Council Tax Support Scheme 2026 to 2027 + href: https://www.stockport.gov.uk/council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..6a236be3e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Stockport Council Tax Support scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Stockport Council Tax Support maximum support rate + reference: + - title: Stockport Council Tax Support Scheme 2026 to 2027 + href: https://www.stockport.gov.uk/council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..99d123f19 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Stockport Council Tax Support scheme. +values: + 2026-04-01: 8_000 +metadata: + unit: currency-GBP + period: year + label: Stockport Council Tax Support capital limit + reference: + - title: Stockport Council Tax Support Scheme 2026 to 2027 + href: https://www.stockport.gov.uk/council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/tariff_income_step.yaml b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/tariff_income_step.yaml new file mode 100644 index 000000000..2318d7bc7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/tariff_income_step.yaml @@ -0,0 +1,10 @@ +description: Capital step that adds one pound of weekly tariff income under the Stockport Council Tax Support scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: week + label: Stockport Council Tax Support tariff income capital step + reference: + - title: Stockport Council Tax Support Scheme 2026 to 2027 + href: https://www.stockport.gov.uk/council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..c3962c38f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which tariff income is added under the Stockport Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: week + label: Stockport Council Tax Support tariff income threshold + reference: + - title: Stockport Council Tax Support Scheme 2026 to 2027 + href: https://www.stockport.gov.uk/council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..a1c20b151 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate under the Stockport Council Tax Support means test. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Stockport Council Tax Support withdrawal rate + reference: + - title: Stockport Council Tax Support Scheme 2026 to 2027 + href: https://www.stockport.gov.uk/council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..ae8787388 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stockport/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,19 @@ +description: Weekly non-dependant deduction schedule under the Stockport Council Tax Support scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5 + - threshold: + 2026-04-01: 188 + amount: + 2026-04-01: 10 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Stockport Council Tax Support non-dependant deduction schedule + reference: + - title: Stockport Council Tax Support Scheme 2026 to 2027 + href: https://www.stockport.gov.uk/council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/stroud/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/stroud/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..d2955e2f0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stroud/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Stroud Council Tax Reduction scheme. +values: + 2025-04-01: 1 +metadata: + unit: /1 + period: year + label: Stroud Council Tax Reduction maximum support rate + reference: + - title: Council Tax Support Scheme for Pension Credit Age persons and Working Age persons 2025/26 + href: https://www.stroud.gov.uk/media/bygb4zeg/summary-of-council-tax-support-scheme-202526.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/stroud/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/stroud/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..e5d35223d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stroud/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Stroud Council Tax Reduction scheme. +values: + 2025-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Stroud Council Tax Reduction capital limit + reference: + - title: Council Tax Support Scheme for Pension Credit Age persons and Working Age persons 2025/26 + href: https://www.stroud.gov.uk/media/bygb4zeg/summary-of-council-tax-support-scheme-202526.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/stroud/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/stroud/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..7e92c4439 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/stroud/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Stroud Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Stroud Council Tax Reduction withdrawal rate + reference: + - title: Council Tax Support Scheme for Pension Credit Age persons and Working Age persons 2025/26 + href: https://www.stroud.gov.uk/media/bygb4zeg/summary-of-council-tax-support-scheme-202526.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/couple.yaml b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/couple.yaml new file mode 100644 index 000000000..1a1723180 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/couple.yaml @@ -0,0 +1,27 @@ +description: Council Tax Reduction rate by weekly net income band for working-age couples under the Tameside scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 175.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 225.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Tameside couple weekly net income-band CTR rate + reference: + - title: Tameside Council Tax Reduction Scheme 2026/27 + href: https://tameside.moderngov.co.uk/documents/s200335/Appendix.%202%20for%20Council%20Tax%20Support%20Scheme%202026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/couple_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/couple_one_child.yaml new file mode 100644 index 000000000..517f21b59 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/couple_one_child.yaml @@ -0,0 +1,27 @@ +description: Council Tax Reduction rate by weekly net income band for couples with one dependant under the Tameside scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 275.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 325.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 375.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Tameside couple one-child weekly net income-band CTR rate + reference: + - title: Tameside Council Tax Reduction Scheme 2026/27 + href: https://tameside.moderngov.co.uk/documents/s200335/Appendix.%202%20for%20Council%20Tax%20Support%20Scheme%202026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/couple_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/couple_two_or_more_children.yaml new file mode 100644 index 000000000..e3515974a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/couple_two_or_more_children.yaml @@ -0,0 +1,27 @@ +description: Council Tax Reduction rate by weekly net income band for couples with two or more dependants under the Tameside scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 360.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 410.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 460.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Tameside couple two-or-more-children weekly net income-band CTR rate + reference: + - title: Tameside Council Tax Reduction Scheme 2026/27 + href: https://tameside.moderngov.co.uk/documents/s200335/Appendix.%202%20for%20Council%20Tax%20Support%20Scheme%202026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/lone_parent_one_child.yaml b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/lone_parent_one_child.yaml new file mode 100644 index 000000000..0a211fe91 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/lone_parent_one_child.yaml @@ -0,0 +1,27 @@ +description: Council Tax Reduction rate by weekly net income band for lone parents with one dependant under the Tameside scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 210.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 260.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 310.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Tameside lone-parent one-child weekly net income-band CTR rate + reference: + - title: Tameside Council Tax Reduction Scheme 2026/27 + href: https://tameside.moderngov.co.uk/documents/s200335/Appendix.%202%20for%20Council%20Tax%20Support%20Scheme%202026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/lone_parent_two_or_more_children.yaml b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/lone_parent_two_or_more_children.yaml new file mode 100644 index 000000000..21710e0ea --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/lone_parent_two_or_more_children.yaml @@ -0,0 +1,27 @@ +description: Council Tax Reduction rate by weekly net income band for lone parents with two or more dependants under the Tameside scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 295.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 345.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 395.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Tameside lone-parent two-or-more-children weekly net income-band CTR rate + reference: + - title: Tameside Council Tax Reduction Scheme 2026/27 + href: https://tameside.moderngov.co.uk/documents/s200335/Appendix.%202%20for%20Council%20Tax%20Support%20Scheme%202026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/single.yaml b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/single.yaml new file mode 100644 index 000000000..054f39f8a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/income_band/single.yaml @@ -0,0 +1,27 @@ +description: Council Tax Reduction rate by weekly net income band for single working-age households under the Tameside scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.75 + - threshold: + 2026-04-01: 110.01 + amount: + 2026-04-01: 0.50 + - threshold: + 2026-04-01: 160.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 210.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Tameside single weekly net income-band CTR rate + reference: + - title: Tameside Council Tax Reduction Scheme 2026/27 + href: https://tameside.moderngov.co.uk/documents/s200335/Appendix.%202%20for%20Council%20Tax%20Support%20Scheme%202026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..ca68fb4ae --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Council Tax band ratio used to cap eligible liability for working-age households under the Tameside Council Tax Reduction scheme. +values: + 2026-04-01: 0.666666667 +metadata: + unit: /1 + period: year + label: Tameside Council Tax Reduction Band A cap ratio + reference: + - title: Tameside Council Tax Reduction Scheme 2026/27 + href: https://tameside.moderngov.co.uk/documents/s200335/Appendix.%202%20for%20Council%20Tax%20Support%20Scheme%202026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..b91ff5902 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tameside/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Tameside Council Tax Reduction scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Tameside Council Tax Reduction capital cutoff + reference: + - title: Tameside Council Tax Reduction Scheme 2026/27 + href: https://tameside.moderngov.co.uk/documents/s200335/Appendix.%202%20for%20Council%20Tax%20Support%20Scheme%202026-2027.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tendring/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/tendring/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..0d57e14f0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tendring/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Tendring maximum Council Tax Reduction rate. Working-age applicants must contribute at least 20 per cent of their bill since 1 April 2015, so the maximum award is 80 per cent of liability. +values: + 2026-04-01: 0.8 +metadata: + unit: /1 + period: year + label: Tendring Council Tax Reduction maximum support rate + reference: + - title: Tendring District Council - Council Tax Reduction Scheme 2026/27, paragraph 57 + href: https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf + - title: Tendring DC - Local Council Tax Support live page + href: https://www.tendringdc.gov.uk/content/local-council-tax-support diff --git a/policyengine_uk/parameters/gov/local_authorities/tendring/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/tendring/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..0ac071039 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tendring/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Tendring Council Tax Reduction working-age capital limit. Paragraph 33 sets the prescribed amount at 16,000 pounds and excludes Class D or E applicants with capital savings above that level. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Tendring Council Tax Reduction capital limit + reference: + - title: Tendring District Council - Council Tax Reduction Scheme 2026/27, paragraph 33 and Class D/E condition (g) + href: https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tendring/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/tendring/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..e63904044 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tendring/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Tendring Council Tax Reduction Class E weekly taper. Paragraph 59 applies the prescribed 2 6/7 per cent daily rate to the difference between income and applicable amount, equivalent to a 20 per cent weekly taper. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Tendring Council Tax Reduction withdrawal rate + reference: + - title: Tendring District Council - Council Tax Reduction Scheme 2026/27, paragraph 59 + href: https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..d6bc6adc9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Tewkesbury maximum Council Tax Reduction rate. Tewkesbury Borough Council has remained on the prescribed Default Scheme since April 2013, so the working-age maximum follows paragraph 29(1) of the Default Scheme schedule (100 per cent of council tax liability). +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Tewkesbury Council Tax Reduction maximum support rate + reference: + - title: Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule paragraph 29(1) + href: https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/29 + - title: Tewkesbury Borough Council - Council Tax Reduction Scheme Report (Cabinet, January 2026) + href: https://minutes.tewkesbury.gov.uk/documents/s71351/Council%20Tax%20Reduction%20Scheme%20Report.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..4ba570401 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Tewkesbury Council Tax Reduction working-age capital limit. Tewkesbury follows the prescribed Default Scheme, which excludes applicants whose capital exceeds 16,000 pounds. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Tewkesbury Council Tax Reduction capital limit + reference: + - title: Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule paragraph 23 + href: https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/23 + - title: Tewkesbury Borough Council - Help to pay your Council Tax page + href: https://tewkesbury.gov.uk/services/council-tax-benefits-and-business-rates/council-tax/council-tax-support/ diff --git a/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..1ee5db7fc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,12 @@ +description: Tewkesbury Council Tax Reduction excess income withdrawal rate. Tewkesbury follows the prescribed Default Scheme, which applies the 2 6/7 per cent daily Class E taper (equivalent to 20 per cent weekly) to the difference between income and the applicable amount. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Tewkesbury Council Tax Reduction withdrawal rate + reference: + - title: Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule paragraph 17 + href: https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/17 + - title: Tewkesbury Borough Council - Council Tax Reduction Scheme Report (Cabinet, January 2026) + href: https://minutes.tewkesbury.gov.uk/documents/s71351/Council%20Tax%20Reduction%20Scheme%20Report.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..2b26fbb2c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,31 @@ +description: Tewkesbury weekly non-dependant deduction by weekly gross income. Tewkesbury follows the Default Scheme. Paragraph 30 of the Default Scheme, as amended before the scheme took effect by SI 2012/3085, sets deductions at GBP 3.65 (out-of-work or low-income), then GBP 7.25, GBP 9.15 and GBP 10.95 for higher gross-income brackets. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 3.65 + - threshold: + 2026-04-01: 186 + amount: + 2026-04-01: 7.25 + - threshold: + 2026-04-01: 322 + amount: + 2026-04-01: 9.15 + - threshold: + 2026-04-01: 401 + amount: + 2026-04-01: 10.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Tewkesbury Council Tax Reduction non-dependant deduction + reference: + - title: Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule paragraph 30 + href: https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/30 + - title: Council Tax Reduction Schemes (Prescribed Requirements and Default Scheme) (England) (Amendment) Regulations 2012, regulations 7-8 + href: https://www.legislation.gov.uk/uksi/2012/3085/regulation/8/made + - title: Tewkesbury Borough Council - Council Tax Reduction Scheme Report (Cabinet, January 2026) + href: https://minutes.tewkesbury.gov.uk/documents/s71351/Council%20Tax%20Reduction%20Scheme%20Report.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..cf1825335 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/tewkesbury/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,10 @@ +description: Tewkesbury non-dependant remunerative work threshold. The Default Scheme uses a 16 hour weekly threshold for remunerative work in paragraph 30. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Tewkesbury non-dependant remunerative work hours + reference: + - title: Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule paragraph 30 + href: https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/30 diff --git a/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/earnings_disregard/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/earnings_disregard/amount.yaml new file mode 100644 index 000000000..9746b3404 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/earnings_disregard/amount.yaml @@ -0,0 +1,12 @@ +description: Weekly earnings disregard for Thurrock working-age Council Tax Reduction. +values: + 2026-04-01: 25 +metadata: + unit: currency-GBP + period: week + label: Thurrock CTR earnings disregard + reference: + - title: Thurrock Local Council Tax Support Scheme 2026-27 report, paragraph 4.6 + href: https://thurrock.moderngov.co.uk/documents/s51233/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: Thurrock Council Tax Reduction Scheme, Schedule 3 paragraphs 4, 7, 8, and 10 + href: https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..7319b398a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,12 @@ +description: Maximum share of eligible Council Tax liability covered by Thurrock working-age Council Tax Reduction. +values: + 2026-04-01: 0.75 +metadata: + unit: /1 + period: year + label: Thurrock working-age Council Tax Reduction maximum support rate + reference: + - title: Thurrock Local Council Tax Support Scheme 2026-27 report, paragraph 2.2 and 4.6 + href: https://thurrock.moderngov.co.uk/documents/s51233/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: Thurrock Council Tax Reduction Scheme, section 57.1 + href: https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..5d1073a15 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit for Thurrock working-age Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Thurrock working-age Council Tax Reduction capital limit + reference: + - title: Thurrock Local Council Tax Support Scheme 2026-27 report, paragraph 4.6 + href: https://thurrock.moderngov.co.uk/documents/s51233/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf + - title: Thurrock Council Tax Reduction Scheme, sections 1.7 and 33.1 + href: https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..4d35543ef --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate on excess income for Thurrock working-age Council Tax Reduction. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Thurrock Council Tax Reduction excess-income withdrawal rate + reference: + - title: Thurrock Council Tax Reduction Scheme, sections 1.7 and 59.1 + href: https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..a2a672d95 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction by gross weekly income for Thurrock working-age Council Tax Reduction. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5 + - threshold: + 2026-04-01: 266 + amount: + 2026-04-01: 10.20 + - threshold: + 2026-04-01: 463 + amount: + 2026-04-01: 12.80 + - threshold: + 2026-04-01: 577 + amount: + 2026-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Thurrock Council Tax Reduction non-dependant deduction amount + reference: + - title: Thurrock Council Tax Reduction Scheme, sections 58.1 and 58.2 + href: https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..b6736adc4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/thurrock/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Thurrock working-age Council Tax Reduction non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Thurrock Council Tax Reduction non-dependant remunerative-work hours + reference: + - title: Thurrock Council Tax Reduction Scheme, section 6.1 + href: https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/wakefield/council_tax_reduction/income_band/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/wakefield/council_tax_reduction/income_band/maximum_support_rate.yaml new file mode 100644 index 000000000..d8740058a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wakefield/council_tax_reduction/income_band/maximum_support_rate.yaml @@ -0,0 +1,31 @@ +description: Maximum Council Tax Support rate by assessed weekly non-DWP income band under the Wakefield working-age scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 0.70 + - threshold: + 2026-04-01: 55.01 + amount: + 2026-04-01: 0.55 + - threshold: + 2026-04-01: 165.01 + amount: + 2026-04-01: 0.40 + - threshold: + 2026-04-01: 220.01 + amount: + 2026-04-01: 0.25 + - threshold: + 2026-04-01: 285.01 + amount: + 2026-04-01: 0 +metadata: + amount_unit: /1 + period: week + threshold_unit: currency-GBP + type: single_amount + label: Wakefield Council Tax Support assessed weekly income-band maximum support rate + reference: + - title: Working Age Council Tax Support Scheme + href: https://www.wakefield.gov.uk/council-tax/help-with-your-council-tax/working-age-council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/wakefield/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/wakefield/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..00512853b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wakefield/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Wakefield Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Wakefield Council Tax Support capital limit + reference: + - title: Working Age Council Tax Support Scheme + href: https://www.wakefield.gov.uk/council-tax/help-with-your-council-tax/working-age-council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/wakefield/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/wakefield/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..daa4c0e31 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wakefield/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly non-dependant deduction under the Wakefield Council Tax Support scheme. +values: + 2026-04-01: 7.50 +metadata: + unit: currency-GBP + period: week + label: Wakefield Council Tax Support non-dependant deduction + reference: + - title: Working Age Council Tax Support Scheme + href: https://www.wakefield.gov.uk/council-tax/help-with-your-council-tax/working-age-council-tax-support-scheme diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..377bc0caf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the Wales Council Tax Reduction scheme. +values: + 2013-04-01: 1 +metadata: + unit: /1 + period: year + label: Wales Council Tax Reduction maximum support rate + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2012 + href: https://www.legislation.gov.uk/wsi/2012/3144/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..c3e4c1f7c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under the Wales Council Tax Reduction scheme. +values: + 2013-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Wales Council Tax Reduction capital limit + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2012 + href: https://www.legislation.gov.uk/wsi/2012/3144/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..620e0f32b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate under the Wales Council Tax Reduction scheme. +values: + 2013-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Wales Council Tax Reduction withdrawal rate + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2012 + href: https://www.legislation.gov.uk/wsi/2012/3144/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..8e623029d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,10 @@ +description: Maximum Council Tax band ratio used to cap eligible liability for Class E claimants under the Warrington Council Tax Reduction scheme. +values: + 2025-04-01: 0.666666667 +metadata: + unit: /1 + period: year + label: Warrington Council Tax Reduction capped band ratio + reference: + - title: Warrington Borough Council Council Tax Reduction Scheme 2025/26 + href: https://www.warrington.gov.uk/sites/default/files/2025-04/CTS%20Scheme%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..cebd242ca --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,19 @@ +class_d: + band_a: + values: + 2025-04-01: 1 + other_bands: + values: + 2025-04-01: 0.915 +class_e: + values: + 2025-04-01: 1 +description: Maximum Council Tax Reduction support rates for working-age households under the Warrington Council Tax Reduction scheme. +metadata: + unit: /1 + period: year + label: Warrington Council Tax Reduction maximum support rates + propagate_metadata_to_children: true + reference: + - title: Warrington Borough Council Council Tax Reduction Scheme 2025/26 + href: https://www.warrington.gov.uk/sites/default/files/2025-04/CTS%20Scheme%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..e7392a9d7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit under the Warrington Council Tax Reduction means test. +values: + 2025-04-01: 16000 +metadata: + unit: currency-GBP + period: year + label: Warrington Council Tax Reduction capital limit + reference: + - title: Warrington Borough Council Council Tax Reduction Scheme 2025/26 + href: https://www.warrington.gov.uk/sites/default/files/2025-04/CTS%20Scheme%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..847e60561 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate under the Warrington Council Tax Reduction means test. +values: + 2025-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Warrington Council Tax Reduction withdrawal rate + reference: + - title: Warrington Borough Council Council Tax Reduction Scheme 2025/26 + href: https://www.warrington.gov.uk/sites/default/files/2025-04/CTS%20Scheme%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..7b170a34e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/warrington/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Warrington Council Tax Reduction scheme. +brackets: + - threshold: + 2025-04-01: 0 + amount: + 2025-04-01: 5 + - threshold: + 2025-04-01: 266 + amount: + 2025-04-01: 10.2 + - threshold: + 2025-04-01: 463 + amount: + 2025-04-01: 12.8 + - threshold: + 2025-04-01: 577 + amount: + 2025-04-01: 15.35 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Warrington Council Tax Reduction non-dependant deduction schedule + reference: + - title: Warrington Borough Council Council Tax Reduction Scheme 2025/26 + href: https://www.warrington.gov.uk/sites/default/files/2025-04/CTS%20Scheme%202025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/maximum_liability/cap_band_ratio.yaml b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/maximum_liability/cap_band_ratio.yaml new file mode 100644 index 000000000..d3ab4fd65 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/maximum_liability/cap_band_ratio.yaml @@ -0,0 +1,9 @@ +description: Maximum English council tax band ratio eligible for West Berkshire's non-vulnerable working-age Council Tax Reduction. Paragraph 29A caps the assessed liability at the council tax for a Band C property in the same parish. The Band C ratio in the English council-tax band schedule is 8/9 of Band D. +values: + 2026-04-01: 0.888888888888889 +metadata: + unit: /1 + label: West Berkshire non-vulnerable working-age Band C liability cap ratio + reference: + - title: West Berkshire Council Tax Reduction Scheme 1 April 2026 to 31 March 2027, paragraph 29A + href: https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..ac9a86fef --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability that a non-vulnerable working-age Class D or E applicant in West Berkshire can receive in Council Tax Reduction. Paragraph 29B reduces the prescribed 100 percent maximum to 70 percent for these claimants. +values: + 2026-04-01: 0.7 +metadata: + unit: /1 + period: year + label: West Berkshire non-vulnerable working-age maximum support rate + reference: + - title: West Berkshire Council Tax Reduction Scheme 1 April 2026 to 31 March 2027, paragraph 29B + href: https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..6290cd126 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Strict capital cutoff for non-vulnerable working-age Class D or E applicants in West Berkshire. Paragraph 29(1)A removes entitlement for the entire billing year where capital is equal to or greater than this amount. The default 16,000 pound capital limit (paragraph 23) still applies to Class E1 vulnerable applicants and to pensioners. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: West Berkshire non-vulnerable working-age capital cutoff + reference: + - title: West Berkshire Council Tax Reduction Scheme 1 April 2026 to 31 March 2027, paragraph 29(1)A + href: https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/minimum_weekly_award.yaml b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/minimum_weekly_award.yaml new file mode 100644 index 000000000..76bf18207 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/minimum_weekly_award.yaml @@ -0,0 +1,10 @@ +description: Weekly minimum Council Tax Reduction below which a non-vulnerable working-age applicant receives no award in West Berkshire. Paragraph 29C cancels Class D or E entitlements that would otherwise fall below this floor. The minimum does not apply to Class E1 vulnerable applicants or to pensioners. +values: + 2026-04-01: 10 +metadata: + unit: currency-GBP + period: week + label: West Berkshire non-vulnerable minimum weekly award + reference: + - title: West Berkshire Council Tax Reduction Scheme 1 April 2026 to 31 March 2027, paragraph 29C + href: https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/vulnerable_capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/vulnerable_capital_limit.yaml new file mode 100644 index 000000000..54287e592 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/vulnerable_capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital cutoff for Class E1 vulnerable working-age applicants and for pension-age applicants in West Berkshire. Paragraph 29D excepts the vulnerable category from the 6,000 pound paragraph 29(1)A cutoff, so the prescribed default 16,000 pound capital limit (paragraph 23) applies. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: West Berkshire vulnerable / pension-age capital cutoff + reference: + - title: West Berkshire Council Tax Reduction Scheme 1 April 2026 to 31 March 2027, paragraphs 23 and 29D + href: https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/vulnerable_withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/vulnerable_withdrawal_rate.yaml new file mode 100644 index 000000000..223f07aa8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/vulnerable_withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for Class E1 vulnerable working-age applicants under the West Berkshire Council Tax Reduction Scheme. Paragraph 17A sets amount B at 20 per cent of the difference between income and applicable amount for the protected vulnerable category. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: West Berkshire Class E1 vulnerable withdrawal rate + reference: + - title: West Berkshire Council Tax Reduction Scheme 1 April 2026 to 31 March 2027, paragraph 17A(f)(ii) + href: https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..621380672 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_berkshire/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for Class E non-vulnerable working-age applicants under the West Berkshire Council Tax Reduction Scheme. Paragraph 17 sets amount B at 30 per cent of the difference between income and applicable amount. +values: + 2026-04-01: 0.3 +metadata: + unit: /1 + period: year + label: West Berkshire non-vulnerable Class E withdrawal rate + reference: + - title: West Berkshire Council Tax Reduction Scheme 1 April 2026 to 31 March 2027, paragraph 17(2)(f)(ii) + href: https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/maximum_support_rate/full.yaml b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/maximum_support_rate/full.yaml new file mode 100644 index 000000000..06d779df3 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/maximum_support_rate/full.yaml @@ -0,0 +1,12 @@ +description: Maximum Council Tax Reduction rate for West Northamptonshire working-age applicants in the care-leaver or protected war-pension classes. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: West Northamptonshire full-support working-age CTR maximum rate + reference: + - title: West Northamptonshire Local Council Tax Reduction Scheme 2026/27 report, recommendations 3.1 and report background 5.3 + href: https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf + - title: West Northamptonshire Council CTR Scheme 2025/26, paragraphs 29(2A)-29(2B) + href: https://cms.westnorthants.gov.uk/media/2065/download diff --git a/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/maximum_support_rate/standard.yaml b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/maximum_support_rate/standard.yaml new file mode 100644 index 000000000..4fb47764f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/maximum_support_rate/standard.yaml @@ -0,0 +1,12 @@ +description: Maximum Council Tax Reduction rate for West Northamptonshire working-age applicants outside the full-support classes. +values: + 2026-04-01: 0.8 +metadata: + unit: /1 + period: year + label: West Northamptonshire standard working-age CTR maximum rate + reference: + - title: West Northamptonshire Local Council Tax Reduction Scheme 2026/27 report, recommendations 3.1 and report background 5.3 + href: https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf + - title: West Northamptonshire Council CTR Scheme 2025/26, paragraph 29(2) + href: https://cms.westnorthants.gov.uk/media/2065/download diff --git a/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..52c8165b8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,12 @@ +description: Capital limit under the West Northamptonshire Council Tax Reduction scheme. +values: + 2026-04-01: 16000 +metadata: + unit: currency-GBP + period: year + label: West Northamptonshire Council Tax Reduction capital limit + reference: + - title: West Northamptonshire Local Council Tax Reduction Scheme 2026/27 report, recommendations 3.1 and report background 5.3 + href: https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf + - title: West Northamptonshire Council CTR Scheme 2025/26, paragraphs 23 and 37(6) + href: https://cms.westnorthants.gov.uk/media/2065/download diff --git a/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..cc48b6bad --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,12 @@ +description: Weekly tariff income per capital block under the West Northamptonshire Council Tax Reduction scheme. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: West Northamptonshire Council Tax Reduction tariff income amount + reference: + - title: West Northamptonshire Local Council Tax Reduction Scheme 2026/27 report, recommendations 3.1 and report background 5.3 + href: https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf + - title: West Northamptonshire Council CTR Scheme 2025/26, paragraph 72 + href: https://cms.westnorthants.gov.uk/media/2065/download diff --git a/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..b24f9049d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,12 @@ +description: Capital block size for tariff income under the West Northamptonshire Council Tax Reduction scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: West Northamptonshire Council Tax Reduction tariff income block size + reference: + - title: West Northamptonshire Local Council Tax Reduction Scheme 2026/27 report, recommendations 3.1 and report background 5.3 + href: https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf + - title: West Northamptonshire Council CTR Scheme 2025/26, paragraph 72 + href: https://cms.westnorthants.gov.uk/media/2065/download diff --git a/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..88afb90ab --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,12 @@ +description: Capital threshold above which tariff income starts under the West Northamptonshire Council Tax Reduction scheme. +values: + 2026-04-01: 6000 +metadata: + unit: currency-GBP + period: year + label: West Northamptonshire Council Tax Reduction tariff income threshold + reference: + - title: West Northamptonshire Local Council Tax Reduction Scheme 2026/27 report, recommendations 3.1 and report background 5.3 + href: https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf + - title: West Northamptonshire Council CTR Scheme 2025/26, paragraph 72 + href: https://cms.westnorthants.gov.uk/media/2065/download diff --git a/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..62acb5c68 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,12 @@ +description: Withdrawal rate on excess income under the West Northamptonshire Council Tax Reduction scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: West Northamptonshire Council Tax Reduction withdrawal rate + reference: + - title: West Northamptonshire Local Council Tax Reduction Scheme 2026/27 report, recommendations 3.1 and report background 5.3 + href: https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf + - title: West Northamptonshire Council CTR Scheme 2025/26, legacy means-test rules + href: https://cms.westnorthants.gov.uk/media/2065/download diff --git a/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..67046f58e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,31 @@ +description: Weekly non-dependant deduction schedule under the West Northamptonshire Council Tax Reduction scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: West Northamptonshire Council Tax Reduction non-dependant deduction amount + reference: + - title: West Northamptonshire Local Council Tax Reduction Scheme 2026/27 report, recommendations 3.1 and report background 5.3 + href: https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf + - title: West Northamptonshire Council CTR Scheme 2025/26, paragraph 30 + href: https://cms.westnorthants.gov.uk/media/2065/download + - title: Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2026, regulation 5(3) + href: https://www.legislation.gov.uk/uksi/2026/27/contents/made diff --git a/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..d9f1d5809 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_northamptonshire/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,12 @@ +description: Weekly hours threshold for remunerative work under the West Northamptonshire Council Tax Reduction scheme. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: West Northamptonshire Council Tax Reduction remunerative work hours threshold + reference: + - title: West Northamptonshire Local Council Tax Reduction Scheme 2026/27 report, recommendations 3.1 and report background 5.3 + href: https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf + - title: West Northamptonshire Council CTR Scheme 2025/26, paragraphs 30 and 84 + href: https://cms.westnorthants.gov.uk/media/2065/download diff --git a/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..36db79efc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of eligible Council Tax liability covered under the West Suffolk Council Tax Reduction scheme. +values: + 2025-04-01: 1 + 2026-04-01: 0.915 +metadata: + unit: /1 + period: year + label: West Suffolk Council Tax Reduction maximum support rate + reference: + - title: West Suffolk Council Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/West-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..b5790aa14 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,13 @@ +description: Capital limit for working-age households under the West Suffolk Council Tax Reduction scheme. +values: + 2025-04-01: 10_000 + 2026-04-01: 10_000 +metadata: + unit: currency-GBP + period: year + label: West Suffolk Council Tax Reduction capital limit + reference: + - title: West Suffolk Council Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/West-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf + - title: Anglia Revenues Partnership Apply for Council Tax Reduction and or Housing Benefit + href: https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ diff --git a/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..a7dd75f5e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate for working-age households under the West Suffolk Council Tax Reduction scheme. +values: + 2025-04-01: 0.2 + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: West Suffolk Council Tax Reduction withdrawal rate + reference: + - title: West Suffolk Council Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/West-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..a6b0652b0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/west_suffolk/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,13 @@ +description: Weekly non-dependant deduction under the West Suffolk Council Tax Reduction scheme for working-age households. +values: + 2025-04-01: 8.03 + 2026-04-01: 8.34 +metadata: + unit: currency-GBP + period: week + label: West Suffolk Council Tax Reduction working-age non-dependant deduction amount + reference: + - title: West Suffolk Council Council Tax Reduction Scheme 2025/26 + href: https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/West-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf + - title: Anglia Revenues Partnership Council Tax Reduction non-dependant deductions + href: https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm diff --git a/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..6024c8b6d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,11 @@ +description: Maximum share of eligible Council Tax liability covered for working-age households under the Westminster Council Tax Support scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Westminster Council Tax Support maximum support rate + reference: + - title: Council Tax Support scheme for 2026/27 + href: https://www.westminster.gov.uk/sites/default/files/media/documents/council-tax-support-scheme-for-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..b033ab5de --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,11 @@ +description: Capital limit for working-age households under the Westminster Council Tax Support scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Westminster Council Tax Support capital limit + reference: + - title: Income and savings + href: https://www.westminster.gov.uk/benefits/guide-housing-benefit-and-council-tax-support/income-and-savings + diff --git a/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/tariff_income_step.yaml b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/tariff_income_step.yaml new file mode 100644 index 000000000..2ab301fa2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/tariff_income_step.yaml @@ -0,0 +1,11 @@ +description: Capital step above which one pound of weekly tariff income is added for working-age non-Universal Credit claimants under the Westminster Council Tax Support scheme. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: week + label: Westminster Council Tax Support tariff income step + reference: + - title: Income and savings + href: https://www.westminster.gov.uk/benefits/guide-housing-benefit-and-council-tax-support/income-and-savings + diff --git a/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/tariff_income_threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/tariff_income_threshold.yaml new file mode 100644 index 000000000..f819c3526 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/tariff_income_threshold.yaml @@ -0,0 +1,11 @@ +description: Capital threshold above which tariff income is added for working-age non-Universal Credit claimants under the Westminster Council Tax Support scheme. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Westminster Council Tax Support tariff income threshold + reference: + - title: Income and savings + href: https://www.westminster.gov.uk/benefits/guide-housing-benefit-and-council-tax-support/income-and-savings + diff --git a/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..503deb9aa --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,11 @@ +description: Withdrawal rate for working-age households under the Westminster Council Tax Support scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Westminster Council Tax Support withdrawal rate + reference: + - title: Council Tax Support scheme for 2026/27 + href: https://www.westminster.gov.uk/sites/default/files/media/documents/council-tax-support-scheme-for-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..01d59ea0a --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,28 @@ +description: Weekly working-age non-dependant deduction schedule under the Westminster Council Tax Support scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Westminster Council Tax Support non-dependant deduction schedule + reference: + - title: Council Tax Support scheme for 2026/27 + href: https://www.westminster.gov.uk/sites/default/files/media/documents/council-tax-support-scheme-for-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..924ef75af --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,11 @@ +description: Weekly hours threshold for remunerative work in the Westminster Council Tax Support non-dependant deduction schedule. +values: + 2026-04-01: 16 +metadata: + unit: hour + period: week + label: Westminster Council Tax Support remunerative work hours + reference: + - title: Council Tax Support scheme for 2026/27 + href: https://www.westminster.gov.uk/sites/default/files/media/documents/council-tax-support-scheme-for-2026-27.pdf + diff --git a/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..041ace5de --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered by Westmorland and Furness working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Westmorland and Furness working-age Council Tax Reduction maximum support rate + reference: + - title: Westmorland and Furness Council Tax Reduction Scheme 2026/27, section 29.2 + href: https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..71cbb83bf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for Westmorland and Furness working-age Council Tax Reduction. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Westmorland and Furness working-age Council Tax Reduction capital limit + reference: + - title: Westmorland and Furness Council Tax Reduction Scheme 2026/27, section 23.1 + href: https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/tariff_income/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/tariff_income/amount.yaml new file mode 100644 index 000000000..c7f5f88b4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/tariff_income/amount.yaml @@ -0,0 +1,10 @@ +description: Weekly assumed income per capital step for Westmorland and Furness working-age Council Tax Reduction. +values: + 2026-04-01: 1 +metadata: + unit: currency-GBP + period: week + label: Westmorland and Furness Council Tax Reduction tariff income per step + reference: + - title: Westmorland and Furness Council Tax Reduction Scheme 2026/27, section 72 + href: https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/tariff_income/step.yaml b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/tariff_income/step.yaml new file mode 100644 index 000000000..2b29b387c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/tariff_income/step.yaml @@ -0,0 +1,10 @@ +description: Capital step for Westmorland and Furness working-age Council Tax Reduction tariff income. +values: + 2026-04-01: 250 +metadata: + unit: currency-GBP + period: year + label: Westmorland and Furness Council Tax Reduction tariff income capital step + reference: + - title: Westmorland and Furness Council Tax Reduction Scheme 2026/27, section 72 + href: https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/tariff_income/threshold.yaml b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/tariff_income/threshold.yaml new file mode 100644 index 000000000..8c9ee5438 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/tariff_income/threshold.yaml @@ -0,0 +1,10 @@ +description: Capital threshold above which Westmorland and Furness assumes tariff income for working-age Council Tax Reduction. +values: + 2026-04-01: 6_000 +metadata: + unit: currency-GBP + period: year + label: Westmorland and Furness Council Tax Reduction tariff income threshold + reference: + - title: Westmorland and Furness Council Tax Reduction Scheme 2026/27, section 72 + href: https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..74e0d3a14 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate on excess income for Westmorland and Furness working-age Council Tax Reduction. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Westmorland and Furness Council Tax Reduction excess-income withdrawal rate + reference: + - title: Westmorland and Furness Council Tax Reduction Scheme 2026/27, sections 17.f and 32.3 + href: https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..fd81aff18 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction by gross weekly income for Westmorland and Furness working-age Council Tax Reduction. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.20 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.60 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.30 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Westmorland and Furness Council Tax Reduction non-dependant deduction amount + reference: + - title: Westmorland and Furness Council Tax Reduction Scheme 2026/27, sections 30.1 and 30.2 + href: https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml new file mode 100644 index 000000000..02efc8be4 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westmorland_and_furness/council_tax_reduction/non_dep_deduction/remunerative_work_hours.yaml @@ -0,0 +1,9 @@ +description: Weekly hours threshold for remunerative work in Westmorland and Furness working-age Council Tax Reduction non-dependant deductions. +values: + 2026-04-01: 16 +metadata: + unit: hours + label: Westmorland and Furness Council Tax Reduction non-dependant remunerative-work hours + reference: + - title: Westmorland and Furness Council Tax Reduction Scheme 2026/27, interpretation of remunerative work + href: https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/maximum_support_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/maximum_support_rate.yaml new file mode 100644 index 000000000..5d714ff70 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/maximum_support_rate.yaml @@ -0,0 +1,10 @@ +description: Maximum share of eligible Council Tax liability covered under the Worthing Council Tax Support scheme. +values: + 2026-04-01: 1 +metadata: + unit: /1 + period: year + label: Worthing Council Tax Support maximum support rate + reference: + - title: Worthing Council Tax Support 2026-27 + href: https://www.adur-worthing.gov.uk/media/Media,174008,smxx.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/means_test/capital_limit.yaml b/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/means_test/capital_limit.yaml new file mode 100644 index 000000000..e39f2ae64 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/means_test/capital_limit.yaml @@ -0,0 +1,10 @@ +description: Capital limit for working-age households under the Worthing Council Tax Support scheme. +values: + 2026-04-01: 16_000 +metadata: + unit: currency-GBP + period: year + label: Worthing Council Tax Support capital limit + reference: + - title: Worthing Council Tax Support 2026-27 + href: https://www.adur-worthing.gov.uk/media/Media,174008,smxx.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/means_test/withdrawal_rate.yaml b/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/means_test/withdrawal_rate.yaml new file mode 100644 index 000000000..aa890073f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/means_test/withdrawal_rate.yaml @@ -0,0 +1,10 @@ +description: Withdrawal rate for working-age households under the Worthing Council Tax Support scheme. +values: + 2026-04-01: 0.2 +metadata: + unit: /1 + period: year + label: Worthing Council Tax Support withdrawal rate + reference: + - title: Worthing Council Tax Support 2026-27 + href: https://www.adur-worthing.gov.uk/media/Media,174008,smxx.pdf diff --git a/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/non_dep_deduction/amount.yaml b/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/non_dep_deduction/amount.yaml new file mode 100644 index 000000000..8a087b62e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/worthing/council_tax_reduction/non_dep_deduction/amount.yaml @@ -0,0 +1,27 @@ +description: Weekly non-dependant deduction schedule under the Worthing Council Tax Support scheme. +brackets: + - threshold: + 2026-04-01: 0 + amount: + 2026-04-01: 5.2 + - threshold: + 2026-04-01: 279 + amount: + 2026-04-01: 10.6 + - threshold: + 2026-04-01: 485 + amount: + 2026-04-01: 13.3 + - threshold: + 2026-04-01: 605 + amount: + 2026-04-01: 15.95 +metadata: + amount_unit: currency-GBP + period: week + threshold_unit: currency-GBP + type: single_amount + label: Worthing Council Tax Support non-dependant deduction schedule + reference: + - title: Worthing Council Tax Support 2026-27 + href: https://www.adur-worthing.gov.uk/media/Media,174008,smxx.pdf diff --git a/policyengine_uk/programs.yaml b/policyengine_uk/programs.yaml index 77e67d24a..23653d08b 100644 --- a/policyengine_uk/programs.yaml +++ b/policyengine_uk/programs.yaml @@ -444,6 +444,17 @@ programs: variable: council_tax verified_start_year: 2022 + - id: council_tax_reduction + name: Council Tax Reduction + full_name: Council Tax Reduction + category: Benefits + agency: Local + status: partial + coverage: UK + variable: council_tax_reduction + verified_years: "2025-2025" + notes: Wales, Scotland, and English pension-age households use national or default-style rules; working-age England currently has explicit overrides for Stroud and Dudley, with unsupported authorities falling back to reported baseline data. + # --- Treasury programs --- - id: cost_of_living_support name: Cost of Living Support diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml new file mode 100644 index 000000000..b512c2212 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml @@ -0,0 +1,35348 @@ +- name: Stroud working-age claimant keeps full support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: STROUD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Stroud entitledto spot check returns full support on the billed liability + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: STROUD + council_tax_band: D + council_tax: 1866.47 + savings: 0 + output: + council_tax_reduction: 1866.47 + council_tax_less_benefit: 0 + +- name: Stroud claimant on income-based JSA keeps full support on the billed liability + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + jsa_income_reported: 4_786.6 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: STROUD + council_tax_band: D + council_tax: 1777.08 + savings: 0 + output: + council_tax_reduction: 1777.08 + council_tax_less_benefit: 0 + +- name: Stroud lone parent on income-based JSA keeps full support on the billed liability + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + jsa_income_reported: 4_786.6 + council_tax_benefit_reported: 1 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: STROUD + council_tax_band: D + council_tax: 1777.08 + savings: 0 + output: + council_tax_reduction: 1777.08 + council_tax_less_benefit: 0 + +- name: Dudley working-age claimant faces 60 percent minimum payment and band C cap + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DUDLEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_maximum_eligible_liability: 1600 + council_tax_reduction: 640 + council_tax_less_benefit: 1160 + +- name: Dudley charges a flat weekly non-dependant deduction + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DUDLEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 380 + +- name: Dudley band C maximum award follows the published 2025-26 minimum payment + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DUDLEY + council_tax_band: C + council_tax: 1359.05 + savings: 0 + output: + council_tax_reduction: 543.62 + council_tax_less_benefit: 815.43 + +- name: Dudley single claimant on income-based JSA keeps the full published 40 percent maximum award + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + jsa_income_reported: 4_786.6 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DUDLEY + council_tax_band: C + council_tax: 1359.05 + savings: 0 + output: + council_tax_reduction: 543.62 + council_tax_less_benefit: 815.43 + +- name: Dudley waives the flat non-dependant deduction for PIP daily living claimants + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl_category: STANDARD + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DUDLEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 640 + +- name: East Hertfordshire working-age claimant pays the 8.5 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EAST_HERTFORDSHIRE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: East Hertfordshire lone parent on income-based JSA keeps the full class D award + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + jsa_income_reported: 1 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: EAST_HERTFORDSHIRE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: Stevenage working-age claimant pays the 8.5 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: STEVENAGE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: Stevenage applies its local non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: STEVENAGE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1116.6 + council_tax_less_benefit: 683.4 + +- name: Chesterfield working-age claimant pays the 8.5 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESTERFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: Chesterfield applies its local non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHESTERFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1225.8 + council_tax_less_benefit: 574.2 + +- name: East Hertfordshire applies its local non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: EAST_HERTFORDSHIRE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1116.6 + council_tax_less_benefit: 683.4 + +- name: East Suffolk working-age claimant pays the 8.5 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EAST_SUFFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: East Suffolk working-age claimant is excluded above the 10k capital limit + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EAST_SUFFOLK + council_tax_band: D + council_tax: 1800 + savings: 10_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: East Suffolk applies its flat working-age non-dependant deduction in 2025 + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: EAST_SUFFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1229.44 + council_tax_less_benefit: 570.56 + +- name: East Suffolk applies its flat working-age non-dependant deduction in 2026 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: EAST_SUFFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1213.32 + council_tax_less_benefit: 586.68 + +- name: East Cambridgeshire working-age claimant pays the 8.5 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EAST_CAMBRIDGESHIRE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: East Cambridgeshire applies its flat working-age non-dependant deduction + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: EAST_CAMBRIDGESHIRE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1229.44 + council_tax_less_benefit: 570.56 + +- name: Breckland working-age claimant pays the 8.5 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRECKLAND + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: Breckland applies its flat working-age non-dependant deduction + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BRECKLAND + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1229.44 + council_tax_less_benefit: 570.56 + +- name: Fenland working-age claimant can receive full support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FENLAND + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Fenland applies its flat working-age non-dependant deduction + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: FENLAND + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1382.44 + council_tax_less_benefit: 417.56 + +- name: Broadland working-age claimant pays the 13 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BROADLAND + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1566 + council_tax_less_benefit: 234 + +- name: Broadland applies its flat working-age non-dependant deduction + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BROADLAND + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1202 + council_tax_less_benefit: 598 + +- name: South Norfolk working-age claimant pays the 13 percent minimum contribution in 2026 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_NORFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1566 + council_tax_less_benefit: 234 + +- name: South Norfolk applies its flat working-age non-dependant deduction + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOUTH_NORFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1202 + council_tax_less_benefit: 598 + +- name: Lancaster working-age claimant can receive full support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LANCASTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Lancaster applies its earnings-bracket non-dependant deduction + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: LANCASTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1269.6 + council_tax_less_benefit: 530.4 + +- name: Lancaster exempts under-25 UC non-dependants with no earned income + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 24 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 24 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: LANCASTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Lancaster applies one non-dependant deduction for a non-dependant couple + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_400 + non_dep_partner: + age: 25 + employment_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: LANCASTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + lancaster_council_tax_reduction_non_dep_deductions: [530.4, 0] + council_tax_reduction: 1269.6 + council_tax_less_benefit: 530.4 + +- name: Oldham caps working-age eligible liability at Band A and applies a 15 percent contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: OLDHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + oldham_council_tax_reduction_maximum_eligible_liability: 1200 + council_tax_reduction: 1020 + council_tax_less_benefit: 780 + +- name: Oldham applies its earnings-bracket non-dependant deduction after the Band A cap + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: OLDHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 489.6 + council_tax_less_benefit: 1310.4 + +- name: Oldham exempts UC non-dependants with no earned income + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: OLDHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1020 + council_tax_less_benefit: 780 + +- name: Bolton working-age claimant pays the 17.5 percent minimum contribution + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BOLTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1485 + council_tax_less_benefit: 315 + +- name: Bolton applies its 2026 earnings-bracket non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BOLTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 793.4 + council_tax_less_benefit: 1006.6 + +- name: Bolton exempts under-25 UC non-dependants with no earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 24 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 24 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BOLTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1485 + council_tax_less_benefit: 315 + +- name: Basingstoke and Deane working-age claimant can receive full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASINGSTOKE_AND_DEANE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Basingstoke and Deane applies its 2026 earnings-bracket non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BASINGSTOKE_AND_DEANE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1108.4 + council_tax_less_benefit: 691.6 + +- name: Crawley working-age claimant can receive full support below the capital limit + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CRAWLEY + council_tax_band: D + council_tax: 1800 + savings: 8_999 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Crawley denies working-age support above its 9,000 pound capital limit + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CRAWLEY + council_tax_band: D + council_tax: 1800 + savings: 9_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Crawley applies its local non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CRAWLEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 760 + council_tax_less_benefit: 1040 + +- name: St Albans non-UC working-age claimant can receive full support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_ALBANS + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: St Albans UC claimant uses the 2025 monthly earnings contribution table + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 12_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_ALBANS + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 660 + council_tax_less_benefit: 1140 + +- name: St Albans counts both members of a UC non-dependant couple + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 13_000 + non_dep_partner: + age: 25 + employment_income: 13_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: ST_ALBANS + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + st_albans_council_tax_reduction_non_dep_deductions: [1331.2, 0] + council_tax_reduction: 468.8 + council_tax_less_benefit: 1331.2 + +- name: Adur working-age claimant can receive full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ADUR + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Adur applies its 2026 earnings-bracket non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: ADUR + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1108.4 + council_tax_less_benefit: 691.6 + +- name: Adur counts both members of a UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 13_000 + non_dep_partner: + age: 25 + employment_income: 13_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: ADUR + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + adur_council_tax_reduction_non_dep_deductions: [1383.2, 0] + council_tax_reduction: 416.8 + council_tax_less_benefit: 1383.2 + +- name: Worthing working-age claimant can receive full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WORTHING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Worthing applies its 2026 earnings-bracket non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WORTHING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1108.4 + council_tax_less_benefit: 691.6 + +- name: Worthing counts both members of a UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 13_000 + non_dep_partner: + age: 25 + employment_income: 13_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: WORTHING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + worthing_council_tax_reduction_non_dep_deductions: [1383.2, 0] + council_tax_reduction: 416.8 + council_tax_less_benefit: 1383.2 + +- name: Sefton working-age claimant receives 84 percent maximum support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SEFTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1512 + council_tax_less_benefit: 288 + +- name: Sefton excludes working-age claimants above the 6,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SEFTON + council_tax_band: D + council_tax: 1800 + savings: 6_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Sefton applies its working-age non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_400 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SEFTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + sefton_council_tax_reduction_non_dep_deductions: [260, 0] + council_tax_reduction: 1252 + council_tax_less_benefit: 548 + +- name: Sefton bands non-dependant deductions on gross weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 5_200 + hours_worked: 832 + private_pension_income: 5_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SEFTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + sefton_council_tax_reduction_non_dep_deductions: [260, 0] + council_tax_reduction: 1252 + council_tax_less_benefit: 548 + +- name: Sefton requires remunerative work for the high non-dependant band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 52 + private_pension_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SEFTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + sefton_council_tax_reduction_non_dep_deductions: [104, 0] + council_tax_reduction: 1408 + council_tax_less_benefit: 392 + +- name: Sefton counts both members of a UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 5_200 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 5_200 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: SEFTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + sefton_council_tax_reduction_non_dep_deductions: [520, 0] + council_tax_reduction: 992 + council_tax_less_benefit: 808 + +- name: Oxford working-age claimant receives full support in the lowest income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: OXFORD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Oxford excludes working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: OXFORD + council_tax_band: D + council_tax: 1800 + savings: 16_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Oxford applies its weekly income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 26_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: OXFORD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1350 + council_tax_less_benefit: 450 + +- name: Oxford adds working-age tariff income from capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 24_500 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: OXFORD + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + oxford_council_tax_reduction: 1350 + simulated_council_tax_reduction_benunit: 1350 + council_tax_reduction: 1350 + council_tax_less_benefit: 450 + +- name: Oxford does not add separate tariff income where Universal Credit has assessed capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + universal_credit_reported: 24_500 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 24_500 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 24_500 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: OXFORD + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Oxford applies its working-age non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_460 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: OXFORD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + oxford_council_tax_reduction_non_dep_deductions: [829.4, 0] + council_tax_reduction: 970.6 + council_tax_less_benefit: 829.4 + +- name: Oxford bands a non-dependant couple on combined gross earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_730 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_730 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: OXFORD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + oxford_council_tax_reduction_non_dep_deductions: [829.4, 0] + council_tax_reduction: 970.6 + council_tax_less_benefit: 829.4 + +- name: Kingston upon Thames working-age claimant receives full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Kingston upon Thames excludes working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + council_tax_band: D + council_tax: 1800 + savings: 16_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Kingston upon Thames applies its working-age non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_460 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + kingston_upon_thames_council_tax_reduction_non_dep_deductions: [900.12, 0] + council_tax_reduction: 899.88 + council_tax_less_benefit: 900.12 + +- name: Kingston upon Thames adds non-UC tariff income from capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + kingston_upon_thames_council_tax_reduction: 1675.2 + simulated_council_tax_reduction_benunit: 1675.2 + council_tax_reduction: 1675.2 + council_tax_less_benefit: 124.8 + +- name: Kingston upon Thames uses UC maximum amount as the UC applicable amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 12_000 + uc_maximum_amount: 12_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 12_000 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + uc_maximum_amount: 12_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 12_000 + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Kingston upon Thames does not use UC rules where simulated UC is zero + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 0 + uc_maximum_amount: 12_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + kingston_upon_thames_council_tax_reduction: 1675.2 + simulated_council_tax_reduction_benunit: 1675.2 + council_tax_reduction: 1675.2 + council_tax_less_benefit: 124.8 + +- name: Kingston upon Thames counts both members of a UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_730 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_730 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + kingston_upon_thames_council_tax_reduction_non_dep_deductions: [1800.24, 0] + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Newham working-age claimant receives 70 percent maximum support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NEWHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1260 + council_tax_less_benefit: 540 + +- name: Newham excludes working-age claimants above the 6,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NEWHAM + council_tax_band: D + council_tax: 1800 + savings: 6_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Newham applies its working-age non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 5_200 + private_pension_income: 11_232 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NEWHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + newham_council_tax_reduction_non_dep_deductions: [979.68, 0] + council_tax_reduction: 280.32 + council_tax_less_benefit: 1519.68 + +- name: Newham uses a 25 percent excess-income taper + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 11_000 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NEWHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 11_000 + council_tax_reduction: 1010 + council_tax_less_benefit: 790 + +- name: Newham uses the not-in-remunerative-work non-dependant deduction below 16 weekly hours + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_460 + hours_worked: 780 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NEWHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + newham_council_tax_reduction_non_dep_deductions: [392.08, 0] + council_tax_reduction: 867.92 + council_tax_less_benefit: 932.08 + +- name: Westminster working-age claimant receives full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMINSTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Westminster excludes working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMINSTER + council_tax_band: D + council_tax: 1800 + savings: 16_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Westminster applies its working-age non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 5_200 + private_pension_income: 26_260 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WESTMINSTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + westminster_council_tax_reduction_non_dep_deductions: [829.4, 0] + council_tax_reduction: 970.6 + council_tax_less_benefit: 829.4 + +- name: Westminster adds non-UC tariff income from capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMINSTER + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + westminster_council_tax_reduction: 1675.2 + simulated_council_tax_reduction_benunit: 1675.2 + council_tax_reduction: 1675.2 + council_tax_less_benefit: 124.8 + +- name: Westminster uses UC maximum amount as the UC applicable amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 12_000 + uc_maximum_amount: 12_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 12_000 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMINSTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + uc_maximum_amount: 12_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 12_000 + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Westminster does not use UC rules where simulated UC is zero + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 0 + uc_maximum_amount: 12_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMINSTER + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + westminster_council_tax_reduction: 1675.2 + simulated_council_tax_reduction_benunit: 1675.2 + council_tax_reduction: 1675.2 + council_tax_less_benefit: 124.8 + +- name: Westminster exempts Universal Credit non-dependants with no earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + universal_credit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WESTMINSTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + westminster_council_tax_reduction_non_dep_deductions: [0, 0] + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Westminster exempts full-time student non-dependants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + current_education: TERTIARY + employment_income: 31_460 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WESTMINSTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + westminster_council_tax_reduction_non_dep_deductions: [0, 0] + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Greenwich working-age claimant receives 80 percent maximum support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GREENWICH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1440 + council_tax_less_benefit: 360 + +- name: Greenwich excludes working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GREENWICH + council_tax_band: D + council_tax: 1800 + savings: 16_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Greenwich applies its flat working-age non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: GREENWICH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + greenwich_council_tax_reduction_non_dep_deductions: [520, 0] + council_tax_reduction: 920 + council_tax_less_benefit: 880 + +- name: Greenwich adds non-UC tariff income from capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GREENWICH + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + greenwich_council_tax_reduction: 1284 + simulated_council_tax_reduction_benunit: 1284 + council_tax_reduction: 1284 + council_tax_less_benefit: 516 + +- name: Greenwich exempts full-time student non-dependants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + current_education: TERTIARY + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: GREENWICH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + greenwich_council_tax_reduction_non_dep_deductions: [0, 0] + council_tax_reduction: 1440 + council_tax_less_benefit: 360 + +- name: Hackney working-age claimant receives 90 percent maximum support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HACKNEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1620 + council_tax_less_benefit: 180 + +- name: Hackney excludes working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HACKNEY + council_tax_band: D + council_tax: 1800 + savings: 16_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Hackney adds non-UC tariff income from capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HACKNEY + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + hackney_council_tax_reduction: 1495.2 + simulated_council_tax_reduction_benunit: 1495.2 + council_tax_reduction: 1495.2 + council_tax_less_benefit: 304.8 + +- name: Hackney applies its working-age non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_460 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HACKNEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hackney_council_tax_reduction_non_dep_deductions: [829.4, 0] + council_tax_reduction: 790.6 + council_tax_less_benefit: 1009.4 + +- name: Hackney exempts Universal Credit non-dependants with no earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + universal_credit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HACKNEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hackney_council_tax_reduction_non_dep_deductions: [0, 0] + council_tax_reduction: 1620 + council_tax_less_benefit: 180 + +- name: Hammersmith and Fulham working-age claimant receives full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAMMERSMITH_AND_FULHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Hammersmith and Fulham excludes working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAMMERSMITH_AND_FULHAM + council_tax_band: D + council_tax: 1800 + savings: 16_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Hammersmith and Fulham adds non-UC tariff income from capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAMMERSMITH_AND_FULHAM + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + hammersmith_and_fulham_council_tax_reduction: 1675.2 + simulated_council_tax_reduction_benunit: 1675.2 + council_tax_reduction: 1675.2 + council_tax_less_benefit: 124.8 + +- name: Hammersmith and Fulham uses UC maximum amount as the UC applicable amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 12_000 + uc_maximum_amount: 12_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 12_000 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAMMERSMITH_AND_FULHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + uc_maximum_amount: 12_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 12_000 + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Hammersmith and Fulham does not use UC rules where simulated UC is zero + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 0 + uc_maximum_amount: 12_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAMMERSMITH_AND_FULHAM + council_tax_band: D + council_tax: 1800 + savings: 9_000 + output: + hammersmith_and_fulham_council_tax_reduction: 1675.2 + simulated_council_tax_reduction_benunit: 1675.2 + council_tax_reduction: 1675.2 + council_tax_less_benefit: 124.8 + +- name: Hammersmith and Fulham applies its working-age non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 5_200 + private_pension_income: 26_260 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HAMMERSMITH_AND_FULHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hammersmith_and_fulham_council_tax_reduction_non_dep_deductions: [829.4, 0] + council_tax_reduction: 970.6 + council_tax_less_benefit: 829.4 + +- name: Stockport caps a single claimant's eligible liability at Band A + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: STOCKPORT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + stockport_council_tax_reduction: 1200 + simulated_council_tax_reduction_benunit: 1200 + council_tax_reduction: 1200 + council_tax_less_benefit: 600 + +- name: Stockport caps a three-bedroom household's eligible liability at Band B + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child_1: + age: 12 + is_male: true + child_2: + age: 12 + is_male: false + benunits: + benunit: + members: [claimant, child_1, child_2] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child_1, child_2] + country: ENGLAND + local_authority: STOCKPORT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + stockport_council_tax_reduction_maximum_eligible_liability: 1400 + stockport_council_tax_reduction: 1400 + council_tax_reduction: 1400 + council_tax_less_benefit: 400 + +- name: Stockport does not cap households with Disabled Persons Relief + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: STOCKPORT + council_tax_band: D + council_tax: 1800 + stockport_council_tax_reduction_disabled_persons_relief: true + savings: 0 + output: + stockport_council_tax_reduction_maximum_eligible_liability: 1800 + stockport_council_tax_reduction: 1800 + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Stockport excludes working-age claimants above the 8,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: STOCKPORT + council_tax_band: D + council_tax: 1800 + savings: 8_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Stockport adds non-UC tariff income from capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + council_tax_reduction_relevant_income_based_benefit: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: STOCKPORT + council_tax_band: D + council_tax: 1800 + savings: 7_000 + output: + stockport_council_tax_reduction: 1158.4 + simulated_council_tax_reduction_benunit: 1158.4 + council_tax_reduction: 1158.4 + council_tax_less_benefit: 641.6 + +- name: Stockport applies its higher gross-income non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: STOCKPORT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + stockport_council_tax_reduction_non_dep_deductions: [520, 0] + council_tax_reduction: 680 + council_tax_less_benefit: 1120 + +- name: Wakefield working-age claimant with only DWP income receives 70 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 5_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WAKEFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + wakefield_council_tax_reduction: 1260 + simulated_council_tax_reduction_benunit: 1260 + council_tax_reduction: 1260 + council_tax_less_benefit: 540 + +- name: Wakefield applies its non-DWP weekly income bands to net earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 11_960 + income_tax: 1_560 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WAKEFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + wakefield_council_tax_reduction: 720 + simulated_council_tax_reduction_benunit: 720 + council_tax_reduction: 720 + council_tax_less_benefit: 1080 + +- name: Wakefield includes other non-DWP income in its income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WAKEFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + wakefield_council_tax_reduction: 720 + simulated_council_tax_reduction_benunit: 720 + council_tax_reduction: 720 + council_tax_less_benefit: 1080 + +- name: Wakefield excludes working-age claimants above the 6,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WAKEFIELD + council_tax_band: D + council_tax: 1800 + savings: 6_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Wakefield applies its flat working-age non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WAKEFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + wakefield_council_tax_reduction_non_dep_deductions: [390, 0] + council_tax_reduction: 870 + council_tax_less_benefit: 930 + +- name: Tameside working-age single claimant receives 75 percent of Band A-capped liability + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TAMESIDE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + tameside_council_tax_reduction_maximum_eligible_liability: 1200 + tameside_council_tax_reduction: 900 + simulated_council_tax_reduction_benunit: 900 + council_tax_reduction: 900 + council_tax_less_benefit: 900 + +- name: Tameside applies single-person weekly net-income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 7_800 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TAMESIDE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + tameside_council_tax_reduction: 600 + simulated_council_tax_reduction_benunit: 600 + council_tax_reduction: 600 + council_tax_less_benefit: 1200 + +- name: Tameside applies family weekly net-income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 22_360 + partner: + age: 35 + child_1: + age: 10 + child_2: + age: 8 + benunits: + benunit: + members: [claimant, partner, child_1, child_2] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner, child_1, child_2] + country: ENGLAND + local_authority: TAMESIDE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + tameside_council_tax_reduction: 300 + simulated_council_tax_reduction_benunit: 300 + council_tax_reduction: 300 + council_tax_less_benefit: 1500 + +- name: Tameside excludes working-age claimants with 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TAMESIDE + council_tax_band: D + council_tax: 1800 + savings: 6_000 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Tameside passported benefit claimants are awarded at Band 1 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 20_800 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TAMESIDE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + tameside_council_tax_reduction: 900 + simulated_council_tax_reduction_benunit: 900 + council_tax_reduction: 900 + council_tax_less_benefit: 900 + +- name: Bury working-age claimant receives 80 percent of Band B-capped liability + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BURY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + bury_council_tax_reduction_maximum_eligible_liability: 1400 + bury_council_tax_reduction: 1120 + simulated_council_tax_reduction_benunit: 1120 + council_tax_reduction: 1120 + council_tax_less_benefit: 680 + +- name: Bury applies single-person monthly net-earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 7_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BURY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + bury_council_tax_reduction: 280 + simulated_council_tax_reduction_benunit: 280 + council_tax_reduction: 280 + council_tax_less_benefit: 1520 + +- name: Bury uses Universal Credit assessed earnings for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 12_000 + pension_contributions: 6_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BURY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + bury_council_tax_reduction: 560 + simulated_council_tax_reduction_benunit: 560 + council_tax_reduction: 560 + council_tax_less_benefit: 1240 + +- name: Bury excludes working-age claimants above the 8,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BURY + council_tax_band: D + council_tax: 1800 + savings: 8_001 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Bury ignores non-earnings income for working-age income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 20_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BURY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + bury_council_tax_reduction: 1120 + simulated_council_tax_reduction_benunit: 1120 + council_tax_reduction: 1120 + council_tax_less_benefit: 680 + +- name: Bury protects disability benefit claimants from the Band B cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BURY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + bury_council_tax_reduction_protected_group: true + bury_council_tax_reduction_maximum_eligible_liability: 1800 + bury_council_tax_reduction: 1440 + simulated_council_tax_reduction_benunit: 1440 + council_tax_reduction: 1440 + council_tax_less_benefit: 360 + +- name: Bury does not treat disabled children as Band B cap protected adults + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 10 + pip_dl: 1 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: BURY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + bury_council_tax_reduction_protected_group: false + bury_council_tax_reduction_maximum_eligible_liability: 1400 + bury_council_tax_reduction: 1120 + simulated_council_tax_reduction_benunit: 1120 + council_tax_reduction: 1120 + council_tax_less_benefit: 680 + +- name: Bury applies flat monthly working-age non-dependant deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BURY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + bury_council_tax_reduction_non_dep_deductions: [480, 0] + bury_council_tax_reduction: [640, 0] + simulated_council_tax_reduction_benunit: [640, 0] + council_tax_reduction: 640 + council_tax_less_benefit: 1160 + +- name: Bury waives non-dependant deductions for Armed Forces Independence Payment claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + armed_forces_independence_payment: 1 + non_dep: + age: 25 + employment_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BURY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + bury_council_tax_reduction_non_dep_deductions: [0, 0] + bury_council_tax_reduction: [1120, 0] + simulated_council_tax_reduction_benunit: [1120, 0] + council_tax_reduction: 1120 + council_tax_less_benefit: 680 + +- name: Lambeth zero-earnings working-age claimant receives 73.5 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LAMBETH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + lambeth_council_tax_reduction: 1323 + simulated_council_tax_reduction_benunit: 1323 + council_tax_reduction: 1323 + council_tax_less_benefit: 477 + +- name: Lambeth applies no-child weekly net-earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 13_000 + income_tax: 0 + national_insurance: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LAMBETH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + lambeth_council_tax_reduction: 540 + simulated_council_tax_reduction_benunit: 540 + council_tax_reduction: 540 + council_tax_less_benefit: 1260 + +- name: Lambeth applies two-child weekly net-earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 15_600 + income_tax: 0 + national_insurance: 0 + child_1: + age: 10 + child_2: + age: 8 + benunits: + benunit: + members: [claimant, child_1, child_2] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child_1, child_2] + country: ENGLAND + local_authority: LAMBETH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + lambeth_council_tax_reduction: 540 + simulated_council_tax_reduction_benunit: 540 + council_tax_reduction: 540 + council_tax_less_benefit: 1260 + +- name: Lambeth ignores child earnings for claimant earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 16 + employment_income: 30_000 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: LAMBETH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + lambeth_council_tax_reduction: 1323 + simulated_council_tax_reduction_benunit: 1323 + council_tax_reduction: 1323 + council_tax_less_benefit: 477 + +- name: Lambeth ignores non-earnings income for working-age bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 30_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LAMBETH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + lambeth_council_tax_reduction: 1323 + simulated_council_tax_reduction_benunit: 1323 + council_tax_reduction: 1323 + council_tax_less_benefit: 477 + +- name: Lambeth excludes working-age claimants with 10,000 pounds of savings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LAMBETH + council_tax_band: D + council_tax: 1800 + savings: 10_000 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Lambeth applies working non-dependant deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: LAMBETH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + lambeth_council_tax_reduction_non_dep_deductions: [832, 0] + lambeth_council_tax_reduction: [491, 0] + simulated_council_tax_reduction_benunit: [491, 0] + council_tax_reduction: 491 + council_tax_less_benefit: 1309 + +- name: Lambeth applies person-level work status for non-dependant couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + working_non_dep: + age: 25 + employment_income: 10_400 + non_working_non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [working_non_dep, non_working_non_dep] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, working_non_dep, non_working_non_dep] + country: ENGLAND + local_authority: LAMBETH + council_tax_band: D + council_tax: 3600 + savings: 0 + output: + lambeth_council_tax_reduction_non_dep_deductions: [1352, 0] + lambeth_council_tax_reduction: [1294, 0] + simulated_council_tax_reduction_benunit: [1294, 0] + council_tax_reduction: 1294 + council_tax_less_benefit: 2306 + +- name: Lambeth waives non-dependant deductions for PIP daily living claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1 + non_dep: + age: 25 + employment_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: LAMBETH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + lambeth_council_tax_reduction_non_dep_deductions: [0, 0] + lambeth_council_tax_reduction: [1323, 0] + simulated_council_tax_reduction_benunit: [1323, 0] + council_tax_reduction: 1323 + council_tax_less_benefit: 477 + +- name: Camden zero-earnings working-age claimant receives full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + camden_council_tax_reduction: 1800 + simulated_council_tax_reduction_benunit: 1800 + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Camden uses gross earnings for no-child income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 15_600 + income_tax: 5_000 + national_insurance: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + camden_council_tax_reduction: 630 + simulated_council_tax_reduction_benunit: 630 + council_tax_reduction: 630 + council_tax_less_benefit: 1170 + +- name: Camden applies child household earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 31_200 + child: + age: 8 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + camden_council_tax_reduction: 270 + simulated_council_tax_reduction_benunit: 270 + council_tax_reduction: 270 + council_tax_less_benefit: 1530 + +- name: Camden deducts eligible childcare costs before earnings banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 13_000 + hours_worked: 832 + childcare_expenses: 2_600 + child: + age: 8 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + camden_council_tax_reduction_childcare_deduction: 2600 + camden_council_tax_reduction: 1170 + simulated_council_tax_reduction_benunit: 1170 + council_tax_reduction: 1170 + council_tax_less_benefit: 630 + +- name: Camden applies disabled or carer earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 15_600 + pip_dl: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + camden_council_tax_reduction: 990 + simulated_council_tax_reduction_benunit: 990 + council_tax_reduction: 990 + council_tax_less_benefit: 810 + +- name: Camden counts partner earnings and disability benefits + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + partner: + age: 35 + employment_income: 15_600 + pip_dl: 1 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + camden_council_tax_reduction: 990 + simulated_council_tax_reduction_benunit: 990 + council_tax_reduction: 990 + council_tax_less_benefit: 810 + +- name: Camden includes working-age claimants just below the capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 15_999 + output: + camden_council_tax_reduction_assessable_capital: 15_999 + camden_council_tax_reduction: 1800 + simulated_council_tax_reduction_benunit: 1800 + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Camden excludes working-age claimants with 16,000 pounds of savings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 16_000 + output: + council_tax_reduction_scheme_supported: true + camden_council_tax_reduction_assessable_capital: 16_000 + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Camden applies thirty percent liability non-dependant deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 26 + employment_income: 6_240 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 26 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + camden_council_tax_reduction_non_dep_deductions: [540, 0] + camden_council_tax_reduction: [1260, 0] + simulated_council_tax_reduction_benunit: [1260, 0] + council_tax_reduction: 1260 + council_tax_less_benefit: 540 + +- name: Camden treats non-dependant couples as one deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + first_non_dep: + age: 26 + employment_income: 6_240 + second_non_dep: + age: 26 + employment_income: 6_240 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [first_non_dep, second_non_dep] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 26 + benefits_premiums: 0 + households: + household: + members: [claimant, first_non_dep, second_non_dep] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 3600 + savings: 0 + output: + camden_council_tax_reduction_non_dep_deductions: [1080, 0] + camden_council_tax_reduction: [2520, 0] + simulated_council_tax_reduction_benunit: [2520, 0] + council_tax_reduction: 2520 + council_tax_less_benefit: 1080 + +- name: Camden does not deduct for non-dependants aged 25 or at the earnings threshold + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + age_25_non_dep: + age: 25 + employment_income: 6_240 + threshold_non_dep: + age: 26 + employment_income: 5_761.60 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + age_25_benunit: + members: [age_25_non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + threshold_benunit: + members: [threshold_non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 26 + benefits_premiums: 0 + households: + household: + members: [claimant, age_25_non_dep, threshold_non_dep] + country: ENGLAND + local_authority: CAMDEN + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + camden_council_tax_reduction_non_dep_deductions: [0, 0, 0] + camden_council_tax_reduction: [1800, 0, 0] + simulated_council_tax_reduction_benunit: [1800, 0, 0] + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Islington zero-earnings working-age claimant receives 95 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + islington_council_tax_reduction: 1710 + simulated_council_tax_reduction_benunit: 1710 + council_tax_reduction: 1710 + council_tax_less_benefit: 90 + +- name: Islington protected zero-earnings claimant receives full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + islington_council_tax_reduction_non_working_protected: true + islington_council_tax_reduction: 1800 + simulated_council_tax_reduction_benunit: 1800 + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Islington requires Universal Credit receipt for LCW zero-earnings protection + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_limited_capability_for_WRA: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + universal_credit: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + islington_council_tax_reduction_non_working_protected: false + islington_council_tax_reduction: 1710 + simulated_council_tax_reduction_benunit: 1710 + council_tax_reduction: 1710 + council_tax_less_benefit: 90 + +- name: Islington gives full support to Universal Credit LCW claimants with no earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_limited_capability_for_WRA: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + islington_council_tax_reduction_non_working_protected: true + islington_council_tax_reduction: 1800 + simulated_council_tax_reduction_benunit: 1800 + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Islington applies single no-child weekly net-pay bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + islington_council_tax_reduction: 1170 + simulated_council_tax_reduction_benunit: 1170 + council_tax_reduction: 1170 + council_tax_less_benefit: 630 + +- name: Islington uses Universal Credit earned income for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 5_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + islington_council_tax_reduction_weekly_net_earnings: 100 + islington_council_tax_reduction: 1170 + simulated_council_tax_reduction_benunit: 1170 + council_tax_reduction: 1170 + council_tax_less_benefit: 630 + +- name: Islington treats qualifying young people as child-band members not earners + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_200 + young_person: + age: 18 + current_education: POST_SECONDARY + employment_income: 30_000 + benunits: + benunit: + members: [claimant, young_person] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, young_person] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + islington_council_tax_reduction_weekly_net_earnings: 100 + islington_council_tax_reduction: 1350 + simulated_council_tax_reduction_benunit: 1350 + council_tax_reduction: 1350 + council_tax_less_benefit: 450 + +- name: Islington applies couple two-child weekly net-pay bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 16_000 + income_tax: 0 + national_insurance: 0 + partner: + age: 35 + child_1: + age: 8 + child_2: + age: 6 + benunits: + benunit: + members: [claimant, partner, child_1, child_2] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner, child_1, child_2] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + islington_council_tax_reduction: 630 + simulated_council_tax_reduction_benunit: 630 + council_tax_reduction: 630 + council_tax_less_benefit: 1170 + +- name: Islington excludes working-age claimants with 16,000 pounds of savings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 16_000 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 0 + council_tax_less_benefit: 1800 + +- name: Islington applies flat non-dependant deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + universal_credit: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + islington_council_tax_reduction_non_dep_deductions: [411.84, 0] + islington_council_tax_reduction: [1298.16, 0] + simulated_council_tax_reduction_benunit: [1298.16, 0] + council_tax_reduction: 1298.16 + council_tax_less_benefit: 501.84 + +- name: Islington exempts non-dependants on Universal Credit with no earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: ISLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + islington_council_tax_reduction_non_dep_deductions: [0, 0] + islington_council_tax_reduction: [1710, 0] + simulated_council_tax_reduction_benunit: [1710, 0] + council_tax_reduction: 1710 + council_tax_less_benefit: 90 + +- name: West Suffolk working-age claimant keeps full temporary support in 2025 + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_SUFFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: West Suffolk working-age claimant pays the 8.5 percent minimum contribution in 2026 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_SUFFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: West Suffolk applies its 2026 flat working-age non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WEST_SUFFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1213.32 + council_tax_less_benefit: 586.68 + +- name: Warrington working-age claimant above Band A gets 91.5 percent maximum support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WARRINGTON + council_tax_band: C + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: Warrington single claimant on income-based JSA stays in class D and keeps 91.5 percent support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + jsa_income_reported: 4_786.6 + council_tax_benefit_reported: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WARRINGTON + council_tax_band: C + council_tax: 1520.88 + savings: 0 + output: + council_tax_reduction: 1391.61 + council_tax_less_benefit: 129.27 + +- name: Warrington lone parent on income-based JSA stays in class D and keeps 91.5 percent support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + jsa_income_reported: 4_786.6 + council_tax_benefit_reported: 1 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: WARRINGTON + council_tax_band: C + council_tax: 1520.88 + savings: 0 + output: + council_tax_reduction: 1391.61 + council_tax_less_benefit: 129.27 + +- name: Warrington class E working-age claimant above Band A is capped to Band A liability + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 8_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WARRINGTON + council_tax_band: C + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_maximum_eligible_liability: 1350 + council_tax_reduction: 707.22 + council_tax_less_benefit: 1092.78 + +- name: Merton working-age claimant can receive full support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MERTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Merton applies its local non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: MERTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1269.6 + council_tax_less_benefit: 530.4 + +- name: Southwark working-age claimant pays the 15 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTHWARK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1530 + council_tax_less_benefit: 270 + +- name: Southwark applies its local non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOUTHWARK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 999.6 + council_tax_less_benefit: 800.4 + +- name: Darlington working-age claimant pays the 20 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1440 + council_tax_less_benefit: 360 + +- name: Darlington applies its local non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DARLINGTON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 909.6 + council_tax_less_benefit: 890.4 + +- name: Dartford awards 80 percent support to a no-income single claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + dartford_council_tax_reduction_weekly_income: 0 + dartford_council_tax_reduction_support_rate: 0.8 + dartford_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Dartford applies the single claimant Band 2 boundary at 104 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 5_408 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + dartford_council_tax_reduction_weekly_income: 104 + dartford_council_tax_reduction_support_rate: 0.6 + dartford_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Dartford uses the two-or-more-child income band from 309 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 16_068 + child: + age: 5 + second_child: + age: 7 + benunits: + benunit: + members: [claimant, child, second_child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child, second_child] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + dartford_council_tax_reduction_weekly_income: 309 + dartford_council_tax_reduction_support_rate: 0.6 + dartford_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Dartford applies the couple Band 2 boundary at 155 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 8_060 + partner: + age: 35 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + dartford_council_tax_reduction_weekly_income: 155 + dartford_council_tax_reduction_support_rate: 0.6 + dartford_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Dartford applies the one-child Band 2 boundary at 233 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 12_116 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + dartford_council_tax_reduction_weekly_income: 233 + dartford_council_tax_reduction_support_rate: 0.6 + dartford_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Dartford allows exactly 6,000 pounds of capital but excludes one penny above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + claimant_over: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + over_limit: + members: [claimant_over] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + over_limit_household: + members: [claimant_over] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + dartford_council_tax_reduction: [1_440, 0] + council_tax_reduction: [1_440, 0] + +- name: Dartford passports relevant income-based benefits into Band 1 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 20_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + income_support: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_relevant_income_based_benefit: true + dartford_council_tax_reduction_support_rate: 0.8 + dartford_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Dartford applies the non-UC 25 pound weekly earnings disregard before banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_708 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + dartford_council_tax_reduction_weekly_income: 104 + dartford_council_tax_reduction_support_rate: 0.6 + dartford_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Dartford disregards source-listed war pension proxy income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + dartford_council_tax_reduction_source_disregarded_income: 10_400 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + dartford_council_tax_reduction_weekly_income: 0 + dartford_council_tax_reduction_support_rate: 0.8 + dartford_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Dartford uses UC-assessed income and capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_housing_costs_element: 1 + uc_earned_income: 5_408 + uc_unearned_income: 0 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + dartford_council_tax_reduction_weekly_income: 104 + dartford_council_tax_reduction_support_rate: 0.6 + dartford_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Dartford disregards Carer's Allowance in UC unearned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + carers_allowance: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_housing_costs_element: 1 + uc_earned_income: 0 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + uc_unearned_income: 10_400 + dartford_council_tax_reduction_weekly_income: 0 + dartford_council_tax_reduction_support_rate: 0.8 + dartford_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Dartford rejects UC claimants above the UC-assessed capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_housing_costs_element: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 6_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + uc_assessable_capital: 6_000.01 + dartford_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Dartford does not apply a working-age non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 30_000 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: false + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + dartford_council_tax_reduction_non_dep_deductions: [0, 0] + dartford_council_tax_reduction: [1_440, 0] + council_tax_reduction: 1_440 + +- name: Dartford applies the one pound weekly minimum award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 12_116 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 200 + savings: 0 + output: + dartford_council_tax_reduction_weekly_income: 233 + dartford_council_tax_reduction_support_rate: 0.2 + dartford_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Dartford keeps awards at the exact one pound weekly minimum + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 12_116 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 260 + savings: 0 + output: + dartford_council_tax_reduction_weekly_income: 233 + dartford_council_tax_reduction_support_rate: 0.2 + dartford_council_tax_reduction: 52 + council_tax_reduction: 52 + +- name: Dartford local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 1 + uc_housing_costs_element: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + dartford_council_tax_reduction_is_local_scheme: true + dartford_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + +- name: Dartford local scheme covers pension-age income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + income_support: 1 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DARTFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_relevant_income_based_benefit: true + council_tax_reduction_household_has_pensioner: true + dartford_council_tax_reduction_is_local_scheme: true + dartford_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + +- name: Derby caps maximum support at 80 percent of Band B liability + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + derby_council_tax_reduction_maximum_eligible_liability: 1_400 + derby_council_tax_reduction: 1_120 + council_tax_reduction: 1_120 + +- name: Derby withdraws 20 percent of excess income under the default means test + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 520 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + derby_council_tax_reduction: 1_016 + council_tax_reduction: 1_016 + +- name: Derby allows exactly 6,000 pounds of capital but excludes one penny above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + claimant_over: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + over_limit: + members: [claimant_over] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + over_limit_household: + members: [claimant_over] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + derby_council_tax_reduction: [1_120, 0] + council_tax_reduction: [1_120, 0] + +- name: Derby applies a 4 pound weekly non-dependant deduction below 100 pounds gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 5_148 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: false + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + derby_council_tax_reduction_non_dep_deductions: [208, 0] + derby_council_tax_reduction: [912, 0] + council_tax_reduction: 912 + +- name: Derby applies the Housing Benefit low non-dependant deduction from 100 pounds gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 5_200 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: false + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 5_000 + savings: 0 + output: + derby_council_tax_reduction_non_dep_deductions: [1_060.8, 0] + derby_council_tax_reduction: [2_050.31, 0] + council_tax_reduction: 2_050.31 + +- name: Derby caps Housing Benefit non-dependant deductions at the third retained income rate + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_460 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: false + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 10_000 + savings: 0 + output: + derby_council_tax_reduction_non_dep_deductions: [5_470.4, 0] + derby_council_tax_reduction: [751.82, 0] + council_tax_reduction: 751.82 + +- name: Derby applies the non-remunerative-work non-dependant deduction below 16 hours + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_460 + weekly_hours: 15 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: false + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 5_000 + savings: 0 + output: + derby_council_tax_reduction_non_dep_deductions: [1_060.8, 0] + derby_council_tax_reduction: [2_050.31, 0] + council_tax_reduction: 2_050.31 + +- name: Derby charges 4 pounds weekly for a non-working UC non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: true + universal_credit: 1 + uc_earned_income: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + derby_council_tax_reduction_non_dep_deductions: [208, 0] + derby_council_tax_reduction: [912, 0] + council_tax_reduction: 912 + +- name: Derby charges 4 pounds weekly for a non-working passported non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: false + income_support: 1 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + derby_council_tax_reduction_non_dep_deductions: [208, 0] + derby_council_tax_reduction: [912, 0] + council_tax_reduction: 912 + +- name: Derby removes awards below the 4 pound weekly minimum + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DERBY + council_tax_band: B + council_tax: 259 + savings: 0 + output: + derby_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Derby keeps awards at the exact 4 pound weekly minimum + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DERBY + council_tax_band: B + council_tax: 260 + savings: 0 + output: + derby_council_tax_reduction: 208 + council_tax_reduction: 208 + +- name: Derby leaves pensioner households to the national pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: DERBY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + council_tax_reduction_scheme_supported: true + derby_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: South Derbyshire awards full support to a no-excess-income working-age claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + south_derbyshire_council_tax_reduction_support_rate: 1 + south_derbyshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: South Derbyshire moves from full to 90 percent support above 5 pounds weekly excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant_exact: + age: 35 + claimant_above: + age: 35 + benunits: + exact: + members: [claimant_exact] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 260 + above: + members: [claimant_above] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 260.52 + households: + exact_household: + members: [claimant_exact] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + above_household: + members: [claimant_above] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_derbyshire_council_tax_reduction_support_rate: [1, 0.9] + south_derbyshire_council_tax_reduction: [1_800, 1_620] + council_tax_reduction: [1_800, 1_620] + +- name: South Derbyshire awards no support above 140 pounds weekly excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 7_280.52 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_derbyshire_council_tax_reduction_support_rate: 0 + south_derbyshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: South Derbyshire rounds part-block tariff income up above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant_exact: + age: 35 + claimant_above: + age: 35 + benunits: + exact: + members: [claimant_exact] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 260 + above: + members: [claimant_above] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 260 + households: + exact_household: + members: [claimant_exact] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + above_household: + members: [claimant_above] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + south_derbyshire_council_tax_reduction_tariff_income: [0, 52] + south_derbyshire_council_tax_reduction_support_rate: [1, 0.9] + south_derbyshire_council_tax_reduction: [1_800, 1_620] + council_tax_reduction: [1_800, 1_620] + +- name: South Derbyshire allows exactly 16,000 pounds of capital but rejects one penny above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant_exact: + age: 35 + claimant_above: + age: 35 + benunits: + exact: + members: [claimant_exact] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + above: + members: [claimant_above] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + exact_household: + members: [claimant_exact] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + above_household: + members: [claimant_above] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 16_000.01 + output: + south_derbyshire_council_tax_reduction_support_rate: [0.66, 0.66] + south_derbyshire_council_tax_reduction: [1_188, 0] + council_tax_reduction: [1_188, 0] + +- name: South Derbyshire excludes child capital when applicant and partner source capital is supplied + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 10 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + south_derbyshire_council_tax_reduction_applicant_partner_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + south_derbyshire_council_tax_reduction_assessable_capital: 0 + south_derbyshire_council_tax_reduction_tariff_income: 0 + south_derbyshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: South Derbyshire disregards capital already assessed in income-based benefits + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + income_support: 1 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + council_tax_reduction_relevant_income_based_benefit: true + south_derbyshire_council_tax_reduction_support_rate: 1 + south_derbyshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: South Derbyshire deducts flat non-dependants before applying the support rate + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 260.52 + non_dep_benunit: + members: [non_dep] + would_claim_uc: false + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_derbyshire_council_tax_reduction_non_dep_deductions: [325, 0] + south_derbyshire_council_tax_reduction: [1_327.5, 0] + council_tax_reduction: 1_327.5 + +- name: South Derbyshire charges a working-age deduction for a non-working UC non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: true + universal_credit: 1 + uc_earned_income: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_derbyshire_council_tax_reduction_non_dep_deductions: [325, 0] + south_derbyshire_council_tax_reduction: [1_475, 0] + council_tax_reduction: 1_475 + +- name: South Derbyshire charges a deduction for each non-dependant in a couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 25 + non_dep_2: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + non_dep_couple: + members: [non_dep_1, non_dep_2] + would_claim_uc: false + is_couple: true + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_derbyshire_council_tax_reduction_non_dep_deductions: [650, 0] + south_derbyshire_council_tax_reduction: [1_150, 0] + council_tax_reduction: 1_150 + +- name: South Derbyshire removes non-dependant deductions when the claimant receives PIP daily living + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: false + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_derbyshire_council_tax_reduction_non_dep_deductions: [0, 0] + south_derbyshire_council_tax_reduction: [1_800, 0] + council_tax_reduction: 1_800 + +- name: South Derbyshire UC path uses the gross UC award before deductions against UC maximum amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit_pre_benefit_cap: 10_520 + universal_credit: 10_000 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_derbyshire_council_tax_reduction_uc_applicable_income: 10_520 + south_derbyshire_council_tax_reduction_support_rate: 0.9 + south_derbyshire_council_tax_reduction: 1_620 + council_tax_reduction: 1_620 + +- name: South Derbyshire UC path uses UC-assessed capital instead of household savings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant_under: + age: 35 + claimant_over: + age: 35 + benunits: + under: + members: [claimant_under] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit_pre_benefit_cap: 10_000 + universal_credit: 10_000 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + over: + members: [claimant_over] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit_pre_benefit_cap: 10_000 + universal_credit: 10_000 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 16_000.01 + households: + under_household: + members: [claimant_under] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + over_household: + members: [claimant_over] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_derbyshire_council_tax_reduction: [1_800, 0] + council_tax_reduction: [1_800, 0] + +- name: South Derbyshire removes awards below the 1 pound weekly minimum + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant_below: + age: 35 + claimant_exact: + age: 35 + benunits: + below: + members: [claimant_below] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + exact: + members: [claimant_exact] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + below_household: + members: [claimant_below] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 51.99 + savings: 0 + exact_household: + members: [claimant_exact] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 52 + savings: 0 + output: + south_derbyshire_council_tax_reduction: [0, 52] + council_tax_reduction: [0, 52] + +- name: South Derbyshire leaves ordinary pensioner households to the national pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + council_tax_reduction_scheme_supported: true + south_derbyshire_council_tax_reduction_is_local_scheme: false + south_derbyshire_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: South Derbyshire keeps pension-age Working Tax Credit closure UC cases on the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit_pre_benefit_cap: 10_000 + universal_credit: 10_000 + uc_maximum_amount: 10_000 + uc_assessable_capital: 0 + south_derbyshire_council_tax_reduction_uc_working_tax_credit_closure_pensioner: true + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + south_derbyshire_council_tax_reduction_is_local_scheme: false + south_derbyshire_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: South Derbyshire treats mixed-age couples without income-based benefits as pensioners + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + partner: + age: 35 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + south_derbyshire_council_tax_reduction_is_local_scheme: false + south_derbyshire_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: South Derbyshire local scheme covers mixed-age income-based benefit couples without national double-counting + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + partner: + age: 35 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + income_support: 1 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: SOUTH_DERBYSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + council_tax_reduction_relevant_income_based_benefit: true + south_derbyshire_council_tax_reduction_is_local_scheme: true + south_derbyshire_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Gateshead working-age claimant pays the 8.5 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GATESHEAD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: Gateshead applies its local non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: GATESHEAD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1124.4 + council_tax_less_benefit: 675.6 + +- name: Gloucester working-age claimant can receive full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + gloucester_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + council_tax_less_benefit: 0 + +- name: Gloucester tapers support at 20 percent of excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_applicable_amount: 4_948.81 + council_tax_reduction_applicable_income: 6_000 + gloucester_council_tax_reduction: 1_590 + council_tax_reduction: 1_590 + +- name: Gloucester follows the exact 16,000 pound capital boundary + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + output: + gloucester_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Gloucester excludes capital one penny above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 16_000.01 + output: + gloucester_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Gloucester uses UC assessed income and capital for a UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_000 + universal_credit: 5_200 + uc_earned_income: 5_200 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + gloucester_council_tax_reduction_uc_applicable_income: 10_400 + gloucester_council_tax_reduction: 1_720 + council_tax_reduction: 1_720 + +- name: Gloucester follows the UC assessed capital boundary + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 6_000 + universal_credit: 5_200 + uc_assessable_capital: 16_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + gloucester_council_tax_reduction: 1_542.40 + council_tax_reduction: 1_542.40 + +- name: Gloucester excludes UC assessed capital one penny above the limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 5_200 + universal_credit: 5_200 + uc_assessable_capital: 16_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + gloucester_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Gloucester deducts six pounds for a lower-earning remunerative-work non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 15_600 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + gloucester_council_tax_reduction_non_dep_deductions: [312, 0] + gloucester_council_tax_reduction: [1_488, 0] + council_tax_reduction: 1_488 + +- name: Gloucester deducts 12.40 pounds for a higher-earning non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 19_604 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + gloucester_council_tax_reduction_non_dep_deductions: [644.8, 0] + gloucester_council_tax_reduction: [1_155.2, 0] + council_tax_reduction: 1_155.2 + +- name: Gloucester applies one deduction for a non-UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 19_604 + weekly_hours: 35 + non_dep_partner: + age: 30 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + gloucester_council_tax_reduction_non_dep_deductions: [644.8, 0] + gloucester_council_tax_reduction: [1_155.2, 0] + council_tax_reduction: 1_155.2 + +- name: Gloucester does not collapse a Universal Credit non-dependant couple to one deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + gloucester_council_tax_reduction_non_dep_uc_earned_income: 19_604 + non_dep_partner: + age: 30 + gloucester_council_tax_reduction_non_dep_uc_earned_income: 19_604 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + gloucester_council_tax_reduction_non_dep_deductions: [1_289.6, 0] + gloucester_council_tax_reduction: [510.4, 0] + council_tax_reduction: 510.4 + +- name: Gloucester treats zero UC earned income as the low non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 19_604 + weekly_hours: 35 + gloucester_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + gloucester_council_tax_reduction_non_dep_deductions: [312, 0] + gloucester_council_tax_reduction: [1_488, 0] + council_tax_reduction: 1_488 + +- name: Gloucester keeps pension-age Universal Credit cases in the local scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + uc_maximum_amount: 5_200 + universal_credit: 5_200 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + gloucester_council_tax_reduction_is_local_scheme: true + gloucester_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Gloucester keeps pension-age income-based benefit cases in the local scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + income_support: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + council_tax_reduction_relevant_income_based_benefit: true + gloucester_council_tax_reduction_is_local_scheme: true + gloucester_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Gloucester leaves ordinary pensioner households to the national pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + gloucester_council_tax_reduction_is_local_scheme: false + gloucester_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Gloucester leaves ordinary mixed-age households to the national pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + partner: + age: 35 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: GLOUCESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + gloucester_council_tax_reduction_is_local_scheme: false + gloucester_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Bath and North East Somerset gives ordinary non-UC claimants 78 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + bath_and_north_east_somerset_council_tax_reduction: 1_404 + council_tax_reduction: 1_404 + +- name: Bath and North East Somerset caps ordinary non-UC support at Band D + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + bath_and_north_east_somerset_council_tax_reduction_maximum_eligible_liability: 1_800 + bath_and_north_east_somerset_council_tax_reduction: 1_404 + council_tax_reduction: 1_404 + +- name: Bath and North East Somerset protected non-UC claimants get 100 percent uncapped support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + bath_and_north_east_somerset_council_tax_reduction_protected_group: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: H + council_tax: 3_600 + savings: 16_000 + output: + bath_and_north_east_somerset_council_tax_reduction_maximum_eligible_liability: 3_600 + bath_and_north_east_somerset_council_tax_reduction: 3_600 + council_tax_reduction: 3_600 + +- name: Bath and North East Somerset tapers ordinary non-UC excess income at 20 percent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_applicable_amount: 4_948.81 + council_tax_reduction_applicable_income: 6_000 + bath_and_north_east_somerset_council_tax_reduction: 1_193.76 + council_tax_reduction: 1_193.76 + +- name: Bath and North East Somerset applies the ordinary 10,000 pound capital boundary + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 10_000 + output: + bath_and_north_east_somerset_council_tax_reduction_tariff_income: 832 + bath_and_north_east_somerset_council_tax_reduction: 1_404 + council_tax_reduction: 1_404 + +- name: Bath and North East Somerset excludes ordinary capital one penny above 10,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 10_000.01 + output: + bath_and_north_east_somerset_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Bath and North East Somerset follows the PDF single UC band boundary + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 5_098.60 + universal_credit_pre_benefit_cap: 5_098.60 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + bath_and_north_east_somerset_council_tax_reduction_uc_weekly_income: 98.05 + bath_and_north_east_somerset_council_tax_reduction_support_rate: 1 + bath_and_north_east_somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Bath and North East Somerset moves single UC claimants to 85 percent at 98.06 weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 5_099.12 + universal_credit_pre_benefit_cap: 5_099.12 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + bath_and_north_east_somerset_council_tax_reduction_uc_weekly_income: 98.06 + bath_and_north_east_somerset_council_tax_reduction_support_rate: 0.85 + bath_and_north_east_somerset_council_tax_reduction: 1_530 + council_tax_reduction: 1_530 + +- name: Bath and North East Somerset adds 50 pounds per child to UC income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 7_698.60 + universal_credit_pre_benefit_cap: 7_698.60 + uc_assessable_capital: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + bath_and_north_east_somerset_council_tax_reduction_uc_weekly_income: 148.05 + bath_and_north_east_somerset_council_tax_reduction_support_rate: 1 + bath_and_north_east_somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Bath and North East Somerset uses the couple UC band table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + partner: + age: 35 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 8_003.84 + universal_credit_pre_benefit_cap: 8_003.84 + uc_assessable_capital: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + bath_and_north_east_somerset_council_tax_reduction_uc_weekly_income: 153.92 + bath_and_north_east_somerset_council_tax_reduction_support_rate: 1 + bath_and_north_east_somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Bath and North East Somerset follows the UC assessed capital boundary + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 5_098.60 + universal_credit_pre_benefit_cap: 5_098.60 + uc_assessable_capital: 6_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + bath_and_north_east_somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Bath and North East Somerset excludes UC capital one penny above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 5_098.60 + universal_credit_pre_benefit_cap: 5_098.60 + uc_assessable_capital: 6_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + bath_and_north_east_somerset_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Bath and North East Somerset keeps pension-age Universal Credit cases local + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 5_098.60 + universal_credit_pre_benefit_cap: 5_098.60 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + bath_and_north_east_somerset_council_tax_reduction_is_local_scheme: true + bath_and_north_east_somerset_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Bath and North East Somerset leaves ordinary pensioners to the national pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BATH_AND_NORTH_EAST_SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + bath_and_north_east_somerset_council_tax_reduction_is_local_scheme: false + bath_and_north_east_somerset_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: King's Lynn and West Norfolk working-age claimant can receive full support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGS_LYNN_AND_WEST_NORFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: King's Lynn and West Norfolk applies its local non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGS_LYNN_AND_WEST_NORFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1269.6 + council_tax_less_benefit: 530.4 + +- name: Norwich working-age claimant can receive full support + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORWICH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Norwich applies its working-age non-dependant deduction schedule + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NORWICH + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1258.16 + council_tax_less_benefit: 541.84 + +- name: North Norfolk working-age claimant pays the 8.5 percent minimum contribution + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: North Norfolk applies its flat weekly non-dependant deduction + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NORTH_NORFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1127 + council_tax_less_benefit: 673 + +- name: North Norfolk waives the non-dependant deduction for UC limited capability claimants + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_limited_capability_for_WRA: true + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NORTH_NORFOLK + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction: 1647 + council_tax_less_benefit: 153 + +- name: Welsh household uses the national Welsh CTR scheme + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: WALES + local_authority: WREXHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + +- name: Scottish household uses the national Scottish CTR scheme + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: SCOTLAND + local_authority: GLASGOW_CITY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + +- name: English pensioner household uses the prescribed full-support scheme + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + is_SP_age: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMINSTER + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + council_tax_reduction: 1800 + +- name: Unsupported English working-age authorities keep reported baseline values + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 500 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BEXLEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_scheme_supported: false + council_tax_reduction: 500 + +- name: Barking and Dagenham zero-income working-age claimant receives 63 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BARKING_AND_DAGENHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + barking_and_dagenham_council_tax_reduction: 1134 + simulated_council_tax_reduction_benunit: 1134 + council_tax_reduction: 1134 + council_tax_less_benefit: 666 + +- name: Barking and Dagenham counts weekly unearned income for income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 7_800 + income_tax: 0 + national_insurance: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BARKING_AND_DAGENHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + barking_and_dagenham_council_tax_reduction_weekly_income: 150 + barking_and_dagenham_council_tax_reduction: 864 + council_tax_reduction: 864 + +- name: Barking and Dagenham deducts non-dependants before applying the support percentage + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BARKING_AND_DAGENHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + barking_and_dagenham_council_tax_reduction_non_dep_deductions: [780, 0] + barking_and_dagenham_council_tax_reduction: [642.6, 0] + council_tax_reduction: 642.6 + +- name: Barking and Dagenham excludes working-age claimants above the 6,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BARKING_AND_DAGENHAM + council_tax_band: D + council_tax: 1800 + savings: 6_001 + output: + barking_and_dagenham_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Barking and Dagenham only counts allowed Universal Credit elements as income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 15_600 + uc_standard_allowance: 5_200 + uc_child_element: 0 + uc_income_reduction: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BARKING_AND_DAGENHAM + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + barking_and_dagenham_council_tax_reduction_countable_universal_credit: 5_200 + barking_and_dagenham_council_tax_reduction_weekly_income: 100 + barking_and_dagenham_council_tax_reduction: 1134 + council_tax_reduction: 1134 + +- name: Barnet zero-earnings working-age claimant receives 70 percent of Band C-capped liability + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BARNET + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + barnet_council_tax_reduction_maximum_eligible_liability: 1600 + barnet_council_tax_reduction: 1120 + simulated_council_tax_reduction_benunit: 1120 + council_tax_reduction: 1120 + council_tax_less_benefit: 680 + +- name: Barnet applies monthly earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 7_200 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BARNET + council_tax_band: C + council_tax: 1800 + savings: 0 + output: + barnet_council_tax_reduction_monthly_earnings: 600 + barnet_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: Barnet ignores non-earnings income for working-age bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 30_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BARNET + council_tax_band: C + council_tax: 1800 + savings: 0 + output: + barnet_council_tax_reduction_monthly_earnings: 0 + barnet_council_tax_reduction: 1260 + council_tax_reduction: 1260 + +- name: Barnet excludes working-age claimants above the 6,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BARNET + council_tax_band: C + council_tax: 1800 + savings: 6_001 + output: + barnet_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Barnet applies the higher non-dependant deduction at 200 pounds of weekly gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BARNET + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + barnet_council_tax_reduction_non_dep_deductions: [572, 0] + barnet_council_tax_reduction: [548, 0] + council_tax_reduction: 548 + +- name: Barnet makes one non-dependant deduction for a couple using the highest single-person amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 25 + employment_income: 7_800 + non_dep_2: + age: 25 + employment_income: 7_800 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep_1, non_dep_2] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: BARNET + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + barnet_council_tax_reduction_non_dep_deductions: [260, 0] + barnet_council_tax_reduction: [860, 0] + council_tax_reduction: 860 + +- name: Barnet protected working-age claimants receive full uncapped support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + afcs_reported: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BARNET + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + barnet_council_tax_reduction_protected_group: true + barnet_council_tax_reduction_maximum_eligible_liability: 1800 + barnet_council_tax_reduction: 1800 + council_tax_reduction: 1800 + council_tax_less_benefit: 0 + +- name: Hillingdon zero-income working-age claimant receives 75 percent support with Band D cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HILLINGDON + council_tax_band: E + council_tax: 2200 + savings: 0 + output: + hillingdon_council_tax_reduction_maximum_eligible_liability: 1800 + hillingdon_council_tax_reduction: 1350 + simulated_council_tax_reduction_benunit: 1350 + council_tax_reduction: 1350 + council_tax_less_benefit: 850 + +- name: Hillingdon applies the 25 pound weekly earnings disregard + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_980 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HILLINGDON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hillingdon_council_tax_reduction_weekly_income: 90 + hillingdon_council_tax_reduction: 1350 + council_tax_reduction: 1350 + +- name: Hillingdon vulnerable claimants use Band 2 without the Band D cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl_category: STANDARD + property_income: 8_840 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HILLINGDON + council_tax_band: E + council_tax: 2200 + savings: 0 + output: + hillingdon_council_tax_reduction_vulnerable: true + hillingdon_council_tax_reduction_weekly_income: 170 + hillingdon_council_tax_reduction_maximum_eligible_liability: 2200 + hillingdon_council_tax_reduction: 1650 + council_tax_reduction: 1650 + +- name: Hillingdon excludes working-age claimants above the 6,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HILLINGDON + council_tax_band: D + council_tax: 1800 + savings: 6_001 + output: + hillingdon_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Hillingdon deducts 12 pounds weekly for working-age non-dependants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HILLINGDON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hillingdon_council_tax_reduction_non_dep_deductions: [624, 0] + hillingdon_council_tax_reduction: [726, 0] + council_tax_reduction: 726 + +- name: Hillingdon places Universal Credit claimants with no earnings or other income in Band 3 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 15_600 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HILLINGDON + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hillingdon_council_tax_reduction: 1350 + council_tax_reduction: 1350 + +- name: Ealing zero-income non-protected working-age claimant receives 80 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction: 1440 + simulated_council_tax_reduction_benunit: 1440 + council_tax_reduction: 1440 + council_tax_less_benefit: 360 + +- name: Ealing protected working-age claimant receives full support in Band 1 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl_category: STANDARD + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_protected: true + ealing_council_tax_reduction: 1800 + council_tax_reduction: 1800 + +- name: Ealing treats Employment and Support Allowance as protected + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + esa_contrib_reported: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_protected: true + ealing_council_tax_reduction: 1800 + council_tax_reduction: 1800 + +- name: Ealing treats care leavers under 25 as protected + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 24 + ealing_council_tax_reduction_care_leaver: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 24 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_protected: true + ealing_council_tax_reduction: 1800 + council_tax_reduction: 1800 + +- name: Ealing treats underlying Carer's Allowance entitlement as protected + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + ealing_council_tax_reduction_underlying_carers_allowance_entitlement: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_protected: true + ealing_council_tax_reduction: 1800 + council_tax_reduction: 1800 + +- name: Ealing applies non-protected weekly income contribution bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 9_360 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_weekly_income: 180 + ealing_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Ealing counts maintenance payments as unearned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + maintenance_income: 9_360 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_weekly_income: 180 + ealing_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Ealing uses Universal Credit assessed income rather than the UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_weekly_income: 0 + ealing_council_tax_reduction: 1440 + council_tax_reduction: 1440 + +- name: Ealing applies the self-employed minimum income floor outside the startup period + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + self_employment_income: 1 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_weekly_income: 427.35 + ealing_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Ealing applies the couple earnings disregard outside Universal Credit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 10_012.08 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + partner: + age: 35 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_weekly_income: 154 + ealing_council_tax_reduction: 1440 + council_tax_reduction: 1440 + +- name: Ealing excludes working-age claimants with capital equal to 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 6_000 + output: + ealing_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Ealing applies the high working non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 13_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: EALING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + ealing_council_tax_reduction_non_dep_deductions: [1202.76, 0] + ealing_council_tax_reduction: [237.24, 0] + council_tax_reduction: 237.24 + +- name: Enfield non-UC working-age claimant receives 50 percent support with Band C cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_maximum_eligible_liability: 1600 + enfield_council_tax_reduction: 800 + simulated_council_tax_reduction_benunit: 800 + council_tax_reduction: 800 + +- name: Enfield single claimants under 25 are protected from the 50 percent cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 24 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 24 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_protected_group: true + enfield_council_tax_reduction: 1600 + council_tax_reduction: 1600 + +- name: Enfield applies the 22.5 percent non-UC income taper until support is exhausted + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 20_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Enfield applies Universal Credit net earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_240 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_uc_weekly_earnings: 120 + enfield_council_tax_reduction: 480 + council_tax_reduction: 480 + +- name: Enfield routes Universal Credit couples with children to the family earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 9_360 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + partner: + age: 35 + child: + age: 6 + benunits: + benunit: + members: [claimant, partner, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner, child] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_uc_weekly_earnings: 180 + enfield_council_tax_reduction: 640 + council_tax_reduction: 640 + +- name: Enfield routes Universal Credit couples with qualifying young people to the family earnings bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 9_360 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + partner: + age: 35 + young_person: + age: 17 + current_education: POST_SECONDARY + age_started_or_accepted_current_education_or_training: 16 + benunits: + benunit: + members: [claimant, partner, young_person] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner, young_person] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_uc_weekly_earnings: 180 + enfield_council_tax_reduction: 640 + council_tax_reduction: 640 + +- name: Enfield Universal Credit earnings ignore dependent child earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 6 + employment_income: 9_360 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_uc_weekly_earnings: 0 + enfield_council_tax_reduction: 800 + council_tax_reduction: 800 + +- name: Enfield excludes working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 16_001 + output: + enfield_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Enfield Universal Credit capital uses the DWP assessable capital figure + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 20_000 + output: + uc_assessable_capital: 0 + enfield_council_tax_reduction: 800 + council_tax_reduction: 800 + +- name: Enfield assumes tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 6_001 + output: + enfield_council_tax_reduction_tariff_income: 52 + +- name: Enfield non-UC income ignores dependent child earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 6 + employment_income: 20_000 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_applicable_income: 0 + enfield_council_tax_reduction: 800 + council_tax_reduction: 800 + +- name: Enfield deducts eligible childcare costs from non-UC applicable income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 10_400 + hours_worked: 832 + childcare_expenses: 2_600 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_childcare_deduction: 2600 + enfield_council_tax_reduction_applicable_income: 7800 + +- name: Enfield deducts childcare for one-worker couples with an incapacitated partner + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 10_400 + hours_worked: 832 + childcare_expenses: 2_600 + partner: + age: 35 + incapacity_benefit_reported: 1_000 + child: + age: 6 + benunits: + benunit: + members: [claimant, partner, child] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner, child] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_childcare_deduction: 2600 + +- name: Enfield applies the working-age non-dependant earnings deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 13_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_non_dep_deductions: [586.56, 0] + enfield_council_tax_reduction: [213.44, 0] + council_tax_reduction: 213.44 + +- name: Enfield combines non-dependant couple earnings for one deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 25 + employment_income: 13_000 + non_dep_2: + age: 25 + employment_income: 13_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep_1, non_dep_2] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: ENFIELD + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + enfield_council_tax_reduction_non_dep_deductions: [736.32, 0] + enfield_council_tax_reduction: [63.68, 0] + council_tax_reduction: 63.68 + +- name: Haringey working-age claimant receives 80.2 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction: 1443.6 + simulated_council_tax_reduction_benunit: 1443.6 + council_tax_reduction: 1443.6 + +- name: Haringey protects working-age households with children from the 80.2 percent cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_protected_group: true + haringey_council_tax_reduction: 1800 + council_tax_reduction: 1800 + +- name: Haringey does not protect premium-only working-age households without a child or disability benefit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_protected_group: false + haringey_council_tax_reduction: 1443.6 + +- name: Haringey protects working-age households receiving adult disability benefits + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_protected_group: true + haringey_council_tax_reduction: 1800 + +- name: Haringey applies a 20 percent taper to excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 2600 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_applicable_income: 2600 + haringey_council_tax_reduction: 923.6 + council_tax_reduction: 923.6 + +- name: Haringey excludes working-age claimants above the 10,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 10_001 + output: + haringey_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Haringey assumes tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 6_001 + output: + haringey_council_tax_reduction_tariff_income: 52 + haringey_council_tax_reduction: 1433.2 + +- name: Haringey Universal Credit path uses UC maximum amount and assessed income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 5_200 + uc_unearned_income: 0 + universal_credit: 7_540 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_uc_applicable_income: 12_740 + haringey_council_tax_reduction: 975.6 + council_tax_reduction: 975.6 + +- name: Haringey ignores dependent child earnings in applicable income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 6 + employment_income: 20_000 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_applicable_income: 0 + haringey_council_tax_reduction: 1800 + council_tax_reduction: 1800 + +- name: Haringey caps eligible childcare costs at 175 pounds per week for one child + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 20_000 + hours_worked: 832 + childcare_expenses: 20_000 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_childcare_deduction: 9100 + +- name: Haringey applies the working-age non-dependant earnings deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_non_dep_deductions: [691.6, 0] + haringey_council_tax_reduction: [752, 0] + council_tax_reduction: 752 + +- name: Haringey applies the lower non-dependant deduction below remunerative work hours + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_non_dep_deductions: [270.4, 0] + haringey_council_tax_reduction: [1173.2, 0] + +- name: Haringey exempts non-dependants when the claimant receives PIP daily living + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1_000 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HARINGEY + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + haringey_council_tax_reduction_non_dep_deductions: [0, 0] + haringey_council_tax_reduction: [1800, 0] + +- name: Harrow non-UC working-age claimant receives 50 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + harrow_council_tax_reduction: 900 + simulated_council_tax_reduction_benunit: 900 + council_tax_reduction: 900 + +- name: Harrow non-UC disabled claimant receives 86 percent support without the Band D cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: E + council_tax: 2200 + savings: 0 + output: + harrow_council_tax_reduction_disabled: true + harrow_council_tax_reduction_maximum_eligible_liability: 1800 + harrow_council_tax_reduction: 1892 + council_tax_reduction: 1892 + +- name: Harrow caps non-UC ordinary eligible liability at Band D + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: E + council_tax: 2200 + savings: 0 + output: + harrow_council_tax_reduction_maximum_eligible_liability: 1800 + harrow_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Harrow applies a 30 percent taper to non-UC excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 3000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_reduction_applicable_income: 2600 + harrow_council_tax_reduction: 120 + council_tax_reduction: 120 + +- name: Harrow excludes non-UC awards below the 2 pound weekly minimum + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + property_income: 3200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + harrow_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Harrow excludes non-UC working-age claimants above the capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 1800 + savings: 16_001 + output: + harrow_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Harrow Universal Credit single claimant with no earnings receives 50 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 0 + universal_credit: 10_400 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 1800 + savings: 20_000 + output: + harrow_council_tax_reduction_uc_support_rate: 0.5 + harrow_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Harrow Universal Credit single claimant with 100 pounds weekly net earnings receives 40 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 5_200 + universal_credit: 7_000 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 1800 + savings: 20_000 + output: + harrow_council_tax_reduction_uc_weekly_earnings: 100 + harrow_council_tax_reduction_uc_support_rate: 0.4 + harrow_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: Harrow Universal Credit couples with three children use the larger family earnings table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + partner: + age: 35 + child_1: + age: 5 + child_2: + age: 7 + child_3: + age: 9 + benunits: + benunit: + members: [claimant, partner, child_1, child_2, child_3] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 20_000 + uc_earned_income: 9_100 + universal_credit: 12_000 + uc_reported_capital: 0 + households: + household: + members: [claimant, partner, child_1, child_2, child_3] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 1800 + savings: 20_000 + output: + harrow_council_tax_reduction_uc_weekly_earnings: 175 + harrow_council_tax_reduction_uc_support_rate: 0.4 + harrow_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: Harrow Universal Credit disabled claimant receives 86 percent support without the Band D cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 5_200 + universal_credit: 7_000 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: E + council_tax: 2200 + savings: 20_000 + output: + harrow_council_tax_reduction_disabled: true + harrow_council_tax_reduction_uc_support_rate: 0.86 + harrow_council_tax_reduction: 1892 + council_tax_reduction: 1892 + +- name: Harrow excludes Universal Credit claimants above the DWP capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 0 + universal_credit: 10_400 + uc_reported_capital: 16_001 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + uc_assessable_capital: 16_001 + harrow_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Harrow disabled protection stops when claimant and partner earnings reach 440 pounds weekly + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1_000 + employment_income: 22_880 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 5_200 + universal_credit: 7_000 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + harrow_council_tax_reduction_disabled: false + harrow_council_tax_reduction_uc_support_rate: 0.4 + harrow_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: Harrow applies the non-UC non-dependant gross-income table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 3000 + savings: 0 + output: + harrow_council_tax_reduction_non_dep_deductions: [1222, 0] + harrow_council_tax_reduction: [278, 0] + council_tax_reduction: 278 + +- name: Harrow makes one non-dependant deduction for a non-UC couple using joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 13_000 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 13_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 3000 + savings: 0 + output: + harrow_council_tax_reduction_non_dep_deductions: [1222, 0] + harrow_council_tax_reduction: [278, 0] + council_tax_reduction: 278 + +- name: Harrow applies the UC non-dependant low deduction without waiving no-earnings cases + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 0 + universal_credit: 10_400 + uc_reported_capital: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + universal_credit: 1_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + uc_maximum_amount: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 3000 + savings: 0 + output: + harrow_council_tax_reduction_non_dep_deductions: [247, 0] + harrow_council_tax_reduction: [1253, 0] + council_tax_reduction: 1253 + +- name: Harrow applies the UC non-dependant high deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_400 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 0 + universal_credit: 10_400 + uc_reported_capital: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HARROW + council_tax_band: D + council_tax: 3000 + savings: 0 + output: + harrow_council_tax_reduction_non_dep_deductions: [975, 0] + harrow_council_tax_reduction: [525, 0] + council_tax_reduction: 525 + +- name: Hounslow working-age claimant receives 75 percent support in the lowest earnings band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HOUNSLOW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hounslow_council_tax_reduction_weekly_net_earnings: 0 + hounslow_council_tax_reduction: 1350 + simulated_council_tax_reduction_benunit: 1350 + council_tax_reduction: 1350 + +- name: Hounslow single claimant with 100 pounds weekly earnings receives 60 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HOUNSLOW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hounslow_council_tax_reduction_weekly_net_earnings: 100 + hounslow_council_tax_reduction: 1080 + council_tax_reduction: 1080 + +- name: Hounslow Universal Credit earnings bands ignore the UC award and unearned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + private_pension_income: 50_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 10_000 + uc_earned_income: 5_200 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HOUNSLOW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hounslow_council_tax_reduction_weekly_net_earnings: 100 + hounslow_council_tax_reduction: 1080 + council_tax_reduction: 1080 + +- name: Hounslow carers receive 90 percent support regardless of earnings band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 20_000 + carers_allowance_reported: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HOUNSLOW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hounslow_council_tax_reduction_carer: true + hounslow_council_tax_reduction: 1620 + council_tax_reduction: 1620 + +- name: Hounslow excludes working-age claimants above the 6,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HOUNSLOW + council_tax_band: D + council_tax: 1800 + savings: 6_001 + output: + hounslow_council_tax_reduction_assessable_capital: 6_001 + hounslow_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Hounslow applies the working-age remunerative-work non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 20_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HOUNSLOW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hounslow_council_tax_reduction_non_dep_deductions: [520, 0] + hounslow_council_tax_reduction: [830, 0] + council_tax_reduction: 830 + +- name: Havering working-age claimant receives 75 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + havering_council_tax_reduction: 1350 + simulated_council_tax_reduction_benunit: 1350 + council_tax_reduction: 1350 + +- name: Havering disabled working-age claimant receives 80 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + havering_council_tax_reduction_disabled: true + havering_council_tax_reduction: 1440 + council_tax_reduction: 1440 + +- name: Havering caps ordinary working-age eligible liability at Band D + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAVERING + council_tax_band: E + council_tax: 2200 + savings: 0 + output: + havering_council_tax_reduction_maximum_eligible_liability: 1800 + havering_council_tax_reduction: 1350 + council_tax_reduction: 1350 + +- name: Havering care leavers receive 100 percent support without the ordinary Band D cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 22 + havering_council_tax_reduction_care_leaver: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 22 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAVERING + council_tax_band: E + council_tax: 2200 + savings: 0 + output: + havering_council_tax_reduction_full_support_group: true + havering_council_tax_reduction_maximum_eligible_liability: 1800 + havering_council_tax_reduction: 2200 + council_tax_reduction: 2200 + +- name: Havering Universal Credit capital uses the DWP assessable capital figure + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 0 + uc_unearned_income: 0 + universal_credit: 10_400 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 20_000 + output: + uc_assessable_capital: 0 + havering_council_tax_reduction: 1350 + council_tax_reduction: 1350 + +- name: Havering Universal Credit applicable income includes DWP income and the UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 1_500 + uc_unearned_income: 500 + universal_credit: 10_000 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 20_000 + output: + havering_council_tax_reduction_uc_applicable_income: 12_000 + havering_council_tax_reduction: 1030 + council_tax_reduction: 1030 + +- name: Havering excludes Universal Credit claimants above the DWP capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 10_400 + uc_earned_income: 0 + uc_unearned_income: 0 + universal_credit: 10_400 + uc_reported_capital: 6_001 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + uc_assessable_capital: 6_001 + havering_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Havering excludes non-UC working-age claimants above the local capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 6_001 + output: + havering_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Havering applies the working-age non-dependant gross-income deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + havering_council_tax_reduction_non_dep_deductions: [1040, 0] + havering_council_tax_reduction: [310, 0] + council_tax_reduction: 310 + +- name: Havering applies the lower non-dependant deduction below remunerative work hours + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + havering_council_tax_reduction_non_dep_deductions: [312, 0] + havering_council_tax_reduction: [1038, 0] + council_tax_reduction: 1038 + +- name: Havering makes one non-dependant deduction for a non-UC couple using joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 13_000 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 13_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + havering_council_tax_reduction_non_dep_deductions: [1040, 0] + havering_council_tax_reduction: [310, 0] + council_tax_reduction: 310 + +- name: Havering counts both members of a UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 13_000 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 13_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: HAVERING + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + havering_council_tax_reduction_non_dep_deductions: [2080, 0] + havering_council_tax_reduction: [0, 0] + council_tax_reduction: 0 + +- name: Hounslow applies the lower non-dependant deduction below remunerative work hours + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 20_000 + hours_worked: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HOUNSLOW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hounslow_council_tax_reduction_non_dep_deductions: [260, 0] + hounslow_council_tax_reduction: [1090, 0] + +- name: Hounslow makes one non-dependant deduction for non-dependant couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 20_000 + hours_worked: 832 + non_dep_partner: + age: 25 + hours_worked: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: HOUNSLOW + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + hounslow_council_tax_reduction_non_dep_deductions: [520, 0] + hounslow_council_tax_reduction: [830, 0] + +- name: Brent zero-earnings working-age claimant receives 65 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + brent_council_tax_reduction_weekly_earnings: 0 + brent_council_tax_reduction: 1170 + simulated_council_tax_reduction_benunit: 1170 + council_tax_reduction: 1170 + council_tax_less_benefit: 630 + +- name: Brent weekly earnings bands reduce support to 30 percent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_240 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + brent_council_tax_reduction_weekly_earnings: 120 + brent_council_tax_reduction: 540 + council_tax_reduction: 540 + +- name: Brent ignores DWP and HMRC benefits for the weekly earnings band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 8_000 + child_benefit: 2_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + brent_council_tax_reduction_weekly_earnings: 0 + brent_council_tax_reduction: 1170 + council_tax_reduction: 1170 + +- name: Brent uses gross earnings rather than net earnings for the weekly earnings band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_240 + income_tax: 1_040 + national_insurance: 0 + pension_contributions: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + brent_council_tax_reduction_weekly_earnings: 120 + brent_council_tax_reduction: 540 + council_tax_reduction: 540 + +- name: Brent uses Universal Credit assessed earnings rather than the UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 2_600 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 8_000 + uc_earned_income: 6_240 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + brent_council_tax_reduction_weekly_earnings: 120 + brent_council_tax_reduction: 540 + council_tax_reduction: 540 + +- name: Brent applies the published weekly earnings band boundaries + period: 2026 + absolute_error_margin: 0.5 + input: + people: + band_80: + age: 35 + employment_income: 4_160 + band_81: + age: 35 + employment_income: 4_212 + band_110: + age: 35 + employment_income: 5_720 + band_151: + age: 35 + employment_income: 7_852 + band_250: + age: 35 + employment_income: 13_000 + benunits: + bu_80: + members: [band_80] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + bu_81: + members: [band_81] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + bu_110: + members: [band_110] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + bu_151: + members: [band_151] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + bu_250: + members: [band_250] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + hh_80: + members: [band_80] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + hh_81: + members: [band_81] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + hh_110: + members: [band_110] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + hh_151: + members: [band_151] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + hh_250: + members: [band_250] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + brent_council_tax_reduction_weekly_earnings: [80, 81, 110, 151, 250] + brent_council_tax_reduction: [1170, 900, 900, 360, 360] + council_tax_reduction: [1170, 900, 900, 360, 360] + +- name: Brent applies no Band D cap to high-liability working-age claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENT + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + brent_council_tax_reduction: 2340 + council_tax_reduction: 2340 + +- name: Brent excludes working-age claimants at the 6,000 pound savings limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 6_000 + output: + brent_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Brent applies the 20 pound weekly working non-dependant deduction after the maximum entitlement + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + brent_council_tax_reduction_non_dep_deductions: [1040, 0] + brent_council_tax_reduction: [130, 0] + council_tax_reduction: 130 + +- name: Brent applies the 8 pound weekly non-working non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BRENT + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + brent_council_tax_reduction_non_dep_deductions: [416, 0] + brent_council_tax_reduction: [754, 0] + council_tax_reduction: 754 + +- name: Bromley working-age claimant receives 50 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 0 + output: + bromley_council_tax_reduction_maximum_eligible_liability: 2_140.04 + bromley_council_tax_reduction: 1_070.02 + simulated_council_tax_reduction_benunit: 1_070.02 + council_tax_reduction: 1_070.02 + council_tax_less_benefit: 1_070.02 + +- name: Bromley caps working-age eligible liability at Band D + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: H + council_tax: 4_280.08 + savings: 0 + output: + bromley_council_tax_reduction_maximum_eligible_liability: 2_140.04 + bromley_council_tax_reduction: 1_070.02 + council_tax_reduction: 1_070.02 + council_tax_less_benefit: 3_210.06 + +- name: Bromley applies a 20 percent taper to annual excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 7_386.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 0 + output: + bromley_council_tax_reduction: 550.02 + council_tax_reduction: 550.02 + +- name: Bromley adds working-age tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 6_250 + output: + bromley_council_tax_reduction_tariff_income: 52 + bromley_council_tax_reduction: 1_059.62 + council_tax_reduction: 1_059.62 + +- name: Bromley excludes non-UC working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 16_001 + output: + bromley_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Bromley applies the gross-income non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant_low: + age: 35 + claimant_mid: + age: 35 + claimant_high: + age: 35 + claimant_not_working: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_mid: + age: 25 + employment_income: 26_000 + hours_worked: 832 + non_dep_high: + age: 25 + employment_income: 31_200 + hours_worked: 832 + non_dep_not_working: + age: 25 + employment_income: 26_000 + hours_worked: 0 + benunits: + low_benunit: + members: [claimant_low] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + low_other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + mid_benunit: + members: [claimant_mid] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + mid_other_benunit: + members: [non_dep_mid] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + high_benunit: + members: [claimant_high] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + high_other_benunit: + members: [non_dep_high] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + not_working_benunit: + members: [claimant_not_working] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + not_working_other_benunit: + members: [non_dep_not_working] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + low_household: + members: [claimant_low, non_dep] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 0 + mid_household: + members: [claimant_mid, non_dep_mid] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 0 + high_household: + members: [claimant_high, non_dep_high] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 0 + not_working_household: + members: [claimant_not_working, non_dep_not_working] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 0 + output: + bromley_council_tax_reduction_non_dep_deductions: + [530.40, 0, 665.60, 0, 798.20, 0, 260, 0] + bromley_council_tax_reduction: + [539.62, 0, 404.42, 0, 271.82, 0, 810.02, 0] + council_tax_reduction: [539.62, 404.42, 271.82, 810.02] + +- name: Bromley makes one non-dependant deduction for ordinary couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 0 + output: + bromley_council_tax_reduction_non_dep_deductions: [798.20, 0] + bromley_council_tax_reduction: [271.82, 0] + council_tax_reduction: 271.82 + +- name: Bromley counts both members of a non-dependant couple where the couple has Universal Credit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 0 + output: + bromley_council_tax_reduction_non_dep_deductions: [1_596.40, 0] + bromley_council_tax_reduction: [0, 0] + council_tax_reduction: 0 + +- name: Bromley uses UC assessed income and UC capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 20_000 + output: + bromley_council_tax_reduction_uc_applicable_income: 14_400 + bromley_council_tax_reduction: 590.02 + council_tax_reduction: 590.02 + +- name: Bromley excludes UC claimants above the UC-assessed capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 16_001 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BROMLEY + council_tax_band: D + council_tax: 2_140.04 + savings: 0 + output: + bromley_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Croydon standard working-age claimant receives 75 percent support in the lowest income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: C + council_tax: 2_311.03 + savings: 0 + output: + croydon_council_tax_reduction_weekly_income: 0 + croydon_council_tax_reduction_maximum_eligible_liability: 2_311.03 + croydon_council_tax_reduction: 1_733.27 + simulated_council_tax_reduction_benunit: 1_733.27 + council_tax_reduction: 1_733.27 + council_tax_less_benefit: 577.76 + +- name: Croydon caps standard working-age eligible liability at Band D + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: E + council_tax: 3_177.67 + savings: 0 + output: + croydon_council_tax_reduction_maximum_eligible_liability: 2_599.91 + croydon_council_tax_reduction: 1_949.93 + council_tax_reduction: 1_949.93 + council_tax_less_benefit: 1_227.74 + +- name: Croydon disabled non-working claimant receives full support without the Band D cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl_category: STANDARD + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: E + council_tax: 3_177.67 + savings: 0 + output: + croydon_council_tax_reduction_disabled_not_working: true + croydon_council_tax_reduction_maximum_eligible_liability: 3_177.67 + croydon_council_tax_reduction: 3_177.67 + council_tax_reduction: 3_177.67 + +- name: Croydon lone parent with child under 5 moves to the 70 percent band at 158 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 8_216 + child: + age: 4 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: CROYDON + council_tax_band: B + council_tax: 2_022.15 + savings: 0 + output: + croydon_council_tax_reduction_weekly_income: 158 + croydon_council_tax_reduction_lone_parent_child_under_5: true + croydon_council_tax_reduction: 1_415.50 + council_tax_reduction: 1_415.50 + +- name: Croydon ignores the Universal Credit housing element when applying income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 16_800 + uc_housing_costs_element: 5_984 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: B + council_tax: 2_022.15 + savings: 0 + output: + croydon_council_tax_reduction_countable_universal_credit: 10_816 + croydon_council_tax_reduction_weekly_income: 208 + croydon_council_tax_reduction: 808.86 + council_tax_reduction: 808.86 + +- name: Croydon excludes standard working-age claimants with capital of at least 8,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: C + council_tax: 2_311.03 + savings: 8_000 + output: + croydon_council_tax_reduction_assessable_capital: 8_000 + croydon_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Croydon uses UC-assessed capital instead of household savings for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 5_200 + uc_housing_costs_element: 5_200 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: C + council_tax: 2_311.03 + savings: 20_000 + output: + croydon_council_tax_reduction_assessable_capital: 1_000 + croydon_council_tax_reduction: 1_733.27 + council_tax_reduction: 1_733.27 + +- name: Croydon excludes UC claimants at the UC-assessed capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 5_200 + uc_housing_costs_element: 5_200 + uc_reported_capital: 8_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: C + council_tax: 2_311.03 + savings: 0 + output: + croydon_council_tax_reduction_assessable_capital: 8_000 + croydon_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Croydon subtracts high non-dependant deductions from the final award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 25_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CROYDON + council_tax_band: D + council_tax: 2_599.91 + savings: 0 + output: + croydon_council_tax_reduction_non_dep_deductions: [1_560, 0] + croydon_council_tax_reduction: [389.93, 0] + council_tax_reduction: 389.93 + +- name: Croydon makes one non-dependant deduction for ordinary couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 12_500 + non_dep_partner: + age: 25 + employment_income: 12_500 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: CROYDON + council_tax_band: D + council_tax: 2_599.91 + savings: 0 + output: + croydon_council_tax_reduction_non_dep_deductions: [1_560, 0] + croydon_council_tax_reduction: [389.93, 0] + council_tax_reduction: 389.93 + +- name: Croydon counts both members of a non-dependant couple where the couple has Universal Credit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 12_500 + non_dep_partner: + age: 25 + employment_income: 12_500 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: CROYDON + council_tax_band: D + council_tax: 2_599.91 + savings: 0 + output: + croydon_council_tax_reduction_non_dep_deductions: [3_120, 0] + croydon_council_tax_reduction: [0, 0] + council_tax_reduction: 0 + +- name: Croydon ignores the first 50 pounds of weekly income for working disabled households + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl_category: STANDARD + partner: + age: 35 + employment_income: 13_520 + income_tax: 0 + national_insurance: 0 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: CROYDON + council_tax_band: D + council_tax: 2_599.91 + savings: 0 + output: + croydon_council_tax_reduction_disabled_not_working: false + croydon_council_tax_reduction_weekly_income: 210 + croydon_council_tax_reduction: 1_039.96 + council_tax_reduction: 1_039.96 + +- name: Croydon applies the not-working deduction to UC non-dependants with no earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CROYDON + council_tax_band: D + council_tax: 2_599.91 + savings: 0 + output: + croydon_council_tax_reduction_non_dep_deductions: [260, 0] + croydon_council_tax_reduction: [1_689.93, 0] + council_tax_reduction: 1_689.93 + +- name: Croydon does not let a disabled non-dependant remove the claimant's Band D cap or non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + pip_dl_category: STANDARD + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CROYDON + council_tax_band: E + council_tax: 3_177.67 + savings: 0 + output: + croydon_council_tax_reduction_maximum_eligible_liability: 2_599.91 + croydon_council_tax_reduction_non_dep_deductions: [260, 0] + croydon_council_tax_reduction: [1_689.93, 0] + council_tax_reduction: 1_689.93 + +- name: Croydon deducts half of pension contributions when calculating weekly net income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 11_336 + income_tax: 0 + national_insurance: 0 + pension_contributions: 1_040 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: D + council_tax: 2_599.91 + savings: 0 + output: + croydon_council_tax_reduction_weekly_income: 208 + croydon_council_tax_reduction: 1_039.96 + council_tax_reduction: 1_039.96 + +- name: Croydon includes UC assessed earned and unearned income while ignoring named UC elements + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 10_400 + uc_earned_income: 2_600 + uc_unearned_income: 1_300 + uc_LCWRA_element: 5_200 + uc_carer_element: 1_040 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: D + council_tax: 2_599.91 + savings: 0 + output: + croydon_council_tax_reduction_countable_universal_credit: 4_680 + croydon_council_tax_reduction_weekly_income: 165 + croydon_council_tax_reduction: 1_559.95 + council_tax_reduction: 1_559.95 + +- name: Croydon treats Armed Forces Independence Payment as a disabled non-working route + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + armed_forces_independence_payment: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CROYDON + council_tax_band: E + council_tax: 3_177.67 + savings: 10_000 + output: + croydon_council_tax_reduction_disabled_not_working: true + croydon_council_tax_reduction_assessable_capital: 10_000 + croydon_council_tax_reduction_maximum_eligible_liability: 3_177.67 + croydon_council_tax_reduction: 3_177.67 + council_tax_reduction: 3_177.67 + +- name: Lewisham working-age claimant receives 75 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 0 + output: + lewisham_council_tax_reduction: 1_678.00 + simulated_council_tax_reduction_benunit: 1_678.00 + council_tax_reduction: 1_678.00 + council_tax_less_benefit: 559.33 + +- name: Lewisham applies support to the full liability without a Band D cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: H + council_tax: 4_474.67 + savings: 0 + output: + lewisham_council_tax_reduction: 3_356.00 + council_tax_reduction: 3_356.00 + +- name: Lewisham applies a 20 percent taper to annual excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_306.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 0 + output: + lewisham_council_tax_reduction: 1_574.00 + council_tax_reduction: 1_574.00 + +- name: Lewisham excludes non-UC working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 16_000.01 + output: + lewisham_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Lewisham uses UC assessed income, a weekly UC earnings disregard, and UC capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_earned_income: 14_400 + uc_unearned_income: 0 + uc_maximum_amount: 12_001 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 20_000 + output: + lewisham_council_tax_reduction_uc_applicable_income: 13_101 + lewisham_council_tax_reduction: 1_458.00 + council_tax_reduction: 1_458.00 + +- name: Lewisham excludes UC claimants above the UC-assessed capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_earned_income: 14_400 + uc_unearned_income: 0 + uc_maximum_amount: 12_001 + uc_reported_capital: 16_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 0 + output: + lewisham_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Lewisham does not use UC assessed capital where there is no UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 0 + uc_earned_income: 14_400 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 20_000 + output: + lewisham_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Lewisham adds working-age tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 6_250 + output: + lewisham_council_tax_reduction_tariff_income: 52 + lewisham_council_tax_reduction: 1_667.60 + council_tax_reduction: 1_667.60 + +- name: Lewisham applies the gross-income non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 0 + output: + lewisham_council_tax_reduction_non_dep_deductions: [522.60, 0] + lewisham_council_tax_reduction: [1_155.40, 0] + council_tax_reduction: 1_155.40 + +- name: Lewisham makes one non-dependant deduction for ordinary couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 0 + output: + lewisham_council_tax_reduction_non_dep_deductions: [785.20, 0] + lewisham_council_tax_reduction: [892.80, 0] + council_tax_reduction: 892.80 + +- name: Lewisham counts both members of a non-dependant couple where the couple has Universal Credit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 0 + output: + lewisham_council_tax_reduction_non_dep_deductions: [1_045.20, 0] + lewisham_council_tax_reduction: [632.80, 0] + council_tax_reduction: 632.80 + +- name: Lewisham applies person-level work status to UC non-dependant couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: LEWISHAM + council_tax_band: D + council_tax: 2_237.33 + savings: 0 + output: + lewisham_council_tax_reduction_non_dep_deductions: [777.40, 0] + lewisham_council_tax_reduction: [900.60, 0] + council_tax_reduction: 900.60 + +- name: Redbridge disability class receives 73 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl_category: STANDARD + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: D + council_tax: 2_294.58 + savings: 0 + output: + redbridge_council_tax_reduction_disability_class: true + redbridge_council_tax_reduction: 1_675.04 + simulated_council_tax_reduction_benunit: 1_675.04 + council_tax_reduction: 1_675.04 + +- name: Redbridge UC not-working claimant with a child receives 60 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: C + council_tax: 2_039.63 + savings: 0 + output: + redbridge_council_tax_reduction_weekly_net_earnings: 0 + redbridge_council_tax_reduction: 1_223.78 + council_tax_reduction: 1_223.78 + +- name: Redbridge working claimant with a child receives 46 percent support below the earnings threshold + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 16_275.48 + income_tax: 0 + national_insurance: 0 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: C + council_tax: 2_039.63 + savings: 0 + output: + redbridge_council_tax_reduction_weekly_net_earnings: 312.99 + redbridge_council_tax_reduction: 938.23 + council_tax_reduction: 938.23 + +- name: Redbridge UC working claimant with a child uses the working earnings class + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 16_275.48 + income_tax: 0 + national_insurance: 0 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: C + council_tax: 2_039.63 + savings: 0 + output: + redbridge_council_tax_reduction_weekly_net_earnings: 312.99 + redbridge_council_tax_reduction: 938.23 + council_tax_reduction: 938.23 + +- name: Redbridge UC claimant with gross work and no net earnings uses the working class + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_200 + income_tax: 5_200 + national_insurance: 0 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: C + council_tax: 2_039.63 + savings: 0 + output: + redbridge_council_tax_reduction_claimant_in_remunerative_work: true + redbridge_council_tax_reduction_weekly_net_earnings: 0 + redbridge_council_tax_reduction: 938.23 + council_tax_reduction: 938.23 + +- name: Redbridge excludes working claimants with children at the strict 313 pound earnings threshold + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 16_276 + income_tax: 0 + national_insurance: 0 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: C + council_tax: 2_039.63 + savings: 0 + output: + redbridge_council_tax_reduction_weekly_net_earnings: 313 + redbridge_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Redbridge excludes working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl_category: STANDARD + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: D + council_tax: 2_294.58 + savings: 16_000.01 + output: + redbridge_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Redbridge contribution-based JSA claimant without work receives 50 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + jsa_contrib_reported: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: D + council_tax: 2_294.58 + savings: 0 + output: + redbridge_council_tax_reduction_claimant_in_remunerative_work: false + redbridge_council_tax_reduction: 1_147.29 + council_tax_reduction: 1_147.29 + +- name: Redbridge applies the 10 pound weekly minimum award after non-dependant deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 5 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, child, non_dep] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: D + council_tax: 2_294.58 + savings: 0 + output: + redbridge_council_tax_reduction_non_dep_deductions: [1_101.36, 0] + redbridge_council_tax_reduction: [0, 0] + council_tax_reduction: 0 + +- name: Redbridge disability class has no non-dependant deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl_category: STANDARD + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: D + council_tax: 2_294.58 + savings: 0 + output: + redbridge_council_tax_reduction_non_dep_deductions: [0, 0] + redbridge_council_tax_reduction: [1_675.04, 0] + council_tax_reduction: 1_675.04 + +- name: Redbridge charges the non-working deduction for an adult student non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + current_education: TERTIARY + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: D + council_tax: 2_294.58 + savings: 0 + output: + redbridge_council_tax_reduction_non_dep_deductions: [550.68, 0] + redbridge_council_tax_reduction: [596.61, 0] + council_tax_reduction: 596.61 + +- name: Redbridge counts both members of a non-dependant couple where the couple has Universal Credit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: D + council_tax: 2_294.58 + savings: 0 + output: + redbridge_council_tax_reduction_non_dep_deductions: [2_202.72, 0] + redbridge_council_tax_reduction: [0, 0] + council_tax_reduction: 0 + +- name: Redbridge makes one deduction for an ordinary non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: REDBRIDGE + council_tax_band: D + council_tax: 2_294.58 + savings: 0 + output: + redbridge_council_tax_reduction_non_dep_deductions: [1_101.36, 0] + redbridge_council_tax_reduction: [0, 0] + council_tax_reduction: 0 + +- name: Bristol working-age claimant receives full support with no excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 0 + output: + bristol_council_tax_reduction: 2_713.68 + simulated_council_tax_reduction_benunit: 2_713.68 + council_tax_reduction: 2_713.68 + council_tax_less_benefit: 0 + +- name: Bristol applies a 20 percent taper to annual excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_826.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 0 + output: + bristol_council_tax_reduction: 2_505.68 + council_tax_reduction: 2_505.68 + +- name: Bristol adds working-age tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 6_250 + output: + bristol_council_tax_reduction_tariff_income: 52 + bristol_council_tax_reduction: 2_703.28 + council_tax_reduction: 2_703.28 + +- name: Bristol excludes non-UC working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 16_000.01 + output: + bristol_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Bristol applies the capital limit to income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 16_000.01 + output: + council_tax_reduction_relevant_income_based_benefit: true + bristol_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Bristol uses UC assessed income and UC capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 20_000 + output: + bristol_council_tax_reduction_uc_applicable_income: 14_400 + bristol_council_tax_reduction: 2_233.68 + council_tax_reduction: 2_233.68 + +- name: Bristol excludes UC claimants above the UC-assessed capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 16_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 0 + output: + bristol_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Bristol applies the gross-income non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 0 + output: + bristol_council_tax_reduction_non_dep_deductions: [551.20, 0] + bristol_council_tax_reduction: [2_162.48, 0] + council_tax_reduction: 2_162.48 + +- name: Bristol bases a single in-work non-dependant deduction on earnings, not other gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + property_income: 10_000 + hours_worked: 520 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 0 + output: + bristol_council_tax_reduction_non_dep_deductions: [551.20, 0] + bristol_council_tax_reduction: [2_162.48, 0] + council_tax_reduction: 2_162.48 + +- name: Bristol waives deductions for source-listed non-dependant exemptions not otherwise modeled + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_200 + hours_worked: 832 + bristol_council_tax_reduction_non_dep_source_exemption: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 0 + output: + bristol_council_tax_reduction_non_dep_deductions: [0, 0] + bristol_council_tax_reduction: [2_713.68, 0] + council_tax_reduction: 2_713.68 + +- name: Bristol waives deductions for source-listed claimant exemptions not otherwise modeled + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + bristol_council_tax_reduction_claimant_source_non_dep_exemption: true + non_dep: + age: 25 + employment_income: 31_200 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 0 + output: + bristol_council_tax_reduction_non_dep_deductions: [0, 0] + bristol_council_tax_reduction: [2_713.68, 0] + council_tax_reduction: 2_713.68 + +- name: Bristol makes one deduction for a non-dependant couple using their joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 0 + output: + bristol_council_tax_reduction_non_dep_deductions: [691.60, 0] + bristol_council_tax_reduction: [2_022.08, 0] + council_tax_reduction: 2_022.08 + +- name: Bristol includes countable benefits in a non-dependant couple's gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: BRISTOL + council_tax_band: D + council_tax: 2_713.68 + savings: 0 + output: + bristol_council_tax_reduction_non_dep_deductions: [691.60, 0] + bristol_council_tax_reduction: [2_022.08, 0] + council_tax_reduction: 2_022.08 + +- name: Cumberland working-age claimant receives full support with no excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 0 + output: + cumberland_council_tax_reduction: 2_444.72 + simulated_council_tax_reduction_benunit: 2_444.72 + council_tax_reduction: 2_444.72 + council_tax_less_benefit: 0 + +- name: Cumberland applies a 20 percent taper to annual excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_826.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 0 + output: + cumberland_council_tax_reduction: 2_236.72 + council_tax_reduction: 2_236.72 + +- name: Cumberland adds working-age tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 6_250 + output: + cumberland_council_tax_reduction_tariff_income: 52 + cumberland_council_tax_reduction: 2_434.32 + council_tax_reduction: 2_434.32 + +- name: Cumberland tariff income only counts complete 250 pound capital blocks + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 6_000.01 + output: + cumberland_council_tax_reduction_tariff_income: 0 + cumberland_council_tax_reduction: 2_444.72 + council_tax_reduction: 2_444.72 + +- name: Cumberland applies the capital limit to income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 16_000.01 + output: + council_tax_reduction_relevant_income_based_benefit: true + cumberland_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Cumberland uses UC assessed income and UC capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 20_000 + output: + cumberland_council_tax_reduction_uc_applicable_income: 14_400 + cumberland_council_tax_reduction: 1_964.72 + council_tax_reduction: 1_964.72 + +- name: Cumberland applies the remunerative-work non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 0 + output: + cumberland_council_tax_reduction_non_dep_deductions: [551.20, 0] + cumberland_council_tax_reduction: [1_893.52, 0] + council_tax_reduction: 1_893.52 + +- name: Cumberland treats low-hours positive earnings as not remunerative work + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 520 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 0 + output: + cumberland_council_tax_reduction_non_dep_deductions: [270.40, 0] + cumberland_council_tax_reduction: [2_174.32, 0] + council_tax_reduction: 2_174.32 + +- name: Cumberland keeps a working-age claimant in local rules with a pension-age non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pensioner_non_dep: + age: 75 + benunits: + benunit: + members: [claimant] + benunit_contains_household_head: true + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [pensioner_non_dep] + benunit_contains_household_head: false + claims_all_entitled_benefits: false + would_claim_pc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 75 + benefits_premiums: 0 + households: + household: + members: [claimant, pensioner_non_dep] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: false + cumberland_council_tax_reduction_non_dep_deductions: [270.40, 0] + cumberland_council_tax_reduction: [2_174.32, 0] + council_tax_reduction: 2_174.32 + +- name: Cumberland waives deductions for source-listed non-dependant exemptions not otherwise modeled + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_200 + hours_worked: 832 + cumberland_council_tax_reduction_non_dep_source_exemption: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 0 + output: + cumberland_council_tax_reduction_non_dep_deductions: [0, 0] + cumberland_council_tax_reduction: [2_444.72, 0] + council_tax_reduction: 2_444.72 + +- name: Cumberland includes countable benefits in a non-dependant couple's gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: CUMBERLAND + council_tax_band: D + council_tax: 2_444.72 + savings: 0 + output: + cumberland_council_tax_reduction_non_dep_deductions: [691.60, 0] + cumberland_council_tax_reduction: [1_753.12, 0] + council_tax_reduction: 1_753.12 + +- name: Coventry awards 80 percent support when weekly excess income is below 15 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 10_779.48 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + output: + coventry_council_tax_reduction_support_rate: 0.8 + coventry_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + +- name: Coventry awards 65 percent support at 15 pounds weekly excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 10_780 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + coventry_council_tax_reduction_support_rate: 0.65 + coventry_council_tax_reduction: 1_170 + council_tax_reduction: 1_170 + +- name: Coventry uses UC assessed income plus award for the excess-income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_earned_income: 9_780 + uc_unearned_income: 0 + uc_maximum_amount: 10_000 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + coventry_council_tax_reduction_uc_applicable_income: 10_780 + coventry_council_tax_reduction_support_rate: 0.65 + coventry_council_tax_reduction: 1_170 + simulated_council_tax_reduction_benunit: 1_170 + council_tax_reduction: 1_170 + +- name: Coventry awards 40 percent support at 40 pounds weekly excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 12_080 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + coventry_council_tax_reduction_support_rate: 0.4 + coventry_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: Coventry awards 20 percent support at 70 pounds weekly excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 13_640 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + coventry_council_tax_reduction_support_rate: 0.2 + coventry_council_tax_reduction: 360 + council_tax_reduction: 360 + +- name: Coventry awards no support at 80 pounds weekly excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 14_160 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + coventry_council_tax_reduction_support_rate: 0 + coventry_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Coventry excludes applicants with capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 10_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 16_000.01 + output: + coventry_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Coventry deducts the non-working non-dependant amount from the award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 10_000 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + coventry_council_tax_reduction_non_dep_deductions: [270.40, 0] + coventry_council_tax_reduction: [1_169.60, 0] + council_tax_reduction: 1_169.60 + +- name: Coventry uses gross-income non-dependant bands without a 16-hour work gate + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + weekly_hours: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 10_000 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + coventry_council_tax_reduction_non_dep_deductions: [551.20, 0] + coventry_council_tax_reduction: [888.80, 0] + council_tax_reduction: 888.80 + +- name: Coventry applies one non-dependant deduction for a couple using joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 25 + employment_income: 10_400 + non_dep_2: + age: 25 + private_pension_income: 5_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 10_000 + other_benunit: + members: [non_dep_1, non_dep_2] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + coventry_council_tax_reduction_non_dep_deductions: [551.20, 0] + coventry_council_tax_reduction: [888.80, 0] + council_tax_reduction: 888.80 + +- name: Coventry exempts UC non-dependants whose UC award has no earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + coventry_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 10_000 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + coventry_council_tax_reduction_non_dep_deductions: [0, 0] + coventry_council_tax_reduction: [1_440, 0] + council_tax_reduction: 1_440 + +- name: Coventry keeps pension-age UC claimants in the local excess-income scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 10_000 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + council_tax_reduction_household_has_pensioner: true + coventry_council_tax_reduction_is_local_scheme: true + coventry_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + +- name: Coventry keeps mixed-age couples with a working-age applicant in the local scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + partner: + age: 67 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 10_000 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + coventry_council_tax_reduction_is_local_scheme: true + coventry_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + +- name: Coventry keeps pension-age income-based benefit claimants in the local excess-income scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + income_support: 1_000 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 20_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COVENTRY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + coventry_council_tax_reduction_is_local_scheme: true + coventry_council_tax_reduction_support_rate: 0.8 + coventry_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + +- name: Cotswold awards full support at the top of the single Band 1 income range + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 8_032.96 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_weekly_income: 154.48 + cotswold_council_tax_reduction_support_rate: 1 + cotswold_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Cotswold awards 80 percent support at the first penny above single Band 1 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 8_033.48 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_weekly_income: 154.49 + cotswold_council_tax_reduction_support_rate: 0.8 + cotswold_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Cotswold awards 60 percent support at the first penny above single Band 2 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 10_633.48 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_weekly_income: 204.49 + cotswold_council_tax_reduction_support_rate: 0.6 + cotswold_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Cotswold selects the lone parent three-child income-band column + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 13_388.96 + child_1: + age: 5 + child_2: + age: 7 + child_3: + age: 9 + benunits: + benunit: + members: [claimant, child_1, child_2, child_3] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child_1, child_2, child_3] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_weekly_income: 257.48 + cotswold_council_tax_reduction_support_rate: 0.8 + cotswold_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Cotswold selects the couple four-or-more-child income-band column + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 19_339.32 + partner: + age: 35 + child_1: + age: 5 + child_2: + age: 7 + child_3: + age: 9 + child_4: + age: 11 + benunits: + benunit: + members: [claimant, partner, child_1, child_2, child_3, child_4] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner, child_1, child_2, child_3, child_4] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_weekly_income: 371.91 + cotswold_council_tax_reduction_support_rate: 0.8 + cotswold_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Cotswold awards no support above the single Band 5 income range + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 18_434 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_weekly_income: 354.50 + cotswold_council_tax_reduction_support_rate: 0 + cotswold_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Cotswold allows exactly 10,000 pounds of capital but excludes one penny above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + claimant_over: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + over_limit: + members: [claimant_over] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 10_000 + over_limit_household: + members: [claimant_over] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 10_000.01 + output: + cotswold_council_tax_reduction: [1_800, 0] + council_tax_reduction: [1_800, 0] + +- name: Cotswold adds tariff income for each part 250 pounds above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 6_250.01 + output: + cotswold_council_tax_reduction_tariff_income: 104 + cotswold_council_tax_reduction_weekly_income: 2 + cotswold_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Cotswold caps Band H liability at the Band E equivalent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + cotswold_council_tax_reduction_maximum_eligible_liability: 2_200 + cotswold_council_tax_reduction: 2_200 + council_tax_reduction: 2_200 + +- name: Cotswold deducts the non-working non-dependant amount before applying the support percentage + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_non_dep_deductions: [270.40, 0] + cotswold_council_tax_reduction: [1_529.60, 0] + council_tax_reduction: 1_529.60 + +- name: Cotswold uses the remunerative-work non-dependant gross income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_non_dep_deductions: [551.20, 0] + cotswold_council_tax_reduction: [1_248.80, 0] + council_tax_reduction: 1_248.80 + +- name: Cotswold treats low-hours positive non-dependant earnings as not remunerative work + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + weekly_hours: 15 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_non_dep_deductions: [270.40, 0] + cotswold_council_tax_reduction: [1_529.60, 0] + council_tax_reduction: 1_529.60 + +- name: Cotswold exempts UC non-dependants whose UC calculation has no earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + weekly_hours: 16 + cotswold_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_non_dep_deductions: [0, 0] + cotswold_council_tax_reduction: [1_800, 0] + council_tax_reduction: 1_800 + +- name: Cotswold does not let adult qualifying young people trigger claimant non-dependant exemptions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + young_person: + age: 18 + current_education: POST_SECONDARY + pip_dl: 1_000 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant, young_person] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, young_person, non_dep] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_non_dep_deductions: [270.40, 0] + cotswold_council_tax_reduction: [1_529.60, 0] + council_tax_reduction: 1_529.60 + +- name: Cotswold protected group applies a 20 percent taper instead of income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 10_520 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + cotswold_council_tax_reduction_source_protected_group: true + council_tax_reduction_applicable_amount: 10_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_weekly_income: 202.31 + cotswold_council_tax_reduction_support_rate: 0.8 + cotswold_council_tax_reduction_protected_group: true + cotswold_council_tax_reduction: 1_696 + council_tax_reduction: 1_696 + +- name: Cotswold applies the source additional earnings disregard + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 9_182.16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + cotswold_council_tax_reduction_source_additional_earnings_disregard: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_earnings_disregard: 22.10 + cotswold_council_tax_reduction_weekly_income: 154.48 + cotswold_council_tax_reduction_support_rate: 1 + cotswold_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Cotswold uses UC assessed income before earnings disregard plus the adjusted UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_housing_costs_element: 500 + uc_unearned_income: 0 + uc_assessable_capital: 0 + cotswold_council_tax_reduction_uc_earned_income_before_disregard: 7_793.48 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + cotswold_council_tax_reduction_weekly_income: 154.49 + cotswold_council_tax_reduction_support_rate: 0.8 + cotswold_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + +- name: Cotswold disregards UC transitional protection from the UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_housing_costs_element: 500 + uc_unearned_income: 0 + uc_assessable_capital: 0 + cotswold_council_tax_reduction_uc_earned_income_before_disregard: 7_793.48 + cotswold_council_tax_reduction_uc_transitional_protection: 500 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + cotswold_council_tax_reduction_weekly_income: 144.87 + cotswold_council_tax_reduction_support_rate: 1 + cotswold_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Cotswold applies the UC-assessed capital limit for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_unearned_income: 0 + uc_assessable_capital: 10_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cotswold_council_tax_reduction_support_rate: 1 + cotswold_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Cotswold protected UC claimants use the UC maximum amount as the applicable amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 10_520 + universal_credit_pre_benefit_cap: 10_520 + uc_maximum_amount: 10_000 + uc_unearned_income: 0 + uc_assessable_capital: 0 + cotswold_council_tax_reduction_source_protected_group: true + council_tax_reduction_applicable_amount: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + cotswold_council_tax_reduction_weekly_income: 202.31 + cotswold_council_tax_reduction_protected_group: true + cotswold_council_tax_reduction: 1_696 + council_tax_reduction: 1_696 + +- name: Cotswold keeps mixed-age couples with a working-age applicant in the local scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + partner: + age: 67 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + cotswold_council_tax_reduction_is_local_scheme: true + cotswold_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Cotswold keeps pension-age UC claimants in the local scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_unearned_income: 0 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COTSWOLD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + council_tax_reduction_household_has_pensioner: true + cotswold_council_tax_reduction_is_local_scheme: true + cotswold_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Herefordshire provides full working-age CTR when income does not exceed the applicable amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction: 2_500 + simulated_council_tax_reduction_benunit: 2_500 + council_tax_reduction: 2_500 + council_tax_less_benefit: 0 + +- name: Herefordshire applies a 20 percent taper to excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_826.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction: 2_292 + council_tax_reduction: 2_292 + +- name: Herefordshire allows exactly 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 6_000 + output: + herefordshire_council_tax_reduction: 2_500 + council_tax_reduction: 2_500 + +- name: Herefordshire applies the strict 6,000 pound capital limit to income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 6_000.01 + output: + council_tax_reduction_relevant_income_based_benefit: true + herefordshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Herefordshire uses UC assessed income and UC capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 20_000 + output: + herefordshire_council_tax_reduction_uc_applicable_income: 14_400 + herefordshire_council_tax_reduction: 2_020 + council_tax_reduction: 2_020 + +- name: Herefordshire local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + herefordshire_council_tax_reduction_is_local_scheme: true + herefordshire_council_tax_reduction: 2_500 + simulated_council_tax_reduction_benunit: 2_500 + council_tax_reduction: 2_500 + +- name: Herefordshire applies the 6,000 pound capital limit to UC-assessed capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 6_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + uc_assessable_capital: 6_000.01 + herefordshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Herefordshire applies the remunerative-work non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction_non_dep_deductions: [522.60, 0] + herefordshire_council_tax_reduction: [1_977.40, 0] + council_tax_reduction: 1_977.40 + +- name: Herefordshire treats low-hours positive earnings as not remunerative work + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 520 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction_non_dep_deductions: [254.80, 0] + herefordshire_council_tax_reduction: [2_245.20, 0] + council_tax_reduction: 2_245.20 + +- name: Herefordshire applies the top non-dependant deduction band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_200 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction_non_dep_deductions: [785.20, 0] + herefordshire_council_tax_reduction: [1_714.80, 0] + council_tax_reduction: 1_714.80 + +- name: Herefordshire waives non-dependant deductions when the claimant receives PIP daily living + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1 + non_dep: + age: 25 + employment_income: 31_200 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction_non_dep_deductions: [0, 0] + herefordshire_council_tax_reduction: [2_500, 0] + council_tax_reduction: 2_500 + +- name: Herefordshire exempts non-dependants on income-based benefits + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_200 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + jsa_income: 1 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction_non_dep_deductions: [0, 0] + herefordshire_council_tax_reduction: [2_500, 0] + council_tax_reduction: 2_500 + +- name: Herefordshire exempts UC non-dependants with no earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 6_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction_non_dep_deductions: [0, 0] + herefordshire_council_tax_reduction: [2_500, 0] + council_tax_reduction: 2_500 + +- name: Herefordshire exempts full-time student non-dependants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_200 + hours_worked: 832 + current_education: TERTIARY + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction_non_dep_deductions: [0, 0] + herefordshire_council_tax_reduction: [2_500, 0] + council_tax_reduction: 2_500 + +- name: Herefordshire waives deductions for source-listed non-dependant exemptions not otherwise modeled + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_200 + hours_worked: 832 + herefordshire_council_tax_reduction_non_dep_source_exemption: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction_non_dep_deductions: [0, 0] + herefordshire_council_tax_reduction: [2_500, 0] + council_tax_reduction: 2_500 + +- name: Herefordshire includes countable benefits in a non-dependant couple's gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: HEREFORDSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + herefordshire_council_tax_reduction_non_dep_deductions: [655.20, 0] + herefordshire_council_tax_reduction: [1_844.80, 0] + council_tax_reduction: 1_844.80 + +- name: Westmorland and Furness provides full working-age CTR when income does not exceed the applicable amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction: 2_500 + simulated_council_tax_reduction_benunit: 2_500 + council_tax_reduction: 2_500 + +- name: Westmorland and Furness applies a 20 percent taper to excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_826.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction: 2_292 + council_tax_reduction: 2_292 + +- name: Westmorland and Furness rounds partial capital tariff blocks up + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 6_000.01 + output: + westmorland_and_furness_council_tax_reduction_tariff_income: 52 + westmorland_and_furness_council_tax_reduction: 2_489.60 + council_tax_reduction: 2_489.60 + +- name: Westmorland and Furness excludes working-age claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 16_000.01 + output: + westmorland_and_furness_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Westmorland and Furness disregards capital for income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 20_000 + output: + council_tax_reduction_relevant_income_based_benefit: true + westmorland_and_furness_council_tax_reduction_tariff_income: 0 + westmorland_and_furness_council_tax_reduction: 2_500 + council_tax_reduction: 2_500 + +- name: Westmorland and Furness uses UC assessed income and UC capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 20_000 + output: + westmorland_and_furness_council_tax_reduction_uc_applicable_income: 14_400 + westmorland_and_furness_council_tax_reduction: 2_020 + council_tax_reduction: 2_020 + +- name: Westmorland and Furness excludes UC claimants over the UC-assessed capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 16_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + uc_assessable_capital: 16_000.01 + westmorland_and_furness_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Westmorland and Furness local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + westmorland_and_furness_council_tax_reduction_is_local_scheme: true + westmorland_and_furness_council_tax_reduction: 2_500 + simulated_council_tax_reduction_benunit: 2_500 + council_tax_reduction: 2_500 + +- name: Westmorland and Furness applies the remunerative-work non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction_non_dep_deductions: [551.20, 0] + westmorland_and_furness_council_tax_reduction: [1_948.80, 0] + council_tax_reduction: 1_948.80 + +- name: Westmorland and Furness treats low-hours positive earnings as not remunerative work + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 520 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction_non_dep_deductions: [270.40, 0] + westmorland_and_furness_council_tax_reduction: [2_229.60, 0] + council_tax_reduction: 2_229.60 + +- name: Westmorland and Furness applies the top non-dependant deduction band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction_non_dep_deductions: [829.40, 0] + westmorland_and_furness_council_tax_reduction: [1_670.60, 0] + council_tax_reduction: 1_670.60 + +- name: Westmorland and Furness waives non-dependant deductions when the claimant receives PIP daily living + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction_non_dep_deductions: [0, 0] + westmorland_and_furness_council_tax_reduction: [2_500, 0] + council_tax_reduction: 2_500 + +- name: Somerset gives Band D full support to a single working-age claimant with no income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + somerset_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + council_tax_less_benefit: 0 + +- name: Somerset caps Band H zero-income support at the Band D liability + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + somerset_council_tax_reduction_maximum_eligible_liability: 1_800 + somerset_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Somerset applies the 25 pound earnings disregard before selecting the income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_916 + income_tax: 0 + national_insurance: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_weekly_income: 108 + somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Somerset applies the 30 pound disability income disregard before selecting the income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1 + miscellaneous_income: 10_140 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_disabled_income_disregard: true + somerset_council_tax_reduction_weekly_income: 165 + somerset_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Somerset disregards Housing Benefit and Carer's Allowance from weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + carers_allowance: 5_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + housing_benefit: 5_200 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_weekly_income: 0 + somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Somerset disregards Carer's Allowance from UC unearned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + carers_allowance: 6_240 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 5_200 + uc_housing_costs_element: 5_200 + uc_unearned_income: 6_240 + uc_assessable_capital: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_weekly_income: 0 + somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Somerset disregards the source-specified ESA support component + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + esa_contrib: 6_240 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + somerset_council_tax_reduction_esa_support_component: 6_240 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_weekly_income: 0 + somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Somerset places a single claimant with 180 pounds weekly income in Band 3 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 9_360 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_weekly_income: 180 + somerset_council_tax_reduction: 450 + council_tax_reduction: 450 + +- name: Somerset family bands count qualifying young people and exclude their earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 15_600 + child: + age: 8 + young_person: + age: 18 + current_education: POST_SECONDARY + employment_income: 30_000 + benunits: + benunit: + members: [claimant, child, young_person] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child, young_person] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_weekly_income: 300 + somerset_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Somerset deducts one non-dependant couple amount after applying the support percentage + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 9_360 + non_dep: + age: 25 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 5_000 + savings: 0 + output: + somerset_council_tax_reduction_non_dep_deductions: [520, 0] + somerset_council_tax_reduction: [730, 0] + council_tax_reduction: 730 + +- name: Somerset waives deductions for source-defined non-dependant exclusions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + somerset_council_tax_reduction_non_dep_source_exemption: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_non_dep_deductions: [0, 0] + somerset_council_tax_reduction: [1_800, 0] + council_tax_reduction: 1_800 + +- name: Somerset allows ordinary claimants with exactly 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Somerset excludes ordinary claimants with capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + somerset_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Somerset disregards passported capital up to 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + income_support: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + output: + somerset_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Somerset uses UC assessed income and capital and disregards the UC housing element + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 6_000 + uc_earned_income: 5_200 + uc_unearned_income: 0 + uc_housing_costs_element: 4_000 + uc_assessable_capital: 5_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 10_000 + output: + somerset_council_tax_reduction_weekly_income: 113.46 + somerset_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Somerset excludes UC claimants with UC-assessed capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + uc_assessable_capital: 6_000.01 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Somerset local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + uc_assessable_capital: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_is_local_scheme: true + somerset_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Somerset keeps relevant-period pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + uc_assessable_capital: 0 + somerset_council_tax_reduction_uc_relevant_period_pensioner: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOMERSET + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + somerset_council_tax_reduction_is_local_scheme: false + somerset_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: North Yorkshire gives Band A full support to a single working-age claimant with no income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + north_yorkshire_council_tax_reduction_weekly_income: 0 + north_yorkshire_council_tax_reduction: 2_500 + simulated_council_tax_reduction_benunit: 2_500 + council_tax_reduction: 2_500 + +- name: North Yorkshire does not apply a working-age non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + north_yorkshire_council_tax_reduction: [2_500, 0] + council_tax_reduction: 2_500 + +- name: North Yorkshire disregards Housing Benefit when calculating weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + housing_benefit: 12_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + north_yorkshire_council_tax_reduction_weekly_income: 0 + north_yorkshire_council_tax_reduction: 2_500 + council_tax_reduction: 2_500 + +- name: North Yorkshire places a single claimant with 180 pounds weekly income in Band B + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + private_pension_income: 9_360 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + north_yorkshire_council_tax_reduction_weekly_income: 180 + north_yorkshire_council_tax_reduction: 1_875 + council_tax_reduction: 1_875 + +- name: North Yorkshire applies the single earnings disregard before selecting the income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 14_560 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + north_yorkshire_council_tax_reduction_weekly_income: 255 + north_yorkshire_council_tax_reduction: 1_250 + council_tax_reduction: 1_250 + +- name: North Yorkshire uses the formal two-child family boundary at 441.01 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + private_pension_income: 22_932.52 + child_1: + age: 8 + child_2: + age: 10 + benunits: + benunit: + members: [claimant, child_1, child_2] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child_1, child_2] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + north_yorkshire_council_tax_reduction_weekly_income: 441.01 + north_yorkshire_council_tax_reduction: 625 + council_tax_reduction: 625 + +- name: North Yorkshire family bands count qualifying young people as dependants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + private_pension_income: 22_932.52 + child: + age: 8 + qualifying_young_person: + age: 18 + current_education: POST_SECONDARY + benunits: + benunit: + members: [claimant, child, qualifying_young_person] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child, qualifying_young_person] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + is_qualifying_young_person_for_child_benefit: [false, false, true] + north_yorkshire_council_tax_reduction_weekly_income: 441.01 + north_yorkshire_council_tax_reduction: 625 + council_tax_reduction: 625 + +- name: North Yorkshire excludes ordinary claimants with exactly 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 6_000 + output: + north_yorkshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: North Yorkshire disregards passported capital up to 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 10_000 + output: + council_tax_reduction_relevant_income_based_benefit: true + north_yorkshire_council_tax_reduction: 2_500 + council_tax_reduction: 2_500 + +- name: North Yorkshire excludes passported claimants above the 16,000 pound capital disregard + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 16_000.01 + output: + council_tax_reduction_relevant_income_based_benefit: true + north_yorkshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: North Yorkshire uses UC assessed income and capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_housing_costs_element: 0 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 20_000 + output: + north_yorkshire_council_tax_reduction_uc_weekly_income: 276.923 + north_yorkshire_council_tax_reduction_weekly_income: 276.923 + north_yorkshire_council_tax_reduction: 625 + council_tax_reduction: 625 + +- name: North Yorkshire proportionally disregards the UC housing element where UC is below maximum + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 3_000 + uc_maximum_amount: 12_000 + uc_earned_income: 14_000 + uc_unearned_income: 0 + uc_housing_costs_element: 5_200 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + north_yorkshire_council_tax_reduction_uc_weekly_income: 301.923 + north_yorkshire_council_tax_reduction_weekly_income: 301.92 + north_yorkshire_council_tax_reduction: 625 + council_tax_reduction: 625 + +- name: North Yorkshire excludes UC claimants with UC-assessed capital of exactly 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 6_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + uc_assessable_capital: 6_000 + north_yorkshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: North Yorkshire local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + north_yorkshire_council_tax_reduction_is_local_scheme: true + north_yorkshire_council_tax_reduction: 2_500 + simulated_council_tax_reduction_benunit: 2_500 + council_tax_reduction: 2_500 + +- name: North Yorkshire keeps relevant-period pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + north_yorkshire_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_YORKSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + north_yorkshire_council_tax_reduction_is_local_scheme: false + north_yorkshire_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 2_500 + council_tax_reduction: 2_500 + +- name: Kingston upon Hull provides 80 percent working-age CTR when income does not exceed the applicable amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction: 2_000 + simulated_council_tax_reduction_benunit: 2_000 + council_tax_reduction: 2_000 + +- name: Kingston upon Hull applies a 20 percent taper to excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_826.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction: 1_792 + council_tax_reduction: 1_792 + +- name: Kingston upon Hull allows exactly 6,000 pounds of working-age capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 6_000 + output: + kingston_upon_hull_council_tax_reduction: 2_000 + council_tax_reduction: 2_000 + +- name: Kingston upon Hull disregards capital for income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 6_000.01 + output: + council_tax_reduction_relevant_income_based_benefit: true + kingston_upon_hull_council_tax_reduction: 2_000 + council_tax_reduction: 2_000 + +- name: Kingston upon Hull uses UC assessed income and UC capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 20_000 + output: + kingston_upon_hull_council_tax_reduction_uc_applicable_income: 14_400 + kingston_upon_hull_council_tax_reduction: 1_520 + council_tax_reduction: 1_520 + +- name: Kingston upon Hull excludes UC claimants over the UC-assessed capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 6_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + uc_assessable_capital: 6_000.01 + kingston_upon_hull_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Kingston upon Hull local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + kingston_upon_hull_council_tax_reduction_is_local_scheme: true + kingston_upon_hull_council_tax_reduction: 2_000 + simulated_council_tax_reduction_benunit: 2_000 + council_tax_reduction: 2_000 + +- name: Kingston upon Hull keeps relevant-period pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + kingston_upon_hull_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + kingston_upon_hull_council_tax_reduction_is_local_scheme: false + kingston_upon_hull_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 2_500 + council_tax_reduction: 2_500 + +- name: Kingston upon Hull applies the remunerative-work non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [530.40, 0] + kingston_upon_hull_council_tax_reduction: [1_575.68, 0] + council_tax_reduction: 1_575.68 + +- name: Kingston upon Hull treats low-hours positive earnings as not remunerative work + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 520 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [260, 0] + kingston_upon_hull_council_tax_reduction: [1_792, 0] + council_tax_reduction: 1_792 + +- name: Kingston upon Hull infers UC non-dependant remunerative work from UC assessed earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1 + uc_earned_income: 1 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [530.40, 0] + kingston_upon_hull_council_tax_reduction: [1_575.68, 0] + council_tax_reduction: 1_575.68 + +- name: Kingston upon Hull keeps exactly 577 pounds weekly non-dependant income below the top band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 30_004 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [665.60, 0] + kingston_upon_hull_council_tax_reduction: [1_467.52, 0] + council_tax_reduction: 1_467.52 + +- name: Kingston upon Hull applies the top non-dependant band above 577 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 30_005 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [798.20, 0] + kingston_upon_hull_council_tax_reduction: [1_361.44, 0] + council_tax_reduction: 1_361.44 + +- name: Kingston upon Hull waives non-dependant deductions when the claimant receives PIP daily living + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1 + non_dep: + age: 25 + employment_income: 30_005 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [0, 0] + kingston_upon_hull_council_tax_reduction: [2_000, 0] + council_tax_reduction: 2_000 + +- name: Kingston upon Hull exempts UC non-dependants with no assessed earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 30_005 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 6_000 + uc_earned_income: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [0, 0] + kingston_upon_hull_council_tax_reduction: [2_000, 0] + council_tax_reduction: 2_000 + +- name: Kingston upon Hull exempts full-time student non-dependants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 30_005 + hours_worked: 832 + current_education: TERTIARY + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [0, 0] + kingston_upon_hull_council_tax_reduction: [2_000, 0] + council_tax_reduction: 2_000 + +- name: Kingston upon Hull waives deductions for source-listed non-dependant exemptions not otherwise modeled + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 30_005 + hours_worked: 832 + kingston_upon_hull_council_tax_reduction_non_dep_source_exemption: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [0, 0] + kingston_upon_hull_council_tax_reduction: [2_000, 0] + council_tax_reduction: 2_000 + +- name: Kingston upon Hull waives deductions for source-listed claimant exemptions not otherwise modeled + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + kingston_upon_hull_council_tax_reduction_claimant_source_non_dep_exemption: true + non_dep: + age: 25 + employment_income: 30_005 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [0, 0] + kingston_upon_hull_council_tax_reduction: [2_000, 0] + council_tax_reduction: 2_000 + +- name: Kingston upon Hull uses joint gross income for a non-dependant couple's single deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + tax_credits: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: KINGSTON_UPON_HULL + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + kingston_upon_hull_council_tax_reduction_non_dep_deductions: [665.60, 0] + kingston_upon_hull_council_tax_reduction: [1_467.52, 0] + council_tax_reduction: 1_467.52 + +- name: Westmorland and Furness waives deductions for source-listed non-dependant exemptions not otherwise modeled + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + westmorland_and_furness_council_tax_reduction_non_dep_source_exemption: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction_non_dep_deductions: [0, 0] + westmorland_and_furness_council_tax_reduction: [2_500, 0] + council_tax_reduction: 2_500 + +- name: Westmorland and Furness uses all gross income for a non-dependant couple's single deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + tax_credits: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction_non_dep_deductions: [691.60, 0] + westmorland_and_furness_council_tax_reduction: [1_808.40, 0] + council_tax_reduction: 1_808.40 + +- name: Westmorland and Furness applies separate non-dependant deductions to UC couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction_non_dep_deductions: [1_383.20, 0] + westmorland_and_furness_council_tax_reduction: [1_116.80, 0] + council_tax_reduction: 1_116.80 + +- name: Westmorland and Furness uses UC assessed earnings for the non-dependant no-earned-income exemption + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 6_000 + uc_earned_income: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WESTMORLAND_AND_FURNESS + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + westmorland_and_furness_council_tax_reduction_non_dep_deductions: [0, 0] + westmorland_and_furness_council_tax_reduction: [2_500, 0] + council_tax_reduction: 2_500 + +- name: North Northamptonshire gives 75 percent support to a working-age claimant with no income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + north_northamptonshire_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: North Northamptonshire applies the 20 percent taper to excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_826.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + north_northamptonshire_council_tax_reduction: 1_142 + council_tax_reduction: 1_142 + +- name: North Northamptonshire rounds partial capital tariff blocks up + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + north_northamptonshire_council_tax_reduction_tariff_income: 52 + north_northamptonshire_council_tax_reduction: 1_339.60 + council_tax_reduction: 1_339.60 + +- name: North Northamptonshire allows ordinary claimants with exactly 16,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + output: + north_northamptonshire_council_tax_reduction: 934 + council_tax_reduction: 934 + +- name: North Northamptonshire excludes ordinary claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 16_000.01 + output: + north_northamptonshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: North Northamptonshire disregards capital for income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + income_support: 6_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 100_000 + output: + north_northamptonshire_council_tax_reduction_tariff_income: 0 + north_northamptonshire_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: North Northamptonshire uses UC assessed income and capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + uc_earned_income: 1_040 + uc_maximum_amount: 1_000 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 50_000 + output: + north_northamptonshire_council_tax_reduction_uc_applicable_income: 2_040 + north_northamptonshire_council_tax_reduction: 1_142 + council_tax_reduction: 1_142 + +- name: North Northamptonshire uses the pre-deduction UC award for UC applicable income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 1_000 + universal_credit_pre_benefit_cap: 1_200 + benefit_cap_reduction: 200 + uc_earned_income: 1_040 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + universal_credit: 1_000 + north_northamptonshire_council_tax_reduction_uc_applicable_income: 2_240 + north_northamptonshire_council_tax_reduction: 1_102 + council_tax_reduction: 1_102 + +- name: North Northamptonshire excludes UC claimants over the UC-assessed capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + uc_maximum_amount: 1_000 + uc_assessable_capital: 16_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + north_northamptonshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: North Northamptonshire applies the top remunerative-work non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + north_northamptonshire_council_tax_reduction_non_dep_deductions: [829.40, 0] + north_northamptonshire_council_tax_reduction: [520.60, 0] + council_tax_reduction: 520.60 + +- name: North Northamptonshire treats low-hours positive earnings as not remunerative work + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 780 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + north_northamptonshire_council_tax_reduction_non_dep_deductions: [270.40, 0] + north_northamptonshire_council_tax_reduction: [1_079.60, 0] + council_tax_reduction: 1_079.60 + +- name: North Northamptonshire uses joint gross income for a non-dependant couple's single deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + tax_credits: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + north_northamptonshire_council_tax_reduction_non_dep_deductions: [691.60, 0] + north_northamptonshire_council_tax_reduction: [1_183.40, 0] + council_tax_reduction: 1_183.40 + +- name: North Northamptonshire applies separate non-dependant deductions to two-earner UC couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + north_northamptonshire_council_tax_reduction_non_dep_deductions: [1_102.40, 0] + north_northamptonshire_council_tax_reduction: [772.60, 0] + council_tax_reduction: 772.60 + +- name: North Northamptonshire exempts the no-earned member of a mixed UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + north_northamptonshire_council_tax_reduction_non_dep_uc_earned_income: 31_720 + non_dep_partner: + age: 25 + north_northamptonshire_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + north_northamptonshire_council_tax_reduction_non_dep_deductions: [829.40, 0] + north_northamptonshire_council_tax_reduction: [1_045.60, 0] + council_tax_reduction: 1_045.60 + +- name: North Northamptonshire uses UC assessed earnings for the non-dependant no-earned-income exemption + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + north_northamptonshire_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 6_000 + uc_earned_income: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + north_northamptonshire_council_tax_reduction_non_dep_deductions: [0, 0] + north_northamptonshire_council_tax_reduction: [1_350, 0] + council_tax_reduction: 1_350 + +- name: North Northamptonshire waives deductions for source-defined non-dependant exclusions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + north_northamptonshire_council_tax_reduction_non_dep_source_exemption: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + north_northamptonshire_council_tax_reduction_non_dep_deductions: [0, 0] + north_northamptonshire_council_tax_reduction: [1_350, 0] + council_tax_reduction: 1_350 + +- name: North Northamptonshire waives deductions for source-defined claimant disability exemptions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + north_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption: true + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: NORTH_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + north_northamptonshire_council_tax_reduction_non_dep_deductions: [0, 0] + north_northamptonshire_council_tax_reduction: [1_350, 0] + council_tax_reduction: 1_350 + +- name: West Northamptonshire gives 80 percent support to a working-age claimant with no income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: West Northamptonshire gives 100 percent support to care leavers aged up to 25 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 25 + west_northamptonshire_council_tax_reduction_care_leaver: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 24 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: West Northamptonshire gives 100 percent support to protected war pension cases + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + west_northamptonshire_council_tax_reduction_war_pension_protected: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: West Northamptonshire applies the 20 percent taper to excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_826.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction: 1_232 + council_tax_reduction: 1_232 + +- name: West Northamptonshire rounds partial capital tariff blocks up + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + west_northamptonshire_council_tax_reduction_tariff_income: 52 + west_northamptonshire_council_tax_reduction: 1_429.60 + council_tax_reduction: 1_429.60 + +- name: West Northamptonshire excludes ordinary claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 16_000.01 + output: + west_northamptonshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: West Northamptonshire disregards capital for income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + income_support: 6_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 100_000 + output: + west_northamptonshire_council_tax_reduction_tariff_income: 0 + west_northamptonshire_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: West Northamptonshire uses the pre-deduction UC award for UC applicable income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + uc_maximum_amount: 1_000 + universal_credit_pre_benefit_cap: 1_200 + benefit_cap_reduction: 200 + uc_earned_income: 1_040 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + universal_credit: 1_000 + west_northamptonshire_council_tax_reduction_uc_applicable_income: 2_240 + west_northamptonshire_council_tax_reduction: 1_192 + council_tax_reduction: 1_192 + +- name: West Northamptonshire uses UC-assessed capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + uc_maximum_amount: 1_000 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 100_000 + output: + west_northamptonshire_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: West Northamptonshire excludes UC claimants over the UC-assessed capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + uc_maximum_amount: 1_000 + uc_assessable_capital: 16_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: West Northamptonshire applies the top remunerative-work non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction_non_dep_deductions: [829.40, 0] + west_northamptonshire_council_tax_reduction: [610.60, 0] + council_tax_reduction: 610.60 + +- name: West Northamptonshire treats low-hours positive earnings as not remunerative work + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 780 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction_non_dep_deductions: [270.40, 0] + west_northamptonshire_council_tax_reduction: [1_169.60, 0] + council_tax_reduction: 1_169.60 + +- name: West Northamptonshire uses joint gross income for a non-UC non-dependant couple's single deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + west_northamptonshire_council_tax_reduction_non_dep_deductions: [691.60, 0] + west_northamptonshire_council_tax_reduction: [1_308.40, 0] + council_tax_reduction: 1_308.40 + +- name: West Northamptonshire applies separate non-dependant deductions to two-earner UC couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 15_600 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + west_northamptonshire_council_tax_reduction_non_dep_deductions: [1_102.40, 0] + west_northamptonshire_council_tax_reduction: [897.60, 0] + council_tax_reduction: 897.60 + +- name: West Northamptonshire exempts the no-earned member of a mixed UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + west_northamptonshire_council_tax_reduction_non_dep_uc_earned_income: 31_720 + non_dep_partner: + age: 25 + west_northamptonshire_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 12_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 2_500 + savings: 0 + output: + west_northamptonshire_council_tax_reduction_non_dep_deductions: [829.40, 0] + west_northamptonshire_council_tax_reduction: [1_170.60, 0] + council_tax_reduction: 1_170.60 + +- name: West Northamptonshire waives deductions for source-defined non-dependant exclusions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + west_northamptonshire_council_tax_reduction_non_dep_source_exemption: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction_non_dep_deductions: [0, 0] + west_northamptonshire_council_tax_reduction: [1_440, 0] + council_tax_reduction: 1_440 + +- name: West Northamptonshire waives deductions for source-defined claimant disability exemptions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + west_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption: true + non_dep: + age: 25 + employment_income: 31_720 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction_non_dep_deductions: [0, 0] + west_northamptonshire_council_tax_reduction: [1_440, 0] + council_tax_reduction: 1_440 + +- name: West Northamptonshire local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1_000 + uc_maximum_amount: 1_000 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction_is_local_scheme: true + west_northamptonshire_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: West Northamptonshire keeps relevant-period pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + west_northamptonshire_council_tax_reduction_uc_relevant_period_pensioner: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1_000 + uc_maximum_amount: 1_000 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_NORTHAMPTONSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_northamptonshire_council_tax_reduction_is_local_scheme: false + west_northamptonshire_council_tax_reduction: 0 + +- name: Buckinghamshire gives 100 percent support to a no-income single working-age claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_weekly_income: 0 + buckinghamshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Buckinghamshire applies the standard earnings disregard before placing a single claimant in Band 2 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 9_100 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_weekly_income: 150 + buckinghamshire_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Buckinghamshire excludes working-age claimants with exactly 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + buckinghamshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Buckinghamshire passported income-based benefit claimants into Band 1 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 30_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + income_support: 500 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Buckinghamshire applies the capital cliff to passported income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + income_support: 500 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + buckinghamshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Buckinghamshire uses the couple with two children income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 23_000 + partner: + age: 35 + child: + age: 6 + second_child: + age: 8 + benunits: + benunit: + members: [claimant, partner, child, second_child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner, child, second_child] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_weekly_income: 365.99 + buckinghamshire_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Buckinghamshire applies the disability income disregard + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 18_200 + pip_dl: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_weekly_income: 244.68 + buckinghamshire_council_tax_reduction: 450 + council_tax_reduction: 450 + +- name: Buckinghamshire applies the disability disregard for PIP received by a non-dependant household member + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 18_200 + non_dep: + age: 25 + pip_m: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction: [385, 0] + council_tax_reduction: 385 + +- name: Buckinghamshire disregards source-listed Universal Credit elements + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 20_800 + uc_housing_costs_element: 5_200 + uc_carer_element: 2_600 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_weekly_income: 250 + buckinghamshire_council_tax_reduction: 450 + council_tax_reduction: 450 + +- name: Buckinghamshire uses UC-assessed earnings in UC income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + uc_earned_income: 7_800 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_weekly_income: 144.23 + buckinghamshire_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Buckinghamshire uses UC-assessed capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 100_000 + output: + buckinghamshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Buckinghamshire excludes UC claimants with exactly 6,000 pounds of UC-assessed capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + uc_assessable_capital: 6_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Buckinghamshire applies the flat non-dependant deduction before the income-band percentage + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 9_100 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_non_dep_deductions: [260, 0] + buckinghamshire_council_tax_reduction: [1_155, 0] + council_tax_reduction: 1_155 + +- name: Buckinghamshire applies one flat deduction for a non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + non_dep_partner: + age: 30 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_non_dep_deductions: [260, 0] + buckinghamshire_council_tax_reduction: [1_540, 0] + council_tax_reduction: 1_540 + +- name: Buckinghamshire exempts UC non-dependants with no UC earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + buckinghamshire_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_non_dep_deductions: [0, 0] + buckinghamshire_council_tax_reduction: [1_800, 0] + council_tax_reduction: 1_800 + +- name: Buckinghamshire subtracts source-disregarded income not otherwise modeled + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 2_600 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + buckinghamshire_council_tax_reduction_source_disregarded_income: 2_600 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_weekly_income: 0 + buckinghamshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Buckinghamshire keeps mixed-age couples in the local working-age scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + partner: + age: 67 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_is_local_scheme: true + buckinghamshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Buckinghamshire local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1_000 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_is_local_scheme: true + buckinghamshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Buckinghamshire keeps UC transitional-protection pensioners in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1_000 + uc_assessable_capital: 0 + buckinghamshire_council_tax_reduction_uc_transitional_protection_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BUCKINGHAMSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + buckinghamshire_council_tax_reduction_is_local_scheme: false + buckinghamshire_council_tax_reduction: 0 + +- name: Babergh gives full support to a no-income non-UC working-age claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Babergh applies the non-UC 20 percent excess income taper + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 10_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction: 789.76 + council_tax_reduction: 789.76 + +- name: Babergh adds non-UC tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 6_250 + output: + babergh_council_tax_reduction_tariff_income: 52 + babergh_council_tax_reduction: 1_579.76 + council_tax_reduction: 1_579.76 + +- name: Babergh excludes non-UC claimants with capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 16_001 + output: + babergh_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Babergh UC claimants with no UC earned income get full support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction_uc_weekly_contribution: 0 + babergh_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Babergh UC monthly earnings at 326 pounds enter the first contribution band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 3_912 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + uc_earned_income: 0 + babergh_council_tax_reduction_uc_monthly_earnings: 326 + babergh_council_tax_reduction_uc_weekly_contribution: 12.46 + babergh_council_tax_reduction: 1_152.08 + council_tax_reduction: 1_152.08 + +- name: Babergh UC monthly earnings at 1,306 pounds leave a small award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_mif_capped_earned_income: 15_672 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction_uc_monthly_earnings: 1_306 + babergh_council_tax_reduction_uc_weekly_contribution: 33.46 + babergh_council_tax_reduction: 60.08 + council_tax_reduction: 60.08 + +- name: Babergh UC monthly earnings of 3,000 pounds have no entitlement + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_mif_capped_earned_income: 36_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction_uc_monthly_earnings: 3_000 + babergh_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Babergh uses UC-assessed capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 100_000 + output: + babergh_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Babergh excludes UC claimants with UC-assessed capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 16_001 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Babergh applies a working non-dependant deduction before the non-UC taper + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction_non_dep_deductions: [691.6, 0] + babergh_council_tax_reduction: [1_108.4, 0] + council_tax_reduction: 1_108.4 + +- name: Babergh applies one deduction for a non-UC non-dependant couple based on joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + non_dep_partner: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction_non_dep_deductions: [691.6, 0] + babergh_council_tax_reduction: [1_108.4, 0] + council_tax_reduction: 1_108.4 + +- name: Babergh applies separate deductions for a UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + non_dep_partner: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction_non_dep_deductions: [540.8, 0] + babergh_council_tax_reduction: [1_259.2, 0] + council_tax_reduction: 1_259.2 + +- name: Babergh exempts UC non-dependants with no UC earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + babergh_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction_non_dep_deductions: [0, 0] + babergh_council_tax_reduction: [1_800, 0] + council_tax_reduction: 1_800 + +- name: Babergh local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BABERGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + babergh_council_tax_reduction_is_local_scheme: true + babergh_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Mid Suffolk gives full support to a no-income non-UC working-age claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + mid_suffolk_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Mid Suffolk applies the non-UC 20 percent excess income taper + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 10_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + mid_suffolk_council_tax_reduction: 789.76 + council_tax_reduction: 789.76 + +- name: Mid Suffolk adds non-UC tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 6_250 + output: + mid_suffolk_council_tax_reduction_tariff_income: 52 + mid_suffolk_council_tax_reduction: 1_579.76 + council_tax_reduction: 1_579.76 + +- name: Mid Suffolk excludes non-UC claimants with capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 16_001 + output: + mid_suffolk_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Mid Suffolk UC monthly earnings at 326 pounds enter the first contribution band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 3_912 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + uc_earned_income: 0 + mid_suffolk_council_tax_reduction_uc_monthly_earnings: 326 + mid_suffolk_council_tax_reduction_uc_weekly_contribution: 12 + mid_suffolk_council_tax_reduction: 1_176 + council_tax_reduction: 1_176 + +- name: Mid Suffolk UC monthly earnings at 1,306 pounds leave a small award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_mif_capped_earned_income: 15_672 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + mid_suffolk_council_tax_reduction_uc_monthly_earnings: 1_306 + mid_suffolk_council_tax_reduction_uc_weekly_contribution: 32.77 + mid_suffolk_council_tax_reduction: 95.96 + council_tax_reduction: 95.96 + +- name: Mid Suffolk UC monthly earnings of 3,000 pounds have no entitlement + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_mif_capped_earned_income: 36_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + mid_suffolk_council_tax_reduction_uc_monthly_earnings: 3_000 + mid_suffolk_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Mid Suffolk uses UC-assessed capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 100_000 + output: + mid_suffolk_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Mid Suffolk excludes UC claimants with UC-assessed capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 16_001 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + mid_suffolk_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Mid Suffolk applies one deduction for a non-UC non-dependant couple based on joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + non_dep_partner: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + mid_suffolk_council_tax_reduction_non_dep_deductions: [691.6, 0] + mid_suffolk_council_tax_reduction: [1_108.4, 0] + council_tax_reduction: 1_108.4 + +- name: Mid Suffolk applies separate deductions for a UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + non_dep_partner: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + mid_suffolk_council_tax_reduction_non_dep_deductions: [540.8, 0] + mid_suffolk_council_tax_reduction: [1_259.2, 0] + council_tax_reduction: 1_259.2 + +- name: Mid Suffolk exempts UC non-dependants with no UC earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + mid_suffolk_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + mid_suffolk_council_tax_reduction_non_dep_deductions: [0, 0] + mid_suffolk_council_tax_reduction: [1_800, 0] + council_tax_reduction: 1_800 + +- name: Mid Suffolk local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MID_SUFFOLK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + mid_suffolk_council_tax_reduction_is_local_scheme: true + mid_suffolk_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Ipswich gives full support to a no-income non-UC working-age claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ipswich_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Ipswich applies the non-UC 20 percent excess income taper + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 10_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ipswich_council_tax_reduction: 789.76 + council_tax_reduction: 789.76 + +- name: Ipswich adds non-UC tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 6_250 + output: + ipswich_council_tax_reduction_tariff_income: 52 + ipswich_council_tax_reduction: 1_579.76 + council_tax_reduction: 1_579.76 + +- name: Ipswich excludes non-UC claimants with capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 16_001 + output: + ipswich_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Ipswich UC monthly earnings at 309 pounds enter the first contribution band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 3_708 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + uc_earned_income: 0 + ipswich_council_tax_reduction_uc_monthly_earnings: 309 + ipswich_council_tax_reduction_uc_weekly_contribution: 10.85 + ipswich_council_tax_reduction: 1_235.8 + council_tax_reduction: 1_235.8 + +- name: Ipswich UC monthly earnings at 1,237 pounds leave a small award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_mif_capped_earned_income: 14_844 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ipswich_council_tax_reduction_uc_monthly_earnings: 1_237 + ipswich_council_tax_reduction_uc_weekly_contribution: 31.62 + ipswich_council_tax_reduction: 155.76 + council_tax_reduction: 155.76 + +- name: Ipswich UC monthly earnings of 3,000 pounds have no entitlement + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_mif_capped_earned_income: 36_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ipswich_council_tax_reduction_uc_monthly_earnings: 3_000 + ipswich_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Ipswich uses UC-assessed capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 100_000 + output: + ipswich_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Ipswich excludes UC claimants with UC-assessed capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 16_001 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ipswich_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Ipswich applies one deduction for a non-UC non-dependant couple based on joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + non_dep_partner: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ipswich_council_tax_reduction_non_dep_deductions: [691.6, 0] + ipswich_council_tax_reduction: [1_108.4, 0] + council_tax_reduction: 1_108.4 + +- name: Ipswich applies separate deductions for a UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + non_dep_partner: + age: 30 + employment_income: 13_000 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ipswich_council_tax_reduction_non_dep_deductions: [540.8, 0] + ipswich_council_tax_reduction: [1_259.2, 0] + council_tax_reduction: 1_259.2 + +- name: Ipswich exempts UC non-dependants with no UC earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + ipswich_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ipswich_council_tax_reduction_non_dep_deductions: [0, 0] + ipswich_council_tax_reduction: [1_800, 0] + council_tax_reduction: 1_800 + +- name: Ipswich local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: IPSWICH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ipswich_council_tax_reduction_is_local_scheme: true + ipswich_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Slough gives 70 percent support to a no-earned-income working-age claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SLOUGH + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + slough_council_tax_reduction_support_rate: 0.7 + slough_council_tax_reduction: 1_120 + council_tax_reduction: 1_120 + +- name: Slough gives 50 percent support for positive earned income below 115.38 pounds per week + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SLOUGH + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + slough_council_tax_reduction_weekly_earnings: 100 + slough_council_tax_reduction_support_rate: 0.5 + slough_council_tax_reduction: 800 + council_tax_reduction: 800 + +- name: Slough applies the Band C liability cap before the earnings discount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SLOUGH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + slough_council_tax_reduction_maximum_eligible_liability: 1_600 + slough_council_tax_reduction: 1_120 + council_tax_reduction: 1_120 + +- name: Slough excludes working-age claimants with capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SLOUGH + council_tax_band: C + council_tax: 1_600 + savings: 6_001 + output: + slough_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Slough uses DWP-notified UC earnings before the UC work allowance for income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_200 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: SLOUGH + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + uc_earned_income: 0 + slough_council_tax_reduction_weekly_earnings: 100 + slough_council_tax_reduction_support_rate: 0.5 + slough_council_tax_reduction: 800 + council_tax_reduction: 800 + +- name: Slough applies the high weekly non-dependant deduction after the support rate + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 10_400 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SLOUGH + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + slough_council_tax_reduction_non_dep_deductions: [572, 0] + slough_council_tax_reduction: [548, 0] + council_tax_reduction: 548 + +- name: Slough gives the low deduction for UC non-dependants with no UC earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 10_400 + weekly_hours: 35 + slough_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SLOUGH + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + slough_council_tax_reduction_non_dep_deductions: [260, 0] + slough_council_tax_reduction: [860, 0] + council_tax_reduction: 860 + +- name: Slough applies one deduction for a non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 10_400 + weekly_hours: 35 + non_dep_partner: + age: 30 + employment_income: 10_400 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: SLOUGH + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + slough_council_tax_reduction_non_dep_deductions: [572, 0] + slough_council_tax_reduction: [548, 0] + council_tax_reduction: 548 + +- name: Slough local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SLOUGH + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + slough_council_tax_reduction_is_local_scheme: true + slough_council_tax_reduction: 1_120 + council_tax_reduction: 1_120 + +- name: South Gloucestershire gives 77 percent support to a no-earned-income working-age claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_weekly_earnings: 0 + south_gloucestershire_council_tax_reduction_support_rate: 0.77 + south_gloucestershire_council_tax_reduction: 1_386 + council_tax_reduction: 1_386 + +- name: South Gloucestershire moves from 60 to 40 percent support above 50 pounds weekly earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 2_600.52 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_weekly_earnings: 50.01 + south_gloucestershire_council_tax_reduction_support_rate: 0.4 + south_gloucestershire_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: South Gloucestershire keeps 60 percent support at exactly 50 pounds weekly earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 2_600 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_weekly_earnings: 50 + south_gloucestershire_council_tax_reduction_support_rate: 0.6 + south_gloucestershire_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: South Gloucestershire awards no support from 230.01 pounds weekly earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 12_012 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_weekly_earnings: 231 + south_gloucestershire_council_tax_reduction_support_rate: 0 + south_gloucestershire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: South Gloucestershire applies the self-employed nil-income floor after the initial trading year + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + south_gloucestershire_council_tax_reduction_self_employment_floor_applies: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_weekly_earnings: 150 + south_gloucestershire_council_tax_reduction_support_rate: 0.15 + south_gloucestershire_council_tax_reduction: 270 + council_tax_reduction: 270 + +- name: South Gloucestershire follows the formal scheme capital boundary + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + south_gloucestershire_council_tax_reduction: 1_386 + council_tax_reduction: 1_386 + +- name: South Gloucestershire excludes capital one penny above the formal scheme limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + south_gloucestershire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: South Gloucestershire excludes non-applicant capital when source applicant capital is supplied + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + south_gloucestershire_council_tax_reduction_applicant_partner_capital: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 7_000 + output: + south_gloucestershire_council_tax_reduction_assessable_capital: [0, 7_000] + south_gloucestershire_council_tax_reduction: [1_204, 0] + council_tax_reduction: 1_204 + +- name: South Gloucestershire UC path uses UC-assessed capital instead of household savings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 7_000 + output: + south_gloucestershire_council_tax_reduction_assessable_capital: 0 + south_gloucestershire_council_tax_reduction: 1_386 + council_tax_reduction: 1_386 + +- name: South Gloucestershire uses the UC MIF earned-income figure as total net earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_mif_capped_earned_income: 7_800 + uc_mif_applies: true + income_tax: 2_600 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_weekly_earnings: 150 + south_gloucestershire_council_tax_reduction_support_rate: 0.15 + south_gloucestershire_council_tax_reduction: 270 + council_tax_reduction: 270 + +- name: South Gloucestershire uses UC assessed earnings before the UC work allowance for income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_200 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + uc_earned_income: 0 + south_gloucestershire_council_tax_reduction_weekly_earnings: 100 + south_gloucestershire_council_tax_reduction_support_rate: 0.4 + south_gloucestershire_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: South Gloucestershire deducts a high non-dependant amount after the support percentage + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 10_400 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_non_dep_deductions: [728, 0] + south_gloucestershire_council_tax_reduction: [658, 0] + council_tax_reduction: 658 + +- name: South Gloucestershire only gives the Pension Credit low deduction for Guarantee Credit non-dependants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + savings_credit_non_dep: + age: 30 + weekly_hours: 35 + guarantee_credit_non_dep: + age: 30 + weekly_hours: 35 + south_gloucestershire_council_tax_reduction_non_dep_guarantee_credit: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + savings_credit_benunit: + members: [savings_credit_non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + pension_credit: 1 + savings_credit: 1 + guarantee_credit_benunit: + members: [guarantee_credit_non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + pension_credit: 1 + households: + household: + members: [claimant, savings_credit_non_dep, guarantee_credit_non_dep] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_individual_non_dep_deduction: [0, 728, 182] + south_gloucestershire_council_tax_reduction_non_dep_deductions: [910, 182, 728] + south_gloucestershire_council_tax_reduction: [476, 0, 0] + council_tax_reduction: 476 + +- name: South Gloucestershire removes source-exempt non-dependants from deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 10_400 + weekly_hours: 35 + south_gloucestershire_council_tax_reduction_non_dep_source_exemption: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_non_dep_deductions: [0, 0] + south_gloucestershire_council_tax_reduction: [1_386, 0] + council_tax_reduction: 1_386 + +- name: South Gloucestershire gives the low deduction to a remunerative-work non-dependant on maximum UC + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 10_400 + weekly_hours: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 5_200 + universal_credit_pre_benefit_cap: 5_200 + uc_maximum_amount: 5_200 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_non_dep_deductions: [182, 0] + south_gloucestershire_council_tax_reduction: [1_204, 0] + council_tax_reduction: 1_204 + +- name: South Gloucestershire applies one deduction for a non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 10_400 + weekly_hours: 35 + non_dep_partner: + age: 30 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_non_dep_deductions: [728, 0] + south_gloucestershire_council_tax_reduction: [658, 0] + council_tax_reduction: 658 + +- name: South Gloucestershire leaves ordinary pensioner households to the national pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_is_local_scheme: false + south_gloucestershire_council_tax_reduction: 0 + council_tax_reduction: 1_800 + +- name: South Gloucestershire keeps pension-age regulation 60A UC cases on the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + south_gloucestershire_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_is_local_scheme: false + south_gloucestershire_council_tax_reduction: 0 + council_tax_reduction: 1_800 + +- name: South Gloucestershire keeps pension-age UC relevant-period cases on the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + south_gloucestershire_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTH_GLOUCESTERSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + south_gloucestershire_council_tax_reduction_is_local_scheme: false + south_gloucestershire_council_tax_reduction: 0 + council_tax_reduction: 1_800 + +- name: Plymouth awards 80 percent support to a no-income working-age single claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + plymouth_council_tax_reduction_support_rate: 0.8 + plymouth_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Plymouth caps eligible liability at Band E under the adopted 2026-27 scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: F + council_tax: 2_600 + savings: 0 + output: + plymouth_council_tax_reduction_maximum_eligible_liability: 2_200 + plymouth_council_tax_reduction: 1_760 + council_tax_reduction: 1_760 + +- name: Plymouth applies the single earnings disregard before weekly income banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_720 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + plymouth_council_tax_reduction_weekly_income: 105 + plymouth_council_tax_reduction_support_rate: 0.6 + plymouth_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Plymouth deducts eligible childcare costs from earnings before income banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 15_080 + income_tax: 0 + national_insurance: 0 + childcare_expenses: 1_300 + weekly_hours: 30 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + plymouth_council_tax_reduction_childcare_deduction: 1_300 + plymouth_council_tax_reduction_weekly_income: 240 + plymouth_council_tax_reduction_support_rate: 0.8 + plymouth_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Plymouth follows the adopted PDF and allows exactly 6000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + plymouth_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Plymouth excludes capital above 6000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: D + council_tax: 1_800 + savings: 6_001 + output: + plymouth_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Plymouth applies the adopted PDF weekly non-dependant deduction after the support rate + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 10_400 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + plymouth_council_tax_reduction_non_dep_deductions: [270.4, 0] + plymouth_council_tax_reduction: [1_169.6, 0] + council_tax_reduction: 1_169.6 + +- name: Plymouth exempts UC non-dependants whose UC calculation has no earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 10_400 + plymouth_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + plymouth_council_tax_reduction_non_dep_deductions: [0, 0] + plymouth_council_tax_reduction: [1_440, 0] + council_tax_reduction: 1_440 + +- name: Plymouth local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + plymouth_council_tax_reduction_is_local_scheme: true + plymouth_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Plymouth disregards UC housing costs and Carer's Allowance from weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + carers_allowance: 4_160 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 5_200 + universal_credit_pre_benefit_cap: 5_200 + uc_unearned_income: 4_160 + uc_housing_costs_element: 5_200 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: PLYMOUTH + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + plymouth_council_tax_reduction_weekly_income: 0 + plymouth_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Basildon awards 75 percent support to a no-income working-age single claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction_support_rate: 0.75 + basildon_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Basildon applies the 20 pound weekly earnings disregard before income banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 7_280 + income_tax: 0 + national_insurance: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction_weekly_income: 120 + basildon_council_tax_reduction_support_rate: 0.5 + basildon_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Basildon increases eligible disabled households to 75 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 16_640 + income_tax: 0 + national_insurance: 0 + child: + age: 6 + dla_sc: 1 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction_weekly_income: 300 + basildon_council_tax_reduction_protected_group: true + basildon_council_tax_reduction_support_rate: 0.75 + basildon_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Basildon deducts eligible childcare costs from earnings before income banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 16_640 + income_tax: 0 + national_insurance: 0 + childcare_expenses: 5_200 + weekly_hours: 30 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction_childcare_deduction: 5_200 + basildon_council_tax_reduction_weekly_income: 200 + basildon_council_tax_reduction_support_rate: 0.5 + basildon_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Basildon deducts eligible childcare costs from UC-assessed earnings before income banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + childcare_expenses: 5_200 + weekly_hours: 30 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 5_200 + uc_housing_costs_element: 5_200 + uc_earned_income: 16_640 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction_childcare_deduction: 5_200 + basildon_council_tax_reduction_weekly_income: 200 + basildon_council_tax_reduction_support_rate: 0.5 + basildon_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Basildon treats statutory sick pay as work for childcare deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + statutory_sick_pay: 16_640 + income_tax: 0 + national_insurance: 0 + childcare_expenses: 5_200 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction_childcare_deduction: 5_200 + basildon_council_tax_reduction_weekly_income: 200 + basildon_council_tax_reduction_support_rate: 0.5 + basildon_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Basildon applies the two-or-more-dependants top income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 19_240 + income_tax: 0 + national_insurance: 0 + child: + age: 6 + child_2: + age: 8 + benunits: + benunit: + members: [claimant, child, child_2] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child, child_2] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction_weekly_income: 350 + basildon_council_tax_reduction_support_rate: 0.25 + basildon_council_tax_reduction: 450 + council_tax_reduction: 450 + +- name: Basildon follows the adopted PDF and allows exactly 6000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + basildon_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Basildon excludes capital above 6000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 6_001 + output: + basildon_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Basildon uses UC-assessed capital at the 6000 pound boundary + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 5_200 + uc_housing_costs_element: 5_200 + uc_assessable_capital: 6_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + basildon_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Basildon excludes UC-assessed capital above 6000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 5_200 + uc_housing_costs_element: 5_200 + uc_assessable_capital: 6_001 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Basildon uses pre-deduction UC award and disregards the UC housing element + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 5_200 + uc_housing_costs_element: 5_200 + uc_earned_income: 6_240 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction_weekly_income: 100 + basildon_council_tax_reduction_support_rate: 0.75 + basildon_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Basildon local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASILDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + basildon_council_tax_reduction_is_local_scheme: true + basildon_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Southend-on-Sea awards 75 percent support to a no-income working-age single claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + southend_on_sea_council_tax_reduction_support_rate: 0.75 + southend_on_sea_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Southend-on-Sea applies the 20 pound weekly earnings disregard before income banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 7_800 + income_tax: 0 + national_insurance: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + southend_on_sea_council_tax_reduction_weekly_income: 130 + southend_on_sea_council_tax_reduction_support_rate: 0.5 + southend_on_sea_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Southend-on-Sea uses the one-child income row + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 15_080 + income_tax: 0 + national_insurance: 0 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + southend_on_sea_council_tax_reduction_weekly_income: 270 + southend_on_sea_council_tax_reduction_support_rate: 0.25 + southend_on_sea_council_tax_reduction: 450 + council_tax_reduction: 450 + +- name: Southend-on-Sea applies the two-or-more-children top income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 22_360 + income_tax: 0 + national_insurance: 0 + child: + age: 6 + child_2: + age: 8 + benunits: + benunit: + members: [claimant, child, child_2] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child, child_2] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + southend_on_sea_council_tax_reduction_weekly_income: 410 + southend_on_sea_council_tax_reduction_support_rate: 0.25 + southend_on_sea_council_tax_reduction: 450 + council_tax_reduction: 450 + +- name: Southend-on-Sea deducts eligible childcare costs only after the 16 hour work gate is met + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 16_640 + income_tax: 0 + national_insurance: 0 + childcare_expenses: 5_200 + weekly_hours: 16 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + southend_on_sea_council_tax_reduction_childcare_deduction: 5_200 + southend_on_sea_council_tax_reduction_weekly_income: 200 + southend_on_sea_council_tax_reduction_support_rate: 0.5 + southend_on_sea_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Southend-on-Sea excludes capital at the 6000 pound threshold + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + southend_on_sea_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Southend-on-Sea allows capital below the 6000 pound threshold + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 5_999 + output: + southend_on_sea_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Southend-on-Sea uses UC-assessed capital for Universal Credit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 5_200 + uc_housing_costs_element: 5_200 + uc_assessable_capital: 5_999 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + southend_on_sea_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Southend-on-Sea excludes UC-assessed capital at the 6000 pound threshold + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 5_200 + uc_housing_costs_element: 5_200 + uc_assessable_capital: 6_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + southend_on_sea_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Southend-on-Sea disregards source-listed Universal Credit elements from weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 15_600 + uc_housing_costs_element: 5_200 + uc_carer_element: 5_200 + uc_childcare_element: 5_200 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + southend_on_sea_council_tax_reduction_weekly_income: 0 + southend_on_sea_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Southend-on-Sea local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: SOUTHEND_ON_SEA + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + southend_on_sea_council_tax_reduction_is_local_scheme: true + southend_on_sea_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Colchester awards 80 percent support to a no-income working-age single claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + colchester_council_tax_reduction_support_rate: 0.8 + colchester_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Colchester caps working-age eligible liability at Band D + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + colchester_council_tax_reduction_maximum_eligible_liability: 1_800 + colchester_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Colchester keeps a no-child couple at the 60 percent band through 225 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 13_000 + income_tax: 0 + national_insurance: 0 + partner: + age: 35 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + colchester_council_tax_reduction_weekly_income: 225 + colchester_council_tax_reduction_support_rate: 0.6 + colchester_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Colchester moves a no-child couple to the 40 percent band above 225 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 13_001 + income_tax: 0 + national_insurance: 0 + partner: + age: 35 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + colchester_council_tax_reduction_weekly_income: 225.02 + colchester_council_tax_reduction_support_rate: 0.4 + colchester_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: Colchester applies the two-or-more-children top income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 23_400.52 + income_tax: 0 + national_insurance: 0 + child: + age: 6 + child_2: + age: 8 + benunits: + benunit: + members: [claimant, child, child_2] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child, child_2] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + colchester_council_tax_reduction_weekly_income: 425.01 + colchester_council_tax_reduction_support_rate: 0.2 + colchester_council_tax_reduction: 360 + council_tax_reduction: 360 + +- name: Colchester deducts eligible childcare costs after the 16 hour work gate is met + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 16_640 + income_tax: 0 + national_insurance: 0 + childcare_expenses: 5_200 + weekly_hours: 16 + child: + age: 6 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + colchester_council_tax_reduction_childcare_deduction: 5_200 + colchester_council_tax_reduction_weekly_income: 195 + colchester_council_tax_reduction_support_rate: 0.8 + colchester_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Colchester protected applicants receive 80 percent support in the listed income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 24_700 + income_tax: 0 + national_insurance: 0 + pip_dl_category: ENHANCED + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + colchester_council_tax_reduction_weekly_income: 450 + colchester_council_tax_reduction_protected_group: true + colchester_council_tax_reduction_support_rate: 0.8 + colchester_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Colchester excludes capital at the 6000 pound threshold + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + colchester_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Colchester uses UC-assessed capital and disregards source-listed Universal Credit elements + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 15_600 + uc_housing_costs_element: 5_200 + uc_carer_element: 5_200 + uc_childcare_element: 5_200 + uc_assessable_capital: 5_999 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + colchester_council_tax_reduction_weekly_income: 0 + colchester_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Colchester does not apply the local earnings disregard to Universal Credit earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 5_200 + uc_housing_costs_element: 5_200 + uc_earned_income: 7_800 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + colchester_council_tax_reduction_weekly_income: 150 + colchester_council_tax_reduction_support_rate: 0.6 + colchester_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Colchester excludes UC-assessed capital at the 6000 pound threshold + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 5_200 + uc_housing_costs_element: 5_200 + uc_assessable_capital: 6_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + colchester_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Colchester requires an actual Universal Credit award for UC-assessed capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 0 + universal_credit_pre_benefit_cap: 5_200 + uc_housing_costs_element: 5_200 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + colchester_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Colchester does not apply working-age non-dependant deductions or non-dependant capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 50_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + colchester_council_tax_reduction_assessable_capital: [0, 0] + colchester_council_tax_reduction: [1_440, 0] + council_tax_reduction: 1_440 + +- name: Colchester local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: COLCHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + colchester_council_tax_reduction_is_local_scheme: true + colchester_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Thurrock awards 75 percent support to a no-income working-age claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + thurrock_council_tax_reduction: 1_350 + simulated_council_tax_reduction_benunit: 1_350 + council_tax_reduction: 1_350 + +- name: Thurrock applies the 20 percent taper to annual excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + thurrock_council_tax_reduction: 1_150 + council_tax_reduction: 1_150 + +- name: Thurrock applies the 25 pound weekly earnings disregard before the taper + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 5_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + thurrock_council_tax_reduction_applicable_income: 3_700 + thurrock_council_tax_reduction: 610 + council_tax_reduction: 610 + +- name: Thurrock allows exactly 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + thurrock_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Thurrock applies the strict 6,000 pound capital limit to income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + council_tax_reduction_relevant_income_based_benefit: true + thurrock_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Thurrock uses UC assessed income, capital, and local earnings disregard for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + thurrock_council_tax_reduction_uc_applicable_income: 13_100 + thurrock_council_tax_reduction: 1_130 + council_tax_reduction: 1_130 + +- name: Thurrock applies the 6,000 pound capital limit to UC-assessed capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 6_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + uc_assessable_capital: 6_000.01 + thurrock_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Thurrock applies the remunerative-work non-dependant deduction table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + thurrock_council_tax_reduction_non_dep_deductions: [665.60, 0] + thurrock_council_tax_reduction: [684.40, 0] + council_tax_reduction: 684.40 + +- name: Thurrock makes one non-dependant deduction for a couple using joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 7_800 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 18_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + thurrock_council_tax_reduction_non_dep_deductions: [665.60, 0] + thurrock_council_tax_reduction: [684.40, 0] + council_tax_reduction: 684.40 + +- name: Thurrock treats low-hours positive earnings as not remunerative work + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 520 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + thurrock_council_tax_reduction_non_dep_deductions: [260, 0] + thurrock_council_tax_reduction: [1_090, 0] + council_tax_reduction: 1_090 + +- name: Thurrock uses UC assessed earnings for the non-dependant no-earned-income exemption + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 832 + thurrock_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 6_000 + uc_earned_income: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + thurrock_council_tax_reduction_non_dep_deductions: [0, 0] + thurrock_council_tax_reduction: [1_350, 0] + council_tax_reduction: 1_350 + +- name: Thurrock local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + thurrock_council_tax_reduction_is_local_scheme: true + thurrock_council_tax_reduction: 1_350 + simulated_council_tax_reduction_benunit: 1_350 + council_tax_reduction: 1_350 + +- name: Thurrock keeps relevant-period pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + thurrock_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: THURROCK + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + thurrock_council_tax_reduction_is_local_scheme: false + thurrock_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Chelmsford awards 77 percent support to a no-income working-age claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + chelmsford_council_tax_reduction: 1_386 + simulated_council_tax_reduction_benunit: 1_386 + council_tax_reduction: 1_386 + +- name: Chelmsford caps working-age eligible liability at Band D + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + chelmsford_council_tax_reduction_maximum_eligible_liability: 1_800 + chelmsford_council_tax_reduction: 1_386 + council_tax_reduction: 1_386 + +- name: Chelmsford applies the 20 percent taper to annual excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + chelmsford_council_tax_reduction: 1_186 + council_tax_reduction: 1_186 + +- name: Chelmsford applies the ordinary single earnings disregard before the taper + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 5_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + chelmsford_council_tax_reduction_earnings_disregard: 15 + chelmsford_council_tax_reduction_applicable_income: 4_220 + chelmsford_council_tax_reduction: 542 + council_tax_reduction: 542 + +- name: Chelmsford allows exactly 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + chelmsford_council_tax_reduction: 1_386 + council_tax_reduction: 1_386 + +- name: Chelmsford applies the strict 6,000 pound capital limit to income-based benefit claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + council_tax_reduction_relevant_income_based_benefit: true + chelmsford_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Chelmsford uses UC assessed income and capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 2_400 + universal_credit_pre_benefit_cap: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + chelmsford_council_tax_reduction_uc_applicable_income: 12_300 + chelmsford_council_tax_reduction: 1_326 + council_tax_reduction: 1_326 + +- name: Chelmsford uses the pre-deduction UC award in its UC income path + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + chelmsford_council_tax_reduction_uc_applicable_income: 12_300 + chelmsford_council_tax_reduction: 1_326 + council_tax_reduction: 1_326 + +- name: Chelmsford applies the 6,000 pound capital limit to UC-assessed capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 12_000 + universal_credit_pre_benefit_cap: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 6_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + uc_assessable_capital: 6_000.01 + chelmsford_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Chelmsford applies the low-income remunerative-work non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_400 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + chelmsford_council_tax_reduction_non_dep_deductions: [257.40, 0] + chelmsford_council_tax_reduction: [1_128.60, 0] + council_tax_reduction: 1_128.60 + +- name: Chelmsford applies the middle non-dependant deduction band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 26_000 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + chelmsford_council_tax_reduction_non_dep_deductions: [643.76, 0] + chelmsford_council_tax_reduction: [742.24, 0] + council_tax_reduction: 742.24 + +- name: Chelmsford still deducts for non-dependants on income-based benefits because section 58.8 is not used + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + jsa_income: 1 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + chelmsford_council_tax_reduction_non_dep_deductions: [343.20, 0] + chelmsford_council_tax_reduction: [1_042.80, 0] + council_tax_reduction: 1_042.80 + +- name: Chelmsford makes one non-dependant deduction for a couple using joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 7_800 + hours_worked: 832 + non_dep_partner: + age: 25 + employment_income: 18_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + other_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + chelmsford_council_tax_reduction_non_dep_deductions: [643.76, 0] + chelmsford_council_tax_reduction: [742.24, 0] + council_tax_reduction: 742.24 + +- name: Chelmsford local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 12_000 + universal_credit_pre_benefit_cap: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + chelmsford_council_tax_reduction_is_local_scheme: true + chelmsford_council_tax_reduction: 1_386 + simulated_council_tax_reduction_benunit: 1_386 + council_tax_reduction: 1_386 + +- name: Chelmsford keeps relevant-period pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 12_000 + universal_credit_pre_benefit_cap: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + chelmsford_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELMSFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + chelmsford_council_tax_reduction_is_local_scheme: false + chelmsford_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Chichester awards full support to a no-income non-UC claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + chichester_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Chichester applies the 20 percent taper to annual excess income for non-UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_306.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + chichester_council_tax_reduction: 1_696 + council_tax_reduction: 1_696 + +- name: Chichester keeps an income-based JSA claimant eligible at exactly 16,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + output: + council_tax_reduction_relevant_income_based_benefit: true + chichester_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Chichester excludes non-UC claimants above the 16,000 pound capital limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + jsa_income: 1 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 16_000.01 + output: + council_tax_reduction_relevant_income_based_benefit: true + chichester_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Chichester keeps a UC single claimant in the 100 percent band at 124 pounds a week + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 6_448 + universal_credit_pre_benefit_cap: 6_448 + chichester_council_tax_reduction_source_uc_income: 6_448 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + chichester_council_tax_reduction_uc_applicable_income: 6_448 + chichester_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Chichester drops a UC single claimant to the 80 percent band just above 124 pounds a week + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 6_448.52 + universal_credit_pre_benefit_cap: 6_448.52 + chichester_council_tax_reduction_source_uc_income: 6_448.52 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + chichester_council_tax_reduction_uc_applicable_income: 6_448.52 + chichester_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Chichester uses UC assessed earnings before the work allowance when source UC income is absent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + uc_mif_capped_earned_income: 6_448.52 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + chichester_council_tax_reduction_uc_applicable_income: 6_449.52 + chichester_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Chichester deducts the UC childcare element from UC income banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 6_500 + universal_credit_pre_benefit_cap: 6_500 + uc_childcare_element: 1_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + chichester_council_tax_reduction_uc_applicable_income: 5_500 + chichester_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Chichester gives no support once a UC single claimant is above the final income band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 11_337.04 + universal_credit_pre_benefit_cap: 11_337.04 + chichester_council_tax_reduction_source_uc_income: 11_337.04 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + chichester_council_tax_reduction_uc_applicable_income: 11_337.04 + chichester_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Chichester applies the Class F flat non-dependant deduction after full UC-band support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 10_400 + hours_worked: 832 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + chichester_council_tax_reduction_source_uc_income: 6_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + chichester_council_tax_reduction_non_dep_deductions: [202.80, 0] + chichester_council_tax_reduction: [1_597.20, 0] + council_tax_reduction: 1_597.20 + +- name: Chichester keeps mixed-age UC couples in the local UC-banded scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + partner: + age: 67 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 6_448 + universal_credit_pre_benefit_cap: 6_448 + chichester_council_tax_reduction_source_uc_income: 6_448 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + chichester_council_tax_reduction_is_local_scheme: true + chichester_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Chichester leaves single pension-age UC claimants in the national pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 6_448 + universal_credit_pre_benefit_cap: 6_448 + chichester_council_tax_reduction_source_uc_income: 6_448 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHICHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + chichester_council_tax_reduction_is_local_scheme: false + chichester_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Cheshire West and Chester awards 75 percent support to an ordinary no-income claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheshire_west_and_chester_council_tax_reduction: 1_350 + simulated_council_tax_reduction_benunit: 1_350 + council_tax_reduction: 1_350 + +- name: Cheshire West and Chester caps ordinary support at Band D + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + cheshire_west_and_chester_council_tax_reduction_maximum_eligible_liability: 1_800 + cheshire_west_and_chester_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Cheshire West and Chester applies the 20 percent taper to excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheshire_west_and_chester_council_tax_reduction: 1_150 + council_tax_reduction: 1_150 + +- name: Cheshire West and Chester gives protected classes full support with the Band D cap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + cheshire_west_and_chester_council_tax_reduction_source_protected_group: true + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + cheshire_west_and_chester_council_tax_reduction_maximum_eligible_liability: 1_800 + cheshire_west_and_chester_council_tax_reduction_protected_group: true + cheshire_west_and_chester_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Cheshire West and Chester does not apply the Band D cap to war pensioners + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + cheshire_west_and_chester_council_tax_reduction_war_pensioner: true + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + cheshire_west_and_chester_council_tax_reduction_maximum_eligible_liability: 3_600 + cheshire_west_and_chester_council_tax_reduction: 3_600 + council_tax_reduction: 3_600 + +- name: Cheshire West and Chester allows exactly 6,000 pounds of ordinary capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + cheshire_west_and_chester_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Cheshire West and Chester excludes ordinary claimants just above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + cheshire_west_and_chester_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Cheshire West and Chester uses UC award income and UC-assessed capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 2_400 + uc_earned_income: 12_000 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + cheshire_west_and_chester_council_tax_reduction_uc_applicable_income: 12_840 + cheshire_west_and_chester_council_tax_reduction: 1_182 + council_tax_reduction: 1_182 + +- name: Cheshire West and Chester applies the non-working non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + weekly_hours: 0 + benunits: + claimant_benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + non_dep_benunit: + members: [non_dep] + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheshire_west_and_chester_council_tax_reduction_non_dep_deductions: [260, 0] + cheshire_west_and_chester_council_tax_reduction: [1_090, 0] + council_tax_reduction: 1_090 + +- name: Rushmoor working-age claimant receives full support capped at Band D + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: RUSHMOOR + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + rushmoor_council_tax_reduction_maximum_eligible_liability: 1_800 + rushmoor_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Rushmoor excludes capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: RUSHMOOR + council_tax_band: D + council_tax: 1_800 + savings: 6_001 + output: + rushmoor_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Rushmoor applies the prescribed gross-income non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + other_benunit: + members: [non_dep] + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: RUSHMOOR + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + rushmoor_council_tax_reduction_non_dep_deductions: [551.20, 0] + rushmoor_council_tax_reduction: [1_248.80, 0] + council_tax_reduction: 1_248.80 + +- name: Hart UC claimants use UC-assessed capital and income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_assessable_capital: 0 + uc_maximum_amount: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + council_tax_reduction_applicable_income: 99_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HART + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + hart_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Hart excludes UC claimants with UC-assessed capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_assessable_capital: 16_001 + uc_maximum_amount: 5_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HART + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + hart_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Hart counts both UC non-dependant couple deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 25 + employment_income: 15_600 + weekly_hours: 16 + non_dep_2: + age: 25 + employment_income: 15_600 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + other_benunit: + members: [non_dep_1, non_dep_2] + universal_credit: 1 + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: HART + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + hart_council_tax_reduction_non_dep_deductions: [1_383.20, 0] + hart_council_tax_reduction: [416.80, 0] + council_tax_reduction: 416.80 + +- name: Maldon applies strict 6,000 pound capital cutoff + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MALDON + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + maldon_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Maldon applies flat 10 pound weekly non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + other_benunit: + members: [non_dep] + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: MALDON + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + maldon_council_tax_reduction_non_dep_deductions: [520, 0] + maldon_council_tax_reduction: [920, 0] + council_tax_reduction: 920 + +- name: Hartlepool single claimant on no income receives Band 1 support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARTLEPOOL + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + hartlepool_council_tax_reduction_weekly_income: 0 + hartlepool_council_tax_reduction: 1_620 + council_tax_reduction: 1_620 + +- name: Hartlepool applies earnings disregard before income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 7_800 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARTLEPOOL + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + hartlepool_council_tax_reduction_weekly_income: 125 + hartlepool_council_tax_reduction: 1_260 + council_tax_reduction: 1_260 + +- name: Hartlepool uses UC-assessed capital and income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 8_000 + universal_credit_pre_benefit_cap: 8_000 + uc_assessable_capital: 0 + uc_earned_income: 0 + uc_unearned_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HARTLEPOOL + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + hartlepool_council_tax_reduction_weekly_income: 153.85 + hartlepool_council_tax_reduction: 1_260 + council_tax_reduction: 1_260 + +- name: Hertsmere protected and non-protected UC branches use Schedule 6 rates + period: 2026 + absolute_error_margin: 0.5 + input: + people: + ordinary: + age: 35 + protected: + age: 35 + child: + age: 4 + benunits: + ordinary_benunit: + members: [ordinary] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 5_000 + universal_credit_pre_benefit_cap: 5_000 + uc_assessable_capital: 0 + protected_benunit: + members: [protected, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_lone_parent: true + universal_credit: 5_000 + universal_credit_pre_benefit_cap: 5_000 + uc_assessable_capital: 0 + households: + ordinary_household: + members: [ordinary] + country: ENGLAND + local_authority: HERTSMERE + council_tax_band: D + council_tax: 1_800 + savings: 0 + protected_household: + members: [protected, child] + country: ENGLAND + local_authority: HERTSMERE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + hertsmere_council_tax_reduction_uc_support_rate: [0.8, 1] + hertsmere_council_tax_reduction: [1_440, 1_800] + council_tax_reduction: [1_440, 1_800] + +- name: Hertsmere UC earnings apply the additional working disregard + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 7_384 + weekly_hours: 30 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: HERTSMERE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + hertsmere_council_tax_reduction_uc_weekly_earnings: 119.90 + hertsmere_council_tax_reduction_uc_support_rate: 0.6 + hertsmere_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Hertsmere protected UC non-dependant follows source 577 pound top bracket + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 4 + non_dep: + age: 25 + employment_income: 30_680 + weekly_hours: 16 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: true + is_lone_parent: true + universal_credit: 5_000 + universal_credit_pre_benefit_cap: 5_000 + uc_assessable_capital: 0 + other_benunit: + members: [non_dep] + households: + household: + members: [claimant, child, non_dep] + country: ENGLAND + local_authority: HERTSMERE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + hertsmere_council_tax_reduction_non_dep_deductions: [829.40, 0] + hertsmere_council_tax_reduction: [970.60, 0] + council_tax_reduction: 970.60 + +- name: Ashford awards 90 percent support in Band 1 for a single claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ashford_council_tax_reduction_weekly_income: 0 + ashford_council_tax_reduction_support_rate: 0.9 + ashford_council_tax_reduction: 1_620 + simulated_council_tax_reduction_benunit: 1_620 + council_tax_reduction: 1_620 + +- name: Ashford uses the adopted PDF single boundary at the first penny of Band 2 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 6_610.24 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ashford_council_tax_reduction_weekly_income: 127.12 + ashford_council_tax_reduction_support_rate: 0.75 + ashford_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Ashford uses the adopted PDF couple boundary at the first penny of Band 2 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + partner: + age: 35 + miscellaneous_income: 8_775.52 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ashford_council_tax_reduction_weekly_income: 168.76 + ashford_council_tax_reduction_support_rate: 0.75 + ashford_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Ashford caps Band H liability at the Band D equivalent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + ashford_council_tax_reduction_maximum_eligible_liability: 1_800 + ashford_council_tax_reduction: 1_620 + council_tax_reduction: 1_620 + +- name: Ashford allows exactly 10,000 pounds of capital but excludes one penny above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + claimant_over: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + over_limit: + members: [claimant_over] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 10_000 + over_limit_household: + members: [claimant_over] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 10_000.01 + output: + ashford_council_tax_reduction: [1_620, 0] + council_tax_reduction: [1_620, 0] + +- name: Ashford adds part-block tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 6_558.24 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + ashford_council_tax_reduction_weekly_tariff_income: 1 + ashford_council_tax_reduction_weekly_income: 127.12 + ashford_council_tax_reduction_support_rate: 0.75 + ashford_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Ashford disregards the UC housing element from UC award income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 15_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_housing_costs_element: 10_000 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + ashford_council_tax_reduction_weekly_income: 96.15 + ashford_council_tax_reduction_support_rate: 0.9 + ashford_council_tax_reduction: 1_620 + council_tax_reduction: 1_620 + +- name: Ashford applies the earnings disregard to UC assessed earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_housing_costs_element: 1 + uc_earned_income: 6_610.24 + uc_unearned_income: 0 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + ashford_council_tax_reduction_earnings_disregard: 1_300 + ashford_council_tax_reduction_weekly_income: 102.12 + ashford_council_tax_reduction_support_rate: 0.9 + ashford_council_tax_reduction: 1_620 + council_tax_reduction: 1_620 + +- name: Ashford applies the disability and carer disregard to non-UC other income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 7_910.24 + pip_dl: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ashford_council_tax_reduction_disability_or_carer_income_disregard: true + ashford_council_tax_reduction_weekly_income: 112.12 + ashford_council_tax_reduction_support_rate: 0.9 + ashford_council_tax_reduction: 1_620 + council_tax_reduction: 1_620 + +- name: Ashford applies the disability and carer disregard to UC other income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip_dl: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_housing_costs_element: 1 + uc_earned_income: 0 + uc_unearned_income: 7_911.24 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + ashford_council_tax_reduction_disability_or_carer_income_disregard: true + ashford_council_tax_reduction_weekly_income: 112.12 + ashford_council_tax_reduction_support_rate: 0.9 + ashford_council_tax_reduction: 1_620 + council_tax_reduction: 1_620 + +- name: Ashford requires tax credits before deducting childcare from non-UC earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 7_910.24 + childcare_expenses: 5_200 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ashford_council_tax_reduction_childcare_deduction: 0 + ashford_council_tax_reduction_weekly_income: 127.12 + ashford_council_tax_reduction_support_rate: 0.75 + ashford_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Ashford awards Band 1 support for income-based passporting benefits + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 26_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + income_support: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_relevant_income_based_benefit: true + ashford_council_tax_reduction_support_rate: 0.9 + ashford_council_tax_reduction: 1_620 + council_tax_reduction: 1_620 + +- name: Ashford excludes UC claimants whose UC-assessed capital exceeds 10,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_housing_costs_element: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 10_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ashford_council_tax_reduction_weekly_income: 0 + ashford_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Ashford deducts non-dependants from the award after applying the support rate + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + ashford_council_tax_reduction_non_dep_deductions: [520, 0] + ashford_council_tax_reduction: [1_100, 0] + council_tax_reduction: 1_100 + +- name: Ashford local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 5_000 + uc_housing_costs_element: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + ashford_council_tax_reduction_is_local_scheme: true + ashford_council_tax_reduction: 1_620 + simulated_council_tax_reduction_benunit: 1_620 + council_tax_reduction: 1_620 + +- name: Ashford local scheme covers mixed-age couples with a working-age applicant or partner + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + partner: + age: 70 + benunits: + benunit: + members: [claimant, partner] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant, partner] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + ashford_council_tax_reduction_is_local_scheme: true + ashford_council_tax_reduction: 1_620 + simulated_council_tax_reduction_benunit: 1_620 + council_tax_reduction: 1_620 + +- name: Ashford keeps regulation 60A pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 5_000 + uc_housing_costs_element: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + ashford_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + ashford_council_tax_reduction_is_local_scheme: false + ashford_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Ashford keeps relevant-period pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 5_000 + uc_housing_costs_element: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + ashford_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ASHFORD + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + ashford_council_tax_reduction_is_local_scheme: false + ashford_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Arun awards full support under the live 2026 working-age Band A table + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_weekly_income: 0 + arun_council_tax_reduction_support_rate: 1 + arun_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Arun uses the current web page boundary at the first pound of Band B + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 11_648 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_weekly_income: 224 + arun_council_tax_reduction_support_rate: 0.7 + arun_council_tax_reduction: 1_260 + council_tax_reduction: 1_260 + +- name: Arun awards no support above the live Band E income ceiling + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 25_480 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_weekly_income: 490 + arun_council_tax_reduction_support_rate: 0 + arun_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Arun allows exactly 6,000 pounds of capital but excludes one penny above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + claimant_over: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + over_limit: + members: [claimant_over] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + over_limit_household: + members: [claimant_over] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + arun_council_tax_reduction: [1_800, 0] + council_tax_reduction: [1_800, 0] + +- name: Arun disregards listed Universal Credit elements and uses UC-assessed capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 12_000 + uc_housing_costs_element: 4_000 + uc_carer_element: 3_000 + uc_LCWRA_element: 3_000 + arun_council_tax_reduction_source_uc_disregarded_elements: 2_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + arun_council_tax_reduction_weekly_income: 0 + arun_council_tax_reduction_support_rate: 1 + arun_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Arun excludes UC claimants whose UC-assessed capital exceeds 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1 + uc_housing_costs_element: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 6_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Arun deducts non-dependants before applying the income-band percentage + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 11_648 + non_dep: + age: 30 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: false + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_non_dep_deductions: [260, 0] + arun_council_tax_reduction: [1_078, 0] + council_tax_reduction: 1_078 + +- name: Arun applies one non-dependant deduction for a non-UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + weekly_hours: 16 + non_dep_partner: + age: 30 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + non_dep_benunit: + members: [non_dep, non_dep_partner] + is_couple: true + would_claim_uc: false + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_non_dep_deductions: [260, 0] + arun_council_tax_reduction: [1_540, 0] + council_tax_reduction: 1_540 + +- name: Arun exempts Universal Credit non-dependants from the flat deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + non_dep_benunit: + members: [non_dep] + would_claim_uc: true + universal_credit: 1 + uc_earned_income: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_non_dep_deductions: [0, 0] + arun_council_tax_reduction: [1_800, 0] + council_tax_reduction: 1_800 + +- name: Arun only exempts source-flagged Pension Credit Guarantee Credit non-dependants from the flat deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_guarantee_credit_non_dep: + age: 30 + weekly_hours: 16 + guarantee_credit_non_dep: + age: 30 + weekly_hours: 16 + arun_council_tax_reduction_non_dep_guarantee_credit: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + savings_credit_benunit: + members: [non_guarantee_credit_non_dep] + would_claim_uc: false + pension_credit: 1 + savings_credit: 1 + guarantee_credit_benunit: + members: [guarantee_credit_non_dep] + would_claim_uc: false + pension_credit: 1 + households: + household: + members: [claimant, non_guarantee_credit_non_dep, guarantee_credit_non_dep] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_individual_non_dep_deduction: [0, 260, 0] + arun_council_tax_reduction_non_dep_deductions: [260, 0, 260] + arun_council_tax_reduction: [1_540, 0, 0] + council_tax_reduction: 1_540 + +- name: Arun applies the one pound weekly minimum award after banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 21_944 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 500 + savings: 0 + output: + arun_council_tax_reduction_weekly_income: 422 + arun_council_tax_reduction_support_rate: 0.1 + arun_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Arun disregards Carer's Allowance from non-UC weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 11_647.48 + carers_allowance: 5_200 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_weekly_income: 223.99 + arun_council_tax_reduction_support_rate: 1 + arun_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Arun applies the Schedule 5 additional worker earnings disregard + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 12_948 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + weekly_hours: 16 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_earnings_disregard: 2_189.20 + arun_council_tax_reduction_weekly_income: 206.9 + arun_council_tax_reduction_support_rate: 1 + arun_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Arun applies the source Schedule 5 additional worker earnings disregard hook + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 24 + employment_income: 12_796.68 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 24 + benefits_premiums: 0 + arun_council_tax_reduction_source_additional_earnings_disregard: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_earnings_disregard: 1_149.20 + arun_council_tax_reduction_weekly_income: 223.99 + arun_council_tax_reduction_support_rate: 1 + arun_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Arun deducts eligible childcare from non-UC earnings before banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 11_648 + weekly_hours: 16 + childcare_expenses: 2_600 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_childcare_deduction: 2_600 + arun_council_tax_reduction_weekly_income: 131.9 + arun_council_tax_reduction_support_rate: 1 + arun_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Arun permits childcare for source-flagged disabled children aged under 16 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 3_120 + weekly_hours: 16 + childcare_expenses: 2_600 + child: + age: 15 + arun_council_tax_reduction_childcare_disabled_child: true + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_childcare_deduction: 2_600 + arun_council_tax_reduction_weekly_income: 0 + arun_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Arun permits childcare where one partner works and the other meets a source incapacity condition + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 3_120 + weekly_hours: 16 + childcare_expenses: 2_600 + partner: + age: 35 + arun_council_tax_reduction_childcare_incapacitated_partner: true + child: + age: 5 + benunits: + benunit: + members: [claimant, partner, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner, child] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + arun_council_tax_reduction_childcare_deduction: 2_600 + arun_council_tax_reduction_weekly_income: 0 + arun_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Arun passports income-based benefit claimants into Band A and disregards their capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 26_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + income_support: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + council_tax_reduction_relevant_income_based_benefit: true + arun_council_tax_reduction_support_rate: 1 + arun_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Arun local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 5_000 + uc_housing_costs_element: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + arun_council_tax_reduction_is_local_scheme: true + arun_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Arun routes pension-age UC relevant-period cases to the pensioner CTR scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 5_000 + uc_housing_costs_element: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + arun_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + arun_council_tax_reduction_is_local_scheme: false + arun_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Arun routes pension-age UC regulation 60A cases to the pensioner CTR scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 5_000 + uc_housing_costs_element: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + arun_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ARUN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + arun_council_tax_reduction_is_local_scheme: false + arun_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Bassetlaw awards 88 percent support at the top of Band 2 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 5_397.08 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_weekly_income: 103.79 + bassetlaw_council_tax_reduction_support_rate: 0.88 + bassetlaw_council_tax_reduction: 1_408 + simulated_council_tax_reduction_benunit: 1_408 + council_tax_reduction: 1_408 + +- name: Bassetlaw awards 65 percent support at the first penny of Band 3 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 5_397.60 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_weekly_income: 103.80 + bassetlaw_council_tax_reduction_support_rate: 0.65 + bassetlaw_council_tax_reduction: 1_040 + council_tax_reduction: 1_040 + +- name: Bassetlaw awards no support at the first penny above Band 5 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 21_931 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_weekly_income: 421.75 + bassetlaw_council_tax_reduction_support_rate: 0 + bassetlaw_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Bassetlaw awards 45 percent support at the first penny of Band 4 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 12_101.96 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_weekly_income: 232.73 + bassetlaw_council_tax_reduction_support_rate: 0.45 + bassetlaw_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: Bassetlaw awards 25 percent support at the first penny of Band 5 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 16_046.16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_weekly_income: 308.58 + bassetlaw_council_tax_reduction_support_rate: 0.25 + bassetlaw_council_tax_reduction: 400 + council_tax_reduction: 400 + +- name: Bassetlaw awards 95 percent support to the SDP transitional class + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + bassetlaw_council_tax_reduction_sdp_transitional_award: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_support_rate: 0.95 + bassetlaw_council_tax_reduction: 1_520 + council_tax_reduction: 1_520 + +- name: Bassetlaw caps Band D liability at the Band C equivalent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + bassetlaw_council_tax_reduction_maximum_eligible_liability: 1_600 + bassetlaw_council_tax_reduction: 1_408 + council_tax_reduction: 1_408 + +- name: Bassetlaw allows exactly 16,000 pounds of capital but excludes one penny above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + claimant_over: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + over_limit: + members: [claimant_over] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 16_000 + over_limit_household: + members: [claimant_over] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 16_000.01 + output: + bassetlaw_council_tax_reduction: [1_408, 0] + council_tax_reduction: [1_408, 0] + +- name: Bassetlaw adds part-block tariff income above 6,000 pounds of capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 5_345.60 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 6_000.01 + output: + bassetlaw_council_tax_reduction_weekly_tariff_income: 1 + bassetlaw_council_tax_reduction_weekly_income: 103.80 + bassetlaw_council_tax_reduction_support_rate: 0.65 + bassetlaw_council_tax_reduction: 1_040 + council_tax_reduction: 1_040 + +- name: Bassetlaw applies the earnings disregard before income banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_657.08 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + weekly_hours: 10 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_earnings_disregard: 260 + bassetlaw_council_tax_reduction_weekly_income: 103.79 + bassetlaw_council_tax_reduction_support_rate: 0.88 + bassetlaw_council_tax_reduction: 1_408 + council_tax_reduction: 1_408 + +- name: Bassetlaw treats maximum Universal Credit as Band 2 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 12_000 + uc_maximum_amount: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 20_000 + output: + bassetlaw_council_tax_reduction_weekly_income: 230.77 + bassetlaw_council_tax_reduction_support_rate: 0.88 + bassetlaw_council_tax_reduction: 1_408 + council_tax_reduction: 1_408 + +- name: Bassetlaw uses UC assessed income and capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + uc_earned_income: 10_400 + uc_unearned_income: 0 + uc_housing_costs_element: 0 + uc_reported_capital: 16_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 20_000 + output: + bassetlaw_council_tax_reduction_weekly_income: 219.23 + bassetlaw_council_tax_reduction_support_rate: 0.65 + bassetlaw_council_tax_reduction: 1_040 + council_tax_reduction: 1_040 + +- name: Bassetlaw uses UC assessed income net of housing plus the full UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 5_200 + uc_maximum_amount: 10_400 + uc_earned_income: 7_800 + uc_unearned_income: 0 + uc_housing_costs_element: 5_200 + uc_reported_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_weekly_income: 250 + bassetlaw_council_tax_reduction_support_rate: 0.45 + bassetlaw_council_tax_reduction: 720 + council_tax_reduction: 720 + +- name: Bassetlaw deducts non-dependants before applying the support percentage + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 5_397.60 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_non_dep_deductions: [208, 0] + bassetlaw_council_tax_reduction: [904.80, 0] + council_tax_reduction: 904.80 + +- name: Bassetlaw applies one working non-dependant deduction for a non-UC couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 25 + weekly_hours: 16 + non_dep_2: + age: 25 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep_1, non_dep_2] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_non_dep_deductions: [520, 0] + bassetlaw_council_tax_reduction: [950.40, 0] + council_tax_reduction: 950.40 + +- name: Bassetlaw counts both working non-dependants in a UC couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 25 + weekly_hours: 16 + bassetlaw_council_tax_reduction_non_dep_uc_earned_income: 1 + non_dep_2: + age: 25 + weekly_hours: 16 + bassetlaw_council_tax_reduction_non_dep_uc_earned_income: 1 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep_1, non_dep_2] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_non_dep_deductions: [1_040, 0] + bassetlaw_council_tax_reduction: [492.80, 0] + council_tax_reduction: 492.80 + +- name: Bassetlaw exempts UC non-dependants whose UC calculation has no earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + weekly_hours: 16 + bassetlaw_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_non_dep_deductions: [0, 0] + bassetlaw_council_tax_reduction: [1_408, 0] + council_tax_reduction: 1_408 + +- name: Bassetlaw deducts childcare from tax credits when earnings do not absorb it + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_200 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + weekly_hours: 16 + childcare_expenses: 20_000 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + tax_credits: 15_000 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + bassetlaw_council_tax_reduction_childcare_deduction: 9_100 + bassetlaw_council_tax_reduction_weekly_income: 213.46 + bassetlaw_council_tax_reduction_support_rate: 0.65 + bassetlaw_council_tax_reduction: 1_040 + council_tax_reduction: 1_040 + +- name: Bassetlaw local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 12_000 + uc_maximum_amount: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + bassetlaw_council_tax_reduction_is_local_scheme: true + bassetlaw_council_tax_reduction: 1_408 + simulated_council_tax_reduction_benunit: 1_408 + council_tax_reduction: 1_408 + +- name: Bassetlaw keeps relevant-period pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 12_000 + uc_maximum_amount: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + bassetlaw_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + bassetlaw_council_tax_reduction_is_local_scheme: false + bassetlaw_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_600 + council_tax_reduction: 1_600 + +- name: Bassetlaw keeps regulation 60A pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 70 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 70 + benefits_premiums: 0 + universal_credit: 12_000 + uc_maximum_amount: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_reported_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + bassetlaw_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BASSETLAW + council_tax_band: C + council_tax: 1_600 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + bassetlaw_council_tax_reduction_is_local_scheme: false + bassetlaw_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_600 + council_tax_reduction: 1_600 + +- name: Cheltenham awards full support at the top of the single Band 1 income range + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 5_980 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_weekly_income: 115 + cheltenham_council_tax_reduction_support_rate: 1 + cheltenham_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Cheltenham awards 80 percent support at the first penny above single Band 1 + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 5_980.52 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_weekly_income: 115.01 + cheltenham_council_tax_reduction_support_rate: 0.8 + cheltenham_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Cheltenham awards no support above the single Band 5 income range + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 13_261 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_weekly_income: 255.02 + cheltenham_council_tax_reduction_support_rate: 0 + cheltenham_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Cheltenham selects the couple four-or-more-child income-band column + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 22_672 + partner: + age: 35 + child_1: + age: 5 + child_2: + age: 7 + child_3: + age: 9 + child_4: + age: 11 + benunits: + benunit: + members: [claimant, partner, child_1, child_2, child_3, child_4] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, partner, child_1, child_2, child_3, child_4] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_weekly_income: 436 + cheltenham_council_tax_reduction_support_rate: 1 + cheltenham_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Cheltenham follows the published lone-parent three-child income-band gap + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 24_440 + child_1: + age: 5 + child_2: + age: 7 + child_3: + age: 9 + benunits: + benunit: + members: [claimant, child_1, child_2, child_3] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child_1, child_2, child_3] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_weekly_income: 470 + cheltenham_council_tax_reduction_support_rate: 0 + cheltenham_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Cheltenham allows exactly 6,000 pounds of capital but excludes one penny above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + claimant_over: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + over_limit: + members: [claimant_over] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + over_limit_household: + members: [claimant_over] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + cheltenham_council_tax_reduction: [1_800, 0] + council_tax_reduction: [1_800, 0] + +- name: Cheltenham caps Band H liability at the Band E equivalent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: H + council_tax: 3_600 + savings: 0 + output: + cheltenham_council_tax_reduction_maximum_eligible_liability: 2_200 + cheltenham_council_tax_reduction: 2_200 + council_tax_reduction: 2_200 + +- name: Cheltenham deducts the non-working non-dependant amount before applying the support percentage + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_500.52 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + weekly_hours: 16 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_non_dep_deductions: [260, 0] + cheltenham_council_tax_reduction: [1_232, 0] + council_tax_reduction: 1_232 + +- name: Cheltenham uses the remunerative-work non-dependant gross income bands + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + weekly_hours: 16 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_non_dep_deductions: [530.40, 0] + cheltenham_council_tax_reduction: [1_269.60, 0] + council_tax_reduction: 1_269.60 + +- name: Cheltenham treats low-hours positive non-dependant earnings as not remunerative work + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + weekly_hours: 15 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_non_dep_deductions: [260, 0] + cheltenham_council_tax_reduction: [1_540, 0] + council_tax_reduction: 1_540 + +- name: Cheltenham exempts UC non-dependants whose UC calculation has no earned income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + employment_income: 15_600 + weekly_hours: 16 + cheltenham_council_tax_reduction_non_dep_uc_earned_income: 0 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + universal_credit: 1_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_non_dep_deductions: [0, 0] + cheltenham_council_tax_reduction: [1_800, 0] + council_tax_reduction: 1_800 + +- name: Cheltenham applies the one-child childcare cap before income banding + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 15_600 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + weekly_hours: 16 + childcare_expenses: 20_000 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_childcare_deduction: 9_100 + cheltenham_council_tax_reduction_weekly_income: 115 + cheltenham_council_tax_reduction_support_rate: 1 + cheltenham_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Cheltenham deducts childcare from tax credits when earnings do not absorb it + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 5_200 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + weekly_hours: 16 + childcare_expenses: 20_000 + child: + age: 5 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + tax_credits: 15_000 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_childcare_deduction: 9_100 + cheltenham_council_tax_reduction_weekly_income: 213.46 + cheltenham_council_tax_reduction_support_rate: 1 + cheltenham_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Cheltenham applies the disabled child weekly income disregard + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + miscellaneous_income: 16_380 + child: + age: 5 + cheltenham_council_tax_reduction_source_disabled_child: true + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_disabled_child_disregard: 10_400 + cheltenham_council_tax_reduction_weekly_income: 115 + cheltenham_council_tax_reduction_support_rate: 1 + cheltenham_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Cheltenham uses UC assessed income before earnings disregard plus the adjusted UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_housing_costs_element: 500 + uc_unearned_income: 0 + uc_assessable_capital: 0 + cheltenham_council_tax_reduction_uc_earned_income_before_disregard: 6_000.52 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_weekly_income: 115.01 + cheltenham_council_tax_reduction_support_rate: 0.8 + cheltenham_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + +- name: Cheltenham defaults UC earnings to UC income before the work allowance + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 6_000.52 + income_tax: 0 + national_insurance: 0 + pension_contributions: 0 + uc_limited_capability_for_WRA: true + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_LCWRA_element: 0 + uc_housing_costs_element: 500 + uc_unearned_income: 0 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_uc_earned_income_before_disregard: 6_000.52 + cheltenham_council_tax_reduction_weekly_income: 115.01 + cheltenham_council_tax_reduction_support_rate: 0.8 + cheltenham_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Cheltenham disregards UC transitional protection from the UC award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_housing_costs_element: 500 + uc_unearned_income: 0 + uc_assessable_capital: 0 + cheltenham_council_tax_reduction_uc_earned_income_before_disregard: 6_000.52 + cheltenham_council_tax_reduction_uc_transitional_protection: 500 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_weekly_income: 105.39 + cheltenham_council_tax_reduction_support_rate: 1 + cheltenham_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Cheltenham applies the UC-assessed capital limit for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_unearned_income: 0 + uc_assessable_capital: 6_000.01 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheltenham_council_tax_reduction_support_rate: 1 + cheltenham_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Cheltenham keeps pension-age income-based benefit claimants in the local scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + income_support: 1_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + cheltenham_council_tax_reduction_is_local_scheme: true + cheltenham_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Cheltenham keeps pension-age Universal Credit claimants in the local scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_unearned_income: 0 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHELTENHAM + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + cheltenham_council_tax_reduction_is_local_scheme: true + cheltenham_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Cheshire West and Chester zeros awards below the 2 pound weekly minimum + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 6_232.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheshire_west_and_chester_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Cheshire West and Chester starts war pensioner tariff income just above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + cheshire_west_and_chester_council_tax_reduction_war_pensioner: true + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 6_000.01 + output: + cheshire_west_and_chester_council_tax_reduction_war_pensioner_tariff_income: 52 + cheshire_west_and_chester_council_tax_reduction: 1_789.60 + council_tax_reduction: 1_789.60 + +- name: Cheshire West and Chester applies war pensioner tariff income up to 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + cheshire_west_and_chester_council_tax_reduction_war_pensioner: true + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + output: + cheshire_west_and_chester_council_tax_reduction_war_pensioner_tariff_income: 2_080 + cheshire_west_and_chester_council_tax_reduction: 1_384 + council_tax_reduction: 1_384 + +- name: Cheshire West and Chester local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 12_000 + universal_credit_pre_benefit_cap: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + cheshire_west_and_chester_council_tax_reduction_is_local_scheme: true + cheshire_west_and_chester_council_tax_reduction: 1_350 + simulated_council_tax_reduction_benunit: 1_350 + council_tax_reduction: 1_350 + +- name: Cheshire West and Chester keeps relevant-period pension-age UC claimants in the pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 12_000 + universal_credit_pre_benefit_cap: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_reported_capital: 1_000 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + cheshire_west_and_chester_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + cheshire_west_and_chester_council_tax_reduction_is_local_scheme: false + cheshire_west_and_chester_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Cheshire West and Chester makes one non-dependant deduction for a working couple using joint gross income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 30 + employment_income: 10_000 + weekly_hours: 16 + non_dep_2: + age: 30 + employment_income: 5_000 + weekly_hours: 0 + benunits: + claimant_benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + non_dep_benunit: + members: [non_dep_1, non_dep_2] + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheshire_west_and_chester_council_tax_reduction_non_dep_deductions: [520, 0] + cheshire_west_and_chester_council_tax_reduction: [830, 0] + council_tax_reduction: 830 + +- name: Cheshire West and Chester still deducts for non-dependants on income-based benefits + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + weekly_hours: 0 + benunits: + claimant_benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 4_786.60 + non_dep_benunit: + members: [non_dep] + jsa_income: 1 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: CHESHIRE_WEST_AND_CHESTER + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + cheshire_west_and_chester_council_tax_reduction_non_dep_deductions: [260, 0] + cheshire_west_and_chester_council_tax_reduction: [1_090, 0] + council_tax_reduction: 1_090 + +- name: East Hampshire working-age claimant can receive full Council Tax Support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EAST_HAMPSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + east_hampshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: East Hampshire excludes working-age claimants with capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EAST_HAMPSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 16_000.01 + output: + east_hampshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: East Hampshire withdraws 20 percent of annual excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 5_786.60 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EAST_HAMPSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + east_hampshire_council_tax_reduction: 1_600 + council_tax_reduction: 1_600 + +- name: East Hampshire Universal Credit cases use UC assessed income and capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_earned_income: 6_000 + uc_unearned_income: 1_000 + uc_maximum_amount: 6_000 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EAST_HAMPSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + east_hampshire_council_tax_reduction: 1_400 + council_tax_reduction: 1_400 + +- name: East Hampshire counts both non-dependants in a Universal Credit couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 30 + employment_income: 15_600 + weekly_hours: 16 + non_dep_2: + age: 30 + employment_income: 15_600 + weekly_hours: 0 + benunits: + claimant_benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep_1, non_dep_2] + universal_credit: 1 + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: EAST_HAMPSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + east_hampshire_council_tax_reduction_non_dep_deductions: [1_383.20, 0] + east_hampshire_council_tax_reduction: [416.80, 0] + council_tax_reduction: 416.80 + +- name: East Hampshire still deducts for a 25 year old Universal Credit non-dependant with no earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + claimant_benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 4_786.60 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + universal_credit: 1 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: EAST_HAMPSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + east_hampshire_council_tax_reduction_non_dep_deductions: [270.40, 0] + east_hampshire_council_tax_reduction: [1_529.60, 0] + council_tax_reduction: 1_529.60 + +- name: East Hampshire local scheme covers pension-age UC claimants without double-counting pensioner CTR + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 12_000 + universal_credit_pre_benefit_cap: 12_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_maximum_amount: 12_000 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: EAST_HAMPSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_household_has_pensioner: true + east_hampshire_council_tax_reduction_is_local_scheme: true + east_hampshire_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Brentwood single working-age claimant on no income receives Band 1 75 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + council_tax_reduction_scheme_supported: true + brentwood_council_tax_reduction_is_local_scheme: true + brentwood_council_tax_reduction: 1_350 + simulated_council_tax_reduction_benunit: 1_350 + council_tax_reduction: 1_350 + council_tax_less_benefit: 450 + +- name: Brentwood routes income-based-benefit applicants to Band 1 75 percent support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 25_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + jsa_income: 1 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Brentwood applies the 20 pound weekly net earnings disregard + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 8_320 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_weekly_income: 140 + brentwood_council_tax_reduction: 1_350 + council_tax_reduction: 1_350 + +- name: Brentwood counts tax credits as income other than earnings + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + tax_credits: 8_320 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_weekly_income: 160 + brentwood_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Brentwood applies the protected-group 100 percent uplift to a DLA claimant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + dla_sc: 4_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_protected_group: true + brentwood_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Brentwood does not apply the protected-group uplift for a disabled non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + dla_sc: 4_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_protected_group: [false, true] + brentwood_council_tax_reduction: [1_350, 0] + council_tax_reduction: 1_350 + +- name: Brentwood applies the protected-group uplift via Armed Forces Independence Payment + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + armed_forces_independence_payment: 1_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_protected_group: true + brentwood_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Brentwood applies the protected-group uplift via the ESA Support Component source input + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + brentwood_council_tax_reduction_esa_support_component: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_protected_group: true + brentwood_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Brentwood applies the protected-group uplift via the WTC disability element source input + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + brentwood_council_tax_reduction_wtc_disability_element: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_protected_group: true + brentwood_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Brentwood applies the protected-group uplift via the UC LCW element source input + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 8_000 + universal_credit_pre_benefit_cap: 8_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + brentwood_council_tax_reduction_uc_lcw_element: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_protected_group: true + brentwood_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Brentwood excludes working-age claimants with capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 6_001 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Brentwood drops a single applicant to zero discount above 375 pounds weekly income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + employment_income: 25_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Brentwood gives zero support to working-age homeowners in Band F + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: F + council_tax: 2_600 + savings: 0 + tenure_type: OWNED_OUTRIGHT + output: + brentwood_council_tax_reduction_band_fgh_owner_excluded: true + brentwood_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Brentwood still pays Band F private renters at the discount rate + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: F + council_tax: 2_600 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_band_fgh_owner_excluded: false + brentwood_council_tax_reduction: 1_950 + council_tax_reduction: 1_950 + +- name: Brentwood uses UC-assessed capital and UC-assessed income for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 9_000 + universal_credit_pre_benefit_cap: 9_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_is_local_scheme: true + brentwood_council_tax_reduction: 900 + council_tax_reduction: 900 + +- name: Brentwood excludes UC claimants with UC-assessed capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 6_000 + universal_credit_pre_benefit_cap: 6_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 6_001 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Brentwood treats pension-age UC claimants as local scheme cases + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_is_local_scheme: true + brentwood_council_tax_reduction: 1_350 + simulated_council_tax_reduction_benunit: 1_350 + council_tax_reduction: 1_350 + +- name: Brentwood regulation 60A pensioner stays on the national pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + brentwood_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRENTWOOD + council_tax_band: D + council_tax: 1_800 + savings: 0 + tenure_type: RENT_PRIVATELY + output: + brentwood_council_tax_reduction_is_local_scheme: false + brentwood_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: West Berkshire non-vulnerable working-age claimant gets 70 percent of Band C-capped liability + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + west_berkshire_council_tax_reduction_is_local_scheme: true + west_berkshire_council_tax_reduction_vulnerable_group: false + west_berkshire_council_tax_reduction_maximum_eligible_liability: 1_600 + west_berkshire_council_tax_reduction: 1_120 + simulated_council_tax_reduction_benunit: 1_120 + council_tax_reduction: 1_120 + council_tax_less_benefit: 680 + +- name: West Berkshire excludes non-vulnerable working-age claimants with capital above 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_001 + output: + west_berkshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: West Berkshire excludes non-vulnerable working-age claimants with capital exactly 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 6_000 + output: + west_berkshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: West Berkshire vulnerable claimant with War Pension source input gets full prescribed support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + west_berkshire_council_tax_reduction_war_pension: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 15_000 + output: + west_berkshire_council_tax_reduction_vulnerable_group: true + west_berkshire_council_tax_reduction_maximum_eligible_liability: 1_800 + west_berkshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: West Berkshire UC LCW element source input puts the claimant in the vulnerable category + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + west_berkshire_council_tax_reduction_uc_lcw_element: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction_vulnerable_group: true + west_berkshire_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: West Berkshire uses UC-assessed capital for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + west_berkshire_council_tax_reduction: 1_120 + council_tax_reduction: 1_120 + +- name: West Berkshire excludes UC claimants with UC-assessed capital exactly 6,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 6_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: West Berkshire uses UC-assessed income for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 5_000 + uc_assessable_capital: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction: 820 + council_tax_reduction: 820 + +- name: West Berkshire disabled non-dependant does not put the claimant in the vulnerable category + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + dla_sc: 6_000 + benunits: + claimant_benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction_vulnerable_group: [false, true] + west_berkshire_council_tax_reduction: [849.60, 0] + council_tax_reduction: 849.60 + +- name: West Berkshire counts both members of a UC non-dependant couple + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 5_000 + hours_worked: 832 + non_dep_partner: + age: 30 + employment_income: 5_000 + hours_worked: 832 + benunits: + claimant_benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + non_dep_benunit: + members: [non_dep, non_dep_partner] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep, non_dep_partner] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction_non_dep_deductions: [540.80, 0] + west_berkshire_council_tax_reduction: [579.20, 0] + council_tax_reduction: 579.20 + +- name: West Berkshire applies a 30 percent taper to Class E non-vulnerable working-age claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 5_500 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction: 670 + council_tax_reduction: 670 + +- name: West Berkshire applies a 20 percent taper to Class E1 vulnerable working-age claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 5_500 + west_berkshire_council_tax_reduction_war_pension: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction_vulnerable_group: true + west_berkshire_council_tax_reduction: 1_500 + council_tax_reduction: 1_500 + +- name: West Berkshire withholds non-vulnerable awards below the 10 pound weekly minimum + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 7_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: West Berkshire counts non-earnings income for Class E non-vulnerable claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 5_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction: 820 + council_tax_reduction: 820 + +- name: West Berkshire pension-age applicant uses the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction_is_local_scheme: false + west_berkshire_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: West Berkshire pension-age UC claimant is treated as a local working-age case + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction_is_local_scheme: true + west_berkshire_council_tax_reduction: 1_120 + simulated_council_tax_reduction_benunit: 1_120 + council_tax_reduction: 1_120 + +- name: West Berkshire UC relevant-period pensioner stays on the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + west_berkshire_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction_is_local_scheme: false + west_berkshire_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: West Berkshire regulation 60A pensioner stays on the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + west_berkshire_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: WEST_BERKSHIRE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + west_berkshire_council_tax_reduction_is_local_scheme: false + west_berkshire_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Tendring working-age claimant on no income receives 80 percent of council tax + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + tendring_council_tax_reduction_is_local_scheme: true + tendring_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + council_tax_less_benefit: 360 + +- name: Tendring long-duration JSA claimant receives 60 percent maximum support + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + tendring_council_tax_reduction_jsa_three_years: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tendring_council_tax_reduction: 1_080 + council_tax_reduction: 1_080 + +- name: Tendring excludes working-age claimants with capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 16_001 + output: + tendring_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Tendring allows working-age claimants with capital exactly at 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + output: + tendring_council_tax_reduction: 1_440 + council_tax_reduction: 1_440 + +- name: Tendring applies a 20 percent taper to annual excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 6_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tendring_council_tax_reduction: 1_040 + council_tax_reduction: 1_040 + +- name: Tendring counts non-dependent income but does not apply non-dependant deductions + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 25 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 25 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 2_000 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tendring_council_tax_reduction_applicable_income: [2_000, 2_000] + tendring_council_tax_reduction_non_dep_deductions: [0, 0] + tendring_council_tax_reduction: [1_040, 0] + council_tax_reduction: 1_040 + +- name: Tendring uses UC maximum amount and UC assessed income for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 7_000 + universal_credit_pre_benefit_cap: 7_000 + uc_maximum_amount: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 4_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tendring_council_tax_reduction_is_local_scheme: true + tendring_council_tax_reduction: 1_040 + council_tax_reduction: 1_040 + +- name: Tendring excludes UC claimants with UC-assessed capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 5_000 + universal_credit_pre_benefit_cap: 5_000 + uc_maximum_amount: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 16_001 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tendring_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Tendring treats pension-age UC claimants as local scheme cases + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tendring_council_tax_reduction_is_local_scheme: true + tendring_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + +- name: Tendring relevant-period pensioner stays on the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + tendring_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tendring_council_tax_reduction_is_local_scheme: false + tendring_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Tendring regulation 60A pensioner stays on the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + tendring_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TENDRING + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tendring_council_tax_reduction_is_local_scheme: false + tendring_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: St Helens working-age claimant on no income receives 80 percent of council tax + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + st_helens_council_tax_reduction_is_local_scheme: true + st_helens_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + council_tax_reduction: 1_440 + council_tax_less_benefit: 360 + +- name: St Helens excludes working-age claimants with capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 16_500 + output: + st_helens_council_tax_reduction_is_local_scheme: true + st_helens_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 0 + +- name: St Helens allows working-age claimants with capital exactly at 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + output: + st_helens_council_tax_reduction_is_local_scheme: true + st_helens_council_tax_reduction: 1_440 + simulated_council_tax_reduction_benunit: 1_440 + +- name: St Helens applies a 20 percent taper to annual excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 200 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + st_helens_council_tax_reduction_is_local_scheme: true + st_helens_council_tax_reduction: 1_400 + +- name: St Helens caps Band F liability at the Band D amount + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: F + council_tax: 2_600 + savings: 0 + output: + st_helens_council_tax_reduction_is_local_scheme: true + st_helens_council_tax_reduction: 1_440 + +- name: St Helens cancels awards below the 1 pound weekly minimum + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 7_100 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + st_helens_council_tax_reduction_is_local_scheme: true + st_helens_council_tax_reduction: 0 + +- name: St Helens makes no working-age non-dependant deduction + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 35 + employment_income: 30_000 + benunits: + claimant_benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction: 1_440 + council_tax_less_benefit: 360 + +- name: St Helens uses UC maximum amount and UC assessed income for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 200 + universal_credit_pre_benefit_cap: 200 + uc_maximum_amount: 10_000 + uc_earned_income: 10_500 + uc_unearned_income: 0 + uc_assessable_capital: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + st_helens_council_tax_reduction_is_local_scheme: true + st_helens_council_tax_reduction: 1_300 + +- name: St Helens uses UC-assessed capital instead of household savings for UC claimants + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 200 + universal_credit_pre_benefit_cap: 200 + uc_maximum_amount: 200 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + st_helens_council_tax_reduction_is_local_scheme: true + st_helens_council_tax_reduction: 1_440 + +- name: St Helens excludes UC claimants with UC-assessed capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 200 + universal_credit_pre_benefit_cap: 200 + uc_maximum_amount: 200 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 16_500 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + st_helens_council_tax_reduction_is_local_scheme: true + st_helens_council_tax_reduction: 0 + +- name: St Helens regulation 60A pensioner stays on the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + st_helens_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: ST_HELENS + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + st_helens_council_tax_reduction_is_local_scheme: false + st_helens_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Tewkesbury working-age claimant on no income receives full council tax + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + tewkesbury_council_tax_reduction_is_local_scheme: true + tewkesbury_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + council_tax_less_benefit: 0 + +- name: Tewkesbury excludes working-age claimants with capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 16_500 + output: + tewkesbury_council_tax_reduction_is_local_scheme: true + tewkesbury_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 0 + +- name: Tewkesbury working-age claimant with exactly 16,000 pounds capital remains eligible + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 16_000 + output: + tewkesbury_council_tax_reduction_is_local_scheme: true + tewkesbury_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + +- name: Tewkesbury applies the Default Scheme 20 percent taper to excess income + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 0 + council_tax_reduction_applicable_income: 200 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tewkesbury_council_tax_reduction_is_local_scheme: true + tewkesbury_council_tax_reduction: 1_760 + +- name: Tewkesbury applies Default Scheme non-dependant deduction to a low-income non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 5_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tewkesbury_council_tax_reduction: [1_610.20, 0] + council_tax_reduction: 1_610.20 + +- name: Tewkesbury UC claimant with high household savings but low UC capital is eligible + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_assessable_capital: 0 + uc_maximum_amount: 5_000 + uc_earned_income: 0 + uc_unearned_income: 0 + council_tax_reduction_applicable_income: 99_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + tewkesbury_council_tax_reduction: 1_800 + council_tax_reduction: 1_800 + +- name: Tewkesbury UC claimant uses UC assessed income plus award for the taper + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_assessable_capital: 0 + uc_maximum_amount: 5_000 + uc_earned_income: 6_000 + uc_unearned_income: 0 + council_tax_reduction_applicable_income: 99_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tewkesbury_council_tax_reduction: 1_400 + council_tax_reduction: 1_400 + +- name: Tewkesbury excludes UC claimants with UC-assessed capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_assessable_capital: 16_001 + uc_maximum_amount: 5_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tewkesbury_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Tewkesbury pension-age UC claimant without carve-out uses the local Default Scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tewkesbury_council_tax_reduction_is_local_scheme: true + tewkesbury_council_tax_reduction: 1_800 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Tewkesbury regulation 60A pensioner stays on the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + tewkesbury_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tewkesbury_council_tax_reduction_is_local_scheme: false + tewkesbury_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Tewkesbury relevant-period pensioner stays on the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_maximum_amount: 10_000 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + tewkesbury_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: TEWKESBURY + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + tewkesbury_council_tax_reduction_is_local_scheme: false + tewkesbury_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Forest of Dean Class A single applicant on no income receives 90 percent of council tax + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + forest_of_dean_council_tax_reduction_is_local_scheme: true + forest_of_dean_council_tax_reduction: 1_620 + simulated_council_tax_reduction_benunit: 1_620 + council_tax_reduction: 1_620 + council_tax_less_benefit: 180 + +- name: Forest of Dean excludes Class A applicant with capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 16_500 + output: + forest_of_dean_council_tax_reduction_is_local_scheme: true + forest_of_dean_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 0 + +- name: Forest of Dean routes income-based benefit applicants to the top band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + jsa_income: 1 + council_tax_reduction_applicable_income: 99_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction_weekly_income: 0 + forest_of_dean_council_tax_reduction: 1_620 + +- name: Forest of Dean Class A single applicant in Band 2 receives 70 percent of council tax + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 5_200 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction_is_local_scheme: true + forest_of_dean_council_tax_reduction: 1_260 + +- name: Forest of Dean Class A single applicant in Band 6 receives 0 percent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 10_400 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction_is_local_scheme: true + forest_of_dean_council_tax_reduction: 0 + +- name: Forest of Dean Class B protected PIP applicant on no income receives 95 percent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + pip: 4_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction_is_local_scheme: true + forest_of_dean_council_tax_reduction_protected_group: true + forest_of_dean_council_tax_reduction: 1_710 + +- name: Forest of Dean Class B protected war pension recipient via source input + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + forest_of_dean_council_tax_reduction_war_pension: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction_protected_group: true + forest_of_dean_council_tax_reduction: 1_710 + +- name: Forest of Dean Class B protects applicants through a dependent child DLA award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + child: + age: 5 + dla: 3_000 + benunits: + benunit: + members: [claimant, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: false + is_lone_parent: true + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant, child] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction_protected_group: true + forest_of_dean_council_tax_reduction: 1_710 + +- name: Forest of Dean caps Band F liability at the Band E equivalent + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: F + council_tax: 2_600 + savings: 0 + output: + forest_of_dean_council_tax_reduction_is_local_scheme: true + forest_of_dean_council_tax_reduction: 1_980 + +- name: Forest of Dean applies prescribed non-dependant deduction to a low-income non-dependant + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep: + age: 30 + employment_income: 5_000 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + other_benunit: + members: [non_dep] + claims_all_entitled_benefits: false + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction: [1_349.60, 0] + council_tax_reduction: 1_349.60 + +- name: Forest of Dean applies one non-dependant deduction to Universal Credit couples + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + non_dep_1: + age: 30 + employment_income: 10_000 + weekly_hours: 20 + non_dep_2: + age: 30 + employment_income: 10_000 + weekly_hours: 20 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + non_dep_couple: + members: [non_dep_1, non_dep_2] + claims_all_entitled_benefits: false + would_claim_uc: true + universal_credit: 1 + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 30 + benefits_premiums: 0 + households: + household: + members: [claimant, non_dep_1, non_dep_2] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction: [1_068.80, 0] + council_tax_reduction: 1_068.80 + +- name: Forest of Dean UC claimant uses UC-assessed income and capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1_000 + universal_credit_pre_benefit_cap: 1_000 + uc_assessable_capital: 0 + uc_earned_income: 4_800 + uc_unearned_income: 0 + council_tax_reduction_applicable_income: 99_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + forest_of_dean_council_tax_reduction_weekly_income: 111.54 + forest_of_dean_council_tax_reduction: 1_260 + council_tax_reduction: 1_260 + +- name: Forest of Dean excludes UC claimants with UC-assessed capital above 16,000 pounds + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_assessable_capital: 16_001 + uc_earned_income: 0 + uc_unearned_income: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction: 0 + council_tax_reduction: 0 + +- name: Forest of Dean couple with children in Band 2 receives 70 percent of council tax + period: 2026 + absolute_error_margin: 0.5 + input: + people: + adult_1: + age: 35 + adult_2: + age: 35 + child: + age: 5 + benunits: + benunit: + members: [adult_1, adult_2, child] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 13_000 + households: + household: + members: [adult_1, adult_2, child] + country: ENGLAND + local_authority: FOREST_OF_DEAN + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + forest_of_dean_council_tax_reduction: 1_260 + +- name: Braintree single no children on no income receives the 77 percent Band 1 award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_scheme_supported: true + braintree_council_tax_reduction_is_local_scheme: true + braintree_council_tax_reduction: 1_386 + simulated_council_tax_reduction_benunit: 1_386 + council_tax_reduction: 1_386 + +- name: Braintree excludes applicants with capital of 10,000 pounds or above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 10_000 + output: + braintree_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 0 + +- name: Braintree allows applicants with capital just below the 10,000 pound limit + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 9_999 + output: + braintree_council_tax_reduction: 1_386 + +- name: Braintree single no children at weekly income 150 receives the 50 percent band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 7_800 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + braintree_council_tax_reduction: 900 + +- name: Braintree single no children at weekly income 300 receives the zero percent band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 15_600 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + braintree_council_tax_reduction: 0 + +- name: Braintree couple with two children at weekly income 300 receives the 25 percent band + period: 2026 + absolute_error_margin: 0.5 + input: + people: + adult_1: + age: 35 + adult_2: + age: 35 + child_1: + age: 5 + child_2: + age: 8 + benunits: + benunit: + members: [adult_1, adult_2, child_1, child_2] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: false + is_couple: true + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 15_600 + households: + household: + members: [adult_1, adult_2, child_1, child_2] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + braintree_council_tax_reduction: 450 + +- name: Braintree passported income-based JSA claimant gets the Band 1 77 percent award + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: false + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 15_600 + jsa_income: 4_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + braintree_council_tax_reduction: 1_386 + +- name: Braintree UC claimant uses DWP-assessed UC income and remains capital eligible via UC capital + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 200 + universal_credit_pre_benefit_cap: 200 + uc_earned_income: 7_600 + uc_unearned_income: 0 + uc_assessable_capital: 0 + uc_maximum_amount: 5_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + council_tax_reduction_applicable_income: 99_000 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 20_000 + output: + braintree_council_tax_reduction: 900 + +- name: Braintree excludes UC claimants with UC-assessed capital of 10,000 pounds or above + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 10_000 + uc_maximum_amount: 5_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + braintree_council_tax_reduction: 0 + +- name: Braintree pension-age UC claimant without carve-out uses the local banded scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + uc_maximum_amount: 10_000 + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 67 + benefits_premiums: 0 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + braintree_council_tax_reduction_is_local_scheme: true + braintree_council_tax_reduction: 1_386 + simulated_council_tax_reduction_benunit: 1_386 + council_tax_reduction: 1_386 + +- name: Braintree regulation 60A pensioner stays on the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + uc_maximum_amount: 10_000 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + braintree_council_tax_reduction_uc_regulation_60a_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + braintree_council_tax_reduction_is_local_scheme: false + braintree_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 + +- name: Braintree relevant-period pensioner stays on the prescribed pensioner scheme + period: 2026 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 67 + benunits: + benunit: + members: [claimant] + claims_all_entitled_benefits: true + would_claim_uc: true + universal_credit: 1 + universal_credit_pre_benefit_cap: 1 + uc_earned_income: 0 + uc_unearned_income: 0 + uc_assessable_capital: 0 + uc_maximum_amount: 10_000 + council_tax_reduction_applicable_amount: 10_000 + council_tax_reduction_applicable_income: 0 + braintree_council_tax_reduction_uc_relevant_period_pensioner: true + households: + household: + members: [claimant] + country: ENGLAND + local_authority: BRAINTREE + council_tax_band: D + council_tax: 1_800 + savings: 0 + output: + braintree_council_tax_reduction_is_local_scheme: false + braintree_council_tax_reduction: 0 + simulated_council_tax_reduction_benunit: 1_800 + council_tax_reduction: 1_800 diff --git a/policyengine_uk/tests/policy/baseline/household/consumption/council_tax_less_benefit.yaml b/policyengine_uk/tests/policy/baseline/household/consumption/council_tax_less_benefit.yaml new file mode 100644 index 000000000..ffeaf5edb --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/household/consumption/council_tax_less_benefit.yaml @@ -0,0 +1,28 @@ +- name: HBAI subtracts net council tax after CTR rather than gross council tax + period: 2025 + absolute_error_margin: 0.5 + input: + people: + claimant: + age: 35 + council_tax_benefit_reported: 500 + employment_income: 10000 + benunits: + benunit: + members: [claimant] + is_single_person: true + is_couple: false + is_lone_parent: false + eldest_adult_age: 35 + benefits_premiums: 0 + households: + household: + members: [claimant] + country: ENGLAND + local_authority: MAIDSTONE + council_tax_band: D + council_tax: 1800 + savings: 0 + output: + council_tax_less_benefit: 1300 + hbai_household_net_income: 8700 diff --git a/policyengine_uk/variables/gov/dwp/council_tax_benefit.py b/policyengine_uk/variables/gov/dwp/council_tax_benefit.py index 630c0790e..d2861ead5 100644 --- a/policyengine_uk/variables/gov/dwp/council_tax_benefit.py +++ b/policyengine_uk/variables/gov/dwp/council_tax_benefit.py @@ -8,4 +8,8 @@ class council_tax_benefit(Variable): definition_period = YEAR unit = GBP - adds = ["council_tax_benefit_reported"] + def formula(benunit, period, parameters): + supported = benunit.household("council_tax_reduction_scheme_supported", period) + simulated = benunit("simulated_council_tax_reduction_benunit", period) + reported = benunit("council_tax_benefit_reported", period) + return where(supported, simulated, reported) diff --git a/policyengine_uk/variables/gov/local_authorities/adur/council_tax_reduction/adur_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/adur/council_tax_reduction/adur_council_tax_reduction.py new file mode 100644 index 000000000..5f7161e80 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/adur/council_tax_reduction/adur_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_adur_working_age, +) + + +class adur_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Adur Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.adur.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_adur_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "adur_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/adur/council_tax_reduction/adur_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/adur/council_tax_reduction/adur_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..4b98b9178 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/adur/council_tax_reduction/adur_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_adur_working_age, +) + + +class adur_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Adur CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.adur.council_tax_reduction + household = person.household + working_age = is_adur_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_uc_no_earned_income=True, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/adur/council_tax_reduction/adur_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/adur/council_tax_reduction/adur_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..bf02ce83f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/adur/council_tax_reduction/adur_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class adur_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Adur CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "adur_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction.py new file mode 100644 index 000000000..67e1bee81 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction.py @@ -0,0 +1,44 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Arun Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.arun.council_tax_reduction + local_scheme = benunit("arun_council_tax_reduction_is_local_scheme", period) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "arun_council_tax_reduction_non_dep_deductions", period + ) + eligible_liability = max_(0, liability - non_dep_deductions) + support_rate = benunit("arun_council_tax_reduction_support_rate", period) + preliminary_award = eligible_liability * support_rate + annual_minimum_award = ctr.means_test.minimum_award * WEEKS_IN_YEAR + award = where(preliminary_award >= annual_minimum_award, preliminary_award, 0) + has_uc_award = benunit("universal_credit", period) > 0 + capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + capital_eligible = relevant_income_based_benefit | ( + capital <= ctr.means_test.capital_limit + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * max_(0, award) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..104b3a3f4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,78 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Arun Council Tax Reduction childcare deduction from earnings" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + + def formula(benunit, period, parameters): + childcare = parameters( + period + ).gov.local_authorities.arun.council_tax_reduction.childcare + has_uc_award = benunit("universal_credit", period) > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + works_enough_hours = person("weekly_hours", period) >= childcare.work_hours + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + claimant_or_partner & works_enough_hours + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + works_enough_hours | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + | person( + "arun_council_tax_reduction_childcare_incapacitated_partner", period + ) + ) & claimant_or_partner + couple_one_working_one_unable = ( + benunit("is_couple", period) + & benunit.any(claimant_or_partner & works_enough_hours) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_unable + ) + eligible_child = child_or_young_person & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & ( + person("is_disabled_for_benefits", period) + | person( + "arun_council_tax_reduction_childcare_disabled_child", period + ) + ) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [ + eligible_children >= 2, + eligible_children == 1, + ], + [ + childcare.weekly_maximum.two_or_more_children, + childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return ( + ~has_uc_award + * eligible_work + * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_childcare_disabled_child.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_childcare_disabled_child.py new file mode 100644 index 000000000..bab9813db --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_childcare_disabled_child.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_childcare_disabled_child(Variable): + value_type = bool + entity = Person + label = "Whether Arun treats this child as disabled for childcare deductions" + definition_period = YEAR + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + documentation = "Source input for Arun childcare disabled-child statuses not otherwise fully represented in PolicyEngine UK, including suspended or abated qualifying disability benefits and blind registration." + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_childcare_incapacitated_partner.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_childcare_incapacitated_partner.py new file mode 100644 index 000000000..622f8a319 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_childcare_incapacitated_partner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_childcare_incapacitated_partner(Variable): + value_type = bool + entity = Person + label = "Whether Arun treats this partner as incapacitated for childcare deductions" + definition_period = YEAR + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + documentation = "Source input for childcare partner incapacity, hospital in-patient, prison, temporary sickness, and related statuses not otherwise fully represented in PolicyEngine UK." + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_earnings_disregard.py new file mode 100644 index 000000000..80ecc1611 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_earnings_disregard.py @@ -0,0 +1,104 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_earnings_disregard(Variable): + value_type = float + entity = BenUnit + label = "Arun Council Tax Reduction earnings disregard" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.arun.council_tax_reduction + has_uc_award = benunit("universal_credit", period) > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + has_earnings = gross_earnings > 0 + disability_or_carer = benunit.any( + claimant_or_partner + & ( + person("is_disabled_for_benefits", period) + | (person("carers_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + ) + ) | (benunit("uc_carer_element", period) > 0) + weekly_disregard = select( + [ + benunit("is_lone_parent", period), + disability_or_carer, + benunit("is_couple", period), + ], + [ + ctr.earnings_disregard.lone_parent, + ctr.earnings_disregard.disability_or_carer, + ctr.earnings_disregard.couple, + ], + default=ctr.earnings_disregard.standard, + ) + weekly_hours = benunit.max(claimant_or_partner * person("weekly_hours", period)) + weekly_net_earnings = max_(0, gross_earnings - earnings_deductions) / ( + WEEKS_IN_YEAR + ) + childcare_deduction = ( + benunit("arun_council_tax_reduction_childcare_deduction", period) + / WEEKS_IN_YEAR + ) + adult_age = benunit.max(claimant_or_partner * person("age", period)) + has_family = benunit.any(child_or_young_person) + disability_component = ( + (benunit("disability_premium", period) > 0) + | (benunit("severe_disability_premium", period) > 0) + | (benunit("enhanced_disability_premium", period) > 0) + | benunit.any( + claimant_or_partner & person("uc_limited_capability_for_WRA", period) + ) + ) + source_wtc_condition = benunit( + "arun_council_tax_reduction_source_additional_earnings_disregard", + period, + ) + additional_condition = ( + source_wtc_condition + | ((adult_age >= 25) & (weekly_hours >= 30)) + | (benunit("is_couple", period) & has_family & (weekly_hours >= 16)) + | (benunit("is_lone_parent", period) & (weekly_hours >= 16)) + | (disability_component & (weekly_hours >= 16)) + ) + additional_available = weekly_net_earnings >= ( + weekly_disregard + + childcare_deduction + + ctr.earnings_disregard.additional_working + ) + additional_disregard = ( + additional_condition & additional_available + ) * ctr.earnings_disregard.additional_working + return ( + ~has_uc_award + * has_earnings + * (weekly_disregard + additional_disregard) + * WEEKS_IN_YEAR + ) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..d13e506be --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,89 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class arun_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Arun Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.arun.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "arun_council_tax_reduction_is_local_scheme", + period, + ) + ) + person_income = add( + person, + period, + [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "universal_credit_reported", + ], + ) + benunit_income = add( + person.benunit, + period, + [ + "tax_credits", + "child_benefit", + "housing_benefit", + "income_support", + "jsa_income", + "esa_income", + "pension_credit", + ], + ) + no_income = (person_income + benunit_income) <= 0 + in_remunerative_work = ( + person.benunit.max(person("weekly_hours", period)) + >= ctr.non_dep_deduction.remunerative_work_hours + ) + chargeable = no_income | in_remunerative_work + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | person.benunit.any( + person("arun_council_tax_reduction_non_dep_guarantee_credit", period) + ) + ) + receives_universal_credit = person.benunit("universal_credit", period) > 0 + exempt = ( + is_full_time_student_non_dep(person, period) + | income_based_benefit + | receives_universal_credit + | person("arun_council_tax_reduction_non_dep_source_exemption", period) + ) + return local_scheme * where( + exempt | ~chargeable, 0.0, ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + ) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..2f0c9d85e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_arun, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class arun_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Arun's local CTR scheme" + definition_period = YEAR + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + uc_award_disregarded_for_pensioner_status = benunit( + "arun_council_tax_reduction_uc_relevant_period_pensioner", period + ) | benunit("arun_council_tax_reduction_uc_regulation_60a_pensioner", period) + source_working_age = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | (has_uc_award & ~uc_award_disregarded_for_pensioner_status) + ) + return ( + (country == Country.ENGLAND) & is_arun(local_authority) & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..638214de3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,22 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class arun_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Arun Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "arun_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_non_dep_guarantee_credit.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_non_dep_guarantee_credit.py new file mode 100644 index 000000000..87e44ba86 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_non_dep_guarantee_credit.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_non_dep_guarantee_credit(Variable): + value_type = bool + entity = Person + label = "Whether this Arun non-dependant receives Pension Credit Guarantee Credit" + definition_period = YEAR + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + documentation = "Source input for the Arun non-dependant exemption that applies to Pension Credit Guarantee Credit, not Savings Credit alone." + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..d89878654 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Whether Arun source rules exempt this non-dependant from deductions" + definition_period = YEAR + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + documentation = "Source input for non-dependant exemptions not otherwise separately exposed in PolicyEngine UK." + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_source_additional_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_source_additional_earnings_disregard.py new file mode 100644 index 000000000..27f447dcc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_source_additional_earnings_disregard.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_source_additional_earnings_disregard(Variable): + value_type = bool + entity = BenUnit + label = "Whether Arun's source additional working earnings disregard applies" + definition_period = YEAR + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + documentation = "Source input for Schedule 5 paragraph 18 conditions not otherwise exposed, such as Working Tax Credit disability or 50-plus element status." + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..9536f7eb3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Arun Council Tax Reduction source-disregarded income not otherwise modeled" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_source_uc_disregarded_elements.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_source_uc_disregarded_elements.py new file mode 100644 index 000000000..ee82003b7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_source_uc_disregarded_elements.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_source_uc_disregarded_elements(Variable): + value_type = float + entity = BenUnit + label = "Arun Council Tax Reduction source-disregarded Universal Credit elements not otherwise modeled" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..7817cbc62 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_support_rate.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Arun Council Tax Reduction support rate" + definition_period = YEAR + reference = "https://www.arun.gov.uk/council-tax-reduction/" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.arun.council_tax_reduction + weekly_income = benunit("arun_council_tax_reduction_weekly_income", period) + weekly_income_for_band = weekly_income + 1e-9 + banded_support_rate = ctr.income_band.amount.calc(weekly_income_for_band) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where(relevant_income_based_benefit, 1, banded_support_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..03246a0fd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Arun disregards Universal Credit for pensioner status under regulation 60A" + definition_period = YEAR + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + documentation = "Source input for pension-age Universal Credit awards disregarded under regulation 60A of the Universal Credit Transitional Provisions Regulations 2014." + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..186b9cefc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Arun disregards Universal Credit for pensioner status during the relevant period" + definition_period = YEAR + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + documentation = "Source input for pension-age Universal Credit awards whose final assessment period is disregarded when deciding whether the person remains in the pensioner scheme." + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..e9bf4517d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/arun/council_tax_reduction/arun_council_tax_reduction_weekly_income.py @@ -0,0 +1,151 @@ +from policyengine_uk.model_api import * + + +class arun_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Arun Council Tax Reduction weekly net income" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.arun.gov.uk/download.cfm?doc=docm93jijm4n20657.pdf&ver=27819" + ) + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "arun_council_tax_reduction_childcare_deduction", period + ) + non_uc_net_earnings = max_( + 0, gross_earnings - earnings_deductions - childcare_deduction + ) + earnings_disregard = benunit( + "arun_council_tax_reduction_earnings_disregard", period + ) + countable_non_uc_earnings = max_(0, non_uc_net_earnings - earnings_disregard) + uc_earned_income = benunit("uc_earned_income", period) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "tax_credits", + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "jsa_contrib", + "esa_contrib", + ], + ) + disregarded_income = add( + benunit, + period, + [ + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "arun_council_tax_reduction_source_disregarded_income", + ], + ) + benunit.sum(claimant_or_partner * person("maintenance_income", period)) + non_uc_income = countable_non_uc_earnings + max_( + 0, + other_income + benefit_income - disregarded_income, + ) + uc_award = benunit("universal_credit", period) + countable_uc_award = max_( + 0, + uc_award + - add( + benunit, + period, + [ + "uc_housing_costs_element", + "uc_carer_element", + "uc_LCWRA_element", + "arun_council_tax_reduction_source_uc_disregarded_elements", + ], + ), + ) + uc_disregarded_unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "maintenance_income", + ], + ) + ) + add( + benunit, + period, + [ + "child_benefit", + "housing_benefit", + "arun_council_tax_reduction_source_disregarded_income", + ], + ) + uc_income = uc_earned_income + max_( + 0, + benunit("uc_unearned_income", period) + + countable_uc_award + - uc_disregarded_unearned_income, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + annual_income = where(has_uc_award, uc_income, non_uc_income) + weekly_income = where(relevant_income_based_benefit, 0, annual_income) / ( + WEEKS_IN_YEAR + ) + return np.round(max_(0, weekly_income) * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction.py new file mode 100644 index 000000000..f412ae930 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.ashford.council_tax_reduction + local_scheme = benunit("ashford_council_tax_reduction_is_local_scheme", period) + liability = benunit.household( + "ashford_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "ashford_council_tax_reduction_non_dep_deductions", period + ) + support_rate = benunit("ashford_council_tax_reduction_support_rate", period) + has_uc_award = benunit("universal_credit", period) > 0 + capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + capital_eligible = capital <= ctr.means_test.capital_limit + award = max_(0, liability * support_rate - non_dep_deductions) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..fbd0d91bd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction childcare deduction from earnings" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + childcare_expenses = benunit.sum(benunit.members("childcare_expenses", period)) + uc_childcare_cap = benunit("uc_maximum_childcare_element_amount", period) + tax_credits = benunit("tax_credits", period) + return ( + (tax_credits > 0) + * ~has_uc_award + * min_(childcare_expenses, uc_childcare_cap) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..6f6eb09fa --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Ashford Council Tax Reduction claimant source non-dependant exemption" + documentation = "Source input for claimant or partner non-dependant deduction exemptions not otherwise separately exposed in PolicyEngine UK." + definition_period = YEAR + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_disability_or_carer_income_disregard.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_disability_or_carer_income_disregard.py new file mode 100644 index 000000000..38219d925 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_disability_or_carer_income_disregard.py @@ -0,0 +1,27 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_disability_or_carer_income_disregard(Variable): + value_type = bool + entity = BenUnit + label = "Whether Ashford CTR applies the disability or carer income disregard" + definition_period = YEAR + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + receives_disability_or_carer_benefit = ( + (person("dla", period) > 0) + | (person("pip", period) > 0) + | (person("carers_allowance", period) > 0) + ) + return benunit.any( + (claimant_or_partner | child_or_young_person) + & receives_disability_or_carer_benefit + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_earnings_disregard.py new file mode 100644 index 000000000..f20c5272c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_earnings_disregard.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_earnings_disregard(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction earnings disregard" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.ashford.council_tax_reduction + has_uc_award = benunit("universal_credit", period) > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + uc_earned_income = benunit("uc_earned_income", period) + has_earnings = where(has_uc_award, uc_earned_income > 0, gross_earnings > 0) + return has_earnings * ctr.earnings_disregard.amount * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..dd9476e0b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,66 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class ashford_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Ashford Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.ashford.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "ashford_council_tax_reduction_is_local_scheme", period + ) + ) + weekly_deduction = ctr.non_dep_deduction.amount + child_or_young_person = household_person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = ( + claimant_benunit + & household_person("is_adult", period) + & ~child_or_young_person + ) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "ashford_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | person("ashford_council_tax_reduction_non_dep_source_exemption", period) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..12b8f614b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,47 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_ashford, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class ashford_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Ashford's local CTR scheme" + definition_period = YEAR + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + uc_relevant_period_pensioner = benunit( + "ashford_council_tax_reduction_uc_relevant_period_pensioner", period + ) + uc_regulation_60a_pensioner = benunit( + "ashford_council_tax_reduction_uc_regulation_60a_pensioner", + period, + ) + uc_award_disregarded_for_pensioner_status = ( + uc_relevant_period_pensioner | uc_regulation_60a_pensioner + ) + source_working_age = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | (has_uc_award & ~uc_award_disregarded_for_pensioner_status) + ) + return ( + (country == Country.ENGLAND) + & is_ashford(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..d32511a84 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class ashford_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Ashford maximum Council Tax liability eligible for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.ashford.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..3ad39a02e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,25 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + deductions = benunit.members( + "ashford_council_tax_reduction_individual_non_dep_deduction", + period, + ) + deduction_for_benunit = benunit.sum(deductions) + is_benunit_head = benunit.members("is_benunit_head", period) + deductions_to_count = is_benunit_head * benunit.project(deduction_for_benunit) + deductions_in_household = benunit.max( + benunit.members.household.sum(deductions_to_count) + ) + return deductions_in_household - deduction_for_benunit diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..02b0a4f38 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Ashford Council Tax Reduction source non-dependant exemption" + documentation = "Source input for non-dependant exemptions not otherwise separately exposed in PolicyEngine UK, such as normal home elsewhere, training allowance, long-term hospital patients, or armed-forces operational absence." + definition_period = YEAR + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..1d3fd6472 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction source-disregarded annual income" + documentation = ( + "Source input for income disregards not separately exposed in PolicyEngine UK." + ) + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_source_uc_disregarded_elements.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_source_uc_disregarded_elements.py new file mode 100644 index 000000000..a582b32f6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_source_uc_disregarded_elements.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_source_uc_disregarded_elements(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction source-disregarded Universal Credit elements" + documentation = "Source input for UC elements disregarded by Ashford's scheme that are not separately exposed in PolicyEngine UK, such as transitional protection." + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..b743f0a0e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_support_rate.py @@ -0,0 +1,27 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction support rate" + definition_period = YEAR + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.ashford.council_tax_reduction + weekly_income = benunit("ashford_council_tax_reduction_weekly_income", period) + rounded_weekly_income = np.round(weekly_income * 100) / 100 + single_rate = ctr.income_band.single.calc(rounded_weekly_income + 1e-4) + couple_rate = ctr.income_band.couple.calc(rounded_weekly_income + 1e-4) + banded_support_rate = where( + benunit("is_couple", period), + couple_rate, + single_rate, + ) + passported = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where(passported, 0.90, banded_support_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..5d0ca13cc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Ashford disregards a pension-age UC award under regulation 60A" + documentation = "Covers pension-age Universal Credit cases where the source disregards the UC award for pensioner-status classification under regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014." + definition_period = YEAR + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..1b027fab8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether an Ashford UC claimant remains in the pensioner scheme during the relevant period" + documentation = "Covers the source transitional protection for pension-age Universal Credit cases where the UC award is disregarded for pensioner-status classification." + definition_period = YEAR + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_uc_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_uc_weekly_income.py new file mode 100644 index 000000000..a89f7d680 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_uc_weekly_income.py @@ -0,0 +1,79 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_uc_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction weekly Universal Credit income" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.ashford.council_tax_reduction + has_uc_award = benunit("universal_credit", period) > 0 + earnings_disregard = benunit( + "ashford_council_tax_reduction_earnings_disregard", period + ) + uc_earned_income = max_( + 0, benunit("uc_earned_income", period) - earnings_disregard + ) + uc_award = benunit("universal_credit", period) + disregarded_uc_elements = add( + benunit, + period, + [ + "uc_housing_costs_element", + "uc_child_element", + "uc_carer_element", + "uc_childcare_element", + "uc_disability_elements", + "ashford_council_tax_reduction_source_uc_disregarded_elements", + ], + ) + countable_uc_award = max_(0, uc_award - disregarded_uc_elements) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + uc_unearned_income_disregards = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + ], + ) + ) + add( + benunit, + period, + [ + "child_benefit", + "housing_benefit", + "ashford_council_tax_reduction_source_disregarded_income", + ], + ) + disability_or_carer_disregard = ( + benunit( + "ashford_council_tax_reduction_disability_or_carer_income_disregard", + period, + ) + * ctr.income_disregard.disability_or_carer + * WEEKS_IN_YEAR + ) + uc_other_income = max_( + 0, + benunit("uc_unearned_income", period) + + countable_uc_award + - uc_unearned_income_disregards + - disability_or_carer_disregard, + ) + return has_uc_award * (uc_earned_income + uc_other_income) / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..903fbe7cf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_weekly_income.py @@ -0,0 +1,127 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction weekly income" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.ashford.council_tax_reduction + has_uc_award = benunit("universal_credit", period) > 0 + uc_weekly_income = benunit( + "ashford_council_tax_reduction_uc_weekly_income", period + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "ashford_council_tax_reduction_childcare_deduction", period + ) + net_earnings_before_childcare = max_(0, gross_earnings - earnings_deductions) + childcare_not_used_against_earnings = max_( + 0, childcare_deduction - net_earnings_before_childcare + ) + net_earnings = max_(0, net_earnings_before_childcare - childcare_deduction) + earnings_disregard = benunit( + "ashford_council_tax_reduction_earnings_disregard", period + ) + countable_earnings = max_(0, net_earnings - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + tax_credits = benunit("tax_credits", period) + tax_credits_after_childcare = where( + tax_credits > 0, + max_(0, tax_credits - childcare_not_used_against_earnings), + tax_credits, + ) + benefit_income = tax_credits_after_childcare + add( + benunit, + period, + [ + "carers_allowance", + "attendance_allowance", + "child_benefit", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "jsa_contrib", + "esa_contrib", + ], + ) + disregarded_income = add( + benunit, + period, + [ + "carers_allowance", + "child_benefit", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "ashford_council_tax_reduction_source_disregarded_income", + ], + ) + disability_or_carer_disregard = ( + benunit( + "ashford_council_tax_reduction_disability_or_carer_income_disregard", + period, + ) + * ctr.income_disregard.disability_or_carer + * WEEKS_IN_YEAR + ) + annual_income = countable_earnings + max_( + 0, + other_income + + benefit_income + - disregarded_income + - disability_or_carer_disregard, + ) + weekly_income = where( + has_uc_award, + uc_weekly_income, + annual_income / WEEKS_IN_YEAR + + benunit("ashford_council_tax_reduction_weekly_tariff_income", period), + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_weekly_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_weekly_tariff_income.py new file mode 100644 index 000000000..a8d7c8b10 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ashford/council_tax_reduction/ashford_council_tax_reduction_weekly_tariff_income.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * + + +class ashford_council_tax_reduction_weekly_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Ashford Council Tax Reduction weekly tariff income" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf" + ) + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.ashford.council_tax_reduction + capital = benunit.household("savings", period) + return np.ceil( + max_(0, capital - ctr.means_test.tariff_income_threshold) + / ctr.means_test.tariff_income_increment + ) diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction.py new file mode 100644 index 000000000..5c3e4e156 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction.py @@ -0,0 +1,74 @@ +from policyengine_uk.model_api import * + + +class babergh_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Babergh Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf" + ) + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.babergh.council_tax_reduction + local_scheme = benunit("babergh_council_tax_reduction_is_local_scheme", period) + has_uc_award = benunit("universal_credit", period) > 0 + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "babergh_council_tax_reduction_non_dep_deductions", period + ) + eligible_liability = max_(0, liability - non_dep_deductions) + + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("babergh_council_tax_reduction_tariff_income", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + non_uc_award = max_( + 0, + eligible_liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate, + ) + + monthly_uc_earnings = benunit( + "babergh_council_tax_reduction_uc_monthly_earnings", period + ) + weekly_uc_contribution = benunit( + "babergh_council_tax_reduction_uc_weekly_contribution", period + ) + uc_award = max_( + 0, + eligible_liability - weekly_uc_contribution * WEEKS_IN_YEAR, + ) + uc_award = where( + monthly_uc_earnings + >= ctr.uc_earnings_contribution.no_entitlement_threshold, + 0, + uc_award, + ) + award = where(has_uc_award, uc_award, non_uc_award) + annual_minimum_award = ctr.means_test.minimum_award * WEEKS_IN_YEAR + award = where(award >= annual_minimum_award, award, 0) + + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..7b7490f5f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class babergh_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Babergh CTR claimant source-defined non-dependant deduction exemption" + documentation = "Covers source-listed claimant or partner non-dependant deduction exemptions not otherwise represented in PolicyEngine UK." + definition_period = YEAR + default_value = False + reference = ( + "https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf" + ) diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..80f4f2f0d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,92 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class babergh_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Babergh Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.babergh.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "babergh_council_tax_reduction_is_local_scheme", + period, + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + gross_income = where(has_uc_award, person_gross_income, benunit_gross_income) + weekly_gross_income = gross_income / WEEKS_IN_YEAR + weekly_hours = where( + has_uc_award, + person("weekly_hours", period), + person.benunit.max(person("weekly_hours", period)), + ) + in_remunerative_work = ( + weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "babergh_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = has_uc_award & ( + person("babergh_council_tax_reduction_non_dep_uc_earned_income", period) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person("babergh_council_tax_reduction_non_dep_source_exemption", period) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..9c11899bb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_babergh, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class babergh_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Babergh's local CTR scheme" + definition_period = YEAR + reference = ( + "https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf" + ) + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + source_working_age = ( + ~has_pensioner | relevant_income_based_benefit | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_babergh(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..d4f330338 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class babergh_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Babergh Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "babergh_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..35184e379 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class babergh_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Babergh CTR source-defined non-dependant exemption" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK." + definition_period = YEAR + default_value = False + reference = ( + "https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf" + ) diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..98a65cdc4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class babergh_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Babergh CTR non-dependant Universal Credit assessed earned income" + documentation = "Source input for person-level earned income used in the non-dependant's Universal Credit award calculation." + definition_period = YEAR + unit = GBP + reference = ( + "https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf" + ) + + def formula(person, period, parameters): + return person("employment_income", period) + person( + "self_employment_income", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..2259ab68b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_tariff_income.py @@ -0,0 +1,25 @@ +from policyengine_uk.model_api import * + + +class babergh_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Babergh Council Tax Reduction tariff income" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf" + ) + + def formula(benunit, period, parameters): + tariff = parameters( + period + ).gov.local_authorities.babergh.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + tariff_units = np.ceil(max_(0, capital - tariff.threshold) / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + has_uc_award = benunit("universal_credit", period) > 0 + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where(has_uc_award | relevant_income_based_benefit, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_uc_monthly_earnings.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_uc_monthly_earnings.py new file mode 100644 index 000000000..fc7bbd252 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_uc_monthly_earnings.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * + + +class babergh_council_tax_reduction_uc_monthly_earnings(Variable): + value_type = float + entity = BenUnit + label = ( + "Babergh Council Tax Reduction Universal Credit notified monthly net earnings" + ) + definition_period = YEAR + unit = GBP + reference = ( + "https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf" + ) + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + uc_gross_earnings = benunit.sum( + claimant_or_partner * person("uc_mif_capped_earned_income", period) + ) + deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + return max_(0, uc_gross_earnings - deductions) / MONTHS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_uc_weekly_contribution.py b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_uc_weekly_contribution.py new file mode 100644 index 000000000..3d592b9ad --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/babergh/council_tax_reduction/babergh_council_tax_reduction_uc_weekly_contribution.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * + + +class babergh_council_tax_reduction_uc_weekly_contribution(Variable): + value_type = float + entity = BenUnit + label = "Babergh Council Tax Reduction weekly contribution for Universal Credit claimants" + definition_period = YEAR + unit = GBP + reference = ( + "https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf" + ) + + def formula(benunit, period, parameters): + contribution = parameters( + period + ).gov.local_authorities.babergh.council_tax_reduction.uc_earnings_contribution + monthly_uc_earnings = benunit( + "babergh_council_tax_reduction_uc_monthly_earnings", period + ) + return contribution.amount.calc(monthly_uc_earnings) diff --git a/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction.py new file mode 100644 index 000000000..3dd3f24a3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction.py @@ -0,0 +1,69 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_barking_and_dagenham_working_age, +) + + +class barking_and_dagenham_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Barking and Dagenham Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.barking_and_dagenham.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_barking_and_dagenham_working_age( + local_authority, + country, + has_pensioner, + ) + weekly_income = benunit( + "barking_and_dagenham_council_tax_reduction_weekly_income", period + ) + person = benunit.members + num_children = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + is_couple = benunit("is_couple", period) + income_bands = ctr.income_band + support_rate = select( + [ + is_couple & (num_children >= 2), + is_couple & (num_children == 1), + (~is_couple) & (num_children >= 2), + (~is_couple) & (num_children == 1), + is_couple, + ], + [ + income_bands.couple_two_or_more_children.calc(weekly_income), + income_bands.couple_one_child.calc(weekly_income), + income_bands.single_two_or_more_children.calc(weekly_income), + income_bands.single_one_child.calc(weekly_income), + income_bands.couple.calc(weekly_income), + ], + default=income_bands.single.calc(weekly_income), + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "barking_and_dagenham_council_tax_reduction_non_dep_deductions", period + ) + eligible_liability = max_(0, liability - non_dep_deductions) + award = eligible_liability * support_rate + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_countable_universal_credit.py b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_countable_universal_credit.py new file mode 100644 index 000000000..b5a8f001b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_countable_universal_credit.py @@ -0,0 +1,22 @@ +from policyengine_uk.model_api import * + + +class barking_and_dagenham_council_tax_reduction_countable_universal_credit(Variable): + value_type = float + entity = BenUnit + label = "Barking and Dagenham CTS countable Universal Credit income" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + has_uc = benunit("universal_credit", period) > 0 + allowed_elements = add( + benunit, + period, + [ + "uc_standard_allowance", + "uc_child_element", + ], + ) + income_reduction = benunit("uc_income_reduction", period) + return has_uc * max_(0, allowed_elements - income_reduction) diff --git a/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..9d58c9dc9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,45 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_barking_and_dagenham_working_age, +) + + +class barking_and_dagenham_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Barking and Dagenham CTS individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.barking_and_dagenham.council_tax_reduction + household = person.household + working_age = is_barking_and_dagenham_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + exempt = claimant_exempt | is_full_time_student_non_dep(person, period) + deduction = ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + return working_age * where(exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..886ef23f7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,17 @@ +from policyengine_uk.model_api import * + + +class barking_and_dagenham_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Barking and Dagenham CTS non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + deductions = benunit.members( + "barking_and_dagenham_council_tax_reduction_individual_non_dep_deduction", + period, + ) + deductions_in_household = benunit.max(benunit.members.household.sum(deductions)) + return deductions_in_household - benunit.sum(deductions) diff --git a/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..47c1a6a18 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barking_and_dagenham/council_tax_reduction/barking_and_dagenham_council_tax_reduction_weekly_income.py @@ -0,0 +1,89 @@ +from policyengine_uk.model_api import * + + +class barking_and_dagenham_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Barking and Dagenham CTS weekly net income" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + standard_net_earnings = max_(0, gross_earnings - earnings_deductions) + has_uc = benunit("universal_credit", period) > 0 + uc_earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + uc_net_earnings = max_( + 0, + gross_earnings - uc_earnings_deductions, + ) + net_earnings = where(has_uc, uc_net_earnings, standard_net_earnings) + unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "carers_allowance", + "esa_contrib", + "jsa_contrib", + "maternity_allowance", + "statutory_sick_pay", + "statutory_maternity_pay", + "ssmg", + "miscellaneous_income", + ], + ) + ) + unearned_income += add( + benunit, + period, + [ + "tax_credits", + ], + ) + unearned_income += benunit( + "barking_and_dagenham_council_tax_reduction_countable_universal_credit", + period, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + annual_income = where( + relevant_income_based_benefit, + 0, + net_earnings + unearned_income, + ) + return annual_income / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction.py new file mode 100644 index 000000000..9ef1059f3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction.py @@ -0,0 +1,57 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_barnet_working_age, +) + + +class barnet_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Barnet Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.barnet.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_barnet_working_age(local_authority, country, has_pensioner) + monthly_earnings = benunit( + "barnet_council_tax_reduction_monthly_earnings", period + ) + support_rate = ctr.income_band.maximum_support_rate.calc(monthly_earnings) + liability = benunit.household( + "barnet_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "barnet_council_tax_reduction_non_dep_deductions", period + ) + ordinary_award = max_(0, liability * support_rate - non_dep_deductions) + protected = benunit("barnet_council_tax_reduction_protected_group", period) + protected_liability = benunit.household("council_tax", period) + pensioners_ctr = parameters( + period + ).gov.local_authorities.england.council_tax_reduction.pensioners + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + applicable_income = benunit("council_tax_reduction_applicable_income", period) + protected_award = max_( + 0, + protected_liability + - max_(0, applicable_income - applicable_amount) + * pensioners_ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + award = where(protected, protected_award, ordinary_award) + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..9e20bec6b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,55 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_barnet_working_age, +) + + +class barnet_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Barnet CTS individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.barnet.council_tax_reduction + household = person.household + working_age = is_barnet_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + gross_income = add( + person, + period, + [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ], + ) + weekly_gross_income = gross_income / WEEKS_IN_YEAR + deduction = ( + ctr.non_dep_deduction.amount.calc(weekly_gross_income) * WEEKS_IN_YEAR + ) + return working_age * where(claimant_exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..c9508bc2f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_barnet_working_age, +) + + +class barnet_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Barnet maximum Council Tax liability eligible for CTS" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.barnet.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_barnet_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + protected = ( + household.max( + household.members.benunit( + "barnet_council_tax_reduction_protected_group", period + ) + ) + > 0 + ) + capped = working_age & ~protected & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_monthly_earnings.py b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_monthly_earnings.py new file mode 100644 index 000000000..26ae81822 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_monthly_earnings.py @@ -0,0 +1,47 @@ +from policyengine_uk.model_api import * + + +class barnet_council_tax_reduction_monthly_earnings(Variable): + value_type = float + entity = BenUnit + label = "Barnet CTS monthly net earnings" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + non_uc_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + non_uc_earnings = max_(0, gross_earnings - non_uc_deductions) + has_uc = benunit("universal_credit", period) > 0 + uc_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + uc_earnings = max_( + 0, + add(benunit, period, ["uc_mif_capped_earned_income"]) - uc_deductions, + ) + annual_earnings = where(has_uc, uc_earnings, non_uc_earnings) + return annual_earnings / MONTHS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..08c8161db --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class barnet_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Barnet CTS non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "barnet_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..e929fc40e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_protected_group.py @@ -0,0 +1,22 @@ +from policyengine_uk.model_api import * + + +class barnet_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Barnet CTS protected group" + definition_period = YEAR + reference = "https://barnet.moderngov.co.uk/documents/s94210/Appendix%20O%20-%20202627%20Council%20Tax%20Support%20Scheme.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + claimant_or_partner = person("is_adult", period) + armed_forces_compensation = benunit.any( + claimant_or_partner & (person("afcs", period) > 0) + ) + war_pension = benunit( + "barnet_council_tax_reduction_war_pension_protected", period + ) + return benunit("benunit_contains_household_head", period) & ( + armed_forces_compensation | war_pension + ) diff --git a/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_war_pension_protected.py b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_war_pension_protected.py new file mode 100644 index 000000000..1f5cc96d5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/barnet/council_tax_reduction/barnet_council_tax_reduction_war_pension_protected.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class barnet_council_tax_reduction_war_pension_protected(Variable): + value_type = bool + entity = BenUnit + label = "Barnet CTS claimant or partner receives a protected war pension" + definition_period = YEAR + reference = "https://barnet.moderngov.co.uk/documents/s94210/Appendix%20O%20-%20202627%20Council%20Tax%20Support%20Scheme.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction.py new file mode 100644 index 000000000..fa9467cc6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Basildon Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.basildon.council_tax_reduction + local_scheme = benunit("basildon_council_tax_reduction_is_local_scheme", period) + support_rate = benunit("basildon_council_tax_reduction_support_rate", period) + liability = benunit.household("council_tax", period) + award = liability * support_rate + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..b6700aa43 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,87 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Basildon Council Tax Reduction childcare deduction from earnings" + definition_period = YEAR + unit = GBP + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + + def formula(benunit, period, parameters): + childcare = parameters( + period + ).gov.local_authorities.basildon.council_tax_reduction.childcare + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + treated_as_working = ( + add( + person, + period, + [ + "statutory_sick_pay", + "statutory_maternity_pay", + ], + ) + > 0 + ) + engaged_in_work = ( + (person("weekly_hours", period) > 0) + | (earned_income > 0) + | treated_as_working + ) + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + claimant_or_partner & engaged_in_work + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + engaged_in_work | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + | person( + "basildon_council_tax_reduction_childcare_disabled_partner", period + ) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(claimant_or_partner & engaged_in_work) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = child_or_young_person & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & ( + person("is_disabled_for_benefits", period) + | person( + "basildon_council_tax_reduction_childcare_disabled_child", + period, + ) + ) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [eligible_children >= 2, eligible_children == 1], + [ + childcare.weekly_maximum.two_or_more_children, + childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_childcare_disabled_child.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_childcare_disabled_child.py new file mode 100644 index 000000000..cc74d4ad0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_childcare_disabled_child.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_childcare_disabled_child(Variable): + value_type = bool + entity = Person + label = "Basildon CTR source-defined disabled child for childcare deduction" + documentation = "Covers source disabled-child status for childcare age-limit rules not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_childcare_disabled_partner.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_childcare_disabled_partner.py new file mode 100644 index 000000000..00fc6b6b9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_childcare_disabled_partner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_childcare_disabled_partner(Variable): + value_type = bool + entity = Person + label = "Basildon CTR source-defined disabled partner for childcare deduction" + documentation = "Covers source incapacity and disability statuses for partner childcare eligibility not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_esa_support_component.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_esa_support_component.py new file mode 100644 index 000000000..33dbbcd42 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_esa_support_component.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_esa_support_component(Variable): + value_type = float + entity = BenUnit + label = "Basildon CTR annual ESA support component amount" + definition_period = YEAR + unit = GBP + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..e3fb69729 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_basildon, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class basildon_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Basildon's local CTR scheme" + definition_period = YEAR + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + uc_relevant_period_pensioner = benunit( + "basildon_council_tax_reduction_uc_relevant_period_pensioner", period + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_basildon(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..b4d2b0c2d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_protected_group.py @@ -0,0 +1,45 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Basildon CTR protected group" + definition_period = YEAR + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_partner_or_dependant = ( + person("is_adult", period) | child_or_young_person + ) + modeled_benefit = ( + (person("dla", period) > 0) + | (person("pip", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + ) + source_protected = benunit( + "basildon_council_tax_reduction_source_protected_group", period + ) + esa_support_component = benunit( + "basildon_council_tax_reduction_esa_support_component", period + ) + wtc_disability = benunit( + "basildon_council_tax_reduction_working_tax_credit_disability_element", + period, + ) + severe_disablement = benunit( + "basildon_council_tax_reduction_severe_disablement_allowance", period + ) + return ( + benunit.any(claimant_partner_or_dependant & modeled_benefit) + | (esa_support_component > 0) + | wtc_disability + | (severe_disablement > 0) + | source_protected + ) diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_severe_disablement_allowance.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_severe_disablement_allowance.py new file mode 100644 index 000000000..e8cc3a2bf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_severe_disablement_allowance.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_severe_disablement_allowance(Variable): + value_type = float + entity = BenUnit + label = "Basildon CTR annual Severe Disablement Allowance amount" + definition_period = YEAR + unit = GBP + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..75f7cb286 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Basildon CTR source-disregarded annual income" + documentation = "Source-listed income disregards not otherwise separately exposed in PolicyEngine UK, such as war pensions, Bereavement Support Payments, or specified compensation payments." + definition_period = YEAR + unit = GBP + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_source_protected_group.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_source_protected_group.py new file mode 100644 index 000000000..e8791322f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_source_protected_group.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_source_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Basildon CTR source-defined protected group" + documentation = "Covers source-listed protected-group triggers not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..0bfb5d7e4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_support_rate.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Basildon Council Tax Reduction support rate" + definition_period = YEAR + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.basildon.council_tax_reduction + weekly_income = benunit("basildon_council_tax_reduction_weekly_income", period) + weekly_income_for_band = weekly_income + 1e-9 + person = benunit.members + num_dependants = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + bands = ctr.income_band + base_rate = select( + [ + num_dependants >= 2, + num_dependants == 1, + ], + [ + bands.two_or_more_dependants.calc(weekly_income_for_band), + bands.one_dependent.calc(weekly_income_for_band), + ], + default=bands.no_dependants.calc(weekly_income_for_band), + ) + protected = benunit("basildon_council_tax_reduction_protected_group", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where( + relevant_income_based_benefit | (protected & (base_rate > 0)), + 0.75, + base_rate, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..202ea6f6c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether a Basildon pension-age Universal Credit award remains in the prescribed pensioner CTR scheme during the source relevant period" + documentation = "Covers the source transitional protection where a Universal Credit award is disregarded for pensioner-status classification." + definition_period = YEAR + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..e7dc2854d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_weekly_income.py @@ -0,0 +1,140 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Basildon Council Tax Reduction weekly income" + definition_period = YEAR + unit = GBP + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.basildon.council_tax_reduction + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "basildon_council_tax_reduction_childcare_deduction", period + ) + non_uc_net_earnings = max_( + 0, gross_earnings - earnings_deductions - childcare_deduction + ) + uc_net_earnings = max_( + 0, benunit("uc_earned_income", period) - childcare_deduction + ) + net_earnings = where(has_uc_award, uc_net_earnings, non_uc_net_earnings) + has_earnings = where(has_uc_award, uc_net_earnings > 0, gross_earnings > 0) + countable_earnings = max_( + 0, + net_earnings - has_earnings * ctr.earnings_disregard.amount * WEEKS_IN_YEAR, + ) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "tax_credits", + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "jsa_contrib", + "esa_contrib", + ], + ) + non_uc_disregarded_income = add( + benunit, + period, + [ + "child_benefit", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "basildon_council_tax_reduction_source_disregarded_income", + ], + ) + benunit.sum(claimant_or_partner * person("maintenance_income", period)) + non_uc_income = countable_earnings + max_( + 0, other_income + benefit_income - non_uc_disregarded_income + ) + countable_uc_award = max_( + 0, + uc_award_before_deductions - benunit("uc_housing_costs_element", period), + ) + uc_disregarded_unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "maintenance_income", + ], + ) + ) + add( + benunit, + period, + ["basildon_council_tax_reduction_source_disregarded_income"], + ) + uc_income = ( + countable_earnings + + max_( + 0, + benunit("uc_unearned_income", period) - uc_disregarded_unearned_income, + ) + + countable_uc_award + ) + annual_income = where(has_uc_award, uc_income, non_uc_income) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + weekly_income = where(relevant_income_based_benefit, 0, annual_income) / ( + WEEKS_IN_YEAR + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_working_tax_credit_disability_element.py b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_working_tax_credit_disability_element.py new file mode 100644 index 000000000..7efba6249 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basildon/council_tax_reduction/basildon_council_tax_reduction_working_tax_credit_disability_element.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class basildon_council_tax_reduction_working_tax_credit_disability_element(Variable): + value_type = bool + entity = BenUnit + label = "Basildon CTR Working Tax Credit disability element protected-group trigger" + definition_period = YEAR + reference = "https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/basingstoke_and_deane_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/basingstoke_and_deane_council_tax_reduction.py new file mode 100644 index 000000000..1d157745c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/basingstoke_and_deane_council_tax_reduction.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_basingstoke_and_deane_working_age, +) + + +class basingstoke_and_deane_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Basingstoke and Deane Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.basingstoke_and_deane.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_basingstoke_and_deane_working_age( + local_authority, country, has_pensioner + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "basingstoke_and_deane_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/basingstoke_and_deane_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/basingstoke_and_deane_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..abf840aae --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/basingstoke_and_deane_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,36 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_basingstoke_and_deane_working_age, +) + + +class basingstoke_and_deane_council_tax_reduction_individual_non_dep_deduction( + Variable +): + value_type = float + entity = Person + label = "Basingstoke and Deane CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.basingstoke_and_deane.council_tax_reduction + household = person.household + working_age = is_basingstoke_and_deane_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_uc_no_earned_income=True, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/basingstoke_and_deane_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/basingstoke_and_deane_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..a75263f69 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/basingstoke_and_deane/council_tax_reduction/basingstoke_and_deane_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class basingstoke_and_deane_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Basingstoke and Deane CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "basingstoke_and_deane_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction.py new file mode 100644 index 000000000..c2a9026fc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction.py @@ -0,0 +1,44 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Bassetlaw Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.bassetlaw.council_tax_reduction + local_scheme = benunit( + "bassetlaw_council_tax_reduction_is_local_scheme", period + ) + liability = benunit.household( + "bassetlaw_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "bassetlaw_council_tax_reduction_non_dep_deductions", period + ) + support_rate = benunit("bassetlaw_council_tax_reduction_support_rate", period) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + capital_eligible = capital <= ctr.means_test.capital_limit + award = max_(0, liability - non_dep_deductions) * support_rate + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..fd88342b9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,72 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Bassetlaw Council Tax Reduction childcare deduction from earnings" + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(benunit, period, parameters): + childcare = parameters( + period + ).gov.local_authorities.bassetlaw.council_tax_reduction.childcare + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + works_enough_hours = person("weekly_hours", period) >= childcare.work_hours + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + claimant_or_partner & works_enough_hours + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + works_enough_hours | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + | person( + "bassetlaw_council_tax_reduction_childcare_disabled_partner", period + ) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(claimant_or_partner & works_enough_hours) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = child_or_young_person & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & ( + person("is_disabled_for_benefits", period) + | person( + "bassetlaw_council_tax_reduction_childcare_disabled_child", + period, + ) + ) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [ + eligible_children >= 2, + eligible_children == 1, + ], + [ + childcare.weekly_maximum.two_or_more_children, + childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_childcare_disabled_child.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_childcare_disabled_child.py new file mode 100644 index 000000000..b14429a76 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_childcare_disabled_child.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_childcare_disabled_child(Variable): + value_type = bool + entity = Person + label = "Bassetlaw Council Tax Reduction source childcare disabled child flag" + definition_period = YEAR + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_childcare_disabled_partner.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_childcare_disabled_partner.py new file mode 100644 index 000000000..d534d6896 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_childcare_disabled_partner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_childcare_disabled_partner(Variable): + value_type = bool + entity = Person + label = "Bassetlaw Council Tax Reduction source childcare disabled partner flag" + definition_period = YEAR + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..b69978eab --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Bassetlaw Council Tax Reduction claimant source non-dependant exemption" + documentation = "Source input for claimant or partner non-dependant deduction exemptions not otherwise separately exposed in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_earnings_disregard.py new file mode 100644 index 000000000..465dce461 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_earnings_disregard.py @@ -0,0 +1,76 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_earnings_disregard(Variable): + value_type = float + entity = BenUnit + label = "Bassetlaw Council Tax Reduction earnings disregard" + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.bassetlaw.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + disability_or_carer = ( + (benunit("disability_premium", period) > 0) + | (benunit("severe_disability_premium", period) > 0) + | (benunit("enhanced_disability_premium", period) > 0) + | (benunit("carers_allowance", period) > 0) + ) + base_weekly = select( + [ + benunit("is_lone_parent", period), + disability_or_carer, + benunit("is_couple", period), + ], + [ + ctr.earnings_disregard.lone_parent, + ctr.earnings_disregard.disabled_or_carer, + ctr.earnings_disregard.couple, + ], + default=ctr.earnings_disregard.single, + ) + weekly_hours = benunit.max(claimant_or_partner * person("weekly_hours", period)) + weekly_net_earnings = ( + max_(0, gross_earnings - earnings_deductions) / WEEKS_IN_YEAR + ) + childcare_deduction = benunit( + "bassetlaw_council_tax_reduction_childcare_deduction", period + ) + worker_addition_available = weekly_net_earnings >= ( + base_weekly + + childcare_deduction / WEEKS_IN_YEAR + + ctr.earnings_disregard.worker_addition + ) + works_qualifying_hours = ( + (weekly_hours >= 30) + | ( + (benunit("is_lone_parent", period) | benunit("is_couple", period)) + & (weekly_hours >= 16) + ) + | (disability_or_carer & (weekly_hours >= 16)) + ) + worker_addition = ( + works_qualifying_hours & worker_addition_available + ) * ctr.earnings_disregard.worker_addition + return (gross_earnings > 0) * (base_weekly + worker_addition) * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..793605309 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,88 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class bassetlaw_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Bassetlaw Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.bassetlaw.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "bassetlaw_council_tax_reduction_is_local_scheme", period + ) + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + weekly_hours = where( + has_uc_award, + person("weekly_hours", period), + person.benunit.max(person("weekly_hours", period)), + ) + in_remunerative_work = ( + weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.remunerative_work_amount, + ctr.non_dep_deduction.non_working_amount, + ) + child_or_young_person = household_person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = ( + claimant_benunit + & household_person("is_adult", period) + & ~child_or_young_person + ) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "bassetlaw_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = ( + max_( + person.benunit("universal_credit_pre_benefit_cap", period), + person.benunit("universal_credit", period), + ) + > 0 + ) & ( + person("bassetlaw_council_tax_reduction_non_dep_uc_earned_income", period) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person("bassetlaw_council_tax_reduction_non_dep_source_exemption", period) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..ce5b583c7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,50 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bassetlaw, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class bassetlaw_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Bassetlaw's local CTR scheme" + definition_period = YEAR + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_relevant_period_pensioner = benunit( + "bassetlaw_council_tax_reduction_uc_relevant_period_pensioner", period + ) + uc_regulation_60a_pensioner = benunit( + "bassetlaw_council_tax_reduction_uc_regulation_60a_pensioner", + period, + ) + uc_award_disregarded_for_pensioner_status = ( + uc_relevant_period_pensioner | uc_regulation_60a_pensioner + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_award_disregarded_for_pensioner_status) + ) + return ( + (country == Country.ENGLAND) + & is_bassetlaw(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..bbbbc8604 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class bassetlaw_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Bassetlaw maximum Council Tax liability eligible for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.bassetlaw.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..49e10b062 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class bassetlaw_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Bassetlaw Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "bassetlaw_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..456541f86 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Bassetlaw Council Tax Reduction source non-dependant exemption" + documentation = "Source input for non-dependant exemptions not otherwise separately exposed in PolicyEngine UK, such as normal home elsewhere, training allowance, long-term hospital patients, or armed-forces operational absence." + definition_period = YEAR + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..415619ecc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Bassetlaw Council Tax Reduction non-dependant Universal Credit assessed earned income" + documentation = "Source input for whether a non-dependant's UC award is calculated on the basis that the person has earned income." + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(person, period, parameters): + return person("employment_income", period) + person( + "self_employment_income", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_sdp_transitional_award.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_sdp_transitional_award.py new file mode 100644 index 000000000..2d87155d0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_sdp_transitional_award.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_sdp_transitional_award(Variable): + value_type = bool + entity = BenUnit + label = "Bassetlaw Council Tax Reduction SDP transitional award flag" + documentation = "Source input for Universal Credit transitional protection that compensates for the loss of Severe Disability Premium under Bassetlaw Class G." + definition_period = YEAR + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..039fd21d0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Bassetlaw Council Tax Reduction source-disregarded annual income" + documentation = ( + "Source input for income disregards not separately exposed in PolicyEngine UK." + ) + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..53eb72cbf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_support_rate.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Bassetlaw Council Tax Reduction support rate" + definition_period = YEAR + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.bassetlaw.council_tax_reduction + weekly_income = benunit("bassetlaw_council_tax_reduction_weekly_income", period) + rounded_weekly_income = np.round(weekly_income * 100) / 100 + banded_support_rate = ctr.income_band.support_rate.calc( + rounded_weekly_income + 1e-4 + ) + vulnerable = (benunit("severe_disability_premium", period) > 0) | benunit( + "bassetlaw_council_tax_reduction_sdp_transitional_award", period + ) + uc_award = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + maximum_uc = (uc_award > 0) & (uc_award >= benunit("uc_maximum_amount", period)) + passported_band_2 = ( + benunit("council_tax_reduction_relevant_income_based_benefit", period) + | maximum_uc + ) + return select( + [vulnerable, passported_band_2], + [ctr.income_band.vulnerable_support_rate, 0.88], + default=banded_support_rate, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..ee2d68cdd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Bassetlaw disregards a pension-age UC award under regulation 60A" + documentation = "Covers pension-age Universal Credit cases where the source disregards the UC award for pensioner-status classification under regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014." + definition_period = YEAR + reference = "https://www.bassetlaw.gov.uk/media/4ikne3fx/council-tax-reduction-scheme-pension-age-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..e9ed7a02a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether a Bassetlaw UC claimant remains in the pensioner scheme during the paragraph 3 relevant period" + documentation = "Covers the source transitional protection for pension-age Universal Credit cases where the UC award is disregarded for pensioner-status classification." + definition_period = YEAR + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_uc_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_uc_weekly_income.py new file mode 100644 index 000000000..5f967b952 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_uc_weekly_income.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_uc_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Bassetlaw Council Tax Reduction weekly Universal Credit income" + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * max_(0, uc_income + uc_award) / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..57b40ad8e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_weekly_income.py @@ -0,0 +1,117 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Bassetlaw Council Tax Reduction weekly income" + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_weekly_income = benunit( + "bassetlaw_council_tax_reduction_uc_weekly_income", period + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "bassetlaw_council_tax_reduction_childcare_deduction", period + ) + net_earnings_before_childcare = max_(0, gross_earnings - earnings_deductions) + childcare_not_used_against_earnings = max_( + 0, childcare_deduction - net_earnings_before_childcare + ) + net_earnings = max_(0, net_earnings_before_childcare - childcare_deduction) + earnings_disregard = benunit( + "bassetlaw_council_tax_reduction_earnings_disregard", period + ) + countable_earnings = max_(0, net_earnings - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + tax_credits = benunit("tax_credits", period) + tax_credits_after_childcare = where( + tax_credits > 0, + max_(0, tax_credits - childcare_not_used_against_earnings), + tax_credits, + ) + benefit_income = tax_credits_after_childcare + add( + benunit, + period, + [ + "carers_allowance", + "attendance_allowance", + "child_benefit", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "jsa_contrib", + "esa_contrib", + ], + ) + disregarded_income = add( + benunit, + period, + [ + "child_benefit", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "bassetlaw_council_tax_reduction_source_disregarded_income", + ], + ) + annual_income = countable_earnings + max_( + 0, other_income + benefit_income - disregarded_income + ) + weekly_income = where( + has_uc_award, + uc_weekly_income, + annual_income / WEEKS_IN_YEAR + + benunit("bassetlaw_council_tax_reduction_weekly_tariff_income", period), + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_weekly_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_weekly_tariff_income.py new file mode 100644 index 000000000..0ec4d3079 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bassetlaw/council_tax_reduction/bassetlaw_council_tax_reduction_weekly_tariff_income.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class bassetlaw_council_tax_reduction_weekly_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Bassetlaw Council Tax Reduction weekly tariff income" + definition_period = YEAR + unit = GBP + reference = "https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.bassetlaw.council_tax_reduction + capital = benunit.household("savings", period) + return np.ceil( + max_(0, capital - ctr.means_test.tariff_income_threshold) + / ctr.means_test.tariff_income_increment + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction.py new file mode 100644 index 000000000..36d04b6eb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction.py @@ -0,0 +1,72 @@ +from policyengine_uk.model_api import * + + +class bath_and_north_east_somerset_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Bath and North East Somerset Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = [ + "https://www.bathnes.gov.uk/apply-council-tax-support", + "https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf", + ] + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.bath_and_north_east_somerset.council_tax_reduction + local_scheme = benunit( + "bath_and_north_east_somerset_council_tax_reduction_is_local_scheme", + period, + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + support_rate = benunit( + "bath_and_north_east_somerset_council_tax_reduction_support_rate", + period, + ) + liability = where( + has_uc_award, + benunit.household("council_tax", period), + benunit.household( + "bath_and_north_east_somerset_council_tax_reduction_maximum_eligible_liability", + period, + ), + ) + non_uc_award = liability * support_rate - benunit( + "bath_and_north_east_somerset_council_tax_reduction_excess_income_reduction", + period, + ) + uc_award = liability * support_rate + award = max_(0, where(has_uc_award, uc_award, non_uc_award)) + ordinary_capital_limit = ctr.means_test.capital_limit + protected_capital_limit = ctr.means_test.protected_capital_limit + protected = benunit( + "bath_and_north_east_somerset_council_tax_reduction_protected_group", + period, + ) + non_uc_capital_limit = where( + protected, protected_capital_limit, ordinary_capital_limit + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= non_uc_capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.uc_capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_excess_income_reduction.py b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_excess_income_reduction.py new file mode 100644 index 000000000..6ff8a973d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_excess_income_reduction.py @@ -0,0 +1,36 @@ +from policyengine_uk.model_api import * + + +class bath_and_north_east_somerset_council_tax_reduction_excess_income_reduction( + Variable +): + value_type = float + entity = BenUnit + label = "Bath and North East Somerset Council Tax Reduction excess-income reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.bath_and_north_east_somerset.council_tax_reduction + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit( + "bath_and_north_east_somerset_council_tax_reduction_tariff_income", period + ) + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + excess_income = max_(0, applicable_income - applicable_amount) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + return where(has_uc_award, 0, excess_income * ctr.means_test.withdrawal_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..b2bea45fd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bath_and_north_east_somerset, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class bath_and_north_east_somerset_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Bath and North East Somerset's local Council Tax Reduction scheme" + definition_period = YEAR + reference = [ + "https://www.bathnes.gov.uk/apply-council-tax-support", + "https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf", + ] + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + adult = person("is_adult", period) + source_working_age_case = benunit.any(adult) & ~benunit.any( + adult & person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + source_local_class = ( + source_working_age_case | relevant_income_based_benefit | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_bath_and_north_east_somerset(local_authority) + & source_local_class + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..6ab974456 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class bath_and_north_east_somerset_council_tax_reduction_maximum_eligible_liability( + Variable +): + value_type = float + entity = Household + label = "Bath and North East Somerset maximum Council Tax liability eligible for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + ctr = local_authorities.bath_and_north_east_somerset.council_tax_reduction + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + person = household.members + claimant_benunit = person.benunit("benunit_contains_household_head", period) + protected = household.any( + claimant_benunit + & person.benunit( + "bath_and_north_east_somerset_council_tax_reduction_protected_group", + period, + ) + ) + capped = ~protected & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..ab34ebc8f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_protected_group.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class bath_and_north_east_somerset_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Whether the Bath and North East Somerset CTR claimant is in the protected 100 percent support and 16,000 pound capital-limit group" + definition_period = YEAR + reference = "https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf" + documentation = ( + "Source input for cases where the applicant or partner receives the ESA " + "support component, enhanced disability premium, enhanced disability " + "premium for dependants, disability child premium, or severe disability premium." + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..b4b259380 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_support_rate.py @@ -0,0 +1,50 @@ +from policyengine_uk.model_api import * + + +class bath_and_north_east_somerset_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Bath and North East Somerset Council Tax Reduction support rate" + definition_period = YEAR + reference = "https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.bath_and_north_east_somerset.council_tax_reduction + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + protected = benunit( + "bath_and_north_east_somerset_council_tax_reduction_protected_group", + period, + ) + ordinary_non_uc_rate = where( + protected, ctr.protected_maximum_support_rate, ctr.maximum_support_rate + ) + weekly_income = benunit( + "bath_and_north_east_somerset_council_tax_reduction_uc_weekly_income", + period, + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + child_count = min_(2, benunit.sum(child_or_young_person)) + adjusted_income = max_( + 0, + weekly_income - child_count * ctr.income_band.child_increment, + ) + # The source bands are printed to the penny with inclusive upper bounds. + # Nudge after rounding so 98.05 stays in band 1 and 98.06 enters band 2. + band_income = adjusted_income + 0.001 + uc_rate = where( + benunit("is_couple", period), + ctr.income_band.couple.support_rate.calc(band_income), + ctr.income_band.single.support_rate.calc(band_income), + ) + return where(has_uc_award, uc_rate, ordinary_non_uc_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..ce4ad555a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_tariff_income.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class bath_and_north_east_somerset_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = ( + "Bath and North East Somerset Council Tax Reduction tariff income from capital" + ) + definition_period = YEAR + unit = GBP + reference = "https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + tariff = parameters( + period + ).gov.local_authorities.bath_and_north_east_somerset.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.floor(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award | relevant_income_based_benefit, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_uc_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_uc_weekly_income.py new file mode 100644 index 000000000..66708eaf1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bath_and_north_east_somerset/council_tax_reduction/bath_and_north_east_somerset_council_tax_reduction_uc_weekly_income.py @@ -0,0 +1,87 @@ +from policyengine_uk.model_api import * + + +class bath_and_north_east_somerset_council_tax_reduction_uc_weekly_income(Variable): + value_type = float + entity = BenUnit + label = ( + "Bath and North East Somerset Council Tax Reduction UC Class F weekly income" + ) + definition_period = YEAR + unit = GBP + reference = "https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + uc_net_earnings = max_( + 0, + benunit.sum( + claimant_or_partner * person("uc_mif_capped_earned_income", period) + ) + - earnings_deductions, + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + counted_uc_award = max_( + 0, + uc_award_before_deductions + - benunit("uc_housing_costs_element", period) + - benunit("uc_childcare_element", period), + ) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + disregarded_income = add( + benunit, + period, + [ + "attendance_allowance", + "dla", + "pip", + ], + ) + uc_income = ( + uc_net_earnings + + counted_uc_award + + max_( + 0, + benunit("uc_unearned_income", period) + + other_income + - disregarded_income, + ) + ) + weekly_income = where(has_uc_award, uc_income / WEEKS_IN_YEAR, 0) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/bolton/council_tax_reduction/bolton_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/bolton/council_tax_reduction/bolton_council_tax_reduction.py new file mode 100644 index 000000000..fae8daaa0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bolton/council_tax_reduction/bolton_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bolton_working_age, +) + + +class bolton_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Bolton Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.bolton.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_bolton_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "bolton_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bolton/council_tax_reduction/bolton_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/bolton/council_tax_reduction/bolton_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..11a44e7d2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bolton/council_tax_reduction/bolton_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bolton_working_age, +) + + +class bolton_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Bolton CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.bolton.council_tax_reduction + household = person.household + working_age = is_bolton_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_under_25_uc_no_earned_income=True, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bolton/council_tax_reduction/bolton_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/bolton/council_tax_reduction/bolton_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..c1519f526 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bolton/council_tax_reduction/bolton_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class bolton_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Bolton CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "bolton_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction.py new file mode 100644 index 000000000..063cc636b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction.py @@ -0,0 +1,42 @@ +from policyengine_uk.model_api import * + + +class braintree_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Braintree Council Tax Reduction" + documentation = "Braintree operates a Banded Discount Scheme with a 77 per cent maximum (paragraph 48.1). Schedule 1 paragraph 1 sets the entitlement percentage from a household-type table varying by Single / Couple x no / one / two-or-more children household composition and weekly income range. Schedule 1 paragraph 5 / paragraph 26.1 exclude applicants whose capital is 10,000 pounds or greater. Schedule 1 paragraph 7 places passported Income Support, income-related ESA or income-based JSA applicants in Band 1 (77 per cent). The working-age scheme has no Band cap and no non-dependant deductions; pension-age applicants follow the prescribed pensioner scheme except where the scheme treats a pension-age Universal Credit or working-age income-related-benefit case as not being a pensioner." + definition_period = YEAR + unit = GBP + reference = "https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.braintree.council_tax_reduction + local_scheme = benunit( + "braintree_council_tax_reduction_is_local_scheme", period + ) + rate = benunit("braintree_council_tax_reduction_band_rate", period) + liability = benunit.household("council_tax", period) + # Section 26.1 / Schedule 1 paragraph 5: "10,000 or greater" strict cutoff, + # using DWP-assessed UC capital for UC awards (paragraph 12.5). + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + capital_eligible = capital < ctr.means_test.capital_limit + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * liability + * rate + ) diff --git a/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_band_rate.py b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_band_rate.py new file mode 100644 index 000000000..365bc4545 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_band_rate.py @@ -0,0 +1,47 @@ +from policyengine_uk.model_api import * + + +class braintree_council_tax_reduction_band_rate(Variable): + value_type = float + entity = BenUnit + label = "Braintree weekly income-band CTR rate" + documentation = "Schedule 1 paragraph 1 selects the entitlement percentage from a six-row household-type table indexed by weekly income range and family composition (Single / Couple x no / one / two-or-more children). Schedule 1 paragraph 7 places passported applicants (Income Support, income-related Employment and Support Allowance or income-based Jobseeker's Allowance) in Band 1 (77 per cent)." + definition_period = YEAR + reference = "https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.braintree.council_tax_reduction + weekly_income = benunit("braintree_council_tax_reduction_weekly_income", period) + # Pad slightly so that exactly-on-the-boundary tests fall in the lower band. + weekly_income_for_band = weekly_income + 1e-9 + is_couple = benunit("is_couple", period) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_dependants = benunit.sum(child_or_young_person) + bands = ctr.income_band + single_rate = select( + [num_dependants >= 2, num_dependants == 1], + [ + bands.single_two_or_more_children.calc(weekly_income_for_band), + bands.single_one_child.calc(weekly_income_for_band), + ], + default=bands.single_no_children.calc(weekly_income_for_band), + ) + couple_rate = select( + [num_dependants >= 2, num_dependants == 1], + [ + bands.couple_two_or_more_children.calc(weekly_income_for_band), + bands.couple_one_child.calc(weekly_income_for_band), + ], + default=bands.couple_no_children.calc(weekly_income_for_band), + ) + banded_rate = where(is_couple, couple_rate, single_rate) + # Schedule 1 paragraph 7: passported applicants (Income Support, income-related + # ESA or income-based JSA) receive Band 1 (77 per cent). + passported = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + passport_rate = ctr.maximum_support_rate + return where(passported, passport_rate, banded_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..7e780a4e4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_braintree, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class braintree_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Braintree's local Council Tax Reduction scheme" + documentation = "Paragraphs 1.2 and 1.3 confirm that the working-age scheme applies to non-pensioners (plus pension-age applicants on a working-age income-related benefit or Universal Credit). Paragraph 3(2) disregards pension-age Universal Credit awards during the relevant period and where regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014 applies, leaving those cases on the prescribed pensioner scheme." + definition_period = YEAR + reference = "https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "braintree_council_tax_reduction_uc_relevant_period_pensioner", period + ) | benunit( + "braintree_council_tax_reduction_uc_regulation_60a_pensioner", period + ) + local_case = ( + has_working_age_adult + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return (country == Country.ENGLAND) & is_braintree(local_authority) & local_case diff --git a/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..25631dc36 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class braintree_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Braintree's Universal Credit regulation 60A pensioner exception" + " applies" + ) + documentation = "Braintree paragraph 3(2)(b) disregards a pension-age applicant's Universal Credit award where regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014 applies, keeping the applicant on the prescribed pensioner scheme rather than the local working-age banded scheme." + definition_period = YEAR + reference = "https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..58f5200e4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class braintree_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Braintree's Universal Credit relevant-period pensioner exception" + " applies" + ) + documentation = "Braintree paragraph 3(2)(a) disregards a pension-age applicant's Universal Credit award during the prescribed relevant period, keeping the applicant on the prescribed pensioner scheme rather than the local working-age banded scheme." + definition_period = YEAR + reference = "https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..1abee2c40 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/braintree/council_tax_reduction/braintree_council_tax_reduction_weekly_income.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * + + +class braintree_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Braintree Council Tax Reduction assessed weekly income" + documentation = "Weekly net income of the claimant and partner used to look up the Schedule 1 entitlement bands. Paragraph 12.2-12.4 takes the DWP-assessed Universal Credit income (multiplied by 12 and divided by 52) and adds the actual award where the applicant has a UC award. Non-UC cases use the prescribed Schedule 2/4 disregards, which PolicyEngine UK exposes via council_tax_reduction_applicable_income." + definition_period = YEAR + unit = GBP + reference = "https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = ( + benunit("uc_earned_income", period) + + benunit("uc_unearned_income", period) + + benunit("universal_credit", period) + ) + weekly_income = where( + has_uc_award, + uc_income / WEEKS_IN_YEAR, + benunit("council_tax_reduction_applicable_income", period) / WEEKS_IN_YEAR, + ) + return weekly_income diff --git a/policyengine_uk/variables/gov/local_authorities/breckland/council_tax_reduction/breckland_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/breckland/council_tax_reduction/breckland_council_tax_reduction.py new file mode 100644 index 000000000..df57be0cd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/breckland/council_tax_reduction/breckland_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_breckland_working_age, +) + + +class breckland_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Breckland Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.breckland.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_breckland_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "breckland_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/breckland/council_tax_reduction/breckland_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/breckland/council_tax_reduction/breckland_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..11bba6c43 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/breckland/council_tax_reduction/breckland_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_breckland_working_age, +) + + +class breckland_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Breckland CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.breckland.council_tax_reduction + household = person.household + working_age = is_breckland_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/breckland/council_tax_reduction/breckland_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/breckland/council_tax_reduction/breckland_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..56bdaf743 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/breckland/council_tax_reduction/breckland_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class breckland_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Breckland CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "breckland_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction.py new file mode 100644 index 000000000..521a0f8ce --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_brent_working_age, +) + + +class brent_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Brent Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.brent.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_brent_working_age(local_authority, country, has_pensioner) + weekly_earnings = benunit("brent_council_tax_reduction_weekly_earnings", period) + support_rate = ctr.income_band.support_rate.calc(weekly_earnings) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "brent_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital_eligible = ( + benunit.household("savings", period) < ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..3ca1d065e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_brent_working_age, +) + + +class brent_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Brent Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.brent.council_tax_reduction + household = person.household + working_age = is_brent_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + working = earned_income > 0 + weekly_deduction = where( + working, + ctr.non_dep_deduction.working_amount, + ctr.non_dep_deduction.not_working_amount, + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + full_time_student = is_full_time_student_non_dep(person, period) + return ( + working_age + * where(claimant_exempt | full_time_student, 0.0, weekly_deduction) + * WEEKS_IN_YEAR + ) diff --git a/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..e9ffdff5c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class brent_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Brent Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "brent_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction_weekly_earnings.py b/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction_weekly_earnings.py new file mode 100644 index 000000000..47a0c064f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brent/council_tax_reduction/brent_council_tax_reduction_weekly_earnings.py @@ -0,0 +1,27 @@ +from policyengine_uk.model_api import * + + +class brent_council_tax_reduction_weekly_earnings(Variable): + value_type = float + entity = BenUnit + label = "Brent Council Tax Support weekly claimant and partner earnings" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + has_uc = benunit("universal_credit", period) > 0 + uc_earnings = benunit("uc_earned_income", period) + annual_earnings = where(has_uc, uc_earnings, gross_earnings) + return annual_earnings / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction.py new file mode 100644 index 000000000..9b88ccd99 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction.py @@ -0,0 +1,71 @@ +from policyengine_uk.model_api import * + + +class brentwood_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Brentwood Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.brentwood.council_tax_reduction + local_scheme = benunit( + "brentwood_council_tax_reduction_is_local_scheme", period + ) + weekly_income = benunit("brentwood_council_tax_reduction_weekly_income", period) + # Pad slightly so that exactly-on-the-boundary tests fall in the lower band. + weekly_income_for_band = weekly_income + 1e-9 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_dependants = benunit.sum(child_or_young_person) + income_bands = ctr.income_band + banded_rate = select( + [num_dependants >= 2, num_dependants == 1], + [ + income_bands.two_or_more_dependants.calc(weekly_income_for_band), + income_bands.one_dependant.calc(weekly_income_for_band), + ], + default=income_bands.no_dependants.calc(weekly_income_for_band), + ) + # Schedule 1 paragraph 9: passported income-based benefit applicants get + # at least 75% (Band 1). + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + passport_rate = ctr.income_band.no_dependants.calc(0.0) + rate_before_uplift = where( + relevant_income_based_benefit, max_(banded_rate, passport_rate), banded_rate + ) + # Schedule 1 paragraph 3: protected groups uplift to 100%. + protected = benunit("brentwood_council_tax_reduction_protected_group", period) + rate = where(protected & (rate_before_uplift > 0), 1.0, rate_before_uplift) + # Section 6.1: Band F/G/H working-age homeowners get 0%. + band_fgh_owner = benunit( + "brentwood_council_tax_reduction_band_fgh_owner_excluded", period + ) + rate = where(band_fgh_owner, 0.0, rate) + liability = benunit.household("council_tax", period) + # Section 30 capital limit (£6,000 strict) - non-UC vs UC capital. + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + non_uc_capital = benunit.household("savings", period) + uc_capital = benunit("uc_assessable_capital", period) + capital = where(has_uc_award, uc_capital, non_uc_capital) + capital_eligible = capital <= ctr.means_test.capital_limit + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * liability + * rate + ) diff --git a/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_band_fgh_owner_excluded.py b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_band_fgh_owner_excluded.py new file mode 100644 index 000000000..6e72cc16b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_band_fgh_owner_excluded.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.input.council_tax_band import CouncilTaxBand +from policyengine_uk.variables.household.demographic.tenure_type import TenureType + + +class brentwood_council_tax_reduction_band_fgh_owner_excluded(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Brentwood's section 6.1 Band F/G/H owner-occupier exclusion applies" + ) + documentation = "Brentwood paragraph 6.1: working-age applicants who reside in a property in Council Tax Band F, G or H and are defined within the Housing Benefit regulations as an owner receive 0 percent support." + definition_period = YEAR + reference = "https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf" + + def formula(benunit, period, parameters): + household = benunit.household + band = household("council_tax_band", period) + tenure = household("tenure_type", period) + is_band_fgh = ( + (band == CouncilTaxBand.F) + | (band == CouncilTaxBand.G) + | (band == CouncilTaxBand.H) + ) + is_owner = (tenure == TenureType.OWNED_OUTRIGHT) | ( + tenure == TenureType.OWNED_WITH_MORTGAGE + ) + return is_band_fgh & is_owner diff --git a/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_esa_support_component.py b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_esa_support_component.py new file mode 100644 index 000000000..e5446ea7c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_esa_support_component.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class brentwood_council_tax_reduction_esa_support_component(Variable): + value_type = bool + entity = BenUnit + label = "Brentwood CTR source input - applicant, partner, or dependant gets ESA Support Component" + documentation = "Brentwood Schedule 1 paragraph 3 uplifts the band discount to 100 percent where the applicant, partner, or any dependant gets Employment and Support Allowance with the Support Component. PolicyEngine UK does not separately model the ESA Support Component, so this Brentwood-scoped source input lets a household assert receipt for the protected-group test. Default False." + definition_period = YEAR + reference = "https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..50d65242a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,45 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_brentwood, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class brentwood_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Brentwood's local Council Tax Reduction scheme" + documentation = "Brentwood paragraph 5.1 covers working-age applicants and pension-age applicants whose partner is on Income Support, income-based JSA, income-related ESA, or Universal Credit. Paragraph 5.2 disregards a pension-age UC award where regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014 applies." + definition_period = YEAR + reference = "https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_award_disregarded_for_pensioner_status = benunit( + "brentwood_council_tax_reduction_uc_regulation_60a_pensioner", period + ) + in_local_class = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | (has_uc_award & ~uc_award_disregarded_for_pensioner_status) + ) + return ( + (country == Country.ENGLAND) + & is_brentwood(local_authority) + & in_local_class + ) diff --git a/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..5057080a4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_protected_group.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * + + +class brentwood_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit qualifies for Brentwood's Schedule 1 paragraph 3 protected-group 100 percent uplift" + documentation = "Schedule 1 paragraph 3 uplifts the band discount to 100 percent where the applicant, partner or any dependant in their household is entitled to: Disability Living Allowance, Personal Independence Payment, Attendance Allowance, Universal Credit with the Limited Capability for Work or Limited Capability for Work Related Activity element, Armed Forces Independence Payment, Working Tax Credit with the disability element, Severe Disablement Allowance, or Employment and Support Allowance with the support component. The UC LCW element, the WTC disability element and the ESA Support Component are not modeled directly in PolicyEngine UK, so jurisdiction-scoped Brentwood source-input booleans are provided for those facts." + definition_period = YEAR + reference = "https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + # Source covers the applicant, partner, and dependants, not non-dependants. + dla = benunit.sum(person("dla_sc", period) + person("dla_m", period)) + pip = benunit.sum(person("pip_dl", period) + person("pip_m", period)) + attendance = benunit.sum(person("attendance_allowance", period)) + afip = benunit.sum(person("armed_forces_independence_payment", period)) + sda = benunit.sum(person("sda", period)) + # UC LCWRA element is modeled directly in PolicyEngine UK. + uc_lcwra = benunit("uc_LCWRA_element", period) + # UC LCW element, WTC disability element and ESA Support Component are + # not modeled in PolicyEngine UK; Brentwood-scoped source inputs let + # households assert receipt of those elements for the protected-group + # uplift. + uc_lcw = benunit("brentwood_council_tax_reduction_uc_lcw_element", period) + wtc_disability = benunit( + "brentwood_council_tax_reduction_wtc_disability_element", period + ) + esa_support = benunit( + "brentwood_council_tax_reduction_esa_support_component", period + ) + return ( + (dla > 0) + | (pip > 0) + | (attendance > 0) + | (afip > 0) + | (sda > 0) + | (uc_lcwra > 0) + | uc_lcw + | wtc_disability + | esa_support + ) diff --git a/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_uc_lcw_element.py b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_uc_lcw_element.py new file mode 100644 index 000000000..2aeadc68a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_uc_lcw_element.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class brentwood_council_tax_reduction_uc_lcw_element(Variable): + value_type = bool + entity = BenUnit + label = "Brentwood CTR source input - applicant, partner, or dependant gets the UC Limited Capability for Work element" + documentation = "Brentwood Schedule 1 paragraph 3 uplifts the band discount to 100 percent where the applicant, partner, or any dependant gets Universal Credit with the Limited Capability for Work (LCW) element. The LCW element was abolished for most new claims from April 2017, but is still listed in the Brentwood scheme. PolicyEngine UK models the Limited Capability for Work-Related Activity (LCWRA) element directly via uc_LCWRA_element, but does not model the LCW element. This Brentwood-scoped source input lets a household assert LCW-element receipt for the protected-group test. Default False." + definition_period = YEAR + reference = "https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..228b19658 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class brentwood_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Brentwood disregards a pension-age UC award under regulation 60A" + documentation = "Brentwood paragraph 5.2 disregards a pension-age UC award where regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014 applies. When set, a pension-age UC claimant remains in the national pensioner CTR scheme rather than the Brentwood working-age scheme." + definition_period = YEAR + reference = "https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..82b6ca304 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_weekly_income.py @@ -0,0 +1,85 @@ +from policyengine_uk.model_api import * + + +class brentwood_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Brentwood Council Tax Reduction assessed weekly income" + documentation = "Weekly applicant-and-partner income used to look up the Schedule 1 discount band. UC claimants use the DWP-assessed UC income calculation (paragraph 12) - the gross UC award (before deductions for loans, sanctions, advances or third-party payments) plus DWP-assessed earnings and other income, with a 20 pound weekly earnings disregard. Non-UC applicants use net earnings after tax, NI, half pension contributions, the 20 pound weekly earnings disregard, plus countable income other than earnings." + definition_period = YEAR + unit = GBP + reference = "https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + # UC paragraph 12.5: gross UC award before deductions; paragraph 12.7: x 12 / 52. + # Paragraph 12.6(d): GBP 20 weekly earnings disregard. + uc_earned_income = benunit("uc_earned_income", period) + uc_earnings_disregard = (uc_earned_income > 0) * 20 * WEEKS_IN_YEAR + uc_income = ( + max_(0, uc_earned_income - uc_earnings_disregard) + + benunit("uc_unearned_income", period) + + benunit("universal_credit_pre_benefit_cap", period) + ) + # Non-UC: net earnings after tax/NI/half-pension contributions, then + # paragraph 23.2/25.2's GBP 20 weekly earnings disregard. + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + net_earnings = max_(0, gross_earnings - earnings_deductions) + earnings_disregard = (gross_earnings > 0) * 20 * WEEKS_IN_YEAR + countable_earnings = max_(0, net_earnings - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "tax_credits", + "carers_allowance", + "jsa_contrib", + "esa_contrib", + ], + ) + non_uc_income = countable_earnings + other_income + benefit_income + annual_income = where(has_uc_award, uc_income, non_uc_income) + return annual_income / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_wtc_disability_element.py b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_wtc_disability_element.py new file mode 100644 index 000000000..cadc26092 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/brentwood/council_tax_reduction/brentwood_council_tax_reduction_wtc_disability_element.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class brentwood_council_tax_reduction_wtc_disability_element(Variable): + value_type = bool + entity = BenUnit + label = "Brentwood CTR source input - applicant, partner, or dependant gets the WTC disability element" + documentation = "Brentwood Schedule 1 paragraph 3 uplifts the band discount to 100 percent where the applicant, partner, or any dependant gets Working Tax Credit with the disability element. PolicyEngine UK models Working Tax Credit but not the disability element specifically, so this Brentwood-scoped source input lets a household assert receipt for the protected-group test. Default False." + definition_period = YEAR + reference = "https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction.py new file mode 100644 index 000000000..9551e419f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction.py @@ -0,0 +1,67 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bristol_working_age, +) + + +class bristol_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Bristol Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.bristol.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_bristol_working_age(local_authority, country, has_pensioner) + has_uc_award = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("bristol_council_tax_reduction_tariff_income", period) + uc_applicable_income = benunit( + "bristol_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "bristol_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..91a750b96 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class bristol_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Bristol Council Tax Reduction claimant has a source-listed non-dependant deduction exemption" + definition_period = YEAR + reference = "https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file" diff --git a/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..605cae267 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,92 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bristol_working_age, +) + + +class bristol_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Bristol Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.bristol.council_tax_reduction + household = person.household + working_age = is_bristol_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + person_earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + benunit_earned_income = person.benunit.sum(person_earned_income) + income_for_table = where( + person.benunit("is_couple", period), + benunit_gross_income, + benunit_earned_income, + ) + weekly_income_for_table = income_for_table / WEEKS_IN_YEAR + in_work = benunit_earned_income > 0 + weekly_deduction = where( + in_work, + ctr.non_dep_deduction.amount.calc(weekly_income_for_table), + ctr.non_dep_deduction.amount.calc(0), + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "bristol_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = (person.benunit("universal_credit", period) > 0) & ( + benunit_earned_income <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person("bristol_council_tax_reduction_non_dep_source_exemption", period) + ) + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..c7d036019 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class bristol_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Bristol Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "bristol_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..e2379d9b3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class bristol_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Bristol Council Tax Reduction non-dependant has a source-listed deduction exemption" + definition_period = YEAR + reference = "https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file" diff --git a/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..5ffee7604 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_tariff_income.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class bristol_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Bristol Council Tax Reduction tariff income from capital" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + tariff = parameters( + period + ).gov.local_authorities.bristol.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..31da7f408 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bristol/council_tax_reduction/bristol_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class bristol_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Bristol Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/broadland/council_tax_reduction/broadland_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/broadland/council_tax_reduction/broadland_council_tax_reduction.py new file mode 100644 index 000000000..5f9766506 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/broadland/council_tax_reduction/broadland_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_broadland_working_age, +) + + +class broadland_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Broadland Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.broadland.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_broadland_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "broadland_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/broadland/council_tax_reduction/broadland_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/broadland/council_tax_reduction/broadland_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..32175741e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/broadland/council_tax_reduction/broadland_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_broadland_working_age, +) + + +class broadland_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Broadland CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.broadland.council_tax_reduction + household = person.household + working_age = is_broadland_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/broadland/council_tax_reduction/broadland_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/broadland/council_tax_reduction/broadland_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..ef0c7d4f3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/broadland/council_tax_reduction/broadland_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class broadland_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Broadland CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "broadland_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction.py new file mode 100644 index 000000000..aff42da7f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction.py @@ -0,0 +1,70 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bromley_working_age, +) + + +class bromley_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Bromley Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.bromley.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_bromley_working_age(local_authority, country, has_pensioner) + has_uc_award = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("bromley_council_tax_reduction_tariff_income", period) + uc_applicable_income = benunit( + "bromley_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household( + "bromley_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "bromley_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + capital_eligible = capital_eligible | relevant_income_based_benefit + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..81d6dfaec --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bromley_working_age, +) + + +class bromley_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Bromley Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.bromley.council_tax_reduction + household = person.household + working_age = is_bromley_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return normal_gross_income_non_dep_deduction( + person, + period, + ctr, + working_age, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..1fac9ac04 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_bromley_working_age, +) + + +class bromley_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Bromley maximum Council Tax liability eligible for Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.bromley.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_bromley_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + capped = working_age & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..f3867d5b7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class bromley_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Bromley Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "bromley_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..421220ca4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_tariff_income.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class bromley_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Bromley Council Tax Support tariff income from capital" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + tariff = parameters( + period + ).gov.local_authorities.bromley.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..8aa916e43 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bromley/council_tax_reduction/bromley_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class bromley_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Bromley Council Tax Support Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction.py new file mode 100644 index 000000000..71eefe3dd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction.py @@ -0,0 +1,72 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Buckinghamshire Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.buckinghamshire.council_tax_reduction + local_scheme = benunit( + "buckinghamshire_council_tax_reduction_is_local_scheme", period + ) + weekly_income = benunit( + "buckinghamshire_council_tax_reduction_weekly_income", period + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_children = benunit.sum(child_or_young_person) + is_couple = benunit("is_couple", period) + income_bands = ctr.income_band + weekly_income_for_band = weekly_income + 1e-9 + banded_support_rate = select( + [ + is_couple & (num_children >= 2), + is_couple & (num_children == 1), + (~is_couple) & (num_children >= 2), + (~is_couple) & (num_children == 1), + is_couple, + ], + [ + income_bands.couple_two_or_more_children.calc(weekly_income_for_band), + income_bands.couple_one_child.calc(weekly_income_for_band), + income_bands.single_two_or_more_children.calc(weekly_income_for_band), + income_bands.single_one_child.calc(weekly_income_for_band), + income_bands.couple.calc(weekly_income_for_band), + ], + default=income_bands.single.calc(weekly_income_for_band), + ) + passported = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + support_rate = where(passported, 1, banded_support_rate) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "buckinghamshire_council_tax_reduction_non_dep_deductions", period + ) + eligible_liability = max_(0, liability - non_dep_deductions) + has_uc_award = benunit("universal_credit", period) > 0 + non_uc_capital_eligible = ( + benunit.household("savings", period) < ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) < ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * eligible_liability + * support_rate + ) diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..41a203bd6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Buckinghamshire CTR claimant or partner has a source-defined non-dependant deduction exemption not otherwise modeled" + documentation = "Covers source-listed claimant exemptions not otherwise represented in PolicyEngine UK, such as would-be entitlement to a disability benefit but for suspension, abatement, or hospitalisation." + definition_period = YEAR + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_countable_universal_credit.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_countable_universal_credit.py new file mode 100644 index 000000000..83dd79e26 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_countable_universal_credit.py @@ -0,0 +1,30 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_countable_universal_credit(Variable): + value_type = float + entity = BenUnit + label = "Buckinghamshire Council Tax Reduction countable Universal Credit income" + definition_period = YEAR + unit = GBP + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + award = benunit("universal_credit", period) + disregarded_elements = add( + benunit, + period, + [ + "uc_housing_costs_element", + "uc_LCWRA_element", + "uc_individual_disabled_child_element", + "uc_individual_severely_disabled_child_element", + "uc_carer_element", + ], + ) + disregarded_elements += benunit( + "buckinghamshire_council_tax_reduction_source_disregarded_uc_elements", + period, + ) + return has_uc_award * max_(0, award - disregarded_elements) diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_disability_income_disregard.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_disability_income_disregard.py new file mode 100644 index 000000000..1592ff46b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_disability_income_disregard.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_disability_income_disregard(Variable): + value_type = bool + entity = BenUnit + label = "Buckinghamshire CTR disability income disregard applies" + definition_period = YEAR + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + modeled_disability_benefit = benunit.max( + person.household.any( + (person("pip", period) > 0) + | (person("dla", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + ) + ) + esa_support_component = benunit.max( + person.household.any( + person.benunit( + "buckinghamshire_council_tax_reduction_esa_support_component", + period, + ) + > 0 + ) + ) + source_disability = benunit.max( + person.household.any( + person.benunit( + "buckinghamshire_council_tax_reduction_source_disability_income_disregard", + period, + ) + ) + ) + return ( + (modeled_disability_benefit > 0) + | (esa_support_component > 0) + | (source_disability > 0) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_esa_support_component.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_esa_support_component.py new file mode 100644 index 000000000..6e4eba43b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_esa_support_component.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_esa_support_component(Variable): + value_type = float + entity = BenUnit + label = "Buckinghamshire CTR annual ESA support component amount to disregard" + definition_period = YEAR + unit = GBP + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..2cf9c55e0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,70 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class buckinghamshire_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Buckinghamshire Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.buckinghamshire.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "buckinghamshire_council_tax_reduction_is_local_scheme", + period, + ) + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "buckinghamshire_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = (person.benunit("universal_credit", period) > 0) & ( + person( + "buckinghamshire_council_tax_reduction_non_dep_uc_earned_income", + period, + ) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person( + "buckinghamshire_council_tax_reduction_non_dep_source_exemption", + period, + ) + ) + deduction = ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + return local_scheme * where(exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..9bfb4f7db --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,39 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_buckinghamshire, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class buckinghamshire_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Buckinghamshire's local CTR scheme" + definition_period = YEAR + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + transitional_protection = benunit( + "buckinghamshire_council_tax_reduction_uc_transitional_protection_pensioner", + period, + ) + source_working_age = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | (has_uc_award & ~transitional_protection) + ) + return ( + (country == Country.ENGLAND) + & is_buckinghamshire(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..76d43b456 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,22 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Buckinghamshire Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + deductions = benunit.members( + "buckinghamshire_council_tax_reduction_individual_non_dep_deduction", + period, + ) + deduction_for_benunit = benunit.max(deductions) + is_benunit_head = benunit.members("is_benunit_head", period) + deductions_to_count = is_benunit_head * benunit.project(deduction_for_benunit) + deductions_in_household = benunit.max( + benunit.members.household.sum(deductions_to_count) + ) + return deductions_in_household - deduction_for_benunit diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..d47416dff --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Buckinghamshire CTR non-dependant has a source-defined deduction exemption not otherwise modeled" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK, such as normal home elsewhere, youth-training allowance, long-term patient status, armed forces away on operations, or Schedule 1 discount-disregarded cases." + definition_period = YEAR + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..741a5ab4f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Buckinghamshire Council Tax Reduction non-dependant UC earned income" + documentation = "Person-level UC earned income for applying the source exemption where a non-dependant's Universal Credit award is calculated with no earned income. Defaults to modeled person-level gross UC earned income and can be overridden where DWP assessed income differs." + definition_period = YEAR + unit = GBP + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + + def formula(person, period, parameters): + return person("uc_mif_capped_earned_income", period) diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_source_disability_income_disregard.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_source_disability_income_disregard.py new file mode 100644 index 000000000..b8cc61311 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_source_disability_income_disregard.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_source_disability_income_disregard( + Variable +): + value_type = bool + entity = BenUnit + label = "Buckinghamshire CTR source-defined disability income disregard applies" + documentation = "Covers source-listed disability disregard triggers not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..69c596eaa --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Buckinghamshire CTR source-disregarded annual income" + documentation = "Source-listed non-UC income disregards not otherwise separately exposed in PolicyEngine UK, such as war pensions or other specified payments." + definition_period = YEAR + unit = GBP + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_source_disregarded_uc_elements.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_source_disregarded_uc_elements.py new file mode 100644 index 000000000..e3cd0494c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_source_disregarded_uc_elements.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_source_disregarded_uc_elements(Variable): + value_type = float + entity = BenUnit + label = "Buckinghamshire CTR source-disregarded annual Universal Credit elements" + documentation = "Source-listed UC award elements not otherwise separately exposed in PolicyEngine UK." + definition_period = YEAR + unit = GBP + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_uc_transitional_protection_pensioner.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_uc_transitional_protection_pensioner.py new file mode 100644 index 000000000..0afdc2710 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_uc_transitional_protection_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_uc_transitional_protection_pensioner( + Variable +): + value_type = bool + entity = BenUnit + label = "Whether a Buckinghamshire UC claimant remains in the pensioner scheme because the source disregards the UC award" + documentation = "Covers the source rule disregarding a UC award for pensioner-status classification where Universal Credit Transitional Provisions regulation 60A applies." + definition_period = YEAR + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..a1241ad66 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/buckinghamshire/council_tax_reduction/buckinghamshire_council_tax_reduction_weekly_income.py @@ -0,0 +1,145 @@ +from policyengine_uk.model_api import * + + +class buckinghamshire_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Buckinghamshire Council Tax Reduction weekly net income" + definition_period = YEAR + unit = GBP + reference = "https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.buckinghamshire.council_tax_reduction + has_uc_award = benunit("universal_credit", period) > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + non_uc_net_earnings = max_(0, gross_earnings - earnings_deductions) + uc_net_earnings = benunit("uc_earned_income", period) + net_earnings = where(has_uc_award, uc_net_earnings, non_uc_net_earnings) + has_earnings = where(has_uc_award, uc_net_earnings > 0, gross_earnings > 0) + countable_earnings = max_( + 0, + net_earnings - has_earnings * ctr.income_disregard.earnings * WEEKS_IN_YEAR, + ) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "tax_credits", + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "jsa_contrib", + "esa_contrib", + ], + ) + non_uc_disregarded_income = add( + benunit, + period, + [ + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "buckinghamshire_council_tax_reduction_esa_support_component", + "buckinghamshire_council_tax_reduction_source_disregarded_income", + ], + ) + non_uc_non_earnings = max_( + 0, other_income + benefit_income - non_uc_disregarded_income + ) + countable_uc = benunit( + "buckinghamshire_council_tax_reduction_countable_universal_credit", + period, + ) + uc_disregarded_unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + ], + ) + ) + add( + benunit, + period, + [ + "housing_benefit", + "buckinghamshire_council_tax_reduction_esa_support_component", + "buckinghamshire_council_tax_reduction_source_disregarded_income", + ], + ) + uc_income = ( + countable_earnings + + max_( + 0, + benunit("uc_unearned_income", period) - uc_disregarded_unearned_income, + ) + + countable_uc + ) + non_uc_income = max_( + 0, + countable_earnings + non_uc_non_earnings, + ) + annual_income = where(has_uc_award, uc_income, non_uc_income) + disabled = benunit( + "buckinghamshire_council_tax_reduction_disability_income_disregard", + period, + ) + weekly_income = max_( + 0, + annual_income / WEEKS_IN_YEAR - disabled * ctr.income_disregard.disability, + ) + passported = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return np.round(where(passported, 0, weekly_income) * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction.py new file mode 100644 index 000000000..def7afd20 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction.py @@ -0,0 +1,93 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bury_working_age, +) + + +class bury_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Bury Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.bury.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_bury_working_age(local_authority, country, has_pensioner) + gross_earned_income = add( + benunit, + period, + [ + "employment_income", + "self_employment_income", + ], + ) + non_uc_deductions = ( + add( + benunit, + period, + [ + "income_tax", + "national_insurance", + ], + ) + + add(benunit, period, ["pension_contributions"]) * 0.5 + ) + non_uc_earnings = max_(0, gross_earned_income - non_uc_deductions) + uc_gross_earned_income = add(benunit, period, ["uc_mif_capped_earned_income"]) + uc_deductions = add( + benunit, + period, + [ + "income_tax", + "national_insurance", + "pension_contributions", + ], + ) + uc_earnings = max_(0, uc_gross_earned_income - uc_deductions) + has_uc_award = benunit("universal_credit", period) > 0 + annual_earnings = where(has_uc_award, uc_earnings, non_uc_earnings) + monthly_earnings = annual_earnings / MONTHS_IN_YEAR + num_children = benunit("num_children", period) + is_couple = benunit("is_couple", period) + is_lone_parent = benunit("is_lone_parent", period) + income_bands = ctr.income_band + support_rate = select( + [ + is_lone_parent & (num_children >= 2), + is_lone_parent & (num_children == 1), + is_couple & (num_children >= 2), + is_couple & (num_children == 1), + is_couple, + ], + [ + income_bands.single_two_or_more_children.calc(monthly_earnings), + income_bands.single_one_child.calc(monthly_earnings), + income_bands.couple_two_or_more_children.calc(monthly_earnings), + income_bands.couple_one_child.calc(monthly_earnings), + income_bands.couple.calc(monthly_earnings), + ], + default=income_bands.single.calc(monthly_earnings), + ) + liability = benunit.household( + "bury_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "bury_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_bereavement_protected.py b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_bereavement_protected.py new file mode 100644 index 000000000..4f1531d90 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_bereavement_protected.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class bury_council_tax_reduction_bereavement_protected(Variable): + value_type = bool + entity = BenUnit + label = "Bury CTR household has a recent bereavement protected-group marker" + definition_period = YEAR + reference = ( + "https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf" + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..7aa0ef4cb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,61 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bury_working_age, +) + + +class bury_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Bury CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.bury.council_tax_reduction + household = person.household + working_age = is_bury_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = (person.benunit("universal_credit", period) > 0) & ( + person.benunit.sum(earned_income) <= 0 + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + ) + ) + full_time_student = is_full_time_student_non_dep(person, period) + exempt = ( + claimant_exempt + | full_time_student + | income_based_benefit + | uc_no_earned_income + ) + annual_deduction = ctr.non_dep_deduction.monthly_amount * MONTHS_IN_YEAR + return working_age * where(exempt, 0.0, annual_deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..c8534ae08 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_bury_working_age, +) + + +class bury_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Bury maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.bury.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_bury_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + protected = ( + household.max( + household.members.benunit( + "bury_council_tax_reduction_protected_group", period + ) + ) + > 0 + ) + capped = working_age & ~protected & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..0e14f64d1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class bury_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Bury CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "bury_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..d5d893d35 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_protected_group.py @@ -0,0 +1,48 @@ +from policyengine_uk.model_api import * + + +class bury_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Bury CTR Band B cap protected group" + definition_period = YEAR + reference = ( + "https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf" + ) + + def formula(benunit, period, parameters): + person = benunit.members + claimant_or_partner = person("is_adult", period) + disability_or_carer_benefit = benunit.any( + claimant_or_partner + & ( + (person("attendance_allowance", period) > 0) + | (person("dla", period) > 0) + | (person("pip_dl", period) > 0) + | (person("pip_m", period) > 0) + | (person("carers_allowance", period) > 0) + ) + ) + esa_support_component = benunit("esa_contrib", period) > 0 + armed_forces_compensation = benunit("afcs", period) > 0 + war_pension = benunit( + "bury_council_tax_reduction_war_pension_protected", period + ) + underlying_carer = benunit( + "bury_council_tax_reduction_underlying_carer_protected", period + ) + recent_bereavement = benunit( + "bury_council_tax_reduction_bereavement_protected", period + ) + lone_parent_with_child_under_5 = benunit("is_lone_parent", period) & ( + benunit("youngest_child_age", period) < 5 + ) + return benunit("benunit_contains_household_head", period) & ( + disability_or_carer_benefit + | esa_support_component + | armed_forces_compensation + | war_pension + | underlying_carer + | lone_parent_with_child_under_5 + | recent_bereavement + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_underlying_carer_protected.py b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_underlying_carer_protected.py new file mode 100644 index 000000000..5b0842428 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_underlying_carer_protected.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class bury_council_tax_reduction_underlying_carer_protected(Variable): + value_type = bool + entity = BenUnit + label = "Bury CTR claimant or partner has underlying Carer's Allowance entitlement" + definition_period = YEAR + reference = ( + "https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf" + ) diff --git a/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_war_pension_protected.py b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_war_pension_protected.py new file mode 100644 index 000000000..050ad8a21 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/bury/council_tax_reduction/bury_council_tax_reduction_war_pension_protected.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class bury_council_tax_reduction_war_pension_protected(Variable): + value_type = bool + entity = BenUnit + label = "Bury CTR claimant or partner receives a war pension protected by the local scheme" + definition_period = YEAR + reference = ( + "https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf" + ) diff --git a/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction.py new file mode 100644 index 000000000..e5fc8ddb0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction.py @@ -0,0 +1,66 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_camden_working_age, +) + + +class camden_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Camden Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.camden.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_camden_working_age(local_authority, country, has_pensioner) + person = benunit.members + claimant_or_partner = person("is_adult", period) + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + childcare_deduction = benunit( + "camden_council_tax_reduction_childcare_deduction", period + ) + weekly_gross_earnings = ( + max_(0, gross_earnings - childcare_deduction) / WEEKS_IN_YEAR + ) + income_bands = ctr.income_band + has_children = benunit("num_children", period) > 0 + protected_group = benunit( + "camden_council_tax_reduction_protected_group", period + ) + support_rate = select( + [ + protected_group, + has_children, + ], + [ + income_bands.disabled_or_carer.calc(weekly_gross_earnings), + income_bands.with_children.calc(weekly_gross_earnings), + ], + default=income_bands.no_children.calc(weekly_gross_earnings), + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "camden_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital = benunit("camden_council_tax_reduction_assessable_capital", period) + capital_eligible = capital < ctr.means_test.capital_limit + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_assessable_capital.py b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_assessable_capital.py new file mode 100644 index 000000000..9dc08f1f2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_assessable_capital.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class camden_council_tax_reduction_assessable_capital(Variable): + value_type = float + entity = BenUnit + label = "Camden CTR assessable capital" + documentation = ( + "Camden tests claimant and partner savings or assets. PolicyEngine UK " + "does not currently store those stocks separately by claimant, partner, " + "and non-dependant, so this uses household liquid savings as the " + "available CTR capital proxy." + ) + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return benunit.household("savings", period) diff --git a/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..f167492c9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,54 @@ +from policyengine_uk.model_api import * + + +class camden_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Camden CTR childcare deduction from earnings" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.camden.council_tax_reduction + childcare = ctr.childcare + person = benunit.members + claimant_or_partner = person("is_adult", period) + works_enough_hours = person("weekly_hours", period) >= childcare.work_hours + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + claimant_or_partner & works_enough_hours + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + works_enough_hours | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) | (person("dla_sc", period) > 0) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(claimant_or_partner & works_enough_hours) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = person("is_child", period) & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & person("is_disabled_for_benefits", period) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [ + eligible_children >= 2, + eligible_children == 1, + ], + [ + childcare.weekly_maximum.two_or_more_children, + childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..419779ed2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_camden_working_age, +) + + +class camden_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Camden CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.camden.council_tax_reduction + household = person.household + working_age = is_camden_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_earned_income = earned_income / WEEKS_IN_YEAR + deduction_applies = (person("age", period) > 25) & ( + weekly_earned_income > ctr.non_dep_deduction.earnings_threshold + ) + liability = household("council_tax", period) + deduction = liability * ctr.non_dep_deduction.liability_rate + return working_age * where(deduction_applies, deduction, 0.0) diff --git a/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..3aed3373d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class camden_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Camden CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "camden_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..f37137e19 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/camden/council_tax_reduction/camden_council_tax_reduction_protected_group.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class camden_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Camden CTR disabled or carer group" + definition_period = YEAR + + def formula(benunit, period, parameters): + person = benunit.members + claimant_or_partner = person("is_adult", period) + disability_or_carer_benefit = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("carers_allowance", period) > 0) + ) + return benunit.any(claimant_or_partner & disability_or_carer_benefit) diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction.py new file mode 100644 index 000000000..d4d88e6ca --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction.py @@ -0,0 +1,67 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Chelmsford Local Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.chelmsford.council_tax_reduction + local_scheme = benunit( + "chelmsford_council_tax_reduction_is_local_scheme", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "chelmsford_council_tax_reduction_applicable_income", period + ) + uc_applicable_income = benunit( + "chelmsford_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household( + "chelmsford_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "chelmsford_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_applicable_income.py new file mode 100644 index 000000000..9b76063a5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_applicable_income.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Chelmsford Local Council Tax Support applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + + def formula(benunit, period, parameters): + weekly_disregard = benunit( + "chelmsford_council_tax_reduction_earnings_disregard", period + ) + person = benunit.members + earnings = benunit.sum( + person("employment_income", period) + + person("self_employment_income", period) + ) + earnings_disregard = min_( + earnings, + (earnings > 0) * weekly_disregard * WEEKS_IN_YEAR, + ) + applicable_income = benunit("council_tax_reduction_applicable_income", period) + source_disregarded_income = benunit( + "chelmsford_council_tax_reduction_source_disregarded_income", period + ) + return max_( + 0, + applicable_income - earnings_disregard - source_disregarded_income, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..cd67b3c0a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Chelmsford LCTS claimant has a section 58.6 non-dependant deduction exemption not otherwise modeled" + documentation = "Covers source-listed claimant exemptions not otherwise represented in PolicyEngine UK, such as suspended entitlement to disability benefits." + definition_period = YEAR + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_earnings_disregard.py new file mode 100644 index 000000000..34f6628ed --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_earnings_disregard.py @@ -0,0 +1,47 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction_earnings_disregard(Variable): + value_type = float + entity = BenUnit + label = "Chelmsford Local Council Tax Support weekly earnings disregard" + definition_period = YEAR + unit = GBP + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.chelmsford.council_tax_reduction + disability_or_esa = ( + (benunit("disability_premium", period) > 0) + | (benunit("severe_disability_premium", period) > 0) + | ( + benunit( + "chelmsford_council_tax_reduction_esa_support_component", period + ) + > 0 + ) + ) + carer = benunit("carer_premium", period) > 0 + special_occupation = benunit( + "chelmsford_council_tax_reduction_source_special_earnings_disregard", + period, + ) + return select( + [ + benunit("is_lone_parent", period), + carer, + special_occupation, + disability_or_esa, + benunit("is_couple", period), + benunit("is_single_person", period), + ], + [ + ctr.earnings_disregard.lone_parent, + ctr.earnings_disregard.carer, + ctr.earnings_disregard.special_occupation, + ctr.earnings_disregard.disability_or_esa_component, + ctr.earnings_disregard.couple, + ctr.earnings_disregard.single, + ], + default=0, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_esa_support_component.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_esa_support_component.py new file mode 100644 index 000000000..7f4846248 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_esa_support_component.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction_esa_support_component(Variable): + value_type = float + entity = BenUnit + label = ( + "Chelmsford LCTS annual ESA support or work-related activity component amount" + ) + definition_period = YEAR + unit = GBP + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..3e31ad11c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,75 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class chelmsford_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Chelmsford Local Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.chelmsford.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "chelmsford_council_tax_reduction_is_local_scheme", period + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + weekly_gross_income = benunit_gross_income / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.not_remunerative_work, + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "chelmsford_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | person( + "chelmsford_council_tax_reduction_non_dep_source_exemption", period + ) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..6cbf4b786 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_chelmsford, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class chelmsford_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Chelmsford's local LCTS scheme" + definition_period = YEAR + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + uc_relevant_period_pensioner = benunit( + "chelmsford_council_tax_reduction_uc_relevant_period_pensioner", period + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_chelmsford(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..d1eb0d709 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class chelmsford_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Chelmsford maximum Council Tax liability eligible for Local Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.chelmsford.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..f81678b88 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class chelmsford_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Chelmsford Local Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "chelmsford_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..e16cc5828 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Chelmsford LCTS non-dependant has a section 58.7 deduction exemption not otherwise modeled" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK, such as normal home elsewhere, youth training, long-term patient status, or armed forces away." + definition_period = YEAR + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..614ad6951 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Chelmsford LCTS source-disregarded annual income" + documentation = "Use this input for source-listed Schedule 3 or Schedule 4 income disregards not otherwise represented in PolicyEngine UK." + definition_period = YEAR + unit = GBP + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_source_special_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_source_special_earnings_disregard.py new file mode 100644 index 000000000..906e624c8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_source_special_earnings_disregard.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction_source_special_earnings_disregard(Variable): + value_type = bool + entity = BenUnit + label = ( + "Chelmsford LCTS source-defined special occupation earnings disregard trigger" + ) + documentation = "Covers source-listed part-time firefighter, coastguard, lifeboat, and reserve forces earnings disregard triggers not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..e9041512c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,53 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Chelmsford Local Council Tax Support Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.dwp.universal_credit.means_test + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + weekly_disregard = benunit( + "chelmsford_council_tax_reduction_earnings_disregard", period + ) + earned_income = max_( + 0, + benunit("uc_earned_income", period) - weekly_disregard * WEEKS_IN_YEAR, + ) + source_disregarded_income = benunit( + "chelmsford_council_tax_reduction_source_disregarded_income", period + ) + unearned_income = max_( + 0, + benunit("uc_unearned_income", period) - source_disregarded_income, + ) + remaining_uc_award = max_( + 0, + uc_award_before_deductions + - benunit("uc_housing_costs_element", period) + - benunit("uc_disability_elements", period), + ) + uc_maximum_amount = benunit("uc_maximum_amount", period) + uc_income_reduction = min_( + uc_maximum_amount, + ctr.reduction_rate * benunit("uc_earned_income", period) + + benunit("uc_unearned_income", period), + ) + safe_uc_maximum_amount = max_(uc_maximum_amount, 1) + proportion = ( + (uc_maximum_amount > 0) * remaining_uc_award / safe_uc_maximum_amount + ) + adjusted_uc_award = max_( + 0, + remaining_uc_award - proportion * uc_income_reduction, + ) + return has_uc_award * (earned_income + unearned_income + adjusted_uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..c39abe183 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chelmsford/council_tax_reduction/chelmsford_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class chelmsford_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Chelmsford disregards UC during the pension-age relevant period" + definition_period = YEAR + reference = "https://www.chelmsford.gov.uk/media/kmml3jha/chelmsford-s13a-scheme-202526.pdf?alId=1227933" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction.py new file mode 100644 index 000000000..26e5245cf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction.py @@ -0,0 +1,46 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.cheltenham.council_tax_reduction + local_scheme = benunit( + "cheltenham_council_tax_reduction_is_local_scheme", period + ) + liability = benunit.household( + "cheltenham_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "cheltenham_council_tax_reduction_non_dep_deductions", period + ) + eligible_liability = max_(0, liability - non_dep_deductions) + support_rate = benunit("cheltenham_council_tax_reduction_support_rate", period) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * eligible_liability + * support_rate + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..9bafb7bd2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,72 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support childcare deduction from earnings" + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(benunit, period, parameters): + childcare = parameters( + period + ).gov.local_authorities.cheltenham.council_tax_reduction.childcare + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + works_enough_hours = person("weekly_hours", period) >= childcare.work_hours + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + claimant_or_partner & works_enough_hours + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + works_enough_hours | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + | person( + "cheltenham_council_tax_reduction_childcare_disabled_partner", period + ) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(claimant_or_partner & works_enough_hours) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = child_or_young_person & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & ( + person("is_disabled_for_benefits", period) + | person( + "cheltenham_council_tax_reduction_childcare_disabled_child", + period, + ) + ) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [ + eligible_children >= 2, + eligible_children == 1, + ], + [ + childcare.weekly_maximum.two_or_more_children, + childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_childcare_disabled_child.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_childcare_disabled_child.py new file mode 100644 index 000000000..c0f444f69 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_childcare_disabled_child.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_childcare_disabled_child(Variable): + value_type = bool + entity = Person + label = "Cheltenham Council Tax Support source childcare disabled child flag" + definition_period = YEAR + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_childcare_disabled_partner.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_childcare_disabled_partner.py new file mode 100644 index 000000000..b4f027cf8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_childcare_disabled_partner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_childcare_disabled_partner(Variable): + value_type = bool + entity = Person + label = "Cheltenham Council Tax Support source childcare disabled partner flag" + definition_period = YEAR + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..98d8ed755 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Cheltenham Council Tax Support claimant source non-dependant exemption" + documentation = "Source input for claimant or partner non-dependant deduction exemptions not otherwise separately exposed in PolicyEngine UK." + definition_period = YEAR + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_disabled_child_disregard.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_disabled_child_disregard.py new file mode 100644 index 000000000..7e6373753 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_disabled_child_disregard.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_disabled_child_disregard(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support disabled child income disregard" + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.cheltenham.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + disabled_child = child_or_young_person & ( + person("is_disabled_for_benefits", period) + | person("cheltenham_council_tax_reduction_source_disabled_child", period) + ) + return ( + benunit.sum(disabled_child) + * ctr.disabled_child_disregard.weekly_amount + * WEEKS_IN_YEAR + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_earnings_disregard.py new file mode 100644 index 000000000..a0e6f75b1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_earnings_disregard.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_earnings_disregard(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support weekly earnings disregard" + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.cheltenham.council_tax_reduction + return ctr.earnings_disregard.maximum diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..99f904fdb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,104 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class cheltenham_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Cheltenham Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.cheltenham.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "cheltenham_council_tax_reduction_is_local_scheme", period + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + weekly_gross_income = benunit_gross_income / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + child_or_young_person = household_person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = ( + claimant_benunit + & household_person("is_adult", period) + & ~child_or_young_person + ) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "cheltenham_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = ( + max_( + person.benunit("universal_credit_pre_benefit_cap", period), + person.benunit("universal_credit", period), + ) + > 0 + ) & ( + person( + "cheltenham_council_tax_reduction_non_dep_uc_earned_income", + period, + ) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person( + "cheltenham_council_tax_reduction_non_dep_source_exemption", period + ) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..1e3c718a1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_cheltenham, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class cheltenham_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Cheltenham's local CTR scheme" + definition_period = YEAR + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + source_local_class = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | (uc_award_before_deductions > 0) + ) + return ( + (country == Country.ENGLAND) + & is_cheltenham(local_authority) + & source_local_class + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..663bac1d7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class cheltenham_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Cheltenham maximum Council Tax liability eligible for Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.cheltenham.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..62f9cc078 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class cheltenham_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "cheltenham_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..e922f2f2f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Cheltenham Council Tax Support source non-dependant exemption" + documentation = "Source input for non-dependant exemptions not otherwise separately exposed in PolicyEngine UK, such as patients in hospital for more than 52 weeks or trainees." + definition_period = YEAR + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..13e90e712 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Cheltenham Council Tax Support non-dependant Universal Credit assessed earned income" + documentation = "Source input for person-level earned income used in the non-dependant's Universal Credit award calculation." + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(person, period, parameters): + return person("employment_income", period) + person( + "self_employment_income", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_source_disabled_child.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_source_disabled_child.py new file mode 100644 index 000000000..054edf721 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_source_disabled_child.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_source_disabled_child(Variable): + value_type = bool + entity = Person + label = "Cheltenham Council Tax Support source disabled child flag" + definition_period = YEAR + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..c96e6ea51 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support source-disregarded annual income" + documentation = "Source-listed income disregards not otherwise separately exposed in PolicyEngine UK, such as war pensions or specified compensation payments." + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..e76b0e0ae --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_support_rate.py @@ -0,0 +1,63 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support rate" + definition_period = YEAR + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.cheltenham.council_tax_reduction + weekly_income = benunit( + "cheltenham_council_tax_reduction_weekly_income", period + ) + weekly_income_for_band = weekly_income + 1e-9 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_children = benunit.sum(child_or_young_person) + is_couple = benunit("is_couple", period) + is_lone_parent = benunit("is_lone_parent", period) + bands = ctr.income_band + banded_support_rate = select( + [ + is_couple & (num_children >= 4), + is_couple & (num_children == 3), + is_couple & (num_children > 0), + is_lone_parent & (num_children >= 4), + is_lone_parent & (num_children == 3), + is_lone_parent & (num_children > 0), + is_couple, + ], + [ + bands.couple_four_or_more_children.calc(weekly_income_for_band), + bands.couple_three_children.calc(weekly_income_for_band), + bands.couple_up_to_two_children.calc(weekly_income_for_band), + bands.lone_parent_four_or_more_children.calc(weekly_income_for_band), + bands.lone_parent_three_children.calc(weekly_income_for_band), + bands.lone_parent_up_to_two_children.calc(weekly_income_for_band), + bands.couple.calc(weekly_income_for_band), + ], + default=bands.single.calc(weekly_income_for_band), + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + uc_non_earner = (uc_award_before_deductions > 0) & ( + benunit( + "cheltenham_council_tax_reduction_uc_earned_income_before_disregard", + period, + ) + <= 0 + ) + passported_band_1 = ( + (benunit("income_support", period) > 0) + | (benunit("jsa_income", period) > 0) + | (benunit("esa_income", period) > 0) + | uc_non_earner + ) + return where(passported_band_1, 1, banded_support_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_uc_earned_income_before_disregard.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_uc_earned_income_before_disregard.py new file mode 100644 index 000000000..32ebb0cfc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_uc_earned_income_before_disregard.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_uc_earned_income_before_disregard(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support Universal Credit assessed earned income before earnings disregard" + documentation = "Source input for earned income from the Universal Credit calculation before UC earnings disregards or work allowances." + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(benunit, period, parameters): + uc_gross_earned_income = add(benunit, period, ["uc_mif_capped_earned_income"]) + deductions = add(benunit, period, ["benunit_tax", "pension_contributions"]) + return max_(0, uc_gross_earned_income - deductions) diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_uc_transitional_protection.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_uc_transitional_protection.py new file mode 100644 index 000000000..e7e50b90a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_uc_transitional_protection.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_uc_transitional_protection(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support Universal Credit transitional protection" + documentation = "Source input for the Universal Credit transitional protection payment disregarded from Cheltenham Council Tax Support income." + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..d30581d28 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheltenham/council_tax_reduction/cheltenham_council_tax_reduction_weekly_income.py @@ -0,0 +1,175 @@ +from policyengine_uk.model_api import * + + +class cheltenham_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Cheltenham Council Tax Support weekly income" + definition_period = YEAR + unit = GBP + reference = "https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf" + + def formula(benunit, period, parameters): + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "cheltenham_council_tax_reduction_childcare_deduction", period + ) + non_uc_net_earnings_before_childcare = max_( + 0, gross_earnings - earnings_deductions + ) + childcare_not_used_against_earnings = max_( + 0, childcare_deduction - non_uc_net_earnings_before_childcare + ) + non_uc_net_earnings = max_( + 0, non_uc_net_earnings_before_childcare - childcare_deduction + ) + uc_earnings = benunit( + "cheltenham_council_tax_reduction_uc_earned_income_before_disregard", + period, + ) + net_earnings = where(has_uc_award, uc_earnings, non_uc_net_earnings) + has_earnings = where(has_uc_award, uc_earnings > 0, gross_earnings > 0) + earnings_disregard = ( + has_earnings + * benunit("cheltenham_council_tax_reduction_earnings_disregard", period) + * WEEKS_IN_YEAR + ) + countable_earnings = max_(0, net_earnings - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + tax_credits = benunit("tax_credits", period) + tax_credits_after_childcare = where( + tax_credits > 0, + max_(0, tax_credits - childcare_not_used_against_earnings), + tax_credits, + ) + benefit_income = tax_credits_after_childcare + add( + benunit, + period, + [ + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "jsa_contrib", + "esa_contrib", + ], + ) + non_uc_disregarded_income = add( + benunit, + period, + [ + "child_benefit", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "cheltenham_council_tax_reduction_source_disregarded_income", + ], + ) + benunit.sum(claimant_or_partner * person("maintenance_income", period)) + non_uc_income = countable_earnings + max_( + 0, + other_income + benefit_income - non_uc_disregarded_income, + ) + countable_uc_award = max_( + 0, + uc_award_before_deductions + - add( + benunit, + period, + [ + "uc_housing_costs_element", + "uc_carer_element", + "uc_LCWRA_element", + "cheltenham_council_tax_reduction_uc_transitional_protection", + ], + ), + ) + uc_disregarded_unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "maintenance_income", + ], + ) + ) + add( + benunit, + period, + [ + "child_benefit", + "housing_benefit", + "cheltenham_council_tax_reduction_source_disregarded_income", + ], + ) + uc_income = ( + countable_earnings + + max_( + 0, + benunit("uc_unearned_income", period) - uc_disregarded_unearned_income, + ) + + countable_uc_award + ) + disabled_child_disregard = benunit( + "cheltenham_council_tax_reduction_disabled_child_disregard", period + ) + annual_income = max_( + 0, where(has_uc_award, uc_income, non_uc_income) - disabled_child_disregard + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + weekly_income = where(relevant_income_based_benefit, 0, annual_income) / ( + WEEKS_IN_YEAR + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction.py new file mode 100644 index 000000000..df9909f5e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction.py @@ -0,0 +1,95 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Cheshire West and Chester Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.cheshire_west_and_chester.council_tax_reduction + local_scheme = benunit( + "cheshire_west_and_chester_council_tax_reduction_is_local_scheme", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "cheshire_west_and_chester_council_tax_reduction_applicable_income", period + ) + uc_applicable_income = benunit( + "cheshire_west_and_chester_council_tax_reduction_uc_applicable_income", + period, + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + applicable_income += benunit( + "cheshire_west_and_chester_council_tax_reduction_war_pensioner_tariff_income", + period, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + protected = benunit( + "cheshire_west_and_chester_council_tax_reduction_protected_group", period + ) + war_pensioner = benunit( + "cheshire_west_and_chester_council_tax_reduction_war_pensioner", period + ) + support_rate = select( + [war_pensioner, protected], + [ + ctr.maximum_support_rate.war_pensioner, + ctr.maximum_support_rate.protected, + ], + default=ctr.maximum_support_rate.standard, + ) + liability = benunit.household( + "cheshire_west_and_chester_council_tax_reduction_maximum_eligible_liability", + period, + ) + non_dep_deductions = benunit( + "cheshire_west_and_chester_council_tax_reduction_non_dep_deductions", + period, + ) + award = max_( + 0, + liability * support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + award = where(award < ctr.minimum_award * WEEKS_IN_YEAR, 0, award) + capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + capital_limit = where( + war_pensioner, + ctr.means_test.war_pensioner_capital_limit, + ctr.means_test.capital_limit, + ) + capital_eligible = capital <= capital_limit + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_applicable_income.py new file mode 100644 index 000000000..60f7c4b72 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_applicable_income.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Cheshire West and Chester Council Tax Reduction applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.cheshire_west_and_chester.council_tax_reduction + person = benunit.members + earnings = benunit.sum( + person("employment_income", period) + + person("self_employment_income", period) + ) + earnings_disregard = min_( + earnings, + (earnings > 0) * ctr.earnings_disregard.amount * WEEKS_IN_YEAR, + ) + source_disregarded_income = benunit( + "cheshire_west_and_chester_council_tax_reduction_source_disregarded_income", + period, + ) + return max_( + 0, + benunit("council_tax_reduction_applicable_income", period) + - earnings_disregard + - source_disregarded_income, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..b88fe5cf9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_claimant_source_non_dep_exemption( + Variable +): + value_type = bool + entity = Person + label = "Whether a Cheshire West and Chester CTR claimant has a source-listed non-dependant deduction exemption not otherwise modeled" + documentation = "Covers source-listed claimant exemptions not otherwise represented in PolicyEngine UK, such as suspended entitlement to disability benefits or devolved disability payments." + definition_period = YEAR + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..1ccce9b26 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,88 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class cheshire_west_and_chester_council_tax_reduction_individual_non_dep_deduction( + Variable +): + value_type = float + entity = Person + label = "Cheshire West and Chester Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.cheshire_west_and_chester.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "cheshire_west_and_chester_council_tax_reduction_is_local_scheme", + period, + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = max_( + 0, + add(person, period, gross_income_components) + - person( + "cheshire_west_and_chester_council_tax_reduction_non_dep_source_disregarded_income", + period, + ), + ) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + weekly_gross_income = benunit_gross_income / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.not_remunerative_work, + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "cheshire_west_and_chester_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | person( + "cheshire_west_and_chester_council_tax_reduction_non_dep_source_exemption", + period, + ) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..fef5e2bb5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,46 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_cheshire_west_and_chester, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class cheshire_west_and_chester_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether the benefit unit is under Cheshire West and Chester's local CTR scheme" + ) + definition_period = YEAR + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + relevant_period_pensioner = benunit( + "cheshire_west_and_chester_council_tax_reduction_uc_relevant_period_pensioner", + period, + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_cheshire_west_and_chester(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..21d7c5dee --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class cheshire_west_and_chester_council_tax_reduction_maximum_eligible_liability( + Variable +): + value_type = float + entity = Household + label = "Cheshire West and Chester maximum Council Tax liability eligible for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + war_pensioner = household.any( + claimant_benunit + & household_person.benunit( + "cheshire_west_and_chester_council_tax_reduction_war_pensioner", + period, + ) + ) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.cheshire_west_and_chester.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + liability = where(band_ratio > cap_band_ratio, capped_liability, council_tax) + return where(war_pensioner, council_tax, liability) diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..2b4734efd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class cheshire_west_and_chester_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Cheshire West and Chester Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "cheshire_west_and_chester_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_non_dep_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_non_dep_source_disregarded_income.py new file mode 100644 index 000000000..95505fff9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_non_dep_source_disregarded_income.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_non_dep_source_disregarded_income( + Variable +): + value_type = float + entity = Person + label = "Cheshire West and Chester CTR source-disregarded annual non-dependant gross income" + documentation = "Use this input for source-listed non-dependant gross-income disregards not otherwise represented in PolicyEngine UK, such as disability benefits listed in paragraph 33.7." + definition_period = YEAR + unit = GBP + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..aa0774f14 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_non_dep_source_exemption( + Variable +): + value_type = bool + entity = Person + label = "Whether a Cheshire West and Chester CTR non-dependant has a source-listed deduction exemption not otherwise modeled" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK, such as normal home elsewhere, youth training, long-term patient status, armed forces away, or a council tax discount-disregard status." + definition_period = YEAR + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..e563d4f39 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_protected_group.py @@ -0,0 +1,36 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Whether the Cheshire West and Chester CTR claimant is in protected Classes C or D" + definition_period = YEAR + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + claimant_or_partner = person("is_adult", period) + lcwra = benunit.any( + claimant_or_partner & person("uc_limited_capability_for_WRA", period) + ) + disabled_child = benunit.any( + ~person("is_adult", period) & person("is_disabled_for_benefits", period) + ) + disabled_child_premium = ( + disabled_child + | (benunit("CTC_disabled_child_element", period) > 0) + | (benunit("uc_disability_elements", period) > 0) + ) + source_protected = benunit( + "cheshire_west_and_chester_council_tax_reduction_source_protected_group", + period, + ) + return ( + lcwra + | (benunit("carer_premium", period) > 0) + | disabled_child_premium + | (benunit("severe_disability_premium", period) > 0) + | (benunit("enhanced_disability_premium", period) > 0) + | source_protected + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..ec6348877 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_source_disregarded_income( + Variable +): + value_type = float + entity = BenUnit + label = "Cheshire West and Chester CTR source-disregarded annual income" + documentation = "Use this input for source-listed income disregards not otherwise represented in PolicyEngine UK, such as fully disregarded war pensions or old Council Tax Benefit non-earnings disregards." + definition_period = YEAR + unit = GBP + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_source_protected_group.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_source_protected_group.py new file mode 100644 index 000000000..7b6c064ec --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_source_protected_group.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_source_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Whether the Cheshire West and Chester CTR claimant is in a source-listed protected class not otherwise modeled" + documentation = "Covers source-listed protected Class C or D triggers not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..cc37686a9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Cheshire West and Chester Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.cheshire_west_and_chester.council_tax_reduction + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + source_disregarded_income = benunit( + "cheshire_west_and_chester_council_tax_reduction_source_disregarded_income", + period, + ) + earned_income = max_( + 0, + benunit("uc_earned_income", period) + - ctr.earnings_disregard.amount * WEEKS_IN_YEAR, + ) + unearned_income = max_( + 0, + benunit("uc_unearned_income", period) - source_disregarded_income, + ) + return has_uc_award * ( + earned_income + unearned_income + benunit("universal_credit", period) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..e86ab5430 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_uc_relevant_period_pensioner( + Variable +): + value_type = bool + entity = BenUnit + label = "Whether Cheshire West and Chester disregards UC during the pension-age relevant period" + definition_period = YEAR + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_war_pensioner.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_war_pensioner.py new file mode 100644 index 000000000..dacaaf947 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_war_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class cheshire_west_and_chester_council_tax_reduction_war_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether the Cheshire West and Chester CTR claimant is a protected war pensioner" + documentation = "Set this for source-defined working-age war pensioners, who receive 100% support, no Band D cap, a 16,000 pound capital limit, and a full disregard of defined war pensions." + definition_period = YEAR + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_war_pensioner_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_war_pensioner_tariff_income.py new file mode 100644 index 000000000..fa5aa8a6d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cheshire_west_and_chester/council_tax_reduction/cheshire_west_and_chester_council_tax_reduction_war_pensioner_tariff_income.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class cheshire_west_and_chester_council_tax_reduction_war_pensioner_tariff_income( + Variable +): + value_type = float + entity = BenUnit + label = "Cheshire West and Chester Council Tax Reduction war pensioner tariff income from capital" + definition_period = YEAR + unit = GBP + reference = "https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-2.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.cheshire_west_and_chester.council_tax_reduction + war_pensioner = benunit( + "cheshire_west_and_chester_council_tax_reduction_war_pensioner", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + tariff = ctr.means_test.tariff_income + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + return war_pensioner * tariff_units * tariff.amount * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/chesterfield/council_tax_reduction/chesterfield_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/chesterfield/council_tax_reduction/chesterfield_council_tax_reduction.py new file mode 100644 index 000000000..53efbb927 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chesterfield/council_tax_reduction/chesterfield_council_tax_reduction.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_chesterfield_working_age, +) + + +class chesterfield_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Chesterfield Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.chesterfield.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_chesterfield_working_age( + local_authority, country, has_pensioner + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "chesterfield_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chesterfield/council_tax_reduction/chesterfield_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/chesterfield/council_tax_reduction/chesterfield_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..35f29764e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chesterfield/council_tax_reduction/chesterfield_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_chesterfield_working_age, +) + + +class chesterfield_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Chesterfield CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.chesterfield.council_tax_reduction + household = person.household + working_age = is_chesterfield_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/chesterfield/council_tax_reduction/chesterfield_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/chesterfield/council_tax_reduction/chesterfield_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..974912a46 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chesterfield/council_tax_reduction/chesterfield_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class chesterfield_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Chesterfield CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "chesterfield_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction.py new file mode 100644 index 000000000..f63e5ee48 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction.py @@ -0,0 +1,94 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class chichester_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Chichester Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.chichester.council_tax_reduction + local_scheme = benunit( + "chichester_council_tax_reduction_is_local_scheme", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + non_uc_applicable_amount = benunit( + "council_tax_reduction_applicable_amount", period + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("chichester_council_tax_reduction_tariff_income", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + non_uc_excess_income = max_( + 0, non_uc_applicable_income - non_uc_applicable_amount + ) + non_uc_excess_income = where( + relevant_income_based_benefit, 0, non_uc_excess_income + ) + + weekly_uc_income = ( + benunit("chichester_council_tax_reduction_uc_applicable_income", period) + / WEEKS_IN_YEAR + ) + person = benunit.members + num_children = benunit.sum( + person( + "is_child_or_qualifying_young_person_for_child_benefit", + period, + ) + ) + is_couple = benunit("is_couple", period) + weekly_uc_income_for_band = np.round(weekly_uc_income, 2) + income_bands = ctr.income_band + uc_support_rate = select( + [ + num_children >= 2, + num_children == 1, + is_couple, + ], + [ + income_bands.two_or_more_children.calc(weekly_uc_income_for_band), + income_bands.one_child.calc(weekly_uc_income_for_band), + income_bands.couple.calc(weekly_uc_income_for_band), + ], + default=income_bands.single.calc(weekly_uc_income_for_band), + ) + + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "chichester_council_tax_reduction_non_dep_deductions", period + ) + non_uc_award = max_( + 0, + liability * ctr.maximum_support_rate + - non_uc_excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + uc_award = max_(0, liability * uc_support_rate - non_dep_deductions) + award = where(has_uc_award, uc_award, non_uc_award) + + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..fce36d5e4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,72 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, + is_full_time_student_non_dep, +) + + +class chichester_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Chichester Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.chichester.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "chichester_council_tax_reduction_is_local_scheme", period + ) + ) + claimant_has_uc_award = household.any( + claimant_benunit + & ( + max_( + household_person.benunit( + "universal_credit_pre_benefit_cap", period + ), + household_person.benunit("universal_credit", period), + ) + > 0 + ) + ) + non_uc_deduction = earned_income_non_dep_deduction( + person, + period, + ctr, + local_scheme, + exempt_uc_no_earned_income=True, + exempt_income_based_benefits=True, + ) + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = (person("age", period) >= 18) & ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + ) + uc_deduction = where( + exempt, + 0.0, + in_remunerative_work * ctr.non_dep_deduction.uc_amount * WEEKS_IN_YEAR, + ) + return where(claimant_has_uc_award, uc_deduction, non_uc_deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..354e2d10a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_chichester, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class chichester_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Chichester's local CTR scheme" + definition_period = YEAR + reference = "https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + person = benunit.members + working_age_adult = person("is_adult", period) & ~person("is_SP_age", period) + mixed_age_couple = ( + benunit("is_couple", period) + & has_pensioner + & benunit.any(working_age_adult) + ) + source_working_age = ~has_pensioner | ( + mixed_age_couple & (relevant_income_based_benefit | has_uc_award) + ) + return ( + (country == Country.ENGLAND) + & is_chichester(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..d3a5062f0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class chichester_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Chichester Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "chichester_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_source_uc_income.py b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_source_uc_income.py new file mode 100644 index 000000000..b5f8a0c0f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_source_uc_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class chichester_council_tax_reduction_source_uc_income(Variable): + value_type = float + entity = BenUnit + label = "Chichester CTR source total UC assessed income" + documentation = "Use this input for Chichester's total DWP-assessed Class F income for banding when the default counted-UC-award proxy does not match the source case." + definition_period = YEAR + unit = GBP + reference = "https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..94feddf91 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_tariff_income.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class chichester_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Chichester Council Tax Reduction tariff income" + definition_period = YEAR + unit = GBP + reference = "https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf" + + def formula(benunit, period, parameters): + tariff = parameters( + period + ).gov.local_authorities.chichester.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + tariff_units = np.ceil(max_(0, capital - tariff.threshold) / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where(has_uc_award | relevant_income_based_benefit, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..afe579e6e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/chichester/council_tax_reduction/chichester_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,54 @@ +from policyengine_uk.model_api import * + + +class chichester_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Chichester Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + uc_net_earnings = max_( + 0, + benunit.sum( + claimant_or_partner * person("uc_mif_capped_earned_income", period) + ) + - earnings_deductions, + ) + counted_uc_award = max_( + 0, + uc_award_before_deductions + - benunit("uc_housing_costs_element", period) + - benunit("uc_disability_elements", period) + - benunit("uc_childcare_element", period), + ) + dwp_assessed_income = ( + uc_net_earnings + counted_uc_award + benunit("uc_unearned_income", period) + ) + source_uc_income = benunit( + "chichester_council_tax_reduction_source_uc_income", period + ) + uc_income_for_banding = where( + source_uc_income > 0, source_uc_income, dwp_assessed_income + ) + return has_uc_award * uc_income_for_banding diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction.py new file mode 100644 index 000000000..a2bba74de --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Colchester Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.colchester.council_tax_reduction + local_scheme = benunit( + "colchester_council_tax_reduction_is_local_scheme", period + ) + support_rate = benunit("colchester_council_tax_reduction_support_rate", period) + liability = benunit.household( + "colchester_council_tax_reduction_maximum_eligible_liability", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + non_uc_capital_eligible = ( + benunit("colchester_council_tax_reduction_assessable_capital", period) + < ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) < ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * liability + * support_rate + ) diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_applicant_partner_capital.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_applicant_partner_capital.py new file mode 100644 index 000000000..4a6a952e8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_applicant_partner_capital.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_applicant_partner_capital(Variable): + value_type = float + entity = BenUnit + label = "Colchester CTR applicant and partner source-reported capital" + documentation = "Use this input when a household contains non-dependants, because Colchester assesses applicant and partner capital rather than household-wide savings." + definition_period = YEAR + unit = GBP + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_assessable_capital.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_assessable_capital.py new file mode 100644 index 000000000..f8be94106 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_assessable_capital.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_assessable_capital(Variable): + value_type = float + entity = BenUnit + label = "Colchester CTR assessable applicant and partner capital" + documentation = "Colchester tests applicant and partner capital. For single-benefit-unit households, this uses household liquid savings as the available proxy; where non-dependants are present, supply the source-reported applicant/partner amount." + definition_period = YEAR + unit = GBP + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + + def formula(benunit, period, parameters): + source_capital = benunit( + "colchester_council_tax_reduction_applicant_partner_capital", period + ) + single_benunit_household = ( + benunit.household("household_num_benunits", period) == 1 + ) + return where( + (source_capital > 0) | ~single_benunit_household, + source_capital, + benunit.household("savings", period), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..117b47d42 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,80 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Colchester CTR eligible childcare deduction" + definition_period = YEAR + unit = GBP + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.colchester.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + statutory_family_leave = add( + person, + period, + [ + "statutory_sick_pay", + "statutory_maternity_pay", + "statutory_paternity_pay", + "maternity_allowance", + ], + ) + in_remunerative_work = ( + (person("weekly_hours", period) >= ctr.childcare.work_hours) + | (statutory_family_leave > 0) + ) & claimant_or_partner + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + in_remunerative_work + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + in_remunerative_work | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + | person( + "colchester_council_tax_reduction_childcare_disabled_partner", period + ) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(in_remunerative_work) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = child_or_young_person & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & ( + person("is_disabled_for_benefits", period) + | person( + "colchester_council_tax_reduction_childcare_disabled_child", + period, + ) + ) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [eligible_children >= 2, eligible_children == 1], + [ + ctr.childcare.weekly_maximum.two_or_more_children, + ctr.childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_childcare_disabled_child.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_childcare_disabled_child.py new file mode 100644 index 000000000..ba1744625 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_childcare_disabled_child.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_childcare_disabled_child(Variable): + value_type = bool + entity = Person + label = "Colchester CTR source-listed disabled child for childcare" + documentation = "Covers source disabled-child status for childcare age-limit rules not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_childcare_disabled_partner.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_childcare_disabled_partner.py new file mode 100644 index 000000000..31cc3b59a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_childcare_disabled_partner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_childcare_disabled_partner(Variable): + value_type = bool + entity = Person + label = "Colchester CTR source-listed incapacitated partner for childcare" + documentation = "Covers source incapacity and disability statuses for partner childcare eligibility not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..075f19fbf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_colchester, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class colchester_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Colchester's local CTR scheme" + definition_period = YEAR + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + uc_relevant_period_pensioner = benunit( + "colchester_council_tax_reduction_uc_relevant_period_pensioner", period + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_colchester(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..571be1f1a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class colchester_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Colchester maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.colchester.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..3c1a59f56 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_protected_group.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Colchester CTR protected group" + definition_period = YEAR + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + modeled_protected = ( + person("receives_enhanced_pip_dl", period) + | person("receives_highest_dla_sc", period) + | (person("armed_forces_independence_payment", period) > 0) + | person("is_blind", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + source_protected = benunit( + "colchester_council_tax_reduction_source_protected_group", period + ) + return ( + benunit.any(claimant_or_partner & modeled_protected) + | relevant_income_based_benefit + | source_protected + ) diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..e75c57ad7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Colchester CTR source-listed disregarded income not otherwise represented" + definition_period = YEAR + unit = GBP + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_source_disregarded_uc_elements.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_source_disregarded_uc_elements.py new file mode 100644 index 000000000..5dbc3bfdb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_source_disregarded_uc_elements.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_source_disregarded_uc_elements(Variable): + value_type = float + entity = BenUnit + label = "Colchester CTR source-listed disregarded Universal Credit elements not otherwise represented" + definition_period = YEAR + unit = GBP + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_source_protected_group.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_source_protected_group.py new file mode 100644 index 000000000..239e65f47 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_source_protected_group.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_source_protected_group(Variable): + value_type = bool + entity = BenUnit + label = ( + "Colchester CTR source-listed protected-group status not otherwise represented" + ) + definition_period = YEAR + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..2d4679f4c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_support_rate.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Colchester Council Tax Reduction support rate" + definition_period = YEAR + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.colchester.council_tax_reduction + weekly_income = benunit( + "colchester_council_tax_reduction_weekly_income", period + ) + weekly_income_for_band = weekly_income + 1e-9 + person = benunit.members + num_children = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + is_couple = benunit("is_couple", period) + bands = ctr.income_band + banded_support_rate = select( + [ + is_couple & (num_children >= 2), + is_couple & (num_children == 1), + (~is_couple) & (num_children >= 2), + (~is_couple) & (num_children == 1), + is_couple, + ], + [ + bands.couple_two_or_more_children.calc(weekly_income_for_band), + bands.couple_one_child.calc(weekly_income_for_band), + bands.single_two_or_more_children.calc(weekly_income_for_band), + bands.single_one_child.calc(weekly_income_for_band), + bands.couple.calc(weekly_income_for_band), + ], + default=bands.single.calc(weekly_income_for_band), + ) + protected = benunit("colchester_council_tax_reduction_protected_group", period) + protected_support_rate = bands.protected.calc(weekly_income_for_band) + return where(protected, protected_support_rate, banded_support_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..d251d51cc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Colchester disregards UC during the pension-age relevant period" + definition_period = YEAR + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..131139113 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/colchester/council_tax_reduction/colchester_council_tax_reduction_weekly_income.py @@ -0,0 +1,156 @@ +from policyengine_uk.model_api import * + + +class colchester_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Colchester Council Tax Reduction weekly income" + definition_period = YEAR + unit = GBP + reference = "https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.colchester.council_tax_reduction + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = benunit("universal_credit", period) > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "colchester_council_tax_reduction_childcare_deduction", period + ) + non_uc_net_earnings = max_( + 0, gross_earnings - earnings_deductions - childcare_deduction + ) + net_earnings = where( + has_uc_award, benunit("uc_earned_income", period), non_uc_net_earnings + ) + has_earnings = where(has_uc_award, net_earnings > 0, gross_earnings > 0) + earnings_disregard = where( + has_uc_award, + 0, + has_earnings * ctr.earnings_disregard.amount * WEEKS_IN_YEAR, + ) + countable_earnings = max_( + 0, + net_earnings - earnings_disregard, + ) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "tax_credits", + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "jsa_contrib", + "esa_contrib", + ], + ) + non_uc_disregarded_income = add( + benunit, + period, + [ + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "colchester_council_tax_reduction_source_disregarded_income", + ], + ) + non_uc_income = countable_earnings + max_( + 0, other_income + benefit_income - non_uc_disregarded_income + ) + countable_uc_award = max_( + 0, + uc_award_before_deductions + - add( + benunit, + period, + [ + "uc_housing_costs_element", + "uc_disability_elements", + "uc_carer_element", + "uc_childcare_element", + "colchester_council_tax_reduction_source_disregarded_uc_elements", + ], + ), + ) + uc_disregarded_unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + ], + ) + ) + add( + benunit, + period, + ["colchester_council_tax_reduction_source_disregarded_income"], + ) + uc_income = ( + countable_earnings + + max_( + 0, + benunit("uc_unearned_income", period) - uc_disregarded_unearned_income, + ) + + countable_uc_award + ) + annual_income = where(has_uc_award, uc_income, non_uc_income) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + weekly_income = where(relevant_income_based_benefit, 0, annual_income) / ( + WEEKS_IN_YEAR + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction.py new file mode 100644 index 000000000..ad5c8eb79 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction.py @@ -0,0 +1,60 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.cotswold.council_tax_reduction + local_scheme = benunit("cotswold_council_tax_reduction_is_local_scheme", period) + liability = benunit.household( + "cotswold_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "cotswold_council_tax_reduction_non_dep_deductions", period + ) + eligible_liability = max_(0, liability - non_dep_deductions) + support_rate = benunit("cotswold_council_tax_reduction_support_rate", period) + banded_award = eligible_liability * support_rate + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + annual_income = ( + benunit("cotswold_council_tax_reduction_weekly_income", period) + * WEEKS_IN_YEAR + ) + excess_income = max_(0, annual_income - applicable_amount) + protected_award = max_( + 0, + eligible_liability - excess_income * ctr.means_test.withdrawal_rate, + ) + protected = benunit("cotswold_council_tax_reduction_protected_group", period) + award = where(protected, protected_award, banded_award) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..71679bf34 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,72 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support childcare deduction from earnings" + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + childcare = parameters( + period + ).gov.local_authorities.cotswold.council_tax_reduction.childcare + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + works_enough_hours = person("weekly_hours", period) >= childcare.work_hours + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + claimant_or_partner & works_enough_hours + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + works_enough_hours | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + | person( + "cotswold_council_tax_reduction_childcare_disabled_partner", period + ) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(claimant_or_partner & works_enough_hours) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = child_or_young_person & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & ( + person("is_disabled_for_benefits", period) + | person( + "cotswold_council_tax_reduction_childcare_disabled_child", + period, + ) + ) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [ + eligible_children >= 2, + eligible_children == 1, + ], + [ + childcare.weekly_maximum.two_or_more_children, + childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_childcare_disabled_child.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_childcare_disabled_child.py new file mode 100644 index 000000000..8cef0e248 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_childcare_disabled_child.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_childcare_disabled_child(Variable): + value_type = bool + entity = Person + label = "Cotswold Council Tax Support source childcare disabled child flag" + definition_period = YEAR + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_childcare_disabled_partner.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_childcare_disabled_partner.py new file mode 100644 index 000000000..744212244 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_childcare_disabled_partner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_childcare_disabled_partner(Variable): + value_type = bool + entity = Person + label = "Cotswold Council Tax Support source childcare disabled partner flag" + definition_period = YEAR + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..ce0685a87 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Cotswold Council Tax Support claimant source non-dependant exemption" + documentation = "Source input for claimant or partner non-dependant deduction exemptions not otherwise separately exposed in PolicyEngine UK." + definition_period = YEAR + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_earnings_disregard.py new file mode 100644 index 000000000..9b056de89 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_earnings_disregard.py @@ -0,0 +1,55 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_earnings_disregard(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support weekly earnings disregard" + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.cotswold.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + carer_or_disability = ( + benunit.any(claimant_or_partner & (person("carers_allowance", period) > 0)) + | (benunit("disability_premium", period) > 0) + | (benunit("severe_disability_premium", period) > 0) + | (benunit("enhanced_disability_premium", period) > 0) + | benunit.any( + claimant_or_partner + & ( + (person("pip", period) > 0) + | (person("dla", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + ) + ) + ) + base = select( + [ + benunit("is_lone_parent", period), + carer_or_disability, + benunit("is_couple", period), + benunit("is_single_person", period), + ], + [ + ctr.earnings_disregard.lone_parent, + ctr.earnings_disregard.carer_or_disability, + ctr.earnings_disregard.couple, + ctr.earnings_disregard.single, + ], + default=0, + ) + additional = ( + benunit( + "cotswold_council_tax_reduction_source_additional_earnings_disregard", + period, + ) + * ctr.earnings_disregard.additional + ) + return base + additional diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..f4d2a0187 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,102 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class cotswold_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Cotswold Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.cotswold.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "cotswold_council_tax_reduction_is_local_scheme", period + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + weekly_gross_income = benunit_gross_income / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + child_or_young_person = household_person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = ( + claimant_benunit + & household_person("is_adult", period) + & ~child_or_young_person + ) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "cotswold_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = ( + max_( + person.benunit("universal_credit_pre_benefit_cap", period), + person.benunit("universal_credit", period), + ) + > 0 + ) & ( + person( + "cotswold_council_tax_reduction_non_dep_uc_earned_income", + period, + ) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person("cotswold_council_tax_reduction_non_dep_source_exemption", period) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..942000d5b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_cotswold, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class cotswold_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Cotswold's local CTR scheme" + definition_period = YEAR + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + source_local_class = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | (uc_award_before_deductions > 0) + ) + return ( + (country == Country.ENGLAND) + & is_cotswold(local_authority) + & source_local_class + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..bcbb3f155 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class cotswold_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Cotswold maximum Council Tax liability eligible for Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.cotswold.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..0ae3f0912 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class cotswold_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "cotswold_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..cacf7eae0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Cotswold Council Tax Support source non-dependant exemption" + documentation = "Source input for non-dependant exemptions not otherwise separately exposed in PolicyEngine UK, such as patients in hospital for more than 52 weeks or trainees." + definition_period = YEAR + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..b60e848b4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Cotswold Council Tax Support non-dependant Universal Credit assessed earned income" + documentation = "Source input for person-level earned income used in the non-dependant's Universal Credit award calculation." + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(person, period, parameters): + return person("employment_income", period) + person( + "self_employment_income", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..0cd4fc8ad --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_protected_group.py @@ -0,0 +1,40 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Cotswold Council Tax Support protected group" + definition_period = YEAR + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + disability_premium = ( + benunit("disability_premium", period) + + benunit("severe_disability_premium", period) + + benunit("enhanced_disability_premium", period) + ) + esa_any_rate = (benunit("esa_income", period) > 0) | benunit.any( + claimant_or_partner & (person("esa_contrib", period) > 0) + ) + adult_protected_benefit = benunit.any( + claimant_or_partner + & ( + (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + ) + ) + source_protected = benunit( + "cotswold_council_tax_reduction_source_protected_group", period + ) + return ( + (disability_premium > 0) + | esa_any_rate + | adult_protected_benefit + | source_protected + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_source_additional_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_source_additional_earnings_disregard.py new file mode 100644 index 000000000..521284446 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_source_additional_earnings_disregard.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_source_additional_earnings_disregard(Variable): + value_type = bool + entity = BenUnit + label = "Cotswold Council Tax Support source additional earnings disregard flag" + documentation = "Source input for the Schedule 1 additional earnings disregard conditions that are not otherwise separately exposed in PolicyEngine UK." + definition_period = YEAR + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..5f034ed43 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support source-disregarded annual income" + documentation = "Source-listed income disregards not otherwise separately exposed in PolicyEngine UK, such as war pensions or specified compensation payments." + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_source_protected_group.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_source_protected_group.py new file mode 100644 index 000000000..acc772414 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_source_protected_group.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_source_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Cotswold Council Tax Support source protected group flag" + documentation = "Source input for protected-group conditions not otherwise separately exposed in PolicyEngine UK, such as disabled child premiums or Schedule 2(15) pensions." + definition_period = YEAR + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..e929aec83 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_support_rate.py @@ -0,0 +1,51 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support rate" + definition_period = YEAR + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.cotswold.council_tax_reduction + weekly_income = benunit("cotswold_council_tax_reduction_weekly_income", period) + weekly_income_for_band = weekly_income + 1e-9 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_children = benunit.sum(child_or_young_person) + is_couple = benunit("is_couple", period) + is_lone_parent = benunit("is_lone_parent", period) + bands = ctr.income_band + banded_support_rate = select( + [ + is_couple & (num_children >= 4), + is_couple & (num_children == 3), + is_couple & (num_children == 2), + is_couple & (num_children == 1), + is_lone_parent & (num_children >= 4), + is_lone_parent & (num_children == 3), + is_lone_parent & (num_children == 2), + is_lone_parent & (num_children == 1), + is_couple, + ], + [ + bands.couple_four_or_more_children.calc(weekly_income_for_band), + bands.couple_three_children.calc(weekly_income_for_band), + bands.couple_two_children.calc(weekly_income_for_band), + bands.couple_one_child.calc(weekly_income_for_band), + bands.lone_parent_four_or_more_children.calc(weekly_income_for_band), + bands.lone_parent_three_children.calc(weekly_income_for_band), + bands.lone_parent_two_children.calc(weekly_income_for_band), + bands.lone_parent_one_child.calc(weekly_income_for_band), + bands.couple.calc(weekly_income_for_band), + ], + default=bands.single.calc(weekly_income_for_band), + ) + passported_band_1 = (benunit("income_support", period) > 0) | ( + benunit("jsa_income", period) > 0 + ) + return where(passported_band_1, 1, banded_support_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..0f4d41a62 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_tariff_income.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class cotswold_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support tariff income from capital" + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + tariff = parameters( + period + ).gov.local_authorities.cotswold.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_uc_earned_income_before_disregard.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_uc_earned_income_before_disregard.py new file mode 100644 index 000000000..1507254be --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_uc_earned_income_before_disregard.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_uc_earned_income_before_disregard(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support Universal Credit assessed earned income before earnings disregard" + documentation = "Source input for earned income from the Universal Credit calculation before UC earnings disregards or work allowances." + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + return benunit("uc_earned_income", period) diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_uc_transitional_protection.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_uc_transitional_protection.py new file mode 100644 index 000000000..8b1c064fa --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_uc_transitional_protection.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_uc_transitional_protection(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support Universal Credit transitional protection" + documentation = "Source input for the Universal Credit transitional protection payment disregarded from Cotswold Council Tax Support income." + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..ce72fda1b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cotswold/council_tax_reduction/cotswold_council_tax_reduction_weekly_income.py @@ -0,0 +1,158 @@ +from policyengine_uk.model_api import * + + +class cotswold_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Cotswold Council Tax Support weekly income" + definition_period = YEAR + unit = GBP + reference = "https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "cotswold_council_tax_reduction_childcare_deduction", period + ) + non_uc_net_earnings = max_( + 0, gross_earnings - earnings_deductions - childcare_deduction + ) + uc_earnings = benunit( + "cotswold_council_tax_reduction_uc_earned_income_before_disregard", + period, + ) + net_earnings = where(has_uc_award, uc_earnings, non_uc_net_earnings) + has_earnings = where(has_uc_award, uc_earnings > 0, gross_earnings > 0) + earnings_disregard = ( + has_earnings + * benunit("cotswold_council_tax_reduction_earnings_disregard", period) + * WEEKS_IN_YEAR + ) + countable_earnings = max_(0, net_earnings - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "tax_credits", + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "jsa_contrib", + "esa_contrib", + ], + ) + non_uc_disregarded_income = add( + benunit, + period, + [ + "child_benefit", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "cotswold_council_tax_reduction_source_disregarded_income", + ], + ) + benunit.sum(claimant_or_partner * person("maintenance_income", period)) + tariff_income = benunit("cotswold_council_tax_reduction_tariff_income", period) + non_uc_income = countable_earnings + max_( + 0, + other_income + benefit_income + tariff_income - non_uc_disregarded_income, + ) + countable_uc_award = max_( + 0, + uc_award_before_deductions + - add( + benunit, + period, + [ + "uc_housing_costs_element", + "cotswold_council_tax_reduction_uc_transitional_protection", + ], + ), + ) + uc_disregarded_unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "maintenance_income", + ], + ) + ) + add( + benunit, + period, + [ + "child_benefit", + "housing_benefit", + "cotswold_council_tax_reduction_source_disregarded_income", + ], + ) + uc_income = ( + countable_earnings + + max_( + 0, + benunit("uc_unearned_income", period) - uc_disregarded_unearned_income, + ) + + countable_uc_award + ) + annual_income = where(has_uc_award, uc_income, non_uc_income) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + weekly_income = where(relevant_income_based_benefit, 0, annual_income) / ( + WEEKS_IN_YEAR + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/README.md b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/README.md new file mode 100644 index 000000000..afcab35e3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/README.md @@ -0,0 +1,432 @@ +# Council Tax Reduction + +This implementation currently simulates: + +- The statutory CTR scheme for pensioner households in England. +- The national CTR scheme in Wales. +- The national CTR scheme in Scotland. +- Working-age local schemes for Adur, Arun, Ashford, Barking and Dagenham, Barnet, Basingstoke and Deane, Bath and North East Somerset, Bassetlaw, Bolton, Braintree, Breckland, Brent, Brentwood, Bromley, Bristol, Broadland, Bury, Camden, Chelmsford, Cheltenham, Cheshire West and Chester, Chichester, Chesterfield, Colchester, Cotswold, Coventry, Crawley, Croydon, Cumberland, Darlington, Dartford, Derby, Dudley, Ealing, East Cambridgeshire, East Hampshire, East Hertfordshire, East Suffolk, Enfield, Fenland, Forest of Dean, Gateshead, Gloucester, Greenwich, Haringey, Harrow, Hart, Hartlepool, Havering, Herefordshire, Hertsmere, Hackney, Hammersmith and Fulham, Hillingdon, Hounslow, Islington, King's Lynn and West Norfolk, Kingston upon Hull, Kingston upon Thames, Lambeth, Lancaster, Lewisham, Maldon, Merton, Newham, North Norfolk, North Yorkshire, Norwich, Oldham, Oxford, Redbridge, Rushmoor, Sefton, Somerset, South Derbyshire, South Gloucestershire, South Norfolk, Southend-on-Sea, Southwark, St Albans, St Helens, Stevenage, Stockport, Stroud, Tameside, Tendring, Tewkesbury, Thurrock, Wakefield, Warrington, West Berkshire, West Suffolk, Westmorland and Furness, Westminster, and Worthing. + +For unsupported English working-age authorities, the model continues to use reported `council_tax_benefit` values in dataset mode rather than inventing scheme rules. + +The top-level `simulated_council_tax_reduction_benunit` variable aggregates implemented jurisdiction-specific CTR variables. Working-age local authority rules live under `policyengine_uk/variables/gov/local_authorities//council_tax_reduction/`, matching the parameter tree and keeping each council's policy in its own jurisdiction folder. + +The current implementation does not yet model: + +- Additional authority-specific income-banded and discount-grid English schemes not yet implemented in this PR. +- Alternative maximum / second adult rebate cases. +- Universal Credit-specific CTR adjustments beyond the implemented local earnings-band paths and standard income treatment used here. +- National/statutory non-dependant couple aggregation beyond the local working-age scheme helper. +- Non-dependant deduction apportionment across multiple jointly liable Council Tax payers. + +For batched implementation status and next candidates, see `scheme_work_queue.md`. For a drop-in autonomous handoff prompt, see `agent_handoff.md`. + +There is also a requests-based entitledto comparison harness at `scripts/entitledto_ctr_compare.py`. It replays the calculator from a saved browser storage state and currently covers three single-adult claimant variants: + +- `single_jsa` +- `single_jsa_pip_standard` +- `single_pension_credit` + +It does not yet cover couples, children, or other-adult/non-dependant household shapes. entitledto's session handling is also inconsistent enough that rerunning with a fresh storage state is sometimes necessary, and fresh anonymous calculator starts can hit entitledto's day limit. A typical single-scenario run is: + +`uv run --with requests --with beautifulsoup4 python scripts/entitledto_ctr_compare.py output/playwright/entitledto-live-state.json --postcode SG13 8EQ --band D --council-tax 1800 --scenario single_jsa` + +There is also a requests-based Turn2us probe at `scripts/turn2us_ctr_compare.py`. It currently replays the public Turn2us calculator for a single working-age JSA claimant and records the benefits that appear on the final results page for the supplied postcode. A typical multi-authority run is: + +`uv run --with requests python scripts/turn2us_ctr_compare.py "SG13 8EQ" "WA1 1UH" "DY1 1HF" "GL5 4UB"` + +## Validation notes + +Spot checks against public calculators and scheme sources currently show: + +- Stroud (`GL5 4UB`, area `Stroud`, band `D`, single working-age owner-occupier, no children, no savings, income-based JSA): entitledto returns full Council Tax Support on an annual liability of `GBP 1,866.47`. PolicyEngine UK returns `council_tax_reduction = GBP 1,866.47`. +- Dudley (`DY1 1HF`, band `C`, single working-age owner-occupier, no children, no savings, income-based JSA): entitledto returns `GBP 15.64` per week of Council Tax Support, leaving `GBP 10.43` per week to pay. PolicyEngine UK returns `council_tax_reduction = GBP 543.62` per year and `council_tax_less_benefit = GBP 815.43` per year, matching Dudley Council's published 2025/26 scheme text and scheme PDF rather than the entitledto output. +- East Hertfordshire (`SG13 8EQ`, band `D`, single working-age owner-occupier, no children, no savings, income-based JSA, annual liability `GBP 1,800`): entitledto returns `GBP 31.59` per week of Council Tax Support and `GBP 2.93` per week left to pay. PolicyEngine UK applies the same `91.5%` maximum award rule, giving `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153` per year. +- East Hertfordshire (`SG13 8EQ`, band `D`, single working-age lone parent, one child aged `5`, no savings, income-based JSA, annual liability `GBP 1,800`): a headed browser run through entitledto returns total benefits of `GBP 367.64` per week, made up of `GBP 310.00` income-based Jobseeker's Allowance, `GBP 31.59` Council Tax Support, and `GBP 26.05` Child Benefit. The calculator shows a weekly Council Tax bill of `GBP 34.52` reduced to `GBP 2.93`. PolicyEngine UK now keeps this household on the East Herts class D maximum award, returning `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153`. +- East Hertfordshire (`SG13 8EQ`, band `D`, two working-age adults, no children, no savings, income-based JSA, annual liability `GBP 1,800`): a headed browser run through entitledto returns total benefits of `GBP 237.89` per week, made up of `GBP 206.30` income-based Jobseeker's Allowance and `GBP 31.59` Council Tax Support. The calculator again shows a weekly Council Tax bill of `GBP 34.52` reduced to `GBP 2.93`. PolicyEngine UK returns the same annual CTR position, `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153`. Because this check reused an existing entitledto calculation ID to get around the anonymous daily cap, the Council Tax page initially carried forward a stale `25%` single-adult discount and had to be corrected back to `none` before the result was trusted. +- East Cambridgeshire (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says maximum Council Tax Reduction is `91.5%` of eligible Council Tax after discounts and non-dependant deductions, with the standard `2 6/7%` daily excess-income percentage and the ARP flat working-age non-dependant deduction. PolicyEngine UK returns `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153` before non-dependant deductions. +- East Suffolk (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says maximum Council Tax Reduction is `91.5%` of eligible Council Tax after discounts and non-dependant deductions, with the `2 6/7%` daily excess-income percentage, equivalent to a `20%` weekly taper. Anglia Revenues Partnership says working-age CTR applicants need less than `GBP 10,000` in capital and publishes a flat `GBP 8.34` working-age non-dependant deduction for 2026/27. PolicyEngine UK returns `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153` before non-dependant deductions. +- Breckland (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says maximum Council Tax Reduction is `91.5%` of eligible Council Tax after discounts and non-dependant deductions, with the standard `2 6/7%` daily excess-income percentage and the ARP flat working-age non-dependant deduction. PolicyEngine UK returns `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153` before non-dependant deductions. +- Brent (working-age, band `D`, annual liability `GBP 1,800`, no children, savings below `GBP 6,000`): the council's current Council Tax Support page uses weekly claimant-and-partner earnings bands with a `65%` maximum ordinary award, excludes DWP and HMRC benefits from the band income, and deducts `GBP 8` or `GBP 20` per week for each non-dependant depending on work status. PolicyEngine UK returns `council_tax_reduction = GBP 1,170` for a no-earnings claimant, `GBP 540` at `GBP 120` weekly earnings, and `GBP 130` after a `GBP 20` weekly working non-dependant deduction. +- Bromley (working-age, band `D`, annual liability `GBP 2,140.04`, no children, no savings): the council's 2026/27 papers continue the existing working-age scheme with `50%` maximum support, a Band `D` cap, a `20%` taper, tariff income above `GBP 6,000`, and a `GBP 16,000` capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,070.02` for a no-income claimant, the same award on a Band `H` liability of `GBP 4,280.08`, and `GBP 539.62` after a `GBP 10.20` weekly non-dependant deduction. +- Bristol (working-age, band `D`, annual liability `GBP 2,713.68`, no children, no savings): the council's 2026/27 scheme gives full support where income does not exceed the living allowance, applies a `20%` taper, has a `GBP 16,000` capital limit, tariff income above `GBP 6,000`, a UC assessed-income/capital branch, and non-dependant deductions keyed to single non-dependant earnings or couple gross income. PolicyEngine UK returns `council_tax_reduction = GBP 2,713.68` for a no-excess-income claimant and `GBP 2,162.48` after a `GBP 10.60` weekly non-dependant deduction. Source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK can be supplied with Bristol-specific source-exemption inputs. +- Croydon (working-age, band `C`, annual liability `GBP 2,311.03`, no children, no savings): the council's live 2026 pages use weekly household-income bands, with `75%` ordinary support in the lowest band, `80%` for lone parents with a child under 5, `100%` for disabled non-working claimants, a Band `D` cap except for disabled non-working households, and a strict `GBP 8,000` ordinary capital cutoff. PolicyEngine UK returns `council_tax_reduction = GBP 1,733.27` for an ordinary no-income Band `C` claimant, `GBP 1,949.93` for an ordinary Band `E` claimant after the Band `D` cap, and full support on Band `E` for a disabled non-working claimant. Croydon's 2026/27 decision papers say the scheme continues unchanged, but the detailed booklet linked from the live page is older; the implementation follows the current live table where the live examples page is inconsistent with that table. +- Cumberland (working-age, band `D`, annual liability `GBP 2,444.72`, no children, no savings): the council's 2026/27 scheme gives full support where income does not exceed the applicable amount, applies a `20%` taper, has a `GBP 16,000` capital limit, tariff income above `GBP 6,000` by complete `GBP 250` blocks, a UC assessed-income/capital branch, and remunerative-work non-dependant deductions using a 16-hour threshold. PolicyEngine UK returns `council_tax_reduction = GBP 2,444.72` for a no-excess-income claimant, `GBP 1,893.52` after a `GBP 10.60` weekly remunerative-work non-dependant deduction, and `GBP 2,174.32` when the same earnings are below the 16-hour remunerative-work threshold. Cumberland's Class F second-adult branch falls under the current alternative maximum / second adult rebate limitation. +- Coventry (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme uses weekly excess-income bands with direct `80%`, `65%`, `40%`, `20%`, and zero support rates, a `GBP 16,000` capital limit, UC-assessed income and capital for UC cases, and gross-income non-dependant deductions with a UC no-earned-income exemption. PolicyEngine UK returns `council_tax_reduction = GBP 1,440` below `GBP 15` weekly excess income, `GBP 1,170` at `GBP 15` weekly excess income, zero at `GBP 80` weekly excess income, and `GBP 1,169.60` after one non-UC non-working non-dependant deduction. It applies the gross-income non-dependant bands without a 16-hour gate, and pension-age UC, pension-age income-based benefit, and mixed-age working-age-applicant cases remain in Coventry's local scheme without double-counting the national pensioner CTR path. +- Cotswold (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme uses household-type weekly net-income bands with `100%`, `80%`, `60%`, `40%`, `20%`, and zero support rates, caps eligible liability at Band `E`, excludes capital above `GBP 10,000`, adds part-block tariff income above `GBP 6,000`, and gives protected groups a CTB-style `20%` taper instead of the band table. UC cases use UC-assessed income before earnings disregards plus the adjusted UC award and UC-assessed capital. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` at `GBP 154.48` weekly single income, `GBP 1,440` at `GBP 154.49`, `GBP 2,200` for a Band `H` liability capped to Band `E`, and `GBP 1,529.60` after one non-working non-dependant deduction. Pension-age UC and mixed-age working-age-applicant cases remain in the local scheme without double-counting the national pensioner CTR path. +- Bassetlaw (working-age/local scheme, band `C`, annual liability `GBP 1,600`, no children, no savings): the council's 2026/27 working-age scheme uses weekly net-income bands with `95%` support for SDP/transitional-SDP cases, `88%` for passported or low-income cases, then `65%`, `45%`, `25%`, and zero support rates, caps Band `D` and higher liability at Band `C`, excludes capital above `GBP 16,000`, adds part-block tariff income above `GBP 6,000`, and deducts flat non-dependant amounts before applying the support percentage. UC cases use UC-assessed income and capital, and pension-age UC/income-based benefit cases remain in the local scheme unless the source-specific UC relevant-period or regulation-60A flags keep the pensioner scheme. PolicyEngine UK returns `council_tax_reduction = GBP 1,408` at `GBP 103.79` weekly income, `GBP 1,040` at `GBP 103.80`, zero at `GBP 421.75`, and `GBP 904.80` after one non-working non-dependant deduction. +- Ashford (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's adopted 2026/27 scheme uses single/couple weekly net-income bands with `90%`, `75%`, `60%`, `45%`, `30%`, and zero support rates, caps eligible liability at Band `D`, excludes capital above `GBP 10,000`, adds part-block tariff income above `GBP 6,000`, applies a `GBP 25` weekly earnings disregard and a `GBP 40` weekly disability/carer income disregard, disregards listed UC elements from the UC award, and deducts `GBP 10` weekly per non-dependant from the final award. Pension-age UC/income-based benefit cases remain in the local scheme unless a source-specific relevant-period or regulation-60A flag keeps the pensioner scheme. PolicyEngine UK returns `council_tax_reduction = GBP 1,620` for a no-income single claimant, `GBP 1,350` at the adopted PDF's `GBP 127.12` single and `GBP 168.76` couple Band 2 boundaries, and `GBP 1,100` after one non-dependant deduction. The council's live page prints different penny thresholds from the adopted PDF, especially for couple bands; the implementation follows the adopted PDF and tests that boundary. +- Arun (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's live 2026 page uses weekly net-income bands with `100%`, `70%`, `50%`, `30%`, `10%`, and zero support rates, has a `GBP 6,000` capital limit with income-based benefit capital disregards, applies a `GBP 1` weekly minimum award, deducts `GBP 5` weekly non-dependants before applying the support rate, and uses UC award income less source-listed housing, carer, LCW/LCWRA elements with UC-assessed capital. The model includes Schedule 5's `GBP 17.10` worker addition where hours/family/disability conditions are observable, plus source inputs for WTC-specific worker-addition cases, pension-age UC relevant-period/regulation 60A carve-outs, Guarantee Credit non-dependant status, and broader childcare incapacity/disabled-child facts not otherwise exposed. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` for a no-income claimant, `GBP 1,260` at `GBP 224` weekly income, and `GBP 1,078` after one non-dependant deduction. The linked 2026/27 PDF's Schedule 3 still shows older-looking thresholds and a `90%` top band, while the live page, February 2026 news post, and PDF section 23 support the current `100%` maximum and `GBP 1` minimum award; this implementation follows the live 2026/27 table for band thresholds and rates and the PDF for mechanics. +- Dartford (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme uses weekly net-income bands by household type with `80%`, `60%`, `40%`, `20%`, and zero support rates, excludes capital above `GBP 6,000`, applies a `GBP 1` weekly minimum award and a `GBP 25` weekly earnings disregard for non-UC claimants, disregards listed disability, carer, child, maintenance, housing benefit, and source-listed war pension or compensation income via a local source-disregarded-income input, and uses UC-assessed income/capital where the applicant or partner has a UC award. PolicyEngine UK returns `council_tax_reduction = GBP 1,440` for a no-income single claimant, `GBP 1,080` at the `GBP 104` single Band 2 boundary, and still `GBP 1,440` with a working non-dependant because the 2026/27 scheme text does not provide a working-age non-dependant deduction schedule. The live page explicitly limits the `GBP 25` earnings disregard to non-UC claimants while the PDF paragraph is broader; this implementation follows the live page's UC qualifier. +- Derby (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme is a Default Scheme/Housing Benefit style means test with `80%` maximum support, a Band `B` eligible-liability cap, `GBP 6,000` capital limit, `20%` taper, and `GBP 4` weekly minimum award. It aligns non-dependant deductions to Housing Benefit rates but drops the two highest Housing Benefit rates and substitutes a `GBP 4` weekly deduction for working non-dependants below `GBP 100` gross weekly income and for non-working passported or UC non-dependants. PolicyEngine UK returns `council_tax_reduction = GBP 1,120` for a no-excess-income Band `D` claimant on `GBP 1,800` liability, `GBP 1,016` with `GBP 520` annual excess income, and `GBP 912` after one non-dependant earning `GBP 99` per week. The live Derby Council Tax Support page still links to the older `2025/26` scheme; this implementation follows the current `2026/27` PDF. +- South Derbyshire (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme uses weekly excess-income bands with `100%` support up to `GBP 5` weekly excess income, then `90%`, `78%`, `66%`, `54%`, `42%`, `30%`, `18%`, `10%`, and zero support, has a `GBP 16,000` capital limit, adds part-block tariff income above `GBP 6,000`, applies a `GBP 1` weekly minimum award, and deducts flat `GBP 6.25` weekly working-age non-dependants before applying the support rate. UC cases use `uc_maximum_amount`, DWP-assessed income plus the pre-deduction UC award, and UC-assessed capital. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` for a no-excess-income claimant, `GBP 1,620` at `GBP 5.01` weekly excess income, `GBP 1,327.50` after one non-dependant at that same excess-income band, and zero above `GBP 140` weekly excess income. A local applicant/partner capital source input is available where household savings contains child, young-person, or non-dependant capital that the scheme would ignore. +- South Gloucestershire (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's current page says the working-age scheme changed from `1 April 2025` and links formal 2025 rules. It uses weekly applicant-and-partner earned-income bands with `77%` support for no earned income, then `60%`, `40%`, `20%`, `15%`, `10%`, and zero support above `GBP 230` weekly earned income, excludes capital above `GBP 6,000` under the formal scheme wording, disregards non-earned income, may use UC-assessed earnings/capital, and deducts `GBP 3.50` or `GBP 14` weekly non-dependants after applying the support percentage with one deduction for a non-dependant couple. PolicyEngine UK returns `council_tax_reduction = GBP 1,386` for a no-earnings claimant, `GBP 720` at `GBP 50.01` weekly earned income, and `GBP 658` after one high-rate non-dependant deduction. The live page summary says savings of `GBP 6,000 or more` are excluded, while the formal rules exclude capital that exceeds `GBP 6,000`; the implementation follows the formal scheme boundary and tests `GBP 6,000.01`. +- Cheltenham (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's adopted 2026/27 Appendix 9 uses household-type weekly net-income bands with `100%`, `80%`, `60%`, `40%`, `20%`, and zero support rates, caps eligible liability at Band `E`, excludes capital above `GBP 6,000`, applies no tariff income, uses a `GBP 10` weekly earnings disregard, and applies remunerative-work gross-income non-dependant deductions before the band percentage. UC cases use UC-assessed income before earnings disregards plus the adjusted UC award and UC-assessed capital, and pension-age UC/income-based benefit cases remain in the local scheme. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` at `GBP 115` weekly single income, `GBP 1,440` at `GBP 115.01`, `GBP 2,200` for a Band `H` liability capped to Band `E`, and `GBP 1,540` after one non-working non-dependant deduction. The adopted and summary tables print a gap for lone parents with three children from `GBP 460.01` to `GBP 480.00`; the implementation follows the published ranges and tests that gap. +- Herefordshire (working-age/local scheme, band `D`, annual liability `GBP 2,500`, no children, no savings): the council's 2026/27 report approves the existing scheme parameters, which give full support where income does not exceed the applicable amount, apply a `20%` taper, use a strict `GBP 6,000` working-age capital limit with no tariff income, use UC-assessed income/capital for UC cases, and apply remunerative-work non-dependant deductions using a 16-hour threshold. Pension-age applicants remain in the local scheme where the applicant or partner is on UC or a relevant income-based benefit. PolicyEngine UK returns `council_tax_reduction = GBP 2,500` for a no-excess-income claimant, `GBP 1,977.40` after a `GBP 10.05` weekly non-dependant deduction, `GBP 2,245.20` when the same earnings are below the 16-hour remunerative-work threshold, and `GBP 2,500` for a pension-age UC claimant without double-counting the national pensioner CTR path. +- Westmorland and Furness (working-age/local scheme, band `D`, annual liability `GBP 2,500`, no children, no savings): the council's 2026/27 scheme gives full support where income does not exceed the applicable amount, applies a `20%` taper, has a `GBP 16,000` capital limit with source-disregarded capital for income-based benefit cases, tariff income above `GBP 6,000` including any part `GBP 250` block, a UC assessed-income/capital branch, and remunerative-work non-dependant deductions using a 16-hour threshold. Pension-age applicants remain in the local scheme where the applicant or partner is on UC or a relevant income-based benefit, and UC non-dependant couples are not collapsed to one deduction. PolicyEngine UK returns `council_tax_reduction = GBP 2,500` for a no-excess-income claimant, `GBP 2,489.60` when savings are `GBP 6,000.01`, and `GBP 1,948.80` after a `GBP 10.60` weekly non-dependant deduction. Westmorland and Furness's alternative maximum / second adult branch falls under the current second adult rebate limitation. +- Kingston upon Hull (working-age/local scheme, band `D`, annual liability `GBP 2,500`, no children, no savings): the council's 2026/27 discount report says no CTR change, so this implementation pairs that report with the carried-forward 2025/26 formal scheme. The working-age scheme covers up to `80%` of liability after non-dependant deductions, applies a `20%` taper, has a `GBP 6,000` capital limit with source-disregarded capital for income-based benefit cases and no working-age tariff income, uses UC assessed income/capital for UC cases, and applies remunerative-work non-dependant deductions using a 16-hour threshold with a UC gross-earnings / minimum-wage fallback. Pension-age applicants remain in the local scheme where the applicant or partner is on UC or a relevant income-based benefit, except where a source-specific relevant-period flag preserves pensioner status. PolicyEngine UK returns `council_tax_reduction = GBP 2,000` for a no-excess-income claimant, `GBP 1,792` with `GBP 1,040` excess income, and `GBP 1,575.68` after a `GBP 10.20` weekly non-dependant deduction. +- North Yorkshire (working-age/local scheme, band `D`, annual liability `GBP 2,500`, no children, no savings): the council's 2026/27 formal scheme uses weekly income bands with `100%`, `75%`, `50%`, `25%`, and zero support levels by household type, excludes ordinary applicants with capital of `GBP 6,000` or above, disregards up to `GBP 16,000` of capital for income-based benefit cases, disregards Housing Benefit, and uses UC-assessed income/capital with a proportional UC housing-element disregard for UC awards. Pension-age applicants remain in the local scheme where the applicant or partner is on UC or a relevant income-based benefit, except where a source-specific relevant-period flag preserves pensioner status. PolicyEngine UK returns `council_tax_reduction = GBP 2,500` for a no-income single claimant, `GBP 1,875` at `GBP 180` weekly income, and `GBP 625` at the formal two-or-more-child family `GBP 441.01` weekly boundary. The scheme has no local working-age non-dependant deduction table in the formal discount schedule. +- Somerset (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 adopted scheme uses weekly claimant-and-partner income bands with `100%`, `50%`, `25%`, `10%`, and zero support levels by household type, caps eligible liability at Band `D`, disregards `GBP 25` weekly earnings and `GBP 30` weekly income for qualifying disabled households, excludes ordinary applicants with capital above `GBP 6,000`, disregards capital up to `GBP 16,000` for Income Support, income-based JSA, or income-related ESA cases, disregards Housing Benefit, Carer's Allowance, child maintenance, Child Benefit, war pensions, and the Universal Credit housing element, and reduces final awards by `GBP 10` per week for each non-dependant or non-dependant couple. Pension-age applicants remain in the local scheme where the applicant or partner is on UC or a relevant income-based benefit, except where a source-specific relevant-period flag preserves pensioner status. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` for a no-income single claimant, `GBP 450` at `GBP 180` weekly income, and `GBP 730` for that Band 3 case on a `GBP 5,000` liability after one non-dependant-couple deduction. +- Fenland (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says maximum Council Tax Reduction is `100%` of eligible Council Tax after discounts and non-dependant deductions, with the standard `2 6/7%` daily excess-income percentage and the ARP flat working-age non-dependant deduction. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions. +- West Suffolk (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says maximum Council Tax Reduction is `100%` for the period from `1 April 2023` through `31 March 2026`, then `91.5%` after `31 March 2026`, with the standard `2 6/7%` daily excess-income percentage and the ARP flat working-age non-dependant deduction. PolicyEngine UK returns `GBP 1,800` in 2025 and `GBP 1,647` in 2026 before non-dependant deductions. +- Broadland (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says working-age applicants who are not receiving a war pension can receive up to `87%` of eligible Council Tax, with a `20%` taper, a `GBP 16,000` capital limit, and a flat `GBP 7` weekly working-age non-dependant deduction. The council's 2026/27 papers say the existing scheme continues with no changes. PolicyEngine UK returns `council_tax_reduction = GBP 1,566` and `council_tax_less_benefit = GBP 234` before non-dependant deductions. +- South Norfolk (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says working-age applicants who are not receiving a war pension can receive up to `87%` of eligible Council Tax, with a `20%` taper, a `GBP 16,000` capital limit, and a flat `GBP 7` weekly working-age non-dependant deduction. The council's 2026/27 papers say the existing scheme continues with no changes. PolicyEngine UK returns `council_tax_reduction = GBP 1,566` and `council_tax_less_benefit = GBP 234` before non-dependant deductions. +- Southend-on-Sea (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 formal scheme uses weekly applicant-and-partner income bands with `75%`, `50%`, `25%`, and zero support levels by household type, applies a `GBP 20` weekly earnings disregard, excludes applicants with capital of `GBP 6,000` or above, uses UC-assessed income/capital for UC cases, and disregards source-listed Universal Credit elements. PolicyEngine UK returns `council_tax_reduction = GBP 1,350` for a no-income single claimant, `GBP 900` at `GBP 130` weekly income, and `GBP 450` for a two-child family at `GBP 410` weekly income. The formal scheme does not expose a working-age non-dependant deduction table. +- Lancaster (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says maximum Council Tax Reduction is `100%` of eligible Council Tax after discounts and non-dependant deductions, with the `2 6/7%` daily excess-income percentage, equivalent to a `20%` weekly taper, and a `GBP 16,000` capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions. +- Oldham (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme caps working-age eligible liability at Band A and applies a `15%` reduction in award, with the `2 6/7%` daily excess-income percentage and a `GBP 16,000` capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,020` and `council_tax_less_benefit = GBP 780` before non-dependant deductions. +- Bolton (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme says maximum Council Tax Support is `82.5%` of eligible Council Tax after discounts and non-dependant deductions, with the `2 6/7%` daily excess-income percentage and a `GBP 16,000` capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,485` and `council_tax_less_benefit = GBP 315` before non-dependant deductions. +- Basingstoke and Deane (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme says maximum Council Tax Support is `100%` of eligible Council Tax after discounts and non-dependant deductions, with the `2 6/7%` daily excess-income percentage and a `GBP 16,000` capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions. +- Crawley (working-age, band `D`, annual liability `GBP 1,800`, no children, savings below `GBP 9,000`): the council's 2025/26 scheme says maximum Council Tax Reduction is `100%` of eligible Council Tax after discounts and non-dependant deductions, with a `GBP 9,000` capital limit and a `20%` weekly taper. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions, and returns no support above the capital limit. +- Chichester (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 rules keep the non-UC legacy means test with `100%` maximum support, a `20%` taper, `GBP 16,000` capital limit, and tariff income above `GBP 6,000`, while UC claimants use weekly household-type income bands from `100%` to `0%` support and a flat `GBP 3.90` weekly non-dependant deduction in remunerative work. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` for a no-income non-UC claimant, `GBP 1,440` for a UC single claimant just above the `GBP 124` weekly threshold, and `GBP 1,597.20` after one full-rate UC non-dependant deduction. Where a source case needs the exact DWP-assessed Class F income figure, it can be supplied with `chichester_council_tax_reduction_source_uc_income`. The published couple `60%` UC row is malformed as `GBP 206.01` to `GBP 2229.00` in both the 2026/27 and carried-forward 2025/26 appendices; the implementation follows the continuous surrounding grid and models that row as ending at `GBP 229.00`. +- St Albans (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says non-Universal Credit claimants can receive `100%` of eligible Council Tax with the standard `20%` weekly taper and a `GBP 16,000` capital limit. For Universal Credit claimants, St Albans uses an earnings-band contribution table. PolicyEngine UK returns `GBP 1,800` for the non-UC no-income case, and `GBP 660` where monthly earnings of `GBP 1,000` imply a `GBP 95` monthly contribution in 2025. The scheme excludes Universal Credit awards from its one-deduction non-dependant couple rule; PolicyEngine UK counts both members in that case. +- Adur (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme says maximum Council Tax Support is `100%` of eligible Council Tax after discounts and non-dependant deductions, with the `2 6/7%` daily excess-income percentage and a `GBP 16,000` capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions. The scheme excludes Universal Credit awards from its one-deduction non-dependant couple rule; PolicyEngine UK counts both members in that case. +- Worthing (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme says maximum Council Tax Support is `100%` of eligible Council Tax after discounts and non-dependant deductions, with the `2 6/7%` daily excess-income percentage and a `GBP 16,000` capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions. The scheme excludes Universal Credit awards from its one-deduction non-dependant couple rule; PolicyEngine UK counts both members in that case. +- Sefton (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme says maximum Council Tax Reduction is `84%` of eligible Council Tax after discounts and non-dependant deductions, with the `2 6/7%` daily excess-income percentage, a `GBP 6,000` capital limit, and a working-age non-dependant deduction table of `GBP 2` or `GBP 5` per week when the non-dependant is in remunerative work. PolicyEngine UK returns `council_tax_reduction = GBP 1,512` and `council_tax_less_benefit = GBP 288` before non-dependant deductions. The scheme excludes Universal Credit awards from its one-deduction non-dependant couple rule; PolicyEngine UK counts both members in that case. +- Oxford (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme uses weekly income bands of `100%`, `75%`, `50%`, `25%`, and `0%`, with a `GBP 16,000` capital limit and a working-age non-dependant deduction table from `GBP 5.20` to `GBP 15.95` per week. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` in the lowest income band, and `GBP 1,350` where relevant weekly income is `GBP 500`. +- Redbridge (working-age, band `D`, annual liability `GBP 2,294.58`, no savings): the adopted 2026/27 full scheme uses categorical support rates of `73%`, `60%`, `50%`, `46%`, and `36%`, has no taper or Band D cap, excludes capital over `GBP 16,000`, applies a `GBP 10` weekly minimum award, and deducts `GBP 21.18` or `GBP 10.59` per week for non-dependants with a Universal Credit exception to the one-deduction couple rule. The council's shorter summary PDF says `61%` and `51%` for the no-work classes; PolicyEngine UK follows the adopted full scheme. PolicyEngine UK returns `council_tax_reduction = GBP 1,675.04` for a disability-class claimant, `GBP 1,223.78` for a no-earnings UC claimant with a child on a Band `C` liability, and `GBP 938.23` for a claimant with a child and `GBP 312.99` weekly net earnings; the strict `GBP 313` threshold returns no award. +- Kingston upon Thames (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme says maximum Council Tax Reduction is `100%` of eligible Council Tax after discounts and non-dependant deductions, with a `20%` taper, a `GBP 16,000` capital limit, tariff income above `GBP 6,000`, and a working-age non-dependant deduction table from `GBP 5.64` to `GBP 17.31` per week. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions. +- Newham (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026 scheme says working-age maximum Council Tax Reduction is `70%` of eligible Council Tax after discounts and non-dependant deductions, with a `25%` taper, a `GBP 6,000` capital limit, and a working-age non-dependant deduction table from `GBP 7.54` to `GBP 22.61` per week. PolicyEngine UK returns `council_tax_reduction = GBP 1,260` and `council_tax_less_benefit = GBP 540` before non-dependant deductions. +- Westminster (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme says maximum Council Tax Support is `100%` of eligible Council Tax after discounts and non-dependant deductions, with a `20%` taper and a working-age non-dependant deduction table from `GBP 5.20` to `GBP 15.95` per week. The council's income and savings guide sets the Council Tax Support capital limit at `GBP 16,000` and tariff income above `GBP 6,000`. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions. +- Greenwich (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's current Local Council Tax Support page says working-age support covers up to `80%` of the bill, with a `25%` income taper, a `GBP 16,000` capital limit, tariff income above `GBP 6,000`, and a flat `GBP 10` weekly non-dependant deduction. PolicyEngine UK returns `council_tax_reduction = GBP 1,440` and `council_tax_less_benefit = GBP 360` before non-dependant deductions. +- Gloucester (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026 policy uses a default-style means test with `100%` maximum support, a `20%` weekly taper, tariff income above `GBP 6,000`, a `GBP 16,000` capital limit, UC assessed-income/capital treatment, pension-age UC/income-based-benefit local cases, and working-age non-dependant deductions of `GBP 6` or `GBP 12.40` per week. PolicyEngine UK returns `council_tax_reduction = GBP 1,800` for a no-income claimant, `GBP 1,590` with `GBP 6,000` annual earnings, and `GBP 1,155.20` after one high-rate non-dependant deduction. +- Bath and North East Somerset (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme uses `78%` ordinary non-UC maximum support with a Band `D` cap, a `20%` taper, `GBP 10,000` ordinary capital limit, `GBP 16,000` protected capital limit, no working-age non-dependant deductions, and a UC Class F percentage table based on DWP UC income with a `GBP 6,000` UC-assessed capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,404` for an ordinary no-income non-UC claimant, `GBP 3,600` for a protected Band `H` claimant on a `GBP 3,600` liability, and `GBP 1,530` for a single UC claimant at `GBP 98.06` weekly Class F income. The live page still prints older UC band starting amounts; this implementation follows the adopted 2026/27 PDF. +- Hackney (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's current guidance says working-age Council Tax Reduction is limited to `90%` of the bill, with a `20%` taper, a `GBP 16,000` capital limit, tariff income above `GBP 6,000`, and a non-dependant deduction table from `GBP 5.20` to `GBP 15.95` per week. PolicyEngine UK returns `council_tax_reduction = GBP 1,620` and `council_tax_less_benefit = GBP 180` before non-dependant deductions. +- Hammersmith and Fulham (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 report continues its 2025/26 default-style scheme with annual uprating, providing up to `100%` support for low-income residents. PolicyEngine UK models the legacy `20%` taper, `GBP 16,000` capital limit, tariff income above `GBP 6,000`, and the uprated non-dependant deduction table from `GBP 5.20` to `GBP 15.95`; it returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions. +- Stockport (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme caps most working-age support at the equivalent Band `A` liability, has an `GBP 8,000` capital limit, and applies `GBP 5` or `GBP 10` weekly non-dependant deductions by gross income. PolicyEngine UK returns `council_tax_reduction = GBP 1,200` and `council_tax_less_benefit = GBP 600` before non-dependant deductions. +- Wakefield (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme disregards DWP income, uses assessed weekly non-DWP income bands with maximum support of `70%`, has a `GBP 6,000` capital limit, and applies a flat `GBP 7.50` weekly non-dependant deduction. PolicyEngine UK returns `council_tax_reduction = GBP 1,260` and `council_tax_less_benefit = GBP 540` before non-dependant deductions. +- Tameside (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme caps eligible liability at Band `A`, uses weekly net-income bands of `75%`, `50%`, `25%`, and `0%`, has a `GBP 6,000` capital cutoff, and has no non-dependant deductions. PolicyEngine UK returns `council_tax_reduction = GBP 900` and `council_tax_less_benefit = GBP 900`. +- Bury (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme caps eligible liability at Band `B` unless a protected-group exemption applies, uses monthly net earned-income bands from `80%` to `0%`, ignores other income, has a `GBP 8,000` capital limit, and applies a flat `GBP 40` monthly non-dependant deduction. PolicyEngine UK returns `council_tax_reduction = GBP 1,120` and `council_tax_less_benefit = GBP 680` before non-dependant deductions. +- Lambeth (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's current 2026 page says the scheme changed on `1 April 2026`, uses weekly net-earnings bands from `73.5%` to `0%`, has a `GBP 10,000` savings limit for working-age residents, ignores welfare benefits and similar income, and applies `GBP 10` or `GBP 16` weekly non-dependant deductions. PolicyEngine UK returns `council_tax_reduction = GBP 1,323` and `council_tax_less_benefit = GBP 477` before non-dependant deductions. +- Camden (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's current page says working-age support uses weekly gross-earnings bands after eligible childcare costs, gives full support below `GBP 118.40` weekly earnings, has a `GBP 16,000` savings and assets limit, and applies a `30%` liability deduction for each qualifying non-dependant while treating couples as one. PolicyEngine UK uses household liquid savings as the available capital proxy, and returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0` before non-dependant deductions. +- Islington (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's current page says non-working claimants get `95%` support unless a protected zero-earnings rule gives full support, working claimants use weekly net-pay bands, the savings and investments limit is `GBP 16,000`, and each non-dependant deduction is `GBP 7.92` per week unless an exemption applies. PolicyEngine UK returns `council_tax_reduction = GBP 1,710` and `council_tax_less_benefit = GBP 90` before non-dependant deductions. +- Ealing (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's April 2026 scheme uses protected and non-protected weekly income bands, excludes working-age applicants with capital equal to or above `GBP 6,000`, applies a `GBP 38.54` weekly earnings disregard outside Universal Credit for non-single claimants, and has local non-dependant deductions from `GBP 8.35` to `GBP 23.13` per week. PolicyEngine UK returns `council_tax_reduction = GBP 1,440` for a non-protected no-income claimant and `GBP 1,800` for a protected no-income claimant. +- Enfield (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme caps working-age eligible liability at Band `C`, gives non-Universal Credit non-protected claimants up to `50%` support with a `22.5%` taper, protects single claimants under `25` and war widows, and uses Universal Credit net-earnings bands from `50%` to `10%` support. PolicyEngine UK returns `council_tax_reduction = GBP 800` for a non-protected no-income claimant and `GBP 1,600` for a protected no-income claimant. +- Haringey (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme gives ordinary working-age claimants up to `80.2%` support, protects working-age households with children or qualifying disability from that cap, applies a `20%` taper, and has a `GBP 10,000` working-age capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,443.60` for an ordinary no-income claimant and `GBP 1,800` for a protected no-income claimant. +- Harrow (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 scheme uses a split design: non-Universal Credit applicants receive up to `50%` ordinary support or `86%` disabled support with a `30%` taper, while Universal Credit applicants use household-type weekly net-earnings bands. PolicyEngine UK returns `council_tax_reduction = GBP 900` for an ordinary non-UC no-income claimant, `GBP 720` for a UC single claimant with `GBP 100` weekly net earnings, and `GBP 1,892` for a disabled claimant on a `GBP 2,200` Band `E` liability. +- Havering (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 summary continues a legacy means-tested scheme with `75%` ordinary maximum support, `80%` disabled maximum support, a Band `D` cap, a `20%` taper, and a `GBP 6,000` working-age capital limit. PolicyEngine UK returns `council_tax_reduction = GBP 1,350` for an ordinary no-income claimant and `GBP 1,440` for a disabled no-income claimant; a Band `E` liability of `GBP 2,200` is capped to a `GBP 1,350` ordinary award. +- Hounslow (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's live 2026 page and formal 2025/26 scheme use weekly net-earnings bands for working-age households, with ordinary support of up to `75%`, `90%` support for households where the claimant or partner receives Carer's Allowance or the Universal Credit carer element, and a `GBP 6,000` working-age capital limit. PolicyEngine UK uses household liquid savings as the available proxy for claimant/partner capital, and returns `council_tax_reduction = GBP 1,350` for a no-earnings ordinary claimant and `GBP 1,620` for a carer household. +- Lewisham (working-age, band `D`, annual liability `GBP 2,237.33`, no children, no savings): the council's 2026/27 budget papers continue its existing scheme with `75%` maximum working-age support, a `20%` taper, a `GBP 16,000` capital limit, tariff income above `GBP 6,000`, and gross-income non-dependant deductions. PolicyEngine UK returns `council_tax_reduction = GBP 1,678.00` for a no-income claimant, `GBP 3,356.00` on a Band `H` liability with no Band D cap, and `GBP 1,458.00` for a UC claimant with monthly earnings of `GBP 1,200` after the weekly UC earnings disregard. The detailed scheme source is labelled 2024/25; 2026/27 papers confirm the no-change continuation. +- Stevenage (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's published scheme says working-age claimants receive `91.5%` of net liability, so PolicyEngine UK returns `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153`. +- Chesterfield (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's published scheme says working-age claimants receive `91.5%` of net liability, so PolicyEngine UK returns `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153`. +- Colchester (working-age/local scheme, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2026/27 formal scheme and current working-age page use weekly applicant-and-partner net-income bands with `80%` maximum support, a Band `D` liability cap, a `GBP 25` weekly earnings disregard, a strict `GBP 6,000` capital cutoff, protected `80%` support for source-listed benefit/disabled/blind groups inside the listed income bands, and source-listed Universal Credit element disregards. PolicyEngine UK returns `council_tax_reduction = GBP 1,440` for a no-income claimant, `GBP 720` for a no-child couple just above `GBP 225` weekly income, and `GBP 1,440` for a Band `H` liability capped to Band `D`. The formal scheme does not expose a working-age non-dependant deduction table. +- Warrington (`WA1 1UH`, band `C`, single working-age owner-occupier, no children, no savings, income-based JSA): entitledto returns `GBP 26.69` per week of Council Tax Support and `GBP 2.48` per week left to pay on a displayed bill of `GBP 29.17` per week, which is a `91.5%` maximum award on the displayed weekly bill. PolicyEngine UK applies the same rule structure. +- Merton (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's published calculation guide says maximum Council Tax Support is usually `100%` of eligible Council Tax after discounts and non-dependant deductions, with a `20%` taper and a `GBP 16,000` capital limit, so PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0`. +- Southwark (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's published 2025/26 policy summary says working-age applicants can receive up to `85%` of annual council tax liability, with a `20%` taper and a `GBP 16,000` capital limit, so PolicyEngine UK returns `council_tax_reduction = GBP 1,530` and `council_tax_less_benefit = GBP 270`. +- Darlington (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says working-age support is up to `80%` of eligible Council Tax, with a `20%` taper and a `GBP 16,000` capital limit, so PolicyEngine UK returns `council_tax_reduction = GBP 1,440` and `council_tax_less_benefit = GBP 360`. +- Gateshead (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says working-age households can receive support up to `91.5%` of their council tax bill and uses the `2 6/7%` daily excess-income percentage, equivalent to a `20%` weekly taper, so PolicyEngine UK returns `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153`. The same source also sets a Gateshead-specific 2025/26 non-dependant deduction schedule, which PolicyEngine UK applies instead of the Housing Benefit schedule. +- King's Lynn and West Norfolk (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 and 2026/27 scheme regulations say maximum Council Tax Reduction is `100%` of eligible Council Tax after discounts and non-dependant deductions, with a `2 6/7%` daily excess-income percentage, equivalent to a `20%` weekly taper, and a `GBP 16,000` capital limit, so PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0`. The scheme text says non-dependant deductions are uprated by the prescribed requirements regulations, so PolicyEngine UK uses the council's current non-dependant table for the applied 2025 and 2026 values. +- Norwich (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 and 2026 scheme PDFs say maximum Council Tax Reduction is `100%` of eligible Council Tax after discounts and non-dependant deductions, with the `2 6/7%` daily excess-income percentage and a `GBP 16,000` capital limit, so PolicyEngine UK returns `council_tax_reduction = GBP 1,800` and `council_tax_less_benefit = GBP 0`. Norwich sets a separate working-age non-dependant deduction schedule, which PolicyEngine UK applies instead of the Housing Benefit schedule. +- North Norfolk (working-age, band `D`, annual liability `GBP 1,800`, no children, no savings): the council's 2025/26 scheme says maximum Council Tax Reduction is `91.5%` of eligible Council Tax after discounts and non-dependant deductions, with the `2 6/7%` daily excess-income percentage, equivalent to a `20%` weekly taper, and a `GBP 16,000` capital limit. The council's April 2026 update says the 2026/27 scheme continues under the arrangements introduced from `1 April 2025`. PolicyEngine UK returns `council_tax_reduction = GBP 1,647` and `council_tax_less_benefit = GBP 153`. The same source sets a flat `GBP 10` weekly non-dependant deduction and waives it where the claimant or partner receives the Limited Capability for Work component of Universal Credit. +- Policy in Practice Better Off Calculator (`SG13 8EQ`, East Hertfordshire, band `D`, single working-age owner-occupier, no children, no savings, income-based JSA, monthly council tax liability `GBP 150`): the public calculator resolves East Hertfordshire from postcode and returns `GBP 137.25` per month of Council Tax Support. That is exactly a `91.5%` award on the entered liability, matching the scheme structure and the PolicyEngine UK rule. +- Policy in Practice Better Off Calculator (`DY1 1HF`, Dudley, band `C`, single working-age owner-occupier, no children, no savings, income-based JSA, monthly council tax liability `GBP 113.25` with single-person discount): the public calculator resolves Dudley from postcode and returns `GBP 45.30` per month of Council Tax Support. That is exactly a `40%` award on the entered liability, matching Dudley's published scheme structure and the PolicyEngine UK rule. +- Policy in Practice Better Off Calculator (`WA1 1UH`, Warrington, band `C`, single working-age owner-occupier, no children, no savings, income-based JSA, monthly council tax liability `GBP 126.74` with single-person discount): the public calculator resolves Warrington from postcode and returns `GBP 95.06` per month of Council Tax Support. That is a `75%` award on the entered liability, which does not match Warrington's published 2025/26 Class D passported-JSA scheme, entitledto's `91.5%` result for the same scenario, or the current PolicyEngine UK encoding. +- Policy in Practice Better Off Calculator (`GL5 4UB`, Stroud, band `D`, single working-age owner-occupier, no children, no savings, income-based JSA, monthly council tax liability `GBP 148.09` with single-person discount): the public calculator resolves Stroud from postcode and returns `GBP 148.09` per month of Council Tax Support. That is full support on the entered liability, matching entitledto's behavior and the published Stroud scheme summary. +- Turn2us public calculator checks on the same four single working-age owner-occupier income-based JSA cases in East Hertfordshire, Warrington, Dudley, and Stroud all reached the final results page, but returned the same `Income-based Jobseekers Allowance` and `Universal Credit` lines for all four authorities and no CTR output. In these cases, Turn2us was not acting as an authority-specific CTR comparator. + +For the East Hertfordshire and Warrington calculator checks, entitledto's annual tab appears to multiply rounded weekly outputs by `52`, so the weekly figures are the closest comparison point. Additional browser-only probing suggests that reusing an existing entitledto calculation ID is good enough for lone-parent and couple spot checks, but not yet good enough for other-adult/non-dependant cases: the later pages can retain stale branch state, so those results should not be treated as validated until the flow is replayed from a fresh entitledto session. + +The public Policy in Practice calculator is testable through the browser, but not through a simple documented one-shot API. The frontend is a token-gated SPA on `betteroffcalculator.co.uk` backed by `api.betteroffcalculator.co.uk`; raw ad hoc `POST /api` requests return default baseline results unless the full calculator state has already been established in the session. + +Dudley references: + +- https://www.dudley.gov.uk/residents/benefits/council-tax-reduction-scheme/ +- https://www.dudley.gov.uk/media/khllf4zc/dudley-council-tax-reduction-scheme-2025-26.pdf + +East Hertfordshire references: + +- https://www.eastherts.gov.uk/benefits-and-financial-support/council-tax-support +- https://cdn-eastherts.onwebcurl.com/s3fs-public/2025-03/East%20Herts%20S13a%20202526%20Scheme%20Final.pdf + +East Suffolk references: + +- https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf +- https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ +- https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm + +East Cambridgeshire references: + +- https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/East-Cambridgeshire-District-Council-Council-Tax-Reduction-Schemes-2025-26.pdf +- https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ +- https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm + +East Hampshire references: + +- https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf +- https://www.easthants.gov.uk/news/2026/council-tax-scheme-provides-welcome-support-many-east-hampshire-households + +Breckland references: + +- https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Breckland-Council-Tax-Reduction-Scheme-2025-26.pdf +- https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ +- https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm + +Brent references: + +- https://www.brent.gov.uk/council-tax/council-tax-support + +Bromley references: + +- https://cds.bromley.gov.uk/documents/s50125675/Council%20Tax%20Support%20Scheme%202026-27.pdf +- https://www.bromley.gov.uk/downloads/file/3849/local-council-tax-reduction-scheme-from-1-april-2025 + +Bristol references: + +- https://www.bristol.gov.uk/residents/benefits-and-financial-help/council-tax-reduction/council-tax-reduction-scheme +- https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file +- https://www.bristol.gov.uk/ask?id=73 + +Croydon references: + +- https://croydon.moderngov.co.uk/ieDecisionDetails.aspx?AIId=26045 +- https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support +- https://www.croydon.gov.uk/benefits/changes-council-tax-support/your-capital-savings-investments-and-property +- https://www.croydon.gov.uk/benefits/changes-council-tax-support/other-people-who-live-you +- https://www.croydon.gov.uk/council-tax/what-council-tax-and-how-much-it/council-tax-bands + +Cumberland references: + +- https://www.cumberland.gov.uk/benefits-and-financial-help/council-tax-reduction/make-claim-council-tax-reduction/council-tax-reduction-scheme +- https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf +- https://www.cumberland.gov.uk/council-tax/how-council-tax-calculated-and-spent/your-council-tax-bill-explained/your-guide-council-tax-and-documents/cumberland-councils-guide-council-tax-2026-2027-including-explanatory-notes-and + +Coventry references: + +- https://www.coventry.gov.uk/downloads/download/2513/council-tax-support-scheme +- https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027 + +Cotswold references: + +- https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf +- https://meetings.cotswold.gov.uk/ieIssueDetails.aspx?IId=6872&Opt=3 + +Herefordshire references: + +- https://councillors.herefordshire.gov.uk/documents/s50131817/202627%20Council%20Tax%20Reduction%20Scheme.pdf +- https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf +- https://www.herefordshire.gov.uk/council-tax/council-tax-reduction/ + +Westmorland and Furness references: + +- https://www.westmorlandandfurness.gov.uk/benefits-and-financial-help/council-tax-reduction/make-claim-council-tax-reduction +- https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf + +Kingston upon Hull references: + +- https://www.hull.gov.uk/council-tax-reduction/help-pay-council-tax +- https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026 +- https://cmis.hullcc.gov.uk/cmis/CalendarofMeetings/tabid/70/ctl/ViewMeetingPublic/mid/397/Meeting/11151/Committee/3/Default.aspx + +North Yorkshire references: + +- https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf +- https://edemocracy.northyorks.gov.uk/mgAi.aspx?ID=30077 + +Somerset references: + +- https://www.somerset.gov.uk/benefits-and-payments/council-tax-reduction/ +- https://somerset.moderngov.co.uk/ieListDocuments.aspx?MId=7598 +- https://somerset.moderngov.co.uk/documents/s60490/Council%20Tax%20Reduction%20and%20Exceptional%20Hardship%20Scheme%202026-27.pdf +- https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf + +Broadland references: + +- https://www.southnorfolkandbroadland.gov.uk/asset-library/broadland-ctr-scheme-2025-26.pdf +- https://southnorfolkandbroadland.moderngov.co.uk/documents/s12491/CTAX%20Reduction%20Scheme.pdf + +Fenland references: + +- https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/Fenland-District-Council-Council-Tax-Reduction-Scheme-2025-26.pdf +- https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ +- https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm + +West Suffolk references: + +- https://www.angliarevenues.gov.uk/services/counciltax/reductions/what-is-ctax-reduction/upload/West-Suffolk-Council-Council-Tax-Reduction-Scheme-2025-26.pdf +- https://www.angliarevenues.gov.uk/services/housing-benefits/apply/ +- https://www.angliarevenues.gov.uk/services/housing-benefits/non-dependant-deductions-ctrs.cfm + +South Norfolk references: + +- https://www.southnorfolkandbroadland.gov.uk/asset-library/south-norfolk-ctr-scheme-2025-26.pdf +- https://southnorfolkandbroadland.moderngov.co.uk/documents/g1058/Printed%20minutes%2024th-Nov-2025%2009.00%20South%20Norfolk%20Cabinet.pdf?T=1 + +Lancaster references: + +- https://www.lancaster.gov.uk/assets/attach/14831/lancaster-city-council-2025-26-council-tax-support-scheme.pdf + +Oldham references: + +- https://www.oldham.gov.uk/download/downloads/id/2632/council_tax_reduction_scheme_2025-26.pdf + +Bolton references: + +- https://www.bolton.gov.uk/downloads/file/745/bolton-council-tax-reduction-scheme + +Basingstoke and Deane references: + +- https://www.basingstoke.gov.uk/content/page/77332/Basingstoke%20S13A%202026%20Scheme%20Final.pdf + +Crawley references: + +- https://crawley.gov.uk/sites/default/files/2025-02/Council%20Tax%20Reduction%20scheme%202025%20to%202026.pdf + +Chichester references: + +- https://chichester.moderngov.co.uk/documents/s30862/09.0%20Local%20Council%20Tax%20Reduction%20Scheme%202026-27.pdf +- https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf +- https://chichester.moderngov.co.uk/documents/s28429/Determination%20of%20the%20Council%20Tax%20Reduction%20Scheme%202025-2026%20-%20Appendix.pdf + +St Albans references: + +- https://www.stalbans.gov.uk/sites/default/files/attachments/St%20Albans%20S13A%20202526%20Final.pdf +- https://www.stalbans.gov.uk/council-tax-support + +Adur references: + +- https://www.adur-worthing.gov.uk/media/Media,174007,smxx.pdf +- https://www.adur-worthing.gov.uk/benefits/council-tax-support/ + +Worthing references: + +- https://www.adur-worthing.gov.uk/media/Media,174008,smxx.pdf +- https://www.adur-worthing.gov.uk/benefits/council-tax-support/ + +Sefton references: + +- https://www.sefton.gov.uk/media/occbaemk/ctr-scheme-2026-27.pdf +- https://www.sefton.gov.uk/advice-benefits/help-with-council-tax/ + +Oxford references: + +- https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27 + +Redbridge references: + +- https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf +- https://www.redbridge.gov.uk/media/gleawsfi/council-tax-reduction-scheme-2026-2027-on-redbridge-web-page.pdf +- https://www.redbridge.gov.uk/council-tax/discounts-and-exemptions/council-tax-reduction/apply-for-council-tax-reduction/ +- https://www.redbridge.gov.uk/council-tax/bands-and-charges/ + +Stevenage references: + +- https://www.stevenage.gov.uk/benefits/council-tax-support +- https://www.stevenage.gov.uk/documents/council-tax/council-tax-support-scheme-2025-26.pdf + +Chesterfield references: + +- https://www.chesterfield.gov.uk/council-tax-and-business-rates/council-tax/council-tax-support +- https://www.chesterfield.gov.uk/media/zuxllbgk/chesterfield-borough-council-council-tax-support-scheme-2019-20.pdf + +Colchester references: + +- https://www.colchester.gov.uk/housing-benefit-local-council-tax-support/lcts-working-age/ +- https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf + +Warrington references: + +- https://www.warrington.gov.uk/benefits-calculator +- https://www.warrington.gov.uk/income-and-capital +- https://www.warrington.gov.uk/non-dependants +- https://www.warrington.gov.uk/sites/default/files/2025-04/CTS%20Scheme%202025-26.pdf + +Merton references: + +- https://www.merton.gov.uk/sites/default/files/2025-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202025-26.pdf +- https://www.merton.gov.uk/council-tax-benefits-and-housing/benefits/council-tax-support/calculating-council-tax-support +- https://www.merton.gov.uk/council-tax-benefits-and-housing/benefits/council-tax-support/council-tax-support-scheme-consultations-and-official-text + +Southwark references: + +- https://www.southwark.gov.uk/council-tax/get-money-your-council-tax-bill/council-tax-reduction/how-much-your-bill-can-be-reduced +- https://www.southwark.gov.uk/sites/default/files/2025-03/Southwark%20Council%20Tax%20Reduction%20Policy%202025-26.pdf +- https://www.southwark.gov.uk/sites/default/files/2025-03/Southwark%20Council%20Tax%20Reducation%20Policy%202025-26%20shorter%20version.pdf + +Darlington references: + +- https://www.darlington.gov.uk/media/czqfj5rz/council-tax-support-scheme-25-26-final.pdf + +Gateshead references: + +- https://www.gateshead.gov.uk/article/27558/Part-1-Introduction +- https://www.gateshead.gov.uk/article/27575/Part-4-Classes-of-person-entitled-to-a-reduction-under-this-scheme +- https://www.gateshead.gov.uk/article/27582/Part-7-Maximum-council-tax-reduction-for-the-purposes-of-calculating-eligibility-for-a-reduction-under-this-scheme-and-the-amount-of-reduction +- https://www.gateshead.gov.uk/article/27578/Part-5-Classes-of-person-excluded-from-this-scheme + +Gloucester references: + +- https://www.gloucester.gov.uk/council-tax/council-tax-support/ +- https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf +- https://www.gloucester.gov.uk/news/2026-news/council-tax-support-set-to-continue-during-tough-times/ + +King's Lynn and West Norfolk references: + +- https://www.west-norfolk.gov.uk/download/downloads/id/9853/council_tax_reduction_scheme_2025_to_2026.pdf +- https://www.west-norfolk.gov.uk/download/downloads/id/3330/council_tax_support_regulations.pdf +- https://www.west-norfolk.gov.uk/info/20019/council_tax_support/29/council_tax_support_-_non-dependants + +Norwich references: + +- https://www.norwich.gov.uk/download/downloads/id/10735/council_tax_reduction_scheme_2025-26.pdf +- https://www.norwich.gov.uk/sites/default/files/2026-03/Council-Tax-Reduction-Scheme-2026.pdf + +North Norfolk references: + +- https://www.north-norfolk.gov.uk/media/10894/north-norfolk-council-tax-reduction-scheme-for-2025-to-2026.pdf +- https://www.north-norfolk.gov.uk/tasks/benefits/housing-benefit-and-council-tax-support-rates-from-april-2026/ + +Hounslow references: + +- https://www.hounslow.gov.uk/council-tax-support +- https://www.hounslow.gov.uk/downloads/file/11485/hounslow-council-tax-reduction-scheme-2025-to-2026 +- https://democraticservices.hounslow.gov.uk/documents/s205995/Budget%20Report%202026.pdf + +Lewisham references: + +- https://lewisham.gov.uk/myservices/benefits/council-tax-reduction-scheme +- https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf +- https://lewisham.moderngov.co.uk/documents/s123568/2026-27%20PASC%20Draft%20Budget%20Report.pdf +- https://lewisham.moderngov.co.uk/documents/s123572/2026-27%20PASC%20Budget%20Report%20Y%20GF%20Appendices.pdf + +Harrow references: + +- https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 + +Havering references: + +- https://democracy.havering.gov.uk/documents/s83106/12%20-%20Appendix%20I%20%20Summary%20of%20the%20Council%20Tax%20Support%20Scheme%202026-27.pdf +- https://democracy.havering.gov.uk/documents/s83059/0-1%20-%20Budget%20report%20cabinet%202026%202.pdf +- https://www.havering.gov.uk/downloads/file/6930/council-tax-support-scheme-2025-2026 + +Rushmoor references: + +- https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf + +Hart references: + +- https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf + +Maldon references: + +- https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf + +Hartlepool references: + +- https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 + +Hertsmere references: + +- https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf + +- Rushmoor: default-style scheme with full support, Band D cap, 20 percent taper, strict `GBP 6,000` capital cutoff, pension-age UC/income-based-benefit local cases with source exceptions, and prescribed 2026/27 gross-income non-dependant deductions. +- Hart: default-style scheme with full support, no Band D cap, 20 percent taper, `GBP 16,000` capital limit, UC assessed income/capital treatment, and the source's UC-couple non-dependant exception. +- Maldon: default-style scheme with `80%` support, Band D cap, 20 percent taper, strict `GBP 6,000` capital cutoff, UC assessed income/capital treatment, and a flat `GBP 10` weekly non-dependant deduction. +- Hartlepool: six-table weekly net-income Discount Scheme with `90%`/`70%`/`40%`/`20%`/`0%` bands, `GBP 10,000` capital limit, `GBP 25` weekly earnings disregard, UC assessed income/capital treatment, and flat `GBP 5` weekly non-dependant deductions. +- Hertsmere: hybrid Class D/E and Class G scheme with `80%` ordinary support, `100%` protected support, Band D cap, Class G UC earnings bands, Schedule 3 earnings disregards, UC-assessed capital, and separate protected/non-protected UC non-dependant deduction tables including the source's printed `GBP 577+` protected top threshold. +- East Hampshire: default-style scheme with full support, `20%` taper, `GBP 16,000` capital cutoff, UC assessed income/capital treatment, pension-age UC/income-based-benefit local cases with source exceptions, and prescribed 2026/27 gross-income non-dependant deductions. The paragraph 30 body heading says "pensioners ONLY", but paragraph 29 and the table of contents apply paragraph 30 to pensioners and non-pensioners. +- Brentwood: banded discount scheme with three household-type weekly income tables (no/one/two-or-more dependants) and discount rates from `75%` to `0%` (paragraph 43.1 caps the maximum at `100%`), Schedule 1 paragraph 3 protected-group `100%` uplift covering DLA / PIP / AA / UC LCWRA / AFIP / SDA recipients (with Brentwood-scoped source-input booleans for the UC LCW element, Working Tax Credit disability element and ESA Support Component, since PolicyEngine UK does not model those facts directly), Schedule 1 paragraph 9 income-based-benefit auto-Band 1 routing, paragraph 6 working-age homeowner exclusion in Bands `F`, `G`, `H`, strict `GBP 6,000` capital cutoff, countable income other than earnings, paragraph 23.2/25.2 `GBP 20` weekly earnings disregard, paragraph 12 DWP-assessed UC income (gross UC award before deductions, plus the `GBP 20` weekly UC earnings disregard from paragraph 12.6(d)) and UC-assessed capital, and pension-age UC local cases with the regulation 60A source exception. Paragraph 45 says "There shall be no non-dependant deductions", so none are modeled. +- West Berkshire: prescribed Default Scheme + 6 local amendments for working-age Class D and E non-vulnerable applicants. Paragraph 29A caps assessed liability at the Band C amount in the same parish, paragraph 29B reduces the maximum to `70%`, paragraph 29(1)A excludes capital at `GBP 6,000` or above, paragraph 29C cancels awards below `GBP 10` per week, paragraph 17(2)(f) sets a `30%` Class E taper, and paragraph 18 removes the working-age Class F Second Adult Rebate. Paragraph 29D protects a vulnerable category (claimant or partner with Disability Premium / Enhanced Disability Premium / Severe Disability Premium / Disabled Child Premium / any component of ESA / War Pension / UC Limited Capability for Work element) from each of those amendments, keeping the `100%` maximum, no Band C cap, default `GBP 16,000` capital cutoff, no minimum award, and a `20%` Class E1 taper from paragraph 17A. Paragraph 37 uses UC-assessed income/capital for UC claimants, paragraph 30's one-deduction couple rule does not apply to UC non-dependant couples, and paragraph 3 gives pension-age UC cases relevant-period and regulation 60A source exceptions. Pension-age applicants without a working-age benefit go to the prescribed pensioner scheme. The vulnerable group is keyed off the claimant or partner only, so a disabled non-dependant does not uplift the claimant's scheme. PolicyEngine UK exposes the disability premiums and ESA directly; jurisdiction-scoped Brentwood-style source-input booleans cover War Pension, UC LCW element, Disabled Child Premium, and pension-age UC source exceptions. +- Tendring: prescribed Default Scheme with local amendments to maximum support - paragraph 57.1 caps the ordinary working-age maximum at `80%` (the council's live page confirms "everyone of working age will have to pay at least 20%"), while paragraph 57.1A reduces that maximum to `60%` where the applicant or partner has received Jobseeker's Allowance for three years or more. Paragraph 33 keeps the `GBP 16,000` capital limit, paragraph 59 mirrors the prescribed `2 6/7%` daily Class E taper (equivalent to `20%` weekly), section 14 uses UC `uc_maximum_amount` as the applicable amount, and paragraph 15 counts household members' non-child income/capital in non-UC cases. Paragraph 58 is "Not Used", so no working-age non-dependant deductions are modeled. Paragraph 3.2 routes pension-age applicants on UC into the local scheme, with relevant-period and regulation 60A UC source exceptions. There is no Band D liability cap, no protected vulnerable category, and no separate UC banded scheme. +- St Helens: prescribed Default Scheme with four local working-age amendments - paragraph 9 caps the working-age maximum at `80%` of council tax liability with a Band D liability cap for Bands F, G and H (so Band F support is capped at `9/13` of the Band F bill, Band G at `9/15`, and Band H at `9/18`), paragraph 40 cancels any award calculated at less than `GBP 1` per week, and paragraph 49 removes all working-age non-dependant deductions. Paragraphs 10 and 28 keep the `GBP 16,000` capital limit, paragraphs 9 and 37 keep the prescribed `20%` weekly taper, paragraph 62 uses the UC maximum award as the applicable amount, paragraph 63 uses the DWP-assessed UC income plus the actual UC award and the DWP-assessed UC capital, and footnote 1 / cabinet 4.4.1(b) keeps pension-age UC recipients whose award arises from Working Tax Credit closure on the prescribed pensioner scheme via the regulation 60A source exception. Pension-age applicants without a working-age income-related benefit go to the prescribed pensioner scheme. +- Tewkesbury: Default Scheme with no local amendments. Tewkesbury Borough Council has remained on the Default Scheme since 1 April 2013, and the Cabinet's Council Tax Reduction Scheme Report dated January 2026 confirms no proposed changes for 2026/27. Working-age maximum support is `100%` of council tax liability (Default Scheme paragraph 29), the capital limit is `GBP 16,000` (paragraph 23), the Class E taper is `2 6/7%` daily / `20%` weekly (paragraph 17), and paragraph 30 sets the gross-income non-dependant deduction schedule as amended by SI 2012/3085 (`GBP 3.65` / `GBP 7.25` / `GBP 9.15` / `GBP 10.95` weekly) with paragraph 30(3) excluding UC non-dependant couples from the one-deduction couple rule. The council's current public page links the Default Scheme regulations and confirms the `GBP 16,000` capital limit; no accessible primary Tewkesbury source found in this pass shows a local annual uprating of the Default Scheme non-dependant amounts to the 2026 Prescribed Requirements table. UC cases use UC `uc_maximum_amount` as the applicable amount with DWP-assessed UC income/capital, and pension-age UC cases include the current Prescribed Requirements regulation 3 relevant-period and regulation 60A source exceptions. +- Forest of Dean: 2026/27 working-age banded discount scheme with two classes - Class A non-protected and Class B protected. Paragraph 57.1 caps the Class A maximum at `90%` and paragraph 57.6 raises the Class B maximum to `95%`, with both classes' eligible liability capped at the Band E equivalent for the dwelling (paragraphs 57.1(a) and 57.6(a)). Paragraph 59.1 sets Class A's six income bands at `90/70/50/30/10/0%` and paragraph 59.3 sets Class B's at `95/75/55/35/15/0%`, with separate Single, Couple, Lone Parent and Couple with Children weekly net-income tables. Class A/Class B criterion (g) places applicants on Income Support / income-based JSA / income-related ESA in the top income band. Section 15A uses DWP-assessed UC income plus the UC award and UC-assessed capital for UC claimants. Capital is excluded at `GBP 16,000` (paragraph 33 / Class A and B criterion (f)). Section 58 mirrors the prescribed Default Scheme gross-income non-dependant deductions (`GBP 5.20` / `GBP 10.60` / `GBP 13.30` / `GBP 15.95` weekly) and paragraph 58.3 keeps the one-deduction couple rule for all couples including UC (no UC carve-out). Class B is keyed off the claimant, partner or any dependant (Class B paragraphs (h) and (i)) receiving AFIP / Attendance Allowance / DLA / ESA / PIP / SDA, plus Forest of Dean-scoped source inputs for War Pension / War Widow's Pension and the UC Work Capability Element since PolicyEngine UK does not model those facts. Pension-age applicants without a working-age income-related benefit go to the prescribed pensioner scheme. +- Braintree: 2026/27 working-age Banded Discount Scheme. Paragraph 48.1 caps the maximum award at `77%` of council tax liability with no Band cap and no non-dependant deductions. Schedule 1 paragraph 1 sets weekly income ranges across six household types (Single / Couple x no / one / two-or-more children), with passported Income Support / income-related ESA / income-based JSA applicants placed at Band 1 (Schedule 1 paragraph 7). Paragraph 26.1 / Schedule 1 paragraph 5 exclude applicants whose capital is `GBP 10,000` or greater (strict cutoff). Paragraphs 12.2-12.5 take DWP-assessed UC income (annualised by multiplying by 12 and dividing by 52) plus the actual UC award, and DWP-assessed UC capital. Paragraph 3 routes pension-age applicants on UC/IS/JSA-IB/ESA-IR into the local banded scheme, with relevant-period and regulation 60A UC source exceptions; pension-age applicants outside those local cases go to the prescribed pensioner scheme. 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 new file mode 100644 index 000000000..20eaf123c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/_legacy.py @@ -0,0 +1,207 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.household.demographic.highest_education import ( + EducationType, +) + + +def is_full_time_student_non_dep(person, period): + return (person("current_education", period) != EducationType.NOT_IN_EDUCATION) | ( + person("in_HE", period) + ) + + +def legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + non_dep_deductions_variable, + maximum_support_rate=None, + maximum_eligible_liability_variable=None, + applicable_amount=None, + applicable_income=None, + additional_applicable_income=0, +): + is_household_head_benunit = benunit("benunit_contains_household_head", period) + would_claim = benunit("would_claim_council_tax_reduction", period) + applicable_amount = ( + benunit("council_tax_reduction_applicable_amount", period) + if applicable_amount is None + else applicable_amount + ) + applicable_income = ( + benunit("council_tax_reduction_applicable_income", period) + if applicable_income is None + else applicable_income + ) + applicable_income += additional_applicable_income + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + liability = ( + benunit.household(maximum_eligible_liability_variable, period) + if maximum_eligible_liability_variable + else benunit.household("council_tax", period) + ) + non_dep_deductions = benunit(non_dep_deductions_variable, period) + max_support = ( + maximum_support_rate + if maximum_support_rate is not None + else ctr.maximum_support_rate + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(working_age & relevant_income_based_benefit, 0, excess_income) + preliminary_award = max_( + 0, + liability * max_support + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + return ( + working_age + * is_household_head_benunit + * would_claim + * capital_eligible + * preliminary_award + ) + + +def local_non_dep_deductions( + benunit, + period, + individual_deduction_variable, + one_deduction_for_uc_couples=True, +): + deductions = benunit.members(individual_deduction_variable, period) + deduction_for_benunit = benunit.max(deductions) + if not one_deduction_for_uc_couples: + has_uc = benunit("universal_credit", period) > 0 + deduction_for_benunit = where( + has_uc, + benunit.sum(deductions), + deduction_for_benunit, + ) + is_benunit_head = benunit.members("is_benunit_head", period) + deductions_to_count = is_benunit_head * benunit.project(deduction_for_benunit) + deductions_in_household = benunit.max( + benunit.members.household.sum(deductions_to_count) + ) + return deductions_in_household - deduction_for_benunit + + +def normal_gross_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_income_based_benefits=True, + exempt_uc_no_earned_income=True, + exempt_under_25_uc_no_earned_income=False, +): + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ] + gross_income = add(person, period, gross_income_components) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_benunit_gross_income = person.benunit.sum(gross_income) / WEEKS_IN_YEAR + weekly_benunit_earned_income = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_benunit_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_exempt = person.household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + full_time_student = is_full_time_student_non_dep(person, period) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + has_uc = person.benunit("universal_credit", period) > 0 + no_earned_income = weekly_benunit_earned_income <= 0 + uc_no_earned_income_exempt = ( + has_uc + & no_earned_income + & ( + exempt_uc_no_earned_income + | (exempt_under_25_uc_no_earned_income & (person("age", period) < 25)) + ) + ) + exempt = ( + claimant_exempt + | full_time_student + | (exempt_income_based_benefits & income_based_benefit) + | uc_no_earned_income_exempt + ) + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) + + +def earned_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_income_based_benefits=True, + exempt_uc_no_earned_income=False, + exempt_under_25_uc_no_earned_income=False, +): + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_earned_income = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + deduction = ctr.non_dep_deduction.amount.calc(weekly_earned_income) * WEEKS_IN_YEAR + claimant_exempt = person.household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + full_time_student = is_full_time_student_non_dep(person, period) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + has_uc = person.benunit("universal_credit", period) > 0 + no_earned_income = weekly_earned_income <= 0 + uc_exempt = ( + has_uc + & no_earned_income + & ( + exempt_uc_no_earned_income + | (exempt_under_25_uc_no_earned_income & (person("age", period) < 25)) + ) + ) + exempt = ( + claimant_exempt + | full_time_student + | (exempt_income_based_benefits & income_based_benefit) + | uc_exempt + ) + return working_age * where(exempt, 0.0, deduction) + + +def flat_non_dep_deduction(person, period, ctr, working_age): + deduction = ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + claimant_exempt = person.household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + full_time_student = is_full_time_student_non_dep(person, period) + return working_age * where(claimant_exempt | full_time_student, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/agent_handoff.md b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/agent_handoff.md new file mode 100644 index 000000000..b7f6d86a2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/agent_handoff.md @@ -0,0 +1,112 @@ +# CTR Agent Handoff + +Use this file to continue PR #1534 autonomously without needing thread context. + +## Drop-in prompt + +```text +Continue PolicyEngine UK PR #1534 from `policyengine_uk/variables/gov/local_authorities/council_tax_reduction/agent_handoff.md`. + +Follow `policyengine_uk/variables/gov/local_authorities/council_tax_reduction/scheme_encoding_guidance.md`. Work autonomously on branch `codex/ctr-framework`: encode more remaining Council Tax Reduction schemes in source-linked batches, using TDD, source review, focused verification, commits, and pushes. Stop only at a clean pushed checkpoint or a real blocker. +``` + +## Current checkpoint + +- PR: https://github.com/PolicyEngine/policyengine-uk/pull/1534 +- Branch: `codex/ctr-framework` +- Pull the latest PR branch before continuing; this checkpoint includes Bath and North East Somerset, Rushmoor, Hart, Maldon, Hartlepool, Hertsmere, East Hampshire, Brentwood, West Berkshire, Tendring, St Helens, Tewkesbury, Forest of Dean, and Braintree. +- Coverage at this checkpoint: `103` current English working-age billing authorities, plus the national Wales and Scotland CTR schemes. +- Last focused local verification: `uv run policyengine-core test policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml -n "Braintree"` passed with `12` tests in this worktree. +- Last full local verification: `uv run policyengine-core test policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml` passed with `986` tests after Braintree review fixes. +- Recent completed schemes: South Gloucestershire, Gloucester, Bath and North East Somerset, Rushmoor, Hart, Maldon, Hartlepool, Hertsmere, East Hampshire, Brentwood, West Berkshire, Tendring, St Helens, Tewkesbury, Forest of Dean, Braintree. + +Before continuing, pull the latest branch and inspect current status: + +```bash +git fetch origin +git status --short +git log --oneline -5 +gh pr checks 1534 --watch=false +``` + +If a push does not trigger new CI, check mergeability before assuming a workflow issue: + +```bash +gh pr view 1534 --json mergeStateStatus,mergeable +``` + +## Autonomous workflow + +For each council: + +- Prefer official council scheme PDFs, council webpages, committee papers, or legislation. +- If a current-year report says the scheme is unchanged, pair that current report with the carried-forward full scheme and cite both. +- Do not implement an income-banded scheme from headline summaries alone; if thresholds are missing, mark it source incomplete in `scheme_work_queue.md`. +- Add failing YAML tests first in `policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml`. +- For UC branches, add at least one positive UC-income regression with no source override: include a positive UC award, UC assessed earned or unearned income, and a different legacy CTR applicable income so the test proves the implementation is not using `would_claim_uc` or the UC award alone. +- For pension-age carve-outs, assert both the jurisdiction variable and `simulated_council_tax_reduction_benunit` so local-rule cases do not double-count the national pensioner scheme. Include a mixed-age couple test where the scheme keys off the applicant or partner rather than a household-wide pensioner flag. +- Keep implementation jurisdiction-scoped: + - Parameters: `policyengine_uk/parameters/gov/local_authorities//council_tax_reduction/` + - Variables: `policyengine_uk/variables/gov/local_authorities//council_tax_reduction/` +- Register the scheme in: + - `policyengine_uk/variables/gov/local_authorities/council_tax_reduction/config.py` + - `policyengine_uk/variables/gov/local_authorities/council_tax_reduction/simulated_council_tax_reduction_benunit.py` + - `policyengine_uk/variables/gov/local_authorities/council_tax_reduction/README.md` + - `policyengine_uk/variables/gov/local_authorities/council_tax_reduction/scheme_work_queue.md` + - `changelog.d/council-tax-reduction.added.md` +- Run a source-fidelity review pass after implementation. Fix findings before pushing. +- Commit and push each completed council or small batch. + +## Review traps + +Check these every time: + +- Actual UC award versus `would_claim_uc`. +- UC assessed income and capital where the source references DWP or UC calculations. Do not use the UC award alone unless the source explicitly says the award is the income base. +- Pre-deduction or pre-benefit-cap UC award where source requires it. +- UC earnings before allowances/work allowances versus `uc_earned_income` after allowances. If the source says before allowances, use or create a source input/proxy and test a work-allowance case. +- Capital boundary wording: `more than`, `at least`, `exceeds`, `does not exceed`, and exact threshold tests. +- Tariff income rounding: complete blocks versus complete-or-partial blocks. +- Minimum award cutoffs. +- Band caps and protected exceptions. +- Protected-group "who counts" scope. If the source says applicant, partner, or dependant, add a regression proving a disabled non-dependant does not uplift the claimant. +- Protected-group acronym mismatches, especially Armed Forces Independence Payment versus Armed Forces Compensation Scheme. Add a named-benefit regression when the variables are easy to confuse. +- Income-banded countable-income coverage. Add at least one source-countable non-earnings income regression, such as tax credits or contributory benefits, so the implementation is not accidentally earnings-only. +- Non-dependant deduction ordering, gross versus earned income, remunerative-work hours, and one-deduction couple rules. +- Do not add a 16-hour/remunerative-work gate to non-dependant earnings tables unless the non-dependant section itself says so. Some schemes define remunerative work for childcare only while applying non-dependant gross-income bands at any hours. +- Pension-age UC or income-based benefit local-rule carve-outs, including tests that avoid double-counting national pensioner CTR. +- Applicant/partner pension-age wording versus household-wide pensioner flags. A working-age applicant with a pension-age partner can still be in the local scheme even though `council_tax_reduction_household_has_pensioner` is true. +- Source conflicts between live pages, summaries, examples, and adopted scheme PDFs. Document conflicts in `scheme_work_queue.md`. + +## Verification before push + +Run these at minimum: + +```bash +uv run policyengine-core test policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml -c policyengine_uk +uvx ruff format +uvx ruff format --check +uv run ruff check policyengine_uk/variables/gov/local_authorities/council_tax_reduction/config.py policyengine_uk/variables/gov/local_authorities/council_tax_reduction/simulated_council_tax_reduction_benunit.py +uv run python - <<'PY' +from policyengine_uk import CountryTaxBenefitSystem +system = CountryTaxBenefitSystem() +print("import smoke ok", len(system.variables)) +PY +find policyengine_uk -type d -name __pycache__ -prune -exec rm -rf {} + +git diff --check +git status --short +``` + +After push: + +```bash +gh pr checks 1534 --watch=false +``` + +## Next candidates + +Use `scheme_work_queue.md` as the source of truth for remaining authorities and statuses. + +## Source-incomplete note + +Durham is currently marked source incomplete in `scheme_work_queue.md`: official sources confirm headline parameters but do not expose adopted income-band thresholds. Do not encode Durham until the current detailed threshold grid is available from a primary source. diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/benunit_contains_household_head.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/benunit_contains_household_head.py new file mode 100644 index 000000000..6a2d45c07 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/benunit_contains_household_head.py @@ -0,0 +1,15 @@ +from policyengine_uk.model_api import * + + +class benunit_contains_household_head(Variable): + value_type = bool + entity = BenUnit + label = "Benefit unit contains the oldest adult in the household" + definition_period = YEAR + + def formula(benunit, period, parameters): + person = benunit.members + household = person.household + benunit_max_age = benunit.max(person("age", period)) + household_max_age = benunit.max(household.max(person("age", period))) + return benunit_max_age == household_max_age diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/config.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/config.py new file mode 100644 index 000000000..a90157882 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/config.py @@ -0,0 +1,1162 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.household.demographic.country import Country +from policyengine_uk.variables.household.demographic.locations import ( + LocalAuthority, +) +from policyengine_uk.variables.input.council_tax_band import CouncilTaxBand + + +def is_adur(local_authority): + return local_authority == LocalAuthority.ADUR + + +def is_ashford(local_authority): + return local_authority == LocalAuthority.ASHFORD + + +def is_arun(local_authority): + return local_authority == LocalAuthority.ARUN + + +def is_babergh(local_authority): + return local_authority == LocalAuthority.BABERGH + + +def is_basingstoke_and_deane(local_authority): + return local_authority == LocalAuthority.BASINGSTOKE_AND_DEANE + + +def is_bath_and_north_east_somerset(local_authority): + return local_authority == LocalAuthority.BATH_AND_NORTH_EAST_SOMERSET + + +def is_bassetlaw(local_authority): + return local_authority == LocalAuthority.BASSETLAW + + +def is_basildon(local_authority): + return local_authority == LocalAuthority.BASILDON + + +def is_barking_and_dagenham(local_authority): + return local_authority == LocalAuthority.BARKING_AND_DAGENHAM + + +def is_barnet(local_authority): + return local_authority == LocalAuthority.BARNET + + +def is_dudley(local_authority): + return local_authority == LocalAuthority.DUDLEY + + +def is_braintree(local_authority): + return local_authority == LocalAuthority.BRAINTREE + + +def is_breckland(local_authority): + return local_authority == LocalAuthority.BRECKLAND + + +def is_brent(local_authority): + return local_authority == LocalAuthority.BRENT + + +def is_brentwood(local_authority): + return local_authority == LocalAuthority.BRENTWOOD + + +def is_bromley(local_authority): + return local_authority == LocalAuthority.BROMLEY + + +def is_bristol(local_authority): + return local_authority == LocalAuthority.BRISTOL + + +def is_bolton(local_authority): + return local_authority == LocalAuthority.BOLTON + + +def is_broadland(local_authority): + return local_authority == LocalAuthority.BROADLAND + + +def is_bury(local_authority): + return local_authority == LocalAuthority.BURY + + +def is_buckinghamshire(local_authority): + return local_authority == LocalAuthority.BUCKINGHAMSHIRE + + +def is_camden(local_authority): + return local_authority == LocalAuthority.CAMDEN + + +def is_chelmsford(local_authority): + return local_authority == LocalAuthority.CHELMSFORD + + +def is_cheltenham(local_authority): + return local_authority == LocalAuthority.CHELTENHAM + + +def is_cheshire_west_and_chester(local_authority): + return local_authority == LocalAuthority.CHESHIRE_WEST_AND_CHESTER + + +def is_chichester(local_authority): + return local_authority == LocalAuthority.CHICHESTER + + +def is_chesterfield(local_authority): + return local_authority == LocalAuthority.CHESTERFIELD + + +def is_colchester(local_authority): + return local_authority == LocalAuthority.COLCHESTER + + +def is_cotswold(local_authority): + return local_authority == LocalAuthority.COTSWOLD + + +def is_coventry(local_authority): + return local_authority == LocalAuthority.COVENTRY + + +def is_crawley(local_authority): + return local_authority == LocalAuthority.CRAWLEY + + +def is_croydon(local_authority): + return local_authority == LocalAuthority.CROYDON + + +def is_cumberland(local_authority): + return local_authority == LocalAuthority.CUMBERLAND + + +def is_dartford(local_authority): + return local_authority == LocalAuthority.DARTFORD + + +def is_derby(local_authority): + return local_authority == LocalAuthority.DERBY + + +def is_ealing(local_authority): + return local_authority == LocalAuthority.EALING + + +def is_enfield(local_authority): + return local_authority == LocalAuthority.ENFIELD + + +def is_east_hertfordshire(local_authority): + return local_authority == LocalAuthority.EAST_HERTFORDSHIRE + + +def is_east_cambridgeshire(local_authority): + return local_authority == LocalAuthority.EAST_CAMBRIDGESHIRE + + +def is_east_hampshire(local_authority): + return local_authority == LocalAuthority.EAST_HAMPSHIRE + + +def is_east_suffolk(local_authority): + return local_authority == LocalAuthority.EAST_SUFFOLK + + +def is_stevenage(local_authority): + return local_authority == LocalAuthority.STEVENAGE + + +def is_stroud(local_authority): + return local_authority == LocalAuthority.STROUD + + +def is_darlington(local_authority): + return local_authority == LocalAuthority.DARLINGTON + + +def is_gateshead(local_authority): + return local_authority == LocalAuthority.GATESHEAD + + +def is_greenwich(local_authority): + return local_authority == LocalAuthority.GREENWICH + + +def is_gloucester(local_authority): + return local_authority == LocalAuthority.GLOUCESTER + + +def is_haringey(local_authority): + return local_authority == LocalAuthority.HARINGEY + + +def is_harrow(local_authority): + return local_authority == LocalAuthority.HARROW + + +def is_hart(local_authority): + return local_authority == LocalAuthority.HART + + +def is_hartlepool(local_authority): + return local_authority == LocalAuthority.HARTLEPOOL + + +def is_hertsmere(local_authority): + return local_authority == LocalAuthority.HERTSMERE + + +def is_havering(local_authority): + return local_authority == LocalAuthority.HAVERING + + +def is_herefordshire(local_authority): + return local_authority == LocalAuthority.HEREFORDSHIRE + + +def is_hackney(local_authority): + return local_authority == LocalAuthority.HACKNEY + + +def is_hammersmith_and_fulham(local_authority): + return local_authority == LocalAuthority.HAMMERSMITH_AND_FULHAM + + +def is_hillingdon(local_authority): + return local_authority == LocalAuthority.HILLINGDON + + +def is_hounslow(local_authority): + return local_authority == LocalAuthority.HOUNSLOW + + +def is_ipswich(local_authority): + return local_authority == LocalAuthority.IPSWICH + + +def is_fenland(local_authority): + return local_authority == LocalAuthority.FENLAND + + +def is_forest_of_dean(local_authority): + return local_authority == LocalAuthority.FOREST_OF_DEAN + + +def is_kings_lynn_and_west_norfolk(local_authority): + return local_authority == LocalAuthority.KINGS_LYNN_AND_WEST_NORFOLK + + +def is_kingston_upon_hull(local_authority): + return (local_authority == LocalAuthority.KINGSTON_UPON_HULL) | ( + local_authority == LocalAuthority.KINGSTON_UPON_HULL_CITY_OF + ) + + +def is_kingston_upon_thames(local_authority): + return local_authority == LocalAuthority.KINGSTON_UPON_THAMES + + +def is_islington(local_authority): + return local_authority == LocalAuthority.ISLINGTON + + +def is_lambeth(local_authority): + return local_authority == LocalAuthority.LAMBETH + + +def is_lancaster(local_authority): + return local_authority == LocalAuthority.LANCASTER + + +def is_lewisham(local_authority): + return local_authority == LocalAuthority.LEWISHAM + + +def is_maldon(local_authority): + return local_authority == LocalAuthority.MALDON + + +def is_merton(local_authority): + return local_authority == LocalAuthority.MERTON + + +def is_mid_suffolk(local_authority): + return local_authority == LocalAuthority.MID_SUFFOLK + + +def is_newham(local_authority): + return local_authority == LocalAuthority.NEWHAM + + +def is_oldham(local_authority): + return local_authority == LocalAuthority.OLDHAM + + +def is_norwich(local_authority): + return local_authority == LocalAuthority.NORWICH + + +def is_north_norfolk(local_authority): + return local_authority == LocalAuthority.NORTH_NORFOLK + + +def is_north_northamptonshire(local_authority): + return local_authority == LocalAuthority.NORTH_NORTHAMPTONSHIRE + + +def is_north_yorkshire(local_authority): + return local_authority == LocalAuthority.NORTH_YORKSHIRE + + +def is_oxford(local_authority): + return local_authority == LocalAuthority.OXFORD + + +def is_plymouth(local_authority): + return local_authority == LocalAuthority.PLYMOUTH + + +def is_redbridge(local_authority): + return local_authority == LocalAuthority.REDBRIDGE + + +def is_rushmoor(local_authority): + return local_authority == LocalAuthority.RUSHMOOR + + +def is_southwark(local_authority): + return local_authority == LocalAuthority.SOUTHWARK + + +def is_somerset(local_authority): + return local_authority == LocalAuthority.SOMERSET + + +def is_slough(local_authority): + return local_authority == LocalAuthority.SLOUGH + + +def is_south_gloucestershire(local_authority): + return local_authority == LocalAuthority.SOUTH_GLOUCESTERSHIRE + + +def is_south_derbyshire(local_authority): + return local_authority == LocalAuthority.SOUTH_DERBYSHIRE + + +def is_south_norfolk(local_authority): + return local_authority == LocalAuthority.SOUTH_NORFOLK + + +def is_southend_on_sea(local_authority): + return local_authority == LocalAuthority.SOUTHEND_ON_SEA + + +def is_sefton(local_authority): + return local_authority == LocalAuthority.SEFTON + + +def is_st_albans(local_authority): + return local_authority == LocalAuthority.ST_ALBANS + + +def is_st_helens(local_authority): + return local_authority == LocalAuthority.ST_HELENS + + +def is_stockport(local_authority): + return local_authority == LocalAuthority.STOCKPORT + + +def is_tameside(local_authority): + return local_authority == LocalAuthority.TAMESIDE + + +def is_tendring(local_authority): + return local_authority == LocalAuthority.TENDRING + + +def is_tewkesbury(local_authority): + return local_authority == LocalAuthority.TEWKESBURY + + +def is_thurrock(local_authority): + return local_authority == LocalAuthority.THURROCK + + +def is_warrington(local_authority): + return local_authority == LocalAuthority.WARRINGTON + + +def is_wakefield(local_authority): + return local_authority == LocalAuthority.WAKEFIELD + + +def is_west_berkshire(local_authority): + return local_authority == LocalAuthority.WEST_BERKSHIRE + + +def is_west_suffolk(local_authority): + return local_authority == LocalAuthority.WEST_SUFFOLK + + +def is_westmorland_and_furness(local_authority): + return local_authority == LocalAuthority.WESTMORLAND_AND_FURNESS + + +def is_west_northamptonshire(local_authority): + return local_authority == LocalAuthority.WEST_NORTHAMPTONSHIRE + + +def is_westminster(local_authority): + return local_authority == LocalAuthority.WESTMINSTER + + +def is_worthing(local_authority): + return local_authority == LocalAuthority.WORTHING + + +def is_england_pensioner_scheme(country, has_pensioner): + return (country == Country.ENGLAND) & has_pensioner + + +def is_scotland_scheme(country): + return country == Country.SCOTLAND + + +def is_wales_scheme(country): + return country == Country.WALES + + +def is_east_hertfordshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_east_hertfordshire(local_authority) + ) + + +def is_east_cambridgeshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_east_cambridgeshire(local_authority) + ) + + +def is_east_hampshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_east_hampshire(local_authority) + ) + + +def is_east_suffolk_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_east_suffolk(local_authority) + ) + + +def is_adur_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_adur(local_authority) + + +def is_ashford_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_ashford(local_authority) + + +def is_arun_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_arun(local_authority) + + +def is_basingstoke_and_deane_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_basingstoke_and_deane(local_authority) + ) + + +def is_bath_and_north_east_somerset_working_age( + local_authority, country, has_pensioner +): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_bath_and_north_east_somerset(local_authority) + ) + + +def is_bassetlaw_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_bassetlaw(local_authority) + + +def is_basildon_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_basildon(local_authority) + + +def is_barking_and_dagenham_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_barking_and_dagenham(local_authority) + ) + + +def is_barnet_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_barnet(local_authority) + + +def is_babergh_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_babergh(local_authority) + + +def is_braintree_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_braintree(local_authority) + + +def is_breckland_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_breckland(local_authority) + + +def is_brent_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_brent(local_authority) + + +def is_brentwood_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_brentwood(local_authority) + + +def is_bromley_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_bromley(local_authority) + + +def is_bristol_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_bristol(local_authority) + + +def is_bolton_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_bolton(local_authority) + + +def is_broadland_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_broadland(local_authority) + + +def is_bury_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_bury(local_authority) + + +def is_buckinghamshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_buckinghamshire(local_authority) + ) + + +def is_camden_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_camden(local_authority) + + +def is_chelmsford_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_chelmsford(local_authority) + ) + + +def is_cheltenham_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_cheltenham(local_authority) + ) + + +def is_cheshire_west_and_chester_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_cheshire_west_and_chester(local_authority) + ) + + +def is_chichester_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_chichester(local_authority) + ) + + +def is_chesterfield_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_chesterfield(local_authority) + ) + + +def is_colchester_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_colchester(local_authority) + ) + + +def is_cotswold_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_cotswold(local_authority) + + +def is_coventry_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_coventry(local_authority) + + +def is_crawley_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_crawley(local_authority) + + +def is_croydon_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_croydon(local_authority) + + +def is_cumberland_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_cumberland(local_authority) + ) + + +def is_dartford_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_dartford(local_authority) + + +def is_derby_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_derby(local_authority) + + +def is_ealing_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_ealing(local_authority) + + +def is_enfield_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_enfield(local_authority) + + +def is_stevenage_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_stevenage(local_authority) + + +def is_stroud_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_stroud(local_authority) + + +def is_darlington_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_darlington(local_authority) + ) + + +def is_gateshead_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_gateshead(local_authority) + + +def is_greenwich_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_greenwich(local_authority) + + +def is_gloucester_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_gloucester(local_authority) + ) + + +def is_haringey_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_haringey(local_authority) + + +def is_harrow_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_harrow(local_authority) + + +def is_hart_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_hart(local_authority) + + +def is_hartlepool_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_hartlepool(local_authority) + ) + + +def is_hertsmere_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_hertsmere(local_authority) + + +def is_havering_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_havering(local_authority) + + +def is_herefordshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_herefordshire(local_authority) + ) + + +def is_hackney_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_hackney(local_authority) + + +def is_hammersmith_and_fulham_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_hammersmith_and_fulham(local_authority) + ) + + +def is_hillingdon_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_hillingdon(local_authority) + ) + + +def is_hounslow_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_hounslow(local_authority) + + +def is_ipswich_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_ipswich(local_authority) + + +def is_fenland_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_fenland(local_authority) + + +def is_forest_of_dean_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_forest_of_dean(local_authority) + ) + + +def is_kings_lynn_and_west_norfolk_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_kings_lynn_and_west_norfolk(local_authority) + ) + + +def is_kingston_upon_hull_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_kingston_upon_hull(local_authority) + ) + + +def is_kingston_upon_thames_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_kingston_upon_thames(local_authority) + ) + + +def is_islington_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_islington(local_authority) + + +def is_lambeth_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_lambeth(local_authority) + + +def is_lancaster_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_lancaster(local_authority) + + +def is_lewisham_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_lewisham(local_authority) + + +def is_maldon_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_maldon(local_authority) + + +def is_merton_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_merton(local_authority) + + +def is_mid_suffolk_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_mid_suffolk(local_authority) + ) + + +def is_newham_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_newham(local_authority) + + +def is_oldham_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_oldham(local_authority) + + +def is_norwich_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_norwich(local_authority) + + +def is_north_norfolk_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_north_norfolk(local_authority) + ) + + +def is_north_northamptonshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_north_northamptonshire(local_authority) + ) + + +def is_north_yorkshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_north_yorkshire(local_authority) + ) + + +def is_oxford_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_oxford(local_authority) + + +def is_plymouth_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_plymouth(local_authority) + + +def is_redbridge_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_redbridge(local_authority) + + +def is_rushmoor_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_rushmoor(local_authority) + + +def is_southwark_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_southwark(local_authority) + + +def is_somerset_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_somerset(local_authority) + + +def is_slough_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_slough(local_authority) + + +def is_south_gloucestershire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_south_gloucestershire(local_authority) + ) + + +def is_south_derbyshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_south_derbyshire(local_authority) + ) + + +def is_south_norfolk_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_south_norfolk(local_authority) + ) + + +def is_southend_on_sea_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_southend_on_sea(local_authority) + ) + + +def is_sefton_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_sefton(local_authority) + + +def is_st_albans_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_st_albans(local_authority) + + +def is_st_helens_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_st_helens(local_authority) + + +def is_stockport_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_stockport(local_authority) + + +def is_tameside_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_tameside(local_authority) + + +def is_tendring_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_tendring(local_authority) + + +def is_tewkesbury_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_tewkesbury(local_authority) + ) + + +def is_thurrock_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_thurrock(local_authority) + + +def is_warrington_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_warrington(local_authority) + ) + + +def is_wakefield_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_wakefield(local_authority) + + +def is_west_berkshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_west_berkshire(local_authority) + ) + + +def is_west_suffolk_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_west_suffolk(local_authority) + ) + + +def is_westmorland_and_furness_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_westmorland_and_furness(local_authority) + ) + + +def is_west_northamptonshire_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) + & ~has_pensioner + & is_west_northamptonshire(local_authority) + ) + + +def is_westminster_working_age(local_authority, country, has_pensioner): + return ( + (country == Country.ENGLAND) & ~has_pensioner & is_westminster(local_authority) + ) + + +def is_worthing_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_worthing(local_authority) + + +def is_supported_scheme(local_authority, country, has_pensioner): + return ( + is_england_pensioner_scheme(country, has_pensioner) + | is_scotland_scheme(country) + | is_wales_scheme(country) + | is_adur_working_age(local_authority, country, has_pensioner) + | is_ashford_working_age(local_authority, country, has_pensioner) + | is_arun_working_age(local_authority, country, has_pensioner) + | is_babergh_working_age(local_authority, country, has_pensioner) + | is_basingstoke_and_deane_working_age( + local_authority, + country, + has_pensioner, + ) + | is_bath_and_north_east_somerset_working_age( + local_authority, + country, + has_pensioner, + ) + | is_bassetlaw_working_age(local_authority, country, has_pensioner) + | is_basildon_working_age(local_authority, country, has_pensioner) + | is_barking_and_dagenham_working_age( + local_authority, + country, + has_pensioner, + ) + | is_barnet_working_age(local_authority, country, has_pensioner) + | is_bolton_working_age(local_authority, country, has_pensioner) + | is_braintree_working_age(local_authority, country, has_pensioner) + | is_breckland_working_age(local_authority, country, has_pensioner) + | is_brent_working_age(local_authority, country, has_pensioner) + | is_brentwood_working_age(local_authority, country, has_pensioner) + | is_bromley_working_age(local_authority, country, has_pensioner) + | is_bristol_working_age(local_authority, country, has_pensioner) + | is_broadland_working_age(local_authority, country, has_pensioner) + | is_bury_working_age(local_authority, country, has_pensioner) + | is_buckinghamshire_working_age(local_authority, country, has_pensioner) + | is_camden_working_age(local_authority, country, has_pensioner) + | is_chelmsford_working_age(local_authority, country, has_pensioner) + | is_cheltenham_working_age(local_authority, country, has_pensioner) + | is_cheshire_west_and_chester_working_age( + local_authority, country, has_pensioner + ) + | is_chichester_working_age(local_authority, country, has_pensioner) + | is_chesterfield_working_age(local_authority, country, has_pensioner) + | is_colchester_working_age(local_authority, country, has_pensioner) + | is_cotswold_working_age(local_authority, country, has_pensioner) + | is_coventry_working_age(local_authority, country, has_pensioner) + | is_crawley_working_age(local_authority, country, has_pensioner) + | is_croydon_working_age(local_authority, country, has_pensioner) + | is_cumberland_working_age(local_authority, country, has_pensioner) + | is_dartford_working_age(local_authority, country, has_pensioner) + | is_derby_working_age(local_authority, country, has_pensioner) + | is_ealing_working_age(local_authority, country, has_pensioner) + | is_enfield_working_age(local_authority, country, has_pensioner) + | is_east_cambridgeshire_working_age( + local_authority, + country, + has_pensioner, + ) + | is_east_hampshire_working_age(local_authority, country, has_pensioner) + | is_east_hertfordshire_working_age( + local_authority, + country, + has_pensioner, + ) + | is_east_suffolk_working_age(local_authority, country, has_pensioner) + | is_fenland_working_age(local_authority, country, has_pensioner) + | is_forest_of_dean_working_age(local_authority, country, has_pensioner) + | is_stevenage_working_age(local_authority, country, has_pensioner) + | is_stroud_working_age(local_authority, country, has_pensioner) + | is_darlington_working_age(local_authority, country, has_pensioner) + | is_gateshead_working_age(local_authority, country, has_pensioner) + | is_greenwich_working_age(local_authority, country, has_pensioner) + | is_gloucester_working_age(local_authority, country, has_pensioner) + | is_haringey_working_age(local_authority, country, has_pensioner) + | is_harrow_working_age(local_authority, country, has_pensioner) + | is_hart_working_age(local_authority, country, has_pensioner) + | is_hartlepool_working_age(local_authority, country, has_pensioner) + | is_hertsmere_working_age(local_authority, country, has_pensioner) + | is_havering_working_age(local_authority, country, has_pensioner) + | is_herefordshire_working_age(local_authority, country, has_pensioner) + | is_hackney_working_age(local_authority, country, has_pensioner) + | is_hammersmith_and_fulham_working_age( + local_authority, + country, + has_pensioner, + ) + | is_hillingdon_working_age(local_authority, country, has_pensioner) + | is_hounslow_working_age(local_authority, country, has_pensioner) + | is_ipswich_working_age(local_authority, country, has_pensioner) + | is_kings_lynn_and_west_norfolk_working_age( + local_authority, + country, + has_pensioner, + ) + | is_kingston_upon_hull_working_age( + local_authority, + country, + has_pensioner, + ) + | is_kingston_upon_thames_working_age( + local_authority, + country, + has_pensioner, + ) + | is_islington_working_age(local_authority, country, has_pensioner) + | is_lambeth_working_age(local_authority, country, has_pensioner) + | is_lancaster_working_age(local_authority, country, has_pensioner) + | is_lewisham_working_age(local_authority, country, has_pensioner) + | is_maldon_working_age(local_authority, country, has_pensioner) + | is_merton_working_age(local_authority, country, has_pensioner) + | is_mid_suffolk_working_age(local_authority, country, has_pensioner) + | is_newham_working_age(local_authority, country, has_pensioner) + | is_oldham_working_age(local_authority, country, has_pensioner) + | is_norwich_working_age(local_authority, country, has_pensioner) + | is_north_norfolk_working_age(local_authority, country, has_pensioner) + | is_north_northamptonshire_working_age(local_authority, country, has_pensioner) + | is_north_yorkshire_working_age(local_authority, country, has_pensioner) + | is_oxford_working_age(local_authority, country, has_pensioner) + | is_plymouth_working_age(local_authority, country, has_pensioner) + | is_redbridge_working_age(local_authority, country, has_pensioner) + | is_rushmoor_working_age(local_authority, country, has_pensioner) + | is_sefton_working_age(local_authority, country, has_pensioner) + | is_somerset_working_age(local_authority, country, has_pensioner) + | is_slough_working_age(local_authority, country, has_pensioner) + | is_south_gloucestershire_working_age(local_authority, country, has_pensioner) + | is_south_derbyshire_working_age(local_authority, country, has_pensioner) + | is_south_norfolk_working_age(local_authority, country, has_pensioner) + | is_southend_on_sea_working_age(local_authority, country, has_pensioner) + | is_southwark_working_age(local_authority, country, has_pensioner) + | is_st_albans_working_age(local_authority, country, has_pensioner) + | is_st_helens_working_age(local_authority, country, has_pensioner) + | is_stockport_working_age(local_authority, country, has_pensioner) + | is_tameside_working_age(local_authority, country, has_pensioner) + | is_tendring_working_age(local_authority, country, has_pensioner) + | is_tewkesbury_working_age(local_authority, country, has_pensioner) + | is_thurrock_working_age(local_authority, country, has_pensioner) + | is_warrington_working_age(local_authority, country, has_pensioner) + | is_wakefield_working_age(local_authority, country, has_pensioner) + | is_west_berkshire_working_age(local_authority, country, has_pensioner) + | is_west_suffolk_working_age(local_authority, country, has_pensioner) + | is_westmorland_and_furness_working_age( + local_authority, country, has_pensioner + ) + | is_west_northamptonshire_working_age(local_authority, country, has_pensioner) + | is_westminster_working_age(local_authority, country, has_pensioner) + | is_worthing_working_age(local_authority, country, has_pensioner) + | is_dudley_working_age(local_authority, country, has_pensioner) + ) + + +def is_dudley_working_age(local_authority, country, has_pensioner): + return (country == Country.ENGLAND) & ~has_pensioner & is_dudley(local_authority) + + +def english_council_tax_band_ratio(council_tax_band, band_ratios): + return select( + [ + council_tax_band == CouncilTaxBand.A, + council_tax_band == CouncilTaxBand.B, + council_tax_band == CouncilTaxBand.C, + council_tax_band == CouncilTaxBand.D, + council_tax_band == CouncilTaxBand.E, + council_tax_band == CouncilTaxBand.F, + council_tax_band == CouncilTaxBand.G, + council_tax_band == CouncilTaxBand.H, + council_tax_band == CouncilTaxBand.I, + ], + [ + band_ratios.A, + band_ratios.B, + band_ratios.C, + band_ratios.D, + band_ratios.E, + band_ratios.F, + band_ratios.G, + band_ratios.H, + band_ratios.I, + ], + default=band_ratios.D, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction.py new file mode 100644 index 000000000..90922d959 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction(Variable): + value_type = float + entity = Household + label = "Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + person = household.members + return household.sum( + person.benunit("council_tax_benefit", period) + * person("is_benunit_head", period) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py new file mode 100644 index 000000000..c09642958 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py @@ -0,0 +1,45 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_applicable_amount(Variable): + value_type = float + entity = BenUnit + label = "applicable Council Tax Reduction amount" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + p = parameters(period).gov.dwp.housing_benefit.allowances + any_over_SP_age = benunit.any(benunit.members("is_SP_age", period)) + eldest_age = benunit("eldest_adult_age", period) + older_age_threshold = p.age_threshold.older + younger_age_threshold = p.age_threshold.younger + u_18 = eldest_age < younger_age_threshold + u_25 = eldest_age < older_age_threshold + o_25 = (eldest_age >= older_age_threshold) & ~any_over_SP_age + o_18 = (eldest_age >= younger_age_threshold) & ~any_over_SP_age + single = benunit("is_single_person", period) + couple = benunit("is_couple", period) + lone_parent = benunit("is_lone_parent", period) + single_personal_allowance = ( + u_25 * p.single.younger + + o_25 * p.single.older + + any_over_SP_age * p.single.aged + ) + couple_personal_allowance = ( + u_18 * p.couple.younger + + o_18 * p.couple.older + + any_over_SP_age * p.couple.aged + ) + lone_parent_personal_allowance = ( + u_18 * p.lone_parent.younger + + o_18 * p.lone_parent.older + + any_over_SP_age * p.lone_parent.aged + ) + personal_allowance = ( + single * single_personal_allowance + + couple * couple_personal_allowance + + lone_parent * lone_parent_personal_allowance + ) * WEEKS_IN_YEAR + premiums = benunit("benefits_premiums", period) + return personal_allowance + premiums 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 new file mode 100644 index 000000000..abf551dbe --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_income.py @@ -0,0 +1,47 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "relevant income for Council Tax Reduction means test" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + BENUNIT_MEANS_TESTED_BENEFITS = [ + "child_benefit", + "income_support", + "jsa_income", + "esa_income", + "universal_credit", + ] + PERSONAL_BENEFITS = [ + "carers_allowance", + "esa_contrib", + "jsa_contrib", + "state_pension", + "maternity_allowance", + "statutory_sick_pay", + "statutory_maternity_pay", + "ssmg", + ] + INCOME_COMPONENTS = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + ] + bi = parameters(period).gov.contrib.ubi_center.basic_income + benefits = add(benunit, period, BENUNIT_MEANS_TESTED_BENEFITS) + income = add(benunit, period, INCOME_COMPONENTS) + personal_benefits = add(benunit, period, PERSONAL_BENEFITS) + credits = add(benunit, period, ["tax_credits"]) + increased_income = income + personal_benefits + credits + benefits + + if not bi.interactions.include_in_means_tests: + increased_income -= add(benunit, period, ["basic_income"]) + + pension_contributions = add(benunit, period, ["pension_contributions"]) * 0.5 + tax = add(benunit, period, ["income_tax", "national_insurance"]) + return max_(0, increased_income - tax - pension_contributions) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_claimant_has_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_claimant_has_non_dep_exemption.py new file mode 100644 index 000000000..27ecca3be --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_claimant_has_non_dep_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_claimant_has_non_dep_exemption(Variable): + value_type = bool + entity = BenUnit + label = "CTR claimant has Dudley non-dependant deduction exemption" + definition_period = YEAR + + def formula(benunit, period, parameters): + pip_daily_living = benunit.any(benunit.members("pip_dl", period) > 0) + dla_care = benunit.any(benunit.members("dla_sc", period) > 0) + return pip_daily_living | dla_care diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_household_has_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_household_has_non_dep_exemption.py new file mode 100644 index 000000000..7f05aaf32 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_household_has_non_dep_exemption.py @@ -0,0 +1,22 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_household_has_non_dep_exemption(Variable): + value_type = bool + entity = Household + label = "CTR household has a non-dependant deduction exemption" + definition_period = YEAR + + def formula(household, period, parameters): + person = household.members + claimant_benunit = person.benunit("benunit_contains_household_head", period) + claimant_or_partner = claimant_benunit & person("is_adult", period) + is_blind = person("is_blind", period) & claimant_or_partner + attendance_allowance = ( + person("attendance_allowance", period) > 0 + ) & claimant_or_partner + pip_daily_living = (person("pip_dl", period) > 0) & claimant_or_partner + dla_care = (person("dla_sc", period) > 0) & claimant_or_partner + return household.any( + is_blind | attendance_allowance | pip_daily_living | dla_care + ) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_household_has_pensioner.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_household_has_pensioner.py new file mode 100644 index 000000000..555231a5a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_household_has_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_household_has_pensioner(Variable): + value_type = bool + entity = Household + label = "CTR claimant benefit unit has a pension-age member" + definition_period = YEAR + + def formula(household, period, parameters): + person = household.members + claimant_benunit = person.benunit("benunit_contains_household_head", period) + return household.any(claimant_benunit & person("is_SP_age", period)) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_income_below_applicable_amount.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_income_below_applicable_amount.py new file mode 100644 index 000000000..e4246a4c8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_income_below_applicable_amount.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_income_below_applicable_amount(Variable): + value_type = bool + entity = BenUnit + label = "CTR applicable income is at or below the applicable amount" + definition_period = YEAR + + def formula(benunit, period, parameters): + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + applicable_income = benunit("council_tax_reduction_applicable_income", period) + return applicable_income <= applicable_amount diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..102c093f6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,15 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + p = parameters(period).gov.dwp.housing_benefit.non_dep_deduction + weekly_total_income = person("total_income", period) / WEEKS_IN_YEAR + return p.amount.calc(weekly_total_income, right=True) * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction_eligible.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction_eligible.py new file mode 100644 index 000000000..36cb046b4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_individual_non_dep_deduction_eligible.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_individual_non_dep_deduction_eligible(Variable): + value_type = bool + entity = Person + label = "eligible person for CTR non-dependent deduction" + definition_period = YEAR + + def formula(person, period, parameters): + return (person("age", period) >= 18) & ~person.benunit( + "benunit_contains_household_head", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..191e0eebc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,69 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_bury_working_age, + is_warrington_working_age, + is_dudley_working_age, + is_stockport_working_age, +) + + +class council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + local_authority = household("local_authority", period) + country = household("country", period) + has_pensioner = household( + "council_tax_reduction_household_has_pensioner", period + ) + dudley_working_age = is_dudley_working_age( + local_authority, + country, + has_pensioner, + ) + warrington_working_age = is_warrington_working_age( + local_authority, + country, + has_pensioner, + ) + stockport_working_age = is_stockport_working_age( + local_authority, + country, + has_pensioner, + ) + bury_working_age = is_bury_working_age( + local_authority, + country, + has_pensioner, + ) + return select( + [ + bury_working_age, + dudley_working_age, + warrington_working_age, + stockport_working_age, + ], + [ + household( + "bury_council_tax_reduction_maximum_eligible_liability", + period, + ), + household( + "dudley_council_tax_reduction_maximum_eligible_liability", + period, + ), + household( + "warrington_council_tax_reduction_maximum_eligible_liability", + period, + ), + household( + "stockport_council_tax_reduction_maximum_eligible_liability", + period, + ), + ], + default=household("council_tax", period), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..c6b5fc1d8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,17 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + deductions = benunit.members( + "council_tax_reduction_individual_non_dep_deduction", period + ) + deductions_in_household = benunit.max(benunit.members.household.sum(deductions)) + deductions_in_benunit = benunit.sum(deductions) + return deductions_in_household - deductions_in_benunit diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_relevant_income_based_benefit.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_relevant_income_based_benefit.py new file mode 100644 index 000000000..74df5864f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_relevant_income_based_benefit.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_relevant_income_based_benefit(Variable): + value_type = bool + entity = BenUnit + label = "CTR claimant has an income-based passporting benefit" + definition_period = YEAR + + def formula(benunit, period, parameters): + return add(benunit, period, ["income_support", "jsa_income", "esa_income"]) > 0 diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_scheme_supported.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_scheme_supported.py new file mode 100644 index 000000000..e31d2acdf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_scheme_supported.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_supported_scheme, +) + + +class council_tax_reduction_scheme_supported(Variable): + value_type = bool + entity = Household + label = "Supported CTR scheme is available" + definition_period = YEAR + + def formula(household, period, parameters): + local_authority = household("local_authority", period) + country = household("country", period) + has_pensioner = household( + "council_tax_reduction_household_has_pensioner", period + ) + return is_supported_scheme(local_authority, country, has_pensioner) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/scheme_encoding_guidance.md b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/scheme_encoding_guidance.md new file mode 100644 index 000000000..997566cac --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/scheme_encoding_guidance.md @@ -0,0 +1,59 @@ +# CTR Scheme Encoding Guidance + +Use this file for durable Council Tax Reduction implementation rules. Keep `agent_handoff.md` focused on the current PR checkpoint and copy-paste prompts. + +## Source Standard + +- Prefer official council scheme PDFs, council webpages, committee papers, or legislation. +- If a current-year report says the scheme is unchanged, pair that current report with the carried-forward full scheme and cite both. +- Do not implement an income-banded scheme from headline summaries alone; if thresholds are missing, mark it source incomplete in `scheme_work_queue.md`. +- Before writing tests, extract a source-facts table covering authority, scheme year, URLs, paragraph/page refs, archetype, maximum support/bands, taper, capital boundary wording, band cap, income basis, earnings disregards, pension-contribution treatment, UC treatment, non-dependants, who counts, pension-age carve-outs, and limitations. + +## TDD And Implementation + +- Add failing YAML tests first in `policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml`. +- Cover no-income maximum award, capital boundary, non-dependant case if present, UC case if the source mentions UC, and one source-specific edge. +- If the source contains multiple current working-age branches, such as a separate UC class or protected-group maximum, implement and test those branches before marking the scheme implemented. +- For income-banded schemes, add at least one test for source earnings disregards or pension-contribution deductions when present, and one test that dependent children or non-dependants do not drive applicant/partner income bands unless the source says they do. +- For income-banded schemes, add one non-earnings-income regression using a source-countable benefit or tax credit where the source counts income other than earnings. This catches formulas that accidentally model earnings-only bands. +- For protected-group uplifts, add a "who counts" regression when the source says applicant/partner/dependants. A non-dependant's disability or benefit status must not uplift the claimant unless the source explicitly includes non-dependants. +- For protected-group uplifts, test any source-listed benefit names that have easy-to-confuse PolicyEngine variables, such as Armed Forces Independence Payment versus Armed Forces Compensation Scheme. +- For UC branches, add at least one positive UC-income regression with no source override: include a positive UC award, UC assessed earned or unearned income, and a different legacy CTR applicable income so the test proves the implementation is not using `would_claim_uc` or the UC award alone. +- If the source has UC maximum-amount, UC income, or UC capital paragraphs, add regressions that would fail under the generic legacy helper. +- For pension-age carve-outs, assert both the jurisdiction variable and `simulated_council_tax_reduction_benunit` so local-rule cases do not double-count the national pensioner scheme. +- Keep implementation jurisdiction-scoped under `policyengine_uk/parameters/gov/local_authorities//council_tax_reduction/` and `policyengine_uk/variables/gov/local_authorities//council_tax_reduction/`. +- Use separate jurisdiction-specific variables even if formulas duplicate another council. +- Do not leave `uv.lock`, `__pycache__`, generated files, or unrelated edits in the diff. + +## Review Traps + +- Actual UC award versus `would_claim_uc`. +- UC assessed income and capital where the source references DWP or UC calculations. +- UC earnings before allowances/work allowances versus `uc_earned_income` after allowances. +- Capital boundary wording: `more than`, `at least`, `exceeds`, `does not exceed`, and exact threshold tests. +- Band caps and protected exceptions. +- Income-banded schemes: net earnings deductions, standard earnings disregards, half versus full pension-contribution deductions, and whether dependent-child or non-dependant income is excluded from applicant/partner income. +- Income-banded schemes: do not stop at earnings. If the source's income rules include benefits, tax credits, pensions, or other non-earnings income subject to disregards, encode and test at least one countable non-earnings income source. +- Protected-group schemes: scope disability/benefit tests to the people named in the source. Avoid household-wide aggregation when the source says applicant, partner, or dependant. +- Non-dependant deduction ordering, gross versus earned income, remunerative-work hours, and one-deduction couple rules. +- Do not add a 16-hour/remunerative-work gate to non-dependant earnings tables unless the non-dependant section itself says so. +- Pension-age UC or income-based benefit local-rule carve-outs, including tests that avoid double-counting national pensioner CTR. +- Default-style formal PDFs often define the council's local scheme in section 1.6/Class D/E as including pension-age applicants on UC or relevant income-based benefits. If present, create a jurisdiction-scoped `*_is_local_scheme` variable and exclude that flag from `england_pensioners`. +- Source conflicts between live pages, summaries, examples, and adopted scheme PDFs. Document conflicts in `scheme_work_queue.md`. + +## Verification Before Push + +```bash +uv run policyengine-core test policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml +uvx ruff format +uvx ruff format --check +uv run ruff check policyengine_uk/variables/gov/local_authorities/council_tax_reduction/config.py policyengine_uk/variables/gov/local_authorities/council_tax_reduction/simulated_council_tax_reduction_benunit.py +uv run python - <<'PY' +from policyengine_uk import CountryTaxBenefitSystem +system = CountryTaxBenefitSystem() +print("import smoke ok", len(system.variables)) +PY +find policyengine_uk -type d -name __pycache__ -prune -exec rm -rf {} + +git diff --check +git status --short +``` diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/scheme_work_queue.md b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/scheme_work_queue.md new file mode 100644 index 000000000..7334da6c1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/scheme_work_queue.md @@ -0,0 +1,137 @@ +# Council Tax Reduction Scheme Work Queue + +Use this file to coordinate batched CTR implementation inside PolicyEngine UK. + +For a minimal autonomous Codex handoff prompt, see `agent_handoff.md`. + +## Coverage Target + +- England has `296` billing authorities in the 2026/27 MHCLG Council Tax tables. England pensioner CTR is national; the remaining implementation surface is working-age local schemes. +- This PR currently supports `96` current English working-age billing authorities, plus the national Wales and Scotland CTR schemes. +- Current 2026/27 billing-authority enum gaps identified from MHCLG Table 9 and added in this PR: Bristol, Cumberland, Durham, Herefordshire, Kingston upon Hull, North Northamptonshire, North Yorkshire, Somerset, West Northamptonshire, and Westmorland and Furness. +- Source for the billing-authority inventory: https://www.gov.uk/government/statistics/council-tax-levels-set-by-local-authorities-in-england-2026-to-2027 + +## Batch Rules + +- Each council keeps variables under `policyengine_uk/variables/gov/local_authorities//council_tax_reduction/`. +- Each council keeps parameters under `policyengine_uk/parameters/gov/local_authorities//council_tax_reduction/`. +- Prefer primary official council pages, committee papers, or scheme PDFs. +- Add at least one base-award test and one non-dependant, capital, or band-cap test where the scheme has that feature. +- Defer broad income-banded and discount-grid schemes until they have separate helpers. +- Non-dependant couple/polygamous one-deduction aggregation is supported for benefit-unit couples by counting the highest deduction for the non-dependant benefit unit, based on joint benefit-unit earnings where the scheme uses earnings brackets. Where the source excludes Universal Credit awards from that one-deduction rule, set `one_deduction_for_uc_couples=False`. +- For UC branches that reference DWP-assessed income, do not use the UC award alone. Add a no-source-override regression that includes UC assessed earnings and UC other income, and subtract only the UC elements that the source says to disregard. If the source says earnings before earnings allowances/work allowances, use a pre-work-allowance earnings proxy rather than `uc_earned_income`. +- For pension-age UC or income-based-benefit carve-outs, add tests that distinguish single pension-age claimants from mixed-age couples according to the source wording, and assert `simulated_council_tax_reduction_benunit` to catch national pensioner/local double counting. Do not collapse applicant/partner wording into a household-wide pensioner flag. +- For non-dependant gross-income tables, do not add a 16-hour/remunerative-work gate unless the non-dependant section itself says to use one. Some scheme definitions of remunerative work apply only to childcare or earnings disregards, while non-dependant deductions use gross income at any hours. + +## Batch Agent Workflow + +Use three separate passes for large batches: + +- Scout: find official sources, extract page/paragraph-cited facts, and classify the scheme archetype. Do not code in this pass. +- Implementer: write failing YAML tests first, then jurisdiction-scoped parameters and variables. Work from the Scout dossier rather than re-interpreting the whole source. +- Reviewer: compare source wording to tests/code and report only source-fidelity, missing-test, or maintainability findings. + +Each council dossier should capture: + +| Field | Notes | +| --- | --- | +| Source | Official council PDF/webpage or legislation, scheme year, retrieved date, paragraph/page refs. | +| Archetype | Legacy means test, percent/minimum-payment, income banded, UC earnings banded, band cap, or custom. | +| Core rules | Maximum support, taper, capital limit, band cap, UC treatment, non-dependant table, pensioner carve-out. | +| Tests | No-income maximum award, capital cutoff, non-dep case, UC case if relevant, and one local edge. | +| Review traps | Weekly vs annual units, gross vs earned income, positive earnings vs remunerative work, UC couple exceptions. | + +## Current Batch + +| Authority | Status | Type | Primary source | +| --- | --- | --- | --- | +| Bolton | Implemented | Legacy percent with earnings-bracket non-dependant deductions | https://www.bolton.gov.uk/downloads/file/745/bolton-council-tax-reduction-scheme | +| Lancaster | Implemented | Legacy full support with earnings-bracket non-dependant deductions | https://www.lancaster.gov.uk/assets/attach/14831/lancaster-city-council-2025-26-council-tax-support-scheme.pdf | +| Oldham | Implemented | Legacy percent with Band A cap and earnings-bracket non-dependant deductions | https://www.oldham.gov.uk/download/downloads/id/2632/council_tax_reduction_scheme_2025-26.pdf | +| Basingstoke and Deane | Implemented | Legacy full support with 2026/27 earnings-bracket non-dependant deductions | https://www.basingstoke.gov.uk/content/page/77332/Basingstoke%20S13A%202026%20Scheme%20Final.pdf | +| Crawley | Implemented | Legacy full support with `GBP 9,000` capital limit and local non-dependant schedule | https://crawley.gov.uk/sites/default/files/2025-02/Council%20Tax%20Reduction%20scheme%202025%20to%202026.pdf | +| St Albans | Implemented | Legacy full support plus Universal Credit earnings-band contribution table | https://www.stalbans.gov.uk/sites/default/files/attachments/St%20Albans%20S13A%20202526%20Final.pdf | +| Adur | Implemented | Legacy full support with 2026/27 earnings-bracket non-dependant deductions | https://www.adur-worthing.gov.uk/media/Media,174007,smxx.pdf | +| Worthing | Implemented | Legacy full support with 2026/27 earnings-bracket non-dependant deductions | https://www.adur-worthing.gov.uk/media/Media,174008,smxx.pdf | +| Sefton | Implemented | Legacy 84 percent with `GBP 6,000` capital limit and remunerative-work non-dependant table | https://www.sefton.gov.uk/media/occbaemk/ctr-scheme-2026-27.pdf | +| Oxford | Implemented | Weekly income-banded support with local non-dependant table | https://www.oxford.gov.uk/council-tax-reduction/council-tax-reduction-scheme-2026-27 | +| Kingston upon Thames | Implemented | Legacy full support with 2026/27 remunerative-work non-dependant deductions | https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf | +| Newham | Implemented | Legacy 70 percent with `25%` taper, `GBP 6,000` capital limit, and local non-dependant deductions | https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 | +| Westminster | Implemented | Legacy full support with 2026/27 remunerative-work non-dependant deductions | https://www.westminster.gov.uk/sites/default/files/media/documents/council-tax-support-scheme-for-2026-27.pdf | +| Greenwich | Implemented | Legacy 80 percent with `25%` taper, tariff income, and flat working-age non-dependant deduction | https://www.royalgreenwich.gov.uk/help-money/get-help-paying-your-housing-costs-and-council-tax/apply-help-pay-your-council-tax/how-much | +| Gloucester | Implemented | Legacy full support with `20%` taper, part-block tariff income, `GBP 16,000` capital limit, UC assessed income/capital branch, pension-age UC/income-based-benefit local cases, and `GBP 6`/`GBP 12.40` weekly working-age non-dependant deductions with a UC-couple exception. | https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf | +| Bath and North East Somerset | Implemented | Hybrid scheme: non-UC ordinary cases receive `78%` maximum support with a Band D cap, `20%` taper, tariff income above `GBP 6,000`, and a `GBP 10,000` capital limit; protected cases receive `100%` support with a `GBP 16,000` capital limit; UC Class F cases use PDF weekly income bands with `GBP 50` child increments and a `GBP 6,000` UC-assessed capital limit. The live page still prints older UC band starting amounts, so implementation follows the adopted 2026/27 PDF. | https://www.bathnes.gov.uk/sites/default/files/2026-01/Council_Tax_reduction_scheme_April_1_2026_to_March_31_2027.pdf | +| Hackney | Implemented | Legacy 90 percent with tariff income and 2026/27 remunerative-work non-dependant deductions | https://www.hackney.gov.uk/council-tax-and-benefits/benefits/benefits-explained/housing-benefit-and-council-tax-reduction-explained | +| Hammersmith and Fulham | Implemented | Legacy full support with tariff income and 2026/27 uprated non-dependant deductions | https://democracy.lbhf.gov.uk/documents/s133438/Council%20Tax%20Support%20Scheme%202026-27.pdf | +| Stockport | Implemented | Legacy full support with Band A/B caps, tariff income, and two-rate gross-income non-dependant deductions | https://www.stockport.gov.uk/council-tax-support-scheme | +| Wakefield | Implemented | Working-age non-DWP income bands with flat non-dependant deductions | https://www.wakefield.gov.uk/council-tax/help-with-your-council-tax/working-age-council-tax-support-scheme | +| Tameside | Implemented | Weekly net-income bands with Band A cap and no non-dependant deductions | https://tameside.moderngov.co.uk/documents/s200335/Appendix.%202%20for%20Council%20Tax%20Support%20Scheme%202026-2027.pdf | +| Bury | Implemented | Monthly earnings-banded discount with Band B cap and flat non-dependant deductions | https://www.bury.gov.uk/asset-library/bury-cts-scheme-policy-2026-27.pdf | +| Lambeth | Implemented | Weekly net-earnings bands with working-age savings limit and working/non-working non-dependant deductions | https://www.lambeth.gov.uk/about-housing-benefit-council-tax-support/council-tax-support/how-much-council-tax-support-you-can-get | +| Camden | Implemented | Weekly gross-earnings bands after eligible childcare costs, with protected group table and liability-share non-dependant deductions | https://www.camden.gov.uk/council-tax-support | +| Islington | Implemented | Weekly net-earnings bands with protected zero-earnings rules and flat non-dependant deductions | https://www.islington.gov.uk/benefits-and-support/council-tax-support | +| Babergh | Implemented | Hybrid scheme: non-UC legacy full support with `20%` taper, part-block tariff income, and prescribed non-dependant deductions; UC cases use monthly DWP-notified earnings contribution bands. The Babergh-hosted 2026/27 PDF appears to contain an Ipswich template reference in paragraph 1.1, but the Babergh live page, URL, and budget papers identify this as Babergh's scheme. | https://www.babergh.gov.uk/documents/d/babergh/bdc-ctr-scheme-2026_27-v4-pdf | +| Barking and Dagenham | Implemented | Weekly net-income bands by household type with `GBP 6,000` capital limit and pre-percentage flat non-dependant deductions | https://lbbd.moderngov.co.uk/documents/s178487/CTSS%202026-27%20-%20App%202.pdf | +| Barnet | Implemented | Monthly earnings-banded discount with Band C cap, `GBP 6,000` capital limit, and two-rate non-dependant deductions | https://barnet.moderngov.co.uk/documents/s94210/Appendix%20O%20-%20202627%20Council%20Tax%20Support%20Scheme.pdf | +| Basildon | Implemented | Weekly income-banded discount scheme with `75%` maximum support, a protected-group uplift to `75%` where the base grid gives a positive award, `GBP 20` weekly earnings disregard, eligible childcare deductions, strict `GBP 6,000` capital cutoff under the adopted PDF's "greater than" wording, and no non-dependant deductions. | https://www.basildon.gov.uk/media/11563/Basildon-Council-Council-Tax-Reduction-Scheme-2026-27/pdf/Basildon_S13A_202627_Final.pdf?m=1771316212763 | +| Bassetlaw | Implemented | Weekly net-income banded scheme with `95%` SDP/transitional-SDP support, `88%` passported or low-income support, then `65%`/`45%`/`25%`/`0%` rates, Band C liability cap, `GBP 16,000` capital limit, part-block tariff income above `GBP 6,000`, UC assessed-income/capital branch, pension-age UC/income-based benefit local cases with relevant-period and regulation-60A protection flags, and flat non-dependant deductions before the percentage. | https://www.bassetlaw.gov.uk/media/15ehht0s/council-tax-reduction-scheme-working-age-2026-2027.pdf | +| Ashford | Implemented | Weekly net-income banded scheme with `90%`/`75%`/`60%`/`45%`/`30%`/`0%` rates for single and couple applicants, Band D liability cap, `GBP 10,000` capital limit, part-block tariff income above `GBP 6,000`, Schedule 2 `GBP 25` weekly earnings disregard, Schedule 3 `GBP 40` weekly disability/carer income disregard, UC award-income branch with source-listed UC element disregards, pension-age UC/income-based benefit local cases with relevant-period and regulation-60A protection flags, and `GBP 10` weekly per-non-dependant final-award deductions. The live web page prints different penny thresholds from the adopted PDF, especially for couples; the implementation follows the adopted full PDF and tests that boundary. | https://www.ashford.gov.uk/media/0n4nud13/ashford-ctr-scheme-2026-final.pdf | +| Arun | Implemented | Weekly net-income banded scheme with the live 2026 page's `100%`/`70%`/`50%`/`30%`/`10%`/`0%` rates, `GBP 6,000` capital limit with income-based benefit capital disregards, `GBP 1` weekly minimum award, UC award-income branch with housing/carer/LCW/LCWRA element disregards and UC-assessed capital, Schedule 5 worker earnings disregards including the `GBP 17.10` addition where observable, eligible childcare deductions, pension-age UC/income-based benefit local cases, and `GBP 5` weekly non-dependant deductions before the percentage with one-deduction non-UC couple aggregation. Source inputs cover WTC-specific worker-addition cases, pension-age UC relevant-period/regulation 60A carve-outs, Guarantee Credit non-dependant status, and broader childcare incapacity/disabled-child facts not otherwise exposed. The linked 2026/27 PDF's Schedule 3 still shows older-looking thresholds and a `90%` top band, while the live page, February 2026 news post, and PDF section 23 support the current `100%` maximum and `GBP 1` minimum award; the implementation follows the live 2026/27 table for band thresholds and rates and the PDF for mechanics. | https://www.arun.gov.uk/council-tax-reduction/ | +| Buckinghamshire | Implemented | Weekly net-income banded scheme with `100%`/`75%`/`50%`/`25%`/`0%` rates by family type, strict `GBP 6,000` capital cutoff, passported income-based benefits in Band 1, pension-age UC local cases with transitional-protection flag, source-listed earnings/disability/UC-element/income disregards, and `GBP 5` weekly non-dependant deductions applied before the band percentage. Transitional Relief is source-described but deferred because it depends on prior-scheme awards. | https://buckinghamshire.moderngov.co.uk/documents/s115727/Appendix%204%20Council%20Tax%20Reduction%20Scheme%20Policy.pdf | +| Colchester | Implemented | Weekly net-income banded discount scheme with `80%` maximum support, Band D liability cap, `GBP 25` weekly earnings disregard, eligible childcare deductions, strict `GBP 6,000` capital cutoff, protected-group `80%` route inside listed income bands, source-listed Universal Credit element disregards, and no working-age non-dependant deductions found in the formal scheme. | https://cbccrmdata.blob.core.windows.net/noteattachment/CBC-null-Local-council-tax-support-policy-updated-01-04-26-Local%20Council%20Tax%20support%20policy.pdf | +| Cotswold | Implemented | Weekly net-income banded scheme with `100%`/`80%`/`60%`/`40%`/`20%`/`0%` rates by household type, Band E liability cap, `GBP 10,000` capital limit, part-block tariff income above `GBP 6,000`, protected-group `20%` excess-income taper, UC assessed-income/capital branch using pre-disregard UC earnings plus the adjusted UC award, pension-age UC/income-based benefit local cases, and remunerative-work gross-income non-dependant deductions with UC no-earned-income exemption. | https://cotswold.gov.uk/media/k04l1hc2/cdc-cts-scheme-2026-27.pdf | +| Chelmsford | Implemented | Legacy `77%` support with Band D liability cap, `20%` taper, strict `GBP 6,000` capital limit, UC assessed income/capital branch with adjusted UC award treatment, local earnings disregards, pension-age UC/income-based benefit local cases with relevant-period protection, remunerative-work gross-income non-dependant deductions, and source-exemption inputs. The 2026/27 report and 3 December 2025 minutes re-adopt the 2025/26 scheme unchanged. | https://www.chelmsford.gov.uk/media/g2nbyt31/62-local-council-tax-support-lcts-scheme-2026-27.pdf | +| Cheltenham | Implemented | Weekly net-income banded scheme with `100%`/`80%`/`60%`/`40%`/`20%`/`0%` rates by household type, Band E liability cap, `GBP 6,000` capital limit, no tariff income, `GBP 10` weekly earnings disregard, disabled-child income disregard, UC assessed-income/capital branch using pre-disregard UC earnings plus the adjusted UC award, pension-age UC/income-based benefit local cases, and remunerative-work gross-income non-dependant deductions with UC no-earned-income exemption. The adopted and summary 2026/27 tables print a lone-parent-three-child gap between `GBP 460.01` and `GBP 480.00`; the implementation follows the published ranges. | https://democracy.cheltenham.gov.uk/documents/s53359/Appendix%209%20-%20Council%20270226%20Council%20Tax%20Support%20Scheme%20for%20Working%20Age%20Customers%202026-27%20Final.pdf | +| Cheshire West and Chester | Implemented | Legacy `75%` ordinary support, `100%` protected class and war-pensioner support, Band D cap except for war pensioners, `20%` taper, `GBP 2` weekly minimum award, flat `GBP 30` weekly earnings disregard, ordinary `GBP 6,000` capital limit with exact-threshold eligibility under the detailed scheme, `GBP 16,000` working-age war-pensioner capital limit with part-block tariff income above `GBP 6,000`, UC award-income branch using `uc_maximum_amount` as the applicable amount, pension-age UC/income-based benefit local cases with relevant-period protection, and `GBP 5`/`GBP 10` non-dependant deductions using remunerative work and joint gross income for couples. Part 1 summary says capital of `GBP 6,000 or more` excludes ordinary working-age claimants, while the detailed scheme uses `does not exceed GBP 6,000` and `more than GBP 6,000`; the implementation follows the detailed boundary and tests `GBP 6,000.01`. The live working-age page describes a fixed `GBP 5` non-dependant deduction, but both 2026/27 PDFs contain the modeled `GBP 5`/`GBP 10` rule. | https://www.cheshirewestandchester.gov.uk/asset-library/council-tax-reduction-summary-2026-2027-annex-a-part-1.pdf | +| Chichester | Implemented | Hybrid scheme: non-UC classes D and E use a legacy `100%` maximum with `20%` taper, tariff income above `GBP 6,000`, prescribed non-dependant deductions, and a `GBP 16,000` capital limit; UC class F uses weekly household-type income bands with `100%`/`80%`/`60%`/`40%`/`20%`/`0%` support, a flat `GBP 3.90` weekly non-dependant deduction for each remunerative-work non-dependant, and UC assessed capital. The model accepts a `chichester_council_tax_reduction_source_uc_income` override for exact DWP-assessed Class F income where needed, with a fallback based on UC assessed earnings before the work allowance, UC other income, and the pre-deduction UC award less source-disregarded elements. Single pension-age UC claimants remain on the national pensioner scheme; mixed-age UC couples remain in the local UC-banded scheme. The published couple `60%` UC row is malformed as `GBP 206.01` to `GBP 2229.00` in both the 2026/27 and 2025/26 appendices; the implementation follows the only continuous interpretation and models that row as ending at `GBP 229.00`. | https://chichester.moderngov.co.uk/documents/s30863/09.1%20Appendix%201%20Local%20Council%20Tax%20Reduction%20Scheme%20Rules%202026%20-%202027.pdf | +| Brent | Implemented | Weekly claimant-and-partner earnings bands with `65%` maximum support, strict `GBP 6,000` savings cutoff, and flat working/non-working non-dependant deductions | https://www.brent.gov.uk/council-tax/council-tax-support | +| Bromley | Implemented | Legacy means test with `50%` maximum support, Band D cap, tariff income, UC assessed income/capital branch, and gross-income non-dependant deductions | https://cds.bromley.gov.uk/documents/s50125675/Council%20Tax%20Support%20Scheme%202026-27.pdf | +| Bristol | Implemented | Legacy full support with `20%` taper, tariff income, UC assessed income/capital branch, single/couple non-dependant income tests, and source-exemption inputs | https://www.bristol.gov.uk/files/documents/10754-bristol-council-tax-reduction-scheme-2026/file | +| Croydon | Implemented | Weekly household-income bands with protected disabled non-working and lone-parent-under-5 tables, Band D cap exceptions, strict capital cutoffs, UC element exclusions, and final-award non-dependant deductions. Current 2026 pages are paired with 2026/27 no-change decision papers because the linked detailed booklet is older. | https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support | +| Cumberland | Implemented | Legacy full support with `20%` taper, tariff income, UC assessed income/capital branch, remunerative-work non-dependant deductions, and source-exemption inputs | https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf | +| Dartford | Implemented | Weekly net-income banded scheme with `80%`/`60%`/`40%`/`20%`/`0%` rates by household type, strict `GBP 6,000` capital cutoff under the `greater than` wording, `GBP 1` weekly minimum award, `GBP 25` weekly non-UC earnings disregard, source-listed income disregards including a local source-disregarded-income input for war pension or compensation income not otherwise exposed, UC assessed-income/capital branch, pension-age UC/income-based benefit local cases, and no working-age non-dependant deduction schedule found in the 2026/27 source. The live page explicitly limits the `GBP 25` earnings disregard to non-UC claimants while the PDF paragraph is broader; implementation follows the live page's UC qualifier. | https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027 | +| Derby | Implemented | Legacy means-tested Council Tax Support with `80%` maximum support, Band B liability cap, `20%` taper, `GBP 6,000` capital limit, `GBP 4` weekly minimum award, and Housing Benefit-aligned non-dependant deductions that exclude the two highest HB rates and substitute a `GBP 4` weekly deduction for working non-dependants below `GBP 100` gross weekly income and non-working passported or UC non-dependants. The live page still points to the older 2025/26 scheme, so implementation follows the current 2026/27 PDF. | https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf | +| South Derbyshire | Implemented | Weekly excess-income banded scheme with `100%` support up to `GBP 5` weekly excess income, then `90%`/`78%`/`66%`/`54%`/`42%`/`30%`/`18%`/`10%`/`0%` rates, `GBP 16,000` capital limit, part-block tariff income above `GBP 6,000`, `GBP 1` weekly minimum award, UC assessed-income and capital branch using the pre-deduction UC award, pension-age UC Working Tax Credit closure protection, income-based-benefit capital disregard, applicant/partner capital input for child-capital exclusions, and flat `GBP 6.25` weekly working-age non-dependant deductions before the support percentage. | https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf | +| South Gloucestershire | Implemented | Weekly earned-income banded scheme with `77%` no-earned-income support, then `60%`/`40%`/`20%`/`15%`/`10%`/`0%` rates, no tariff income, formal-scheme `GBP 6,000` capital boundary, UC assessed earnings/capital fallback, pension-age UC relevant-period/regulation-60A protection flags, applicant/partner capital input for non-applicant capital exclusions, and `GBP 3.50`/`GBP 14` weekly non-dependant deductions after the support percentage with one deduction for a non-dependant couple. The current live page points to formal 2025 rules and says the 2025 changes remain the current working-age scheme; no newer 2026/27 formal instrument was found. The live page says savings of `GBP 6,000 or more` are excluded, while the formal rules exclude capital that exceeds `GBP 6,000`; implementation follows the formal boundary. | https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf | +| Coventry | Implemented | Weekly excess-income banded scheme with direct `80%`/`65%`/`40%`/`20%`/`0%` support rates, `GBP 16,000` capital limit, UC assessed income/capital branch using `uc_maximum_amount` as the applicable amount, pension-age UC/income-based benefit local cases plus mixed-age local cases, and gross-income non-dependant deductions without an hours gate plus a UC-no-earned-income source input. | https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027 | +| Herefordshire | Implemented | Legacy full support with `20%` taper, strict `GBP 6,000` capital limit, UC assessed income/capital branch, local pension-age UC/income-based benefit cases, remunerative-work non-dependant deductions, and source-exemption inputs | https://councillors.herefordshire.gov.uk/documents/s50131817/202627%20Council%20Tax%20Reduction%20Scheme.pdf | +| Westmorland and Furness | Implemented | Legacy full support with `20%` taper, part-block tariff income, income-based benefit capital disregard, pension-age UC/income-based benefit local cases, UC assessed income/capital branch, UC non-dependant couple exception, remunerative-work non-dependant deductions, and source-exemption inputs | https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf | +| Kingston upon Hull | Implemented | Legacy `80%` support after non-dependant deductions with `20%` taper, `GBP 6,000` capital cutoff with income-based benefit capital disregard, pension-age UC/income-based benefit local cases with relevant-period protection flag, UC assessed income/capital branch, UC gross-earnings/minimum-wage non-dependant hours fallback, and source-exemption inputs. Current-year no-change report is paired with the carried-forward full scheme. | https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026 | +| North Northamptonshire | Implemented | Legacy `75%` support with `20%` taper, part-block tariff income, `GBP 16,000` capital limit with income-based benefit capital disregard, UC assessed income/capital branch using the pre-deduction UC award, 2026/27 uprated remunerative-work non-dependant deductions, person-level UC non-dependant couple exception, and source-exemption inputs. Current-year no-change report is paired with the carried-forward full scheme. | https://northnorthants.moderngov.co.uk/documents/s34359/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf | +| West Northamptonshire | Implemented | Legacy `80%` support with `100%` care-leaver and war-pension classes, `20%` taper, part-block tariff income, `GBP 16,000` capital limit with income-based benefit capital disregard, pension-age UC local cases with relevant-period protection flag, UC assessed income/capital branch using the pre-deduction UC award, 2026/27 uprated remunerative-work non-dependant deductions, person-level UC non-dependant couple exception, and source-exemption inputs. Current-year no-change report is paired with the carried-forward full scheme. | https://westnorthants.moderngov.co.uk/documents/s25215/Item%2010%20-%20CTRS%2026-27.pdf | +| North Yorkshire | Implemented | Weekly income-banded discount scheme with household-type bands, strict ordinary `GBP 6,000` capital cutoff, income-based benefit capital disregard up to `GBP 16,000`, pension-age UC/income-based benefit local cases with relevant-period protection flag, and UC assessed income/capital branch | https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf | +| Somerset | Implemented | Weekly income-banded discount scheme with Band D cap, `GBP 25` earnings disregard, `GBP 30` disabled-household income disregard, ordinary `GBP 6,000` capital cutoff, income-based benefit capital disregard up to `GBP 16,000`, pension-age UC/income-based benefit local cases with relevant-period protection flag, UC assessed income/capital branch, and final-award flat non-dependant deductions | https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf | +| Ealing | Implemented | Weekly income-banded support with protected and non-protected tables, strict `GBP 6,000` capital cutoff, and local non-dependant deductions | https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf | +| Enfield | Implemented | Non-UC legacy means test with `50%` cap, Band C liability cap and `22.5%` taper, plus UC net-earnings bands and protected groups | https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf | +| Haringey | Implemented | Legacy means test with `80.2%` ordinary maximum, protected `100%` classes, `20%` taper, `GBP 10,000` capital limit, and gross-income non-dependant deductions | https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf | +| Harrow | Implemented | Split UC/non-UC scheme: non-UC `50%` ordinary / `86%` disabled support with `30%` taper, and UC weekly net-earnings bands by household type | https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27 | +| Havering | Implemented | Legacy means test with `75%` ordinary maximum, `80%` disabled maximum, `100%` care-leaver/war-pension classes, Band D cap, `20%` taper, `GBP 6,000` capital limit, and gross-income non-dependant deductions | https://democracy.havering.gov.uk/documents/s83106/12%20-%20Appendix%20I%20%20Summary%20of%20the%20Council%20Tax%20Support%20Scheme%202026-27.pdf | +| Hillingdon | Implemented | Weekly net-income bands with vulnerable Band 2, Band D cap for Bands 3-6, `GBP 6,000` capital limit, and flat non-dependant deductions | https://pre.hillingdon.gov.uk/benefits/working-age-bands | +| Hounslow | Implemented | Weekly net-earnings bands with `75%` ordinary maximum, `90%` carer support, `GBP 6,000` capital limit, and flat working/non-working non-dependant deductions | https://www.hounslow.gov.uk/council-tax-support | +| Ipswich | Implemented | Hybrid scheme: non-UC legacy full support with `20%` taper, part-block tariff income, and prescribed non-dependant deductions; UC cases use Ipswich monthly DWP-notified earnings contribution bands. | https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf | +| Lewisham | Implemented | Legacy means test with `75%` maximum support, no Band D cap, `20%` taper, tariff income, UC assessed income/capital branch with weekly earnings disregard, and gross-income non-dependant deductions. Current 2026/27 papers confirm no change from the older detailed scheme. | https://lewisham.gov.uk/myservices/benefits/council-tax-reduction-scheme | +| Mid Suffolk | Implemented | Hybrid scheme matching Babergh's structure: non-UC legacy full support with `20%` taper, part-block tariff income, and prescribed non-dependant deductions; UC cases use Mid Suffolk monthly DWP-notified earnings contribution bands. The Mid Suffolk-hosted 2026/27 PDF appears to contain an Ipswich template reference in paragraph 1.1, but the Mid Suffolk live page identifies this as Mid Suffolk's scheme. The separate Section 13A Council Tax Support top-up of up to `GBP 50` is noted but not modeled as CTR. | https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf | +| Plymouth | Implemented | Weekly income-banded discount scheme with `80%` maximum support, Band E liability cap, applicant-and-partner weekly income after source disregards and eligible childcare costs, `GBP 6,000` capital limit under the adopted PDF's "greater than" wording, and `GBP 5.20` weekly non-dependant deductions with source exemptions. The live page says `GBP 6,000 or more` capital is excluded and uses a `GBP 4.90` non-dependant summary amount, but the adopted 2026/27 PDF controls the modeled `> GBP 6,000` cutoff and `GBP 5.20` deduction. | https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf | +| Redbridge | Implemented | Categorical percentage-of-liability scheme with `73%` disability support, `60%`/`50%` not-working support, `46%`/`36%` working support under local earnings thresholds, `GBP 16,000` capital limit, `GBP 10` weekly minimum award, and a UC exception to the non-dependant couple rule | https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf | +| Slough | Implemented | Weekly earned-income banded discount scheme with `70%` support for no earned income or passported no-earnings cases, positive-earnings rates from `50%` to `0%`, Band C liability cap, strict `GBP 6,000` capital cutoff, and `GBP 5`/`GBP 11` weekly non-dependant deductions. | https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27 | +| Southend-on-Sea | Implemented | Weekly income-banded discount scheme with `75%` maximum support, `GBP 20` weekly earnings disregard, eligible childcare deductions with a `16` hour work gate, strict `GBP 6,000` capital cutoff under the adopted PDF's "GBP 6,000 or above" wording, source-listed Universal Credit element disregards, and no working-age non-dependant deductions found in the formal scheme. | https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme | +| Thurrock | Implemented | Legacy `75%` support with `20%` taper, strict `GBP 6,000` capital limit, `GBP 25` weekly earnings disregard, pension-age UC/income-based benefit local cases with relevant-period protection, UC assessed income/capital branch, remunerative-work gross-income non-dependant deductions, and source-exemption inputs. The 2026/27 report confirms no change to the scheme in place since 2017/18, so this pairs the current report with the carried-forward full scheme appendix. | https://thurrock.moderngov.co.uk/documents/s51233/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf | +| Rushmoor | Implemented | Default-style legacy means test with `100%` maximum support, Band `D` liability cap, `20%` weekly taper, strict `GBP 6,000` local-scheme capital cutoff, UC assessed income/capital treatment, pension-age UC/income-based-benefit local cases with relevant-period and regulation 60A source exceptions, and the prescribed 2026/27 gross-income non-dependant deduction schedule. | https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf | +| Hart | Implemented | Default-style legacy means test with `100%` maximum support, no Band D liability cap, `20%` weekly taper, `GBP 16,000` working-age capital cutoff, UC assessed income/capital treatment, pension-age UC/income-based-benefit local cases with relevant-period and regulation 60A source exceptions, prescribed 2026/27 gross-income non-dependant deductions, and the source's UC-couple exception to the one-deduction non-dependant rule. | https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf | +| Maldon | Implemented | Default-style legacy means test with `80%` maximum support, Band `D` liability cap, `20%` weekly taper, strict `GBP 6,000` working-age capital cutoff, UC assessed income/capital treatment, pension-age UC/income-based-benefit local cases with relevant-period and regulation 60A source exceptions, and a flat `GBP 10` weekly non-dependant deduction. | https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf | +| Hartlepool | Implemented | Banded Discount Scheme with six household-type weekly net-income tables and `90%`/`70%`/`40%`/`20%`/`0%` discount bands, `GBP 10,000` working-age capital cutoff, `GBP 25` weekly earnings disregard, half pension-contribution deduction from earnings, UC assessed income/capital treatment, pension-age UC/income-based-benefit local cases with regulation 60A source exception, and a flat `GBP 5` weekly non-dependant deduction. | https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27 | +| Hertsmere | Implemented | Hybrid scheme: Class D/E non-UC default means test with `80%` ordinary maximum support, `100%` section 57.1A protected-group support, Band `D` liability cap, `20%` weekly taper, strict `GBP 16,000` capital cutoff, and prescribed gross-income non-dependant deductions. Paragraph 1.8 routes UC applicants to the Class G Schedule 6 weekly-earnings banded scheme, with Schedule 3 earnings disregards, UC-assessed capital, protected/non-protected support-rate bands, protected/non-protected non-dependant deduction tables, and pension-age UC relevant-period and regulation 60A source exceptions. | https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf | +| East Hampshire | Implemented | Default-style legacy means test with `100%` maximum support, no Band D liability cap, `20%` weekly taper, `GBP 16,000` capital cutoff, UC assessed income/capital treatment, pension-age UC/income-based-benefit local cases with relevant-period and regulation 60A source exceptions, and prescribed 2026/27 gross-income non-dependant deductions. The paragraph 30 body heading says "pensioners ONLY", but paragraph 29 and the table of contents apply paragraph 30 to pensioners and non-pensioners. | https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf | +| Brentwood | Implemented | Banded Discount Scheme: 3 household-type weekly income tables (no/one/two-or-more dependants) with discount rates from `75%` to `0%`. Paragraph 43.1 caps the maximum at `100%` and Schedule 1 paragraph 3 uplifts protected-group cases (DLA / PIP / AA / UC LCWRA / AFIP / SDA recipients, plus jurisdiction-scoped source inputs for the UC LCW element, Working Tax Credit disability element and ESA Support Component) to `100%`. Schedule 1 paragraph 9 routes income-based-benefit applicants to Band 1 (`75%`). Paragraph 6.1 excludes working-age homeowners in Bands F, G, H. Paragraph 30 sets a strict `GBP 6,000` capital cutoff. Non-UC weekly income includes countable income other than earnings and the paragraph 23.2/25.2 `GBP 20` weekly earnings disregard. Paragraph 12 uses DWP-assessed UC income (gross UC award before deductions, plus `GBP 20` weekly earnings disregard) and DWP-assessed UC capital. Paragraph 5 routes pension-age applicants on UC/IS/JSA-IB/ESA-IR into the local scheme, with the regulation 60A UC carve-out. Paragraph 45 says there are no non-dependant deductions, so none are modeled. | https://www.brentwood.gov.uk/sites/default/files/2026-03/Council%20Tax%20reduction%20scheme%20S13A%202026-27%20FINAL.pdf | +| West Berkshire | Implemented | Prescribed Default Scheme with six local working-age amendments for non-vulnerable Class D and E applicants: paragraph 29(1)A excludes capital at `GBP 6,000` or above, paragraph 29A Band C liability cap, paragraph 29B `70%` maximum support, paragraph 29C `GBP 10` weekly minimum award, paragraph 17 `30%` Class E taper, and paragraph 18 removal of the working-age Class F second adult rebate. Paragraph 29D protects a vulnerable category (claimant or partner with Disability Premium / Enhanced Disability Premium / Severe Disability Premium / Disabled Child Premium / any component of ESA / War Pension / UC LCW element) from each amendment, keeping `100%` support, no Band C cap, default `GBP 16,000` capital, no minimum award, and a `20%` Class E1 taper from paragraph 17A. Paragraph 37 uses UC-assessed income/capital for UC claimants. Paragraph 30's one-deduction couple rule does not apply to UC non-dependant couples. Paragraph 3 routes pension-age applicants on UC/IS/JSA-IB/ESA-IR into the local scheme, with relevant-period and regulation 60A UC source exceptions. The leaflet says the revised capital threshold does not apply to claimants on Income-based JSA / IS / income-related ESA, but the formal scheme paragraph 29(1)A applies to Class D and E without that exemption; the implementation follows the formal scheme (income-related ESA recipients are already protected via paragraph 29D's "any component of ESA" route). Jurisdiction-scoped Brentwood-style source inputs cover War Pension, UC LCW element, Disabled Child Premium, and pension-age UC source exceptions because PolicyEngine UK does not model those facts directly. | https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf | +| Tendring | Implemented | Prescribed Default Scheme with local maximum-support amendments: paragraph 57.1 caps the ordinary working-age maximum at `80%` (the council's live page confirms "everyone of working age will have to pay at least 20%"), and paragraph 57.1A caps cases where the applicant or partner has received Jobseeker's Allowance for three years or more at `60%` via a Tendring-scoped source input. Paragraph 33 keeps the `GBP 16,000` capital limit, paragraph 59 mirrors the prescribed `2 6/7%` daily Class E taper (equivalent to `20%` weekly), section 14 uses UC `uc_maximum_amount` as the applicable amount, paragraph 15 counts household members' non-child income/capital in non-UC cases, paragraph 58 is "Not Used" so no working-age non-dependant deductions are modeled, and paragraph 3.2 routes pension-age UC applicants into the local scheme with relevant-period and regulation 60A UC source exceptions. There is no Band D liability cap, no protected vulnerable category, and no separate UC banded scheme. | https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf | +| St Helens | Implemented | Prescribed Default Scheme with four local working-age amendments: paragraph 9 caps the working-age maximum at `80%` of council tax liability with a Band D liability cap for Bands F, G and H (Band F support capped at `9/13` of the Band F bill, Band G at `9/15`, Band H at `9/18`), paragraph 40 cancels any working-age award calculated at less than `GBP 1` per week, and paragraph 49 removes all working-age non-dependant deductions. Paragraphs 10 and 28 keep the `GBP 16,000` capital limit, paragraphs 9 and 37 keep the prescribed `20%` weekly taper, paragraph 62 uses the UC maximum award as the applicable amount, paragraph 63 uses the DWP-assessed UC income plus the actual UC award and the DWP-assessed UC capital, and footnote 1 / cabinet 4.4.1(b) keeps pension-age UC recipients whose award arises from Working Tax Credit closure on the prescribed pensioner scheme via a regulation 60A UC source exception. Pension-age applicants without a working-age income-related benefit go to the prescribed pensioner scheme. | https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf | +| Tewkesbury | Implemented | Default Scheme with no local amendments. Tewkesbury Borough Council has remained on the Default Scheme since 1 April 2013; the Cabinet's January 2026 Council Tax Reduction Scheme Report confirms no proposed changes for 2026/27. Working-age maximum support is `100%` (Default Scheme paragraph 29), capital limit `GBP 16,000` (paragraph 23), Class E taper `2 6/7%` daily / `20%` weekly (paragraph 17), and paragraph 30 sets the gross-income non-dependant deduction schedule as amended by SI 2012/3085 (`GBP 3.65` / `GBP 7.25` / `GBP 9.15` / `GBP 10.95` weekly) with paragraph 30(3) excluding UC non-dependant couples from the one-deduction couple rule. The council's current public page links the Default Scheme regulations and confirms the `GBP 16,000` capital limit; no accessible primary Tewkesbury source found in this pass shows a local annual uprating of the Default Scheme non-dependant amounts to the 2026 Prescribed Requirements table. UC cases use UC `uc_maximum_amount` as the applicable amount with DWP-assessed UC income/capital, and pension-age UC cases include current Prescribed Requirements regulation 3 relevant-period and regulation 60A source exceptions. | https://minutes.tewkesbury.gov.uk/documents/s71351/Council%20Tax%20Reduction%20Scheme%20Report.pdf | +| Forest of Dean | Implemented | 2026/27 working-age banded discount scheme with Class A (non-protected) at `90%` maximum support (paragraph 57.1) and Class B (protected) at `95%` maximum support (paragraph 57.6), eligible liability capped at the Band E equivalent for the dwelling. Paragraph 59.1 sets Class A's six bands (`90/70/50/30/10/0%`) and paragraph 59.3 sets Class B's (`95/75/55/35/15/0%`), with separate Single, Couple, Lone Parent and Couple with Children weekly net-income tables. Class A/Class B criterion (g) places applicants on Income Support / income-based JSA / income-related ESA in the top income band. Section 15A uses DWP-assessed UC income plus the UC award and UC-assessed capital for UC claimants. Capital is excluded at `GBP 16,000`. Section 58 keeps the prescribed Default Scheme gross-income non-dependant deductions (`GBP 5.20` / `GBP 10.60` / `GBP 13.30` / `GBP 15.95` weekly) with paragraph 58.3 applying the one-deduction couple rule to all couples including UC. Class B is keyed off the claimant, partner or any dependant receiving AFIP / Attendance Allowance / DLA / ESA / PIP / SDA, plus Forest of Dean-scoped source inputs for War Pension / War Widow's Pension and the UC Work Capability Element. | https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf | +| Braintree | Implemented | 2026/27 working-age Banded Discount Scheme with a `77%` maximum (paragraph 48.1) and no Band cap or non-dependant deductions. Schedule 1 paragraph 1 sets weekly net-income ranges across six household types (Single / Couple x no / one / two-or-more children) with discount rates from `77%` down to `0%`; Schedule 1 paragraph 7 places passported Income Support / income-related ESA / income-based JSA applicants at Band 1. Paragraph 26.1 / Schedule 1 paragraph 5 exclude applicants whose capital is `GBP 10,000` or greater. Paragraphs 12.2-12.5 use DWP-assessed UC income (annualised by `x 12 / 52`) plus the actual UC award and DWP-assessed UC capital. Paragraph 3 routes pension-age applicants on UC/IS/JSA-IB/ESA-IR into the local banded scheme, with relevant-period and regulation 60A UC source exceptions; pension-age applicants outside those local cases go to the prescribed pensioner scheme. | https://www.braintree.gov.uk/downloads/file/4374/council-tax-reduction-scheme-2026-27 | + +## Reviewed Candidate Queue + +| Authority | Status | Type | Notes | +| --- | --- | --- | --- | +| Durham | Source incomplete | 2026/27 income-banded working-age scheme | Official reports confirm 90% maximum support, 10% minimum payment, `GBP 10` weekly flat non-dependant deduction, `GBP 10,000` capital limit, no working-age second adult rebate, and terminal-illness protection, but the accessible reports/summaries do not expose the adopted income-band thresholds needed for implementation. | diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/simulated_council_tax_reduction_benunit.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/simulated_council_tax_reduction_benunit.py new file mode 100644 index 000000000..2652584a2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/simulated_council_tax_reduction_benunit.py @@ -0,0 +1,380 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_england_pensioner_scheme, + is_scotland_scheme, + is_wales_scheme, +) + + +LOCAL_COUNCIL_TAX_REDUCTION_VARIABLES = [ + "adur_council_tax_reduction", + "ashford_council_tax_reduction", + "arun_council_tax_reduction", + "babergh_council_tax_reduction", + "basildon_council_tax_reduction", + "barking_and_dagenham_council_tax_reduction", + "barnet_council_tax_reduction", + "basingstoke_and_deane_council_tax_reduction", + "bath_and_north_east_somerset_council_tax_reduction", + "bassetlaw_council_tax_reduction", + "bolton_council_tax_reduction", + "braintree_council_tax_reduction", + "breckland_council_tax_reduction", + "brent_council_tax_reduction", + "brentwood_council_tax_reduction", + "bromley_council_tax_reduction", + "bristol_council_tax_reduction", + "broadland_council_tax_reduction", + "bury_council_tax_reduction", + "buckinghamshire_council_tax_reduction", + "camden_council_tax_reduction", + "chelmsford_council_tax_reduction", + "cheltenham_council_tax_reduction", + "cheshire_west_and_chester_council_tax_reduction", + "chichester_council_tax_reduction", + "chesterfield_council_tax_reduction", + "colchester_council_tax_reduction", + "cotswold_council_tax_reduction", + "coventry_council_tax_reduction", + "crawley_council_tax_reduction", + "croydon_council_tax_reduction", + "cumberland_council_tax_reduction", + "dartford_council_tax_reduction", + "derby_council_tax_reduction", + "darlington_council_tax_reduction", + "dudley_council_tax_reduction", + "ealing_council_tax_reduction", + "enfield_council_tax_reduction", + "east_cambridgeshire_council_tax_reduction", + "east_hampshire_council_tax_reduction", + "east_hertfordshire_council_tax_reduction", + "east_suffolk_council_tax_reduction", + "fenland_council_tax_reduction", + "forest_of_dean_council_tax_reduction", + "gateshead_council_tax_reduction", + "greenwich_council_tax_reduction", + "gloucester_council_tax_reduction", + "haringey_council_tax_reduction", + "harrow_council_tax_reduction", + "hart_council_tax_reduction", + "hartlepool_council_tax_reduction", + "havering_council_tax_reduction", + "hertsmere_council_tax_reduction", + "herefordshire_council_tax_reduction", + "hackney_council_tax_reduction", + "hammersmith_and_fulham_council_tax_reduction", + "hillingdon_council_tax_reduction", + "hounslow_council_tax_reduction", + "ipswich_council_tax_reduction", + "kings_lynn_and_west_norfolk_council_tax_reduction", + "kingston_upon_hull_council_tax_reduction", + "kingston_upon_thames_council_tax_reduction", + "islington_council_tax_reduction", + "lambeth_council_tax_reduction", + "lancaster_council_tax_reduction", + "lewisham_council_tax_reduction", + "maldon_council_tax_reduction", + "merton_council_tax_reduction", + "mid_suffolk_council_tax_reduction", + "newham_council_tax_reduction", + "oldham_council_tax_reduction", + "north_norfolk_council_tax_reduction", + "north_northamptonshire_council_tax_reduction", + "north_yorkshire_council_tax_reduction", + "norwich_council_tax_reduction", + "oxford_council_tax_reduction", + "plymouth_council_tax_reduction", + "redbridge_council_tax_reduction", + "rushmoor_council_tax_reduction", + "sefton_council_tax_reduction", + "somerset_council_tax_reduction", + "slough_council_tax_reduction", + "south_gloucestershire_council_tax_reduction", + "south_derbyshire_council_tax_reduction", + "south_norfolk_council_tax_reduction", + "southend_on_sea_council_tax_reduction", + "southwark_council_tax_reduction", + "st_albans_council_tax_reduction", + "st_helens_council_tax_reduction", + "stockport_council_tax_reduction", + "stevenage_council_tax_reduction", + "stroud_council_tax_reduction", + "tameside_council_tax_reduction", + "tendring_council_tax_reduction", + "tewkesbury_council_tax_reduction", + "thurrock_council_tax_reduction", + "wakefield_council_tax_reduction", + "warrington_council_tax_reduction", + "west_berkshire_council_tax_reduction", + "west_suffolk_council_tax_reduction", + "west_northamptonshire_council_tax_reduction", + "westmorland_and_furness_council_tax_reduction", + "westminster_council_tax_reduction", + "worthing_council_tax_reduction", +] + + +class simulated_council_tax_reduction_benunit(Variable): + value_type = float + entity = BenUnit + label = "Simulated Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + local_authority_parameters = parameters(period).gov.local_authorities + england_pensioners_ctr = ( + local_authority_parameters.england.council_tax_reduction.pensioners + ) + wales_ctr = local_authority_parameters.wales.council_tax_reduction + scotland_ctr = local_authority_parameters.scotland.council_tax_reduction + local_ctr = add(benunit, period, LOCAL_COUNCIL_TAX_REDUCTION_VARIABLES) + is_household_head_benunit = benunit("benunit_contains_household_head", period) + would_claim = benunit("would_claim_council_tax_reduction", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + babergh_local_scheme = benunit( + "babergh_council_tax_reduction_is_local_scheme", period + ) + ashford_local_scheme = benunit( + "ashford_council_tax_reduction_is_local_scheme", period + ) + arun_local_scheme = benunit( + "arun_council_tax_reduction_is_local_scheme", period + ) + basildon_local_scheme = benunit( + "basildon_council_tax_reduction_is_local_scheme", period + ) + bassetlaw_local_scheme = benunit( + "bassetlaw_council_tax_reduction_is_local_scheme", period + ) + bath_and_north_east_somerset_local_scheme = benunit( + "bath_and_north_east_somerset_council_tax_reduction_is_local_scheme", + period, + ) + braintree_local_scheme = benunit( + "braintree_council_tax_reduction_is_local_scheme", period + ) + brentwood_local_scheme = benunit( + "brentwood_council_tax_reduction_is_local_scheme", period + ) + buckinghamshire_local_scheme = benunit( + "buckinghamshire_council_tax_reduction_is_local_scheme", period + ) + chelmsford_local_scheme = benunit( + "chelmsford_council_tax_reduction_is_local_scheme", period + ) + cheltenham_local_scheme = benunit( + "cheltenham_council_tax_reduction_is_local_scheme", period + ) + cheshire_west_and_chester_local_scheme = benunit( + "cheshire_west_and_chester_council_tax_reduction_is_local_scheme", period + ) + chichester_local_scheme = benunit( + "chichester_council_tax_reduction_is_local_scheme", period + ) + colchester_local_scheme = benunit( + "colchester_council_tax_reduction_is_local_scheme", period + ) + cotswold_local_scheme = benunit( + "cotswold_council_tax_reduction_is_local_scheme", period + ) + coventry_local_scheme = benunit( + "coventry_council_tax_reduction_is_local_scheme", period + ) + dartford_local_scheme = benunit( + "dartford_council_tax_reduction_is_local_scheme", period + ) + east_hampshire_local_scheme = benunit( + "east_hampshire_council_tax_reduction_is_local_scheme", period + ) + forest_of_dean_local_scheme = benunit( + "forest_of_dean_council_tax_reduction_is_local_scheme", period + ) + gloucester_local_scheme = benunit( + "gloucester_council_tax_reduction_is_local_scheme", period + ) + hart_local_scheme = benunit( + "hart_council_tax_reduction_is_local_scheme", period + ) + hartlepool_local_scheme = benunit( + "hartlepool_council_tax_reduction_is_local_scheme", period + ) + hertsmere_local_scheme = benunit( + "hertsmere_council_tax_reduction_is_local_scheme", period + ) + herefordshire_local_scheme = benunit( + "herefordshire_council_tax_reduction_is_local_scheme", period + ) + kingston_upon_hull_local_scheme = benunit( + "kingston_upon_hull_council_tax_reduction_is_local_scheme", period + ) + ipswich_local_scheme = benunit( + "ipswich_council_tax_reduction_is_local_scheme", period + ) + maldon_local_scheme = benunit( + "maldon_council_tax_reduction_is_local_scheme", period + ) + mid_suffolk_local_scheme = benunit( + "mid_suffolk_council_tax_reduction_is_local_scheme", period + ) + north_yorkshire_local_scheme = benunit( + "north_yorkshire_council_tax_reduction_is_local_scheme", period + ) + plymouth_local_scheme = benunit( + "plymouth_council_tax_reduction_is_local_scheme", period + ) + rushmoor_local_scheme = benunit( + "rushmoor_council_tax_reduction_is_local_scheme", period + ) + somerset_local_scheme = benunit( + "somerset_council_tax_reduction_is_local_scheme", period + ) + slough_local_scheme = benunit( + "slough_council_tax_reduction_is_local_scheme", period + ) + south_gloucestershire_local_scheme = benunit( + "south_gloucestershire_council_tax_reduction_is_local_scheme", period + ) + south_derbyshire_local_scheme = benunit( + "south_derbyshire_council_tax_reduction_is_local_scheme", period + ) + southend_on_sea_local_scheme = benunit( + "southend_on_sea_council_tax_reduction_is_local_scheme", period + ) + st_helens_local_scheme = benunit( + "st_helens_council_tax_reduction_is_local_scheme", period + ) + tendring_local_scheme = benunit( + "tendring_council_tax_reduction_is_local_scheme", period + ) + tewkesbury_local_scheme = benunit( + "tewkesbury_council_tax_reduction_is_local_scheme", period + ) + thurrock_local_scheme = benunit( + "thurrock_council_tax_reduction_is_local_scheme", period + ) + west_berkshire_local_scheme = benunit( + "west_berkshire_council_tax_reduction_is_local_scheme", period + ) + west_northamptonshire_local_scheme = benunit( + "west_northamptonshire_council_tax_reduction_is_local_scheme", + period, + ) + westmorland_and_furness_local_scheme = benunit( + "westmorland_and_furness_council_tax_reduction_is_local_scheme", + period, + ) + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + applicable_income = benunit("council_tax_reduction_applicable_income", period) + + england_pensioners = ( + is_england_pensioner_scheme(country, has_pensioner) + & ~ashford_local_scheme + & ~arun_local_scheme + & ~babergh_local_scheme + & ~basildon_local_scheme + & ~bassetlaw_local_scheme + & ~bath_and_north_east_somerset_local_scheme + & ~braintree_local_scheme + & ~brentwood_local_scheme + & ~buckinghamshire_local_scheme + & ~chelmsford_local_scheme + & ~cheltenham_local_scheme + & ~cheshire_west_and_chester_local_scheme + & ~chichester_local_scheme + & ~colchester_local_scheme + & ~cotswold_local_scheme + & ~coventry_local_scheme + & ~dartford_local_scheme + & ~east_hampshire_local_scheme + & ~forest_of_dean_local_scheme + & ~gloucester_local_scheme + & ~hart_local_scheme + & ~hartlepool_local_scheme + & ~hertsmere_local_scheme + & ~herefordshire_local_scheme + & ~ipswich_local_scheme + & ~kingston_upon_hull_local_scheme + & ~maldon_local_scheme + & ~mid_suffolk_local_scheme + & ~north_yorkshire_local_scheme + & ~plymouth_local_scheme + & ~rushmoor_local_scheme + & ~somerset_local_scheme + & ~slough_local_scheme + & ~south_gloucestershire_local_scheme + & ~south_derbyshire_local_scheme + & ~southend_on_sea_local_scheme + & ~st_helens_local_scheme + & ~tendring_local_scheme + & ~tewkesbury_local_scheme + & ~thurrock_local_scheme + & ~west_berkshire_local_scheme + & ~west_northamptonshire_local_scheme + & ~westmorland_and_furness_local_scheme + ) + wales = is_wales_scheme(country) + scotland = is_scotland_scheme(country) + national_scheme = england_pensioners | wales | scotland + max_support = select( + [ + england_pensioners, + wales, + scotland, + ], + [ + england_pensioners_ctr.maximum_support_rate, + wales_ctr.maximum_support_rate, + scotland_ctr.maximum_support_rate, + ], + default=0.0, + ) + liability = benunit.household( + "council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit("council_tax_reduction_non_dep_deductions", period) + withdrawal_rate = select( + [ + england_pensioners, + wales, + scotland, + ], + [ + england_pensioners_ctr.means_test.withdrawal_rate, + wales_ctr.means_test.withdrawal_rate, + scotland_ctr.means_test.withdrawal_rate, + ], + default=0.0, + ) + capital_limit = select( + [ + england_pensioners, + wales, + scotland, + ], + [ + england_pensioners_ctr.means_test.capital_limit, + wales_ctr.means_test.capital_limit, + scotland_ctr.means_test.capital_limit, + ], + default=0.0, + ) + excess_income = max_(0, applicable_income - applicable_amount) + preliminary_award = max_( + 0, + liability * max_support + - excess_income * withdrawal_rate + - non_dep_deductions, + ) + capital_eligible = benunit.household("savings", period) <= capital_limit + national_ctr = ( + national_scheme + * is_household_head_benunit + * would_claim + * capital_eligible + * preliminary_award + ) + return national_ctr + local_ctr diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/would_claim_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/would_claim_council_tax_reduction.py new file mode 100644 index 000000000..68fdd511c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/would_claim_council_tax_reduction.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class would_claim_council_tax_reduction(Variable): + value_type = bool + entity = BenUnit + label = "Would claim Council Tax Reduction" + documentation = ( + "Whether this benefit unit would claim Council Tax Reduction if eligible." + ) + definition_period = YEAR + + def formula(benunit, period, parameters): + claims_all_entitled_benefits = benunit("claims_all_entitled_benefits", period) + reported_ctr = benunit("council_tax_benefit_reported", period) > 0 + return claims_all_entitled_benefits | reported_ctr diff --git a/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction.py new file mode 100644 index 000000000..c8a0f7611 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction.py @@ -0,0 +1,40 @@ +from policyengine_uk.model_api import * + + +class coventry_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Coventry Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.coventry.council_tax_reduction + local_scheme = benunit("coventry_council_tax_reduction_is_local_scheme", period) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + support_rate = benunit("coventry_council_tax_reduction_support_rate", period) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "coventry_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + capital_eligible = capital <= ctr.means_test.capital_limit + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..e91c06b7c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,67 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class coventry_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Coventry CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.coventry.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "coventry_council_tax_reduction_is_local_scheme", period + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ] + person_gross_income = add(person, period, gross_income_components) + weekly_benunit_gross_income = ( + person.benunit.sum(person_gross_income) / WEEKS_IN_YEAR + ) + weekly_deduction = ctr.non_dep_deduction.amount.calc( + weekly_benunit_gross_income + ) + claimant_exempt = person.household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + has_uc = person.benunit("universal_credit", period) > 0 + uc_no_earned_income = has_uc & ( + person( + "coventry_council_tax_reduction_non_dep_uc_earned_income", + period, + ) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..762fcce6e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,39 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_coventry, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class coventry_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Coventry's local CTR scheme" + definition_period = YEAR + reference = "https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + source_local_class = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_coventry(local_authority) + & source_local_class + ) diff --git a/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..fd4f8bdc6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class coventry_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Coventry CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "coventry_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..82d87d8e2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class coventry_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Coventry CTR non-dependant Universal Credit assessed earned income" + documentation = "Source input for person-level earned income used in the non-dependant's Universal Credit award calculation." + definition_period = YEAR + unit = GBP + reference = "https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027" + + def formula(person, period, parameters): + return person("employment_income", period) + person( + "self_employment_income", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..46e75db69 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_support_rate.py @@ -0,0 +1,39 @@ +from policyengine_uk.model_api import * + + +class coventry_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Coventry Council Tax Reduction support rate" + definition_period = YEAR + reference = "https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.coventry.council_tax_reduction + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + uc_applicable_income = benunit( + "coventry_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + excess_income = max_(0, applicable_income - applicable_amount) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + return ctr.income_band.support_rate.calc(excess_income / WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..1a47f7606 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/coventry/council_tax_reduction/coventry_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * + + +class coventry_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Coventry Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.coventry.gov.uk/downloads/file/46761/council-tax-support-scheme-2026-to-2027" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/crawley/council_tax_reduction/crawley_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/crawley/council_tax_reduction/crawley_council_tax_reduction.py new file mode 100644 index 000000000..3b2d24595 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/crawley/council_tax_reduction/crawley_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_crawley_working_age, +) + + +class crawley_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Crawley Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.crawley.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_crawley_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "crawley_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/crawley/council_tax_reduction/crawley_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/crawley/council_tax_reduction/crawley_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..94b993b9c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/crawley/council_tax_reduction/crawley_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_crawley_working_age, +) + + +class crawley_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Crawley CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.crawley.council_tax_reduction + household = person.household + working_age = is_crawley_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_income_based_benefits=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/crawley/council_tax_reduction/crawley_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/crawley/council_tax_reduction/crawley_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..89b1dce33 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/crawley/council_tax_reduction/crawley_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class crawley_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Crawley CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "crawley_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction.py new file mode 100644 index 000000000..0b0bfb1a8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction.py @@ -0,0 +1,60 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_croydon_working_age, +) + + +class croydon_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Croydon Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.croydon.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_croydon_working_age(local_authority, country, has_pensioner) + weekly_income = benunit("croydon_council_tax_reduction_weekly_income", period) + disabled_not_working = benunit( + "croydon_council_tax_reduction_disabled_not_working", period + ) + lone_parent_child_under_5 = benunit( + "croydon_council_tax_reduction_lone_parent_child_under_5", period + ) + support_rate = select( + [ + disabled_not_working, + lone_parent_child_under_5, + ], + [ + ctr.income_band.disabled_not_working.calc(weekly_income), + ctr.income_band.lone_parent_child_under_5.calc(weekly_income), + ], + default=ctr.income_band.standard.calc(weekly_income), + ) + liability = benunit.household( + "croydon_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "croydon_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital = benunit("croydon_council_tax_reduction_assessable_capital", period) + capital_limit = where( + disabled_not_working, + ctr.means_test.capital_limit.disabled_not_working, + ctr.means_test.capital_limit.standard, + ) + capital_eligible = capital < capital_limit + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_assessable_capital.py b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_assessable_capital.py new file mode 100644 index 000000000..0ab75aaf2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_assessable_capital.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class croydon_council_tax_reduction_assessable_capital(Variable): + value_type = float + entity = BenUnit + label = "Croydon Council Tax Support assessable capital" + definition_period = YEAR + unit = GBP + reference = "https://www.croydon.gov.uk/benefits/changes-council-tax-support/your-capital-savings-investments-and-property" + + def formula(benunit, period, parameters): + has_uc = benunit("universal_credit", period) > 0 + return where( + has_uc, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_countable_universal_credit.py b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_countable_universal_credit.py new file mode 100644 index 000000000..2a9381dc9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_countable_universal_credit.py @@ -0,0 +1,29 @@ +from policyengine_uk.model_api import * + + +class croydon_council_tax_reduction_countable_universal_credit(Variable): + value_type = float + entity = BenUnit + label = "Croydon Council Tax Support countable Universal Credit income" + definition_period = YEAR + unit = GBP + reference = "https://www.croydon.gov.uk/benefits/changes-council-tax-support/example-support-calculations" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.croydon.council_tax_reduction + ignored_elements = ( + add( + benunit, + period, + [ + "uc_housing_costs_element", + "uc_LCWRA_element", + "uc_individual_disabled_child_element", + "uc_individual_severely_disabled_child_element", + ], + ) + + benunit("uc_carer_element", period) + * ctr.universal_credit.ignored_carer_element_rate + ) + has_uc = benunit("universal_credit", period) > 0 + return has_uc * max_(0, benunit("universal_credit", period) - ignored_elements) diff --git a/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_disabled_not_working.py b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_disabled_not_working.py new file mode 100644 index 000000000..69dc2911b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_disabled_not_working.py @@ -0,0 +1,48 @@ +from policyengine_uk.model_api import * + + +class croydon_council_tax_reduction_disabled_not_working(Variable): + value_type = bool + entity = BenUnit + label = "Croydon Council Tax Support disabled non-working group" + definition_period = YEAR + reference = "https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + has_uc = person.benunit("universal_credit", period) > 0 + benunit_has_uc = benunit("universal_credit", period) > 0 + has_earned_income = where( + benunit_has_uc, + benunit("uc_earned_income", period) > 0, + benunit.sum(claimant_or_partner * earned_income) > 0, + ) + disabled_or_lcw = ( + (person("pip", period) > 0) + | (person("dla", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | (person("incapacity_benefit", period) > 0) + | person("is_disabled_for_benefits", period) + | person("is_blind", period) + | (has_uc & person("uc_limited_capability_for_WRA", period)) + ) + disabled_claimant_or_partner = benunit.any( + claimant_or_partner & disabled_or_lcw + ) + income_related_esa = benunit("esa_income", period) > 0 + tax_credit_disability = ( + (benunit("WTC_disabled_element", period) > 0) + | (benunit("WTC_severely_disabled_element", period) > 0) + | (benunit("uc_LCWRA_element", period) > 0) + ) + return ( + disabled_claimant_or_partner | income_related_esa | tax_credit_disability + ) & ~has_earned_income diff --git a/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..0d762d22b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,61 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_croydon_working_age, +) + + +class croydon_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Croydon Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.croydon.council_tax_reduction + household = person.household + working_age = is_croydon_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + benunit_earned_income = person.benunit.sum(earned_income) + weekly_deduction = where( + benunit_earned_income > 0, + ctr.non_dep_deduction.working_amount.calc(benunit_earned_income), + ctr.non_dep_deduction.not_working_amount, + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_disabled_not_working = household.any( + claimant_benunit + & household_person.benunit( + "croydon_council_tax_reduction_disabled_not_working", period + ) + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + full_time_student = is_full_time_student_non_dep(person, period) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + exempt = ( + claimant_exempt + | claimant_disabled_not_working + | full_time_student + | income_based_benefit + ) + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_lone_parent_child_under_5.py b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_lone_parent_child_under_5.py new file mode 100644 index 000000000..33a5b2b94 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_lone_parent_child_under_5.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class croydon_council_tax_reduction_lone_parent_child_under_5(Variable): + value_type = bool + entity = BenUnit + label = "Croydon Council Tax Support lone parent with a child under 5" + definition_period = YEAR + reference = "https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support" + + def formula(benunit, period, parameters): + return benunit("is_lone_parent", period) & ( + benunit("youngest_child_age", period) < 5 + ) diff --git a/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..144aebfc9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_croydon_working_age, +) + + +class croydon_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Croydon maximum Council Tax liability eligible for Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.croydon.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_croydon_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + person = household.members + claimant_benunit = person.benunit("benunit_contains_household_head", period) + disabled_not_working = household.any( + claimant_benunit + & person.benunit( + "croydon_council_tax_reduction_disabled_not_working", period + ) + ) + capped = working_age & ~disabled_not_working & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..c704ed976 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class croydon_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Croydon Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "croydon_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..a2f1efd39 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/croydon/council_tax_reduction/croydon_council_tax_reduction_weekly_income.py @@ -0,0 +1,103 @@ +from policyengine_uk.model_api import * + + +class croydon_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Croydon Council Tax Support weekly household income" + definition_period = YEAR + unit = GBP + reference = "https://www.croydon.gov.uk/benefits/changes-council-tax-support/how-we-work-out-amount-council-tax-support" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.croydon.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + gross_earnings = benunit.sum(claimant_or_partner * earned_income) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + net_earnings = max_(0, gross_earnings - earnings_deductions) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "income_support", + "jsa_income", + "jsa_contrib", + "esa_income", + "esa_contrib", + "housing_benefit", + "pension_credit", + "working_tax_credit", + "child_tax_credit", + "carers_allowance", + ], + ) + non_uc_income = max_(0, net_earnings + other_income + benefit_income) + has_uc = benunit("universal_credit", period) > 0 + uc_income = max_( + 0, + benunit("uc_earned_income", period) + + benunit("uc_unearned_income", period) + + benunit( + "croydon_council_tax_reduction_countable_universal_credit", period + ), + ) + annual_income = where(has_uc, uc_income, non_uc_income) + + disabled_not_working = benunit( + "croydon_council_tax_reduction_disabled_not_working", period + ) + person_has_uc = person.benunit("universal_credit", period) > 0 + disability_or_lcw = ( + (person("pip", period) > 0) + | (person("dla", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | (person("incapacity_benefit", period) > 0) + | person("is_disabled_for_benefits", period) + | person("is_blind", period) + | (person_has_uc & person("uc_limited_capability_for_WRA", period)) + ) + disabled_claim = disabled_not_working | benunit.any( + claimant_or_partner & disability_or_lcw + ) + has_earnings = where( + has_uc, + benunit("uc_earned_income", period) > 0, + gross_earnings > 0, + ) + weekly_income = annual_income / WEEKS_IN_YEAR + weekly_disregard = where( + disabled_claim & has_earnings, + ctr.disabled_working_weekly_income_disregard, + 0, + ) + return max_(0, weekly_income - weekly_disregard) diff --git a/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction.py new file mode 100644 index 000000000..d3bdd24c9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction.py @@ -0,0 +1,67 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_cumberland_working_age, +) + + +class cumberland_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Cumberland Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.cumberland.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_cumberland_working_age(local_authority, country, has_pensioner) + has_uc_award = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("cumberland_council_tax_reduction_tariff_income", period) + uc_applicable_income = benunit( + "cumberland_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "cumberland_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..a7904f0ff --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class cumberland_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Cumberland Council Tax Reduction claimant has a source-listed non-dependant deduction exemption" + definition_period = YEAR + reference = "https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..df1ff8b9e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,92 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_cumberland_working_age, +) + + +class cumberland_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Cumberland Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.cumberland.council_tax_reduction + household = person.household + working_age = is_cumberland_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + person_earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + benunit_earned_income = person.benunit.sum(person_earned_income) + weekly_gross_income = benunit_gross_income / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "cumberland_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = (person.benunit("universal_credit", period) > 0) & ( + benunit_earned_income <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person( + "cumberland_council_tax_reduction_non_dep_source_exemption", period + ) + ) + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..e239b8f68 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class cumberland_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Cumberland Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "cumberland_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..46645cafc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class cumberland_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Cumberland Council Tax Reduction non-dependant has a source-listed deduction exemption" + definition_period = YEAR + reference = "https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..350e21bf1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_tariff_income.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class cumberland_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Cumberland Council Tax Reduction tariff income from capital" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + tariff = parameters( + period + ).gov.local_authorities.cumberland.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.floor(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..2821b33af --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/cumberland/council_tax_reduction/cumberland_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class cumberland_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Cumberland Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.cumberland.gov.uk/sites/default/files/2026-04/cumberland_council_final_council_tax_reduction_ctr_scheme_for_2026_to_2027.pdf" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/darlington/council_tax_reduction/darlington_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/darlington/council_tax_reduction/darlington_council_tax_reduction.py new file mode 100644 index 000000000..9c342959b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/darlington/council_tax_reduction/darlington_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_darlington_working_age, +) + + +class darlington_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Darlington Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.darlington.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_darlington_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "darlington_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/darlington/council_tax_reduction/darlington_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/darlington/council_tax_reduction/darlington_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..5b2364177 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/darlington/council_tax_reduction/darlington_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_darlington_working_age, +) + + +class darlington_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Darlington CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.darlington.council_tax_reduction + household = person.household + working_age = is_darlington_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/darlington/council_tax_reduction/darlington_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/darlington/council_tax_reduction/darlington_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..d1744e5f8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/darlington/council_tax_reduction/darlington_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class darlington_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Darlington CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "darlington_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction.py new file mode 100644 index 000000000..6812e39c8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * + + +class dartford_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Dartford Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.dartford.council_tax_reduction + local_scheme = benunit("dartford_council_tax_reduction_is_local_scheme", period) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "dartford_council_tax_reduction_non_dep_deductions", period + ) + support_rate = benunit("dartford_council_tax_reduction_support_rate", period) + eligible_liability = max_(0, liability - non_dep_deductions) + preliminary_award = eligible_liability * support_rate + annual_minimum_award = ctr.means_test.minimum_award * WEEKS_IN_YEAR + award = where(preliminary_award >= annual_minimum_award, preliminary_award, 0) + has_uc_award = benunit("universal_credit", period) > 0 + capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + capital_eligible = capital <= ctr.means_test.capital_limit + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..593452243 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_dartford, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class dartford_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Dartford's local CTR scheme" + definition_period = YEAR + reference = "https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + source_working_age = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_dartford(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..502165de1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class dartford_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Dartford Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = "https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027" + + def formula(benunit, period, parameters): + return 0 diff --git a/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..8f6bdc663 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class dartford_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Dartford Council Tax Reduction source-disregarded annual income" + documentation = "Source-listed income disregards not otherwise separately exposed in PolicyEngine UK, such as war disablement pensions, war widow(er) pensions, or specified compensation payments." + definition_period = YEAR + unit = GBP + reference = "https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..40ec4e78f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_support_rate.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * + + +class dartford_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Dartford Council Tax Reduction support rate" + definition_period = YEAR + reference = "https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.dartford.council_tax_reduction + weekly_income = benunit("dartford_council_tax_reduction_weekly_income", period) + weekly_income_for_band = weekly_income + 1e-9 + person = benunit.members + children = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + is_couple = benunit("is_couple", period) + bands = ctr.income_band + support_rate = select( + [ + children >= 2, + children == 1, + is_couple, + ], + [ + bands.two_or_more_children.calc(weekly_income_for_band), + bands.one_child.calc(weekly_income_for_band), + bands.couple.calc(weekly_income_for_band), + ], + default=bands.single.calc(weekly_income_for_band), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where(relevant_income_based_benefit, 0.8, support_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..c2ae67f7e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dartford/council_tax_reduction/dartford_council_tax_reduction_weekly_income.py @@ -0,0 +1,122 @@ +from policyengine_uk.model_api import * + + +class dartford_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Dartford Council Tax Reduction weekly net income" + definition_period = YEAR + unit = GBP + reference = "https://www.dartford.gov.uk/downloads/file/2814/local-council-tax-reduction-scheme-dbc-2026-2027" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.dartford.council_tax_reduction + has_uc_award = benunit("universal_credit", period) > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + net_earnings = max_(0, gross_earnings - earnings_deductions) + earnings_disregard = ( + (gross_earnings > 0) + * ~has_uc_award + * ctr.earnings_disregard.amount + * WEEKS_IN_YEAR + ) + countable_earnings = max_(0, net_earnings - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "tax_credits", + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "jsa_contrib", + "esa_contrib", + ], + ) + disregarded_income = add( + benunit, + period, + [ + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "housing_benefit", + "dartford_council_tax_reduction_source_disregarded_income", + ], + ) + benunit.sum(claimant_or_partner * person("maintenance_income", period)) + non_uc_income = countable_earnings + max_( + 0, other_income + benefit_income - disregarded_income + ) + uc_disregarded_unearned_income = add( + benunit, + period, + [ + "carers_allowance", + "dartford_council_tax_reduction_source_disregarded_income", + ], + ) + uc_income = ( + benunit("uc_earned_income", period) + + max_( + 0, + benunit("uc_unearned_income", period) - uc_disregarded_unearned_income, + ) + + max_( + 0, + benunit("universal_credit", period) + - benunit("uc_housing_costs_element", period), + ) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + annual_income = where(has_uc_award, uc_income, non_uc_income) + weekly_income = where(relevant_income_based_benefit, 0, annual_income) / ( + WEEKS_IN_YEAR + ) + return np.round(max_(0, weekly_income) * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction.py new file mode 100644 index 000000000..2f9f89d64 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_derby_working_age, +) + + +class derby_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Derby Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.derby.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_derby_working_age(local_authority, country, has_pensioner) + award = legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "derby_council_tax_reduction_non_dep_deductions", + maximum_eligible_liability_variable=( + "derby_council_tax_reduction_maximum_eligible_liability" + ), + ) + annual_minimum_award = ctr.means_test.minimum_award * WEEKS_IN_YEAR + return where(award >= annual_minimum_award, award, 0) diff --git a/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..d1bcb5fbf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,68 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_derby_working_age, +) + + +class derby_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Derby Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = "https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.derby.council_tax_reduction + household = person.household + working_age = is_derby_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + gross_income = earned_income + add( + person, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ], + ) + weekly_gross_income = person.benunit.sum(gross_income) / WEEKS_IN_YEAR + weekly_earned_income = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + is_remunerative_work = person.benunit.max(person("weekly_hours", period)) >= 16 + has_uc_award = person.benunit("universal_credit", period) > 0 + passport_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + derby_low_deduction = ( + is_remunerative_work + & (weekly_gross_income < ctr.non_dep_deduction.low_income_threshold) + ) | (~is_remunerative_work & (has_uc_award | passport_benefit)) + weekly_deduction = where( + derby_low_deduction, + ctr.non_dep_deduction.low_amount, + where( + is_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ), + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + exempt = claimant_exempt | is_full_time_student_non_dep(person, period) + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..47f6db153 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_derby_working_age, +) + + +class derby_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Derby maximum Council Tax liability eligible for Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf" + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.derby.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_derby_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + capped = working_age & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..d9f02d8f5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/derby/council_tax_reduction/derby_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class derby_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Derby Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = "https://www.derby.gov.uk/media/derbycitycouncil/contentassets/documents/adviceandbenefits/counciltax/council-tax-support-scheme2026-27.pdf" + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "derby_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction.py new file mode 100644 index 000000000..99ae17e12 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_dudley_working_age, +) + + +class dudley_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Dudley Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.dudley.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_dudley_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "dudley_council_tax_reduction_non_dep_deductions", + maximum_eligible_liability_variable=( + "dudley_council_tax_reduction_maximum_eligible_liability" + ), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..f5f3623c8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_dudley_working_age, +) + + +class dudley_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Dudley CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.dudley.council_tax_reduction + household = person.household + working_age = is_dudley_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..a2b56abc1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_dudley_working_age, +) + + +class dudley_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Dudley maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.dudley.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_dudley_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + capped = working_age & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..6e6686641 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/dudley/council_tax_reduction/dudley_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class dudley_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Dudley CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "dudley_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction.py new file mode 100644 index 000000000..b74652dbb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction.py @@ -0,0 +1,44 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_ealing_working_age, +) + + +class ealing_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Ealing Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.ealing.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_ealing_working_age(local_authority, country, has_pensioner) + weekly_income = benunit("ealing_council_tax_reduction_weekly_income", period) + protected = benunit("ealing_council_tax_reduction_protected", period) + support_rate = where( + protected, + ctr.income_band.protected.calc(weekly_income), + ctr.income_band.non_protected.calc(weekly_income), + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "ealing_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + award = where(award < ctr.minimum_award * WEEKS_IN_YEAR, 0, award) + capital_eligible = ( + benunit.household("savings", period) < ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_care_leaver.py b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_care_leaver.py new file mode 100644 index 000000000..a7001c1a7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_care_leaver.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class ealing_council_tax_reduction_care_leaver(Variable): + value_type = bool + entity = Person + label = "Ealing CTR care leaver" + definition_period = YEAR + reference = "https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_countable_universal_credit.py b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_countable_universal_credit.py new file mode 100644 index 000000000..7e8b938bb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_countable_universal_credit.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * + + +class ealing_council_tax_reduction_countable_universal_credit(Variable): + value_type = float + entity = BenUnit + label = "Ealing CTR countable Universal Credit income" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + has_uc = benunit("universal_credit", period) > 0 + assessed_income = add( + benunit, + period, + [ + "uc_earned_income", + "uc_unearned_income", + ], + ) + return has_uc * assessed_income diff --git a/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..9d3d2c6ad --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_ealing_working_age, +) + + +class ealing_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Ealing CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.ealing.council_tax_reduction + household = person.household + working_age = is_ealing_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + gross_earnings = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_gross_earnings = gross_earnings / WEEKS_IN_YEAR + exempt = claimant_exempt | is_full_time_student_non_dep(person, period) + deduction = ( + ctr.non_dep_deduction.amount.calc(weekly_gross_earnings) * WEEKS_IN_YEAR + ) + return working_age * where(exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..b931f3ca0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,17 @@ +from policyengine_uk.model_api import * + + +class ealing_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Ealing CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + deductions = benunit.members( + "ealing_council_tax_reduction_individual_non_dep_deduction", + period, + ) + deductions_in_household = benunit.max(benunit.members.household.sum(deductions)) + return deductions_in_household - benunit.sum(deductions) diff --git a/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_protected.py b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_protected.py new file mode 100644 index 000000000..ce9f57d50 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_protected.py @@ -0,0 +1,62 @@ +from policyengine_uk.model_api import * + + +class ealing_council_tax_reduction_protected(Variable): + value_type = bool + entity = BenUnit + label = "Ealing CTR protected working-age class" + definition_period = YEAR + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + disability_or_carer = benunit.any( + claimant_or_partner + & ( + (person("dla", period) > 0) + | (person("pip", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("carers_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + ) + ) + employment_and_support_allowance = benunit("esa", period) > 0 + uc_protected = benunit.any( + claimant_or_partner & person("uc_limited_capability_for_WRA", period) + ) | ( + add( + benunit, + period, + [ + "uc_disability_elements", + "uc_carer_element", + ], + ) + > 0 + ) + underlying_carer = benunit.any( + claimant_or_partner + & person( + "ealing_council_tax_reduction_underlying_carers_allowance_entitlement", + period, + ) + ) + care_leaver_under_25 = benunit.any( + claimant_or_partner + & person("ealing_council_tax_reduction_care_leaver", period) + & (person("age", period) < 25) + ) + lone_parent_with_child_under_5 = benunit("is_lone_parent", period) & ( + benunit("youngest_child_age", period) < 5 + ) + return ( + disability_or_carer + | employment_and_support_allowance + | uc_protected + | underlying_carer + | care_leaver_under_25 + | lone_parent_with_child_under_5 + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_self_employment_startup_period.py b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_self_employment_startup_period.py new file mode 100644 index 000000000..1438d77ee --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_self_employment_startup_period.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class ealing_council_tax_reduction_self_employment_startup_period(Variable): + value_type = bool + entity = Person + label = "Ealing CTR self-employment startup period" + definition_period = YEAR + reference = "https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_underlying_carers_allowance_entitlement.py b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_underlying_carers_allowance_entitlement.py new file mode 100644 index 000000000..5c3a29c3f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_underlying_carers_allowance_entitlement.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class ealing_council_tax_reduction_underlying_carers_allowance_entitlement(Variable): + value_type = bool + entity = Person + label = "Ealing CTR underlying Carer's Allowance entitlement" + definition_period = YEAR + reference = "https://www.ealing.gov.uk/download/downloads/id/19657/council_tax_reduction_scheme_2026_to_2027.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..ee605be0a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ealing/council_tax_reduction/ealing_council_tax_reduction_weekly_income.py @@ -0,0 +1,97 @@ +from policyengine_uk.model_api import * + + +class ealing_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Ealing CTR weekly income" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.ealing.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + employment_income = benunit.sum( + claimant_or_partner * person("employment_income", period) + ) + self_employment_income = person("self_employment_income", period) + self_employed = claimant_or_partner & (self_employment_income > 0) + startup_period = person( + "ealing_council_tax_reduction_self_employment_startup_period", + period, + ) + mif_applies = self_employed & ~startup_period + national_living_wage = parameters( + period + ).gov.hmrc.minimum_wage.non_apprentice.calc(25) + minimum_wage = mif_applies * national_living_wage + weekly_mif = benunit.sum(minimum_wage) * 35 + weekly_mif = where( + benunit("is_lone_parent", period), + benunit.max(minimum_wage) * 16, + weekly_mif, + ) + weekly_mif = where( + benunit("is_couple", period) + & (benunit("num_children", period) > 0) + & (benunit.sum(mif_applies) >= 2), + benunit.max(minimum_wage) * 35 + + (benunit.sum(minimum_wage) - benunit.max(minimum_wage)) * 16, + weekly_mif, + ) + self_employment_income = benunit.sum( + (self_employed & startup_period) * self_employment_income + ) + max_( + benunit.sum(mif_applies * self_employment_income), + weekly_mif * WEEKS_IN_YEAR, + ) + earned_income = employment_income + self_employment_income + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + has_uc = benunit("universal_credit", period) > 0 + earnings_disregard = where( + (earned_income > 0) & ~benunit("is_single_person", period) & ~has_uc, + ctr.earnings_disregard.couple_or_lone_parent * WEEKS_IN_YEAR, + 0, + ) + net_earnings = max_(0, earned_income - earnings_deductions - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + countable_uc = benunit( + "ealing_council_tax_reduction_countable_universal_credit", + period, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + income = where( + relevant_income_based_benefit, + 0, + where(has_uc, countable_uc, net_earnings + other_income), + ) + return income / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/east_cambridgeshire/council_tax_reduction/east_cambridgeshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/east_cambridgeshire/council_tax_reduction/east_cambridgeshire_council_tax_reduction.py new file mode 100644 index 000000000..3b5f1e1ac --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_cambridgeshire/council_tax_reduction/east_cambridgeshire_council_tax_reduction.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_east_cambridgeshire_working_age, +) + + +class east_cambridgeshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "East Cambridgeshire Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.east_cambridgeshire.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_east_cambridgeshire_working_age( + local_authority, country, has_pensioner + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "east_cambridgeshire_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/east_cambridgeshire/council_tax_reduction/east_cambridgeshire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/east_cambridgeshire/council_tax_reduction/east_cambridgeshire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..046e0ac1d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_cambridgeshire/council_tax_reduction/east_cambridgeshire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_east_cambridgeshire_working_age, +) + + +class east_cambridgeshire_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "East Cambridgeshire CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.east_cambridgeshire.council_tax_reduction + household = person.household + working_age = is_east_cambridgeshire_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/east_cambridgeshire/council_tax_reduction/east_cambridgeshire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/east_cambridgeshire/council_tax_reduction/east_cambridgeshire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..23dac104f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_cambridgeshire/council_tax_reduction/east_cambridgeshire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class east_cambridgeshire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "East Cambridgeshire CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "east_cambridgeshire_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction.py new file mode 100644 index 000000000..71c01d58b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction.py @@ -0,0 +1,70 @@ +from policyengine_uk.model_api import * + + +class east_hampshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "East Hampshire Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.east_hampshire.council_tax_reduction + local_scheme = benunit( + "east_hampshire_council_tax_reduction_is_local_scheme", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + applicable_income = where( + has_uc_award, + benunit( + "east_hampshire_council_tax_reduction_uc_applicable_income", period + ), + benunit("council_tax_reduction_applicable_income", period), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where( + relevant_income_based_benefit & ~has_uc_award, 0, excess_income + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "east_hampshire_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..381ed58ea --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) + + +class east_hampshire_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "East Hampshire individual Council Tax Support non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.east_hampshire.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "east_hampshire_council_tax_reduction_is_local_scheme", period + ) + ) + return normal_gross_income_non_dep_deduction( + person, + period, + ctr, + local_scheme, + exempt_uc_no_earned_income=False, + exempt_under_25_uc_no_earned_income=True, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..e14bfd4aa --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,51 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_east_hampshire, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class east_hampshire_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether the benefit unit is under East Hampshire's local Council Tax " + "Support scheme" + ) + definition_period = YEAR + reference = "https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "east_hampshire_council_tax_reduction_uc_relevant_period_pensioner", + period, + ) | benunit( + "east_hampshire_council_tax_reduction_uc_regulation_60a_pensioner", + period, + ) + local_case = ( + has_working_age_adult + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return ( + (country == Country.ENGLAND) + & is_east_hampshire(local_authority) + & local_case + ) diff --git a/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..870e94368 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class east_hampshire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "East Hampshire Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "east_hampshire_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..6ea8ea126 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class east_hampshire_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "East Hampshire Universal Credit applicable income for Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * (uc_income + benunit("universal_credit", period)) diff --git a/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..513904067 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class east_hampshire_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether East Hampshire's Universal Credit regulation 60A pensioner " + "exception applies" + ) + definition_period = YEAR + reference = "https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..cf73cc112 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hampshire/council_tax_reduction/east_hampshire_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class east_hampshire_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether East Hampshire's Universal Credit relevant-period pensioner " + "exception applies" + ) + definition_period = YEAR + reference = "https://www.easthants.gov.uk/sites/default/files/2026-03/Council%20tax%20support%20scheme%202026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/east_hertfordshire/council_tax_reduction/east_hertfordshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/east_hertfordshire/council_tax_reduction/east_hertfordshire_council_tax_reduction.py new file mode 100644 index 000000000..097631308 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hertfordshire/council_tax_reduction/east_hertfordshire_council_tax_reduction.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_east_hertfordshire_working_age, +) + + +class east_hertfordshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "East Hertfordshire Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.east_hertfordshire.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_east_hertfordshire_working_age( + local_authority, country, has_pensioner + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "east_hertfordshire_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/east_hertfordshire/council_tax_reduction/east_hertfordshire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/east_hertfordshire/council_tax_reduction/east_hertfordshire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..064eb97c0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hertfordshire/council_tax_reduction/east_hertfordshire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_east_hertfordshire_working_age, +) + + +class east_hertfordshire_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "East Hertfordshire CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.east_hertfordshire.council_tax_reduction + household = person.household + working_age = is_east_hertfordshire_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/east_hertfordshire/council_tax_reduction/east_hertfordshire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/east_hertfordshire/council_tax_reduction/east_hertfordshire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..736fdb556 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_hertfordshire/council_tax_reduction/east_hertfordshire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class east_hertfordshire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "East Hertfordshire CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "east_hertfordshire_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/east_suffolk/council_tax_reduction/east_suffolk_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/east_suffolk/council_tax_reduction/east_suffolk_council_tax_reduction.py new file mode 100644 index 000000000..c23d165e7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_suffolk/council_tax_reduction/east_suffolk_council_tax_reduction.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_east_suffolk_working_age, +) + + +class east_suffolk_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "East Suffolk Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.east_suffolk.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_east_suffolk_working_age( + local_authority, country, has_pensioner + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "east_suffolk_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/east_suffolk/council_tax_reduction/east_suffolk_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/east_suffolk/council_tax_reduction/east_suffolk_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..fd5df6f16 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_suffolk/council_tax_reduction/east_suffolk_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_east_suffolk_working_age, +) + + +class east_suffolk_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "East Suffolk CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.east_suffolk.council_tax_reduction + household = person.household + working_age = is_east_suffolk_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/east_suffolk/council_tax_reduction/east_suffolk_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/east_suffolk/council_tax_reduction/east_suffolk_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..bbc310862 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/east_suffolk/council_tax_reduction/east_suffolk_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class east_suffolk_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "East Suffolk CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "east_suffolk_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction.py new file mode 100644 index 000000000..e4fae7591 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction.py @@ -0,0 +1,102 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_enfield_working_age, +) + + +class enfield_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Enfield Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.enfield.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_enfield_working_age(local_authority, country, has_pensioner) + protected = benunit("enfield_council_tax_reduction_protected_group", period) + liability = benunit.household( + "enfield_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "enfield_council_tax_reduction_non_dep_deductions", period + ) + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + applicable_income = benunit( + "enfield_council_tax_reduction_applicable_income", period + ) + benunit("enfield_council_tax_reduction_tariff_income", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + non_uc_rate = where( + protected, + ctr.maximum_support_rate.protected, + ctr.maximum_support_rate.non_protected, + ) + non_uc_award = max_( + 0, + liability * non_uc_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + + weekly_earnings = benunit( + "enfield_council_tax_reduction_uc_weekly_earnings", period + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_children = benunit.sum(child_or_young_person) + is_couple = benunit("is_couple", period) + uc_bands = ctr.uc_income_band + uc_rate = select( + [ + protected & (num_children >= 2), + protected & (num_children == 1), + protected & is_couple, + protected, + num_children >= 2, + num_children == 1, + is_couple, + ], + [ + uc_bands.protected.family_two_or_more_children.calc(weekly_earnings), + uc_bands.protected.family_one_child.calc(weekly_earnings), + uc_bands.protected.couple.calc(weekly_earnings), + uc_bands.protected.single.calc(weekly_earnings), + uc_bands.non_protected.family_two_or_more_children.calc( + weekly_earnings + ), + uc_bands.non_protected.family_one_child.calc(weekly_earnings), + uc_bands.non_protected.couple.calc(weekly_earnings), + ], + default=uc_bands.non_protected.single.calc(weekly_earnings), + ) + uc_award = max_(0, liability * uc_rate - non_dep_deductions) + has_uc_award = benunit("universal_credit", period) > 0 + award = where(has_uc_award, uc_award, non_uc_award) + award = where(award < ctr.minimum_award * WEEKS_IN_YEAR, 0, award) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_applicable_income.py new file mode 100644 index 000000000..ef58b726f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_applicable_income.py @@ -0,0 +1,65 @@ +from policyengine_uk.model_api import * + + +class enfield_council_tax_reduction_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Enfield CTR applicable income" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "enfield_council_tax_reduction_childcare_deduction", period + ) + net_earnings = max_( + 0, gross_earnings - earnings_deductions - childcare_deduction + ) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "carers_allowance", + "esa_contrib", + "jsa_contrib", + "state_pension", + "maternity_allowance", + "statutory_sick_pay", + "statutory_maternity_pay", + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "miscellaneous_income", + ], + ) + ) + tax_credits = benunit("tax_credits", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + applicable_income = net_earnings + other_income + tax_credits + return where(relevant_income_based_benefit, 0, applicable_income) diff --git a/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..cbddee5fd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,61 @@ +from policyengine_uk.model_api import * + + +class enfield_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Enfield CTR childcare deduction from earnings" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + childcare = parameters(period).gov.dwp.tax_credits.working_tax_credit.elements + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + works_enough_hours = person("weekly_hours", period) >= 16 + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + claimant_or_partner & works_enough_hours + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + works_enough_hours | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | (person("incapacity_benefit", period) > 0) + | person("uc_limited_capability_for_WRA", period) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(claimant_or_partner & works_enough_hours) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = person("is_child", period) & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & person("is_disabled_for_benefits", period) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [ + eligible_children >= 2, + eligible_children == 1, + ], + [ + childcare.childcare_2, + childcare.childcare_1, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..6d8c17857 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_enfield_working_age, +) + + +class enfield_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Enfield maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.enfield.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_enfield_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + capped = working_age & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..b563dd6f6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,48 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_enfield_working_age, +) + + +class enfield_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Enfield CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.enfield.council_tax_reduction + working_age = is_enfield_working_age( + benunit.household("local_authority", period), + benunit.household("country", period), + benunit.household("council_tax_reduction_household_has_pensioner", period), + ) + person = benunit.members + eligible = person( + "council_tax_reduction_individual_non_dep_deduction_eligible", + period, + ) + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + exempt = child_or_young_person | is_full_time_student_non_dep(person, period) + countable = eligible & ~exempt + gross_earnings = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_gross_earnings = benunit.sum(countable * gross_earnings) / WEEKS_IN_YEAR + deduction_for_benunit = where( + benunit.any(countable), + ctr.non_dep_deduction.amount.calc(weekly_gross_earnings) * WEEKS_IN_YEAR, + 0, + ) + is_benunit_head = person("is_benunit_head", period) + deductions_to_count = is_benunit_head * benunit.project(deduction_for_benunit) + deductions_in_household = benunit.max( + benunit.members.household.sum(deductions_to_count) + ) + return working_age * (deductions_in_household - deduction_for_benunit) diff --git a/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..37ca48533 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_protected_group.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class enfield_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Enfield CTR working-age protected group" + definition_period = YEAR + + def formula(benunit, period, parameters): + single_under_25 = benunit("is_single_person", period) & ( + benunit("eldest_adult_age", period) < 25 + ) + return single_under_25 | benunit( + "enfield_council_tax_reduction_war_widow", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..af784a2fc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_tariff_income.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class enfield_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Enfield CTR tariff income from capital" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + tariff = parameters( + period + ).gov.local_authorities.enfield.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + return tariff_units * tariff.amount * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_uc_weekly_earnings.py b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_uc_weekly_earnings.py new file mode 100644 index 000000000..94e93801c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_uc_weekly_earnings.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * + + +class enfield_council_tax_reduction_uc_weekly_earnings(Variable): + value_type = float + entity = BenUnit + label = "Enfield CTR Universal Credit weekly net earnings" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner * person("uc_mif_capped_earned_income", period) + ) + deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + return max_(0, gross_earnings - deductions) / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_war_widow.py b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_war_widow.py new file mode 100644 index 000000000..c48fb4b4f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/enfield/council_tax_reduction/enfield_council_tax_reduction_war_widow.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class enfield_council_tax_reduction_war_widow(Variable): + value_type = bool + entity = BenUnit + label = "Enfield CTR war widow protected group" + definition_period = YEAR + reference = "https://www.enfield.gov.uk/__data/assets/pdf_file/0019/126262/Council-tax-reduction-scheme-2026-to-2027-Benefits-and-money-advice.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/fenland/council_tax_reduction/fenland_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/fenland/council_tax_reduction/fenland_council_tax_reduction.py new file mode 100644 index 000000000..7d90d9e39 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/fenland/council_tax_reduction/fenland_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_fenland_working_age, +) + + +class fenland_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Fenland Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.fenland.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_fenland_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "fenland_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/fenland/council_tax_reduction/fenland_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/fenland/council_tax_reduction/fenland_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..bc648510d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/fenland/council_tax_reduction/fenland_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_fenland_working_age, +) + + +class fenland_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Fenland CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.fenland.council_tax_reduction + household = person.household + working_age = is_fenland_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/fenland/council_tax_reduction/fenland_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/fenland/council_tax_reduction/fenland_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..e60d3e342 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/fenland/council_tax_reduction/fenland_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class fenland_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Fenland CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "fenland_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction.py new file mode 100644 index 000000000..0d7dc07ee --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction.py @@ -0,0 +1,50 @@ +from policyengine_uk.model_api import * + + +class forest_of_dean_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Forest of Dean Council Tax Support" + documentation = "Forest of Dean operates a banded discount scheme with Class A (non-protected) and Class B (protected) maximum percentage tables. Paragraph 57.1 caps the working-age maximum at 90 per cent of the Band E equivalent for Class A and paragraph 57.6 raises that maximum to 95 per cent for Class B. Section 59 reduces the percentage entitlement by income band, with separate Single, Couple, Lone Parent and Couple with Children income tiers. Section 15A uses UC-assessed income and capital for UC claimants. Section 58 applies the prescribed gross-income non-dependant deduction schedule with the one-deduction couple rule. Pension-age applicants without a working-age income-related benefit go to the prescribed pensioner scheme via simulated_council_tax_reduction_benunit." + definition_period = YEAR + unit = GBP + reference = "https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.forest_of_dean.council_tax_reduction + local_scheme = benunit( + "forest_of_dean_council_tax_reduction_is_local_scheme", period + ) + band_rate = benunit("forest_of_dean_council_tax_reduction_band_rate", period) + liability = benunit( + "forest_of_dean_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "forest_of_dean_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * band_rate - non_dep_deductions) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_band_rate.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_band_rate.py new file mode 100644 index 000000000..b98dd671a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_band_rate.py @@ -0,0 +1,60 @@ +from policyengine_uk.model_api import * + + +class forest_of_dean_council_tax_reduction_band_rate(Variable): + value_type = float + entity = BenUnit + label = "Forest of Dean weekly income-band CTS rate" + documentation = "Section 59 selects the entitlement percentage from the Class A or Class B six-band table based on the claimant and partner's weekly net income and household type (Single, Couple, Lone Parent or Couple with Children)." + definition_period = YEAR + reference = "https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.forest_of_dean.council_tax_reduction + weekly_income = benunit( + "forest_of_dean_council_tax_reduction_weekly_income", period + ) + # Pad slightly so that exactly-on-the-boundary tests fall in the lower band. + weekly_income_for_band = weekly_income + 1e-9 + is_couple = benunit("is_couple", period) + is_lone_parent = benunit("is_lone_parent", period) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_dependants = benunit.sum(child_or_young_person) + has_children = num_dependants > 0 + protected = benunit( + "forest_of_dean_council_tax_reduction_protected_group", period + ) + non_protected_bands = ctr.income_band.non_protected + protected_bands = ctr.income_band.protected + non_protected_rate = select( + [ + is_couple & has_children, + is_couple, + is_lone_parent, + ], + [ + non_protected_bands.couple_with_children.calc(weekly_income_for_band), + non_protected_bands.couple.calc(weekly_income_for_band), + non_protected_bands.lone_parent.calc(weekly_income_for_band), + ], + default=non_protected_bands.single.calc(weekly_income_for_band), + ) + protected_rate = select( + [ + is_couple & has_children, + is_couple, + is_lone_parent, + ], + [ + protected_bands.couple_with_children.calc(weekly_income_for_band), + protected_bands.couple.calc(weekly_income_for_band), + protected_bands.lone_parent.calc(weekly_income_for_band), + ], + default=protected_bands.single.calc(weekly_income_for_band), + ) + return where(protected, protected_rate, non_protected_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..bf6478631 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,30 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) + + +class forest_of_dean_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Forest of Dean individual Council Tax Support non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.forest_of_dean.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "forest_of_dean_council_tax_reduction_is_local_scheme", period + ) + ) + return normal_gross_income_non_dep_deduction(person, period, ctr, local_scheme) diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..8e1152598 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_forest_of_dean, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class forest_of_dean_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether the benefit unit is under Forest of Dean's local Council Tax Support" + " scheme" + ) + documentation = "Paragraph 1.4 limits the working-age scheme to applicants who have not attained State Pension Credit qualifying age, plus pension-age applicants whose claimant or partner is on Income Support, income-based JSA or income-related ESA. Pure pension-age cases follow the prescribed pensioner scheme via simulated_council_tax_reduction_benunit." + definition_period = YEAR + reference = "https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + local_case = has_working_age_adult | relevant_income_based_benefit + return ( + (country == Country.ENGLAND) + & is_forest_of_dean(local_authority) + & local_case + ) diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..661a46a5c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class forest_of_dean_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = BenUnit + label = ( + "Forest of Dean maximum Council Tax liability eligible for Council Tax Support" + ) + documentation = "Paragraphs 57.1(a) and 57.6(a) cap working-age eligible liability at the Band E equivalent for the dwelling, regardless of Class A or Class B." + definition_period = YEAR + unit = GBP + reference = "https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.forest_of_dean.council_tax_reduction + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + household = benunit.household + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + capped = band_ratio > cap_band_ratio + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..fddeb15ba --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class forest_of_dean_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Forest of Dean Council Tax Support non-dependant deductions" + documentation = "Section 58 uses the prescribed Default Scheme gross-income non-dependant deduction schedule, with paragraph 58.3 applying the one-deduction couple rule to all couples (no Universal Credit carve-out, in contrast to the prescribed Default Scheme paragraph 30(3))." + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "forest_of_dean_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=True, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..1d1468d9c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_protected_group.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * + + +class forest_of_dean_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Forest of Dean claimant qualifies for the Class B protected scheme" + documentation = "Class B (h) and (i) protect benefit units where the claimant, partner or a dependant receives one of: Armed Forces Independence Payment, Attendance Allowance, Disability Living Allowance, Employment and Support Allowance, Personal Independence Payment, Severe Disability Allowance, War Pension or War Widow's Pension, or the Work Capability Element of Universal Credit. War Pension/War Widow's Pension and the UC Work Capability Element are not modelled in PolicyEngine UK and are covered by Forest of Dean-scoped source inputs." + definition_period = YEAR + reference = "https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + # Any benunit member - claimant, partner or dependant - with a modelled + # qualifying benefit makes the benunit Class B (paragraphs (h) and (i)). + modelled_qualifying_benefit = ( + (person("armed_forces_independence_payment", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("dla", period) > 0) + | (person("pip", period) > 0) + | (person("sda", period) > 0) + ) + any_member_qualifying = benunit.any(modelled_qualifying_benefit) + # ESA at the benunit level (income or contributory). + esa_qualifying = (benunit("esa_income", period) > 0) | ( + benunit("esa_contrib", period) > 0 + ) + # Source-input booleans for facts PolicyEngine UK does not model directly. + war_pension = benunit( + "forest_of_dean_council_tax_reduction_war_pension", period + ) + uc_lcw_element = benunit( + "forest_of_dean_council_tax_reduction_uc_lcw_element", period + ) + return any_member_qualifying | esa_qualifying | war_pension | uc_lcw_element diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_uc_lcw_element.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_uc_lcw_element.py new file mode 100644 index 000000000..f7b819ce9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_uc_lcw_element.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class forest_of_dean_council_tax_reduction_uc_lcw_element(Variable): + value_type = bool + entity = BenUnit + label = ( + "Forest of Dean Class B claimant or partner receives the Universal Credit Work" + " Capability Element" + ) + documentation = "Class B (h) qualifies for protected support where the claimant or partner receives the Work Capability Element of Universal Credit. PolicyEngine UK does not model the standalone Work Capability Element directly, so this Forest of Dean-scoped source input flags the case." + definition_period = YEAR + reference = "https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_war_pension.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_war_pension.py new file mode 100644 index 000000000..c6b1f3f55 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_war_pension.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class forest_of_dean_council_tax_reduction_war_pension(Variable): + value_type = bool + entity = BenUnit + label = ( + "Forest of Dean Class B claimant or partner receives a war pension or war" + " widow's pension" + ) + documentation = "Class B (h) qualifies for protected support where the claimant or partner receives a War Pension or War Widow's Pension. PolicyEngine UK does not model those payments directly, so this Forest of Dean-scoped source input flags the case." + definition_period = YEAR + reference = "https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..5c4f0dc34 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/forest_of_dean/council_tax_reduction/forest_of_dean_council_tax_reduction_weekly_income.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * + + +class forest_of_dean_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Forest of Dean Council Tax Support assessed weekly income" + documentation = "Weekly net income of the claimant and partner used to look up the section 59 entitlement bands. Non-UC cases use the prescribed Default Scheme applicable income divided by 52 after the scheme's Schedule 3 and 4 disregards. Income Support, income-based JSA and income-related ESA cases are placed in the top band under Class A/Class B criterion (g). UC cases use section 15A: DWP-assessed UC income plus the UC award." + definition_period = YEAR + unit = GBP + reference = "https://www.fdean.gov.uk/media/r4ff2lok/council-tax-support-scheme-for-working-age-customers-2026-to-2027.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = ( + benunit("uc_earned_income", period) + + benunit("uc_unearned_income", period) + + benunit("universal_credit", period) + ) + weekly_income = where( + has_uc_award, + uc_income / WEEKS_IN_YEAR, + benunit("council_tax_reduction_applicable_income", period) / WEEKS_IN_YEAR, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where(relevant_income_based_benefit & ~has_uc_award, 0, weekly_income) diff --git a/policyengine_uk/variables/gov/local_authorities/gateshead/council_tax_reduction/gateshead_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/gateshead/council_tax_reduction/gateshead_council_tax_reduction.py new file mode 100644 index 000000000..788402253 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gateshead/council_tax_reduction/gateshead_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_gateshead_working_age, +) + + +class gateshead_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Gateshead Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.gateshead.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_gateshead_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "gateshead_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/gateshead/council_tax_reduction/gateshead_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/gateshead/council_tax_reduction/gateshead_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..b1f44becc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gateshead/council_tax_reduction/gateshead_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_gateshead_working_age, +) + + +class gateshead_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Gateshead CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.gateshead.council_tax_reduction + household = person.household + working_age = is_gateshead_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/gateshead/council_tax_reduction/gateshead_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/gateshead/council_tax_reduction/gateshead_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..d04b991b7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gateshead/council_tax_reduction/gateshead_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class gateshead_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Gateshead CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "gateshead_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction.py new file mode 100644 index 000000000..241ce4035 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction.py @@ -0,0 +1,72 @@ +from policyengine_uk.model_api import * + + +class gloucester_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Gloucester Council Tax Support" + definition_period = YEAR + unit = GBP + reference = [ + "https://www.gloucester.gov.uk/council-tax/council-tax-support/", + "https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf", + ] + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.gloucester.council_tax_reduction + local_scheme = benunit( + "gloucester_council_tax_reduction_is_local_scheme", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("gloucester_council_tax_reduction_tariff_income", period) + uc_applicable_income = benunit( + "gloucester_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where( + relevant_income_based_benefit & ~has_uc_award, 0, excess_income + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "gloucester_council_tax_reduction_non_dep_deductions", + period, + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - non_dep_deductions + - excess_income * ctr.means_test.withdrawal_rate, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..fc3c6fda5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,83 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class gloucester_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Gloucester Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = "https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.gloucester.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "gloucester_council_tax_reduction_is_local_scheme", + period, + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ] + weekly_gross_income = ( + person.benunit.sum(add(person, period, gross_income_components)) + / WEEKS_IN_YEAR + ) + has_uc_award = ( + max_( + person.benunit("universal_credit_pre_benefit_cap", period), + person.benunit("universal_credit", period), + ) + > 0 + ) + uc_earned_income = person.benunit.sum( + person("gloucester_council_tax_reduction_non_dep_uc_earned_income", period) + ) + weekly_uc_earned_income = uc_earned_income / WEEKS_IN_YEAR + remunerative_work = ( + person.benunit.max(person("weekly_hours", period)) + >= ctr.non_dep_deduction.remunerative_work_hours + ) + remunerative_work = where(has_uc_award, uc_earned_income > 0, remunerative_work) + weekly_income = where( + has_uc_award, + weekly_uc_earned_income, + weekly_gross_income, + ) + high_deduction = remunerative_work & ( + weekly_income >= ctr.non_dep_deduction.high_income_threshold + ) + weekly_deduction = where( + high_deduction, + ctr.non_dep_deduction.high_amount, + ctr.non_dep_deduction.low_amount, + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + full_time_student = is_full_time_student_non_dep(person, period) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + exempt = claimant_exempt | full_time_student | income_based_benefit + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..f4504e4fc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_gloucester, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class gloucester_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Gloucester's local Council Tax Support scheme" + definition_period = YEAR + reference = [ + "https://www.gloucester.gov.uk/council-tax/council-tax-support/", + "https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf", + ] + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + adult = person("is_adult", period) + source_working_age_case = benunit.any(adult) & ~benunit.any( + adult & person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + source_local_class = ( + source_working_age_case | relevant_income_based_benefit | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_gloucester(local_authority) + & source_local_class + ) diff --git a/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..61790b93a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class gloucester_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Gloucester Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = "https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf" + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "gloucester_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..244bc165f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * + + +class gloucester_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = ( + "Gloucester Council Tax Support non-dependant Universal Credit earned income" + ) + definition_period = YEAR + unit = GBP + reference = "https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf" + documentation = ( + "Source input for the UC earned-income estimate used to decide whether a " + "Gloucester non-dependant with a Universal Credit award is in remunerative work." + ) + + def formula(person, period, parameters): + return person("uc_mif_capped_earned_income", period) diff --git a/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..5a25f34de --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_tariff_income.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class gloucester_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Gloucester Council Tax Support tariff income from capital" + definition_period = YEAR + unit = GBP + reference = "https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + tariff = parameters( + period + ).gov.local_authorities.gloucester.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award | relevant_income_based_benefit, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..555aaf9d2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/gloucester/council_tax_reduction/gloucester_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * + + +class gloucester_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Gloucester Council Tax Support Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.gloucester.gov.uk/media/ruwinppa/local-council-tax-support-policy-2026-v2.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/greenwich/council_tax_reduction/greenwich_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/greenwich/council_tax_reduction/greenwich_council_tax_reduction.py new file mode 100644 index 000000000..90ab66b27 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/greenwich/council_tax_reduction/greenwich_council_tax_reduction.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * +import numpy as np +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_greenwich_working_age, +) + + +class greenwich_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Greenwich Local Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.greenwich.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_greenwich_working_age(local_authority, country, has_pensioner) + capital = benunit.household("savings", period) + weekly_tariff_income = np.ceil( + max_(0, capital - ctr.means_test.tariff_income_threshold) + / ctr.means_test.tariff_income_step + ) + has_uc = benunit("universal_credit", period) > 0 + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "greenwich_council_tax_reduction_non_dep_deductions", + additional_applicable_income=where( + has_uc, 0, weekly_tariff_income * WEEKS_IN_YEAR + ), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/greenwich/council_tax_reduction/greenwich_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/greenwich/council_tax_reduction/greenwich_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..8e68acc61 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/greenwich/council_tax_reduction/greenwich_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_greenwich_working_age, +) + + +class greenwich_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Greenwich CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.greenwich.council_tax_reduction + household = person.household + working_age = is_greenwich_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/greenwich/council_tax_reduction/greenwich_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/greenwich/council_tax_reduction/greenwich_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..5edbb5d0d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/greenwich/council_tax_reduction/greenwich_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class greenwich_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Greenwich CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "greenwich_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hackney/council_tax_reduction/hackney_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/hackney/council_tax_reduction/hackney_council_tax_reduction.py new file mode 100644 index 000000000..90a9764a9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hackney/council_tax_reduction/hackney_council_tax_reduction.py @@ -0,0 +1,47 @@ +from policyengine_uk.model_api import * +import numpy as np +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hackney_working_age, +) + + +class hackney_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Hackney Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hackney.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_hackney_working_age(local_authority, country, has_pensioner) + has_uc = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + capital = benunit.household("savings", period) + weekly_tariff_income = np.ceil( + max_(0, capital - ctr.means_test.tariff_income_threshold) + / ctr.means_test.tariff_income_step + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "hackney_council_tax_reduction_non_dep_deductions", + applicable_amount=applicable_amount, + additional_applicable_income=where( + has_uc, 0, weekly_tariff_income * WEEKS_IN_YEAR + ), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hackney/council_tax_reduction/hackney_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/hackney/council_tax_reduction/hackney_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..f87b2d105 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hackney/council_tax_reduction/hackney_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hackney_working_age, +) + + +class hackney_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Hackney CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.hackney.council_tax_reduction + household = person.household + working_age = is_hackney_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return normal_gross_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/hackney/council_tax_reduction/hackney_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/hackney/council_tax_reduction/hackney_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..d3fc622c3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hackney/council_tax_reduction/hackney_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class hackney_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Hackney CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "hackney_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/hammersmith_and_fulham_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/hammersmith_and_fulham_council_tax_reduction.py new file mode 100644 index 000000000..00505dbd7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/hammersmith_and_fulham_council_tax_reduction.py @@ -0,0 +1,51 @@ +from policyengine_uk.model_api import * +import numpy as np +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hammersmith_and_fulham_working_age, +) + + +class hammersmith_and_fulham_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Hammersmith and Fulham Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.hammersmith_and_fulham.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_hammersmith_and_fulham_working_age( + local_authority, country, has_pensioner + ) + has_uc = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + capital = benunit.household("savings", period) + weekly_tariff_income = np.ceil( + max_(0, capital - ctr.means_test.tariff_income_threshold) + / ctr.means_test.tariff_income_step + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "hammersmith_and_fulham_council_tax_reduction_non_dep_deductions", + applicable_amount=applicable_amount, + additional_applicable_income=where( + has_uc, 0, weekly_tariff_income * WEEKS_IN_YEAR + ), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/hammersmith_and_fulham_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/hammersmith_and_fulham_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..a9a6bb9d1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/hammersmith_and_fulham_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,30 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hammersmith_and_fulham_working_age, +) + + +class hammersmith_and_fulham_council_tax_reduction_individual_non_dep_deduction( + Variable +): + value_type = float + entity = Person + label = "Hammersmith and Fulham CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.hammersmith_and_fulham.council_tax_reduction + household = person.household + working_age = is_hammersmith_and_fulham_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return normal_gross_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/hammersmith_and_fulham_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/hammersmith_and_fulham_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..f575951c2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hammersmith_and_fulham/council_tax_reduction/hammersmith_and_fulham_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class hammersmith_and_fulham_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Hammersmith and Fulham CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "hammersmith_and_fulham_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction.py new file mode 100644 index 000000000..5e80a57b7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction.py @@ -0,0 +1,68 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_haringey_working_age, +) + + +class haringey_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Haringey Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.haringey.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_haringey_working_age(local_authority, country, has_pensioner) + protected = benunit("haringey_council_tax_reduction_protected_group", period) + has_uc_award = benunit("universal_credit", period) > 0 + support_rate = where( + protected, + ctr.maximum_support_rate.protected, + ctr.maximum_support_rate.non_protected, + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "haringey_council_tax_reduction_applicable_income", period + ) + benunit("haringey_council_tax_reduction_tariff_income", period) + applicable_income = where( + has_uc_award, + benunit("haringey_council_tax_reduction_uc_applicable_income", period), + non_uc_applicable_income, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + non_dep_deductions = benunit( + "haringey_council_tax_reduction_non_dep_deductions", period + ) + liability = benunit.household("council_tax", period) + award = max_( + 0, + liability * support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + award = where(award < ctr.minimum_award * WEEKS_IN_YEAR, 0, award) + non_uc_capital = benunit.household("savings", period) + uc_capital = benunit("uc_assessable_capital", period) + capital = where(has_uc_award, uc_capital, non_uc_capital) + capital_eligible = capital <= ctr.means_test.capital_limit + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_applicable_income.py new file mode 100644 index 000000000..d50fa4f88 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_applicable_income.py @@ -0,0 +1,66 @@ +from policyengine_uk.model_api import * + + +class haringey_council_tax_reduction_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Haringey CTR applicable income" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "haringey_council_tax_reduction_childcare_deduction", period + ) + net_earnings = max_( + 0, gross_earnings - earnings_deductions - childcare_deduction + ) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "carers_allowance", + "esa_contrib", + "incapacity_benefit", + "jsa_contrib", + "state_pension", + "maternity_allowance", + "statutory_sick_pay", + "statutory_maternity_pay", + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "miscellaneous_income", + ], + ) + ) + tax_credits = benunit("tax_credits", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + applicable_income = net_earnings + other_income + tax_credits + return where(relevant_income_based_benefit, 0, applicable_income) diff --git a/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..c45230ada --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,62 @@ +from policyengine_uk.model_api import * + + +class haringey_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Haringey CTR childcare deduction from earnings" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.haringey.council_tax_reduction + childcare = ctr.childcare + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + works_enough_hours = person("weekly_hours", period) >= childcare.work_hours + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + claimant_or_partner & works_enough_hours + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + works_enough_hours | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | (person("incapacity_benefit", period) > 0) + | person("uc_limited_capability_for_WRA", period) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(claimant_or_partner & works_enough_hours) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = person("is_child", period) & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & person("is_disabled_for_benefits", period) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [ + eligible_children >= 2, + eligible_children == 1, + ], + [ + childcare.weekly_maximum.two_or_more_children, + childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..25fc5dfc4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_haringey_working_age, +) + + +class haringey_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Haringey CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.haringey.council_tax_reduction + household = person.household + working_age = is_haringey_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return normal_gross_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_uc_no_earned_income=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..47a82553c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class haringey_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Haringey CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "haringey_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..68f241cb0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_protected_group.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * + + +class haringey_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Haringey CTR working-age protected group" + definition_period = YEAR + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + has_child_or_young_person = benunit.any(child_or_young_person) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + disability_benefit = ( + (person("pip", period) > 0) + | (person("dla", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | (person("incapacity_benefit", period) > 0) + ) + protected_adult = benunit.any(claimant_or_partner & disability_benefit) + protected_adult = ( + protected_adult + | (benunit.sum(claimant_or_partner * person("esa_contrib", period)) > 0) + | (benunit("WTC_disabled_element", period) > 0) + | (benunit("WTC_severely_disabled_element", period) > 0) + ) + disabled_child = benunit.any( + child_or_young_person & person("is_disabled_for_benefits", period) + ) + disabled_child_premium = disabled_child & ( + benunit("benefits_premiums", period) > 0 + ) + return has_child_or_young_person | protected_adult | disabled_child_premium diff --git a/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..50bc3d67d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_tariff_income.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class haringey_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Haringey CTR tariff income from capital" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + tariff = parameters( + period + ).gov.local_authorities.haringey.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..4c7052773 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/haringey/council_tax_reduction/haringey_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class haringey_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Haringey CTR Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.minutes.haringey.gov.uk/documents/s156208/Haringey%202026-27%20CTRS.pdf" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction.py new file mode 100644 index 000000000..841d03461 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction.py @@ -0,0 +1,75 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_harrow_working_age, +) + + +class harrow_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Harrow Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.harrow.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_harrow_working_age(local_authority, country, has_pensioner) + has_uc_award = benunit("universal_credit", period) > 0 + disabled = benunit("harrow_council_tax_reduction_disabled", period) + support_rate = where( + has_uc_award, + benunit("harrow_council_tax_reduction_uc_support_rate", period), + where( + disabled, + ctr.maximum_support_rate.disabled, + ctr.maximum_support_rate.standard, + ), + ) + capped_liability = benunit.household( + "harrow_council_tax_reduction_maximum_eligible_liability", period + ) + liability = where( + disabled, + benunit.household("council_tax", period), + capped_liability, + ) + non_dep_deductions = benunit( + "harrow_council_tax_reduction_non_dep_deductions", period + ) + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + applicable_income = benunit("council_tax_reduction_applicable_income", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + non_uc_award = ( + liability * support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions + ) + uc_award = liability * support_rate - non_dep_deductions + award = max_(0, where(has_uc_award, uc_award, non_uc_award)) + annual_minimum_award = ctr.means_test.minimum_award * WEEKS_IN_YEAR + award = where(award >= annual_minimum_award, award, 0) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_disabled.py b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_disabled.py new file mode 100644 index 000000000..a47455f96 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_disabled.py @@ -0,0 +1,51 @@ +from policyengine_uk.model_api import * + + +class harrow_council_tax_reduction_disabled(Variable): + value_type = bool + entity = BenUnit + label = "Harrow CTS working-age disabled group" + definition_period = YEAR + reference = "https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.harrow.council_tax_reduction + person = benunit.members + claimant_or_partner = person("is_adult", period) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + claimant_partner_weekly_earnings = ( + benunit.sum(claimant_or_partner * earned_income) / WEEKS_IN_YEAR + ) + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + adult_disabled = benunit.any( + claimant_or_partner + & ( + person("is_disabled_for_benefits", period) + | (person("pip", period) > 0) + | (person("dla", period) > 0) + | person("is_blind", period) + | (person("incapacity_benefit", period) > 0) + | person("uc_limited_capability_for_WRA", period) + ) + ) + disabled_child = benunit.any( + child_or_young_person + & ( + person("is_disabled_for_benefits", period) + | (person("pip", period) > 0) + | (person("dla", period) > 0) + ) + ) + local_disabled_marker = benunit( + "harrow_council_tax_reduction_war_pension_protected", period + ) | benunit.household( + "harrow_council_tax_reduction_disabled_band_reduction", period + ) + disabled = adult_disabled | disabled_child | local_disabled_marker + return disabled & ( + claimant_partner_weekly_earnings < ctr.disabled.earnings_limit + ) diff --git a/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_disabled_band_reduction.py b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_disabled_band_reduction.py new file mode 100644 index 000000000..a4e4f4927 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_disabled_band_reduction.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class harrow_council_tax_reduction_disabled_band_reduction(Variable): + value_type = bool + entity = Household + label = "Harrow CTS household has a disabled band reduction" + definition_period = YEAR + reference = "https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27" diff --git a/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..3ac24ea1f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,89 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_harrow_working_age, +) + + +class harrow_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Harrow CTS individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.harrow.council_tax_reduction + household = person.household + working_age = is_harrow_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ] + gross_income = add(person, period, gross_income_components) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_benunit_gross_income = person.benunit.sum(gross_income) / WEEKS_IN_YEAR + weekly_benunit_earned_income = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + maximum_uc = (person.benunit("universal_credit", period) > 0) & ( + person.benunit("universal_credit", period) + >= person.benunit("uc_maximum_amount", period) + ) + legacy_weekly_deduction = where( + income_based_benefit | maximum_uc, + ctr.non_dep_deduction.legacy_income_based_amount, + where( + remunerative_work, + ctr.non_dep_deduction.legacy_amount.calc(weekly_benunit_gross_income), + ctr.non_dep_deduction.legacy_amount.calc(0), + ), + ) + uc_weekly_deduction = where( + remunerative_work + & ( + weekly_benunit_gross_income + >= ctr.non_dep_deduction.uc_high_income_threshold + ), + ctr.non_dep_deduction.uc_high_amount, + ctr.non_dep_deduction.uc_low_amount, + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + household_head_has_uc = household.any( + claimant_benunit + & (household_person.benunit("universal_credit", period) > 0) + ) + weekly_deduction = where( + household_head_has_uc, uc_weekly_deduction, legacy_weekly_deduction + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + full_time_student = is_full_time_student_non_dep(person, period) + exempt = claimant_exempt | full_time_student + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..7326392f5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_harrow_working_age, +) + + +class harrow_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Harrow maximum Council Tax liability eligible for CTS" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.harrow.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_harrow_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + capped = working_age & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..3f2b43d37 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class harrow_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Harrow CTS non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "harrow_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_uc_support_rate.py b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_uc_support_rate.py new file mode 100644 index 000000000..59b6e743e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_uc_support_rate.py @@ -0,0 +1,59 @@ +from policyengine_uk.model_api import * + + +class harrow_council_tax_reduction_uc_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Harrow Universal Credit CTS support rate" + definition_period = YEAR + reference = "https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.harrow.council_tax_reduction + weekly_earnings = benunit( + "harrow_council_tax_reduction_uc_weekly_earnings", period + ) + person = benunit.members + children = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + is_couple = benunit("is_couple", period) + is_lone_parent = benunit("is_lone_parent", period) + single_without_children = ~is_couple & (children == 0) + childless_couple = is_couple & (children == 0) + lone_parent_up_to_two = is_lone_parent & (children <= 2) + lone_parent_three_or_more = is_lone_parent & (children >= 3) + couple_up_to_two = is_couple & (children > 0) & (children <= 2) + couple_three_or_more = is_couple & (children >= 3) + banded_rate = select( + [ + single_without_children, + childless_couple, + lone_parent_up_to_two, + lone_parent_three_or_more, + couple_up_to_two, + couple_three_or_more, + ], + [ + ctr.uc_earnings.single.calc(weekly_earnings), + ctr.uc_earnings.childless_couple.calc(weekly_earnings), + ctr.uc_earnings.lone_parent_up_to_two_children.calc(weekly_earnings), + ctr.uc_earnings.lone_parent_three_or_more_children.calc( + weekly_earnings + ), + ctr.uc_earnings.couple_up_to_two_children.calc(weekly_earnings), + ctr.uc_earnings.couple_three_or_more_children.calc(weekly_earnings), + ], + default=0.0, + ) + maximum_uc = (benunit("universal_credit", period) > 0) & ( + benunit("universal_credit", period) >= benunit("uc_maximum_amount", period) + ) + no_earned_income = weekly_earnings <= 0 + rate = where( + maximum_uc | no_earned_income, + ctr.maximum_support_rate.standard, + banded_rate, + ) + disabled = benunit("harrow_council_tax_reduction_disabled", period) + return where(disabled, ctr.maximum_support_rate.disabled, rate) diff --git a/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_uc_weekly_earnings.py b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_uc_weekly_earnings.py new file mode 100644 index 000000000..99b940aa2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_uc_weekly_earnings.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class harrow_council_tax_reduction_uc_weekly_earnings(Variable): + value_type = float + entity = BenUnit + label = "Harrow Universal Credit CTS weekly net earnings" + definition_period = YEAR + unit = GBP + reference = "https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27" + + def formula(benunit, period, parameters): + return benunit("uc_earned_income", period) / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_war_pension_protected.py b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_war_pension_protected.py new file mode 100644 index 000000000..3a5c4a67f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/harrow/council_tax_reduction/harrow_council_tax_reduction_war_pension_protected.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class harrow_council_tax_reduction_war_pension_protected(Variable): + value_type = bool + entity = BenUnit + label = "Harrow CTS claimant or partner receives a protected war pension" + definition_period = YEAR + reference = "https://www.harrow.gov.uk/downloads/file/33606/council-tax-support-scheme-2026-27" diff --git a/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction.py new file mode 100644 index 000000000..2d9490204 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction.py @@ -0,0 +1,64 @@ +from policyengine_uk.model_api import * + + +class hart_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Hart Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hart.council_tax_reduction + local_scheme = benunit("hart_council_tax_reduction_is_local_scheme", period) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + applicable_income = where( + has_uc_award, + benunit("hart_council_tax_reduction_uc_applicable_income", period), + benunit("council_tax_reduction_applicable_income", period), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where( + relevant_income_based_benefit & ~has_uc_award, 0, excess_income + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "hart_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..905b0213d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) + + +class hart_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Hart individual Council Tax Support non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.hart.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "hart_council_tax_reduction_is_local_scheme", period + ) + ) + return normal_gross_income_non_dep_deduction(person, period, ctr, local_scheme) diff --git a/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..a110b54e8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,40 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hart, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class hart_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Hart's local Council Tax Support scheme" + definition_period = YEAR + reference = "https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "hart_council_tax_reduction_uc_relevant_period_pensioner", period + ) | benunit("hart_council_tax_reduction_uc_regulation_60a_pensioner", period) + local_case = ( + has_working_age_adult + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return (country == Country.ENGLAND) & is_hart(local_authority) & local_case diff --git a/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..e1cf16db5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class hart_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Hart Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "hart_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..2e41da914 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class hart_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Hart Universal Credit applicable income for Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * (uc_income + benunit("universal_credit", period)) diff --git a/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..d6b17f691 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class hart_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Hart's Universal Credit regulation 60A pensioner exception applies" + definition_period = YEAR + reference = "https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..cc4816e7c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hart/council_tax_reduction/hart_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class hart_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Hart's Universal Credit relevant-period pensioner exception applies" + ) + definition_period = YEAR + reference = "https://www.hart.gov.uk/sites/default/files/2026-04/Council-Tax-Reduction-Scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction.py new file mode 100644 index 000000000..4b74defab --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction.py @@ -0,0 +1,79 @@ +from policyengine_uk.model_api import * + + +class hartlepool_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Hartlepool Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hartlepool.council_tax_reduction + local_scheme = benunit( + "hartlepool_council_tax_reduction_is_local_scheme", period + ) + weekly_income = benunit( + "hartlepool_council_tax_reduction_weekly_income", period + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + dependant_count = benunit.sum(child_or_young_person) + is_couple = benunit("is_couple", period) + band = ctr.income_band + support_rate = select( + [ + ~is_couple & (dependant_count == 0), + ~is_couple & (dependant_count == 1), + ~is_couple & (dependant_count >= 2), + is_couple & (dependant_count == 0), + is_couple & (dependant_count == 1), + is_couple & (dependant_count >= 2), + ], + [ + band.single.calc(weekly_income), + band.single_one_dependant.calc(weekly_income), + band.single_two_or_more_dependants.calc(weekly_income), + band.couple.calc(weekly_income), + band.couple_one_dependant.calc(weekly_income), + band.couple_two_or_more_dependants.calc(weekly_income), + ], + default=0, + ) + income_based_benefit = ( + (benunit("income_support", period) > 0) + | (benunit("jsa_income", period) > 0) + | (benunit("esa_income", period) > 0) + ) + support_rate = where(income_based_benefit, 0.9, support_rate) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "hartlepool_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..a7f0cc633 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,50 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class hartlepool_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Hartlepool individual Council Tax Reduction non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.hartlepool.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "hartlepool_council_tax_reduction_is_local_scheme", period + ) + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + uc_no_earned_income = (person.benunit("universal_credit", period) > 0) & ( + person.benunit.sum(earned_income) <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + ) + return local_scheme * where( + exempt, 0, ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..9bf6cf2e6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,42 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hartlepool, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class hartlepool_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Hartlepool's local Council Tax Reduction scheme" + definition_period = YEAR + reference = "https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "hartlepool_council_tax_reduction_uc_regulation_60a_pensioner", period + ) + local_case = ( + has_working_age_adult + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return ( + (country == Country.ENGLAND) & is_hartlepool(local_authority) & local_case + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..db0b6d943 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class hartlepool_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Hartlepool Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "hartlepool_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..bbfd8eb9f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class hartlepool_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Hartlepool's Universal Credit regulation 60A pensioner exception applies" + definition_period = YEAR + reference = "https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..51b417075 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hartlepool/council_tax_reduction/hartlepool_council_tax_reduction_weekly_income.py @@ -0,0 +1,81 @@ +from policyengine_uk.model_api import * + + +class hartlepool_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Hartlepool Council Tax Reduction weekly net income" + definition_period = YEAR + unit = GBP + reference = "https://www.hartlepool.gov.uk/downloads/file/1484/hbc-council-tax-reduction-scheme-2026-27" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hartlepool.council_tax_reduction + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + net_earnings = max_(0, earnings - earnings_deductions) + unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "carers_allowance", + "esa_contrib", + "jsa_contrib", + "maternity_allowance", + "statutory_sick_pay", + "statutory_maternity_pay", + "ssmg", + "miscellaneous_income", + ], + ) + ) + add(benunit, period, ["tax_credits"]) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + non_uc_weekly_income = max_( + 0, + (net_earnings + unearned_income) / WEEKS_IN_YEAR + - ctr.earnings_disregard.amount, + ) + non_uc_weekly_income = where( + relevant_income_based_benefit, 0, non_uc_weekly_income + ) + uc_income = ( + benunit("uc_earned_income", period) + + benunit("uc_unearned_income", period) + + benunit("universal_credit", period) + ) + uc_weekly_income = uc_income / WEEKS_IN_YEAR + return where(has_uc_award, uc_weekly_income, non_uc_weekly_income) diff --git a/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction.py new file mode 100644 index 000000000..2dd1f0407 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction.py @@ -0,0 +1,90 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_havering_working_age, +) + + +class havering_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Havering Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.havering.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_havering_working_age(local_authority, country, has_pensioner) + full_support = benunit( + "havering_council_tax_reduction_full_support_group", period + ) + disabled = benunit("havering_council_tax_reduction_disabled", period) + support_rate = select( + [ + full_support, + disabled, + ], + [ + ctr.maximum_support_rate.full, + ctr.maximum_support_rate.disabled, + ], + default=ctr.maximum_support_rate.standard, + ) + capped_liability = benunit.household( + "havering_council_tax_reduction_maximum_eligible_liability", period + ) + liability = where( + full_support, + benunit.household("council_tax", period), + capped_liability, + ) + has_uc_award = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + uc_applicable_income = benunit( + "havering_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + non_dep_deductions = benunit( + "havering_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + capital_eligible = capital_eligible | relevant_income_based_benefit + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_care_leaver.py b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_care_leaver.py new file mode 100644 index 000000000..01d6b521f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_care_leaver.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class havering_council_tax_reduction_care_leaver(Variable): + value_type = bool + entity = Person + label = "Havering CTS care leaver" + definition_period = YEAR + reference = "https://democracy.havering.gov.uk/documents/s83059/0-1%20-%20Budget%20report%20cabinet%202026%202.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_disabled.py b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_disabled.py new file mode 100644 index 000000000..5197e848b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_disabled.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * + + +class havering_council_tax_reduction_disabled(Variable): + value_type = bool + entity = BenUnit + label = "Havering CTS disabled working-age group" + definition_period = YEAR + reference = "https://democracy.havering.gov.uk/documents/s83106/12%20-%20Appendix%20I%20%20Summary%20of%20the%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + disabled_child = benunit.any( + child_or_young_person & person("is_disabled_for_benefits", period) + ) + return (benunit("benefits_premiums", period) > 0) | disabled_child diff --git a/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_full_support_group.py b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_full_support_group.py new file mode 100644 index 000000000..890ccd4bd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_full_support_group.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * + + +class havering_council_tax_reduction_full_support_group(Variable): + value_type = bool + entity = BenUnit + label = "Havering CTS 100 percent support group" + definition_period = YEAR + reference = "https://www.havering.gov.uk/downloads/file/6930/council-tax-support-scheme-2025-2026" + + def formula(benunit, period, parameters): + person = benunit.members + claimant_or_partner = person("is_adult", period) + care_leaver = benunit.any( + claimant_or_partner + & person("havering_council_tax_reduction_care_leaver", period) + ) + war_pension = benunit( + "havering_council_tax_reduction_war_pension_protected", period + ) + return care_leaver | war_pension diff --git a/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..a41c79d52 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_havering_working_age, +) + + +class havering_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Havering CTS individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.havering.council_tax_reduction + household = person.household + working_age = is_havering_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return normal_gross_income_non_dep_deduction( + person, + period, + ctr, + working_age, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..062962eb0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_havering_working_age, +) + + +class havering_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Havering maximum Council Tax liability eligible for CTS" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.havering.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_havering_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + capped = working_age & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..812dcc54c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class havering_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Havering CTS non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "havering_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..fd700bb17 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class havering_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Havering CTS Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.havering.gov.uk/downloads/file/6930/council-tax-support-scheme-2025-2026" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_war_pension_protected.py b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_war_pension_protected.py new file mode 100644 index 000000000..f568b6018 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/havering/council_tax_reduction/havering_council_tax_reduction_war_pension_protected.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class havering_council_tax_reduction_war_pension_protected(Variable): + value_type = bool + entity = BenUnit + label = "Havering CTS claimant or partner receives a protected war pension" + definition_period = YEAR + reference = "https://www.havering.gov.uk/downloads/file/6930/council-tax-support-scheme-2025-2026" diff --git a/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction.py new file mode 100644 index 000000000..7ec075f63 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction.py @@ -0,0 +1,63 @@ +from policyengine_uk.model_api import * + + +class herefordshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Herefordshire Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.herefordshire.council_tax_reduction + local_scheme = benunit( + "herefordshire_council_tax_reduction_is_local_scheme", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + uc_applicable_income = benunit( + "herefordshire_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "herefordshire_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..ef22067ef --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class herefordshire_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Herefordshire CTR claimant has a section 58.6 non-dependant deduction exemption not otherwise modeled" + documentation = "Covers source-listed claimant exemptions not otherwise represented in PolicyEngine UK, such as suspended entitlement to disability benefits." + definition_period = YEAR + reference = "https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..00d1cab76 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,92 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class herefordshire_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Herefordshire Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.herefordshire.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "herefordshire_council_tax_reduction_is_local_scheme", period + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + person_earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + benunit_earned_income = person.benunit.sum(person_earned_income) + weekly_gross_income = benunit_gross_income / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "herefordshire_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = (person.benunit("universal_credit", period) > 0) & ( + benunit_earned_income <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person( + "herefordshire_council_tax_reduction_non_dep_source_exemption", period + ) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..592a24acb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_herefordshire, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class herefordshire_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Herefordshire's local CTR scheme" + definition_period = YEAR + reference = "https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + source_working_age = ( + ~has_pensioner | relevant_income_based_benefit | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_herefordshire(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..1bb0b34d8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class herefordshire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Herefordshire Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "herefordshire_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..0deb85323 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class herefordshire_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Herefordshire CTR non-dependant has a section 58.7 or 58.8 deduction exemption not otherwise modeled" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK, such as normal home elsewhere, long-term patient status, armed forces away, or Schedule 1 discount-disregarded cases." + definition_period = YEAR + reference = "https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..e499aac11 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/herefordshire/council_tax_reduction/herefordshire_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class herefordshire_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Herefordshire Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://councillors.herefordshire.gov.uk/documents/s50131582/Approved%20202526%20Council%20Tax%20Reduction%20Scheme.pdf" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction.py new file mode 100644 index 000000000..f504f9865 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction.py @@ -0,0 +1,58 @@ +from policyengine_uk.model_api import * + + +class hertsmere_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Hertsmere Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hertsmere.council_tax_reduction + local_scheme = benunit( + "hertsmere_council_tax_reduction_is_local_scheme", period + ) + uc_scheme = benunit("hertsmere_council_tax_reduction_is_uc_scheme", period) + protected = benunit("hertsmere_council_tax_reduction_protected_group", period) + liability = benunit.household( + "hertsmere_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "hertsmere_council_tax_reduction_non_dep_deductions", period + ) + non_uc_maximum_support_rate = where(protected, 1, ctr.maximum_support_rate) + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + applicable_income = benunit("council_tax_reduction_applicable_income", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + non_uc_award = max_( + 0, + liability * non_uc_maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + uc_support_rate = benunit( + "hertsmere_council_tax_reduction_uc_support_rate", period + ) + uc_award = max_(0, liability * uc_support_rate - non_dep_deductions) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + uc_scheme, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * where(uc_scheme, uc_award, non_uc_award) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_esa_support_component.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_esa_support_component.py new file mode 100644 index 000000000..edbb49f42 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_esa_support_component.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class hertsmere_council_tax_reduction_esa_support_component(Variable): + value_type = float + entity = BenUnit + label = "ESA support component counted for Hertsmere Council Tax Reduction protected status" + definition_period = YEAR + unit = GBP + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..9b15cbdef --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,105 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, + normal_gross_income_non_dep_deduction, +) + + +class hertsmere_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Hertsmere Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.hertsmere.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "hertsmere_council_tax_reduction_is_local_scheme", period + ) + ) + uc_scheme = household.any( + claimant_benunit + & household_person.benunit( + "hertsmere_council_tax_reduction_is_uc_scheme", period + ) + ) + protected = household.any( + claimant_benunit + & household_person.benunit( + "hertsmere_council_tax_reduction_protected_group", period + ) + ) + non_uc_deduction = normal_gross_income_non_dep_deduction( + person, + period, + ctr, + local_scheme, + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ] + gross_income = add(person, period, gross_income_components) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_benunit_gross_income = person.benunit.sum(gross_income) / WEEKS_IN_YEAR + weekly_benunit_earned_income = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + protected_weekly_amount = where( + in_remunerative_work, + ctr.uc_banded_scheme.protected_non_dep_deduction.amount.calc( + weekly_benunit_gross_income + ), + ctr.uc_banded_scheme.protected_non_dep_deduction.amount.calc(0), + ) + non_protected_weekly_amount = where( + in_remunerative_work, + ctr.uc_banded_scheme.non_protected_non_dep_deduction.amount.calc( + weekly_benunit_gross_income + ), + ctr.uc_banded_scheme.non_protected_non_dep_deduction.amount.calc(0), + ) + weekly_amount = where( + protected, protected_weekly_amount, non_protected_weekly_amount + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + has_uc = person.benunit("universal_credit", period) > 0 + uc_working_less_than_16_hours = ( + has_uc + & (weekly_benunit_earned_income > 0) + & (weekly_hours < ctr.non_dep_deduction.remunerative_work_hours) + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_working_less_than_16_hours + ) + uc_deduction = local_scheme * where(exempt, 0, weekly_amount * WEEKS_IN_YEAR) + return where(uc_scheme, uc_deduction, non_uc_deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..c9088e6f6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,46 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hertsmere, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class hertsmere_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Hertsmere's local Council Tax Reduction scheme" + documentation = "Hertsmere paragraph 1.6 covers the local Class D/E means test and paragraph 1.8 routes Universal Credit applicants to Class G. Pension-age UC awards are disregarded during the relevant period or where regulation 60A applies." + definition_period = YEAR + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "hertsmere_council_tax_reduction_uc_relevant_period_pensioner", period + ) | benunit( + "hertsmere_council_tax_reduction_uc_regulation_60a_pensioner", period + ) + in_class_d_or_e = (has_working_age_adult | relevant_income_based_benefit) & ( + ~has_uc_award + ) + in_class_g = has_uc_award & (has_working_age_adult | ~uc_exception) + return ( + (country == Country.ENGLAND) + & is_hertsmere(local_authority) + & (in_class_d_or_e | in_class_g) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_is_uc_scheme.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_is_uc_scheme.py new file mode 100644 index 000000000..f6007feea --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_is_uc_scheme.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class hertsmere_council_tax_reduction_is_uc_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether Hertsmere's Class G Universal Credit scheme applies" + definition_period = YEAR + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + return benunit("hertsmere_council_tax_reduction_is_local_scheme", period) & ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..a7919d28c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class hertsmere_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Hertsmere maximum Council Tax liability eligible for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.hertsmere.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..5ff4fd86a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class hertsmere_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Hertsmere Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "hertsmere_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_protected_group.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_protected_group.py new file mode 100644 index 000000000..5b13dc88b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_protected_group.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * + + +class hertsmere_council_tax_reduction_protected_group(Variable): + value_type = bool + entity = BenUnit + label = "Hertsmere Council Tax Reduction protected group" + definition_period = YEAR + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + child_under_5 = child_or_young_person & (person("age", period) < 5) + lone_parent_with_child_under_5 = benunit( + "is_lone_parent", period + ) & benunit.any(child_under_5) + claimant_partner_or_dependant = ( + person("is_adult", period) | child_or_young_person + ) + disability_benefit = (person("dla", period) > 0) | (person("pip", period) > 0) + esa_support_component = benunit( + "hertsmere_council_tax_reduction_esa_support_component", period + ) + return ( + lone_parent_with_child_under_5 + | benunit.any(claimant_partner_or_dependant & disability_benefit) + | (esa_support_component > 0) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_source_additional_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_source_additional_earnings_disregard.py new file mode 100644 index 000000000..fceca3590 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_source_additional_earnings_disregard.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class hertsmere_council_tax_reduction_source_additional_earnings_disregard(Variable): + value_type = bool + entity = BenUnit + label = "Whether Hertsmere's source additional working earnings disregard applies" + definition_period = YEAR + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + documentation = "Source input for Schedule 3 paragraph 16 conditions not otherwise exposed, such as Working Tax Credit disability or 50-plus element status." + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..52935df62 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class hertsmere_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Hertsmere's Universal Credit regulation 60A pensioner exception applies" + definition_period = YEAR + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..99899e3fa --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class hertsmere_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Hertsmere's Universal Credit relevant-period pensioner exception applies" + definition_period = YEAR + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_support_rate.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_support_rate.py new file mode 100644 index 000000000..a63395945 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_support_rate.py @@ -0,0 +1,29 @@ +from policyengine_uk.model_api import * + + +class hertsmere_council_tax_reduction_uc_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Hertsmere Class G Universal Credit Council Tax Reduction support rate" + definition_period = YEAR + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hertsmere.council_tax_reduction + weekly_earnings = benunit( + "hertsmere_council_tax_reduction_uc_weekly_earnings", period + ) + protected = benunit("hertsmere_council_tax_reduction_protected_group", period) + protected_rate = where( + weekly_earnings <= 0, + ctr.uc_banded_scheme.out_of_work_support_rate.protected, + ctr.uc_banded_scheme.support_rate.protected.calc(weekly_earnings + 1e-9), + ) + non_protected_rate = where( + weekly_earnings <= 0, + ctr.uc_banded_scheme.out_of_work_support_rate.non_protected, + ctr.uc_banded_scheme.support_rate.non_protected.calc( + weekly_earnings + 1e-9 + ), + ) + return where(protected, protected_rate, non_protected_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_weekly_earnings.py b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_weekly_earnings.py new file mode 100644 index 000000000..6e211469f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hertsmere/council_tax_reduction/hertsmere_council_tax_reduction_uc_weekly_earnings.py @@ -0,0 +1,84 @@ +from policyengine_uk.model_api import * + + +class hertsmere_council_tax_reduction_uc_weekly_earnings(Variable): + value_type = float + entity = BenUnit + label = "Hertsmere Class G Universal Credit weekly earnings" + definition_period = YEAR + unit = GBP + reference = "https://www.hertsmere.gov.uk/asset-library/cts-scheme-2026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hertsmere.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + net_earnings = max_(0, gross_earnings - earnings_deductions) + is_lone_parent = benunit("is_lone_parent", period) + is_couple = benunit("is_couple", period) + protected = benunit("hertsmere_council_tax_reduction_protected_group", period) + weekly_hours = benunit.max(claimant_or_partner * person("weekly_hours", period)) + weekly_disregard = select( + [is_lone_parent, protected, is_couple], + [ + ctr.earnings_disregard.lone_parent, + ctr.earnings_disregard.disabled_or_support_component, + ctr.earnings_disregard.couple, + ], + default=ctr.earnings_disregard.single, + ) + weekly_net_earnings = net_earnings / WEEKS_IN_YEAR + adult_age = benunit.max(claimant_or_partner * person("age", period)) + has_family = benunit.any(child_or_young_person) + disability_component = ( + (benunit("disability_premium", period) > 0) + | (benunit("severe_disability_premium", period) > 0) + | (benunit("enhanced_disability_premium", period) > 0) + | ( + benunit("hertsmere_council_tax_reduction_esa_support_component", period) + > 0 + ) + | benunit.any( + claimant_or_partner & person("uc_limited_capability_for_WRA", period) + ) + ) + source_wtc_condition = benunit( + "hertsmere_council_tax_reduction_source_additional_earnings_disregard", + period, + ) + additional_condition = ( + source_wtc_condition + | ((adult_age >= 25) & (weekly_hours >= 30)) + | (is_couple & has_family & (weekly_hours >= 16)) + | (is_lone_parent & (weekly_hours >= 16)) + | (disability_component & (weekly_hours >= 16)) + ) + additional_available = weekly_net_earnings >= ( + weekly_disregard + ctr.earnings_disregard.additional_working + ) + additional_disregard = ( + additional_condition & additional_available + ) * ctr.earnings_disregard.additional_working + countable_earnings = max_( + 0, + net_earnings - (weekly_disregard + additional_disregard) * WEEKS_IN_YEAR, + ) + return countable_earnings / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction.py new file mode 100644 index 000000000..02a81f545 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction.py @@ -0,0 +1,67 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hillingdon_working_age, +) + + +class hillingdon_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Hillingdon Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hillingdon.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_hillingdon_working_age( + local_authority, + country, + has_pensioner, + ) + weekly_income = benunit( + "hillingdon_council_tax_reduction_weekly_income", period + ) + person = benunit.members + num_children = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + is_couple = benunit("is_couple", period) + income_bands = ctr.income_band + standard_support_rate = select( + [ + num_children >= 2, + num_children == 1, + is_couple, + ], + [ + income_bands.family_two_or_more_children.calc(weekly_income), + income_bands.family_one_child.calc(weekly_income), + income_bands.couple.calc(weekly_income), + ], + default=income_bands.single.calc(weekly_income), + ) + band_2 = benunit("hillingdon_council_tax_reduction_band_2", period) + support_rate = where(band_2, 0.75, standard_support_rate) + liability = benunit.household( + "hillingdon_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "hillingdon_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + award = where(award < ctr.minimum_award * WEEKS_IN_YEAR, 0, award) + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_band_2.py b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_band_2.py new file mode 100644 index 000000000..d77e63433 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_band_2.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * + + +class hillingdon_council_tax_reduction_band_2(Variable): + value_type = bool + entity = BenUnit + label = "Hillingdon CTR vulnerable Band 2" + definition_period = YEAR + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hillingdon.council_tax_reduction + weekly_income = benunit( + "hillingdon_council_tax_reduction_weekly_income", period + ) + person = benunit.members + num_children = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + is_couple = benunit("is_couple", period) + upper_limit = select( + [ + num_children >= 2, + num_children == 1, + is_couple, + ], + [ + ctr.vulnerable_upper_limit.family_two_or_more_children, + ctr.vulnerable_upper_limit.family_one_child, + ctr.vulnerable_upper_limit.couple, + ], + default=ctr.vulnerable_upper_limit.single, + ) + vulnerable = benunit("hillingdon_council_tax_reduction_vulnerable", period) + return vulnerable & (weekly_income <= upper_limit) diff --git a/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_countable_universal_credit.py b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_countable_universal_credit.py new file mode 100644 index 000000000..7741e4981 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_countable_universal_credit.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class hillingdon_council_tax_reduction_countable_universal_credit(Variable): + value_type = float + entity = BenUnit + label = "Hillingdon CTR countable Universal Credit income" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ignored_elements = add( + benunit, + period, + [ + "uc_housing_costs_element", + "uc_childcare_element", + "uc_disability_elements", + "uc_carer_element", + ], + ) + has_uc = benunit("universal_credit", period) > 0 + return has_uc * max_(0, benunit("universal_credit", period) - ignored_elements) diff --git a/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..f2f61271d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hillingdon_working_age, +) + + +class hillingdon_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Hillingdon CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.hillingdon.council_tax_reduction + household = person.household + working_age = is_hillingdon_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + state_pension_credit_age = person("is_SP_age", period) + state_pension_credit = person.benunit("pension_credit", period) > 0 + exempt = ( + is_full_time_student_non_dep(person, period) + | state_pension_credit_age + | state_pension_credit + ) + deduction = ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + return working_age * where(exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..a2e025908 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_hillingdon_working_age, +) + + +class hillingdon_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Hillingdon maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.hillingdon.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_hillingdon_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + band_2 = ( + household.max( + household.members.benunit( + "hillingdon_council_tax_reduction_band_2", period + ) + ) + > 0 + ) + capped = working_age & ~band_2 & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..321fb2599 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,17 @@ +from policyengine_uk.model_api import * + + +class hillingdon_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Hillingdon CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + deductions = benunit.members( + "hillingdon_council_tax_reduction_individual_non_dep_deduction", + period, + ) + deductions_in_household = benunit.max(benunit.members.household.sum(deductions)) + return deductions_in_household - benunit.sum(deductions) diff --git a/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_vulnerable.py b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_vulnerable.py new file mode 100644 index 000000000..cc24cc2fe --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_vulnerable.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * + + +class hillingdon_council_tax_reduction_vulnerable(Variable): + value_type = bool + entity = BenUnit + label = "Hillingdon CTR vulnerable Band 2 group" + definition_period = YEAR + + def formula(benunit, period, parameters): + person = benunit.members + claimant_or_partner = person("is_adult", period) + claimant_partner_or_child = claimant_or_partner | person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + disability_benefit = benunit.any( + claimant_partner_or_child + & ( + (person("dla", period) > 0) + | (person("pip", period) > 0) + | (person("attendance_allowance", period) > 0) + ) + ) + claimant_partner_disability_or_carer = benunit.any( + claimant_or_partner + & ( + person("is_blind", period) + | (person("carers_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + ) + ) + uc_limited_capability = benunit.any( + claimant_or_partner & person("uc_limited_capability_for_WRA", period) + ) + disabled_child_uc_element = benunit("uc_disability_elements", period) > 0 + return ( + disability_benefit + | claimant_partner_disability_or_carer + | uc_limited_capability + | disabled_child_uc_element + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..8f005af50 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hillingdon/council_tax_reduction/hillingdon_council_tax_reduction_weekly_income.py @@ -0,0 +1,69 @@ +from policyengine_uk.model_api import * + + +class hillingdon_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Hillingdon CTR weekly net income" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hillingdon.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + earned_income = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + has_uc = benunit("universal_credit", period) > 0 + earnings_disregard = where( + (earned_income > 0) & ~has_uc, + ctr.earnings_disregard.amount * WEEKS_IN_YEAR, + 0, + ) + net_earnings = max_(0, earned_income - earnings_deductions - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + countable_uc = benunit( + "hillingdon_council_tax_reduction_countable_universal_credit", + period, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + uc_no_other_income = has_uc & (earned_income <= 0) & (other_income <= 0) + income = where( + relevant_income_based_benefit | uc_no_other_income, + 0, + net_earnings + other_income + countable_uc, + ) + return income / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction.py new file mode 100644 index 000000000..dd72d8350 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction.py @@ -0,0 +1,67 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hounslow_working_age, +) + + +class hounslow_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Hounslow Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.hounslow.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_hounslow_working_age(local_authority, country, has_pensioner) + weekly_net_earnings = benunit( + "hounslow_council_tax_reduction_weekly_net_earnings", period + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_children = benunit.sum(child_or_young_person) + is_couple = benunit("is_couple", period) + is_lone_parent = benunit("is_lone_parent", period) + income_bands = ctr.income_band + banded_support_rate = select( + [ + is_lone_parent & (num_children >= 2), + is_lone_parent & (num_children == 1), + is_couple & (num_children >= 2), + is_couple & (num_children == 1), + is_couple, + ], + [ + income_bands.single_two_or_more_children.calc(weekly_net_earnings), + income_bands.single_one_child.calc(weekly_net_earnings), + income_bands.couple_two_or_more_children.calc(weekly_net_earnings), + income_bands.couple_one_child.calc(weekly_net_earnings), + income_bands.couple.calc(weekly_net_earnings), + ], + default=income_bands.single.calc(weekly_net_earnings), + ) + carer = benunit("hounslow_council_tax_reduction_carer", period) + support_rate = where(carer, ctr.carer_support_rate, banded_support_rate) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "hounslow_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital_eligible = ( + benunit("hounslow_council_tax_reduction_assessable_capital", period) + <= ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_assessable_capital.py b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_assessable_capital.py new file mode 100644 index 000000000..2f8569d38 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_assessable_capital.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class hounslow_council_tax_reduction_assessable_capital(Variable): + value_type = float + entity = BenUnit + label = "Hounslow CTS assessable capital" + documentation = ( + "Hounslow tests claimant and partner capital for working-age Council " + "Tax Support. PolicyEngine UK does not currently store those stocks " + "separately by claimant, partner, and non-dependant, so this uses " + "household liquid savings as the available CTS capital proxy." + ) + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return benunit.household("savings", period) diff --git a/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_carer.py b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_carer.py new file mode 100644 index 000000000..ea653575e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_carer.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * + + +class hounslow_council_tax_reduction_carer(Variable): + value_type = bool + entity = BenUnit + label = "Hounslow CTS carer household" + definition_period = YEAR + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + carers_allowance = benunit.any( + claimant_or_partner & (person("carers_allowance", period) > 0) + ) + uc_carer = benunit("uc_carer_element", period) > 0 + return carers_allowance | uc_carer diff --git a/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..207ee8315 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_hounslow_working_age, +) + + +class hounslow_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Hounslow CTS individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.hounslow.council_tax_reduction + household = person.household + working_age = is_hounslow_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + remunerative_work = ( + person("weekly_hours", period) + >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + remunerative_work, + ctr.non_dep_deduction.working_amount, + ctr.non_dep_deduction.non_working_amount, + ) + return working_age * weekly_deduction * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..dc954263c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class hounslow_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Hounslow CTS non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "hounslow_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_weekly_net_earnings.py b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_weekly_net_earnings.py new file mode 100644 index 000000000..fd748d80f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/hounslow/council_tax_reduction/hounslow_council_tax_reduction_weekly_net_earnings.py @@ -0,0 +1,36 @@ +from policyengine_uk.model_api import * + + +class hounslow_council_tax_reduction_weekly_net_earnings(Variable): + value_type = float + entity = BenUnit + label = "Hounslow CTS weekly net earnings" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + non_uc_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + non_uc_earnings = max_(0, gross_earnings - non_uc_deductions) + has_uc = benunit("universal_credit", period) > 0 + uc_earnings = benunit("uc_earned_income", period) + annual_earnings = where(has_uc, uc_earnings, non_uc_earnings) + return annual_earnings / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction.py new file mode 100644 index 000000000..34a6ec5af --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction.py @@ -0,0 +1,72 @@ +from policyengine_uk.model_api import * + + +class ipswich_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Ipswich Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.ipswich.council_tax_reduction + local_scheme = benunit("ipswich_council_tax_reduction_is_local_scheme", period) + has_uc_award = benunit("universal_credit", period) > 0 + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "ipswich_council_tax_reduction_non_dep_deductions", period + ) + eligible_liability = max_(0, liability - non_dep_deductions) + + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("ipswich_council_tax_reduction_tariff_income", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + non_uc_award = max_( + 0, + eligible_liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate, + ) + + monthly_uc_earnings = benunit( + "ipswich_council_tax_reduction_uc_monthly_earnings", period + ) + weekly_uc_contribution = benunit( + "ipswich_council_tax_reduction_uc_weekly_contribution", period + ) + uc_award = max_( + 0, + eligible_liability - weekly_uc_contribution * WEEKS_IN_YEAR, + ) + uc_award = where( + monthly_uc_earnings + >= ctr.uc_earnings_contribution.no_entitlement_threshold, + 0, + uc_award, + ) + award = where(has_uc_award, uc_award, non_uc_award) + annual_minimum_award = ctr.means_test.minimum_award * WEEKS_IN_YEAR + award = where(award >= annual_minimum_award, award, 0) + + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..16bc7b816 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class ipswich_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Ipswich CTR claimant source-defined non-dependant deduction exemption" + documentation = "Covers source-listed claimant or partner non-dependant deduction exemptions not otherwise represented in PolicyEngine UK." + definition_period = YEAR + default_value = False + reference = "https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..4438346ad --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,92 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class ipswich_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Ipswich Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.ipswich.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "ipswich_council_tax_reduction_is_local_scheme", + period, + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + gross_income = where(has_uc_award, person_gross_income, benunit_gross_income) + weekly_gross_income = gross_income / WEEKS_IN_YEAR + weekly_hours = where( + has_uc_award, + person("weekly_hours", period), + person.benunit.max(person("weekly_hours", period)), + ) + in_remunerative_work = ( + weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "ipswich_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = has_uc_award & ( + person("ipswich_council_tax_reduction_non_dep_uc_earned_income", period) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person("ipswich_council_tax_reduction_non_dep_source_exemption", period) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..b501ca31e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_ipswich, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class ipswich_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Ipswich's local CTR scheme" + definition_period = YEAR + reference = "https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + source_working_age = ( + ~has_pensioner | relevant_income_based_benefit | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_ipswich(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..da7ecc4c1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class ipswich_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Ipswich Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "ipswich_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..6d572d643 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class ipswich_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Ipswich CTR source-defined non-dependant exemption" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK." + definition_period = YEAR + default_value = False + reference = "https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..646981bd1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class ipswich_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Ipswich CTR non-dependant Universal Credit assessed earned income" + documentation = "Source input for person-level earned income used in the non-dependant's Universal Credit award calculation." + definition_period = YEAR + unit = GBP + reference = "https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf" + + def formula(person, period, parameters): + return person("employment_income", period) + person( + "self_employment_income", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..690c3c965 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_tariff_income.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class ipswich_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Ipswich Council Tax Reduction tariff income" + definition_period = YEAR + unit = GBP + reference = "https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf" + + def formula(benunit, period, parameters): + tariff = parameters( + period + ).gov.local_authorities.ipswich.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + tariff_units = np.ceil(max_(0, capital - tariff.threshold) / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + has_uc_award = benunit("universal_credit", period) > 0 + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where(has_uc_award | relevant_income_based_benefit, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_uc_monthly_earnings.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_uc_monthly_earnings.py new file mode 100644 index 000000000..b4cbd6b66 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_uc_monthly_earnings.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * + + +class ipswich_council_tax_reduction_uc_monthly_earnings(Variable): + value_type = float + entity = BenUnit + label = ( + "Ipswich Council Tax Reduction Universal Credit notified monthly net earnings" + ) + definition_period = YEAR + unit = GBP + reference = "https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + uc_gross_earnings = benunit.sum( + claimant_or_partner * person("uc_mif_capped_earned_income", period) + ) + deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + return max_(0, uc_gross_earnings - deductions) / MONTHS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_uc_weekly_contribution.py b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_uc_weekly_contribution.py new file mode 100644 index 000000000..f3f73e653 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/ipswich/council_tax_reduction/ipswich_council_tax_reduction_uc_weekly_contribution.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * + + +class ipswich_council_tax_reduction_uc_weekly_contribution(Variable): + value_type = float + entity = BenUnit + label = "Ipswich Council Tax Reduction weekly contribution for Universal Credit claimants" + definition_period = YEAR + unit = GBP + reference = "https://www.ipswich.gov.uk/sites/ipswich/files/2026-03/Council%20Tax%20Reduction%20scheme%202026_0.pdf" + + def formula(benunit, period, parameters): + contribution = parameters( + period + ).gov.local_authorities.ipswich.council_tax_reduction.uc_earnings_contribution + monthly_uc_earnings = benunit( + "ipswich_council_tax_reduction_uc_monthly_earnings", period + ) + return contribution.amount.calc(monthly_uc_earnings) diff --git a/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction.py new file mode 100644 index 000000000..3fc24d972 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction.py @@ -0,0 +1,77 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_islington_working_age, +) + + +class islington_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Islington Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.islington.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_islington_working_age(local_authority, country, has_pensioner) + weekly_net_earnings = benunit( + "islington_council_tax_reduction_weekly_net_earnings", period + ) + person = benunit.members + num_children = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + is_couple = benunit("is_couple", period) + income_bands = ctr.income_band + working_support_rate = select( + [ + is_couple & (num_children >= 2), + ((~is_couple) & (num_children >= 2)) + | (is_couple & (num_children == 1)), + ((~is_couple) & (num_children == 1)) + | (is_couple & (num_children == 0)), + ], + [ + income_bands.couple_two_or_more_children.calc(weekly_net_earnings), + income_bands.single_two_or_more_children_or_couple_one_child.calc( + weekly_net_earnings + ), + income_bands.single_one_child_or_couple_no_children.calc( + weekly_net_earnings + ), + ], + default=income_bands.single_no_children.calc(weekly_net_earnings), + ) + non_working_protected = benunit( + "islington_council_tax_reduction_non_working_protected", period + ) + non_working_support_rate = where( + non_working_protected, + ctr.non_working.protected_support_rate, + ctr.non_working.default_support_rate, + ) + support_rate = where( + weekly_net_earnings <= 0, + non_working_support_rate, + working_support_rate, + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "islington_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital_eligible = ( + benunit.household("savings", period) < ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..5934dd979 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,45 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_islington_working_age, +) + + +class islington_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Islington CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.islington.council_tax_reduction + household = person.household + working_age = is_islington_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_benunit_earned_income = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + universal_credit_no_earnings = ( + person.benunit("universal_credit", period) > 0 + ) & (weekly_benunit_earned_income <= 0) + exempt = ( + is_full_time_student_non_dep(person, period) + | income_based_benefit + | universal_credit_no_earnings + ) + deduction = ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + return working_age * where(exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..61781028b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,17 @@ +from policyengine_uk.model_api import * + + +class islington_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Islington CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + deductions = benunit.members( + "islington_council_tax_reduction_individual_non_dep_deduction", + period, + ) + deductions_in_household = benunit.max(benunit.members.household.sum(deductions)) + return deductions_in_household - benunit.sum(deductions) diff --git a/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_non_working_protected.py b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_non_working_protected.py new file mode 100644 index 000000000..c89f2a789 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_non_working_protected.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class islington_council_tax_reduction_non_working_protected(Variable): + value_type = bool + entity = BenUnit + label = "Islington CTR non-working protected group" + definition_period = YEAR + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + has_uc = person.benunit("universal_credit", period) > 0 + disability_or_lcw = (person("pip", period) > 0) | (person("dla", period) > 0) + disability_or_lcw |= has_uc & person("uc_limited_capability_for_WRA", period) + protected_adult = benunit.any(claimant_or_partner & disability_or_lcw) + lone_parent_under_five = benunit("is_lone_parent", period) & ( + benunit("youngest_child_age", period) < 5 + ) + return protected_adult | lone_parent_under_five diff --git a/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_weekly_net_earnings.py b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_weekly_net_earnings.py new file mode 100644 index 000000000..3b145fa77 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/islington/council_tax_reduction/islington_council_tax_reduction_weekly_net_earnings.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * + + +class islington_council_tax_reduction_weekly_net_earnings(Variable): + value_type = float + entity = BenUnit + label = "Islington CTR weekly net earnings" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + standard_net_earnings = max_(0, gross_earnings - earnings_deductions) + has_uc = benunit("universal_credit", period) > 0 + uc_net_earnings = max_( + 0, + add(benunit, period, ["uc_mif_capped_earned_income"]) - earnings_deductions, + ) + return where(has_uc, uc_net_earnings, standard_net_earnings) / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/kings_lynn_and_west_norfolk_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/kings_lynn_and_west_norfolk_council_tax_reduction.py new file mode 100644 index 000000000..1c4f15928 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/kings_lynn_and_west_norfolk_council_tax_reduction.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_kings_lynn_and_west_norfolk_working_age, +) + + +class kings_lynn_and_west_norfolk_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "King's Lynn and West Norfolk Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.kings_lynn_and_west_norfolk.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_kings_lynn_and_west_norfolk_working_age( + local_authority, country, has_pensioner + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "kings_lynn_and_west_norfolk_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/kings_lynn_and_west_norfolk_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/kings_lynn_and_west_norfolk_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..69b1de5cb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/kings_lynn_and_west_norfolk_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,30 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_kings_lynn_and_west_norfolk_working_age, +) + + +class kings_lynn_and_west_norfolk_council_tax_reduction_individual_non_dep_deduction( + Variable +): + value_type = float + entity = Person + label = "King's Lynn and West Norfolk CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.kings_lynn_and_west_norfolk.council_tax_reduction + household = person.household + working_age = is_kings_lynn_and_west_norfolk_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/kings_lynn_and_west_norfolk_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/kings_lynn_and_west_norfolk_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..e032963ef --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kings_lynn_and_west_norfolk/council_tax_reduction/kings_lynn_and_west_norfolk_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class kings_lynn_and_west_norfolk_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "King's Lynn and West Norfolk CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "kings_lynn_and_west_norfolk_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction.py new file mode 100644 index 000000000..bbb10179c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction.py @@ -0,0 +1,66 @@ +from policyengine_uk.model_api import * + + +class kingston_upon_hull_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Kingston upon Hull Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.kingston_upon_hull.council_tax_reduction + local_scheme = benunit( + "kingston_upon_hull_council_tax_reduction_is_local_scheme", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + uc_applicable_income = benunit( + "kingston_upon_hull_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "kingston_upon_hull_council_tax_reduction_non_dep_deductions", period + ) + maximum_award = ( + max_(0, liability - non_dep_deductions) * ctr.maximum_support_rate + ) + award = max_( + 0, + maximum_award - excess_income * ctr.means_test.withdrawal_rate, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, + uc_capital_eligible, + non_uc_capital_eligible | relevant_income_based_benefit, + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..855f00ee7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class kingston_upon_hull_council_tax_reduction_claimant_source_non_dep_exemption( + Variable +): + value_type = bool + entity = Person + label = "Whether a Kingston upon Hull CTR claimant has a paragraph 29 non-dependant deduction exemption not otherwise modeled" + documentation = "Covers source-listed claimant exemptions not otherwise represented in PolicyEngine UK, such as being registered severely sight-impaired." + definition_period = YEAR + reference = "https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..e878bbae5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,99 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class kingston_upon_hull_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = ( + "Kingston upon Hull Council Tax Reduction individual non-dependant deduction" + ) + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.kingston_upon_hull.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "kingston_upon_hull_council_tax_reduction_is_local_scheme", period + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + weekly_gross_income = benunit_gross_income / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + uc_weekly_hours = ( + person.benunit.sum(person("uc_mif_capped_earned_income", period)) + / WEEKS_IN_YEAR + / person.benunit.max(person("minimum_wage", period)) + ) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) | ( + (person.benunit("universal_credit", period) > 0) + & (uc_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours) + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "kingston_upon_hull_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = (person.benunit("universal_credit", period) > 0) & ( + person.benunit("uc_earned_income", period) <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person( + "kingston_upon_hull_council_tax_reduction_non_dep_source_exemption", + period, + ) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..6ef95dfbd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_kingston_upon_hull, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class kingston_upon_hull_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Kingston upon Hull's local CTR scheme" + definition_period = YEAR + reference = "https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + uc_relevant_period_pensioner = benunit( + "kingston_upon_hull_council_tax_reduction_uc_relevant_period_pensioner", + period, + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_kingston_upon_hull(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..e16701669 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class kingston_upon_hull_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Kingston upon Hull Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "kingston_upon_hull_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..017a8a684 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class kingston_upon_hull_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Kingston upon Hull CTR non-dependant has a paragraph 29 deduction exemption not otherwise modeled" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK, such as normal home elsewhere, youth training, long-term patient status, armed forces operations, or discount-disregarded cases." + definition_period = YEAR + reference = "https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..2608e2924 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * + + +class kingston_upon_hull_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = ( + "Kingston upon Hull Council Tax Reduction Universal Credit applicable income" + ) + definition_period = YEAR + unit = GBP + reference = "https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..3e40bf17f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_hull/council_tax_reduction/kingston_upon_hull_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class kingston_upon_hull_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether a Kingston upon Hull UC claimant remains in the pensioner scheme during the paragraph 3 relevant period" + documentation = "Covers the source transitional protection for pension-age tax-credit-to-Universal-Credit cases where the UC award is disregarded for pensioner-status classification." + definition_period = YEAR + reference = "https://www.hull.gov.uk/downloads/file/239/council-tax-reduction-scheme-2025-to-2026" + default_value = False 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 new file mode 100644 index 000000000..be409d1ef --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction.py @@ -0,0 +1,51 @@ +from policyengine_uk.model_api import * +import numpy as np +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_kingston_upon_thames_working_age, +) + + +class kingston_upon_thames_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Kingston upon Thames Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.kingston_upon_thames.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_kingston_upon_thames_working_age( + local_authority, country, has_pensioner + ) + has_uc = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + capital = benunit.household("savings", period) + weekly_tariff_income = np.ceil( + max_(0, capital - ctr.means_test.tariff_income_threshold) + / ctr.means_test.tariff_income_step + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "kingston_upon_thames_council_tax_reduction_non_dep_deductions", + applicable_amount=applicable_amount, + additional_applicable_income=where( + has_uc, 0, weekly_tariff_income * WEEKS_IN_YEAR + ), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..e69827d1b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_kingston_upon_thames_working_age, +) + + +class kingston_upon_thames_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Kingston upon Thames CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.kingston_upon_thames.council_tax_reduction + household = person.household + working_age = is_kingston_upon_thames_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return normal_gross_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..96d4c8ce9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/kingston_upon_thames/council_tax_reduction/kingston_upon_thames_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class kingston_upon_thames_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Kingston upon Thames CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "kingston_upon_thames_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/lambeth/council_tax_reduction/lambeth_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/lambeth/council_tax_reduction/lambeth_council_tax_reduction.py new file mode 100644 index 000000000..90039f779 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lambeth/council_tax_reduction/lambeth_council_tax_reduction.py @@ -0,0 +1,75 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_lambeth_working_age, +) + + +class lambeth_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Lambeth Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.lambeth.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_lambeth_working_age(local_authority, country, has_pensioner) + person = benunit.members + claimant_or_partner = person("is_adult", period) + gross_earned_income = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + weekly_net_earnings = ( + max_(0, gross_earned_income - earnings_deductions) / WEEKS_IN_YEAR + ) + num_children = benunit("num_children", period) + income_bands = ctr.income_band + support_rate = select( + [ + num_children >= 5, + num_children == 4, + num_children == 3, + num_children == 2, + num_children == 1, + ], + [ + income_bands.five_or_more_children.calc(weekly_net_earnings), + income_bands.four_children.calc(weekly_net_earnings), + income_bands.three_children.calc(weekly_net_earnings), + income_bands.two_children.calc(weekly_net_earnings), + income_bands.one_child.calc(weekly_net_earnings), + ], + default=income_bands.no_children.calc(weekly_net_earnings), + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "lambeth_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital_eligible = ( + benunit.household("savings", period) < ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/lambeth/council_tax_reduction/lambeth_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/lambeth/council_tax_reduction/lambeth_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..e3f084a2c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lambeth/council_tax_reduction/lambeth_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,45 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_lambeth_working_age, +) + + +class lambeth_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Lambeth CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.lambeth.council_tax_reduction + household = person.household + working_age = is_lambeth_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_earned_income = earned_income / WEEKS_IN_YEAR + deduction = ( + ctr.non_dep_deduction.amount.calc(weekly_earned_income) * WEEKS_IN_YEAR + ) + return working_age * where(claimant_exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/lambeth/council_tax_reduction/lambeth_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/lambeth/council_tax_reduction/lambeth_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..b1ec63eba --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lambeth/council_tax_reduction/lambeth_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,17 @@ +from policyengine_uk.model_api import * + + +class lambeth_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Lambeth CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + deductions = benunit.members( + "lambeth_council_tax_reduction_individual_non_dep_deduction", + period, + ) + deductions_in_household = benunit.max(benunit.members.household.sum(deductions)) + return deductions_in_household - benunit.sum(deductions) diff --git a/policyengine_uk/variables/gov/local_authorities/lancaster/council_tax_reduction/lancaster_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/lancaster/council_tax_reduction/lancaster_council_tax_reduction.py new file mode 100644 index 000000000..e0227ab15 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lancaster/council_tax_reduction/lancaster_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_lancaster_working_age, +) + + +class lancaster_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Lancaster Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.lancaster.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_lancaster_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "lancaster_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/lancaster/council_tax_reduction/lancaster_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/lancaster/council_tax_reduction/lancaster_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..8c212dc84 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lancaster/council_tax_reduction/lancaster_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_lancaster_working_age, +) + + +class lancaster_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Lancaster CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.lancaster.council_tax_reduction + household = person.household + working_age = is_lancaster_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_under_25_uc_no_earned_income=True, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/lancaster/council_tax_reduction/lancaster_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/lancaster/council_tax_reduction/lancaster_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..ca8063e55 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lancaster/council_tax_reduction/lancaster_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class lancaster_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Lancaster CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "lancaster_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction.py new file mode 100644 index 000000000..ce219b3d5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction.py @@ -0,0 +1,68 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_lewisham_working_age, +) + + +class lewisham_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Lewisham Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.lewisham.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_lewisham_working_age(local_authority, country, has_pensioner) + has_uc_case = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc_case, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("lewisham_council_tax_reduction_tariff_income", period) + uc_applicable_income = benunit( + "lewisham_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_case, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "lewisham_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_case, uc_capital_eligible, non_uc_capital_eligible + ) + capital_eligible = capital_eligible | relevant_income_based_benefit + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..3841b225d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,94 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_lewisham_working_age, +) + + +class lewisham_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Lewisham Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.lewisham.council_tax_reduction + household = person.household + working_age = is_lewisham_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ] + person_gross_income = add(person, period, gross_income_components) + person_earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + gross_income = where( + has_uc_award, + person_gross_income, + person.benunit.sum(person_gross_income), + ) + earned_income = where( + has_uc_award, + person_earned_income, + person.benunit.sum(person_earned_income), + ) + weekly_gross_income = gross_income / WEEKS_IN_YEAR + weekly_hours = where( + has_uc_award, + person("weekly_hours", period), + person.benunit.max(person("weekly_hours", period)), + ) + in_remunerative_work = ( + weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = has_uc_award & ( + person.benunit.sum(person_earned_income) <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + ) + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..2c256e844 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class lewisham_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Lewisham Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "lewisham_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..2bfffae65 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_tariff_income.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class lewisham_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Lewisham Council Tax Reduction tariff income from capital" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + has_uc_case = benunit("universal_credit", period) > 0 + tariff = parameters( + period + ).gov.local_authorities.lewisham.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_case, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..2785bbc2c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/lewisham/council_tax_reduction/lewisham_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,22 @@ +from policyengine_uk.model_api import * + + +class lewisham_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Lewisham Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://lewisham.gov.uk/-/media/services/council-tax/lewisham-council-tax-reduction-scheme-2024-2025.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.lewisham.council_tax_reduction + has_uc_case = benunit("universal_credit", period) > 0 + earnings_disregard = ctr.universal_credit.weekly_earnings_disregard + earned_income = max_( + 0, + benunit("uc_earned_income", period) - earnings_disregard * WEEKS_IN_YEAR, + ) + uc_income = earned_income + benunit("uc_unearned_income", period) + uc_award = benunit("universal_credit", period) + return has_uc_case * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction.py new file mode 100644 index 000000000..c8464116c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction.py @@ -0,0 +1,66 @@ +from policyengine_uk.model_api import * + + +class maldon_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Maldon Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.maldon.council_tax_reduction + local_scheme = benunit("maldon_council_tax_reduction_is_local_scheme", period) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + applicable_income = where( + has_uc_award, + benunit("maldon_council_tax_reduction_uc_applicable_income", period), + benunit("council_tax_reduction_applicable_income", period), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where( + relevant_income_based_benefit & ~has_uc_award, 0, excess_income + ) + liability = benunit.household( + "maldon_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "maldon_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) < ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) < ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..29f923e51 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) + + +class maldon_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Maldon individual Council Tax Reduction non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.maldon.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "maldon_council_tax_reduction_is_local_scheme", period + ) + ) + return flat_non_dep_deduction(person, period, ctr, local_scheme) diff --git a/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..f90679a4f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,42 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_maldon, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class maldon_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether the benefit unit is under Maldon's local Council Tax Reduction scheme" + ) + definition_period = YEAR + reference = "https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "maldon_council_tax_reduction_uc_relevant_period_pensioner", period + ) | benunit("maldon_council_tax_reduction_uc_regulation_60a_pensioner", period) + local_case = ( + has_working_age_adult + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return (country == Country.ENGLAND) & is_maldon(local_authority) & local_case diff --git a/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..c14594781 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class maldon_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Maldon maximum Council Tax liability eligible for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.maldon.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..58c0c0b0a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class maldon_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Maldon Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "maldon_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..af74382c6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class maldon_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Maldon Universal Credit applicable income for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * (uc_income + benunit("universal_credit", period)) diff --git a/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..a61a50a66 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class maldon_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Maldon's Universal Credit regulation 60A pensioner exception applies" + ) + definition_period = YEAR + reference = "https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..dec70c8fe --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/maldon/council_tax_reduction/maldon_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class maldon_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Maldon's Universal Credit relevant-period pensioner exception applies" + ) + definition_period = YEAR + reference = "https://democracy.maldon.gov.uk/documents/s40932/Appendix%203.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/merton/council_tax_reduction/merton_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/merton/council_tax_reduction/merton_council_tax_reduction.py new file mode 100644 index 000000000..03012a5f8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/merton/council_tax_reduction/merton_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_merton_working_age, +) + + +class merton_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Merton Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.merton.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_merton_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "merton_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/merton/council_tax_reduction/merton_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/merton/council_tax_reduction/merton_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..2fc265e1d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/merton/council_tax_reduction/merton_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_merton_working_age, +) + + +class merton_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Merton CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.merton.council_tax_reduction + household = person.household + working_age = is_merton_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/merton/council_tax_reduction/merton_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/merton/council_tax_reduction/merton_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..536606859 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/merton/council_tax_reduction/merton_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class merton_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Merton CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "merton_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction.py new file mode 100644 index 000000000..f59c05b5d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction.py @@ -0,0 +1,74 @@ +from policyengine_uk.model_api import * + + +class mid_suffolk_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Mid Suffolk Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.mid_suffolk.council_tax_reduction + local_scheme = benunit( + "mid_suffolk_council_tax_reduction_is_local_scheme", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "mid_suffolk_council_tax_reduction_non_dep_deductions", period + ) + eligible_liability = max_(0, liability - non_dep_deductions) + + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("mid_suffolk_council_tax_reduction_tariff_income", period) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + non_uc_award = max_( + 0, + eligible_liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate, + ) + + monthly_uc_earnings = benunit( + "mid_suffolk_council_tax_reduction_uc_monthly_earnings", period + ) + weekly_uc_contribution = benunit( + "mid_suffolk_council_tax_reduction_uc_weekly_contribution", period + ) + uc_award = max_( + 0, + eligible_liability - weekly_uc_contribution * WEEKS_IN_YEAR, + ) + uc_award = where( + monthly_uc_earnings + >= ctr.uc_earnings_contribution.no_entitlement_threshold, + 0, + uc_award, + ) + award = where(has_uc_award, uc_award, non_uc_award) + annual_minimum_award = ctr.means_test.minimum_award * WEEKS_IN_YEAR + award = where(award >= annual_minimum_award, award, 0) + + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..ea8480d62 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class mid_suffolk_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Mid Suffolk CTR claimant source-defined non-dependant deduction exemption" + documentation = "Covers source-listed claimant or partner non-dependant deduction exemptions not otherwise represented in PolicyEngine UK." + definition_period = YEAR + default_value = False + reference = "https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..872d859c5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,94 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class mid_suffolk_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Mid Suffolk Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.mid_suffolk.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "mid_suffolk_council_tax_reduction_is_local_scheme", + period, + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + gross_income = where(has_uc_award, person_gross_income, benunit_gross_income) + weekly_gross_income = gross_income / WEEKS_IN_YEAR + weekly_hours = where( + has_uc_award, + person("weekly_hours", period), + person.benunit.max(person("weekly_hours", period)), + ) + in_remunerative_work = ( + weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "mid_suffolk_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = has_uc_award & ( + person("mid_suffolk_council_tax_reduction_non_dep_uc_earned_income", period) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person( + "mid_suffolk_council_tax_reduction_non_dep_source_exemption", period + ) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..51b9f9bc2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_mid_suffolk, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class mid_suffolk_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Mid Suffolk's local CTR scheme" + definition_period = YEAR + reference = "https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + source_working_age = ( + ~has_pensioner | relevant_income_based_benefit | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_mid_suffolk(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..8bc9312fb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class mid_suffolk_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Mid Suffolk Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "mid_suffolk_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..fd5d4048e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class mid_suffolk_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Mid Suffolk CTR source-defined non-dependant exemption" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK." + definition_period = YEAR + default_value = False + reference = "https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..db6bf875c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class mid_suffolk_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Mid Suffolk CTR non-dependant Universal Credit assessed earned income" + documentation = "Source input for person-level earned income used in the non-dependant's Universal Credit award calculation." + definition_period = YEAR + unit = GBP + reference = "https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf" + + def formula(person, period, parameters): + return person("employment_income", period) + person( + "self_employment_income", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..57df514d8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_tariff_income.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class mid_suffolk_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Mid Suffolk Council Tax Reduction tariff income" + definition_period = YEAR + unit = GBP + reference = "https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf" + + def formula(benunit, period, parameters): + tariff = parameters( + period + ).gov.local_authorities.mid_suffolk.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + tariff_units = np.ceil(max_(0, capital - tariff.threshold) / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + has_uc_award = benunit("universal_credit", period) > 0 + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where(has_uc_award | relevant_income_based_benefit, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_uc_monthly_earnings.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_uc_monthly_earnings.py new file mode 100644 index 000000000..061c37341 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_uc_monthly_earnings.py @@ -0,0 +1,29 @@ +from policyengine_uk.model_api import * + + +class mid_suffolk_council_tax_reduction_uc_monthly_earnings(Variable): + value_type = float + entity = BenUnit + label = "Mid Suffolk Council Tax Reduction Universal Credit notified monthly net earnings" + definition_period = YEAR + unit = GBP + reference = "https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + uc_gross_earnings = benunit.sum( + claimant_or_partner * person("uc_mif_capped_earned_income", period) + ) + deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + return max_(0, uc_gross_earnings - deductions) / MONTHS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_uc_weekly_contribution.py b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_uc_weekly_contribution.py new file mode 100644 index 000000000..0415d75bf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/mid_suffolk/council_tax_reduction/mid_suffolk_council_tax_reduction_uc_weekly_contribution.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * + + +class mid_suffolk_council_tax_reduction_uc_weekly_contribution(Variable): + value_type = float + entity = BenUnit + label = "Mid Suffolk Council Tax Reduction weekly contribution for Universal Credit claimants" + definition_period = YEAR + unit = GBP + reference = "https://www.midsuffolk.gov.uk/documents/d/asset-library-54706/msdc-ctr-scheme-2026_27-v4-pdf" + + def formula(benunit, period, parameters): + contribution = parameters( + period + ).gov.local_authorities.mid_suffolk.council_tax_reduction.uc_earnings_contribution + monthly_uc_earnings = benunit( + "mid_suffolk_council_tax_reduction_uc_monthly_earnings", period + ) + return contribution.amount.calc(monthly_uc_earnings) diff --git a/policyengine_uk/variables/gov/local_authorities/newham/council_tax_reduction/newham_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/newham/council_tax_reduction/newham_council_tax_reduction.py new file mode 100644 index 000000000..7485f79e1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/newham/council_tax_reduction/newham_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_newham_working_age, +) + + +class newham_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Newham Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.newham.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_newham_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "newham_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/newham/council_tax_reduction/newham_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/newham/council_tax_reduction/newham_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..d1f6519c2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/newham/council_tax_reduction/newham_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_newham_working_age, +) + + +class newham_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Newham CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.newham.council_tax_reduction + household = person.household + working_age = is_newham_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return normal_gross_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/newham/council_tax_reduction/newham_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/newham/council_tax_reduction/newham_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..465dce5d2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/newham/council_tax_reduction/newham_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class newham_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Newham CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "newham_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/north_norfolk/council_tax_reduction/north_norfolk_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/north_norfolk/council_tax_reduction/north_norfolk_council_tax_reduction.py new file mode 100644 index 000000000..dc4682abf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_norfolk/council_tax_reduction/north_norfolk_council_tax_reduction.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_north_norfolk_working_age, +) + + +class north_norfolk_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "North Norfolk Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.north_norfolk.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_north_norfolk_working_age( + local_authority, country, has_pensioner + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "north_norfolk_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/north_norfolk/council_tax_reduction/north_norfolk_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/north_norfolk/council_tax_reduction/north_norfolk_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..46e8a6ed9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_norfolk/council_tax_reduction/north_norfolk_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,39 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_north_norfolk_working_age, +) + + +class north_norfolk_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "North Norfolk CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.north_norfolk.council_tax_reduction + household = person.household + working_age = is_north_norfolk_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_limited_capability = household.any( + claimant_or_partner + & household_person("uc_limited_capability_for_WRA", period) + ) + claimant_exempt = ( + household("council_tax_reduction_household_has_non_dep_exemption", period) + | claimant_limited_capability + ) + deduction = ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + return working_age * where(claimant_exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/north_norfolk/council_tax_reduction/north_norfolk_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/north_norfolk/council_tax_reduction/north_norfolk_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..d46df93d4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_norfolk/council_tax_reduction/north_norfolk_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class north_norfolk_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "North Norfolk CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "north_norfolk_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction.py new file mode 100644 index 000000000..a13e4e17c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction.py @@ -0,0 +1,73 @@ +from policyengine_uk.model_api import * + + +class north_northamptonshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "North Northamptonshire Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.north_northamptonshire.council_tax_reduction + local_scheme = benunit( + "north_northamptonshire_council_tax_reduction_is_local_scheme", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit( + "north_northamptonshire_council_tax_reduction_tariff_income", period + ) + uc_applicable_income = benunit( + "north_northamptonshire_council_tax_reduction_uc_applicable_income", + period, + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "north_northamptonshire_council_tax_reduction_non_dep_deductions", + period, + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, + uc_capital_eligible, + non_uc_capital_eligible | relevant_income_based_benefit, + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..bc16be5f5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class north_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption( + Variable +): + value_type = bool + entity = Person + label = "Whether a North Northamptonshire CTR claimant or partner has a source-defined non-dependant deduction exemption not otherwise modeled" + documentation = "Covers source-listed claimant exemptions not otherwise represented in PolicyEngine UK, such as Scottish Adult Disability Living Allowance care component or would-be entitlement to a disability benefit but for suspension, abatement, or hospitalisation." + definition_period = YEAR + reference = "https://cms.northnorthants.gov.uk/media/4157/download" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..b51fd64f3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,104 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class north_northamptonshire_council_tax_reduction_individual_non_dep_deduction( + Variable +): + value_type = float + entity = Person + label = ( + "North Northamptonshire Council Tax Support individual non-dependant deduction" + ) + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.north_northamptonshire.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "north_northamptonshire_council_tax_reduction_is_local_scheme", + period, + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + gross_income = where(has_uc_award, person_gross_income, benunit_gross_income) + weekly_gross_income = gross_income / WEEKS_IN_YEAR + weekly_hours = where( + has_uc_award, + person("weekly_hours", period), + person.benunit.max(person("weekly_hours", period)), + ) + in_remunerative_work = ( + weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "north_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = has_uc_award & ( + person( + "north_northamptonshire_council_tax_reduction_non_dep_uc_earned_income", + period, + ) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person( + "north_northamptonshire_council_tax_reduction_non_dep_source_exemption", + period, + ) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..86f7f25fb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,27 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_north_northamptonshire, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class north_northamptonshire_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether the benefit unit is under North Northamptonshire's local CTR scheme" + ) + definition_period = YEAR + reference = "https://northnorthants.moderngov.co.uk/documents/s34359/Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + return ( + (country == Country.ENGLAND) + & is_north_northamptonshire(local_authority) + & ~has_pensioner + ) diff --git a/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..c5f9b4baa --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class north_northamptonshire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "North Northamptonshire Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "north_northamptonshire_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..428a682e3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class north_northamptonshire_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a North Northamptonshire CTR non-dependant has a section 30.7 or 30.8 deduction exemption not otherwise modeled" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK, such as normal home elsewhere, youth-training allowance, long-term patient status, or Schedule 1 discount-disregarded cases." + definition_period = YEAR + reference = "https://cms.northnorthants.gov.uk/media/4157/download" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..fd273bf2f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class north_northamptonshire_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "North Northamptonshire Council Tax Support non-dependant UC earned income" + documentation = "Person-level UC earned income for applying the source exemption where a non-dependant's Universal Credit award is calculated with no earned income. Defaults to modeled person-level gross UC earned income and can be overridden where DWP assessed income differs." + definition_period = YEAR + unit = GBP + reference = "https://cms.northnorthants.gov.uk/media/4157/download" + + def formula(person, period, parameters): + return person("uc_mif_capped_earned_income", period) diff --git a/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..072798ce8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_tariff_income.py @@ -0,0 +1,29 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class north_northamptonshire_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "North Northamptonshire Council Tax Support tariff income from capital" + definition_period = YEAR + unit = GBP + reference = "https://cms.northnorthants.gov.uk/media/4157/download" + + def formula(benunit, period, parameters): + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + tariff = parameters( + period + ).gov.local_authorities.north_northamptonshire.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award | relevant_income_based_benefit, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..aa68e03c2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_northamptonshire/council_tax_reduction/north_northamptonshire_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class north_northamptonshire_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = ( + "North Northamptonshire Council Tax Support Universal Credit applicable income" + ) + definition_period = YEAR + unit = GBP + reference = "https://cms.northnorthants.gov.uk/media/4157/download" + + def formula(benunit, period, parameters): + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * (uc_income + uc_award_before_deductions) diff --git a/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction.py new file mode 100644 index 000000000..ab4da1d9a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction.py @@ -0,0 +1,70 @@ +from policyengine_uk.model_api import * + + +class north_yorkshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "North Yorkshire Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.north_yorkshire.council_tax_reduction + local_scheme = benunit( + "north_yorkshire_council_tax_reduction_is_local_scheme", period + ) + weekly_income = benunit( + "north_yorkshire_council_tax_reduction_weekly_income", period + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_children = benunit.sum(child_or_young_person) + is_couple = benunit("is_couple", period) + income_bands = ctr.income_band + weekly_income_for_band = weekly_income + 1e-9 + banded_support_rate = select( + [ + num_children >= 2, + num_children == 1, + is_couple, + ], + [ + income_bands.family_two_or_more_children.calc(weekly_income_for_band), + income_bands.family_one_child.calc(weekly_income_for_band), + income_bands.couple.calc(weekly_income_for_band), + ], + default=income_bands.single.calc(weekly_income_for_band), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + support_rate = where(relevant_income_based_benefit, 1, banded_support_rate) + liability = benunit.household("council_tax", period) + has_uc_award = benunit("universal_credit", period) > 0 + non_uc_capital = benunit.household("savings", period) + uc_capital = benunit("uc_assessable_capital", period) + ordinary_capital_eligible = non_uc_capital < ctr.means_test.capital_limit + passported_capital_eligible = ( + non_uc_capital <= ctr.means_test.passported_capital_limit + ) + non_uc_capital_eligible = where( + relevant_income_based_benefit, + passported_capital_eligible, + ordinary_capital_eligible, + ) + uc_capital_eligible = uc_capital < ctr.means_test.capital_limit + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * liability + * support_rate + ) diff --git a/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..7f819abe1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_north_yorkshire, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class north_yorkshire_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under North Yorkshire's local CTR scheme" + definition_period = YEAR + reference = "https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + uc_relevant_period_pensioner = benunit( + "north_yorkshire_council_tax_reduction_uc_relevant_period_pensioner", + period, + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_north_yorkshire(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..f636624cc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class north_yorkshire_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether a North Yorkshire UC claimant remains in the pensioner scheme during the source relevant period" + documentation = "Covers the source transitional protection for pension-age tax-credit-to-Universal-Credit cases where the UC award is disregarded for pensioner-status classification." + definition_period = YEAR + reference = "https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_uc_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_uc_weekly_income.py new file mode 100644 index 000000000..66836aadf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_uc_weekly_income.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * + + +class north_yorkshire_council_tax_reduction_uc_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "North Yorkshire Council Tax Reduction weekly Universal Credit income" + definition_period = YEAR + unit = GBP + reference = "https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + uc_maximum_amount = benunit("uc_maximum_amount", period) + housing_element = benunit("uc_housing_costs_element", period) + housing_element_ratio = where( + uc_maximum_amount > 0, + min_(1, max_(0, uc_award / uc_maximum_amount)), + 0, + ) + housing_element_disregard = min_( + housing_element, + housing_element * housing_element_ratio, + ) + countable_uc_award = max_( + 0, + uc_award - housing_element_disregard, + ) + return has_uc_award * max_(0, uc_income + countable_uc_award) / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..14ce81dd1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/north_yorkshire/council_tax_reduction/north_yorkshire_council_tax_reduction_weekly_income.py @@ -0,0 +1,95 @@ +from policyengine_uk.model_api import * + + +class north_yorkshire_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "North Yorkshire Council Tax Reduction weekly income" + definition_period = YEAR + unit = GBP + reference = "https://www.northyorks.gov.uk/sites/default/files/2026-03/North%20Yorkshire%20Council%27s%20Council%20Tax%20Reduction%20Scheme%202026%20to%202027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.north_yorkshire.council_tax_reduction + has_uc_award = benunit("universal_credit", period) > 0 + uc_weekly_income = benunit( + "north_yorkshire_council_tax_reduction_uc_weekly_income", period + ) + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + weekly_net_earnings = ( + max_(0, gross_earnings - earnings_deductions) / WEEKS_IN_YEAR + ) + earnings_disregard = select( + [ + benunit("is_single_person", period), + benunit("is_couple", period) | benunit("is_lone_parent", period), + ], + [ + ctr.earnings_disregard.single, + ctr.earnings_disregard.couple_or_lone_parent, + ], + default=0, + ) + countable_weekly_earnings = max_( + 0, weekly_net_earnings - (gross_earnings > 0) * earnings_disregard + ) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "jsa_contrib", + "esa_contrib", + "working_tax_credit", + "child_tax_credit", + ], + ) + non_uc_weekly_income = ( + countable_weekly_earnings + + max_(0, other_income + benefit_income) / WEEKS_IN_YEAR + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + weekly_income = where( + relevant_income_based_benefit, + 0, + where(has_uc_award, uc_weekly_income, non_uc_weekly_income), + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/norwich/council_tax_reduction/norwich_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/norwich/council_tax_reduction/norwich_council_tax_reduction.py new file mode 100644 index 000000000..dc820ebb2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/norwich/council_tax_reduction/norwich_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_norwich_working_age, +) + + +class norwich_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Norwich Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.norwich.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_norwich_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "norwich_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/norwich/council_tax_reduction/norwich_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/norwich/council_tax_reduction/norwich_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..b1bc4acaa --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/norwich/council_tax_reduction/norwich_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_norwich_working_age, +) + + +class norwich_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Norwich CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.norwich.council_tax_reduction + household = person.household + working_age = is_norwich_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/norwich/council_tax_reduction/norwich_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/norwich/council_tax_reduction/norwich_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..ba4e6e692 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/norwich/council_tax_reduction/norwich_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class norwich_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Norwich CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "norwich_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction.py new file mode 100644 index 000000000..30889e8f7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_oldham_working_age, +) + + +class oldham_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Oldham Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.oldham.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_oldham_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "oldham_council_tax_reduction_non_dep_deductions", + maximum_eligible_liability_variable=( + "oldham_council_tax_reduction_maximum_eligible_liability" + ), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..ac6f24654 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_oldham_working_age, +) + + +class oldham_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Oldham CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.oldham.council_tax_reduction + household = person.household + working_age = is_oldham_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_uc_no_earned_income=True, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..6667f9d82 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_oldham_working_age, +) + + +class oldham_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Oldham maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.oldham.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_oldham_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + capped = working_age & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..090c6376a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/oldham/council_tax_reduction/oldham_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class oldham_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Oldham CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "oldham_council_tax_reduction_individual_non_dep_deduction", + ) 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 new file mode 100644 index 000000000..5c322a35c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction.py @@ -0,0 +1,53 @@ +from policyengine_uk.model_api import * +import numpy as np +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_oxford_working_age, +) + + +class oxford_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Oxford Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.oxford.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_oxford_working_age(local_authority, country, has_pensioner) + is_household_head_benunit = benunit("benunit_contains_household_head", period) + would_claim = benunit("would_claim_council_tax_reduction", period) + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + weekly_income = benunit("council_tax_reduction_applicable_income", period) / 52 + capital = benunit.household("savings", period) + has_uc = benunit("universal_credit", period) > 0 + weekly_tariff_income = np.ceil( + max_(0, capital - ctr.means_test.tariff_income_threshold) + / ctr.means_test.tariff_income_step + ) + weekly_income += where(has_uc, 0, weekly_tariff_income) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + weekly_income = where(relevant_income_based_benefit, 0, weekly_income) + support_rate = ctr.income_band.maximum_support_rate.calc(weekly_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "oxford_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + return ( + working_age + * is_household_head_benunit + * would_claim + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..d6b15c2f3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,41 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_oxford_working_age, +) + + +class oxford_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Oxford CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.oxford.council_tax_reduction + household = person.household + working_age = is_oxford_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_benunit_earnings = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_benunit_earnings), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_exempt = person.household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + return working_age * where( + claimant_exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR + ) diff --git a/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..ed71bcab0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/oxford/council_tax_reduction/oxford_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class oxford_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Oxford CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "oxford_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction.py new file mode 100644 index 000000000..8b15d7ac6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction.py @@ -0,0 +1,42 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Plymouth Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.plymouth.council_tax_reduction + local_scheme = benunit("plymouth_council_tax_reduction_is_local_scheme", period) + support_rate = benunit("plymouth_council_tax_reduction_support_rate", period) + liability = benunit.household( + "plymouth_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "plymouth_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..bc7d4a429 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,72 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Plymouth Council Tax Support childcare deduction from earnings" + definition_period = YEAR + unit = GBP + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + childcare = parameters( + period + ).gov.local_authorities.plymouth.council_tax_reduction.childcare + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + works_enough_hours = person("weekly_hours", period) >= childcare.work_hours + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + claimant_or_partner & works_enough_hours + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + works_enough_hours | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + | person( + "plymouth_council_tax_reduction_childcare_disabled_partner", period + ) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(claimant_or_partner & works_enough_hours) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = child_or_young_person & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & ( + person("is_disabled_for_benefits", period) + | person( + "plymouth_council_tax_reduction_childcare_disabled_child", + period, + ) + ) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [ + eligible_children >= 2, + eligible_children == 1, + ], + [ + childcare.weekly_maximum.two_or_more_children, + childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_childcare_disabled_child.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_childcare_disabled_child.py new file mode 100644 index 000000000..940b74000 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_childcare_disabled_child.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_childcare_disabled_child(Variable): + value_type = bool + entity = Person + label = "Plymouth Council Tax Support source-defined disabled child for childcare deduction" + documentation = "Covers source disabled-child status for childcare age-limit rules not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_childcare_disabled_partner.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_childcare_disabled_partner.py new file mode 100644 index 000000000..4e7d04739 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_childcare_disabled_partner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_childcare_disabled_partner(Variable): + value_type = bool + entity = Person + label = "Plymouth Council Tax Support source-defined disabled partner for childcare deduction" + documentation = "Covers source incapacity and disability statuses for partner childcare eligibility not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_disability_income_disregard.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_disability_income_disregard.py new file mode 100644 index 000000000..6f3d74423 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_disability_income_disregard.py @@ -0,0 +1,22 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_disability_income_disregard(Variable): + value_type = float + entity = BenUnit + label = "Plymouth Council Tax Support annual disability premium income disregard" + definition_period = YEAR + unit = GBP + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + modeled_premia = ( + benunit("disability_premium", period) + + benunit("enhanced_disability_premium", period) + + benunit("severe_disability_premium", period) + ) + source_amount = benunit( + "plymouth_council_tax_reduction_source_disability_income_disregard", + period, + ) + return modeled_premia + source_amount diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_disability_or_esa_component.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_disability_or_esa_component.py new file mode 100644 index 000000000..fcbc3c07c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_disability_or_esa_component.py @@ -0,0 +1,22 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_disability_or_esa_component(Variable): + value_type = bool + entity = BenUnit + label = "Plymouth Council Tax Support disability or ESA component earnings disregard applies" + definition_period = YEAR + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + disability_premia = benunit("disability_premium", period) + benunit( + "severe_disability_premium", period + ) + esa_component = benunit( + "plymouth_council_tax_reduction_esa_support_component", period + ) + source_trigger = benunit( + "plymouth_council_tax_reduction_source_disability_or_esa_component", + period, + ) + return (disability_premia > 0) | (esa_component > 0) | source_trigger diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_earnings_disregard.py new file mode 100644 index 000000000..630a5e728 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_earnings_disregard.py @@ -0,0 +1,42 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_earnings_disregard(Variable): + value_type = float + entity = BenUnit + label = "Plymouth Council Tax Support weekly earnings disregard" + definition_period = YEAR + unit = GBP + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.plymouth.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + has_children = benunit.any(child_or_young_person) + family_with_child = has_children & ( + benunit("is_lone_parent", period) | benunit("is_couple", period) + ) + disability_or_esa = benunit( + "plymouth_council_tax_reduction_disability_or_esa_component", period + ) + special_occupation = benunit( + "plymouth_council_tax_reduction_source_special_earnings_disregard", period + ) + return select( + [ + family_with_child, + disability_or_esa | special_occupation, + benunit("is_couple", period), + benunit("is_single_person", period), + ], + [ + ctr.earnings_disregard.lone_parent_or_couple_with_child, + ctr.earnings_disregard.disability_or_esa_component, + ctr.earnings_disregard.couple, + ctr.earnings_disregard.single, + ], + default=0, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_esa_support_component.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_esa_support_component.py new file mode 100644 index 000000000..df9037ad2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_esa_support_component.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_esa_support_component(Variable): + value_type = float + entity = BenUnit + label = "Plymouth Council Tax Support annual ESA support or work-related activity component amount to disregard" + definition_period = YEAR + unit = GBP + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..040830f17 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,63 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class plymouth_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Plymouth Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.plymouth.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "plymouth_council_tax_reduction_is_local_scheme", period + ) + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + uc_no_earned_income = has_uc_award & ( + person("plymouth_council_tax_reduction_non_dep_uc_earned_income", period) + <= 0 + ) + full_time_student = is_full_time_student_non_dep(person, period) + source_exemption = person( + "plymouth_council_tax_reduction_non_dep_source_exemption", period + ) + exempt = ( + claimant_exempt + | full_time_student + | income_based_benefit + | uc_no_earned_income + | source_exemption + ) + return local_scheme * where( + exempt, 0.0, ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + ) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..03a5aefbc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_plymouth, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class plymouth_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether the benefit unit is under Plymouth's local Council Tax Support scheme" + ) + definition_period = YEAR + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + uc_relevant_period_pensioner = benunit( + "plymouth_council_tax_reduction_uc_relevant_period_pensioner", period + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_plymouth(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..f0416e139 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class plymouth_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Plymouth maximum Council Tax liability eligible for Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.plymouth.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..78cca8fbf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class plymouth_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Plymouth Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "plymouth_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..b9950786a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Plymouth Council Tax Support non-dependant source exemption" + documentation = "Covers source-listed non-dependant deduction exemptions not otherwise represented in PolicyEngine UK, including long-term patients, armed forces away on operations, youth training allowances, and Council Tax discount-disregarded status." + definition_period = YEAR + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..13542db3c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Plymouth Council Tax Support non-dependant Universal Credit assessed earned income" + documentation = "Source input for person-level earned income used in the non-dependant's Universal Credit award calculation." + definition_period = YEAR + unit = GBP + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + + def formula(person, period, parameters): + return person("employment_income", period) + person( + "self_employment_income", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_disability_income_disregard.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_disability_income_disregard.py new file mode 100644 index 000000000..b5922e6b5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_disability_income_disregard.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_source_disability_income_disregard(Variable): + value_type = float + entity = BenUnit + label = ( + "Plymouth Council Tax Support source-defined annual disability income disregard" + ) + documentation = "Covers source-listed disability premium and disabled child premium income disregards not otherwise represented in PolicyEngine UK." + definition_period = YEAR + unit = GBP + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_disability_or_esa_component.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_disability_or_esa_component.py new file mode 100644 index 000000000..6e999276c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_disability_or_esa_component.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_source_disability_or_esa_component(Variable): + value_type = bool + entity = BenUnit + label = "Plymouth Council Tax Support source-defined disability or ESA component earnings disregard trigger" + documentation = "Covers source-listed disability premium, severe disability premium, work-related activity component, or support component triggers not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..b9bfdef1b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Plymouth Council Tax Support source-disregarded annual income" + documentation = "Source-listed income disregards not otherwise separately exposed in PolicyEngine UK, such as war pensions, Bereavement Support Payments, or specified compensation payments." + definition_period = YEAR + unit = GBP + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_special_earnings_disregard.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_special_earnings_disregard.py new file mode 100644 index 000000000..8436d481d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_source_special_earnings_disregard.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_source_special_earnings_disregard(Variable): + value_type = bool + entity = BenUnit + label = "Plymouth Council Tax Support source-defined special occupation earnings disregard trigger" + documentation = "Covers source-listed part-time firefighter, coastguard, lifeboat, and reserve forces earnings disregard triggers not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..557539792 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_support_rate.py @@ -0,0 +1,49 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Plymouth Council Tax Support rate" + definition_period = YEAR + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.plymouth.council_tax_reduction + weekly_income = benunit("plymouth_council_tax_reduction_weekly_income", period) + income_bands = ctr.income_band + weekly_income_for_band = weekly_income + 1e-9 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + num_children = benunit.sum(child_or_young_person) + has_child_under_5 = benunit.any( + child_or_young_person & (person("age", period) < 5) + ) + war_pensioner = benunit("plymouth_council_tax_reduction_war_pensioner", period) + is_couple = benunit("is_couple", period) + banded_support_rate = select( + [ + war_pensioner, + has_child_under_5, + num_children >= 2, + num_children == 1, + is_couple, + ], + [ + income_bands.war_pensioner.calc(weekly_income_for_band), + income_bands.child_under_5.calc(weekly_income_for_band), + income_bands.two_or_more_children.calc(weekly_income_for_band), + income_bands.one_child.calc(weekly_income_for_band), + income_bands.couple.calc(weekly_income_for_band), + ], + default=income_bands.single.calc(weekly_income_for_band), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where( + relevant_income_based_benefit, + income_bands.single.calc(0), + banded_support_rate, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..158eef84a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether a Plymouth pension-age Universal Credit award remains in the prescribed pensioner CTR scheme during the source relevant period" + documentation = "Covers the source transitional protection where a Universal Credit award is disregarded for pensioner-status classification." + definition_period = YEAR + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_war_pensioner.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_war_pensioner.py new file mode 100644 index 000000000..6db5af503 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_war_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_war_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Plymouth Council Tax Support claimant or partner is in the war pensioner income-band class" + definition_period = YEAR + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..6ab370180 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/plymouth/council_tax_reduction/plymouth_council_tax_reduction_weekly_income.py @@ -0,0 +1,161 @@ +from policyengine_uk.model_api import * + + +class plymouth_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Plymouth Council Tax Support weekly income" + definition_period = YEAR + unit = GBP + reference = "https://www.plymouth.gov.uk/sites/default/files/2026-03/Plymouth-CTR-Scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.plymouth.council_tax_reduction + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + childcare_deduction = benunit( + "plymouth_council_tax_reduction_childcare_deduction", period + ) + non_uc_net_earnings = max_( + 0, gross_earnings - earnings_deductions - childcare_deduction + ) + uc_net_earnings = benunit("uc_earned_income", period) + net_earnings = where(has_uc_award, uc_net_earnings, non_uc_net_earnings) + has_earnings = where(has_uc_award, uc_net_earnings > 0, gross_earnings > 0) + earnings_disregard = ( + has_earnings + * benunit("plymouth_council_tax_reduction_earnings_disregard", period) + * WEEKS_IN_YEAR + ) + countable_earnings = max_(0, net_earnings - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "tax_credits", + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "jsa_contrib", + "esa_contrib", + ], + ) + esa_component = min_( + benunit("plymouth_council_tax_reduction_esa_support_component", period), + benunit.sum(claimant_or_partner * person("esa_contrib", period)), + ) + non_uc_disregarded_income = ( + add( + benunit, + period, + [ + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "plymouth_council_tax_reduction_source_disregarded_income", + ], + ) + + benunit.sum(claimant_or_partner * person("maintenance_income", period)) + + esa_component + ) + non_uc_income = countable_earnings + max_( + 0, other_income + benefit_income - non_uc_disregarded_income + ) + countable_uc_award = max_( + 0, + uc_award_before_deductions - benunit("uc_housing_costs_element", period), + ) + uc_disregarded_unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "maintenance_income", + ], + ) + ) + add( + benunit, + period, + [ + "plymouth_council_tax_reduction_source_disregarded_income", + "plymouth_council_tax_reduction_esa_support_component", + ], + ) + uc_income = ( + countable_earnings + + max_( + 0, + benunit("uc_unearned_income", period) - uc_disregarded_unearned_income, + ) + + countable_uc_award + ) + annual_income_before_disability_disregard = where( + has_uc_award, + uc_income, + non_uc_income, + ) + disability_income_disregard = benunit( + "plymouth_council_tax_reduction_disability_income_disregard", period + ) + annual_income = max_( + 0, + annual_income_before_disability_disregard - disability_income_disregard, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + weekly_income = where(relevant_income_based_benefit, 0, annual_income) / ( + WEEKS_IN_YEAR + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction.py new file mode 100644 index 000000000..d232e1e7b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction.py @@ -0,0 +1,93 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_redbridge_working_age, +) + + +class redbridge_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Redbridge Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.redbridge.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_redbridge_working_age( + local_authority, + country, + has_pensioner, + ) + person = benunit.members + has_dependants = benunit.any( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + weekly_net_earnings = benunit( + "redbridge_council_tax_reduction_weekly_net_earnings", period + ) + in_remunerative_work = benunit( + "redbridge_council_tax_reduction_claimant_in_remunerative_work", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + contribution_based_benefit = ( + benunit.sum( + person("is_adult", period) + * ~person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + * (person("jsa_contrib", period) + person("esa_contrib", period)) + ) + > 0 + ) + has_uc_award = benunit("universal_credit", period) > 0 + not_working_passported = relevant_income_based_benefit | ( + (has_uc_award | contribution_based_benefit) & ~in_remunerative_work + ) + disability_class = benunit( + "redbridge_council_tax_reduction_disability_class", period + ) + support_rate = select( + [ + disability_class, + has_dependants & not_working_passported, + ~has_dependants & not_working_passported, + has_dependants + & in_remunerative_work + & (weekly_net_earnings < ctr.earnings_threshold.with_dependants), + ~has_dependants + & in_remunerative_work + & (weekly_net_earnings < ctr.earnings_threshold.without_dependants), + ], + [ + ctr.support_rate.disability, + ctr.support_rate.not_working_with_dependants, + ctr.support_rate.not_working_without_dependants, + ctr.support_rate.working_with_dependants, + ctr.support_rate.working_without_dependants, + ], + default=0, + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "redbridge_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + minimum_award = ctr.minimum_award.weekly_amount * WEEKS_IN_YEAR + award = where(award < minimum_award, 0, award) + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_claimant_in_remunerative_work.py b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_claimant_in_remunerative_work.py new file mode 100644 index 000000000..9bfe8b314 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_claimant_in_remunerative_work.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class redbridge_council_tax_reduction_claimant_in_remunerative_work(Variable): + value_type = bool + entity = BenUnit + label = "Redbridge Council Tax Reduction claimant in remunerative work" + definition_period = YEAR + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + paid_work = ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + return benunit.any(claimant_or_partner & (paid_work > 0)) diff --git a/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_disability_class.py b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_disability_class.py new file mode 100644 index 000000000..df6a87794 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_disability_class.py @@ -0,0 +1,25 @@ +from policyengine_uk.model_api import * + + +class redbridge_council_tax_reduction_disability_class(Variable): + value_type = bool + entity = BenUnit + label = "Redbridge Council Tax Reduction disability benefit class" + definition_period = YEAR + reference = "https://www.redbridge.gov.uk/media/frbd0rgm/council-tax-reduction-scheme-2026-2027-full-scheme.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + disability_benefit = ( + (person("dla", period) > 0) + | (person("pip", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | (person("attendance_allowance", period) > 0) + ) + return benunit("benunit_contains_household_head", period) & benunit.any( + claimant_or_partner & disability_benefit + ) diff --git a/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..942350dad --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,48 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_redbridge_working_age, +) + + +class redbridge_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Redbridge Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.redbridge.council_tax_reduction + household = person.household + working_age = is_redbridge_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + statutory_pay = ( + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + in_remunerative_work = (earned_income + statutory_pay) > 0 + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.working_amount, + ctr.non_dep_deduction.not_working_amount, + ) + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_disability_class = household.any( + claimant_benunit + & household_person.benunit( + "redbridge_council_tax_reduction_disability_class", period + ) + ) + exempt = claimant_disability_class | (person("carers_allowance", period) > 0) + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..9736d9625 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class redbridge_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Redbridge Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "redbridge_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_weekly_net_earnings.py b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_weekly_net_earnings.py new file mode 100644 index 000000000..0c8d3baa5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/redbridge/council_tax_reduction/redbridge_council_tax_reduction_weekly_net_earnings.py @@ -0,0 +1,48 @@ +from policyengine_uk.model_api import * + + +class redbridge_council_tax_reduction_weekly_net_earnings(Variable): + value_type = float + entity = BenUnit + label = "Redbridge Council Tax Reduction weekly net earnings" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + non_uc_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + non_uc_earnings = max_(0, gross_earnings - non_uc_deductions) + uc_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + uc_earnings = max_(0, gross_earnings - uc_deductions) + has_uc_award = benunit("universal_credit", period) > 0 + annual_earnings = where( + has_uc_award, + uc_earnings, + non_uc_earnings, + ) + return annual_earnings / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction.py new file mode 100644 index 000000000..e10775a18 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction.py @@ -0,0 +1,66 @@ +from policyengine_uk.model_api import * + + +class rushmoor_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Rushmoor Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.rushmoor.council_tax_reduction + local_scheme = benunit("rushmoor_council_tax_reduction_is_local_scheme", period) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + applicable_income = where( + has_uc_award, + benunit("rushmoor_council_tax_reduction_uc_applicable_income", period), + benunit("council_tax_reduction_applicable_income", period), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where( + relevant_income_based_benefit & ~has_uc_award, 0, excess_income + ) + liability = benunit.household( + "rushmoor_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "rushmoor_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..d7514c773 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) + + +class rushmoor_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Rushmoor individual Council Tax Reduction non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.rushmoor.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "rushmoor_council_tax_reduction_is_local_scheme", period + ) + ) + return normal_gross_income_non_dep_deduction(person, period, ctr, local_scheme) diff --git a/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..6a8627ce4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,42 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_rushmoor, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class rushmoor_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Rushmoor's local Council Tax Reduction scheme" + definition_period = YEAR + reference = "https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "rushmoor_council_tax_reduction_uc_relevant_period_pensioner", period + ) | benunit( + "rushmoor_council_tax_reduction_uc_regulation_60a_pensioner", period + ) + local_case = ( + has_working_age_adult + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return (country == Country.ENGLAND) & is_rushmoor(local_authority) & local_case diff --git a/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..c8bf0a479 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class rushmoor_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Rushmoor maximum Council Tax liability eligible for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.rushmoor.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..8e357c6c7 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class rushmoor_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Rushmoor Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "rushmoor_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..ee35ad54a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * + + +class rushmoor_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Rushmoor Universal Credit applicable income for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf" + + def formula(benunit, period, parameters): + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * (uc_income + benunit("universal_credit", period)) diff --git a/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..07fba160e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class rushmoor_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Rushmoor's Universal Credit regulation 60A pensioner exception applies" + ) + definition_period = YEAR + reference = "https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..ee0a48244 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/rushmoor/council_tax_reduction/rushmoor_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class rushmoor_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Rushmoor's Universal Credit relevant-period pensioner exception applies" + definition_period = YEAR + reference = "https://www.rushmoor.gov.uk/media/qvmlpekv/rushmoor-s13a-scheme-202627-final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/sefton/council_tax_reduction/sefton_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/sefton/council_tax_reduction/sefton_council_tax_reduction.py new file mode 100644 index 000000000..97c7c5cc5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/sefton/council_tax_reduction/sefton_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_sefton_working_age, +) + + +class sefton_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Sefton Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.sefton.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_sefton_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "sefton_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/sefton/council_tax_reduction/sefton_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/sefton/council_tax_reduction/sefton_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..a654f7282 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/sefton/council_tax_reduction/sefton_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,52 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_sefton_working_age, +) + + +class sefton_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Sefton CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.sefton.council_tax_reduction + household = person.household + working_age = is_sefton_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_earned_income = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + in_remunerative_work = ( + person("weekly_hours", period) + >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_gross_income = ( + person.benunit.sum(person("total_income", period)) / WEEKS_IN_YEAR + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_exempt = person.household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_exempt = (person.benunit("universal_credit", period) > 0) & ( + weekly_earned_income <= 0 + ) + exempt = claimant_exempt | income_based_benefit | uc_exempt + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/sefton/council_tax_reduction/sefton_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/sefton/council_tax_reduction/sefton_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..2d683d723 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/sefton/council_tax_reduction/sefton_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class sefton_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Sefton CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "sefton_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction.py new file mode 100644 index 000000000..08ba69899 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * + + +class slough_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Slough Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.slough.council_tax_reduction + local_scheme = benunit("slough_council_tax_reduction_is_local_scheme", period) + support_rate = benunit("slough_council_tax_reduction_support_rate", period) + liability = benunit.household( + "slough_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "slough_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + annual_minimum_award = ctr.means_test.minimum_award * WEEKS_IN_YEAR + award = where(award >= annual_minimum_award, award, 0) + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..c001ee8fd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,63 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class slough_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Slough Council Tax Support individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.slough.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "slough_council_tax_reduction_is_local_scheme", + period, + ) + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + ) + ) + gross_earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + uc_no_earned_income = has_uc_award & ( + person("slough_council_tax_reduction_non_dep_uc_earned_income", period) <= 0 + ) + weekly_hours = person("weekly_hours", period) + weekly_gross_earnings = gross_earned_income / WEEKS_IN_YEAR + high_deduction = ( + ~uc_no_earned_income + & (weekly_hours >= ctr.non_dep_deduction.work_hours) + & (weekly_gross_earnings >= ctr.non_dep_deduction.earnings_threshold) + ) + weekly_deduction = where( + high_deduction, + ctr.non_dep_deduction.high_amount, + ctr.non_dep_deduction.low_amount, + ) + full_time_student = is_full_time_student_non_dep(person, period) + return local_scheme * where( + claimant_exempt | full_time_student, + 0.0, + weekly_deduction * WEEKS_IN_YEAR, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..c9726a07c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_slough, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class slough_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Slough's local CTR scheme" + definition_period = YEAR + reference = "https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + source_working_age = ( + ~has_pensioner | relevant_income_based_benefit | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_slough(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..37ce37b05 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class slough_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Slough maximum Council Tax liability eligible for Council Tax Support" + definition_period = YEAR + unit = GBP + reference = "https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + band_ratios = local_authorities.england.council_tax.band_ratio + ctr = local_authorities.slough.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + band_ratios, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..30e162497 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class slough_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Slough Council Tax Support non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "slough_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..962f98702 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class slough_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Slough CTR non-dependant Universal Credit assessed earned income" + documentation = "Source input for person-level earned income used in the non-dependant's Universal Credit award calculation." + definition_period = YEAR + unit = GBP + reference = "https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27" + + def formula(person, period, parameters): + return person("employment_income", period) + person( + "self_employment_income", period + ) diff --git a/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..d6bc0a2ec --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_support_rate.py @@ -0,0 +1,22 @@ +from policyengine_uk.model_api import * + + +class slough_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Slough Council Tax Support rate" + definition_period = YEAR + reference = "https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.slough.council_tax_reduction + weekly_earnings = benunit( + "slough_council_tax_reduction_weekly_earnings", period + ) + no_earned_income = weekly_earnings <= 0 + earnings_band_rate = ctr.income_band.support_rate.calc(weekly_earnings) + return where( + no_earned_income, + ctr.income_band.no_earned_income_support_rate, + earnings_band_rate, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_weekly_earnings.py b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_weekly_earnings.py new file mode 100644 index 000000000..41729aec0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/slough/council_tax_reduction/slough_council_tax_reduction_weekly_earnings.py @@ -0,0 +1,48 @@ +from policyengine_uk.model_api import * + + +class slough_council_tax_reduction_weekly_earnings(Variable): + value_type = float + entity = BenUnit + label = "Slough Council Tax Support weekly net earned income" + definition_period = YEAR + unit = GBP + reference = "https://www.slough.gov.uk/downloads/file/5730/council-tax-support-scheme-2026-27" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earned_income = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + non_uc_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + non_uc_earnings = max_(0, gross_earned_income - non_uc_deductions) + uc_gross_earnings = benunit.sum( + claimant_or_partner * person("uc_mif_capped_earned_income", period) + ) + uc_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + ) + uc_earnings = max_(0, uc_gross_earnings - uc_deductions) + has_uc_award = benunit("universal_credit", period) > 0 + annual_earnings = where(has_uc_award, uc_earnings, non_uc_earnings) + return annual_earnings / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction.py new file mode 100644 index 000000000..a49cfb6d8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction.py @@ -0,0 +1,77 @@ +from policyengine_uk.model_api import * + + +class somerset_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Somerset Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.somerset.council_tax_reduction + local_scheme = benunit("somerset_council_tax_reduction_is_local_scheme", period) + weekly_income = benunit("somerset_council_tax_reduction_weekly_income", period) + person = benunit.members + num_children = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + is_couple = benunit("is_couple", period) + income_bands = ctr.income_band + weekly_income_for_band = weekly_income + 1e-9 + banded_support_rate = select( + [ + is_couple & (num_children >= 2), + is_couple & (num_children == 1), + (~is_couple) & (num_children >= 2), + (~is_couple) & (num_children == 1), + is_couple, + ], + [ + income_bands.couple_two_or_more_children.calc(weekly_income_for_band), + income_bands.couple_one_child.calc(weekly_income_for_band), + income_bands.single_two_or_more_children.calc(weekly_income_for_band), + income_bands.single_one_child.calc(weekly_income_for_band), + income_bands.couple.calc(weekly_income_for_band), + ], + default=income_bands.single.calc(weekly_income_for_band), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + support_rate = where(relevant_income_based_benefit, 1, banded_support_rate) + liability = benunit.household( + "somerset_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "somerset_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + has_uc_award = benunit("universal_credit", period) > 0 + ordinary_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + passported_capital_eligible = ( + benunit.household("savings", period) + <= ctr.means_test.passported_capital_limit + ) + non_uc_capital_eligible = where( + relevant_income_based_benefit, + passported_capital_eligible, + ordinary_capital_eligible, + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, + uc_capital_eligible, + non_uc_capital_eligible, + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_disabled_income_disregard.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_disabled_income_disregard.py new file mode 100644 index 000000000..59169249f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_disabled_income_disregard.py @@ -0,0 +1,25 @@ +from policyengine_uk.model_api import * + + +class somerset_council_tax_reduction_disabled_income_disregard(Variable): + value_type = bool + entity = BenUnit + label = "Whether Somerset CTR applies the disabled household income disregard" + definition_period = YEAR + reference = "https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf" + + def formula(benunit, period, parameters): + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + disabled = ( + (person("attendance_allowance", period) > 0) + | (person("dla", period) > 0) + | (person("pip", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("is_disabled_for_benefits", period) + | person("is_blind", period) + ) + return benunit.any((claimant_or_partner | child_or_young_person) & disabled) diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_esa_support_component.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_esa_support_component.py new file mode 100644 index 000000000..416a1ee16 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_esa_support_component.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class somerset_council_tax_reduction_esa_support_component(Variable): + value_type = float + entity = BenUnit + label = "Somerset CTR annual ESA support component amount to disregard" + definition_period = YEAR + unit = GBP + reference = "https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..be8eac670 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,29 @@ +from policyengine_uk.model_api import * + + +class somerset_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Somerset Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = "https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.somerset.council_tax_reduction + household_person = person.household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + claimant_local_scheme = person.household.any( + claimant_benunit + & household_person.benunit( + "somerset_council_tax_reduction_is_local_scheme", period + ) + ) + exempt = person( + "somerset_council_tax_reduction_non_dep_source_exemption", period + ) + deduction = ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + return claimant_local_scheme * where(exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..221588c0f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_somerset, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class somerset_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Somerset's local CTR scheme" + definition_period = YEAR + reference = "https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + uc_relevant_period_pensioner = benunit( + "somerset_council_tax_reduction_uc_relevant_period_pensioner", + period, + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_somerset(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..6e111f72e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class somerset_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Somerset maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + reference = "https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf" + + def formula(household, period, parameters): + local_authorities = parameters(period).gov.local_authorities + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + local_authorities.england.council_tax.band_ratio, + ) + cap_band_ratio = local_authorities.somerset.council_tax_reduction.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + return where(band_ratio > cap_band_ratio, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..a2e7f135f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class somerset_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Somerset Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "somerset_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..7c7a17d0e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,9 @@ +from policyengine_uk.model_api import * + + +class somerset_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Somerset CTR non-dependant is source-excluded from the deduction" + definition_period = YEAR + reference = "https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..618d2c1de --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class somerset_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Somerset CTR treats a pension-age Universal Credit award as within the " + "Universal Credit Transitional Provisions regulation 60A relevant period" + ) + definition_period = YEAR + reference = "https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..f37fa3a0d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/somerset/council_tax_reduction/somerset_council_tax_reduction_weekly_income.py @@ -0,0 +1,113 @@ +from policyengine_uk.model_api import * + + +class somerset_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Somerset Council Tax Reduction weekly income" + definition_period = YEAR + unit = GBP + reference = "https://somerset.moderngov.co.uk/documents/s59784/05a%20APPENDIX%203%20Somerset%20S13A%20202627%20Scheme%20DRAFT.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.somerset.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + non_uc_net_earnings = max_(0, gross_earnings - earnings_deductions) + has_uc_award = benunit("universal_credit", period) > 0 + uc_net_earnings = benunit("uc_earned_income", period) + net_earnings = where(has_uc_award, uc_net_earnings, non_uc_net_earnings) + has_earnings = where(has_uc_award, uc_net_earnings > 0, gross_earnings > 0) + earnings_disregard = ( + has_earnings * ctr.earnings_disregard.amount * WEEKS_IN_YEAR + ) + countable_earnings = max_(0, net_earnings - earnings_disregard) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + "jsa_contrib", + "esa_contrib", + ], + ) + ) + tax_credits = add( + benunit, + period, + [ + "working_tax_credit", + "child_tax_credit", + ], + ) + esa_support_component = min_( + benunit("somerset_council_tax_reduction_esa_support_component", period), + benunit.sum(claimant_or_partner * person("esa_contrib", period)), + ) + non_uc_income = countable_earnings + max_( + 0, other_income + tax_credits - esa_support_component + ) + countable_uc_award = max_( + 0, + benunit("universal_credit", period) + - benunit("uc_housing_costs_element", period), + ) + uc_disregarded_unearned_income = benunit.sum( + claimant_or_partner * person("carers_allowance", period) + ) + uc_income = ( + countable_earnings + + max_( + 0, + benunit("uc_unearned_income", period) - uc_disregarded_unearned_income, + ) + + countable_uc_award + ) + annual_income_before_disability_disregard = where( + has_uc_award, + uc_income, + non_uc_income, + ) + disabled_income_disregard = benunit( + "somerset_council_tax_reduction_disabled_income_disregard", + period, + ) + annual_income = max_( + 0, + annual_income_before_disability_disregard + - disabled_income_disregard + * ctr.disabled_income_disregard.amount + * WEEKS_IN_YEAR, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + weekly_income = where(relevant_income_based_benefit, 0, annual_income) / ( + WEEKS_IN_YEAR + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction.py new file mode 100644 index 000000000..28bad9370 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction.py @@ -0,0 +1,59 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "South Derbyshire Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_derbyshire.council_tax_reduction + local_scheme = benunit( + "south_derbyshire_council_tax_reduction_is_local_scheme", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + support_rate = benunit( + "south_derbyshire_council_tax_reduction_support_rate", period + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "south_derbyshire_council_tax_reduction_non_dep_deductions", + period, + ) + award = max_(0, liability - non_dep_deductions) * support_rate + annual_minimum_award = ctr.means_test.minimum_award * WEEKS_IN_YEAR + award = where(award >= annual_minimum_award, award, 0) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + non_uc_capital_eligible = ( + benunit("south_derbyshire_council_tax_reduction_assessable_capital", period) + <= ctr.means_test.capital_limit + ) | relevant_income_based_benefit + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, + uc_capital_eligible, + non_uc_capital_eligible, + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_applicant_partner_capital.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_applicant_partner_capital.py new file mode 100644 index 000000000..3af5170a4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_applicant_partner_capital.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction_applicant_partner_capital(Variable): + value_type = float + entity = BenUnit + label = "South Derbyshire CTR applicant and partner source-reported capital" + documentation = "Use this input when child, young-person, or non-dependant capital is included in household savings, because South Derbyshire assesses applicant and partner capital and ignores child or young-person capital." + definition_period = YEAR + unit = GBP + default_value = -1 + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_assessable_capital.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_assessable_capital.py new file mode 100644 index 000000000..18d935b49 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_assessable_capital.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction_assessable_capital(Variable): + value_type = float + entity = BenUnit + label = "South Derbyshire CTR assessable applicant and partner capital" + documentation = "South Derbyshire tests applicant and partner capital. By default this uses household liquid savings as the available proxy; supply the source-reported applicant/partner amount where child, young-person, or non-dependant capital should be excluded." + definition_period = YEAR + unit = GBP + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + source_capital = benunit( + "south_derbyshire_council_tax_reduction_applicant_partner_capital", period + ) + return where( + source_capital >= 0, source_capital, benunit.household("savings", period) + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..e737ba088 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction_claimant_source_non_dep_exemption( + Variable +): + value_type = bool + entity = Person + label = ( + "South Derbyshire Council Tax Reduction claimant source non-dependant " + "deduction exemption" + ) + documentation = "Source-listed claimant or partner non-dependant deduction exemptions not otherwise represented in PolicyEngine UK, including temporarily suspended disability benefits and Adult Disability Payment." + definition_period = YEAR + default_value = False + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..0255b18de --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,52 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class south_derbyshire_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "South Derbyshire Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_derbyshire.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "south_derbyshire_council_tax_reduction_is_local_scheme", + period, + ) + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + | household_person( + "south_derbyshire_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + ) + ) + non_dep_exempt = is_full_time_student_non_dep(person, period) | person( + "south_derbyshire_council_tax_reduction_non_dep_source_exemption", + period, + ) + deduction = ctr.non_dep_deduction.amount * WEEKS_IN_YEAR + return local_scheme * where(claimant_exempt | non_dep_exempt, 0.0, deduction) diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..522abb038 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,45 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_south_derbyshire, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class south_derbyshire_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under South Derbyshire's local CTR scheme" + definition_period = YEAR + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_applicant_or_partner_pensioner = benunit.any( + person("is_adult", period) & person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_wtc_closure_pensioner = benunit( + "south_derbyshire_council_tax_reduction_uc_working_tax_credit_closure_pensioner", + period, + ) + source_working_age = ( + ~has_applicant_or_partner_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_wtc_closure_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_south_derbyshire(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..f50ac66a9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "South Derbyshire Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + deductions = benunit.members( + "south_derbyshire_council_tax_reduction_individual_non_dep_deduction", + period, + ) + deduction_for_benunit = benunit.sum(deductions) + is_benunit_head = benunit.members("is_benunit_head", period) + deductions_to_count = is_benunit_head * benunit.project(deduction_for_benunit) + deductions_in_household = benunit.max( + benunit.members.household.sum(deductions_to_count) + ) + return deductions_in_household - deduction_for_benunit diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..aab9a270f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = ( + "South Derbyshire Council Tax Reduction non-dependant source deduction " + "exemption" + ) + documentation = "Source-listed non-dependant deduction exemptions not otherwise represented in PolicyEngine UK, such as normally living elsewhere, youth training allowance, long hospital stays, armed forces operations, and Thalidomide payments." + definition_period = YEAR + default_value = False + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..c8bcf652a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_support_rate.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "South Derbyshire Council Tax Reduction support rate" + definition_period = YEAR + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_derbyshire.council_tax_reduction + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("south_derbyshire_council_tax_reduction_tariff_income", period) + uc_applicable_income = benunit( + "south_derbyshire_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + # Keep exact penny thresholds from landing below source lower limits after float rounding. + weekly_excess_income = np.round(excess_income / WEEKS_IN_YEAR, 2) + 0.005 + return ctr.income_band.support_rate.calc(weekly_excess_income) diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..424326b90 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_tariff_income.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "South Derbyshire Council Tax Reduction tariff income" + definition_period = YEAR + unit = GBP + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_derbyshire.council_tax_reduction + capital = benunit( + "south_derbyshire_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_increment + ) + return weekly_tariff_income * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..36f37f8e5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "South Derbyshire Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" + + def formula(benunit, period, parameters): + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * max_(0, uc_income + uc_award_before_deductions) diff --git a/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_uc_working_tax_credit_closure_pensioner.py b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_uc_working_tax_credit_closure_pensioner.py new file mode 100644 index 000000000..88b84eb1c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_derbyshire/council_tax_reduction/south_derbyshire_council_tax_reduction_uc_working_tax_credit_closure_pensioner.py @@ -0,0 +1,15 @@ +from policyengine_uk.model_api import * + + +class south_derbyshire_council_tax_reduction_uc_working_tax_credit_closure_pensioner( + Variable +): + value_type = bool + entity = BenUnit + label = ( + "Whether a South Derbyshire pension-age UC claimant remains under the " + "pensioner scheme because UC follows Working Tax Credit closure" + ) + definition_period = YEAR + default_value = False + reference = "https://www.southderbyshire.gov.uk/assets/attach/15700/South-Derbyshire-CTR-scheme-2026-2027.pdf" diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction.py new file mode 100644 index 000000000..7eccdb8c0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction.py @@ -0,0 +1,42 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "South Gloucestershire Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = [ + "https://beta.southglos.gov.uk/apply-for-council-tax-reduction/", + "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf", + ] + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_gloucestershire.council_tax_reduction + local_scheme = benunit( + "south_gloucestershire_council_tax_reduction_is_local_scheme", period + ) + support_rate = benunit( + "south_gloucestershire_council_tax_reduction_support_rate", period + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "south_gloucestershire_council_tax_reduction_non_dep_deductions", + period, + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital = benunit( + "south_gloucestershire_council_tax_reduction_assessable_capital", + period, + ) + capital_eligible = capital <= ctr.means_test.capital_limit + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_applicant_partner_capital.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_applicant_partner_capital.py new file mode 100644 index 000000000..ef14c25c0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_applicant_partner_capital.py @@ -0,0 +1,15 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction_applicant_partner_capital(Variable): + value_type = float + entity = BenUnit + label = "South Gloucestershire CTR applicant and partner capital" + definition_period = YEAR + unit = GBP + default_value = -1 + reference = "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf" + documentation = ( + "Source input for capital held by the applicant and partner. Use -1 to " + "fall back to the household savings proxy." + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_assessable_capital.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_assessable_capital.py new file mode 100644 index 000000000..064de83fd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_assessable_capital.py @@ -0,0 +1,29 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction_assessable_capital(Variable): + value_type = float + entity = BenUnit + label = "South Gloucestershire CTR assessable capital" + definition_period = YEAR + unit = GBP + reference = "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf" + + def formula(benunit, period, parameters): + source_capital = benunit( + "south_gloucestershire_council_tax_reduction_applicant_partner_capital", + period, + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + fallback_capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + return where(source_capital >= 0, source_capital, fallback_capital) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..d926f795e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,76 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class south_gloucestershire_council_tax_reduction_individual_non_dep_deduction( + Variable +): + value_type = float + entity = Person + label = "South Gloucestershire CTR individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_gloucestershire.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "south_gloucestershire_council_tax_reduction_is_local_scheme", + period, + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | person.benunit.any( + person( + "south_gloucestershire_council_tax_reduction_non_dep_guarantee_credit", + period, + ) + ) + ) + maximum_uc = ( + max_( + person.benunit("universal_credit_pre_benefit_cap", period), + person.benunit("universal_credit", period), + ) + > 0 + ) & ( + person.benunit("universal_credit_pre_benefit_cap", period) + >= person.benunit("uc_maximum_amount", period) + ) + remunerative_work = ( + person("weekly_hours", period) + >= ctr.non_dep_deduction.remunerative_work_hours + ) + low_deduction = ( + income_based_benefit + | maximum_uc + | ~remunerative_work + | is_full_time_student_non_dep(person, period) + ) + weekly_deduction = where( + low_deduction, + ctr.non_dep_deduction.low_amount, + ctr.non_dep_deduction.high_amount, + ) + source_exempt = person( + "south_gloucestershire_council_tax_reduction_non_dep_source_exemption", + period, + ) + return local_scheme * where( + source_exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..c4111419f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,51 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_south_gloucestershire, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class south_gloucestershire_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under South Gloucestershire's local CTR scheme" + definition_period = YEAR + reference = [ + "https://beta.southglos.gov.uk/apply-for-council-tax-reduction/", + "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf", + ] + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_pensioner_protection = benunit( + "south_gloucestershire_council_tax_reduction_uc_relevant_period_pensioner", + period, + ) | benunit( + "south_gloucestershire_council_tax_reduction_uc_regulation_60a_pensioner", + period, + ) + source_local_class = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | (has_uc_award & ~uc_pensioner_protection) + ) + return ( + (country == Country.ENGLAND) + & is_south_gloucestershire(local_authority) + & source_local_class + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..6314af96f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class south_gloucestershire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "South Gloucestershire CTR non-dependant deductions" + definition_period = YEAR + unit = GBP + reference = "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf" + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "south_gloucestershire_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_non_dep_guarantee_credit.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_non_dep_guarantee_credit.py new file mode 100644 index 000000000..7bf67607e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_non_dep_guarantee_credit.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction_non_dep_guarantee_credit(Variable): + value_type = bool + entity = Person + label = "Whether this South Gloucestershire non-dependant receives Pension Credit Guarantee Credit" + definition_period = YEAR + reference = "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf" + documentation = ( + "Source input for the South Gloucestershire non-dependant low-rate " + "passported-benefit rule that applies to Pension Credit Guarantee " + "Credit, not Savings Credit alone." + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..3aaec19fb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,15 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "South Gloucestershire CTR source-listed non-dependant exclusion" + definition_period = YEAR + reference = "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf" + documentation = ( + "Whether a person is excluded from South Gloucestershire's non-dependant " + "definition for source-listed reasons not otherwise modeled, such as " + "certain joint-liability, commercial-occupier, or voluntary live-in carer " + "cases." + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_self_employment_floor_applies.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_self_employment_floor_applies.py new file mode 100644 index 000000000..9ffbb1a92 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_self_employment_floor_applies.py @@ -0,0 +1,16 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction_self_employment_floor_applies( + Variable +): + value_type = bool + entity = Person + label = "South Gloucestershire CTR self-employed nil-income floor applies" + definition_period = YEAR + reference = "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf" + documentation = ( + "Whether the applicant or partner is a self-employed earner after the " + "initial one-year trading period whose self-employed income is nil, so " + "the source-listed nil-income floor applies." + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..4f07588ab --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_support_rate.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "South Gloucestershire Council Tax Reduction support rate" + definition_period = YEAR + reference = [ + "https://beta.southglos.gov.uk/apply-for-council-tax-reduction/", + "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf", + ] + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_gloucestershire.council_tax_reduction + weekly_earnings = benunit( + "south_gloucestershire_council_tax_reduction_weekly_earnings", period + ) + return ctr.income_band.support_rate.calc(weekly_earnings) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..1cee4006a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "South Gloucestershire CTR pensioner protected by Universal Credit regulation 60A" + definition_period = YEAR + reference = "https://beta.southglos.gov.uk/static/f7a9a3f9b402fb3e3ae79fd5c297b695/Council_tax_reduction_scheme_rules_pensioners.pdf" + documentation = ( + "Whether the applicant remains in South Gloucestershire's pensioner " + "scheme despite Universal Credit under the source-listed regulation 60A " + "protection." + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..defd1b3dc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,15 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction_uc_relevant_period_pensioner( + Variable +): + value_type = bool + entity = BenUnit + label = "South Gloucestershire CTR pensioner in Universal Credit relevant period" + definition_period = YEAR + reference = "https://beta.southglos.gov.uk/static/f7a9a3f9b402fb3e3ae79fd5c297b695/Council_tax_reduction_scheme_rules_pensioners.pdf" + documentation = ( + "Whether the applicant remains in South Gloucestershire's pensioner " + "scheme during the source-listed Universal Credit relevant period." + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_weekly_earnings.py b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_weekly_earnings.py new file mode 100644 index 000000000..4c229e1b8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_gloucestershire/council_tax_reduction/south_gloucestershire_council_tax_reduction_weekly_earnings.py @@ -0,0 +1,70 @@ +from policyengine_uk.model_api import * + + +class south_gloucestershire_council_tax_reduction_weekly_earnings(Variable): + value_type = float + entity = BenUnit + label = "South Gloucestershire Council Tax Reduction weekly earned income" + definition_period = YEAR + unit = GBP + reference = [ + "https://beta.southglos.gov.uk/apply-for-council-tax-reduction/", + "https://beta.southglos.gov.uk/static/edf5960dd95611c375de976f8fa529cc/Council_tax_reduction_scheme_rules_working_age_applicants.pdf", + ] + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_gloucestershire.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + deductions = ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) + ) + employment_income = person("employment_income", period) + self_employment_income = person("self_employment_income", period) + actual_net_earnings = max_( + 0, employment_income + self_employment_income - deductions + ) + net_employment_income = max_(0, employment_income - deductions) + self_employment_floor = ( + ctr.self_employment_floor.weekly_hours + * ctr.self_employment_floor.hourly_rate + * WEEKS_IN_YEAR + ) + floor_applies = person( + "south_gloucestershire_council_tax_reduction_self_employment_floor_applies", + period, + ) + floor_net_earnings = net_employment_income + max_( + 0, self_employment_floor - net_employment_income + ) + non_uc_person_earnings = where( + floor_applies, + max_(actual_net_earnings, floor_net_earnings), + actual_net_earnings, + ) + non_uc_earnings = benunit.sum(claimant_or_partner * non_uc_person_earnings) + + uc_gross_earnings = person("uc_mif_capped_earned_income", period) + uc_mif_applies = person("uc_mif_applies", period) + uc_net_earnings = where( + uc_mif_applies, + uc_gross_earnings, + max_(0, uc_gross_earnings - deductions), + ) + uc_earnings = benunit.sum(claimant_or_partner * uc_net_earnings) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + annual_earnings = where(has_uc_award, uc_earnings, non_uc_earnings) + return annual_earnings / WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/south_norfolk/council_tax_reduction/south_norfolk_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/south_norfolk/council_tax_reduction/south_norfolk_council_tax_reduction.py new file mode 100644 index 000000000..278b2e76a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_norfolk/council_tax_reduction/south_norfolk_council_tax_reduction.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_south_norfolk_working_age, +) + + +class south_norfolk_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "South Norfolk Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_norfolk.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_south_norfolk_working_age( + local_authority, country, has_pensioner + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "south_norfolk_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/south_norfolk/council_tax_reduction/south_norfolk_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/south_norfolk/council_tax_reduction/south_norfolk_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..1a4de4dc4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_norfolk/council_tax_reduction/south_norfolk_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_south_norfolk_working_age, +) + + +class south_norfolk_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "South Norfolk CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.south_norfolk.council_tax_reduction + household = person.household + working_age = is_south_norfolk_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/south_norfolk/council_tax_reduction/south_norfolk_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/south_norfolk/council_tax_reduction/south_norfolk_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..6909584b3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/south_norfolk/council_tax_reduction/south_norfolk_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class south_norfolk_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "South Norfolk CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "south_norfolk_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction.py new file mode 100644 index 000000000..d186ffb95 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * + + +class southend_on_sea_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Southend-on-Sea Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.southend_on_sea.council_tax_reduction + local_scheme = benunit( + "southend_on_sea_council_tax_reduction_is_local_scheme", period + ) + support_rate = benunit( + "southend_on_sea_council_tax_reduction_support_rate", period + ) + liability = benunit.household("council_tax", period) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + non_uc_capital_eligible = ( + benunit.household("savings", period) < ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) < ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * liability + * support_rate + ) diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_childcare_deduction.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_childcare_deduction.py new file mode 100644 index 000000000..be1feacf2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_childcare_deduction.py @@ -0,0 +1,83 @@ +from policyengine_uk.model_api import * + + +class southend_on_sea_council_tax_reduction_childcare_deduction(Variable): + value_type = float + entity = BenUnit + label = "Southend-on-Sea Council Tax Reduction childcare deduction from earnings" + definition_period = YEAR + unit = GBP + reference = "https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.southend_on_sea.council_tax_reduction + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + statutory_family_leave = add( + person, + period, + [ + "statutory_sick_pay", + "statutory_maternity_pay", + "statutory_paternity_pay", + "maternity_allowance", + ], + ) + in_remunerative_work = ( + (person("weekly_hours", period) >= ctr.childcare.work_hours) + | (statutory_family_leave > 0) + ) & claimant_or_partner + lone_parent_working = benunit("is_lone_parent", period) & benunit.any( + in_remunerative_work + ) + couple_both_working = benunit("is_couple", period) & benunit.all( + in_remunerative_work | ~claimant_or_partner + ) + unable_to_work = ( + (person("pip_dl", period) > 0) + | (person("dla_sc", period) > 0) + | (person("attendance_allowance", period) > 0) + | (person("armed_forces_independence_payment", period) > 0) + | person("uc_limited_capability_for_WRA", period) + | person( + "southend_on_sea_council_tax_reduction_childcare_disabled_partner", + period, + ) + ) & claimant_or_partner + couple_one_working_one_disabled = ( + benunit("is_couple", period) + & benunit.any(in_remunerative_work) + & benunit.any(unable_to_work) + ) + eligible_work = ( + lone_parent_working | couple_both_working | couple_one_working_one_disabled + ) + eligible_child = child_or_young_person & ( + (person("age", period) < 15) + | ( + (person("age", period) < 16) + & ( + person("is_disabled_for_benefits", period) + | person( + "southend_on_sea_council_tax_reduction_childcare_disabled_child", + period, + ) + ) + ) + ) + eligible_children = benunit.sum(eligible_child) + weekly_maximum = select( + [eligible_children >= 2, eligible_children == 1], + [ + ctr.childcare.weekly_maximum.two_or_more_children, + ctr.childcare.weekly_maximum.one_child, + ], + default=0, + ) + childcare_expenses = add(benunit, period, ["childcare_expenses"]) + return eligible_work * min_(childcare_expenses, weekly_maximum * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_childcare_disabled_child.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_childcare_disabled_child.py new file mode 100644 index 000000000..f1690c885 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_childcare_disabled_child.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class southend_on_sea_council_tax_reduction_childcare_disabled_child(Variable): + value_type = bool + entity = Person + label = "Southend-on-Sea CTR source-defined disabled child for childcare deduction" + documentation = "Covers source disabled-child status for childcare age-limit rules not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_childcare_disabled_partner.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_childcare_disabled_partner.py new file mode 100644 index 000000000..f17d62b56 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_childcare_disabled_partner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class southend_on_sea_council_tax_reduction_childcare_disabled_partner(Variable): + value_type = bool + entity = Person + label = ( + "Southend-on-Sea CTR source-defined disabled partner for childcare deduction" + ) + documentation = "Covers source incapacity and disability statuses for partner childcare eligibility not otherwise represented in PolicyEngine UK." + definition_period = YEAR + reference = "https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..b500f6d7f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,42 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_southend_on_sea, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class southend_on_sea_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Southend-on-Sea's local CTR scheme" + definition_period = YEAR + reference = "https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + uc_relevant_period_pensioner = benunit( + "southend_on_sea_council_tax_reduction_uc_relevant_period_pensioner", + period, + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_southend_on_sea(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..9710d4e71 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class southend_on_sea_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Southend-on-Sea CTR source-disregarded annual income" + documentation = "Source-listed income disregards not otherwise separately exposed in PolicyEngine UK, such as compensation payments, mobility supplements, or local welfare payments." + definition_period = YEAR + unit = GBP + reference = "https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_source_disregarded_uc_elements.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_source_disregarded_uc_elements.py new file mode 100644 index 000000000..4415e214c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_source_disregarded_uc_elements.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class southend_on_sea_council_tax_reduction_source_disregarded_uc_elements(Variable): + value_type = float + entity = BenUnit + label = "Southend-on-Sea CTR source-disregarded Universal Credit elements" + documentation = "Universal Credit elements disregarded by the source but not otherwise separately exposed in PolicyEngine UK." + definition_period = YEAR + unit = GBP + reference = "https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_support_rate.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_support_rate.py new file mode 100644 index 000000000..28c37e811 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_support_rate.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * + + +class southend_on_sea_council_tax_reduction_support_rate(Variable): + value_type = float + entity = BenUnit + label = "Southend-on-Sea Council Tax Reduction support rate" + definition_period = YEAR + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.southend_on_sea.council_tax_reduction + weekly_income = benunit( + "southend_on_sea_council_tax_reduction_weekly_income", period + ) + weekly_income_for_band = weekly_income + 1e-9 + person = benunit.members + num_children = benunit.sum( + person("is_child_or_qualifying_young_person_for_child_benefit", period) + ) + bands = ctr.income_band + base_rate = select( + [num_children >= 2, num_children == 1], + [ + bands.two_or_more_children.calc(weekly_income_for_band), + bands.one_child.calc(weekly_income_for_band), + ], + default=bands.no_children.calc(weekly_income_for_band), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + return where(relevant_income_based_benefit, 0.75, base_rate) diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..8caf7e3d8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class southend_on_sea_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether a Southend-on-Sea pension-age Universal Credit award remains in the prescribed pensioner CTR scheme during the source relevant period" + documentation = "Covers the source transitional protection where a Universal Credit award is disregarded for pensioner-status classification." + definition_period = YEAR + reference = "https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_weekly_income.py b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_weekly_income.py new file mode 100644 index 000000000..13cd78b55 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southend_on_sea/council_tax_reduction/southend_on_sea_council_tax_reduction_weekly_income.py @@ -0,0 +1,151 @@ +from policyengine_uk.model_api import * + + +class southend_on_sea_council_tax_reduction_weekly_income(Variable): + value_type = float + entity = BenUnit + label = "Southend-on-Sea Council Tax Reduction weekly income" + definition_period = YEAR + unit = GBP + reference = "https://www.southend.gov.uk/downloads/file/3527/southend-on-sea-borough-council-ctax-reduction-s13a-scheme" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.southend_on_sea.council_tax_reduction + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + person = benunit.members + child_or_young_person = person( + "is_child_or_qualifying_young_person_for_child_benefit", period + ) + claimant_or_partner = person("is_adult", period) & ~child_or_young_person + gross_earnings = benunit.sum( + claimant_or_partner + * ( + person("employment_income", period) + + person("self_employment_income", period) + + person("statutory_sick_pay", period) + + person("statutory_maternity_pay", period) + + person("statutory_paternity_pay", period) + ) + ) + earnings_deductions = benunit.sum( + claimant_or_partner + * ( + person("income_tax", period) + + person("national_insurance", period) + + person("pension_contributions", period) * 0.5 + ) + ) + childcare_deduction = benunit( + "southend_on_sea_council_tax_reduction_childcare_deduction", period + ) + non_uc_net_earnings = max_( + 0, gross_earnings - earnings_deductions - childcare_deduction + ) + net_earnings = where( + has_uc_award, benunit("uc_earned_income", period), non_uc_net_earnings + ) + has_earnings = where(has_uc_award, net_earnings > 0, gross_earnings > 0) + countable_earnings = max_( + 0, + net_earnings - has_earnings * ctr.earnings_disregard.amount * WEEKS_IN_YEAR, + ) + other_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "property_income", + "private_pension_income", + "maintenance_income", + "savings_interest_income", + "dividend_income", + "state_pension", + "miscellaneous_income", + ], + ) + ) + benefit_income = add( + benunit, + period, + [ + "tax_credits", + "child_benefit", + "carers_allowance", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "jsa_contrib", + "esa_contrib", + ], + ) + non_uc_disregarded_income = add( + benunit, + period, + [ + "child_benefit", + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + "southend_on_sea_council_tax_reduction_source_disregarded_income", + ], + ) + non_uc_income = countable_earnings + max_( + 0, other_income + benefit_income - non_uc_disregarded_income + ) + countable_uc_award = max_( + 0, + uc_award_before_deductions + - add( + benunit, + period, + [ + "uc_housing_costs_element", + "uc_disability_elements", + "uc_carer_element", + "uc_childcare_element", + "southend_on_sea_council_tax_reduction_source_disregarded_uc_elements", + ], + ), + ) + uc_disregarded_unearned_income = benunit.sum( + claimant_or_partner + * add( + person, + period, + [ + "attendance_allowance", + "dla", + "pip", + "armed_forces_independence_payment", + ], + ) + ) + add( + benunit, + period, + ["southend_on_sea_council_tax_reduction_source_disregarded_income"], + ) + uc_income = ( + countable_earnings + + max_( + 0, + benunit("uc_unearned_income", period) - uc_disregarded_unearned_income, + ) + + countable_uc_award + ) + annual_income = where(has_uc_award, uc_income, non_uc_income) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + weekly_income = where(relevant_income_based_benefit, 0, annual_income) / ( + WEEKS_IN_YEAR + ) + return np.round(weekly_income * 100) / 100 diff --git a/policyengine_uk/variables/gov/local_authorities/southwark/council_tax_reduction/southwark_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/southwark/council_tax_reduction/southwark_council_tax_reduction.py new file mode 100644 index 000000000..d7ea8d94c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southwark/council_tax_reduction/southwark_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_southwark_working_age, +) + + +class southwark_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Southwark Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.southwark.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_southwark_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "southwark_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/southwark/council_tax_reduction/southwark_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/southwark/council_tax_reduction/southwark_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..06ad86f91 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southwark/council_tax_reduction/southwark_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_southwark_working_age, +) + + +class southwark_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Southwark CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.southwark.council_tax_reduction + household = person.household + working_age = is_southwark_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/southwark/council_tax_reduction/southwark_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/southwark/council_tax_reduction/southwark_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..c999d5b98 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/southwark/council_tax_reduction/southwark_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class southwark_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Southwark CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "southwark_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/st_albans/council_tax_reduction/st_albans_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/st_albans/council_tax_reduction/st_albans_council_tax_reduction.py new file mode 100644 index 000000000..7c5b63226 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/st_albans/council_tax_reduction/st_albans_council_tax_reduction.py @@ -0,0 +1,70 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_st_albans_working_age, +) + + +class st_albans_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "St Albans Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.st_albans.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_st_albans_working_age(local_authority, country, has_pensioner) + non_dep_deductions_variable = ( + "st_albans_council_tax_reduction_non_dep_deductions" + ) + legacy_award = legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + non_dep_deductions_variable, + ) + would_claim_uc = benunit("would_claim_uc", period) + is_household_head_benunit = benunit("benunit_contains_household_head", period) + would_claim_ctr = benunit("would_claim_council_tax_reduction", period) + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit(non_dep_deductions_variable, period) + gross_earnings = add( + benunit, period, ["employment_income", "self_employment_income"] + ) + earnings_deductions = add( + benunit, + period, + ["income_tax", "national_insurance", "pension_contributions"], + ) + monthly_earnings = ( + max_(0, gross_earnings - earnings_deductions) / MONTHS_IN_YEAR + ) + monthly_contribution = ctr.uc_earnings.contribution.calc(monthly_earnings) + no_uc_band_entitlement = ( + monthly_earnings >= ctr.uc_earnings.no_entitlement_threshold + ) + uc_award = max_( + 0, + liability - monthly_contribution * MONTHS_IN_YEAR - non_dep_deductions, + ) + uc_award = ( + working_age + * is_household_head_benunit + * would_claim_ctr + * capital_eligible + * ~no_uc_band_entitlement + * uc_award + ) + return where(would_claim_uc, uc_award, legacy_award) diff --git a/policyengine_uk/variables/gov/local_authorities/st_albans/council_tax_reduction/st_albans_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/st_albans/council_tax_reduction/st_albans_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..551afdf31 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/st_albans/council_tax_reduction/st_albans_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_st_albans_working_age, +) + + +class st_albans_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "St Albans CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.st_albans.council_tax_reduction + household = person.household + working_age = is_st_albans_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_uc_no_earned_income=True, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/st_albans/council_tax_reduction/st_albans_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/st_albans/council_tax_reduction/st_albans_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..c18ef7bf5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/st_albans/council_tax_reduction/st_albans_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class st_albans_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "St Albans CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "st_albans_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction.py new file mode 100644 index 000000000..6f82885f6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction.py @@ -0,0 +1,73 @@ +from policyengine_uk.model_api import * + + +class st_helens_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "St Helens Council Tax Reduction" + documentation = "St Helens applies the prescribed Default Scheme with four local working-age amendments: paragraph 9 80 per cent maximum support, paragraph 9 Band D liability cap, paragraph 40 1 pound weekly minimum award, and paragraph 49 removal of all working-age non-dependant deductions. Pension-age applicants follow the prescribed pensioner scheme via simulated_council_tax_reduction_benunit unless they are on a working-age income-related benefit; footnote 1 preserves pensioner status for Universal Credit awards caused by Working Tax Credit closure." + definition_period = YEAR + unit = GBP + reference = "https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.st_helens.council_tax_reduction + local_scheme = benunit( + "st_helens_council_tax_reduction_is_local_scheme", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + applicable_income = where( + has_uc_award, + benunit("st_helens_council_tax_reduction_uc_applicable_income", period), + benunit("council_tax_reduction_applicable_income", period), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where( + relevant_income_based_benefit & ~has_uc_award, 0, excess_income + ) + liability = benunit( + "st_helens_council_tax_reduction_maximum_eligible_liability", period + ) + # Paragraph 49 excludes working-age applicants from non-dependant deductions. + award_before_minimum = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate, + ) + # Paragraph 40 cancels working-age awards calculated at less than 1 pound per week. + minimum_annual_award = ctr.means_test.minimum_weekly_award * WEEKS_IN_YEAR + award = where( + (award_before_minimum > 0) & (award_before_minimum < minimum_annual_award), + 0, + award_before_minimum, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..3db74f333 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,40 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_st_helens, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class st_helens_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under St Helens' local Council Tax Reduction scheme" + definition_period = YEAR + reference = "https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "st_helens_council_tax_reduction_uc_regulation_60a_pensioner", period + ) + local_case = ( + has_working_age_adult + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return (country == Country.ENGLAND) & is_st_helens(local_authority) & local_case diff --git a/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..6ed215480 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,30 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class st_helens_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = BenUnit + label = "St Helens maximum Council Tax liability eligible for Council Tax Reduction" + documentation = "Paragraph 9 caps the assessed liability of working-age applicants in Band F, G or H at the equivalent Band D amount for the dwelling." + definition_period = YEAR + unit = GBP + reference = "https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.st_helens.council_tax_reduction + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + household = benunit.household + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + capped = band_ratio > cap_band_ratio + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..eeebd9c91 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * + + +class st_helens_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "St Helens Universal Credit applicable income for Council Tax Reduction" + documentation = "Paragraph 63 takes the DWP-assessed Universal Credit income (earnings and other income) and adds the actual award of Universal Credit." + definition_period = YEAR + unit = GBP + reference = "https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * (uc_income + benunit("universal_credit", period)) diff --git a/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..1e09ebcf2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/st_helens/council_tax_reduction/st_helens_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class st_helens_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether St Helens' Universal Credit regulation 60A pensioner exception applies" + ) + documentation = "Footnote 1 keeps pension-age Universal Credit recipients on the prescribed pensioner scheme where their Universal Credit award arises from the closure of Working Tax Credit (regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014)." + definition_period = YEAR + reference = "https://www.sthelens.gov.uk/media/13997/St-Helens-CTR-scheme-2026/pdf/St_Helens_CTR_scheme_2026.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/stevenage/council_tax_reduction/stevenage_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/stevenage/council_tax_reduction/stevenage_council_tax_reduction.py new file mode 100644 index 000000000..201e237d3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/stevenage/council_tax_reduction/stevenage_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_stevenage_working_age, +) + + +class stevenage_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Stevenage Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.stevenage.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_stevenage_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "stevenage_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/stevenage/council_tax_reduction/stevenage_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/stevenage/council_tax_reduction/stevenage_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..f110d2c79 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/stevenage/council_tax_reduction/stevenage_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_stevenage_working_age, +) + + +class stevenage_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Stevenage CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.stevenage.council_tax_reduction + household = person.household + working_age = is_stevenage_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/stevenage/council_tax_reduction/stevenage_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/stevenage/council_tax_reduction/stevenage_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..86d70bd0b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/stevenage/council_tax_reduction/stevenage_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class stevenage_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Stevenage CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "stevenage_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction.py new file mode 100644 index 000000000..fda28257f --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction.py @@ -0,0 +1,44 @@ +from policyengine_uk.model_api import * +import numpy as np +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_stockport_working_age, +) + + +class stockport_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Stockport Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.stockport.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_stockport_working_age(local_authority, country, has_pensioner) + capital = benunit.household("savings", period) + weekly_tariff_income = np.ceil( + max_(0, capital - ctr.means_test.tariff_income_threshold) + / ctr.means_test.tariff_income_step + ) + has_uc = benunit("universal_credit", period) > 0 + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "stockport_council_tax_reduction_non_dep_deductions", + maximum_eligible_liability_variable=( + "stockport_council_tax_reduction_maximum_eligible_liability" + ), + additional_applicable_income=where( + has_uc, 0, weekly_tariff_income * WEEKS_IN_YEAR + ), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_disabled_persons_relief.py b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_disabled_persons_relief.py new file mode 100644 index 000000000..64613b476 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_disabled_persons_relief.py @@ -0,0 +1,8 @@ +from policyengine_uk.model_api import * + + +class stockport_council_tax_reduction_disabled_persons_relief(Variable): + value_type = bool + entity = Household + label = "Stockport Council Tax Support Disabled Persons Relief" + definition_period = YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..f886a9015 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,66 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_stockport_working_age, +) + + +class stockport_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Stockport CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.stockport.council_tax_reduction + gross_income = add( + person, + period, + [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ], + ) + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_benunit_gross_income = person.benunit.sum(gross_income) / WEEKS_IN_YEAR + weekly_benunit_earned_income = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + weekly_deduction = ctr.non_dep_deduction.amount.calc( + weekly_benunit_gross_income + ) + household = person.household + working_age = is_stockport_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + claimant_exempt = household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + full_time_student = is_full_time_student_non_dep(person, period) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = (person.benunit("universal_credit", period) > 0) & ( + weekly_benunit_earned_income <= 0 + ) + exempt = ( + claimant_exempt + | full_time_student + | income_based_benefit + | uc_no_earned_income + ) + return working_age * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..65a77cf78 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,43 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_stockport_working_age, +) + + +class stockport_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Stockport maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.stockport.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + lha_allowed_bedrooms = household.max( + household.members.benunit("LHA_allowed_bedrooms", period) + ) + cap_band_ratio = where( + lha_allowed_bedrooms >= 3, + ctr.maximum_liability.three_bedroom_cap_band_ratio, + ctr.maximum_liability.standard_cap_band_ratio, + ) + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_stockport_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + disabled_persons_relief = household( + "stockport_council_tax_reduction_disabled_persons_relief", period + ) + capped = working_age & ~disabled_persons_relief & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..6eba16aff --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/stockport/council_tax_reduction/stockport_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class stockport_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Stockport CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "stockport_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/stroud/council_tax_reduction/stroud_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/stroud/council_tax_reduction/stroud_council_tax_reduction.py new file mode 100644 index 000000000..990e69455 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/stroud/council_tax_reduction/stroud_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_stroud_working_age, +) + + +class stroud_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Stroud Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.stroud.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_stroud_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/tameside/council_tax_reduction/tameside_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/tameside/council_tax_reduction/tameside_council_tax_reduction.py new file mode 100644 index 000000000..07ca98ea1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tameside/council_tax_reduction/tameside_council_tax_reduction.py @@ -0,0 +1,94 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_tameside_working_age, +) + + +class tameside_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Tameside Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.tameside.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_tameside_working_age(local_authority, country, has_pensioner) + earned_income = add( + benunit, + period, + [ + "employment_income", + "self_employment_income", + ], + ) + earnings_deductions = add( + benunit, + period, + [ + "income_tax", + "national_insurance", + "pension_contributions", + ], + ) + other_income = add( + benunit, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + ], + ) + weekly_income = max_(0, earned_income - earnings_deductions) + other_income + weekly_income /= WEEKS_IN_YEAR + num_children = benunit("num_children", period) + is_couple = benunit("is_couple", period) + is_lone_parent = benunit("is_lone_parent", period) + income_bands = ctr.income_band + support_rate = select( + [ + is_lone_parent & (num_children >= 2), + is_lone_parent & (num_children == 1), + is_couple & (num_children >= 2), + is_couple & (num_children == 1), + is_couple, + ], + [ + income_bands.lone_parent_two_or_more_children.calc(weekly_income), + income_bands.lone_parent_one_child.calc(weekly_income), + income_bands.couple_two_or_more_children.calc(weekly_income), + income_bands.couple_one_child.calc(weekly_income), + income_bands.couple.calc(weekly_income), + ], + default=income_bands.single.calc(weekly_income), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + support_rate = where( + relevant_income_based_benefit, + income_bands.single.calc(0), + support_rate, + ) + liability = benunit.household( + "tameside_council_tax_reduction_maximum_eligible_liability", period + ) + award = liability * support_rate + capital_eligible = ( + benunit.household("savings", period) < ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/tameside/council_tax_reduction/tameside_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/tameside/council_tax_reduction/tameside_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..9116fd480 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tameside/council_tax_reduction/tameside_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_tameside_working_age, +) + + +class tameside_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Tameside maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.tameside.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + working_age = is_tameside_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + capped = working_age & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction.py new file mode 100644 index 000000000..0fd1158b6 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction.py @@ -0,0 +1,69 @@ +from policyengine_uk.model_api import * + + +class tendring_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Tendring Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.tendring.council_tax_reduction + local_scheme = benunit("tendring_council_tax_reduction_is_local_scheme", period) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + applicable_income = where( + has_uc_award, + benunit("tendring_council_tax_reduction_uc_applicable_income", period), + benunit("tendring_council_tax_reduction_applicable_income", period), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where( + relevant_income_based_benefit & ~has_uc_award, 0, excess_income + ) + liability = benunit.household("council_tax", period) + maximum_support_rate = where( + benunit("tendring_council_tax_reduction_jsa_three_years", period), + 0.6, + ctr.maximum_support_rate, + ) + non_dep_deductions = benunit( + "tendring_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_applicable_income.py new file mode 100644 index 000000000..299b51c3e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_applicable_income.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * + + +class tendring_council_tax_reduction_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Tendring Council Tax Reduction applicable income" + documentation = "Tendring paragraphs 15.1 and 15.2 treat income and capital of household members other than dependent children as income and capital of the applicant. This sums each benefit unit's standard CTR applicable income once across the household, so non-dependants affect the taper through applicable income rather than through paragraph 58 non-dependant deductions, which are marked 'Not Used'." + definition_period = YEAR + unit = GBP + reference = "https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf" + + def formula(benunit, period, parameters): + person = benunit.household.members + is_benunit_head = person("is_benunit_head", period) + applicable_income = person.benunit( + "council_tax_reduction_applicable_income", period + ) + return benunit.household.sum(is_benunit_head * applicable_income) diff --git a/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..9578db290 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,42 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_tendring, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class tendring_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Tendring's local Council Tax Reduction scheme" + definition_period = YEAR + reference = "https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "tendring_council_tax_reduction_uc_relevant_period_pensioner", period + ) | benunit( + "tendring_council_tax_reduction_uc_regulation_60a_pensioner", period + ) + local_case = ( + has_working_age_adult + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return (country == Country.ENGLAND) & is_tendring(local_authority) & local_case diff --git a/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_jsa_three_years.py b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_jsa_three_years.py new file mode 100644 index 000000000..580c68def --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_jsa_three_years.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class tendring_council_tax_reduction_jsa_three_years(Variable): + value_type = bool + entity = BenUnit + label = "Tendring CTR source input - applicant or partner has received Jobseeker's Allowance for three years or more" + documentation = "Tendring paragraph 57.1A reduces maximum Council Tax Reduction from 80 percent to 60 percent where the applicant or partner has been in receipt of Jobseeker's Allowance for a period of three years or more. PolicyEngine UK does not model the duration of JSA receipt, so this Tendring-scoped source input lets the case assert that condition. Default False." + definition_period = YEAR + reference = "https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..8347c6bb2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class tendring_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Tendring Council Tax Reduction non-dependant deductions" + documentation = "Tendring paragraph 58.0 is marked 'Not Used', so the working-age local scheme does not make non-dependant deductions." + definition_period = YEAR + unit = GBP + reference = "https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf" + + def formula(benunit, period, parameters): + return 0 diff --git a/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..0db547031 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class tendring_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Tendring Universal Credit applicable income for Council Tax Reduction" + definition_period = YEAR + unit = GBP + reference = "https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * (uc_income + benunit("universal_credit", period)) diff --git a/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..b91f4ee62 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class tendring_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Tendring's Universal Credit regulation 60A pensioner exception applies" + ) + definition_period = YEAR + reference = "https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..4d3f56c56 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tendring/council_tax_reduction/tendring_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class tendring_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Tendring's Universal Credit relevant-period pensioner exception applies" + definition_period = YEAR + reference = "https://legacy.tendringdc.gov.uk/sites/default/files/documents/Council_Tax/Tendring%20S13A%20202627%20Scheme%20Final.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction.py new file mode 100644 index 000000000..45b571d34 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction.py @@ -0,0 +1,67 @@ +from policyengine_uk.model_api import * + + +class tewkesbury_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Tewkesbury Council Tax Reduction" + documentation = "Tewkesbury Borough Council has remained on the prescribed Default Scheme since 1 April 2013, so its working-age scheme is the Default Scheme as enacted by the Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012 with no local amendments. The Cabinet's Council Tax Reduction Scheme Report dated January 2026 confirms there are no proposed changes for 2026/27." + definition_period = YEAR + unit = GBP + reference = "https://minutes.tewkesbury.gov.uk/documents/s71351/Council%20Tax%20Reduction%20Scheme%20Report.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.tewkesbury.council_tax_reduction + local_scheme = benunit( + "tewkesbury_council_tax_reduction_is_local_scheme", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + applicable_income = where( + has_uc_award, + benunit("tewkesbury_council_tax_reduction_uc_applicable_income", period), + benunit("council_tax_reduction_applicable_income", period), + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where( + relevant_income_based_benefit & ~has_uc_award, 0, excess_income + ) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "tewkesbury_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..cb29aca17 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) + + +class tewkesbury_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Tewkesbury individual Council Tax Reduction non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.tewkesbury.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "tewkesbury_council_tax_reduction_is_local_scheme", period + ) + ) + return normal_gross_income_non_dep_deduction(person, period, ctr, local_scheme) diff --git a/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..5ccce9ac3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,48 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_tewkesbury, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class tewkesbury_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether the benefit unit is under Tewkesbury's local Council Tax Reduction" + " scheme" + ) + documentation = "Tewkesbury Borough Council has remained on the prescribed Default Scheme since 1 April 2013. Pension-age applicants without a working-age income-related benefit follow the prescribed pensioner scheme via simulated_council_tax_reduction_benunit, with paragraph 3 carve-outs for Universal Credit recipients during the relevant period and where regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014 applies." + definition_period = YEAR + reference = "https://minutes.tewkesbury.gov.uk/documents/s71351/Council%20Tax%20Reduction%20Scheme%20Report.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_adult = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "tewkesbury_council_tax_reduction_uc_relevant_period_pensioner", period + ) | benunit( + "tewkesbury_council_tax_reduction_uc_regulation_60a_pensioner", period + ) + local_case = ( + has_working_age_adult + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return ( + (country == Country.ENGLAND) & is_tewkesbury(local_authority) & local_case + ) diff --git a/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..13ff79f83 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,21 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class tewkesbury_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Tewkesbury Council Tax Reduction non-dependant deductions" + documentation = "Tewkesbury follows the Default Scheme paragraph 30 schedule of weekly gross-income non-dependant deductions, as amended by SI 2012/3085. Paragraph 30(3) excludes Universal Credit non-dependant couples from the one-deduction couple rule, so each UC member of a non-dependant couple counts separately." + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "tewkesbury_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..911fad463 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * + + +class tewkesbury_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Tewkesbury Universal Credit applicable income for Council Tax Reduction" + documentation = "Tewkesbury follows the Default Scheme paragraphs 28 and 37, which take the DWP-assessed Universal Credit earned and unearned income and add the actual award of Universal Credit." + definition_period = YEAR + unit = GBP + reference = "https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/37" + + def formula(benunit, period, parameters): + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * (uc_income + benunit("universal_credit", period)) diff --git a/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..896d17063 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class tewkesbury_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Tewkesbury's Universal Credit regulation 60A pensioner exception" + " applies" + ) + documentation = "Default Scheme paragraph 3(2)(b) keeps a pension-age claimant on the prescribed pensioner scheme where their Universal Credit award arises from regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014, which Tewkesbury has adopted unchanged." + definition_period = YEAR + reference = "https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/3" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..782624065 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/tewkesbury/council_tax_reduction/tewkesbury_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class tewkesbury_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether Tewkesbury's Universal Credit relevant-period pensioner exception" + " applies" + ) + documentation = "Default Scheme paragraph 3(2)(a) keeps a pension-age claimant on the prescribed pensioner scheme during the prescribed relevant period (the period beginning when the applicant and any partner reach State Pension Credit qualifying age and ending with the last day of the last Universal Credit assessment period), which Tewkesbury has adopted unchanged." + definition_period = YEAR + reference = "https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/3" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction.py new file mode 100644 index 000000000..289ce2967 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction.py @@ -0,0 +1,59 @@ +from policyengine_uk.model_api import * + + +class thurrock_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Thurrock Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.thurrock.council_tax_reduction + local_scheme = benunit("thurrock_council_tax_reduction_is_local_scheme", period) + has_uc_award = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "thurrock_council_tax_reduction_applicable_income", period + ) + uc_applicable_income = benunit( + "thurrock_council_tax_reduction_uc_applicable_income", period + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "thurrock_council_tax_reduction_non_dep_deductions", period + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, uc_capital_eligible, non_uc_capital_eligible + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_applicable_income.py new file mode 100644 index 000000000..cd0a458cf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_applicable_income.py @@ -0,0 +1,30 @@ +from policyengine_uk.model_api import * + + +class thurrock_council_tax_reduction_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Thurrock Council Tax Reduction applicable income" + definition_period = YEAR + unit = GBP + reference = "https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.thurrock.council_tax_reduction + person = benunit.members + earnings = benunit.sum( + person("employment_income", period) + + person("self_employment_income", period) + ) + earnings_disregard = min_( + earnings, + (earnings > 0) * ctr.earnings_disregard.amount * WEEKS_IN_YEAR, + ) + applicable_income = benunit("council_tax_reduction_applicable_income", period) + source_disregarded_income = benunit( + "thurrock_council_tax_reduction_source_disregarded_income", period + ) + return max_( + 0, + applicable_income - earnings_disregard - source_disregarded_income, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..5a49fe655 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class thurrock_council_tax_reduction_claimant_source_non_dep_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Thurrock CTR claimant has a section 58.6 non-dependant deduction exemption not otherwise modeled" + documentation = "Covers source-listed claimant exemptions not otherwise represented in PolicyEngine UK, such as suspended entitlement to disability benefits." + definition_period = YEAR + reference = "https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..3fa06e10a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,86 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class thurrock_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Thurrock Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.thurrock.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "thurrock_council_tax_reduction_is_local_scheme", period + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + weekly_gross_income = benunit_gross_income / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "thurrock_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + uc_no_earned_income = has_uc_award & ( + person("thurrock_council_tax_reduction_non_dep_uc_earned_income", period) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person("thurrock_council_tax_reduction_non_dep_source_exemption", period) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..bc74a2a3c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,37 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_thurrock, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class thurrock_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under Thurrock's local CTR scheme" + definition_period = YEAR + reference = "https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + uc_relevant_period_pensioner = benunit( + "thurrock_council_tax_reduction_uc_relevant_period_pensioner", period + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_thurrock(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..7e999aae1 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class thurrock_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Thurrock Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "thurrock_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..f7917252c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class thurrock_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Thurrock CTR non-dependant has a section 58.7 or 58.8 deduction exemption not otherwise modeled" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK, such as normal home elsewhere, long-term patient status, armed forces away, or Schedule 1 discount-disregarded cases." + definition_period = YEAR + reference = "https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..69e221030 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class thurrock_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "Thurrock Council Tax Reduction non-dependant UC earned income" + documentation = "Person-level UC earned income for applying the source exemption where a non-dependant's Universal Credit award is calculated with no earned income. Defaults to modeled person-level gross UC earned income and can be overridden where DWP assessed income differs." + definition_period = YEAR + unit = GBP + reference = "https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + + def formula(person, period, parameters): + return person("uc_mif_capped_earned_income", period) diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_source_disregarded_income.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_source_disregarded_income.py new file mode 100644 index 000000000..093a4d808 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_source_disregarded_income.py @@ -0,0 +1,12 @@ +from policyengine_uk.model_api import * + + +class thurrock_council_tax_reduction_source_disregarded_income(Variable): + value_type = float + entity = BenUnit + label = "Thurrock CTR source-disregarded annual income" + documentation = "Use this input for source-listed Schedule 3 or Schedule 4 income disregards not otherwise represented in PolicyEngine UK." + definition_period = YEAR + unit = GBP + reference = "https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + default_value = 0 diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..2595a1c43 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * + + +class thurrock_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Thurrock Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.thurrock.council_tax_reduction + has_uc_award = benunit("universal_credit", period) > 0 + earned_income = max_( + 0, + benunit("uc_earned_income", period) + - ctr.earnings_disregard.amount * WEEKS_IN_YEAR, + ) + unearned_income = max_( + 0, + benunit("uc_unearned_income", period) + - benunit( + "thurrock_council_tax_reduction_source_disregarded_income", period + ), + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (earned_income + unearned_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..a01f444dc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/thurrock/council_tax_reduction/thurrock_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,10 @@ +from policyengine_uk.model_api import * + + +class thurrock_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether Thurrock disregards UC during the pension-age relevant period" + definition_period = YEAR + reference = "https://thurrock.moderngov.co.uk/documents/s51034/Enc.%201%20for%20Local%20Council%20Tax%20Support%20Scheme%202026-27.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/wakefield/council_tax_reduction/wakefield_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/wakefield/council_tax_reduction/wakefield_council_tax_reduction.py new file mode 100644 index 000000000..bcd3b8dfd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/wakefield/council_tax_reduction/wakefield_council_tax_reduction.py @@ -0,0 +1,67 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_wakefield_working_age, +) + + +class wakefield_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Wakefield Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.wakefield.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_wakefield_working_age(local_authority, country, has_pensioner) + earned_income = add( + benunit, + period, + [ + "employment_income", + "self_employment_income", + ], + ) + earnings_deductions = add( + benunit, + period, + [ + "income_tax", + "national_insurance", + "pension_contributions", + ], + ) + other_non_dwp_income = add( + benunit, + period, + [ + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + ], + ) + non_dwp_income = max_(0, earned_income - earnings_deductions) + non_dwp_income += other_non_dwp_income + weekly_income = non_dwp_income / WEEKS_IN_YEAR + support_rate = ctr.income_band.maximum_support_rate.calc(weekly_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "wakefield_council_tax_reduction_non_dep_deductions", period + ) + award = max_(0, liability * support_rate - non_dep_deductions) + capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + return ( + working_age + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/wakefield/council_tax_reduction/wakefield_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/wakefield/council_tax_reduction/wakefield_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..3a2a416e9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/wakefield/council_tax_reduction/wakefield_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_wakefield_working_age, +) + + +class wakefield_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Wakefield CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.wakefield.council_tax_reduction + household = person.household + working_age = is_wakefield_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/wakefield/council_tax_reduction/wakefield_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/wakefield/council_tax_reduction/wakefield_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..763a38e6d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/wakefield/council_tax_reduction/wakefield_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class wakefield_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Wakefield CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "wakefield_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction.py new file mode 100644 index 000000000..caac718da --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction.py @@ -0,0 +1,60 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_warrington_working_age, +) +from policyengine_uk.variables.input.council_tax_band import CouncilTaxBand + + +class warrington_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Warrington Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.warrington.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + council_tax_band = benunit.household("council_tax_band", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + income_below_applicable_amount = benunit( + "council_tax_reduction_income_below_applicable_amount", + period, + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + working_age = is_warrington_working_age(local_authority, country, has_pensioner) + class_d = working_age & ( + income_below_applicable_amount | relevant_income_based_benefit + ) + band_a = council_tax_band == CouncilTaxBand.A + maximum_support_rate = select( + [ + class_d & band_a, + class_d, + ], + [ + ctr.maximum_support_rate.class_d.band_a, + ctr.maximum_support_rate.class_d.other_bands, + ], + default=ctr.maximum_support_rate.class_e, + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "warrington_council_tax_reduction_non_dep_deductions", + maximum_support_rate=maximum_support_rate, + maximum_eligible_liability_variable=( + "warrington_council_tax_reduction_maximum_eligible_liability" + ), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..703f9a1aa --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_warrington_working_age, +) + + +class warrington_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Warrington CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.warrington.council_tax_reduction + household = person.household + working_age = is_warrington_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..b039a636d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,54 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, + is_warrington_working_age, +) + + +class warrington_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = Household + label = "Warrington maximum Council Tax liability eligible for CTR" + definition_period = YEAR + unit = GBP + + def formula(household, period, parameters): + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + ctr = parameters(period).gov.local_authorities.warrington.council_tax_reduction + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + person = household.members + claimant_benunit = person.benunit("benunit_contains_household_head", period) + claimant_income_below_applicable_amount = household.any( + claimant_benunit + & person.benunit( + "council_tax_reduction_income_below_applicable_amount", + period, + ) + ) + claimant_relevant_income_based_benefit = household.any( + claimant_benunit + & person.benunit( + "council_tax_reduction_relevant_income_based_benefit", + period, + ) + ) + working_age = is_warrington_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + capped = ( + working_age + & ~claimant_income_below_applicable_amount + & ~claimant_relevant_income_based_benefit + & (band_ratio > cap_band_ratio) + ) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..637a44afa --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/warrington/council_tax_reduction/warrington_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class warrington_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Warrington CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "warrington_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction.py new file mode 100644 index 000000000..c9b2d6d06 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction.py @@ -0,0 +1,98 @@ +from policyengine_uk.model_api import * + + +class west_berkshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "West Berkshire Council Tax Reduction" + documentation = "West Berkshire's local scheme applies six local amendments to the prescribed Default Scheme for non-vulnerable working-age Class D and E applicants: paragraph 29(1)A 6,000 pound capital cutoff, paragraph 29A Band C liability cap, paragraph 29B 70 per cent maximum support, paragraph 29C 10 pound weekly minimum award, paragraph 17 30 per cent Class E taper, and the removal of the working-age Class F second adult rebate. Paragraph 29D protects the vulnerable category from each of those amendments (and uses a 20 per cent Class E1 taper from paragraph 17A). Pensioners receive the prescribed pensioner scheme via simulated_council_tax_reduction_benunit." + definition_period = YEAR + unit = GBP + reference = "https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.west_berkshire.council_tax_reduction + local_scheme = benunit( + "west_berkshire_council_tax_reduction_is_local_scheme", period + ) + vulnerable = benunit( + "west_berkshire_council_tax_reduction_vulnerable_group", period + ) + applicable_amount = benunit("council_tax_reduction_applicable_amount", period) + default_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + uc_award = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award > 0 + uc_applicable_income = ( + benunit("uc_earned_income", period) + + benunit("uc_unearned_income", period) + + uc_award + ) + applicable_income = where( + has_uc_award, uc_applicable_income, default_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + # Income-based-benefit recipients are treated as Class D (income <= applicable amount). + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit( + "west_berkshire_council_tax_reduction_maximum_eligible_liability", period + ) + non_dep_deductions = benunit( + "west_berkshire_council_tax_reduction_non_dep_deductions", period + ) + maximum_support_rate = where( + vulnerable, + 1.0, + ctr.maximum_support_rate, + ) + withdrawal_rate = where( + vulnerable, + ctr.means_test.vulnerable_withdrawal_rate, + ctr.means_test.withdrawal_rate, + ) + award_before_minimum = max_( + 0, + liability * maximum_support_rate + - excess_income * withdrawal_rate + - non_dep_deductions, + ) + # Paragraph 29C minimum award only applies to non-vulnerable Class D/E. + minimum_annual_award = ctr.means_test.minimum_weekly_award * WEEKS_IN_YEAR + below_min = ( + ~vulnerable + & (award_before_minimum > 0) + & (award_before_minimum < minimum_annual_award) + ) + award = where(below_min, 0, award_before_minimum) + # Paragraph 29(1)A excludes non-vulnerable claimants whose capital is + # equal to or greater than GBP 6,000; the vulnerable/default limit + # excludes only capital above GBP 16,000. + capital = where( + has_uc_award, + benunit("uc_assessable_capital", period), + benunit.household("savings", period), + ) + capital_limit = where( + vulnerable, + ctr.means_test.vulnerable_capital_limit, + ctr.means_test.capital_limit, + ) + capital_eligible = where( + vulnerable, capital <= capital_limit, capital < capital_limit + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_disabled_child_premium.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_disabled_child_premium.py new file mode 100644 index 000000000..ec1d41190 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_disabled_child_premium.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class west_berkshire_council_tax_reduction_disabled_child_premium(Variable): + value_type = bool + entity = BenUnit + label = "West Berkshire CTR source input - claimant or partner is entitled to a Disabled Child Premium" + documentation = "Paragraph 29D places a claimant or partner entitled to a Disabled Child Premium (Schedule 3 paragraph 13 of the West Berkshire scheme, mirroring the prescribed Default Scheme) in the protected vulnerable category. PolicyEngine UK does not currently expose a benunit-level Disabled Child Premium variable, so this jurisdiction-scoped source input lets a household assert entitlement for the vulnerable-category test. Default False." + definition_period = YEAR + reference = "https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..f3a309a9c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,90 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +# Paragraph 30 of the West Berkshire scheme mirrors the prescribed Default Scheme +# non-dependant deduction schedule. The 2026/27 amounts published by the scheme +# are GBP 15.95 / GBP 13.30 / GBP 10.60 / GBP 5.20 across the four prescribed +# remunerative-work income brackets. +_2026_BRACKETS = [ + (0.0, 5.20), + (279.0, 10.60), + (485.0, 13.30), + (605.0, 15.95), +] +_NON_WORK_RATE = 5.20 + + +class west_berkshire_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "West Berkshire Council Tax Reduction individual non-dependant deduction" + documentation = "Paragraph 30 applies the prescribed Default Scheme non-dependant deduction schedule. Sub-paragraph (1)(a) sets the in-remunerative-work deduction at 15.95 pounds weekly, and sub-paragraph (1)(b) sets the out-of-work deduction at 5.20 pounds weekly. Sub-paragraph (2) overrides the in-work amount with 5.20/10.60/13.30 pounds for normal gross weekly income below 279, 485 and 605 pounds respectively. Paragraph 30(6)-(8) lists the same exemptions as the prescribed Default Scheme." + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + reference = "https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf" + + def formula(person, period, parameters): + household = person.household + local_scheme = household.any( + person.benunit("benunit_contains_household_head", period) + & person.benunit( + "west_berkshire_council_tax_reduction_is_local_scheme", period + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "state_pension", + ] + gross_income = add(person, period, gross_income_components) + weekly_benunit_gross_income = person.benunit.sum(gross_income) / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = benunit_weekly_hours >= 16 + # Build the bracket lookup as a select cascade for clarity. + weekly_amount = where( + weekly_benunit_gross_income >= _2026_BRACKETS[3][0], + _2026_BRACKETS[3][1], + where( + weekly_benunit_gross_income >= _2026_BRACKETS[2][0], + _2026_BRACKETS[2][1], + where( + weekly_benunit_gross_income >= _2026_BRACKETS[1][0], + _2026_BRACKETS[1][1], + _2026_BRACKETS[0][1], + ), + ), + ) + weekly_deduction = where(in_remunerative_work, weekly_amount, _NON_WORK_RATE) + # Standard prescribed exemptions: applicant blind/AA/PIP/AFIP exemption, + # full-time-student non-dep, income-based-benefit non-dep, UC-no-earned-income non-dep. + claimant_exempt = person.household( + "council_tax_reduction_household_has_non_dep_exemption", period + ) + full_time_student = is_full_time_student_non_dep(person, period) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + has_uc = person.benunit("universal_credit", period) > 0 + earned_income = person("employment_income", period) + person( + "self_employment_income", period + ) + weekly_benunit_earned_income = person.benunit.sum(earned_income) / WEEKS_IN_YEAR + uc_no_earned_income = has_uc & (weekly_benunit_earned_income <= 0) + exempt = ( + claimant_exempt + | full_time_student + | income_based_benefit + | uc_no_earned_income + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..d3d09a8fc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,49 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_west_berkshire, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class west_berkshire_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under West Berkshire's local Council Tax Reduction scheme" + documentation = "West Berkshire treats applicants as working-age (and so subject to the local scheme) where they have not attained pension credit age, or where they have but the claimant or partner is on Universal Credit, Jobseeker's Allowance, Income Support, Employment and Support Allowance, or another working-age benefit. Pension-age applicants with none of those benefits go to the national prescribed pensioner scheme." + definition_period = YEAR + reference = "https://www.westberks.gov.uk/media/66426/Council-Tax-Reduction-Scheme-Leaflet-2026-27/pdf/CTR_Scheme_Leaflet_2026.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + person = benunit.members + has_working_age_applicant_or_partner = benunit.any( + person("is_adult", period) & ~person("is_SP_age", period) + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = ( + max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + > 0 + ) + uc_exception = benunit( + "west_berkshire_council_tax_reduction_uc_relevant_period_pensioner", + period, + ) | benunit( + "west_berkshire_council_tax_reduction_uc_regulation_60a_pensioner", + period, + ) + in_local_class = ( + has_working_age_applicant_or_partner + | relevant_income_based_benefit + | (has_uc_award & ~uc_exception) + ) + return ( + (country == Country.ENGLAND) + & is_west_berkshire(local_authority) + & in_local_class + ) diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_maximum_eligible_liability.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_maximum_eligible_liability.py new file mode 100644 index 000000000..e11f2885c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_maximum_eligible_liability.py @@ -0,0 +1,39 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + english_council_tax_band_ratio, +) + + +class west_berkshire_council_tax_reduction_maximum_eligible_liability(Variable): + value_type = float + entity = BenUnit + label = "West Berkshire maximum Council Tax liability eligible for Council Tax Reduction" + documentation = "Paragraph 29A caps the assessed liability of non-vulnerable working-age Class D or E claimants at the Band C amount within the same parish. Vulnerable Class E1 claimants and pension-age applicants use the full council tax for the dwelling." + definition_period = YEAR + unit = GBP + reference = "https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf" + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.west_berkshire.council_tax_reduction + england_council_tax = parameters( + period + ).gov.local_authorities.england.council_tax + household = benunit.household + council_tax = household("council_tax", period) + band_ratio = english_council_tax_band_ratio( + household("council_tax_band", period), + england_council_tax.band_ratio, + ) + cap_band_ratio = ctr.maximum_liability.cap_band_ratio + capped_liability = council_tax * cap_band_ratio / band_ratio + local_scheme = benunit( + "west_berkshire_council_tax_reduction_is_local_scheme", period + ) + vulnerable = benunit( + "west_berkshire_council_tax_reduction_vulnerable_group", period + ) + # Class D/E non-vulnerable working-age applicants have liability capped at Band C. + capped = local_scheme & ~vulnerable & (band_ratio > cap_band_ratio) + return where(capped, capped_liability, council_tax) diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..29ef56d58 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class west_berkshire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "West Berkshire Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "west_berkshire_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_uc_lcw_element.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_uc_lcw_element.py new file mode 100644 index 000000000..13ae50726 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_uc_lcw_element.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class west_berkshire_council_tax_reduction_uc_lcw_element(Variable): + value_type = bool + entity = BenUnit + label = "West Berkshire CTR source input - claimant or partner gets the UC Limited Capability for Work element" + documentation = "Paragraph 29D places a claimant or partner in receipt of the Universal Credit Limited Capability for Work (LCW) component in the protected vulnerable category. PolicyEngine UK models the LCWRA element via uc_LCWRA_element but does not separately model the LCW element (abolished for most new claims from April 2017). This jurisdiction-scoped source input lets a household assert LCW-element receipt for the vulnerable-category test. Default False." + definition_period = YEAR + reference = "https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_uc_regulation_60a_pensioner.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_uc_regulation_60a_pensioner.py new file mode 100644 index 000000000..2a8918890 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_uc_regulation_60a_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class west_berkshire_council_tax_reduction_uc_regulation_60a_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether West Berkshire disregards a pension-age Universal Credit award under regulation 60A" + documentation = "West Berkshire paragraph 3(2) disregards a Universal Credit award for pensioner-status routing where regulation 60A of the Universal Credit (Transitional Provisions) Regulations 2014 applies. When set, a pension-age UC claimant remains in the prescribed pensioner CTR scheme rather than West Berkshire's local working-age scheme. Default False." + definition_period = YEAR + reference = "https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..5dd3626a3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class west_berkshire_council_tax_reduction_uc_relevant_period_pensioner(Variable): + value_type = bool + entity = BenUnit + label = "Whether West Berkshire disregards a pension-age Universal Credit award during the relevant period" + documentation = "West Berkshire paragraph 3(2) disregards a Universal Credit award for pensioner-status routing during the relevant period. When set, a pension-age UC claimant remains in the prescribed pensioner CTR scheme rather than West Berkshire's local working-age scheme. Default False." + definition_period = YEAR + reference = "https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_vulnerable_group.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_vulnerable_group.py new file mode 100644 index 000000000..0049094fd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_vulnerable_group.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * + + +class west_berkshire_council_tax_reduction_vulnerable_group(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit falls within West Berkshire's paragraph 29D protected vulnerable category" + documentation = "Paragraph 29D places a working-age applicant in the Class E1 protected vulnerable category where the claimant or partner is entitled to Disability Premium, Enhanced Disability Premium, Severe Disability Premium, or Disabled Child Premium (Schedule 3 paragraphs 9-13), or is in receipt of any component of Employment and Support Allowance, any amount of War Pension, or the UC Limited Capability for Work element. PolicyEngine UK has the four disability premiums as benunit variables and ESA via the esa wrapper; the LCW element, the War Pension, and the Disabled Child Premium are not separately modeled, so jurisdiction-scoped Brentwood-style Boolean source inputs are provided. The vulnerable category is keyed off the claimant or partner only, not non-dependants." + definition_period = YEAR + reference = "https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf" + + def formula(benunit, period, parameters): + disability_premium = benunit("disability_premium", period) + enhanced_disability_premium = benunit("enhanced_disability_premium", period) + severe_disability_premium = benunit("severe_disability_premium", period) + disabled_child_premium = benunit( + "west_berkshire_council_tax_reduction_disabled_child_premium", period + ) + esa_any_component = benunit("esa", period) + war_pension = benunit( + "west_berkshire_council_tax_reduction_war_pension", period + ) + uc_lcwra = benunit("uc_LCWRA_element", period) + uc_lcw = benunit("west_berkshire_council_tax_reduction_uc_lcw_element", period) + return ( + (disability_premium > 0) + | (enhanced_disability_premium > 0) + | (severe_disability_premium > 0) + | disabled_child_premium + | (esa_any_component > 0) + | war_pension + | (uc_lcwra > 0) + | uc_lcw + ) diff --git a/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_war_pension.py b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_war_pension.py new file mode 100644 index 000000000..0d255d573 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_berkshire/council_tax_reduction/west_berkshire_council_tax_reduction_war_pension.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class west_berkshire_council_tax_reduction_war_pension(Variable): + value_type = bool + entity = BenUnit + label = "West Berkshire CTR source input - claimant or partner is in receipt of any War Pension" + documentation = "Paragraph 29D places a claimant or partner in receipt of any amount of War Pension in the protected vulnerable category. PolicyEngine UK does not have a single 'war pension' variable covering the schemes referenced by West Berkshire (War Disablement Pension, War Widow(er)'s Pension, analogous payments), so this jurisdiction-scoped source input lets a household assert receipt for the vulnerable-category test. Default False." + definition_period = YEAR + reference = "https://www.westberks.gov.uk/media/66425/Council-Tax-Reduction-Scheme-2026-27/pdf/The_Council_Tax_Reduction_Scheme_as_amended_by_West_Berkshire_Council_2026.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction.py new file mode 100644 index 000000000..5532725fc --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction.py @@ -0,0 +1,79 @@ +from policyengine_uk.model_api import * + + +class west_northamptonshire_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "West Northamptonshire Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.west_northamptonshire.council_tax_reduction + local_scheme = benunit( + "west_northamptonshire_council_tax_reduction_is_local_scheme", period + ) + full_support = benunit( + "west_northamptonshire_council_tax_reduction_full_support_group", period + ) + support_rate = where( + full_support, + ctr.maximum_support_rate.full, + ctr.maximum_support_rate.standard, + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit("west_northamptonshire_council_tax_reduction_tariff_income", period) + uc_applicable_income = benunit( + "west_northamptonshire_council_tax_reduction_uc_applicable_income", + period, + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "west_northamptonshire_council_tax_reduction_non_dep_deductions", + period, + ) + award = max_( + 0, + liability * support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, + uc_capital_eligible, + non_uc_capital_eligible | relevant_income_based_benefit, + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_care_leaver.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_care_leaver.py new file mode 100644 index 000000000..35c0aded5 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_care_leaver.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class west_northamptonshire_council_tax_reduction_care_leaver(Variable): + value_type = bool + entity = Person + label = "West Northamptonshire CTR care leaver" + documentation = ( + "Whether the person is a care leaver for the source full-support class." + ) + definition_period = YEAR + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..37ad64edb --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class west_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption( + Variable +): + value_type = bool + entity = Person + label = "Whether a West Northamptonshire CTR claimant or partner has a source-defined non-dependant deduction exemption not otherwise modeled" + documentation = "Covers source-listed claimant exemptions not otherwise represented in PolicyEngine UK, such as Pension Age Disability Payment, Adult Disability Payment, Scottish Adult Disability Living Allowance, or would-be entitlement to a disability benefit but for suspension, abatement, or hospitalisation." + definition_period = YEAR + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_full_support_group.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_full_support_group.py new file mode 100644 index 000000000..369120dbd --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_full_support_group.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class west_northamptonshire_council_tax_reduction_full_support_group(Variable): + value_type = bool + entity = BenUnit + label = "West Northamptonshire CTR 100 percent support group" + definition_period = YEAR + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + + def formula(benunit, period, parameters): + person = benunit.members + claimant_or_partner = person("is_adult", period) + care_leaver_under_25 = benunit.any( + claimant_or_partner + & (person("age", period) <= 25) + & person("west_northamptonshire_council_tax_reduction_care_leaver", period) + ) + war_pension = benunit( + "west_northamptonshire_council_tax_reduction_war_pension_protected", + period, + ) + return care_leaver_under_25 | war_pension diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..4982856e2 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,104 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class west_northamptonshire_council_tax_reduction_individual_non_dep_deduction( + Variable +): + value_type = float + entity = Person + label = ( + "West Northamptonshire Council Tax Reduction individual non-dependant deduction" + ) + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.west_northamptonshire.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "west_northamptonshire_council_tax_reduction_is_local_scheme", + period, + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + has_uc_award = person.benunit("universal_credit", period) > 0 + gross_income = where(has_uc_award, person_gross_income, benunit_gross_income) + weekly_gross_income = gross_income / WEEKS_IN_YEAR + weekly_hours = where( + has_uc_award, + person("weekly_hours", period), + person.benunit.max(person("weekly_hours", period)), + ) + in_remunerative_work = ( + weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "west_northamptonshire_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = has_uc_award & ( + person( + "west_northamptonshire_council_tax_reduction_non_dep_uc_earned_income", + period, + ) + <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person( + "west_northamptonshire_council_tax_reduction_non_dep_source_exemption", + period, + ) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..5afdf5cbf --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,47 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_west_northamptonshire, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class west_northamptonshire_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = "Whether the benefit unit is under West Northamptonshire's local CTR scheme" + definition_period = YEAR + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + person = benunit.members + claimant_or_partner = person("is_adult", period) + uc_relevant_period_pensioner = benunit.any( + claimant_or_partner + & person( + "west_northamptonshire_council_tax_reduction_uc_relevant_period_pensioner", + period, + ) + ) + source_working_age = ( + ~has_pensioner + | relevant_income_based_benefit + | (has_uc_award & ~uc_relevant_period_pensioner) + ) + return ( + (country == Country.ENGLAND) + & is_west_northamptonshire(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..3e2ba9bae --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class west_northamptonshire_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "West Northamptonshire Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "west_northamptonshire_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..79e3ca597 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class west_northamptonshire_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a West Northamptonshire CTR non-dependant has a source-defined deduction exemption not otherwise modeled" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK, such as normal home elsewhere, youth-training allowance, long-term patient status, or Schedule 1 discount-disregarded cases." + definition_period = YEAR + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_non_dep_uc_earned_income.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_non_dep_uc_earned_income.py new file mode 100644 index 000000000..269e0320d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_non_dep_uc_earned_income.py @@ -0,0 +1,14 @@ +from policyengine_uk.model_api import * + + +class west_northamptonshire_council_tax_reduction_non_dep_uc_earned_income(Variable): + value_type = float + entity = Person + label = "West Northamptonshire Council Tax Reduction non-dependant UC earned income" + documentation = "Person-level UC earned income for applying the source exemption where a non-dependant's Universal Credit award is calculated with no earned income. Defaults to modeled person-level gross UC earned income and can be overridden where DWP assessed income differs." + definition_period = YEAR + unit = GBP + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + + def formula(person, period, parameters): + return person("uc_mif_capped_earned_income", period) diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..262521b1e --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_tariff_income.py @@ -0,0 +1,29 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class west_northamptonshire_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "West Northamptonshire Council Tax Reduction tariff income from capital" + definition_period = YEAR + unit = GBP + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + + def formula(benunit, period, parameters): + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + tariff = parameters( + period + ).gov.local_authorities.west_northamptonshire.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award | relevant_income_based_benefit, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..2d85cb05b --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,23 @@ +from policyengine_uk.model_api import * + + +class west_northamptonshire_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = ( + "West Northamptonshire Council Tax Reduction Universal Credit applicable income" + ) + definition_period = YEAR + unit = GBP + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + + def formula(benunit, period, parameters): + uc_award_before_deductions = max_( + benunit("universal_credit_pre_benefit_cap", period), + benunit("universal_credit", period), + ) + has_uc_award = uc_award_before_deductions > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + return has_uc_award * (uc_income + uc_award_before_deductions) diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_uc_relevant_period_pensioner.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_uc_relevant_period_pensioner.py new file mode 100644 index 000000000..6bba17ea3 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_uc_relevant_period_pensioner.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class west_northamptonshire_council_tax_reduction_uc_relevant_period_pensioner( + Variable +): + value_type = bool + entity = Person + label = "Whether a West Northamptonshire UC claimant remains in the pensioner scheme during the source relevant period" + documentation = "Covers the source transitional protection for pension-age tax-credit-to-Universal-Credit cases where the UC award is disregarded for pensioner-status classification." + definition_period = YEAR + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_war_pension_protected.py b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_war_pension_protected.py new file mode 100644 index 000000000..b55e9316c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_northamptonshire/council_tax_reduction/west_northamptonshire_council_tax_reduction_war_pension_protected.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class west_northamptonshire_council_tax_reduction_war_pension_protected(Variable): + value_type = bool + entity = BenUnit + label = ( + "West Northamptonshire CTR claimant or partner receives a protected war pension" + ) + documentation = "Whether the source 100 percent maximum support applies because the claimant or partner receives a war widows or war disablement pension." + definition_period = YEAR + reference = "https://cms.westnorthants.gov.uk/media/2065/download" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/west_suffolk/council_tax_reduction/west_suffolk_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/west_suffolk/council_tax_reduction/west_suffolk_council_tax_reduction.py new file mode 100644 index 000000000..be42ae886 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_suffolk/council_tax_reduction/west_suffolk_council_tax_reduction.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_west_suffolk_working_age, +) + + +class west_suffolk_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "West Suffolk Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.west_suffolk.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_west_suffolk_working_age( + local_authority, country, has_pensioner + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "west_suffolk_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/west_suffolk/council_tax_reduction/west_suffolk_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/west_suffolk/council_tax_reduction/west_suffolk_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..221a45d02 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_suffolk/council_tax_reduction/west_suffolk_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,28 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + flat_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_west_suffolk_working_age, +) + + +class west_suffolk_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "West Suffolk CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.west_suffolk.council_tax_reduction + household = person.household + working_age = is_west_suffolk_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return flat_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/west_suffolk/council_tax_reduction/west_suffolk_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/west_suffolk/council_tax_reduction/west_suffolk_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..0f9bfc027 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/west_suffolk/council_tax_reduction/west_suffolk_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class west_suffolk_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "West Suffolk CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "west_suffolk_council_tax_reduction_individual_non_dep_deduction", + ) 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 new file mode 100644 index 000000000..c446fd595 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction.py @@ -0,0 +1,49 @@ +from policyengine_uk.model_api import * +import numpy as np +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_westminster_working_age, +) + + +class westminster_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Westminster Council Tax Support" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.westminster.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_westminster_working_age( + local_authority, country, has_pensioner + ) + has_uc = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + capital = benunit.household("savings", period) + weekly_tariff_income = np.ceil( + max_(0, capital - ctr.means_test.tariff_income_threshold) + / ctr.means_test.tariff_income_step + ) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "westminster_council_tax_reduction_non_dep_deductions", + applicable_amount=applicable_amount, + additional_applicable_income=where( + has_uc, 0, weekly_tariff_income * WEEKS_IN_YEAR + ), + ) diff --git a/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..08c8638be --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,26 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + normal_gross_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_westminster_working_age, +) + + +class westminster_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Westminster CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.westminster.council_tax_reduction + household = person.household + working_age = is_westminster_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return normal_gross_income_non_dep_deduction(person, period, ctr, working_age) diff --git a/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..feefaa281 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westminster/council_tax_reduction/westminster_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,19 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class westminster_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Westminster CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "westminster_council_tax_reduction_individual_non_dep_deduction", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction.py new file mode 100644 index 000000000..36666a9a0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction.py @@ -0,0 +1,70 @@ +from policyengine_uk.model_api import * + + +class westmorland_and_furness_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Westmorland and Furness Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.westmorland_and_furness.council_tax_reduction + local_scheme = benunit( + "westmorland_and_furness_council_tax_reduction_is_local_scheme", + period, + ) + has_uc_award = benunit("universal_credit", period) > 0 + applicable_amount = where( + has_uc_award, + benunit("uc_maximum_amount", period), + benunit("council_tax_reduction_applicable_amount", period), + ) + non_uc_applicable_income = benunit( + "council_tax_reduction_applicable_income", period + ) + benunit( + "westmorland_and_furness_council_tax_reduction_tariff_income", period + ) + uc_applicable_income = benunit( + "westmorland_and_furness_council_tax_reduction_uc_applicable_income", + period, + ) + applicable_income = where( + has_uc_award, uc_applicable_income, non_uc_applicable_income + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + excess_income = max_(0, applicable_income - applicable_amount) + excess_income = where(relevant_income_based_benefit, 0, excess_income) + liability = benunit.household("council_tax", period) + non_dep_deductions = benunit( + "westmorland_and_furness_council_tax_reduction_non_dep_deductions", + period, + ) + award = max_( + 0, + liability * ctr.maximum_support_rate + - excess_income * ctr.means_test.withdrawal_rate + - non_dep_deductions, + ) + non_uc_capital_eligible = ( + benunit.household("savings", period) <= ctr.means_test.capital_limit + ) + uc_capital_eligible = ( + benunit("uc_assessable_capital", period) <= ctr.means_test.capital_limit + ) + capital_eligible = where( + has_uc_award, + uc_capital_eligible, + non_uc_capital_eligible | relevant_income_based_benefit, + ) + return ( + local_scheme + * benunit("benunit_contains_household_head", period) + * benunit("would_claim_council_tax_reduction", period) + * capital_eligible + * award + ) diff --git a/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_claimant_source_non_dep_exemption.py b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_claimant_source_non_dep_exemption.py new file mode 100644 index 000000000..0ec82aa27 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_claimant_source_non_dep_exemption.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class westmorland_and_furness_council_tax_reduction_claimant_source_non_dep_exemption( + Variable +): + value_type = bool + entity = Person + label = "Whether a Westmorland and Furness CTR claimant has a section 30.6 non-dependant deduction exemption not otherwise modeled" + documentation = "Covers source-listed claimant exemptions not otherwise represented in PolicyEngine UK, such as suspended entitlement to disability benefits." + definition_period = YEAR + reference = "https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..2f1d2798d --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,92 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + is_full_time_student_non_dep, +) + + +class westmorland_and_furness_council_tax_reduction_individual_non_dep_deduction( + Variable +): + value_type = float + entity = Person + label = "Westmorland and Furness Council Tax Reduction individual non-dependant deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters( + period + ).gov.local_authorities.westmorland_and_furness.council_tax_reduction + household = person.household + household_person = household.members + claimant_benunit = household_person.benunit( + "benunit_contains_household_head", period + ) + local_scheme = household.any( + claimant_benunit + & household_person.benunit( + "westmorland_and_furness_council_tax_reduction_is_local_scheme", + period, + ) + ) + gross_income_components = [ + "employment_income", + "self_employment_income", + "property_income", + "private_pension_income", + "savings_interest_income", + "dividend_income", + "social_security_income", + ] + person_gross_income = add(person, period, gross_income_components) + benunit_gross_income = person.benunit.sum(person_gross_income) + add( + person.benunit, + period, + ["child_benefit", "tax_credits", "universal_credit"], + ) + weekly_gross_income = benunit_gross_income / WEEKS_IN_YEAR + benunit_weekly_hours = person.benunit.max(person("weekly_hours", period)) + in_remunerative_work = ( + benunit_weekly_hours >= ctr.non_dep_deduction.remunerative_work_hours + ) + weekly_deduction = where( + in_remunerative_work, + ctr.non_dep_deduction.amount.calc(weekly_gross_income), + ctr.non_dep_deduction.amount.calc(0), + ) + claimant_or_partner = claimant_benunit & household_person("is_adult", period) + claimant_exempt = household.any( + claimant_or_partner + & ( + household_person("is_blind", period) + | (household_person("attendance_allowance", period) > 0) + | (household_person("armed_forces_independence_payment", period) > 0) + | household_person( + "westmorland_and_furness_council_tax_reduction_claimant_source_non_dep_exemption", + period, + ) + | (household_person("dla_sc", period) > 0) + | (household_person("pip_dl", period) > 0) + ) + ) + income_based_benefit = ( + (person.benunit("income_support", period) > 0) + | (person.benunit("jsa_income", period) > 0) + | (person.benunit("esa_income", period) > 0) + | (person.benunit("pension_credit", period) > 0) + ) + uc_no_earned_income = (person.benunit("universal_credit", period) > 0) & ( + person.benunit("uc_earned_income", period) <= 0 + ) + exempt = ( + claimant_exempt + | is_full_time_student_non_dep(person, period) + | income_based_benefit + | uc_no_earned_income + | person( + "westmorland_and_furness_council_tax_reduction_non_dep_source_exemption", + period, + ) + ) + return local_scheme * where(exempt, 0.0, weekly_deduction * WEEKS_IN_YEAR) diff --git a/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_is_local_scheme.py b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_is_local_scheme.py new file mode 100644 index 000000000..4c717b134 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_is_local_scheme.py @@ -0,0 +1,34 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_westmorland_and_furness, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class westmorland_and_furness_council_tax_reduction_is_local_scheme(Variable): + value_type = bool + entity = BenUnit + label = ( + "Whether the benefit unit is under Westmorland and Furness's local CTR scheme" + ) + definition_period = YEAR + reference = "https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf" + + def formula(benunit, period, parameters): + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + has_uc_award = benunit("universal_credit", period) > 0 + source_working_age = ( + ~has_pensioner | relevant_income_based_benefit | has_uc_award + ) + return ( + (country == Country.ENGLAND) + & is_westmorland_and_furness(local_authority) + & source_working_age + ) diff --git a/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..2f72e98d9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class westmorland_and_furness_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Westmorland and Furness Council Tax Reduction non-dependant deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "westmorland_and_furness_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_non_dep_source_exemption.py b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_non_dep_source_exemption.py new file mode 100644 index 000000000..023cd9541 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_non_dep_source_exemption.py @@ -0,0 +1,11 @@ +from policyengine_uk.model_api import * + + +class westmorland_and_furness_council_tax_reduction_non_dep_source_exemption(Variable): + value_type = bool + entity = Person + label = "Whether a Westmorland and Furness CTR non-dependant has a section 30.7 or 30.8 deduction exemption not otherwise modeled" + documentation = "Covers source-listed non-dependant exemptions not otherwise represented in PolicyEngine UK, such as normal home elsewhere, long-term patient status, armed forces away, or Schedule 1 discount-disregarded cases." + definition_period = YEAR + reference = "https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf" + default_value = False diff --git a/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_tariff_income.py b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_tariff_income.py new file mode 100644 index 000000000..77528a7d8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_tariff_income.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * +import numpy as np + + +class westmorland_and_furness_council_tax_reduction_tariff_income(Variable): + value_type = float + entity = BenUnit + label = "Westmorland and Furness Council Tax Reduction tariff income from capital" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + relevant_income_based_benefit = benunit( + "council_tax_reduction_relevant_income_based_benefit", period + ) + tariff = parameters( + period + ).gov.local_authorities.westmorland_and_furness.council_tax_reduction.means_test.tariff_income + capital = benunit.household("savings", period) + excess_capital = max_(0, capital - tariff.threshold) + tariff_units = np.ceil(excess_capital / tariff.step) + tariff_income = tariff_units * tariff.amount * WEEKS_IN_YEAR + return where(has_uc_award | relevant_income_based_benefit, 0, tariff_income) diff --git a/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_uc_applicable_income.py b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_uc_applicable_income.py new file mode 100644 index 000000000..8423ae769 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/westmorland_and_furness/council_tax_reduction/westmorland_and_furness_council_tax_reduction_uc_applicable_income.py @@ -0,0 +1,18 @@ +from policyengine_uk.model_api import * + + +class westmorland_and_furness_council_tax_reduction_uc_applicable_income(Variable): + value_type = float + entity = BenUnit + label = "Westmorland and Furness Council Tax Reduction Universal Credit applicable income" + definition_period = YEAR + unit = GBP + reference = "https://www.westmorlandandfurness.gov.uk/sites/default/files/2026-03/Westmorland%20%26%20Furness%20Council%20%20CTR%20Scheme%20202627%20%28accessible%20March%202026%29.pdf" + + def formula(benunit, period, parameters): + has_uc_award = benunit("universal_credit", period) > 0 + uc_income = benunit("uc_earned_income", period) + benunit( + "uc_unearned_income", period + ) + uc_award = benunit("universal_credit", period) + return has_uc_award * (uc_income + uc_award) diff --git a/policyengine_uk/variables/gov/local_authorities/worthing/council_tax_reduction/worthing_council_tax_reduction.py b/policyengine_uk/variables/gov/local_authorities/worthing/council_tax_reduction/worthing_council_tax_reduction.py new file mode 100644 index 000000000..708a27ab4 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/worthing/council_tax_reduction/worthing_council_tax_reduction.py @@ -0,0 +1,31 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + legacy_council_tax_reduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_worthing_working_age, +) + + +class worthing_council_tax_reduction(Variable): + value_type = float + entity = BenUnit + label = "Worthing Council Tax Reduction" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + ctr = parameters(period).gov.local_authorities.worthing.council_tax_reduction + local_authority = benunit.household("local_authority", period) + country = benunit.household("country", period) + has_pensioner = benunit.household( + "council_tax_reduction_household_has_pensioner", period + ) + working_age = is_worthing_working_age(local_authority, country, has_pensioner) + return legacy_council_tax_reduction( + benunit, + period, + ctr, + working_age, + "worthing_council_tax_reduction_non_dep_deductions", + ) diff --git a/policyengine_uk/variables/gov/local_authorities/worthing/council_tax_reduction/worthing_council_tax_reduction_individual_non_dep_deduction.py b/policyengine_uk/variables/gov/local_authorities/worthing/council_tax_reduction/worthing_council_tax_reduction_individual_non_dep_deduction.py new file mode 100644 index 000000000..e04ca65df --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/worthing/council_tax_reduction/worthing_council_tax_reduction_individual_non_dep_deduction.py @@ -0,0 +1,32 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + earned_income_non_dep_deduction, +) +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_worthing_working_age, +) + + +class worthing_council_tax_reduction_individual_non_dep_deduction(Variable): + value_type = float + entity = Person + label = "Worthing CTR individual non-dependent deduction" + definition_period = YEAR + unit = GBP + defined_for = "council_tax_reduction_individual_non_dep_deduction_eligible" + + def formula(person, period, parameters): + ctr = parameters(period).gov.local_authorities.worthing.council_tax_reduction + household = person.household + working_age = is_worthing_working_age( + household("local_authority", period), + household("country", period), + household("council_tax_reduction_household_has_pensioner", period), + ) + return earned_income_non_dep_deduction( + person, + period, + ctr, + working_age, + exempt_uc_no_earned_income=True, + ) diff --git a/policyengine_uk/variables/gov/local_authorities/worthing/council_tax_reduction/worthing_council_tax_reduction_non_dep_deductions.py b/policyengine_uk/variables/gov/local_authorities/worthing/council_tax_reduction/worthing_council_tax_reduction_non_dep_deductions.py new file mode 100644 index 000000000..6a083292a --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/worthing/council_tax_reduction/worthing_council_tax_reduction_non_dep_deductions.py @@ -0,0 +1,20 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction._legacy import ( + local_non_dep_deductions, +) + + +class worthing_council_tax_reduction_non_dep_deductions(Variable): + value_type = float + entity = BenUnit + label = "Worthing CTR non-dependent deductions" + definition_period = YEAR + unit = GBP + + def formula(benunit, period, parameters): + return local_non_dep_deductions( + benunit, + period, + "worthing_council_tax_reduction_individual_non_dep_deduction", + one_deduction_for_uc_couples=False, + ) diff --git a/policyengine_uk/variables/household/consumption/council_tax_less_benefit.py b/policyengine_uk/variables/household/consumption/council_tax_less_benefit.py index b1a407394..3a21182d9 100644 --- a/policyengine_uk/variables/household/consumption/council_tax_less_benefit.py +++ b/policyengine_uk/variables/household/consumption/council_tax_less_benefit.py @@ -3,16 +3,15 @@ class council_tax_less_benefit(Variable): label = "Council Tax (less CTB)" - documentation = "Council Tax minus the Council Tax Benefit" + documentation = "Council Tax minus Council Tax Reduction" entity = Household definition_period = YEAR value_type = float unit = GBP def formula(household, period, parameters): - person = household.members - council_tax_benefit = household.sum( - person.benunit("council_tax_benefit", period) - * person("is_benunit_head", period) + return max_( + 0, + household("council_tax", period) + - household("council_tax_reduction", period), ) - return household("council_tax", period) - council_tax_benefit diff --git a/policyengine_uk/variables/household/demographic/locations.py b/policyengine_uk/variables/household/demographic/locations.py index 0c67fb004..0c0466ecc 100644 --- a/policyengine_uk/variables/household/demographic/locations.py +++ b/policyengine_uk/variables/household/demographic/locations.py @@ -250,6 +250,7 @@ class LocalAuthority(Enum): BRENTWOOD = "Brentwood" BRIDGEND = "Bridgend" BRIGHTON_AND_HOVE = "Brighton and Hove" + BRISTOL = "Bristol" BRISTOL_CITY_OF = "Bristol, City of" BROADLAND = "Broadland" BROMLEY = "Bromley" @@ -295,6 +296,7 @@ class LocalAuthority(Enum): CRAVEN = "Craven" CRAWLEY = "Crawley" CROYDON = "Croydon" + CUMBERLAND = "Cumberland" DACORUM = "Dacorum" DARLINGTON = "Darlington" DARTFORD = "Dartford" @@ -309,6 +311,7 @@ class LocalAuthority(Enum): DUDLEY = "Dudley" DUMFRIES_AND_GALLOWAY = "Dumfries and Galloway" DUNDEE_CITY = "Dundee City" + DURHAM = "Durham" EALING = "Ealing" EAST_AYRSHIRE = "East Ayrshire" EAST_CAMBRIDGESHIRE = "East Cambridgeshire" @@ -365,6 +368,7 @@ class LocalAuthority(Enum): HASTINGS = "Hastings" HAVANT = "Havant" HAVERING = "Havering" + HEREFORDSHIRE = "Herefordshire" HEREFORDSHIRE_COUNTY_OF = "Herefordshire, County of" HERTSMERE = "Hertsmere" HIGH_PEAK = "High Peak" @@ -384,6 +388,7 @@ class LocalAuthority(Enum): KENSINGTON_AND_CHELSEA = "Kensington and Chelsea" KETTERING = "Kettering" KINGS_LYNN_AND_WEST_NORFOLK = "King's Lynn and West Norfolk" + KINGSTON_UPON_HULL = "Kingston upon Hull" KINGSTON_UPON_HULL_CITY_OF = "Kingston upon Hull, City of" KINGSTON_UPON_THAMES = "Kingston upon Thames" KIRKLEES = "Kirklees" @@ -437,11 +442,13 @@ class LocalAuthority(Enum): NORTH_KESTEVEN = "North Kesteven" NORTH_LANARKSHIRE = "North Lanarkshire" NORTH_LINCOLNSHIRE = "North Lincolnshire" + NORTH_NORTHAMPTONSHIRE = "North Northamptonshire" NORTH_NORFOLK = "North Norfolk" NORTH_SOMERSET = "North Somerset" NORTH_TYNESIDE = "North Tyneside" NORTH_WARWICKSHIRE = "North Warwickshire" NORTH_WEST_LEICESTERSHIRE = "North West Leicestershire" + NORTH_YORKSHIRE = "North Yorkshire" NORTHAMPTON = "Northampton" NORTHUMBERLAND = "Northumberland" NORWICH = "Norwich" @@ -493,6 +500,7 @@ class LocalAuthority(Enum): SHROPSHIRE = "Shropshire" SLOUGH = "Slough" SOLIHULL = "Solihull" + SOMERSET = "Somerset" SOMERSET_WEST_AND_TAUNTON = "Somerset West and Taunton" SOUTH_AYRSHIRE = "South Ayrshire" SOUTH_CAMBRIDGESHIRE = "South Cambridgeshire" @@ -569,8 +577,10 @@ class LocalAuthority(Enum): WEST_LANCASHIRE = "West Lancashire" WEST_LINDSEY = "West Lindsey" WEST_LOTHIAN = "West Lothian" + WEST_NORTHAMPTONSHIRE = "West Northamptonshire" WEST_OXFORDSHIRE = "West Oxfordshire" WEST_SUFFOLK = "West Suffolk" + WESTMORLAND_AND_FURNESS = "Westmorland and Furness" WESTMINSTER = "Westminster" WIGAN = "Wigan" WILTSHIRE = "Wiltshire" diff --git a/scripts/entitledto_ctr_compare.py b/scripts/entitledto_ctr_compare.py new file mode 100644 index 000000000..546f4239a --- /dev/null +++ b/scripts/entitledto_ctr_compare.py @@ -0,0 +1,732 @@ +#!/usr/bin/env python3 + +import argparse +import json +import re +import sys +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Callable, Dict, Optional, Sequence +from urllib.parse import urljoin + +import requests +from bs4 import BeautifulSoup + + +USER_AGENT = ( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/146.0.0.0 Safari/537.36" +) + + +@dataclass(frozen=True) +class Scenario: + description: str + household_overrides: Optional[Dict[str, str]] + age_overrides: Dict[str, str] + benefits_overrides: Dict[str, str] + partner_age_overrides: Optional[Dict[str, str]] = None + child_overrides: Optional[Sequence[Dict[str, str]]] = None + disability_overrides: Optional[Dict[str, str]] = None + net_income_overrides: Optional[Dict[str, str]] = None + housing_costs_overrides: Optional[Dict[str, str]] = None + + +SCENARIOS = { + "single_jsa": Scenario( + description="Single working-age claimant on income-based JSA.", + household_overrides=None, + age_overrides={ + "Age": "35", + "Gender": "Male", + "ClientWorkStatus": "NotEmployed", + "WeekWorkHoursAmount": "0", + "WorkStatus": "False", + "ClientDisbens": "NotClaimed", + "ClientDisabledNotClaiming": "False", + "ClientCareForDisabled": "False", + }, + benefits_overrides={ + "ReceiveUniversalCredit": "False", + "ReceiveTransitionalElement": "False", + "IncomeBasedBenefit": "jobseekerallowanceincomebased", + "ReceivedManagedMigrationNotice": "False", + "ClientReceivesOtherBenefits": "False", + }, + net_income_overrides={ + "IsClientIncomeNonStatePensions": "False", + "IsFosteringAllowanceOption": "False", + "IncomeFromSavingsChk": "False", + "IsIncomeFromMaintenancePaymentsOption": "False", + "IsIncomeFromVoluntaryCharitablePaymentsOption": "False", + "OwnOtherProperty": "False", + "IsOtherSourcesIncome": "False", + }, + ), + "single_jsa_pip_standard": Scenario( + description="Single working-age claimant on income-based JSA with standard daily living PIP.", + household_overrides=None, + age_overrides={ + "Age": "35", + "Gender": "Male", + "ClientWorkStatus": "NotEmployed", + "WeekWorkHoursAmount": "0", + "WorkStatus": "False", + "ClientDisbens": "CurrentlyClaiming", + "ClientDisabledNotClaiming": "False", + "ClientCareForDisabled": "False", + }, + disability_overrides={ + "PersonalIndependencePaymentDailyLiving.SelectedOption": "2", + "PersonalIndependencePaymentDailyLiving.Value": "73.9", + "PersonalIndependencePaymentDailyLiving.PaymentPeriod": "2", + }, + benefits_overrides={ + "ReceiveUniversalCredit": "False", + "ReceiveTransitionalElement": "False", + "IncomeBasedBenefit": "jobseekerallowanceincomebased", + "ReceivedManagedMigrationNotice": "False", + "ClientReceivesOtherBenefits": "False", + }, + net_income_overrides={ + "IsClientIncomeNonStatePensions": "False", + "IsFosteringAllowanceOption": "False", + "IncomeFromSavingsChk": "False", + "IsIncomeFromMaintenancePaymentsOption": "False", + "IsIncomeFromVoluntaryCharitablePaymentsOption": "False", + "OwnOtherProperty": "False", + "IsOtherSourcesIncome": "False", + }, + ), + "single_pension_credit": Scenario( + description="Single pension-age claimant with Pension Credit and State Pension.", + household_overrides=None, + age_overrides={ + "Age": "70", + "DOB_Day": "1", + "DOB_Month": "1", + "DOB_Year": "1956", + "Gender": "Male", + "ClientWorkStatus": "NotEmployed", + "WeekWorkHoursAmount": "0", + "WorkStatus": "False", + "ClientDisbens": "NotClaimed", + "ClientDisabledNotClaiming": "False", + "ClientCareForDisabled": "False", + }, + benefits_overrides={ + "HasPensionCredit": "True", + "ClientRetirementPension.SelectedOption": "1", + "ClientRetirementPension.Value": "185.15", + "ClientRetirementPension.PaymentPeriod": "2", + "ClientReceivesOtherBenefits": "False", + }, + net_income_overrides={ + "IsClientIncomeNonStatePensions": "False", + "IsFosteringAllowanceOption": "False", + "IncomeFromSavingsChk": "False", + "IsIncomeFromMaintenancePaymentsOption": "False", + "IsIncomeFromVoluntaryCharitablePaymentsOption": "False", + "OwnOtherProperty": "False", + "IsOtherSourcesIncome": "False", + }, + ), + "couple_jsa": Scenario( + description="Couple with no children on income-based JSA.", + household_overrides={ + "HasPartner": "True", + }, + age_overrides={ + "Age": "35", + "Gender": "Male", + "ClientWorkStatus": "NotEmployed", + "WeekWorkHoursAmount": "0", + "WorkStatus": "False", + "ClientDisbens": "NotClaimed", + "ClientDisabledNotClaiming": "False", + "ClientCareForDisabled": "False", + }, + partner_age_overrides={ + "Age": "35", + "Gender": "Female", + "ClientWorkStatus": "NotEmployed", + "WeekWorkHoursAmount": "0", + "WorkStatus": "False", + "ClientDisbens": "NotClaimed", + "ClientDisabledNotClaiming": "False", + "ClientCareForDisabled": "False", + }, + benefits_overrides={ + "ReceiveUniversalCredit": "False", + "ReceiveTransitionalElement": "False", + "IncomeBasedBenefit": "jobseekerallowanceincomebased", + "ReceivedManagedMigrationNotice": "False", + "ClientReceivesOtherBenefits": "False", + }, + net_income_overrides={ + "IsClientIncomeNonStatePensions": "False", + "IsFosteringAllowanceOption": "False", + "IncomeFromSavingsChk": "False", + "IsIncomeFromMaintenancePaymentsOption": "False", + "IsIncomeFromVoluntaryCharitablePaymentsOption": "False", + "OwnOtherProperty": "False", + "IsOtherSourcesIncome": "False", + }, + ), + "lone_parent_one_child_jsa": Scenario( + description="Lone parent with one child on income-based JSA.", + household_overrides={ + "HouseholdChildrenNumber": "1", + }, + age_overrides={ + "Age": "35", + "Gender": "Male", + "ClientWorkStatus": "NotEmployed", + "WeekWorkHoursAmount": "0", + "WorkStatus": "False", + "ClientDisbens": "NotClaimed", + "ClientDisabledNotClaiming": "False", + "ClientCareForDisabled": "False", + }, + child_overrides=[ + { + "Age": "5", + "DOB_Day": "1", + "DOB_Month": "1", + "DOB_Year": "2021", + "PayForChildcare": "False", + "ChildcarePeriod": "2", + "ChildcareAmount": "0", + "IsDisabledPerson": "False", + "IsDisabledNotClaiming": "False", + } + ], + benefits_overrides={ + "ReceiveUniversalCredit": "False", + "ReceiveTransitionalElement": "False", + "IncomeBasedBenefit": "jobseekerallowanceincomebased", + "ReceivedManagedMigrationNotice": "False", + "ClientReceivesOtherBenefits": "False", + }, + net_income_overrides={ + "IsClientIncomeNonStatePensions": "False", + "IsFosteringAllowanceOption": "False", + "IncomeFromSavingsChk": "False", + "IsIncomeFromMaintenancePaymentsOption": "False", + "IsIncomeFromVoluntaryCharitablePaymentsOption": "False", + "OwnOtherProperty": "False", + "IsOtherSourcesIncome": "False", + }, + ), +} + + +HOUSEHOLD_TEMPLATE = { + "CompanyName": "entitledto", + "HasSEISS": "False", + "HideNonDeps": "False", + "SiteId": "4", + "CalcYears": "22", + "HasPartner": "False", + "HouseholdChildrenNumber": "0", + "AnyoneElseLivesInYourHome": "No", + "ImmigrationControl": "True", + "ClientImmigrationStatus": "BritishOrIrish", + "CoronaVirusStatus": "None", + "ResCare": "False", + "VehiclesModel.DoYouOwnAVehicle": "False", + "VehiclesModel.NumberOfVehicles": "0", + "NavigationControls.SaveButtonIsPressed": "False", + "NavigationControls.ShowSaveButton": "True", + "NavigationControls.ShowNextButton": "True", +} + + +EMPTY_NET_INCOME = { + "IsClientIncomeNonStatePensions": "False", + "IsFosteringAllowanceOption": "False", + "IncomeFromSavingsChk": "False", + "IsIncomeFromMaintenancePaymentsOption": "False", + "IsIncomeFromVoluntaryCharitablePaymentsOption": "False", + "OwnOtherProperty": "False", + "IsOtherSourcesIncome": "False", +} + + +def load_session(storage_state_path: Path) -> requests.Session: + state = json.loads(storage_state_path.read_text()) + session = requests.Session() + for cookie in state.get("cookies", []): + domain = cookie.get("domain", "") + if "entitledto.co.uk" not in domain: + continue + session.cookies.set( + cookie["name"], + cookie["value"], + domain=domain, + path=cookie.get("path", "/"), + ) + session.headers.update( + { + "User-Agent": USER_AGENT, + "Accept-Language": "en-US,en;q=0.9", + } + ) + return session + + +def find_resume_cid(session: requests.Session) -> Optional[str]: + for cookie in session.cookies: + match = re.match( + r"f_/benefits-calculator/Intro/Home\?cid([0-9a-f-]{36})", + cookie.name, + ) + if match: + return match.group(1) + return None + + +def extract_primary_form(html: str, current_url: str) -> tuple[str, Dict[str, str]]: + soup = BeautifulSoup(html, "html.parser") + candidate = None + for form in soup.find_all("form"): + if "/benefits-calculator/" in (form.get("action") or ""): + candidate = form + break + if candidate is None: + raise RuntimeError(f"No entitledto calculator form found at {current_url}") + + action = urljoin(current_url, candidate.get("action", current_url)) + payload: Dict[str, str] = {} + radio_groups = set() + + for element in candidate.find_all(["input", "select", "textarea"]): + name = element.get("name") + if not name: + continue + tag = element.name + element_type = (element.get("type") or "").lower() + + if tag == "select": + selected = element.find("option", selected=True) or element.find("option") + payload[name] = selected.get("value", "") if selected else "" + continue + + if tag == "textarea": + payload[name] = element.text or "" + continue + + if element_type in {"submit", "button", "image", "file", "reset"}: + continue + + value = element.get("value", "") + data_value = element.get("data-value") + if ( + data_value is not None + and element_type == "hidden" + and ( + value.startswith("System.String") + or value.startswith("System.Collections.Generic") + ) + ): + value = data_value + + if element_type == "radio": + if name in radio_groups: + continue + checked = candidate.find("input", attrs={"name": name, "checked": True}) + if checked is not None: + payload[name] = checked.get("value", "") + radio_groups.add(name) + continue + + if element_type == "checkbox": + if element.has_attr("checked"): + payload[name] = value or "on" + continue + + payload[name] = value + + return action, payload + + +def follow_post( + session: requests.Session, action: str, payload: Dict[str, str] +) -> requests.Response: + response = session.post(action, data=payload, allow_redirects=False, timeout=30) + if response.is_redirect or response.is_permanent_redirect: + location = response.headers["location"] + return session.get(urljoin(action, location), timeout=30) + return response + + +def page_title(html: str) -> str: + soup = BeautifulSoup(html, "html.parser") + return soup.title.get_text(strip=True) if soup.title else "" + + +def bootstrap_calculation( + session: requests.Session, + postcode: str, + housing_status: str, + household_overrides: Optional[Dict[str, str]] = None, +) -> requests.Response: + response = None + action = None + payload = None + resume_cid = find_resume_cid(session) + if resume_cid is not None: + response = session.get( + f"https://www.entitledto.co.uk/benefits-calculator/Intro/Home?cid={resume_cid}", + timeout=30, + ) + else: + response = session.get( + "https://www.entitledto.co.uk/benefits-calculator/", + timeout=30, + ) + for _ in range(5): + action, payload = extract_primary_form(response.text, response.url) + if "CalcIdent" in payload: + break + response = follow_post(session, action, payload) + if ( + response is None + or action is None + or payload is None + or "CalcIdent" not in payload + ): + raise RuntimeError( + "entitledto did not return the calculator start page with a CalcIdent" + ) + payload.update( + { + "NationalHousingStatus": housing_status, + "Postcode": postcode, + } + ) + response = follow_post(session, action, payload) + household_payload = dict(HOUSEHOLD_TEMPLATE) + action, household_defaults = extract_primary_form(response.text, response.url) + household_payload["CalcIdent"] = household_defaults["CalcIdent"] + household_payload["StartTime"] = household_defaults["StartTime"] + household_payload.update(household_overrides or {}) + return follow_post(session, action, household_payload) + + +def post_form_overrides( + session: requests.Session, + response: requests.Response, + overrides: Optional[Dict[str, str]] = None, +) -> requests.Response: + action, payload = extract_primary_form(response.text, response.url) + payload.update(overrides or {}) + return follow_post(session, action, payload) + + +def post_until( + session: requests.Session, + response: requests.Response, + overrides: Optional[Dict[str, str]], + predicate: Callable[[requests.Response], bool], + attempts: int = 3, +) -> requests.Response: + for _ in range(attempts): + response = post_form_overrides(session, response, overrides) + if predicate(response): + return response + return response + + +def require_page(response: requests.Response, fragment: str) -> None: + if fragment not in response.url: + raise RuntimeError( + f"Expected entitledto page containing {fragment!r}, got {response.url!r}" + ) + + +def normalize_text(html: str) -> str: + return " ".join( + BeautifulSoup(html, "html.parser").get_text(" ", strip=True).split() + ) + + +def extract_money(pattern: str, text: str) -> Optional[str]: + match = re.search(pattern, text) + if not match: + return None + return match.group(1).replace(" ", "") + + +def parse_results(html: str) -> Dict[str, Optional[str]]: + text = normalize_text(html) + payment_period_match = re.search( + r"Council Tax Support £\s*([0-9][0-9,\.\s]*)\s*/\s*(weekly|4 weeks|monthly|yearly)", + text, + re.IGNORECASE, + ) + bill_match = re.search( + r"full Council Tax bill of £\s*([0-9][0-9,\.\s]*)\s*per\s*(week|4 weeks|month|year)" + r"\s*will be reduced to £\s*([0-9][0-9,\.\s]*)\s*per\s*(week|4 weeks|month|year)", + text, + re.IGNORECASE, + ) + total_match = re.search( + r"Total benefits entitlement.*?£\s*([0-9][0-9,\.\s]*)\s*/\s*(weekly|4 weeks|monthly|yearly)", + text, + re.IGNORECASE, + ) + return { + "council_tax_support": payment_period_match.group(1).replace(" ", "") + if payment_period_match + else None, + "council_tax_support_period": payment_period_match.group(2) + if payment_period_match + else None, + "council_tax_bill_before": bill_match.group(1).replace(" ", "") + if bill_match + else None, + "council_tax_bill_before_period": bill_match.group(2) if bill_match else None, + "council_tax_bill_after": bill_match.group(3).replace(" ", "") + if bill_match + else None, + "council_tax_bill_after_period": bill_match.group(4) if bill_match else None, + "total_benefits": total_match.group(1).replace(" ", "") + if total_match + else None, + "total_benefits_period": total_match.group(2) if total_match else None, + } + + +def run_scenario( + session: requests.Session, + scenario_name: str, + postcode: str, + housing_status: str, + council_tax_band: str, + council_tax: str, + use_band_amount: bool, + save_html_dir: Optional[Path], +) -> Dict[str, Optional[str]]: + scenario = SCENARIOS[scenario_name] + response = bootstrap_calculation( + session, + postcode, + housing_status, + household_overrides=scenario.household_overrides, + ) + require_page(response, "/AgeDisabilityStatus") + if scenario.partner_age_overrides is not None: + response = post_until( + session, + response, + scenario.age_overrides, + lambda resp: "client=Partner" in resp.url, + ) + elif scenario.child_overrides is not None: + response = post_until( + session, + response, + scenario.age_overrides, + lambda resp: "/Children" in resp.url, + ) + else: + response = post_until( + session, + response, + scenario.age_overrides, + lambda resp: ( + "/BenefitsYouCurrentlyReceive" in resp.url + or "/DisabilityBenefits" in resp.url + ), + ) + + if scenario.partner_age_overrides is not None: + require_page(response, "/AgeDisabilityStatus") + response = post_until( + session, + response, + scenario.partner_age_overrides, + lambda resp: "/BenefitsYouCurrentlyReceive" in resp.url, + ) + + if scenario.child_overrides is not None: + for child_overrides in scenario.child_overrides: + require_page(response, "/Children") + response = post_until( + session, + response, + child_overrides, + lambda resp: ( + "/BenefitsYouCurrentlyReceive" in resp.url + or "/Children" in resp.url + ), + ) + + if "/DisabilityBenefits" in response.url: + if scenario.disability_overrides is None: + raise RuntimeError( + f"{scenario_name} reached DisabilityBenefits without a disability payload" + ) + response = post_until( + session, + response, + scenario.disability_overrides, + lambda resp: "/BenefitsYouCurrentlyReceive" in resp.url, + ) + + require_page(response, "/BenefitsYouCurrentlyReceive") + response = post_until( + session, + response, + scenario.benefits_overrides, + lambda resp: "/NetIncome" in resp.url, + ) + require_page(response, "/NetIncome") + response = post_form_overrides( + session, + response, + {**EMPTY_NET_INCOME, **(scenario.net_income_overrides or {})}, + ) + require_page(response, "/HousingCosts") + response = post_until( + session, + response, + scenario.housing_costs_overrides, + lambda resp: "/CouncilTax" in resp.url, + ) + require_page(response, "/CouncilTax") + response = post_form_overrides( + session, + response, + { + "CouncilTaxBand": council_tax_band, + "EligibleDisabilityReduction": "False", + "DiscountsApplicable": "0", + "AmountIsCorrect": "True" if use_band_amount else "False", + "CouncilTax": council_tax, + "CouncilTaxPeriod": "0", + }, + ) + + if "/Results/" not in response.url: + raise RuntimeError( + f"{scenario_name} did not reach entitledto results; stopped at {response.url}" + ) + + if save_html_dir is not None: + save_html_dir.mkdir(parents=True, exist_ok=True) + output_path = save_html_dir / f"{scenario_name}.html" + output_path.write_text(response.text) + + result = { + "scenario": scenario_name, + "description": scenario.description, + "postcode": postcode, + "housing_status": housing_status, + "council_tax_band": council_tax_band, + "council_tax": council_tax, + "results_url": response.url, + "results_title": page_title(response.text), + } + result.update(parse_results(response.text)) + return result + + +def run_scenario_with_retries( + storage_state_path: Path, + scenario_name: str, + postcode: str, + housing_status: str, + council_tax_band: str, + council_tax: str, + use_band_amount: bool, + save_html_dir: Optional[Path], + attempts: int, +) -> Dict[str, Optional[str]]: + last_error: Optional[Exception] = None + for attempt in range(1, attempts + 1): + try: + return run_scenario( + session=load_session(storage_state_path), + scenario_name=scenario_name, + postcode=postcode, + housing_status=housing_status, + council_tax_band=council_tax_band, + council_tax=council_tax, + use_band_amount=use_band_amount, + save_html_dir=save_html_dir, + ) + except Exception as error: + last_error = error + if attempt < attempts: + time.sleep(1) + assert last_error is not None + raise last_error + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument("storage_state", type=Path) + parser.add_argument("--postcode", required=True) + parser.add_argument("--housing-status", default="MortgageOrOwned") + parser.add_argument("--band", default="D") + parser.add_argument("--council-tax", default="1800") + parser.add_argument( + "--use-band-amount", + action="store_true", + help="Use entitledto's band-derived bill instead of the provided annual bill.", + ) + parser.add_argument( + "--scenario", + action="append", + choices=[*SCENARIOS.keys(), "all"], + default=["single_jsa"], + help="Scenario to run. Repeatable. Use 'all' to run every built-in scenario.", + ) + parser.add_argument("--save-html-dir", type=Path) + parser.add_argument("--attempts", type=int, default=5) + return parser.parse_args() + + +def main() -> int: + args = parse_args() + scenario_names = args.scenario + if "all" in scenario_names: + scenario_names = list(SCENARIOS.keys()) + else: + # Preserve order while removing accidental duplicates. + scenario_names = list(dict.fromkeys(scenario_names)) + + try: + results = [ + run_scenario_with_retries( + storage_state_path=args.storage_state, + scenario_name=scenario_name, + postcode=args.postcode, + housing_status=args.housing_status, + council_tax_band=args.band, + council_tax=args.council_tax, + use_band_amount=args.use_band_amount, + save_html_dir=args.save_html_dir, + attempts=args.attempts, + ) + for scenario_name in scenario_names + ] + except Exception as error: + print( + f"error: {error}\n" + "If entitledto returned Cloudflare again, refresh the storage state first " + "with `playwright-cli state-save` or another browser-derived cookie export.", + file=sys.stderr, + ) + return 1 + + print(json.dumps(results, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/policyengine_ctr_compare.py b/scripts/policyengine_ctr_compare.py new file mode 100644 index 000000000..c7be95a1e --- /dev/null +++ b/scripts/policyengine_ctr_compare.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python3 + +import argparse +import json +import sys +from dataclasses import dataclass +from typing import Callable + +from policyengine_uk import Simulation + + +@dataclass(frozen=True) +class CouncilConfig: + label: str + local_authority: str + council_tax_band: str + council_tax: float + + +@dataclass(frozen=True) +class Scenario: + description: str + build_situation: Callable[[CouncilConfig], dict] + + +SINGLE_JSA_WEEKLY = 92.05 +COUPLE_JSA_WEEKLY = 144.65 +STATE_PENSION_WEEKLY = 185.15 + + +COUNCILS = { + "east_hertfordshire": CouncilConfig( + label="East Hertfordshire", + local_authority="EAST_HERTFORDSHIRE", + council_tax_band="D", + council_tax=1800.0, + ), + "warrington": CouncilConfig( + label="Warrington", + local_authority="WARRINGTON", + council_tax_band="C", + council_tax=126.74 * 12, + ), + "dudley": CouncilConfig( + label="Dudley", + local_authority="DUDLEY", + council_tax_band="C", + council_tax=113.25 * 12, + ), + "stroud": CouncilConfig( + label="Stroud", + local_authority="STROUD", + council_tax_band="D", + council_tax=148.09 * 12, + ), +} + + +def base_benunit( + *, + members: list[str], + eldest_adult_age: int, + is_single_person: bool, + is_couple: bool, + is_lone_parent: bool, +) -> dict: + return { + "members": members, + "claims_all_entitled_benefits": {2025: False}, + "would_claim_uc": {2025: False}, + "is_single_person": {2025: is_single_person}, + "is_couple": {2025: is_couple}, + "is_lone_parent": {2025: is_lone_parent}, + "eldest_adult_age": {2025: eldest_adult_age}, + "benefits_premiums": {2025: 0}, + } + + +def base_household(council: CouncilConfig, members: list[str]) -> dict: + return { + "members": members, + "country": {2025: "ENGLAND"}, + "local_authority": {2025: council.local_authority}, + "council_tax_band": {2025: council.council_tax_band}, + "council_tax": {2025: council.council_tax}, + "savings": {2025: 0}, + } + + +def build_single_jsa(council: CouncilConfig) -> dict: + return { + "people": { + "claimant": { + "age": {2025: 35}, + "jsa_income_reported": {2025: SINGLE_JSA_WEEKLY * 52}, + "council_tax_benefit_reported": {2025: 1}, + } + }, + "benunits": { + "benunit": base_benunit( + members=["claimant"], + eldest_adult_age=35, + is_single_person=True, + is_couple=False, + is_lone_parent=False, + ) + }, + "households": { + "household": base_household(council, ["claimant"]), + }, + } + + +def build_couple_jsa(council: CouncilConfig) -> dict: + return { + "people": { + "claimant": { + "age": {2025: 35}, + "jsa_income_reported": {2025: COUPLE_JSA_WEEKLY * 52}, + "council_tax_benefit_reported": {2025: 1}, + }, + "partner": { + "age": {2025: 35}, + }, + }, + "benunits": { + "benunit": base_benunit( + members=["claimant", "partner"], + eldest_adult_age=35, + is_single_person=False, + is_couple=True, + is_lone_parent=False, + ) + }, + "households": { + "household": base_household(council, ["claimant", "partner"]), + }, + } + + +def build_lone_parent_one_child_jsa(council: CouncilConfig) -> dict: + return { + "people": { + "claimant": { + "age": {2025: 35}, + "jsa_income_reported": {2025: SINGLE_JSA_WEEKLY * 52}, + "council_tax_benefit_reported": {2025: 1}, + }, + "child": { + "age": {2025: 5}, + }, + }, + "benunits": { + "benunit": base_benunit( + members=["claimant", "child"], + eldest_adult_age=35, + is_single_person=False, + is_couple=False, + is_lone_parent=True, + ) + }, + "households": { + "household": base_household(council, ["claimant", "child"]), + }, + } + + +def build_single_pension_credit(council: CouncilConfig) -> dict: + return { + "people": { + "claimant": { + "age": {2025: 70}, + "state_pension": {2025: STATE_PENSION_WEEKLY * 52}, + "council_tax_benefit_reported": {2025: 1}, + } + }, + "benunits": { + "benunit": { + **base_benunit( + members=["claimant"], + eldest_adult_age=70, + is_single_person=True, + is_couple=False, + is_lone_parent=False, + ), + "would_claim_pc": {2025: True}, + } + }, + "households": { + "household": base_household(council, ["claimant"]), + }, + } + + +SCENARIOS = { + "single_jsa": Scenario( + description="Single working-age claimant on income-based JSA.", + build_situation=build_single_jsa, + ), + "couple_jsa": Scenario( + description="Couple with no children on income-based JSA.", + build_situation=build_couple_jsa, + ), + "lone_parent_one_child_jsa": Scenario( + description="Lone parent with one child on income-based JSA.", + build_situation=build_lone_parent_one_child_jsa, + ), + "single_pension_credit": Scenario( + description="Single pension-age claimant with State Pension and Pension Credit.", + build_situation=build_single_pension_credit, + ), +} + + +def run_case(council_name: str, scenario_name: str) -> dict: + council = COUNCILS[council_name] + scenario = SCENARIOS[scenario_name] + sim = Simulation(situation=scenario.build_situation(council)) + period = 2025 + return { + "council": council_name, + "council_label": council.label, + "scenario": scenario_name, + "description": scenario.description, + "council_tax_band": council.council_tax_band, + "council_tax": council.council_tax, + "council_tax_reduction": float( + sim.calculate("council_tax_reduction", period)[0] + ), + "council_tax_less_benefit": float( + sim.calculate("council_tax_less_benefit", period)[0] + ), + "child_benefit": float(sim.calculate("child_benefit", period)[0]), + "pension_credit": float(sim.calculate("pension_credit", period)[0]), + "state_pension": float(sim.calculate("state_pension", period)[0]), + } + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument( + "--scenario", + action="append", + choices=[*SCENARIOS.keys(), "all"], + default=None, + ) + parser.add_argument( + "--council", + action="append", + choices=[*COUNCILS.keys(), "all"], + default=None, + ) + return parser.parse_args() + + +def main() -> int: + args = parse_args() + scenario_names = args.scenario or ["single_jsa"] + if "all" in scenario_names: + scenario_names = list(SCENARIOS.keys()) + else: + scenario_names = list(dict.fromkeys(scenario_names)) + + council_names = args.council or ["all"] + if "all" in council_names: + council_names = list(COUNCILS.keys()) + else: + council_names = list(dict.fromkeys(council_names)) + + results = [] + for scenario_name in scenario_names: + for council_name in council_names: + results.append(run_case(council_name, scenario_name)) + + json.dump(results, sys.stdout, indent=2) + sys.stdout.write("\n") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/turn2us_ctr_compare.py b/scripts/turn2us_ctr_compare.py new file mode 100644 index 000000000..00d00c376 --- /dev/null +++ b/scripts/turn2us_ctr_compare.py @@ -0,0 +1,331 @@ +#!/usr/bin/env python3 + +import argparse +import json +import sys +from dataclasses import dataclass +from typing import Any, Callable + +import requests + + +BASE_URL = "https://benefits-calculator-api.turn2us.org.uk" +USER_AGENT = ( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/136.0.0.0 Safari/537.36" +) +STATE = { + "partner": None, + "referral": None, + "subCategory": None, + "test": None, + "pipSessionId": None, + "isMobile": False, + "browserVersion": "136.0.0.0", + "browserName": "Chrome", + "OsName": "Mac OS", + "browserId": "policyengine_turn2us_probe", +} + + +@dataclass(frozen=True) +class Scenario: + description: str + build_steps: Callable[[dict[str, Any]], list[dict[str, Any]]] + + +def build_single_jsa_steps(postcode_payload: dict[str, Any]) -> list[dict[str, Any]]: + return [ + { + "ClientMemberHousehold": "Yes", + "ClientPartnerStudent": "No", + "ClientPartnerPrison": "No", + "ClientPartnerHospital": "No", + }, + {}, + { + "ClientPostcode": postcode_payload, + "ClientLiveWithPartner": "No", + "ClientDob": "01/01/1991", + }, + {}, + {"ClientPartnerReceivingBens": "Yes"}, + { + "ClientPartnerUcReceiving": "No", + "ClientPartnerIrEsa": "No", + "ClientPartnerIncomeSupport": "No", + "ClientPartnerIbJsa": "Yes", + "IbJsaSingleCouple": "Single", + "ClientPartnerHousingBenefit": "No", + "ManagedMigration": "No", + }, + {"ClientIncomeFromBenefits": ["None of the above"]}, + {}, + {"ClientSicknessDisability": "No", "ClientRegisteredBlind": "No"}, + {}, + {"ClientCarer": "No", "ClientCarerAllow": "No", "ClientCarerSupport": "No"}, + {}, + { + "ClientIsApprovedFosterCarer": "No", + "ClientHasChildren": "No", + "ClientExpectingBaby": "No", + }, + {}, + {}, + {"ClientHousingCosts": "I own my home with a mortgage"}, + {"BetterOffCalc": "No", "ClientWorking": "Unemployed and looking for work"}, + {"ClientWarPension": "No"}, + {"ClientSpousalMaintenance": "No"}, + {}, + {"ClientPropertyCommercial": "No"}, + {"ClientCapitalEstimate": "£0 - £5000"}, + ] + + +def build_couple_jsa_steps(postcode_payload: dict[str, Any]) -> list[dict[str, Any]]: + steps = build_single_jsa_steps(postcode_payload) + steps[2] = { + **steps[2], + "ClientLiveWithPartner": "Yes", + "PartnerDob": "01/01/1991", + } + steps[5] = {**steps[5], "IbJsaSingleCouple": "Couple"} + # Turn2us inserts partner-only work / pension pages for couples. + steps.extend([{}, {}, {}, {}, {}]) + return steps + + +def build_lone_parent_one_child_jsa_steps( + postcode_payload: dict[str, Any], +) -> list[dict[str, Any]]: + steps = build_single_jsa_steps(postcode_payload) + steps[12] = { + **steps[12], + "ClientHasChildren": "Yes", + "ClientDependentChildren": "1", + "ClientExpectingBaby": "No", + } + steps[13] = { + "ChildGenderOne": "Male", + "ChildDobOne": "01/01/2021", + "ChildDisabilityOne": "No", + } + return steps + + +def build_single_pension_credit_steps( + postcode_payload: dict[str, Any], +) -> list[dict[str, Any]]: + steps = build_single_jsa_steps(postcode_payload) + steps[2] = {**steps[2], "ClientDob": "01/01/1956"} + steps[5] = { + "ClientPartnerUcReceiving": "No", + "ClientPartnerIrEsa": "No", + "ClientPartnerIncomeSupport": "No", + "ClientPartnerIbJsa": "No", + "ClientPartnerHousingBenefit": "No", + "ClientPartnerPensionCredit": "Yes", + "ClientSavingPension": "Yes", + "ManagedMigration": "No", + } + steps[17] = { + "ClientIncomeStatePension": {"weekly": "185.15", "period": "weekly"}, + "ClientStatePensionDeferred": {"weekly": "0", "period": "weekly"}, + "ClientIncomeOccupationalPension": {"weekly": "0", "period": "weekly"}, + } + return steps + + +SCENARIOS = { + "single_jsa": Scenario( + description="Single working-age claimant on income-based JSA.", + build_steps=build_single_jsa_steps, + ), + "couple_jsa": Scenario( + description="Couple with no children on income-based JSA.", + build_steps=build_couple_jsa_steps, + ), + "lone_parent_one_child_jsa": Scenario( + description="Lone parent with one child on income-based JSA.", + build_steps=build_lone_parent_one_child_jsa_steps, + ), + "single_pension_credit": Scenario( + description="Single pension-age claimant with Pension Credit and State Pension.", + build_steps=build_single_pension_credit_steps, + ), +} + + +def build_session() -> requests.Session: + session = requests.Session() + session.headers.update( + { + "User-Agent": USER_AGENT, + "Accept": "application/json, text/plain, */*", + "Origin": "https://benefits-calculator.turn2us.org.uk", + "Referer": "https://benefits-calculator.turn2us.org.uk/", + } + ) + return session + + +def resolve_postcode(session: requests.Session, postcode: str) -> dict[str, Any]: + response = session.post( + f"{BASE_URL}/api/data/postcode/", + json={"postcode": postcode, "browserId": STATE["browserId"]}, + timeout=30, + ) + response.raise_for_status() + payload = response.json() + if not payload.get("valid"): + raise RuntimeError(f"Turn2us rejected postcode {postcode!r}: {payload}") + return payload["value"] + + +def start_survey(session: requests.Session) -> dict[str, Any]: + response = session.get(f"{BASE_URL}/api/data/survey", timeout=30) + response.raise_for_status() + return response.json() + + +def advance_survey( + session: requests.Session, state: dict[str, Any], answers: dict[str, Any] +) -> dict[str, Any]: + payload = { + **answers, + "session": state["session"], + "page": state["pageNumber"], + "action": 2, + **STATE, + } + response = session.post(f"{BASE_URL}/api/data/survey/", json=payload, timeout=30) + response.raise_for_status() + return response.json() + + +def fetch_results( + session: requests.Session, survey_state: dict[str, Any] +) -> dict[str, Any]: + response = session.get( + f"{BASE_URL}/api/data/result/?session={survey_state['session']}", + timeout=30, + ) + response.raise_for_status() + return response.json() + + +def benefit_names(result: dict[str, Any], bucket: str) -> list[str]: + return [ + item.get("benefitName") + for item in result["benefits"].get(bucket, []) or [] + if item.get("benefitName") + ] + + +def bucket_totals(result: dict[str, Any], bucket: str) -> list[dict[str, Any]]: + return [ + { + "benefit_name": item.get("benefitName"), + "weekly_payment": item.get("weeklyPayment"), + "monthly_payment": item.get("monthlyPayment"), + } + for item in result["benefits"].get(bucket, []) or [] + ] + + +def find_council_tax_mentions(result: dict[str, Any]) -> list[str]: + mentions: list[str] = [] + for bucket in ("meansTested", "nonMeansTested", "universalCredit"): + for item in result["benefits"].get(bucket, []) or []: + benefit_name = item.get("benefitName") or "" + if "council" in benefit_name.lower(): + mentions.append(benefit_name) + for element in item.get("elements", []) or []: + name = element.get("name") or "" + if "council" in name.lower(): + mentions.append(name) + for deduction in item.get("deductions", []) or []: + name = deduction.get("name") or "" + if "council" in name.lower(): + mentions.append(name) + return mentions + + +def run_case(postcode: str, scenario_name: str) -> dict[str, Any]: + session = build_session() + postcode_payload = resolve_postcode(session, postcode) + survey_state = start_survey(session) + scenario = SCENARIOS[scenario_name] + for answers in scenario.build_steps(postcode_payload): + survey_state = advance_survey(session, survey_state, answers) + for _ in range(10): + if survey_state["pageNumber"] == 109: + break + survey_state = advance_survey(session, survey_state, {}) + result = fetch_results(session, survey_state) + return { + "scenario": scenario_name, + "description": scenario.description, + "postcode": postcode, + "authority": postcode_payload["authority"], + "authority_code": postcode_payload["authorityCode"], + "country": postcode_payload["country"], + "final_page_number": survey_state["pageNumber"], + "final_page_title": survey_state["page"]["title"], + "reached_results_page": survey_state["pageNumber"] == 109, + "means_tested": bucket_totals(result, "meansTested"), + "universal_credit": bucket_totals(result, "universalCredit"), + "non_means_tested": bucket_totals(result, "nonMeansTested"), + "council_tax_mentions": find_council_tax_mentions(result), + "messages_with_council_tax_terms": [ + message + for message in result.get("messages", []) or [] + if "council" in json.dumps(message).lower() + ], + "raw_result_path": None, + } + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument("postcode", nargs="+") + parser.add_argument( + "--scenario", + action="append", + choices=[*SCENARIOS.keys(), "all"], + default=None, + ) + parser.add_argument("--save-raw-dir") + return parser.parse_args() + + +def main() -> int: + args = parse_args() + scenario_names = args.scenario or ["single_jsa"] + if "all" in scenario_names: + scenario_names = list(SCENARIOS.keys()) + else: + scenario_names = list(dict.fromkeys(scenario_names)) + results = [] + for scenario_name in scenario_names: + for postcode in args.postcode: + case = run_case(postcode, scenario_name) + if args.save_raw_dir is not None: + from pathlib import Path + + raw_dir = Path(args.save_raw_dir) + raw_dir.mkdir(parents=True, exist_ok=True) + out_path = raw_dir / ( + f"{scenario_name}_{postcode.replace(' ', '_')}.json" + ) + out_path.write_text(json.dumps(case, indent=2)) + case["raw_result_path"] = str(out_path) + results.append(case) + json.dump(results, sys.stdout, indent=2) + sys.stdout.write("\n") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())