From aad4007b1468083a9d22737e2ea58d832d93bf9c Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Thu, 13 Feb 2025 15:30:29 +0100 Subject: [PATCH] Edit main py files and add unit tests --- .../{expense_rate.yaml => funding_rate.yaml} | 4 - .../{hour_by_age.yaml => hours.yaml} | 3 +- ...s.yaml => max_income_for_tax_credits.yaml} | 0 ...l => max_income_for_universal_credit.yaml} | 0 .../combine_benefits.yaml | 154 ++++++++++++++++++ .../funding.yaml | 77 +++++++++ .../targeted_childcare_entitlement/hours.yaml | 70 ++++++++ ...hildcare_entitlement_combine_benefits.yaml | 99 ----------- ...ted_childcare_entitlement_eligibility.yaml | 66 -------- .../targeted_childcare_entitlement_hours.yaml | 31 ---- .../targeted_childcare_entitlement.py | 17 ++ ..._childcare_entitlement_combine_benefits.py | 51 ------ .../targeted_childcare_entitlement_hours.py | 11 +- ...ed_childcare_entitlement_meets_benefits.py | 35 ++++ 14 files changed, 357 insertions(+), 261 deletions(-) rename policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/{expense_rate.yaml => funding_rate.yaml} (54%) rename policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/{hour_by_age.yaml => hours.yaml} (96%) rename policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/{income_threshold_with_tax_credits.yaml => max_income_for_tax_credits.yaml} (100%) rename policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/{income_threshold_with_universal_credit.yaml => max_income_for_universal_credit.yaml} (100%) create mode 100644 policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/combine_benefits.yaml create mode 100644 policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/funding.yaml create mode 100644 policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/hours.yaml delete mode 100644 policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_combine_benefits.yaml delete mode 100644 policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_eligibility.yaml delete mode 100644 policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_hours.yaml create mode 100644 policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement.py delete mode 100644 policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_combine_benefits.py create mode 100644 policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_meets_benefits.py diff --git a/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/expense_rate.yaml b/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/funding_rate.yaml similarity index 54% rename from policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/expense_rate.yaml rename to policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/funding_rate.yaml index d386614e4..85461e921 100644 --- a/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/expense_rate.yaml +++ b/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/funding_rate.yaml @@ -5,10 +5,6 @@ metadata: amount_unit: currency-GBP label: Targeted childcare entitlement hourly rates reference: - - title: Different rates for targeted childcare entitlement - href: - - https://www.nurseryworld.co.uk/content/news/dfe-confirms-extended-30-hours-funding-rates-but-sector-says-they-dont-reflect-the-real-delivery-cost/ - - https://www.gov.uk/government/news/childcare-settings-receive-cash-boost-as-funding-rates-increase - title: Commons Library href: https://commonslibrary.parliament.uk/research-briefings/cbp-8052/ values: diff --git a/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/hour_by_age.yaml b/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/hours.yaml similarity index 96% rename from policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/hour_by_age.yaml rename to policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/hours.yaml index 70117f281..d78384653 100644 --- a/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/hour_by_age.yaml +++ b/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/hours.yaml @@ -1,7 +1,8 @@ description: The Department for Education provides targeted childcare entitlement in England. metadata: - type: scale + type: single_amount threshold_unit: year + amount_unit: hour label: "Age eligibility for targeted 2-year-old childcare entitlement" reference: - title: The Local Authority (Duty to Secure Early Years Provision Free of Charge) Regulations 2014 - regulation 3 diff --git a/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/income_threshold_with_tax_credits.yaml b/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/max_income_for_tax_credits.yaml similarity index 100% rename from policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/income_threshold_with_tax_credits.yaml rename to policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/max_income_for_tax_credits.yaml diff --git a/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/income_threshold_with_universal_credit.yaml b/policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/max_income_for_universal_credit.yaml similarity index 100% rename from policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/income_threshold_with_universal_credit.yaml rename to policyengine_uk/parameters/gov/dwp/targeted_childcare_entitlement/max_income_for_universal_credit.yaml diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/combine_benefits.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/combine_benefits.yaml new file mode 100644 index 000000000..6bc1bf368 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/combine_benefits.yaml @@ -0,0 +1,154 @@ +- name: Eligible with JSA - couple + period: 2025 + input: + people: + adult1: + total_income: 10000 + social_security_income: 0 + adult2: + total_income: 5000 + social_security_income: 0 + benunits: + benunit: + members: ["adult1", "adult2"] + jsa_income: 100 + esa_income: 0 + universal_credit: 0 + is_guarantee_credit_eligible: false + child_tax_credit: 0 + working_tax_credit: 0 + output: + targeted_childcare_entitlement_meets_benefits: [true] + +- name: Eligible with UC under income threshold - family + period: 2025 + input: + people: + parent: + total_income: 15000 + social_security_income: 5000 # Makes adjusted income = 10000 + child: + total_income: 0 + social_security_income: 0 + benunits: + benunit: + members: ["parent", "child"] + jsa_income: 0 + esa_income: 0 + universal_credit: 100 + is_guarantee_credit_eligible: false + child_tax_credit: 0 + working_tax_credit: 0 + output: + targeted_childcare_entitlement_meets_benefits: [true] + +- name: Eligible with tax credits under income threshold - large family + period: 2025 + input: + people: + parent1: + total_income: 10000 + social_security_income: 0 + parent2: + total_income: 6000 + social_security_income: 0 + child1: + total_income: 0 + social_security_income: 0 + child2: + total_income: 0 + social_security_income: 0 + benunits: + benunit: + members: ["parent1", "parent2", "child1", "child2"] + jsa_income: 0 + esa_income: 0 + universal_credit: 0 + is_guarantee_credit_eligible: false + child_tax_credit: 100 + working_tax_credit: 0 + output: + targeted_childcare_entitlement_meets_benefits: [true] + +- name: Ineligible due to high income with UC + period: 2025 + input: + people: + adult1: + total_income: 250000 + benunits: + benunit: + members: ["adult1"] + universal_credit: 10000 + jsa_income: 0 + output: + targeted_childcare_entitlement_meets_benefits: [false] + +- name: Ineligible with no qualifying benefits - family + period: 2025 + input: + people: + parent: + total_income: 10000 + social_security_income: 0 + child1: + total_income: 0 + social_security_income: 0 + child2: + total_income: 0 + social_security_income: 0 + benunits: + benunit: + members: ["parent", "child1", "child2"] + jsa_income: 0 + esa_income: 0 + universal_credit: 0 + is_guarantee_credit_eligible: false + child_tax_credit: 0 + working_tax_credit: 0 + output: + targeted_childcare_entitlement_meets_benefits: [false] + +- name: Eligible with ESA - couple + period: 2025 + input: + people: + adult1: + total_income: 8000 + social_security_income: 0 + adult2: + total_income: 7000 + social_security_income: 0 + benunits: + benunit: + members: ["adult1", "adult2"] + jsa_income: 0 + esa_income: 100 + universal_credit: 0 + is_guarantee_credit_eligible: false + child_tax_credit: 0 + working_tax_credit: 0 + output: + targeted_childcare_entitlement_meets_benefits: [true] + +- name: Eligible with pension credit - couple + period: 2025 + input: + people: + adult1: + total_income: 8000 + social_security_income: 0 + adult2: + total_income: 7000 + social_security_income: 0 + benunits: + benunit: + members: ["adult1", "adult2"] + jsa_income: 0 + esa_income: 0 + universal_credit: 0 + is_guarantee_credit_eligible: true + child_tax_credit: 0 + working_tax_credit: 0 + output: + targeted_childcare_entitlement_meets_benefits: [true] \ No newline at end of file diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/funding.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/funding.yaml new file mode 100644 index 000000000..23ce14267 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/funding.yaml @@ -0,0 +1,77 @@ +- name: Child aged 2 with benefits eligibility + period: 2024 + input: + people: + child: + age: 2 + targeted_childcare_entitlement_hours: 570 + benunits: + benunit: + members: ["child"] + output: + targeted_childcare_entitlement: [4719.60] + +- name: Child aged 3 not eligible + period: 2024 + input: + people: + child: + age: 3 + targeted_childcare_entitlement_hours: 0 + benunits: + benunit: + members: ["child"] + output: + targeted_childcare_entitlement: [0] + +- name: Child aged 4 not eligible + period: 2024 + input: + people: + child: + age: 4 + targeted_childcare_entitlement_hours: 0 + benunits: + benunit: + members: ["child"] + output: + targeted_childcare_entitlement: [0] + +- name: Multiple children different ages + period: 2024 + input: + people: + parent: + age: 35 + child1: + age: 2 + targeted_childcare_entitlement_hours: 570 + child2: + age: 3 + targeted_childcare_entitlement_hours: 0 + child3: + age: 4 + targeted_childcare_entitlement_hours: 0 + benunits: + benunit: + members: ["parent", "child1", "child2", "child3"] + output: + targeted_childcare_entitlement: [0, 4719.60, 0, 0] + +- name: Family with twins both age 2 + period: 2024 + input: + people: + parent: + age: 35 + twin1: + age: 2 + targeted_childcare_entitlement_hours: 570 + twin2: + age: 2 + targeted_childcare_entitlement_hours: 570 + benunits: + benunit: + members: ["parent", "twin1", "twin2"] + output: + targeted_childcare_entitlement: [0, 4719.60, 4719.60] \ No newline at end of file diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/hours.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/hours.yaml new file mode 100644 index 000000000..0066559a8 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/hours.yaml @@ -0,0 +1,70 @@ +- name: fully eligible + period: 2025 + input: + people: + child: + age: 2 + benunits: + benunit: + members: ["child"] + targeted_childcare_entitlement_meets_benefits: true + output: + targeted_childcare_entitlement_hours: [570] + +- name: not eligible due to benefits + period: 2025 + input: + people: + child: + age: 2 + benunits: + benunit: + members: ["child"] + targeted_childcare_entitlement_meets_benefits: false + output: + targeted_childcare_entitlement_hours: [0] + +- name: not eligible due to age + period: 2025 + input: + people: + child: + age: 3 + benunits: + benunit: + members: ["child"] + targeted_childcare_entitlement_meets_benefits: true + output: + targeted_childcare_entitlement_hours: [0] + +- name: multiple children with mixed eligibility + period: 2025 + input: + people: + child1: + age: 2 + child2: + age: 3 + child3: + age: 4 + benunits: + benunit: + members: ["child1", "child2", "child3"] + targeted_childcare_entitlement_meets_benefits: true + output: + targeted_childcare_entitlement_hours: [570, 0, 0] + +- name: family with twins both eligible + period: 2025 + input: + people: + twin1: + age: 2 + twin2: + age: 2 + benunits: + benunit: + members: ["twin1", "twin2"] + targeted_childcare_entitlement_meets_benefits: true + output: + targeted_childcare_entitlement_hours: [570, 570] \ No newline at end of file diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_combine_benefits.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_combine_benefits.yaml deleted file mode 100644 index 1e26e0de6..000000000 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_combine_benefits.yaml +++ /dev/null @@ -1,99 +0,0 @@ -- name: eligible with JSA income - period: 2025 - input: - people: - adult: - total_income: 10000 - social_security_income: 5000 - dla: 0 - benunits: - benunit: - members: [adult] - jsa_income: 100 - esa_income: 0 - universal_credit: 0 - is_guarantee_credit_eligible: false - child_tax_credit: 0 - working_tax_credit: 0 - output: - targeted_childcare_entitlement_combine_benefits: true - -- name: eligible with universal credit low income - period: 2025 - input: - people: - adult: - total_income: 15000 - social_security_income: 0 - dla: 0 - benunits: - benunit: - members: [adult] - jsa_income: 0 - esa_income: 0 - universal_credit: 100 - is_guarantee_credit_eligible: false - child_tax_credit: 0 - working_tax_credit: 0 - output: - targeted_childcare_entitlement_combine_benefits: true - -- name: eligible with tax credits low income - period: 2025 - input: - people: - adult: - total_income: 16000 - social_security_income: 0 - dla: 0 - benunits: - benunit: - members: [adult] - jsa_income: 0 - esa_income: 0 - universal_credit: 0 - is_guarantee_credit_eligible: false - child_tax_credit: 100 - working_tax_credit: 0 - output: - targeted_childcare_entitlement_combine_benefits: true - -- name: ineligible high income with universal credit - period: 2025 - input: - people: - adult: - total_income: 20000 - social_security_income: 4600 # Setting this to ensure adjusted_income > threshold - dla: 0 - benunits: - benunit: - members: [adult] - jsa_income: 0 - esa_income: 0 - universal_credit: 0 # No UC receipt - is_guarantee_credit_eligible: false - child_tax_credit: 0 - working_tax_credit: 0 - output: - targeted_childcare_entitlement_combine_benefits: false - -- name: ineligible with no qualifying benefits - period: 2025 - input: - people: - adult: - total_income: 10000 - social_security_income: 0 - dla: 0 - benunits: - benunit: - members: [adult] - jsa_income: 0 - esa_income: 0 - universal_credit: 0 - is_guarantee_credit_eligible: false - child_tax_credit: 0 - working_tax_credit: 0 - output: - targeted_childcare_entitlement_combine_benefits: false \ No newline at end of file diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_eligibility.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_eligibility.yaml deleted file mode 100644 index a476d60c0..000000000 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_eligibility.yaml +++ /dev/null @@ -1,66 +0,0 @@ -- name: eligible child age 2 - period: 2025 - input: - people: - parent: - age: 30 - is_child: false - child: - age: 2 - is_child: true - benunits: - benunit: - members: [parent, child] - output: - targeted_childcare_entitlement_eligibility: true - -- name: ineligible child age 1 - period: 2025 - input: - people: - parent: - age: 30 - is_child: false - child: - age: 1 - is_child: true - benunits: - benunit: - members: [parent, child] - output: - targeted_childcare_entitlement_eligibility: false - -- name: ineligible child age 4 - period: 2025 - input: - people: - parent: - age: 30 - is_child: false - child: - age: 4 - is_child: true - benunits: - benunit: - members: [parent, child] - output: - targeted_childcare_entitlement_eligibility: false - -- name: multiple children one eligible - period: 2025 - input: - people: - parent: - age: 30 - is_child: false - child1: - age: 2 - is_child: true - child2: - age: 4 - is_child: true - benunits: - benunit: - members: [parent, child1, child2] - output: - targeted_childcare_entitlement_eligibility: true \ No newline at end of file diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_hours.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_hours.yaml deleted file mode 100644 index 0ccce97a9..000000000 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_hours.yaml +++ /dev/null @@ -1,31 +0,0 @@ -- name: fully eligible - period: 2025 - input: - targeted_childcare_entitlement_eligibility: true - targeted_childcare_entitlement_combine_benefits: true - output: - targeted_childcare_entitlement_hours: 570 - -- name: age eligible only - period: 2025 - input: - targeted_childcare_entitlement_eligibility: true - targeted_childcare_entitlement_combine_benefits: false - output: - targeted_childcare_entitlement_hours: 570 - -- name: benefits eligible only - period: 2025 - input: - targeted_childcare_entitlement_eligibility: false - targeted_childcare_entitlement_combine_benefits: true - output: - targeted_childcare_entitlement_hours: 570 - -- name: not eligible - period: 2025 - input: - targeted_childcare_entitlement_eligibility: false - targeted_childcare_entitlement_combine_benefits: false - output: - targeted_childcare_entitlement_hours: 0 \ No newline at end of file diff --git a/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement.py b/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement.py new file mode 100644 index 000000000..923606a63 --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement.py @@ -0,0 +1,17 @@ +from policyengine_uk.model_api import * + + +class targeted_childcare_entitlement(Variable): + value_type = float + entity = Person + label = "targeted childcare entitlement amount per year" + definition_period = YEAR + unit = "currency-GBP" + + def formula(person, period, parameters): + # Get the hours entitled for this child + hours = person("targeted_childcare_entitlement_hours", period) + + # Get the funding rate from parameters + p = parameters(period).gov.dwp.targeted_childcare_entitlement + return hours * p.funding_rate diff --git a/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_combine_benefits.py b/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_combine_benefits.py deleted file mode 100644 index 110fe42ff..000000000 --- a/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_combine_benefits.py +++ /dev/null @@ -1,51 +0,0 @@ -from policyengine_uk.model_api import * - - -class targeted_childcare_entitlement_combine_benefits(Variable): - value_type = bool - entity = BenUnit - label = "Eligible for targeted childcare entitlement based on benefits" - definition_period = YEAR - # details for implementation: https://www.gov.uk/help-with-childcare-costs/free-childcare-2-year-olds-claim-benefits?step-by-step-nav=f237ec8e-e82c-4ffa-8fba-2a88a739783b - - def formula(benunit, period, parameters): - # Calculate total income for the benefit unit - benunit_income = benunit.sum(benunit.members("total_income", period)) - # Calculate benefits income to exclude from Universal Credit calculation - benefits_income = benunit.sum( - benunit.members("social_security_income", period) - ) - # Income excluding benefits for Universal Credit threshold check - adjusted_income = benunit_income - benefits_income - - p = parameters(period).gov.dwp.targeted_childcare_entitlement - - # Check if receiving any qualifying benefits - qualifying_benefits = add( - benunit, - period, - p.qualifying_benefits, - ) - - # Combine CTC + WTC - ctc_wtc = add(benunit, period, ["child_tax_credit", "working_tax_credit"]) - receives_ctc_wtc = ctc_wtc > 0 - - # Universal credit receipt specifically for income test - receives_universal_credit = benunit("universal_credit", period) > 0 - - # Check Universal Credit with income threshold - meets_universal_credit_income = receives_universal_credit & ( - adjusted_income <= p.income_threshold_with_universal_credit - ) - - # Check Tax Credits with income threshold - meets_tax_credits_income = (receives_ctc_wtc) & ( - benunit_income <= p.income_threshold_with_tax_credits - ) - - return ( - (qualifying_benefits > 0) # Any qualifying benefit - | meets_universal_credit_income # Universal Credit with income threshold - | meets_tax_credits_income # Tax Credits with income threshold - ) diff --git a/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_hours.py b/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_hours.py index 84f049689..f7a16ac89 100644 --- a/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_hours.py +++ b/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_hours.py @@ -7,16 +7,9 @@ class targeted_childcare_entitlement_hours(Variable): label = "Targeted childcare entitlement hours per year" definition_period = YEAR unit = "hour" + defined_for = "targeted_childcare_entitlement_meets_benefits" def formula(person, period, parameters): p = parameters(period).gov.dwp.targeted_childcare_entitlement - # 1) Does the person's benefit unit meet targeted childcare entitlement criteria? - targeted_eligible = person.benunit("targeted_childcare_entitlement_combine_benefits", period) - - # 2) Calculate hours based on age using your bracket structure - age = person("age", period) - hours_by_age = p.hours_by_age.calc(age) # rename as needed if your YAML's param is different - - # 3) If the benefit unit is eligible, return hours_by_age; otherwise 0 - return where(targeted_eligible, hours_by_age, 0) + return p.hours.calc(person("age", period)) diff --git a/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_meets_benefits.py b/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_meets_benefits.py new file mode 100644 index 000000000..dc9e4d681 --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/targeted_childcare_entitlement/targeted_childcare_entitlement_meets_benefits.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * + + +class targeted_childcare_entitlement_meets_benefits(Variable): + value_type = bool + entity = BenUnit + label = "Eligible for targeted childcare entitlement based on benefits" + definition_period = YEAR + # https://www.gov.uk/help-with-childcare-costs/free-childcare-2-year-olds-claim-benefits + + def formula(benunit, period, parameters): + p = parameters(period).gov.dwp.targeted_childcare_entitlement + + # Check qualifying benefits + qualifying_benefits = add(benunit, period, p.qualifying_benefits) + + # Universal Credit check + uc = benunit("universal_credit", period) + uc_income = benunit.sum( + benunit.members("total_income", period) + ) - benunit.sum(benunit.members("social_security_income", period)) + meets_uc = (uc > 0) & (uc_income <= p.max_income_for_universal_credit) + + # Tax Credits check + tc = add(benunit, period, ["child_tax_credit", "working_tax_credit"]) + meets_tc = (tc > 0) & ( + benunit.sum(benunit.members("total_income", period)) + <= p.max_income_for_tax_credits + ) + + return where( + uc > 0, + meets_uc, + where(tc, meets_tc, qualifying_benefits > 0), + )