From 71bfdf786e5e270c8659d6e6ec83e96b9fa4e0cd Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 7 Apr 2026 10:21:55 -0400 Subject: [PATCH 1/2] Add qualifying provider check for tax-free childcare --- ...ldcare-qualifying-provider-checks.fixed.md | 1 + .../tax_free_childcare.yaml | 13 ++++- .../tax_free_childcare_eligibility.yaml | 49 ++++++++++++++++++- .../tax_free_childcare/tax_free_childcare.py | 6 ++- ...free_childcare_uses_qualifying_provider.py | 13 +++++ 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 changelog.d/tax-free-childcare-qualifying-provider-checks.fixed.md create mode 100644 policyengine_uk/variables/input/consumption/tax_free_childcare_uses_qualifying_provider.py diff --git a/changelog.d/tax-free-childcare-qualifying-provider-checks.fixed.md b/changelog.d/tax-free-childcare-qualifying-provider-checks.fixed.md new file mode 100644 index 000000000..62b02b361 --- /dev/null +++ b/changelog.d/tax-free-childcare-qualifying-provider-checks.fixed.md @@ -0,0 +1 @@ +Tax-Free Childcare now requires childcare expenses to be paid to a qualifying provider when that input is supplied. diff --git a/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare.yaml b/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare.yaml index 0ffd2b1ae..6e45a568a 100644 --- a/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare.yaml @@ -67,4 +67,15 @@ is_disabled_for_benefits: false childcare_expenses: 1_000 output: - tax_free_childcare: 250 \ No newline at end of file + tax_free_childcare: 250 + +- name: Non-qualifying provider gets no support + period: 2025 + input: + tax_free_childcare_eligible: true + is_parent: false + is_disabled_for_benefits: false + childcare_expenses: 10_000 + tax_free_childcare_uses_qualifying_provider: false + output: + tax_free_childcare: 0 diff --git a/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare_eligibility.yaml b/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare_eligibility.yaml index d6c77232a..34699baf1 100644 --- a/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare_eligibility.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare_eligibility.yaml @@ -40,6 +40,54 @@ output: tax_free_childcare_eligible: false +- name: Fails qualifying provider condition only + period: 2025 + input: + people: + parent: + age: 30 + is_parent: true + tax_free_childcare_meets_income_requirements: true + child: + age: 4 + childcare_expenses: 10_000 + tax_free_childcare_child_age_eligible: true + tax_free_childcare_uses_qualifying_provider: false + benunits: + benunit: + members: [parent, child] + tax_free_childcare_program_eligible: true + tax_free_childcare_work_condition: true + households: + household: + members: [parent, child] + output: + tax_free_childcare_eligible: [false, false] + +- name: Qualifying provider flag does not block zero-expense cases + period: 2025 + input: + people: + parent: + age: 30 + is_parent: true + tax_free_childcare_meets_income_requirements: true + child: + age: 4 + childcare_expenses: 0 + tax_free_childcare_child_age_eligible: true + tax_free_childcare_uses_qualifying_provider: false + benunits: + benunit: + members: [parent, child] + tax_free_childcare_program_eligible: true + tax_free_childcare_work_condition: true + households: + household: + members: [parent, child] + output: + tax_free_childcare_eligible: [true, true] + - name: Fails all conditions period: 2025 input: @@ -49,4 +97,3 @@ tax_free_childcare_work_condition: false output: tax_free_childcare_eligible: false - diff --git a/policyengine_uk/variables/gov/hmrc/tax_free_childcare/tax_free_childcare.py b/policyengine_uk/variables/gov/hmrc/tax_free_childcare/tax_free_childcare.py index 4856717ab..6068952e7 100644 --- a/policyengine_uk/variables/gov/hmrc/tax_free_childcare/tax_free_childcare.py +++ b/policyengine_uk/variables/gov/hmrc/tax_free_childcare/tax_free_childcare.py @@ -24,9 +24,13 @@ def formula(person, period, parameters): # Get childcare expenses childcare_expense = person("childcare_expenses", period) + uses_qualifying_provider = person( + "tax_free_childcare_uses_qualifying_provider", period + ) + eligible_childcare_expense = childcare_expense * uses_qualifying_provider # Calculate contribution using rate from parameters - contribution = (childcare_expense * p.rate) / (1 - p.rate) + contribution = (eligible_childcare_expense * p.rate) / (1 - p.rate) # Cap the contribution at the maximum amounts max_amount = ( diff --git a/policyengine_uk/variables/input/consumption/tax_free_childcare_uses_qualifying_provider.py b/policyengine_uk/variables/input/consumption/tax_free_childcare_uses_qualifying_provider.py new file mode 100644 index 000000000..8b49ecf0d --- /dev/null +++ b/policyengine_uk/variables/input/consumption/tax_free_childcare_uses_qualifying_provider.py @@ -0,0 +1,13 @@ +from policyengine_uk.model_api import * + + +class tax_free_childcare_uses_qualifying_provider(Variable): + label = "Tax-Free Childcare uses a qualifying childcare provider" + documentation = ( + "Whether this person's childcare expenses are paid to a qualifying " + "childcare provider for Tax-Free Childcare purposes." + ) + entity = Person + definition_period = YEAR + value_type = bool + default_value = True From 3b70486652fa84561de8bbc7a8d2f34a5f76879f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 7 Apr 2026 10:24:55 -0400 Subject: [PATCH 2/2] Remove invalid tax-free childcare eligibility cases --- .../tax_free_childcare_eligibility.yaml | 48 ------------------- 1 file changed, 48 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare_eligibility.yaml b/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare_eligibility.yaml index 34699baf1..2a7857504 100644 --- a/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare_eligibility.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/hmrc/tax_free_childcare/tax_free_childcare_eligibility.yaml @@ -40,54 +40,6 @@ output: tax_free_childcare_eligible: false -- name: Fails qualifying provider condition only - period: 2025 - input: - people: - parent: - age: 30 - is_parent: true - tax_free_childcare_meets_income_requirements: true - child: - age: 4 - childcare_expenses: 10_000 - tax_free_childcare_child_age_eligible: true - tax_free_childcare_uses_qualifying_provider: false - benunits: - benunit: - members: [parent, child] - tax_free_childcare_program_eligible: true - tax_free_childcare_work_condition: true - households: - household: - members: [parent, child] - output: - tax_free_childcare_eligible: [false, false] - -- name: Qualifying provider flag does not block zero-expense cases - period: 2025 - input: - people: - parent: - age: 30 - is_parent: true - tax_free_childcare_meets_income_requirements: true - child: - age: 4 - childcare_expenses: 0 - tax_free_childcare_child_age_eligible: true - tax_free_childcare_uses_qualifying_provider: false - benunits: - benunit: - members: [parent, child] - tax_free_childcare_program_eligible: true - tax_free_childcare_work_condition: true - households: - household: - members: [parent, child] - output: - tax_free_childcare_eligible: [true, true] - - name: Fails all conditions period: 2025 input: