From f4dfa30c0da186ceffe020a0b8bf86324972ddb1 Mon Sep 17 00:00:00 2001 From: Anthony Volk <14987227+anth-volk@users.noreply.github.com> Date: Mon, 5 Oct 2026 22:25:38 +0400 Subject: [PATCH] Limit free TV licences to Pension Credit benefit units --- changelog.d/2150.fixed.md | 1 + .../gov/dcms/bbc/tv_licence_discount.yaml | 95 +++++++++++++++++++ .../tv_licence_free_licence_share.py | 16 +++- 3 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 changelog.d/2150.fixed.md diff --git a/changelog.d/2150.fixed.md b/changelog.d/2150.fixed.md new file mode 100644 index 0000000000..cef6c44e33 --- /dev/null +++ b/changelog.d/2150.fixed.md @@ -0,0 +1 @@ +- Correct the free TV licence discount so the over-75 person and Pension Credit recipient must belong to the same benefit unit. diff --git a/policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv_licence_discount.yaml b/policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv_licence_discount.yaml index e3f117baa7..b73ea36530 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv_licence_discount.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv_licence_discount.yaml @@ -79,3 +79,98 @@ is_blind: false output: tv_licence_discount: 0 + +- name: Separate benefit units do not combine age and Pension Credit. + period: 2023 + input: + people: + older_person: + age: 75 + pension_credit_recipient: + age: 70 + benunits: + older_person_benunit: + members: [older_person] + pension_credit: 0 + recipient_benunit: + members: [pension_credit_recipient] + pension_credit: 1 + households: + household: + members: [older_person, pension_credit_recipient] + output: + tv_licence_discount: 0 + +- name: Partners combine age and Pension Credit within one benefit unit. + period: 2023 + input: + people: + older_partner: + age: 75 + pension_credit_recipient: + age: 70 + benunits: + couple: + members: [older_partner, pension_credit_recipient] + pension_credit: 1 + households: + household: + members: [older_partner, pension_credit_recipient] + output: + tv_licence_discount: 1 + +- name: Separate benefit units retain only the unrestricted 2020 free licence share. + period: 2020 + absolute_error_margin: 0.01 + input: + people: + older_person: + age: 75 + is_blind: false + pension_credit_recipient: + age: 70 + benunits: + older_benunit: + members: [older_person] + pension_credit: 0 + recipient_benunit: + members: [pension_credit_recipient] + pension_credit: 1 + households: + household: + members: [older_person, pension_credit_recipient] + tv_licence_required: true + would_evade_tv_licence_fee: false + output: + tv_licence_free_licence_share: 0.3205479452 + tv_licence_discount: 0.3205479452 + free_tv_licence_value: 50.49 + tv_licence: 107.01 + +- name: Separate benefit units do not extend the 2020 free share for a blind older person. + period: 2020 + absolute_error_margin: 0.01 + input: + people: + older_person: + age: 75 + is_blind: true + pension_credit_recipient: + age: 70 + benunits: + older_benunit: + members: [older_person] + pension_credit: 0 + recipient_benunit: + members: [pension_credit_recipient] + pension_credit: 1 + households: + household: + members: [older_person, pension_credit_recipient] + tv_licence_required: true + would_evade_tv_licence_fee: false + output: + tv_licence_free_licence_share: 0.3205479452 + tv_licence_discount: 0.6602739726 + free_tv_licence_value: 50.49 + tv_licence: 53.51 diff --git a/policyengine_uk/variables/gov/dcms/bbc/tv_licence/tv_licence_free_licence_share.py b/policyengine_uk/variables/gov/dcms/bbc/tv_licence/tv_licence_free_licence_share.py index 5be64444cc..d31010e204 100644 --- a/policyengine_uk/variables/gov/dcms/bbc/tv_licence/tv_licence_free_licence_share.py +++ b/policyengine_uk/variables/gov/dcms/bbc/tv_licence/tv_licence_free_licence_share.py @@ -6,7 +6,9 @@ class tv_licence_free_licence_share(Variable): label = "Share of the year covered by a free TV licence" documentation = ( "Share of the year for which the household qualifies for the complete " - "age-based TV licence exemption. This excludes the blind discount." + "age-based TV licence exemption. Where Pension Credit is required, " + "the qualifying older person must belong to the recipient's benefit " + "unit. This excludes the blind discount." ) entity = Household definition_period = YEAR @@ -14,20 +16,26 @@ class tv_licence_free_licence_share(Variable): unit = "/1" reference = ( "https://www.legislation.gov.uk/ukpga/2003/21/section/365A", + "https://www.legislation.gov.uk/uksi/2022/693/pdfs/uksi_20220693_en.pdf", "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", + "https://www.gov.uk/government/publications/pension-credit-technical-guidance/a-detailed-guide-to-pension-credit-for-advisers-and-others", + "https://www.nidirect.gov.uk/articles/free-tv-licences", + "https://www.legislation.gov.uk/uksi/2004/692/regulation/5", ) def formula(household, period, parameters): person = household.members - claims_pc = add(household, period, ["pension_credit"]) > 0 + receives_pc = person.benunit("pension_credit", period) > 0 free_licence_share = 0 for aged_rules, share in fiscal_year_segments( parameters.gov.dcms.bbc.tv_licence.discount.aged, period.start.year, ): - has_aged = household.any(person("age", period) >= aged_rules.min_age) - meets_pc_requirement = not_(aged_rules.must_claim_pc) | claims_pc + aged = person("age", period) >= aged_rules.min_age + has_aged = household.any(aged) + has_aged_with_pc = household.any(aged & receives_pc) + meets_pc_requirement = not_(aged_rules.must_claim_pc) | has_aged_with_pc free_licence_share += ( has_aged * meets_pc_requirement * aged_rules.discount * share )