Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/2151.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Corrected the 2020 over-75 TV licence Pension Credit transition to start on 1 August while preserving its Boolean eligibility rule.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ description: Percentage discount for qualifying aged households.
values:
2003-01-01: 1
metadata:
preserve_calendar_dates: true
unit: /1
label: Aged TV Licence discount
reference:
- title: "Free and reduced fee TV Licences | TV Licensing"
href: https://www.tvlicensing.co.uk/reducedfee
href: https://www.tvlicensing.co.uk/reducedfee
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ description: Minimum age required to qualify for a TV licence discount.
values:
2003-01-01: 75
metadata:
preserve_calendar_dates: true
unit: year
label: Aged TV Licence discounted minimum age
reference:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
description: Whether aged individuals must claim Pension Credit in order to qualify for a free TV licence.
description: Whether aged individuals must receive Pension Credit to qualify for a free TV licence.
values:
2003-01-01: false
2020-04-01: true
2020-08-01:
value: true
reference:
- title: Government and BBC joint statement on delaying the TV licence fee for over 75s
href: https://www.gov.uk/government/news/bbc-and-governments-joint-statement-on-delaying-the-tv-licence-fee-for-over-75s
metadata:
preserve_calendar_dates: true
unit: bool
period: year
label: Aged TV Licence Pension Credit requirement
reference:
- title: "Free and reduced fee TV Licences | TV Licensing"
href: https://www.tvlicensing.co.uk/reducedfee
- title: Get a free or discounted TV licence
href: https://www.gov.uk/free-discount-tv-licence
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,41 @@
pension_credit: 1
is_blind: true
output:
tv_licence_discount: 1
tv_licence_discount: 1

- name: All aged households qualify before the Pension Credit condition.
period: 2019
input:
age: 75
pension_credit: 0
is_blind: false
output:
tv_licence_discount: 1

- name: The 2020-21 discount reflects the 1 August transition.
period: 2020
absolute_error_margin: 0.000001
input:
age: 75
pension_credit: 0
is_blind: false
output:
tv_licence_discount: 0.3205479452

- name: Pension Credit recipients retain the full 2020-21 discount.
period: 2020
input:
age: 75
pension_credit: 1
is_blind: false
output:
tv_licence_discount: 1

- name: The Pension Credit condition applies for all of 2021-22.
period: 2021
input:
age: 75
pension_credit: 0
is_blind: false
output:
tv_licence_discount: 0
81 changes: 81 additions & 0 deletions policyengine_uk/tests/test_tv_licence_transition.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
"""Tests for the 2020 over-75 TV licence concession transition."""

from pathlib import Path

import pytest
from policyengine_core.parameters import ParameterNode

import policyengine_uk
from policyengine_uk import CountryTaxBenefitSystem, Simulation
from policyengine_uk.utils.excise import fiscal_year_segments


def _requirement(parameter_root):
return parameter_root.gov.dcms.bbc.tv_licence.discount.aged.must_claim_pc


def test_pension_credit_condition_uses_the_statutory_start_date():
"""The BBC deferred the condition from 1 June to 1 August 2020."""
parameters = ParameterNode(
directory_path=str(Path(policyengine_uk.__file__).parent / "parameters")
)
requirement = _requirement(parameters)

assert requirement("2020-07-31") is False
assert requirement("2020-08-01") is True


def test_pension_credit_condition_keeps_its_date_after_processing():
"""Processing preserves the 1 August Boolean policy transition."""
system = CountryTaxBenefitSystem()
requirement = _requirement(system.parameters)

assert requirement("2020-07-31") is False
assert requirement("2020-08-01") is True


def test_pension_credit_condition_segments_the_2020_21_fiscal_year():
"""The fiscal year has 117 unrestricted and 248 restricted days."""
system = CountryTaxBenefitSystem()
aged_rules = system.parameters.gov.dcms.bbc.tv_licence.discount.aged
segments = list(fiscal_year_segments(aged_rules, 2020))

unrestricted_share = sum(
share for rules, share in segments if not rules.must_claim_pc
)
restricted_share = sum(share for rules, share in segments if rules.must_claim_pc)

assert unrestricted_share == pytest.approx(117 / 365)
assert restricted_share == pytest.approx(248 / 365)
assert all(isinstance(rules.must_claim_pc, bool) for rules, _ in segments)


def test_year_keyed_minimum_age_reform_applies_to_one_fiscal_year():
"""A bare-year age reform must not be split across adjacent years."""
years = (2024, 2025, 2026)
situation = {
"people": {
"person": {
"age": {str(year): 72 for year in years},
},
},
"benunits": {
"benunit": {
"members": ["person"],
"pension_credit": {str(year): 1 for year in years},
},
},
"households": {
"household": {
"members": ["person"],
},
},
}
reform = {
"gov.dcms.bbc.tv_licence.discount.aged.min_age": {"2025": 70},
}
simulation = Simulation(situation=situation, reform=reform)

discounts = [simulation.calculate("tv_licence_discount", year)[0] for year in years]

assert discounts == pytest.approx([0, 1, 0])
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from policyengine_uk.model_api import *
from policyengine_uk.utils.excise import fiscal_year_segments


class tv_licence_discount(Variable):
Expand All @@ -9,20 +10,27 @@ class tv_licence_discount(Variable):
unit = "/1"
reference = (
"https://www.legislation.gov.uk/ukpga/2003/21/section/365A",
"https://www.tvlicensing.co.uk/reducedfee",
"https://www.gov.uk/government/news/bbc-and-governments-joint-statement-on-delaying-the-tv-licence-fee-for-over-75s",
"https://www.gov.uk/free-discount-tv-licence",
)

def formula(household, period, parameters):
person = household.members
tv_licence = parameters(period).gov.dcms.bbc.tv_licence

# Aged discount
aged = person("age", period) >= tv_licence.discount.aged.min_age
has_aged = household.any(aged)
claims_pc = add(household, period, ["pension_credit"]) > 0
meets_pc_requirement = not_(tv_licence.discount.aged.must_claim_pc) | claims_pc
eligible_for_aged_discount = has_aged & meets_pc_requirement
aged_discount = eligible_for_aged_discount * tv_licence.discount.aged.discount
aged_discount = 0
for aged_rules, share in fiscal_year_segments(
parameters.gov.dcms.bbc.tv_licence.discount.aged,
period.start.year,
):
aged = person("age", period) >= aged_rules.min_age
has_aged = household.any(aged)
meets_pc_requirement = not_(aged_rules.must_claim_pc) | claims_pc
aged_discount += (
has_aged * meets_pc_requirement * aged_rules.discount * share
)

# Blind discount
is_blind = person("is_blind", period)
Expand Down
Loading