policyengine-uk 2.40.1__py3-none-any.whl → 2.65.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- policyengine_uk/__init__.py +5 -3
- policyengine_uk/data/__init__.py +1 -0
- policyengine_uk/data/dataset_schema.py +70 -18
- policyengine_uk/data/economic_assumptions.py +36 -10
- policyengine_uk/data/filter_dataset.py +52 -0
- policyengine_uk/dynamics/labour_supply.py +343 -0
- policyengine_uk/dynamics/participation.py +629 -0
- policyengine_uk/dynamics/progression.py +384 -0
- policyengine_uk/microsimulation.py +105 -0
- policyengine_uk/model_api.py +1 -0
- policyengine_uk/parameters/gov/boe/base_rate.yaml +34 -0
- policyengine_uk/parameters/gov/boe/index.yaml +2 -0
- policyengine_uk/parameters/gov/contrib/behavioral_responses/employee_salary_sacrifice_reduction_rate.yaml +14 -0
- policyengine_uk/parameters/gov/contrib/behavioral_responses/salary_sacrifice_broad_base_haircut_rate.yaml +22 -0
- policyengine_uk/parameters/gov/contrib/cec/state_pension_increase.yaml +1 -1
- policyengine_uk/parameters/gov/contrib/ubi_center/carbon_tax.yaml +2 -2
- policyengine_uk/parameters/gov/contrib/ubi_center/land_value_tax.yaml +3 -3
- policyengine_uk/parameters/gov/dcms/bbc/tv_licence/colour.yaml +5 -5
- policyengine_uk/parameters/gov/dfe/education_spending.yaml +1 -1
- policyengine_uk/parameters/gov/dft/rail/fare_index.yaml +32 -0
- policyengine_uk/parameters/gov/dft/rail/prior_law_fare_index.yaml +32 -0
- policyengine_uk/parameters/gov/dft/rail/ridership_index.yaml +30 -0
- policyengine_uk/parameters/gov/dft/spending.yaml +2 -2
- policyengine_uk/parameters/gov/dwp/ESA/income/earn_disregard.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/ESA/income/income_disregard_couple.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/ESA/income/income_disregard_lone_parent.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/ESA/income/income_disregard_single.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/ESA/income/pension_disregard.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/IIDB/maximum.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/JSA/contrib/amount_over_25.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/JSA/contrib/earn_disregard.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/JSA/contrib/pension_disregard.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/JSA/income/amount_18_24.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/JSA/income/amount_over_25.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/JSA/income/income_disregard_couple.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/JSA/income/income_disregard_lone_parent.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/JSA/income/income_disregard_single.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/LHA/shared_accommodation_age_threshold.yaml +12 -0
- policyengine_uk/parameters/gov/dwp/attendance_allowance/higher.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/attendance_allowance/lower.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/benefit_cap.yaml +3 -3
- policyengine_uk/parameters/gov/dwp/carer_premium/couple.yaml +2 -2
- policyengine_uk/parameters/gov/dwp/carer_premium/single.yaml +6 -6
- policyengine_uk/parameters/gov/dwp/carers_allowance/rate.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/disability_premia/disability_couple.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_couple.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_single.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/disability_premia/severe_couple.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/dla/mobility/higher.yaml +4 -4
- policyengine_uk/parameters/gov/dwp/dla/mobility/lower.yaml +8 -8
- policyengine_uk/parameters/gov/dwp/dla/self_care/higher.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/dla/self_care/lower.yaml +8 -8
- policyengine_uk/parameters/gov/dwp/dla/self_care/middle.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/housing_benefit/allowances/lone_parent/aged.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/housing_benefit/allowances/lone_parent/older.yaml +3 -3
- policyengine_uk/parameters/gov/dwp/housing_benefit/allowances/single/aged.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/housing_benefit/allowances/single/older.yaml +3 -3
- policyengine_uk/parameters/gov/dwp/housing_benefit/means_test/income_disregard/worker.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/amount.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/housing_benefit/takeup.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/income_support/amounts/amount_16_24.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/income_support/amounts/amount_couples_over_18.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/income_support/means_test/earn_disregard.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/income_support/means_test/income_disregard_couple.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/income_support/means_test/income_disregard_lone_parent.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/income_support/means_test/income_disregard_single.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/income_support/means_test/pension_disregard.yaml +1 -1
- policyengine_uk/parameters/gov/dwp/income_support/takeup.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/carer/addition.yaml +4 -4
- policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/minimum_guarantee.yaml +9 -9
- policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/severe_disability/addition.yaml +3 -3
- policyengine_uk/parameters/gov/dwp/pension_credit/savings_credit/threshold.yaml +5 -5
- policyengine_uk/parameters/gov/dwp/pip/daily_living/enhanced.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/pip/daily_living/standard.yaml +8 -8
- policyengine_uk/parameters/gov/dwp/pip/mobility/enhanced.yaml +4 -4
- policyengine_uk/parameters/gov/dwp/pip/mobility/standard.yaml +9 -9
- policyengine_uk/parameters/gov/dwp/sda/maximum.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/state_pension/basic_state_pension/amount.yaml +11 -11
- policyengine_uk/parameters/gov/dwp/state_pension/new_state_pension/amount.yaml +4 -4
- policyengine_uk/parameters/gov/dwp/tax_credits/child_tax_credit/limit/child_count.yaml +10 -1
- policyengine_uk/parameters/gov/dwp/tax_credits/child_tax_credit/takeup.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/tax_credits/working_tax_credit/takeup.yaml +7 -7
- policyengine_uk/parameters/gov/dwp/universal_credit/elements/carer/amount.yaml +3 -3
- policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/amount.yaml +2 -4
- policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/disabled/amount.yaml +2 -4
- policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/first/higher_amount.yaml +6 -8
- policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/limit/child_count.yaml +6 -1
- policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/severely_disabled/amount.yaml +3 -5
- policyengine_uk/parameters/gov/dwp/universal_credit/elements/childcare/cap.yaml +2 -6
- policyengine_uk/parameters/gov/dwp/universal_credit/elements/disabled/amount.yaml +4 -6
- policyengine_uk/parameters/gov/dwp/universal_credit/elements/housing/non_dep_deduction/amount.yaml +4 -1
- policyengine_uk/parameters/gov/dwp/universal_credit/rebalancing/active.yaml +9 -0
- policyengine_uk/parameters/gov/dwp/universal_credit/rebalancing/new_claimant_health_element.yaml +9 -0
- policyengine_uk/parameters/gov/dwp/universal_credit/rebalancing/standard_allowance_uplift.yaml +13 -0
- policyengine_uk/parameters/gov/dwp/universal_credit/standard_allowance/amount.yaml +5 -5
- policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/maximum_taxable_income.yaml +2 -1
- policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/use_maximum_taxable_income.yaml +1 -0
- policyengine_uk/parameters/gov/dynamic/obr_labour_supply_assumptions.yaml +9 -0
- policyengine_uk/parameters/gov/economic_assumptions/create_economic_assumption_indices.py +1 -1
- policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml +522 -153
- policyengine_uk/parameters/gov/hmrc/cgt/additional_rate.yaml +5 -0
- policyengine_uk/parameters/gov/hmrc/cgt/basic_rate.yaml +5 -0
- policyengine_uk/parameters/gov/hmrc/cgt/higher_rate.yaml +4 -0
- policyengine_uk/parameters/gov/hmrc/child_benefit/amount/additional.yaml +6 -6
- policyengine_uk/parameters/gov/hmrc/child_benefit/amount/eldest.yaml +8 -8
- policyengine_uk/parameters/gov/hmrc/child_benefit/takeup/by_age.yaml +1 -1
- policyengine_uk/parameters/gov/hmrc/fuel_duty/calculate_fuel_duty_rates.py +464 -0
- policyengine_uk/parameters/gov/hmrc/fuel_duty/petrol_and_diesel.yaml +86 -10
- policyengine_uk/parameters/gov/hmrc/income_tax/allowances/personal_allowance/amount.yaml +6 -0
- policyengine_uk/parameters/gov/hmrc/income_tax/earned_taxable_income_exclusions.yaml +2 -1
- policyengine_uk/parameters/gov/hmrc/income_tax/income_tax_additions.yaml +1 -0
- policyengine_uk/parameters/gov/hmrc/income_tax/rates/dividends.yaml +12 -0
- policyengine_uk/parameters/gov/hmrc/income_tax/rates/property.yaml +46 -0
- policyengine_uk/parameters/gov/hmrc/income_tax/rates/savings.yaml +46 -0
- policyengine_uk/parameters/gov/hmrc/income_tax/rates/scotland/rates.yaml +2 -2
- policyengine_uk/parameters/gov/hmrc/income_tax/rates/uk.yaml +14 -2
- policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/rates/employee/additional.yaml +4 -6
- policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/rates/employer.yaml +3 -3
- policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/secondary_threshold.yaml +14 -4
- policyengine_uk/parameters/gov/hmrc/national_insurance/class_2/flat_rate.yaml +2 -2
- policyengine_uk/parameters/gov/hmrc/national_insurance/salary_sacrifice_pension_cap.yaml +16 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/index.yaml +12 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/plan_1/boe_margin.yaml +11 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/plan_2/additional_rate.yaml +27 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/plan_2/index.yaml +16 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/plan_2/upper_threshold.yaml +48 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/postgraduate_additional_rate.yaml +11 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/postgraduate_repayment_rate.yaml +9 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/repayment_rate.yaml +9 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/plan_1.yaml +25 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/plan_2.yaml +58 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/plan_4.yaml +19 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/plan_5.yaml +16 -0
- policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/postgraduate.yaml +21 -0
- policyengine_uk/parameters/gov/hmrc/vat/reduced_rate_share.yaml +3 -3
- policyengine_uk/parameters/gov/indices/private_rent_index.yaml +9 -9
- policyengine_uk/parameters/gov/revenue_scotland/lbtt/non_residential.yaml +2 -2
- policyengine_uk/parameters/gov/revenue_scotland/lbtt/rent.yaml +2 -2
- policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/first_time_buyer_rate.yaml +2 -2
- policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/rate.yaml +2 -2
- policyengine_uk/parameters/gov/wra/land_transaction_tax/non_residential.yaml +2 -2
- policyengine_uk/parameters/gov/wra/land_transaction_tax/rent.yaml +2 -2
- policyengine_uk/parameters/gov/wra/land_transaction_tax/residential/higher_rate.yaml +1 -1
- policyengine_uk/parameters/gov/wra/land_transaction_tax/residential/primary.yaml +2 -2
- policyengine_uk/parameters/household/consumption/carbon/consumption.yaml +8 -6
- policyengine_uk/parameters/household/consumption/carbon/intensity.yaml +4 -1
- policyengine_uk/parameters/household/consumption/carbon/production.yaml +12 -7
- policyengine_uk/parameters/household/consumption/carbon/production_by_source.yaml +76 -41
- policyengine_uk/parameters/household/consumption/fuel/prices/petrol.yaml +1 -1
- policyengine_uk/parameters/household/poverty/absolute_poverty_threshold_bhc.yaml +1 -1
- policyengine_uk/reforms/policyengine/adjust_budgets.py +0 -1
- policyengine_uk/scenarios/__init__.py +4 -0
- policyengine_uk/scenarios/pip_reform.py +23 -0
- policyengine_uk/scenarios/reindex_benefit_cap.py +32 -0
- policyengine_uk/scenarios/repeal_two_child_limit.py +10 -0
- policyengine_uk/scenarios/uc_reform.py +50 -0
- policyengine_uk/simulation.py +619 -0
- policyengine_uk/system.py +3 -257
- policyengine_uk/tax_benefit_system.py +141 -0
- policyengine_uk/tests/behavioral_responses/test_labor_supply_responses.yaml +183 -0
- policyengine_uk/tests/microsimulation/reforms_config.yaml +8 -8
- policyengine_uk/tests/microsimulation/test_reform_impacts.py +2 -2
- policyengine_uk/tests/microsimulation/test_salary_sacrifice_cap_reform.py +401 -0
- policyengine_uk/tests/microsimulation/test_validity.py +2 -3
- policyengine_uk/tests/microsimulation/update_reform_impacts.py +104 -40
- policyengine_uk/tests/policy/baseline/contrib/policyengine/employer_ni/employer_ni_fixed_employer_cost_change.yaml +105 -0
- policyengine_uk/tests/policy/baseline/finance/benefit/family/child_benefit.yaml +2 -0
- policyengine_uk/tests/policy/baseline/finance/benefit/family/income_support.yaml +0 -23
- policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv-licence/tv_licence.yaml +3 -0
- policyengine_uk/tests/policy/baseline/gov/dfe/extended_childcare_entitlement/extended_childcare_entitlement.yaml +17 -17
- policyengine_uk/tests/policy/baseline/gov/dwp/basic_state_pension.yaml +44 -0
- policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/allowances/gift_aid.yaml +71 -0
- policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/allowances/personal_allowance.yaml +161 -0
- policyengine_uk/tests/policy/baseline/gov/hmrc/national_insurance/salary_sacrifice_pension_ni_employee.yaml +107 -0
- policyengine_uk/tests/policy/baseline/gov/hmrc/national_insurance/salary_sacrifice_pension_ni_employer.yaml +95 -0
- policyengine_uk/tests/policy/baseline/gov/hmrc/student_loans/student_loan_interest_rate.yaml +153 -0
- policyengine_uk/tests/policy/baseline/gov/hmrc/student_loans/student_loan_repayment.yaml +130 -0
- policyengine_uk/tests/policy/baseline/household/wealth/vehicle.yaml +27 -0
- policyengine_uk/tests/policy/reforms/nov_2025_budget/income_source_tax_rates.yaml +235 -0
- policyengine_uk/tests/policy/reforms/nov_2025_budget/income_tax_freeze.yaml +83 -0
- policyengine_uk/tests/policy/reforms/parametric/basic_income/basic_income.yaml +1 -0
- policyengine_uk/tests/test_behavioral_responses.py +215 -0
- policyengine_uk/tests/test_fiscal_year_parameters.py +131 -0
- policyengine_uk/utils/__init__.py +1 -0
- policyengine_uk/utils/compare.py +28 -0
- policyengine_uk/utils/create_ahc_deflator.py +169 -0
- policyengine_uk/utils/create_triple_lock.py +1 -1
- policyengine_uk/utils/dependencies.py +259 -0
- policyengine_uk/utils/parameters.py +12 -1
- policyengine_uk/utils/scenario.py +225 -0
- policyengine_uk/utils/solve_private_school_attendance_factor.py +4 -6
- policyengine_uk/variables/contrib/policyengine/education_budget_change.py +0 -1
- policyengine_uk/variables/contrib/policyengine/employer_ni/baseline_employer_cost.py +5 -1
- policyengine_uk/variables/contrib/policyengine/employer_ni/employer_ni_fixed_employer_cost_change.py +23 -23
- policyengine_uk/variables/contrib/policyengine/employer_ni/employer_ni_response_capital_incidence.py +1 -1
- policyengine_uk/variables/contrib/policyengine/employer_ni/employer_ni_response_consumer_incidence.py +1 -1
- policyengine_uk/variables/contrib/policyengine/other_public_spending_budget_change.py +0 -1
- policyengine_uk/variables/gov/dfe/targeted_childcare_entitlement/targeted_childcare_entitlement_eligible.py +0 -1
- policyengine_uk/variables/gov/dft/rail_subsidy_spending.py +16 -1
- policyengine_uk/variables/gov/dft/rail_usage.py +16 -0
- policyengine_uk/variables/gov/dwp/BRMA_LHA_rate.py +7 -2
- policyengine_uk/variables/gov/dwp/LHA_category.py +4 -2
- policyengine_uk/variables/gov/dwp/additional_state_pension.py +4 -2
- policyengine_uk/variables/gov/dwp/basic_state_pension.py +26 -8
- policyengine_uk/variables/gov/dwp/is_CTC_eligible.py +1 -1
- policyengine_uk/variables/gov/dwp/is_benefit_cap_exempt.py +9 -13
- policyengine_uk/variables/gov/dwp/is_benefit_cap_exempt_earnings.py +66 -0
- policyengine_uk/variables/gov/dwp/is_benefit_cap_exempt_health_disability.py +75 -0
- policyengine_uk/variables/gov/dwp/is_benefit_cap_exempt_other.py +66 -0
- policyengine_uk/variables/gov/dwp/winter_fuel_allowance.py +5 -4
- policyengine_uk/variables/gov/gov_tax.py +0 -2
- policyengine_uk/variables/gov/hmrc/household_tax.py +0 -1
- policyengine_uk/variables/gov/hmrc/income_tax/allowances/gift_aid.py +23 -0
- policyengine_uk/variables/gov/hmrc/income_tax/allowances/personal_allowance.py +9 -2
- policyengine_uk/variables/gov/hmrc/income_tax/income_tax_pre_charges.py +1 -0
- policyengine_uk/variables/gov/hmrc/income_tax/liability/property_income_tax.py +75 -0
- policyengine_uk/variables/gov/hmrc/income_tax/liability/savings_income_tax.py +4 -4
- policyengine_uk/variables/gov/hmrc/national_insurance/salary_sacrifice_broad_base_haircut.py +43 -0
- policyengine_uk/variables/gov/hmrc/national_insurance/salary_sacrifice_pension_ni_employee.py +38 -0
- policyengine_uk/variables/gov/hmrc/national_insurance/salary_sacrifice_pension_ni_employer.py +27 -0
- policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_via_salary_sacrifice_adjusted.py +31 -0
- policyengine_uk/variables/gov/hmrc/pensions/salary_sacrifice_returned_to_income.py +41 -0
- policyengine_uk/variables/gov/hmrc/student_loans/__init__.py +2 -0
- policyengine_uk/variables/gov/hmrc/student_loans/plan_1_interest_rate.py +23 -0
- policyengine_uk/variables/gov/hmrc/student_loans/plan_2_interest_rate.py +31 -0
- policyengine_uk/variables/gov/hmrc/student_loans/plan_4_interest_rate.py +22 -0
- policyengine_uk/variables/gov/hmrc/student_loans/plan_5_interest_rate.py +18 -0
- policyengine_uk/variables/gov/hmrc/student_loans/postgraduate_interest_rate.py +23 -0
- policyengine_uk/variables/gov/hmrc/student_loans/student_loan_plan.py +27 -0
- policyengine_uk/variables/gov/hmrc/student_loans/student_loan_repayment.py +91 -0
- policyengine_uk/variables/gov/hmrc/student_loans/student_loan_repayment_rate.py +31 -0
- policyengine_uk/variables/gov/hmrc/would_claim_child_benefit.py +5 -1
- policyengine_uk/variables/household/demographic/benunit/benunit_count_adults.py +11 -0
- policyengine_uk/variables/household/demographic/is_disabled_for_benefits.py +13 -1
- policyengine_uk/variables/household/income/hbai_household_net_income.py +29 -1
- policyengine_uk/variables/household/income/hbai_household_net_income_ahc.py +13 -0
- policyengine_uk/variables/household/income/household_net_income.py +5 -1
- policyengine_uk/variables/household/income/inflation_adjustment.py +24 -0
- policyengine_uk/variables/household/post_tax_income.py +12 -0
- policyengine_uk/variables/household/wealth/num_vehicles.py +9 -0
- policyengine_uk/variables/household/wealth/owns_vehicle.py +17 -0
- policyengine_uk/variables/input/consumption/property/council_tax.py +0 -35
- policyengine_uk/variables/input/consumption/property/employee_pension_contributions.py +8 -1
- policyengine_uk/variables/input/consumption/property/employee_pension_contributions_reported.py +16 -0
- policyengine_uk/variables/input/consumption/property/pension_contributions_via_salary_sacrifice.py +16 -0
- policyengine_uk/variables/input/employment_income.py +2 -0
- policyengine_uk/variables/input/rent.py +0 -40
- policyengine_uk/variables/input/savings_interest_income.py +3 -1
- {policyengine_uk-2.40.1.dist-info → policyengine_uk-2.65.6.dist-info}/METADATA +17 -8
- {policyengine_uk-2.40.1.dist-info → policyengine_uk-2.65.6.dist-info}/RECORD +252 -173
- {policyengine_uk-2.40.1.dist-info → policyengine_uk-2.65.6.dist-info}/WHEEL +1 -1
- policyengine_uk/repo.py +0 -3
- policyengine_uk/tests/policy/baseline/gov/abolitions/abolition_parameters.yaml +0 -250
- policyengine_uk/variables/contrib/policyengine/high_income_incident_tax_change.py +0 -22
- policyengine_uk-2.40.1.data/data/share/openfisca/openfisca-country-template/CHANGELOG.md +0 -2285
- policyengine_uk-2.40.1.data/data/share/openfisca/openfisca-country-template/README.md +0 -37
- policyengine_uk-2.40.1.dist-info/licenses/LICENSE +0 -661
- {policyengine_uk-2.40.1.data/data/share/openfisca/openfisca-country-template → policyengine_uk-2.65.6.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
- name: No employer NI charge when salary sacrifice below £2,000 cap
|
|
2
|
+
period: 2025
|
|
3
|
+
absolute_error_margin: 0.01
|
|
4
|
+
input:
|
|
5
|
+
employment_income: 40_000
|
|
6
|
+
pension_contributions_via_salary_sacrifice: 1_500
|
|
7
|
+
gov.hmrc.national_insurance.salary_sacrifice_pension_cap: 2_000
|
|
8
|
+
gov.contrib.behavioral_responses.salary_sacrifice_broad_base_haircut_rate: 0
|
|
9
|
+
output:
|
|
10
|
+
salary_sacrifice_pension_ni_employer: 0
|
|
11
|
+
|
|
12
|
+
- name: Employer NI charge at 15% for moderate earner above cap
|
|
13
|
+
period: 2025
|
|
14
|
+
absolute_error_margin: 0.01
|
|
15
|
+
input:
|
|
16
|
+
employment_income: 45_000
|
|
17
|
+
pension_contributions_via_salary_sacrifice: 2_250
|
|
18
|
+
gov.hmrc.national_insurance.salary_sacrifice_pension_cap: 2_000
|
|
19
|
+
gov.contrib.behavioral_responses.salary_sacrifice_broad_base_haircut_rate: 0
|
|
20
|
+
output:
|
|
21
|
+
# £250 excess * 15% = £37.50
|
|
22
|
+
salary_sacrifice_pension_ni_employer: (2_250 - 2_000) * 0.15
|
|
23
|
+
|
|
24
|
+
- name: Employer NI charge at 15% for high earner with large excess
|
|
25
|
+
period: 2025
|
|
26
|
+
absolute_error_margin: 0.01
|
|
27
|
+
input:
|
|
28
|
+
employment_income: 125_000
|
|
29
|
+
pension_contributions_via_salary_sacrifice: 25_000
|
|
30
|
+
gov.hmrc.national_insurance.salary_sacrifice_pension_cap: 2_000
|
|
31
|
+
gov.contrib.behavioral_responses.salary_sacrifice_broad_base_haircut_rate: 0
|
|
32
|
+
output:
|
|
33
|
+
# £23,000 excess * 15% = £3,450
|
|
34
|
+
salary_sacrifice_pension_ni_employer: (25_000 - 2_000) * 0.15
|
|
35
|
+
|
|
36
|
+
- name: Employer NI charge for large salary sacrifice
|
|
37
|
+
period: 2025
|
|
38
|
+
absolute_error_margin: 0.01
|
|
39
|
+
input:
|
|
40
|
+
employment_income: 80_000
|
|
41
|
+
pension_contributions_via_salary_sacrifice: 15_000
|
|
42
|
+
gov.hmrc.national_insurance.salary_sacrifice_pension_cap: 2_000
|
|
43
|
+
gov.contrib.behavioral_responses.salary_sacrifice_broad_base_haircut_rate: 0
|
|
44
|
+
output:
|
|
45
|
+
# £13,000 excess * 15% = £1,950
|
|
46
|
+
salary_sacrifice_pension_ni_employer: (15_000 - 2_000) * 0.15
|
|
47
|
+
|
|
48
|
+
- name: No employer NI charge when exactly at cap
|
|
49
|
+
period: 2025
|
|
50
|
+
absolute_error_margin: 0.01
|
|
51
|
+
input:
|
|
52
|
+
employment_income: 60_000
|
|
53
|
+
pension_contributions_via_salary_sacrifice: 2_000
|
|
54
|
+
gov.hmrc.national_insurance.salary_sacrifice_pension_cap: 2_000
|
|
55
|
+
gov.contrib.behavioral_responses.salary_sacrifice_broad_base_haircut_rate: 0
|
|
56
|
+
output:
|
|
57
|
+
salary_sacrifice_pension_ni_employer: 0
|
|
58
|
+
|
|
59
|
+
- name: Employer NI charge for small excess over cap
|
|
60
|
+
period: 2025
|
|
61
|
+
absolute_error_margin: 0.01
|
|
62
|
+
input:
|
|
63
|
+
employment_income: 35_000
|
|
64
|
+
pension_contributions_via_salary_sacrifice: 2_100
|
|
65
|
+
gov.hmrc.national_insurance.salary_sacrifice_pension_cap: 2_000
|
|
66
|
+
gov.contrib.behavioral_responses.salary_sacrifice_broad_base_haircut_rate: 0
|
|
67
|
+
output:
|
|
68
|
+
# £100 excess * 15% = £15
|
|
69
|
+
salary_sacrifice_pension_ni_employer: 100 * 0.15
|
|
70
|
+
|
|
71
|
+
- name: Employer NI charge for low earner with high pension contribution
|
|
72
|
+
period: 2025
|
|
73
|
+
absolute_error_margin: 0.01
|
|
74
|
+
input:
|
|
75
|
+
employment_income: 30_000
|
|
76
|
+
pension_contributions_via_salary_sacrifice: 5_000
|
|
77
|
+
gov.hmrc.national_insurance.salary_sacrifice_pension_cap: 2_000
|
|
78
|
+
gov.contrib.behavioral_responses.salary_sacrifice_broad_base_haircut_rate: 0
|
|
79
|
+
output:
|
|
80
|
+
# £3,000 excess * 15% = £450
|
|
81
|
+
salary_sacrifice_pension_ni_employer: (5_000 - 2_000) * 0.15
|
|
82
|
+
|
|
83
|
+
- name: Employer NI on full redirected excess
|
|
84
|
+
period: 2025
|
|
85
|
+
absolute_error_margin: 0.01
|
|
86
|
+
input:
|
|
87
|
+
employment_income: 45_000
|
|
88
|
+
pension_contributions_via_salary_sacrifice: 3_000
|
|
89
|
+
gov.hmrc.national_insurance.salary_sacrifice_pension_cap: 2_000
|
|
90
|
+
gov.contrib.behavioral_responses.salary_sacrifice_broad_base_haircut_rate: 0
|
|
91
|
+
output:
|
|
92
|
+
# £1,000 excess * 15% = £150
|
|
93
|
+
salary_sacrifice_pension_ni_employer: (3_000 - 2_000) * 0.15
|
|
94
|
+
# Full excess is redirected (no targeted haircut)
|
|
95
|
+
salary_sacrifice_returned_to_income: 1_000
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# Test student loan interest rate calculations
|
|
2
|
+
# Interest rates vary by plan type and income (for Plan 2)
|
|
3
|
+
# Note: RPI for 2025 is ~4.33% per OBR forecasts
|
|
4
|
+
|
|
5
|
+
# Plan 2 income-contingent interest rate tests
|
|
6
|
+
# Below lower threshold: RPI only
|
|
7
|
+
# Above upper threshold: RPI + 3%
|
|
8
|
+
# Between: linear taper
|
|
9
|
+
|
|
10
|
+
- name: Plan 2 - Low income gets base rate (RPI only)
|
|
11
|
+
period: 2025
|
|
12
|
+
absolute_error_margin: 0.005
|
|
13
|
+
input:
|
|
14
|
+
people:
|
|
15
|
+
person:
|
|
16
|
+
student_loan_plan: PLAN_2
|
|
17
|
+
adjusted_net_income: 20_000
|
|
18
|
+
output:
|
|
19
|
+
# Below lower threshold, should be RPI (~4.33%)
|
|
20
|
+
plan_2_interest_rate: 0.0433
|
|
21
|
+
|
|
22
|
+
- name: Plan 2 - High income gets max rate (RPI + 3%)
|
|
23
|
+
period: 2025
|
|
24
|
+
absolute_error_margin: 0.005
|
|
25
|
+
input:
|
|
26
|
+
people:
|
|
27
|
+
person:
|
|
28
|
+
student_loan_plan: PLAN_2
|
|
29
|
+
adjusted_net_income: 60_000
|
|
30
|
+
output:
|
|
31
|
+
# Above upper threshold, should be RPI + 3% (~7.33%)
|
|
32
|
+
plan_2_interest_rate: 0.0733
|
|
33
|
+
|
|
34
|
+
- name: Plan 2 - Mid income gets tapered rate
|
|
35
|
+
period: 2025
|
|
36
|
+
absolute_error_margin: 0.01
|
|
37
|
+
input:
|
|
38
|
+
people:
|
|
39
|
+
person:
|
|
40
|
+
student_loan_plan: PLAN_2
|
|
41
|
+
adjusted_net_income: 40_000
|
|
42
|
+
output:
|
|
43
|
+
# Between thresholds, tapered rate ~5.8%
|
|
44
|
+
plan_2_interest_rate: 0.058
|
|
45
|
+
|
|
46
|
+
# Plan 5 interest rate (RPI only, regardless of income)
|
|
47
|
+
|
|
48
|
+
- name: Plan 5 - High income still gets RPI only
|
|
49
|
+
period: 2025
|
|
50
|
+
absolute_error_margin: 0.005
|
|
51
|
+
input:
|
|
52
|
+
people:
|
|
53
|
+
person:
|
|
54
|
+
student_loan_plan: PLAN_5
|
|
55
|
+
adjusted_net_income: 100_000
|
|
56
|
+
output:
|
|
57
|
+
# RPI only regardless of income (~4.33%)
|
|
58
|
+
plan_5_interest_rate: 0.0433
|
|
59
|
+
|
|
60
|
+
# Postgraduate interest rate (RPI + 3%)
|
|
61
|
+
|
|
62
|
+
- name: Postgraduate - Gets RPI + 3% regardless of income
|
|
63
|
+
period: 2025
|
|
64
|
+
absolute_error_margin: 0.005
|
|
65
|
+
input:
|
|
66
|
+
people:
|
|
67
|
+
person:
|
|
68
|
+
student_loan_plan: POSTGRADUATE
|
|
69
|
+
adjusted_net_income: 25_000
|
|
70
|
+
output:
|
|
71
|
+
# RPI + 3% regardless of income (~7.33%)
|
|
72
|
+
postgraduate_interest_rate: 0.0733
|
|
73
|
+
|
|
74
|
+
# Unified student_loan_interest_rate dispatch tests
|
|
75
|
+
|
|
76
|
+
- name: No loan returns zero interest rate
|
|
77
|
+
period: 2025
|
|
78
|
+
input:
|
|
79
|
+
people:
|
|
80
|
+
person:
|
|
81
|
+
student_loan_plan: NONE
|
|
82
|
+
adjusted_net_income: 50_000
|
|
83
|
+
output:
|
|
84
|
+
student_loan_interest_rate: 0
|
|
85
|
+
|
|
86
|
+
- name: Dispatch to Plan 2 rate
|
|
87
|
+
period: 2025
|
|
88
|
+
absolute_error_margin: 0.005
|
|
89
|
+
input:
|
|
90
|
+
people:
|
|
91
|
+
person:
|
|
92
|
+
student_loan_plan: PLAN_2
|
|
93
|
+
adjusted_net_income: 60_000
|
|
94
|
+
output:
|
|
95
|
+
# Should match plan_2_interest_rate at high income (~7.33%)
|
|
96
|
+
student_loan_interest_rate: 0.0733
|
|
97
|
+
|
|
98
|
+
- name: Dispatch to Postgraduate rate
|
|
99
|
+
period: 2025
|
|
100
|
+
absolute_error_margin: 0.005
|
|
101
|
+
input:
|
|
102
|
+
people:
|
|
103
|
+
person:
|
|
104
|
+
student_loan_plan: POSTGRADUATE
|
|
105
|
+
adjusted_net_income: 30_000
|
|
106
|
+
output:
|
|
107
|
+
# Should match postgraduate_interest_rate (~7.33%)
|
|
108
|
+
student_loan_interest_rate: 0.0733
|
|
109
|
+
|
|
110
|
+
# Repayment rate tests
|
|
111
|
+
|
|
112
|
+
- name: No loan returns zero repayment rate
|
|
113
|
+
period: 2025
|
|
114
|
+
input:
|
|
115
|
+
people:
|
|
116
|
+
person:
|
|
117
|
+
student_loan_plan: NONE
|
|
118
|
+
output:
|
|
119
|
+
student_loan_repayment_rate: 0
|
|
120
|
+
|
|
121
|
+
- name: Plan 2 returns 9% repayment rate
|
|
122
|
+
period: 2025
|
|
123
|
+
input:
|
|
124
|
+
people:
|
|
125
|
+
person:
|
|
126
|
+
student_loan_plan: PLAN_2
|
|
127
|
+
output:
|
|
128
|
+
student_loan_repayment_rate: 0.09
|
|
129
|
+
|
|
130
|
+
- name: Postgraduate returns 6% repayment rate
|
|
131
|
+
period: 2025
|
|
132
|
+
input:
|
|
133
|
+
people:
|
|
134
|
+
person:
|
|
135
|
+
student_loan_plan: POSTGRADUATE
|
|
136
|
+
output:
|
|
137
|
+
student_loan_repayment_rate: 0.06
|
|
138
|
+
|
|
139
|
+
# Postgraduate repayment integration test
|
|
140
|
+
# Note: Threshold uprated by RPI so ~21,909 for 2025
|
|
141
|
+
|
|
142
|
+
- name: Postgraduate - Repayment above threshold at 6% rate
|
|
143
|
+
period: 2025
|
|
144
|
+
absolute_error_margin: 1
|
|
145
|
+
input:
|
|
146
|
+
people:
|
|
147
|
+
person:
|
|
148
|
+
employment_income: 30_000
|
|
149
|
+
student_loan_plan: POSTGRADUATE
|
|
150
|
+
output:
|
|
151
|
+
# Postgraduate threshold ~£21,909 (uprated from £21,000)
|
|
152
|
+
# 6% of (30,000 - 21,909) = 6% of 8,091 = ~485
|
|
153
|
+
student_loan_repayment: 485
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Test student loan repayment calculations
|
|
2
|
+
# Plan 2 threshold for 2025 is £28,470
|
|
3
|
+
|
|
4
|
+
- name: Plan 2 - Income above threshold
|
|
5
|
+
period: 2025
|
|
6
|
+
input:
|
|
7
|
+
people:
|
|
8
|
+
person:
|
|
9
|
+
employment_income: 40_000
|
|
10
|
+
student_loan_plan: PLAN_2
|
|
11
|
+
output:
|
|
12
|
+
# 9% of (40,000 - 28,470) = 9% of 11,530 = 1,037.70
|
|
13
|
+
student_loan_repayment: 1_037.70
|
|
14
|
+
|
|
15
|
+
- name: Plan 2 - Income below threshold
|
|
16
|
+
period: 2025
|
|
17
|
+
input:
|
|
18
|
+
people:
|
|
19
|
+
person:
|
|
20
|
+
employment_income: 25_000
|
|
21
|
+
student_loan_plan: PLAN_2
|
|
22
|
+
output:
|
|
23
|
+
student_loan_repayment: 0
|
|
24
|
+
|
|
25
|
+
- name: Plan 1 - Income above threshold
|
|
26
|
+
period: 2024
|
|
27
|
+
input:
|
|
28
|
+
people:
|
|
29
|
+
person:
|
|
30
|
+
employment_income: 35_000
|
|
31
|
+
student_loan_plan: PLAN_1
|
|
32
|
+
output:
|
|
33
|
+
# Plan 1 threshold 2024 is £24,990
|
|
34
|
+
# 9% of (35,000 - 24,990) = 9% of 10,010 = 900.90
|
|
35
|
+
student_loan_repayment: 900.90
|
|
36
|
+
|
|
37
|
+
- name: No student loan
|
|
38
|
+
period: 2025
|
|
39
|
+
input:
|
|
40
|
+
people:
|
|
41
|
+
person:
|
|
42
|
+
employment_income: 50_000
|
|
43
|
+
student_loan_plan: NONE
|
|
44
|
+
output:
|
|
45
|
+
student_loan_repayment: 0
|
|
46
|
+
|
|
47
|
+
- name: Has student loan - true
|
|
48
|
+
period: 2025
|
|
49
|
+
input:
|
|
50
|
+
people:
|
|
51
|
+
person:
|
|
52
|
+
student_loan_plan: PLAN_2
|
|
53
|
+
output:
|
|
54
|
+
has_student_loan: true
|
|
55
|
+
|
|
56
|
+
- name: Has student loan - false
|
|
57
|
+
period: 2025
|
|
58
|
+
input:
|
|
59
|
+
people:
|
|
60
|
+
person:
|
|
61
|
+
student_loan_plan: NONE
|
|
62
|
+
output:
|
|
63
|
+
has_student_loan: false
|
|
64
|
+
|
|
65
|
+
# Plan 2 threshold tests for Autumn Budget 2025 freeze
|
|
66
|
+
# Per GOV.UK announcement: threshold rises to £29,385 from April 2026
|
|
67
|
+
# Per Budget 2025: frozen at £29,385 from 2027-28 until 2029-30
|
|
68
|
+
# Reference: https://www.gov.uk/government/news/student-loans-interest-and-repayment-threshold-announcement-for-plan-2-and-plan-3-loans
|
|
69
|
+
#
|
|
70
|
+
# Note: Calendar year tests use the parameter value at January 1 of that year.
|
|
71
|
+
# The £29,385 threshold takes effect from April 6, 2026, so:
|
|
72
|
+
# - 2026 calendar year (Jan 1): uses £28,470 (from April 2025)
|
|
73
|
+
# - 2027+ calendar years: use £29,385 (from April 2026)
|
|
74
|
+
# For tax year 2026-27 calculations, the threshold is £29,385.
|
|
75
|
+
|
|
76
|
+
- name: Plan 2 - 2027 threshold is £29,385 (tax year 2026-27 rate)
|
|
77
|
+
period: 2027
|
|
78
|
+
input:
|
|
79
|
+
people:
|
|
80
|
+
person:
|
|
81
|
+
employment_income: 40_000
|
|
82
|
+
student_loan_plan: PLAN_2
|
|
83
|
+
output:
|
|
84
|
+
# 9% of (40,000 - 29,385) = 9% of 10,615 = 955.35
|
|
85
|
+
student_loan_repayment: 955.35
|
|
86
|
+
|
|
87
|
+
- name: Plan 2 - 2028 threshold frozen at £29,385
|
|
88
|
+
period: 2028
|
|
89
|
+
input:
|
|
90
|
+
people:
|
|
91
|
+
person:
|
|
92
|
+
employment_income: 40_000
|
|
93
|
+
student_loan_plan: PLAN_2
|
|
94
|
+
output:
|
|
95
|
+
# 9% of (40,000 - 29,385) = 9% of 10,615 = 955.35
|
|
96
|
+
student_loan_repayment: 955.35
|
|
97
|
+
|
|
98
|
+
- name: Plan 2 - 2029 threshold frozen at £29,385
|
|
99
|
+
period: 2029
|
|
100
|
+
input:
|
|
101
|
+
people:
|
|
102
|
+
person:
|
|
103
|
+
employment_income: 40_000
|
|
104
|
+
student_loan_plan: PLAN_2
|
|
105
|
+
output:
|
|
106
|
+
# 9% of (40,000 - 29,385) = 9% of 10,615 = 955.35
|
|
107
|
+
student_loan_repayment: 955.35
|
|
108
|
+
|
|
109
|
+
- name: Plan 2 - 2030 threshold resumed RPI uprating
|
|
110
|
+
period: 2030
|
|
111
|
+
absolute_error_margin: 0.01
|
|
112
|
+
input:
|
|
113
|
+
people:
|
|
114
|
+
person:
|
|
115
|
+
employment_income: 40_000
|
|
116
|
+
student_loan_plan: PLAN_2
|
|
117
|
+
output:
|
|
118
|
+
# Threshold resumes RPI uprating from 2030
|
|
119
|
+
# 9% of (40,000 - ~30,064) = 9% of ~9,936 = ~894.26
|
|
120
|
+
student_loan_repayment: 894.26
|
|
121
|
+
|
|
122
|
+
- name: Plan 2 - Income just below 2027 threshold
|
|
123
|
+
period: 2027
|
|
124
|
+
input:
|
|
125
|
+
people:
|
|
126
|
+
person:
|
|
127
|
+
employment_income: 29_000
|
|
128
|
+
student_loan_plan: PLAN_2
|
|
129
|
+
output:
|
|
130
|
+
student_loan_repayment: 0
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
- name: Household with no vehicles does not own a vehicle
|
|
2
|
+
period: 2024
|
|
3
|
+
input:
|
|
4
|
+
num_vehicles: 0
|
|
5
|
+
output:
|
|
6
|
+
owns_vehicle: false
|
|
7
|
+
|
|
8
|
+
- name: Household with one vehicle owns a vehicle
|
|
9
|
+
period: 2024
|
|
10
|
+
input:
|
|
11
|
+
num_vehicles: 1
|
|
12
|
+
output:
|
|
13
|
+
owns_vehicle: true
|
|
14
|
+
|
|
15
|
+
- name: Household with multiple vehicles owns a vehicle
|
|
16
|
+
period: 2024
|
|
17
|
+
input:
|
|
18
|
+
num_vehicles: 3
|
|
19
|
+
output:
|
|
20
|
+
owns_vehicle: true
|
|
21
|
+
|
|
22
|
+
- name: Default num_vehicles is zero
|
|
23
|
+
period: 2024
|
|
24
|
+
input: {}
|
|
25
|
+
output:
|
|
26
|
+
num_vehicles: 0
|
|
27
|
+
owns_vehicle: false
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# Tests for November 2025 Autumn Budget income source-specific tax rate increases
|
|
2
|
+
#
|
|
3
|
+
# From OBR Economic and Fiscal Outlook November 2025, paragraph 3.33:
|
|
4
|
+
#
|
|
5
|
+
# Dividends (from April 2026):
|
|
6
|
+
# - Basic rate: 8.75% -> 10.75% (+2pp)
|
|
7
|
+
# - Higher rate: 33.75% -> 35.75% (+2pp)
|
|
8
|
+
# - Additional rate: NOT MENTIONED (stays at 39.35%)
|
|
9
|
+
#
|
|
10
|
+
# Savings (from April 2027):
|
|
11
|
+
# - Basic rate: 20% -> 22% (+2pp)
|
|
12
|
+
# - Higher rate: 40% -> 42% (+2pp)
|
|
13
|
+
# - Additional rate: 45% -> 47% (+2pp)
|
|
14
|
+
#
|
|
15
|
+
# Property (from April 2027):
|
|
16
|
+
# - Basic rate: 20% -> 22% (+2pp)
|
|
17
|
+
# - Higher rate: 40% -> 42% (+2pp)
|
|
18
|
+
# - Additional rate: 45% -> 47% (+2pp)
|
|
19
|
+
|
|
20
|
+
# =============================================================================
|
|
21
|
+
# DIVIDEND TAX RATE TESTS
|
|
22
|
+
# =============================================================================
|
|
23
|
+
|
|
24
|
+
# Test dividend rates BEFORE April 2026 (should be unchanged at 8.75/33.75/39.35)
|
|
25
|
+
- name: Dividend tax at basic rate - 2025 (pre-reform)
|
|
26
|
+
period: 2025
|
|
27
|
+
absolute_error_margin: 1
|
|
28
|
+
input:
|
|
29
|
+
# Person with just enough employment income for personal allowance
|
|
30
|
+
employment_income: 12570
|
|
31
|
+
dividend_income: 1500
|
|
32
|
+
output:
|
|
33
|
+
# Dividend allowance is £500 in 2025, so £1000 taxable at 8.75%
|
|
34
|
+
dividend_income_tax: 1000 * 0.0875
|
|
35
|
+
|
|
36
|
+
- name: Dividend tax at higher rate - 2025 (pre-reform)
|
|
37
|
+
period: 2025
|
|
38
|
+
absolute_error_margin: 1
|
|
39
|
+
input:
|
|
40
|
+
# Employment income pushes person into higher rate band
|
|
41
|
+
employment_income: 60000
|
|
42
|
+
dividend_income: 1500
|
|
43
|
+
output:
|
|
44
|
+
# All dividends (after £500 allowance) taxed at higher rate 33.75%
|
|
45
|
+
dividend_income_tax: 1000 * 0.3375
|
|
46
|
+
|
|
47
|
+
# Test dividend rates AFTER April 2026 (basic and higher +2pp, additional unchanged)
|
|
48
|
+
- name: Dividend tax at basic rate - 2027 (post-reform)
|
|
49
|
+
period: 2027
|
|
50
|
+
absolute_error_margin: 1
|
|
51
|
+
input:
|
|
52
|
+
employment_income: 12570
|
|
53
|
+
dividend_income: 1500
|
|
54
|
+
output:
|
|
55
|
+
# £1000 taxable at NEW basic rate 10.75%
|
|
56
|
+
dividend_income_tax: 1000 * 0.1075
|
|
57
|
+
|
|
58
|
+
- name: Dividend tax at higher rate - 2027 (post-reform)
|
|
59
|
+
period: 2027
|
|
60
|
+
absolute_error_margin: 1
|
|
61
|
+
input:
|
|
62
|
+
employment_income: 60000
|
|
63
|
+
dividend_income: 1500
|
|
64
|
+
output:
|
|
65
|
+
# All dividends at NEW higher rate 35.75%
|
|
66
|
+
dividend_income_tax: 1000 * 0.3575
|
|
67
|
+
|
|
68
|
+
- name: Dividend tax at additional rate - 2027 (post-reform, rate unchanged)
|
|
69
|
+
period: 2027
|
|
70
|
+
absolute_error_margin: 1
|
|
71
|
+
input:
|
|
72
|
+
employment_income: 200000
|
|
73
|
+
dividend_income: 1500
|
|
74
|
+
output:
|
|
75
|
+
# Additional rate UNCHANGED at 39.35% per OBR
|
|
76
|
+
dividend_income_tax: 1000 * 0.3935
|
|
77
|
+
|
|
78
|
+
# =============================================================================
|
|
79
|
+
# SAVINGS INCOME TAX RATE TESTS
|
|
80
|
+
# Note: Savings starter rate provides up to £5000 at 0% for low earners.
|
|
81
|
+
# We use higher income scenarios to avoid the starter rate complication.
|
|
82
|
+
# =============================================================================
|
|
83
|
+
|
|
84
|
+
# Test savings rates BEFORE April 2027 (should be standard 20/40/45)
|
|
85
|
+
- name: Savings tax at higher rate - 2026 (pre-reform)
|
|
86
|
+
period: 2026
|
|
87
|
+
absolute_error_margin: 1
|
|
88
|
+
input:
|
|
89
|
+
# Higher rate earner - no starter rate applies
|
|
90
|
+
employment_income: 60000
|
|
91
|
+
savings_interest_income: 2000
|
|
92
|
+
output:
|
|
93
|
+
# Higher rate taxpayers get £500 savings allowance, so £1500 at 40%
|
|
94
|
+
savings_income_tax: 1500 * 0.40
|
|
95
|
+
|
|
96
|
+
- name: Savings tax at additional rate - 2026 (pre-reform)
|
|
97
|
+
period: 2026
|
|
98
|
+
absolute_error_margin: 1
|
|
99
|
+
input:
|
|
100
|
+
employment_income: 200000
|
|
101
|
+
savings_interest_income: 2000
|
|
102
|
+
output:
|
|
103
|
+
# Additional rate taxpayers get £0 savings allowance, so £2000 at 45%
|
|
104
|
+
savings_income_tax: 2000 * 0.45
|
|
105
|
+
|
|
106
|
+
# Test savings rates AFTER April 2027 (should be +2pp: 22/42/47)
|
|
107
|
+
- name: Savings tax at higher rate - 2028 (post-reform)
|
|
108
|
+
period: 2028
|
|
109
|
+
absolute_error_margin: 1
|
|
110
|
+
input:
|
|
111
|
+
employment_income: 60000
|
|
112
|
+
savings_interest_income: 2000
|
|
113
|
+
output:
|
|
114
|
+
# £1500 at NEW rate 42%
|
|
115
|
+
savings_income_tax: 1500 * 0.42
|
|
116
|
+
|
|
117
|
+
- name: Savings tax at additional rate - 2028 (post-reform)
|
|
118
|
+
period: 2028
|
|
119
|
+
absolute_error_margin: 1
|
|
120
|
+
input:
|
|
121
|
+
employment_income: 200000
|
|
122
|
+
savings_interest_income: 2000
|
|
123
|
+
output:
|
|
124
|
+
# £2000 at NEW rate 47%
|
|
125
|
+
savings_income_tax: 2000 * 0.47
|
|
126
|
+
|
|
127
|
+
# =============================================================================
|
|
128
|
+
# PROPERTY INCOME TAX RATE TESTS
|
|
129
|
+
# Note: Property income is currently part of earned_income_tax. We need to
|
|
130
|
+
# create a separate property_income_tax variable to implement source-specific rates.
|
|
131
|
+
# =============================================================================
|
|
132
|
+
|
|
133
|
+
# Test property rates BEFORE April 2027 (should be standard 20/40/45)
|
|
134
|
+
- name: Property tax at basic rate - 2026 (pre-reform)
|
|
135
|
+
period: 2026
|
|
136
|
+
absolute_error_margin: 1
|
|
137
|
+
input:
|
|
138
|
+
employment_income: 12570
|
|
139
|
+
property_income: 2000
|
|
140
|
+
output:
|
|
141
|
+
# Property allowance is £1000, so £1000 taxable at 20%
|
|
142
|
+
property_income_tax: 1000 * 0.20
|
|
143
|
+
|
|
144
|
+
- name: Property tax at higher rate - 2026 (pre-reform)
|
|
145
|
+
period: 2026
|
|
146
|
+
absolute_error_margin: 1
|
|
147
|
+
input:
|
|
148
|
+
employment_income: 60000
|
|
149
|
+
property_income: 2000
|
|
150
|
+
output:
|
|
151
|
+
# £1000 (after property allowance) all at 40% since employment income
|
|
152
|
+
# has already used up basic rate band
|
|
153
|
+
property_income_tax: 1000 * 0.40
|
|
154
|
+
|
|
155
|
+
# Test property rates AFTER April 2027 (should be +2pp: 22/42/47)
|
|
156
|
+
- name: Property tax at basic rate - 2028 (post-reform)
|
|
157
|
+
period: 2028
|
|
158
|
+
absolute_error_margin: 1
|
|
159
|
+
input:
|
|
160
|
+
employment_income: 12570
|
|
161
|
+
property_income: 2000
|
|
162
|
+
output:
|
|
163
|
+
# £1000 at NEW rate 22%
|
|
164
|
+
property_income_tax: 1000 * 0.22
|
|
165
|
+
|
|
166
|
+
- name: Property tax at higher rate - 2028 (post-reform)
|
|
167
|
+
period: 2028
|
|
168
|
+
absolute_error_margin: 1
|
|
169
|
+
input:
|
|
170
|
+
employment_income: 60000
|
|
171
|
+
property_income: 2000
|
|
172
|
+
output:
|
|
173
|
+
# £1000 at NEW rate 42%
|
|
174
|
+
property_income_tax: 1000 * 0.42
|
|
175
|
+
|
|
176
|
+
- name: Property tax at additional rate - 2028 (post-reform)
|
|
177
|
+
period: 2028
|
|
178
|
+
absolute_error_margin: 1
|
|
179
|
+
input:
|
|
180
|
+
employment_income: 200000
|
|
181
|
+
property_income: 2000
|
|
182
|
+
output:
|
|
183
|
+
# £1000 at NEW rate 47%
|
|
184
|
+
property_income_tax: 1000 * 0.47
|
|
185
|
+
|
|
186
|
+
# =============================================================================
|
|
187
|
+
# INTEGRATION TESTS - verify income_tax includes source-specific taxes
|
|
188
|
+
# These tests verify that property_income_tax flows into total income_tax
|
|
189
|
+
# =============================================================================
|
|
190
|
+
|
|
191
|
+
- name: Property tax flows into income_tax - basic rate - 2028
|
|
192
|
+
period: 2028
|
|
193
|
+
absolute_error_margin: 1
|
|
194
|
+
input:
|
|
195
|
+
# Person with just personal allowance worth of employment income
|
|
196
|
+
employment_income: 12570
|
|
197
|
+
property_income: 2000
|
|
198
|
+
output:
|
|
199
|
+
# Property allowance is £1000, so £1000 taxable at 22%
|
|
200
|
+
property_income_tax: 220
|
|
201
|
+
# Total income_tax should include property_income_tax
|
|
202
|
+
# Employment: £0 (covered by PA), Property: £220
|
|
203
|
+
income_tax: 220
|
|
204
|
+
|
|
205
|
+
- name: Property tax flows into income_tax - higher rate - 2028
|
|
206
|
+
period: 2028
|
|
207
|
+
absolute_error_margin: 1
|
|
208
|
+
input:
|
|
209
|
+
employment_income: 60000
|
|
210
|
+
property_income: 2000
|
|
211
|
+
output:
|
|
212
|
+
# £1000 at 42%
|
|
213
|
+
property_income_tax: 420
|
|
214
|
+
# income_tax = earned_income_tax + savings_income_tax + dividend_income_tax + property_income_tax
|
|
215
|
+
# Earned income tax on £60000: PA=£12570, taxable=£47430
|
|
216
|
+
# Basic rate (20%): £37700 at 20% = £7540
|
|
217
|
+
# Higher rate (40%): £9730 at 40% = £3892
|
|
218
|
+
# Total earned: £11432
|
|
219
|
+
# Property: £420
|
|
220
|
+
# Total: £11852
|
|
221
|
+
income_tax: 11852
|
|
222
|
+
|
|
223
|
+
- name: Savings tax flows into income_tax - higher rate - 2028
|
|
224
|
+
period: 2028
|
|
225
|
+
absolute_error_margin: 1
|
|
226
|
+
input:
|
|
227
|
+
employment_income: 60000
|
|
228
|
+
savings_interest_income: 2000
|
|
229
|
+
output:
|
|
230
|
+
# £1500 at 42% (after £500 savings allowance)
|
|
231
|
+
savings_income_tax: 630
|
|
232
|
+
# Earned: £11432 (same as above)
|
|
233
|
+
# Savings: £630
|
|
234
|
+
# Total: £12062
|
|
235
|
+
income_tax: 12062
|