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.
Files changed (258) hide show
  1. policyengine_uk/__init__.py +5 -3
  2. policyengine_uk/data/__init__.py +1 -0
  3. policyengine_uk/data/dataset_schema.py +70 -18
  4. policyengine_uk/data/economic_assumptions.py +36 -10
  5. policyengine_uk/data/filter_dataset.py +52 -0
  6. policyengine_uk/dynamics/labour_supply.py +343 -0
  7. policyengine_uk/dynamics/participation.py +629 -0
  8. policyengine_uk/dynamics/progression.py +384 -0
  9. policyengine_uk/microsimulation.py +105 -0
  10. policyengine_uk/model_api.py +1 -0
  11. policyengine_uk/parameters/gov/boe/base_rate.yaml +34 -0
  12. policyengine_uk/parameters/gov/boe/index.yaml +2 -0
  13. policyengine_uk/parameters/gov/contrib/behavioral_responses/employee_salary_sacrifice_reduction_rate.yaml +14 -0
  14. policyengine_uk/parameters/gov/contrib/behavioral_responses/salary_sacrifice_broad_base_haircut_rate.yaml +22 -0
  15. policyengine_uk/parameters/gov/contrib/cec/state_pension_increase.yaml +1 -1
  16. policyengine_uk/parameters/gov/contrib/ubi_center/carbon_tax.yaml +2 -2
  17. policyengine_uk/parameters/gov/contrib/ubi_center/land_value_tax.yaml +3 -3
  18. policyengine_uk/parameters/gov/dcms/bbc/tv_licence/colour.yaml +5 -5
  19. policyengine_uk/parameters/gov/dfe/education_spending.yaml +1 -1
  20. policyengine_uk/parameters/gov/dft/rail/fare_index.yaml +32 -0
  21. policyengine_uk/parameters/gov/dft/rail/prior_law_fare_index.yaml +32 -0
  22. policyengine_uk/parameters/gov/dft/rail/ridership_index.yaml +30 -0
  23. policyengine_uk/parameters/gov/dft/spending.yaml +2 -2
  24. policyengine_uk/parameters/gov/dwp/ESA/income/earn_disregard.yaml +1 -1
  25. policyengine_uk/parameters/gov/dwp/ESA/income/income_disregard_couple.yaml +1 -1
  26. policyengine_uk/parameters/gov/dwp/ESA/income/income_disregard_lone_parent.yaml +1 -1
  27. policyengine_uk/parameters/gov/dwp/ESA/income/income_disregard_single.yaml +1 -1
  28. policyengine_uk/parameters/gov/dwp/ESA/income/pension_disregard.yaml +1 -1
  29. policyengine_uk/parameters/gov/dwp/IIDB/maximum.yaml +1 -1
  30. policyengine_uk/parameters/gov/dwp/JSA/contrib/amount_over_25.yaml +1 -1
  31. policyengine_uk/parameters/gov/dwp/JSA/contrib/earn_disregard.yaml +1 -1
  32. policyengine_uk/parameters/gov/dwp/JSA/contrib/pension_disregard.yaml +1 -1
  33. policyengine_uk/parameters/gov/dwp/JSA/income/amount_18_24.yaml +7 -7
  34. policyengine_uk/parameters/gov/dwp/JSA/income/amount_over_25.yaml +7 -7
  35. policyengine_uk/parameters/gov/dwp/JSA/income/income_disregard_couple.yaml +1 -1
  36. policyengine_uk/parameters/gov/dwp/JSA/income/income_disregard_lone_parent.yaml +1 -1
  37. policyengine_uk/parameters/gov/dwp/JSA/income/income_disregard_single.yaml +1 -1
  38. policyengine_uk/parameters/gov/dwp/LHA/shared_accommodation_age_threshold.yaml +12 -0
  39. policyengine_uk/parameters/gov/dwp/attendance_allowance/higher.yaml +7 -7
  40. policyengine_uk/parameters/gov/dwp/attendance_allowance/lower.yaml +7 -7
  41. policyengine_uk/parameters/gov/dwp/benefit_cap.yaml +3 -3
  42. policyengine_uk/parameters/gov/dwp/carer_premium/couple.yaml +2 -2
  43. policyengine_uk/parameters/gov/dwp/carer_premium/single.yaml +6 -6
  44. policyengine_uk/parameters/gov/dwp/carers_allowance/rate.yaml +7 -7
  45. policyengine_uk/parameters/gov/dwp/disability_premia/disability_couple.yaml +1 -1
  46. policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_couple.yaml +1 -1
  47. policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_single.yaml +1 -1
  48. policyengine_uk/parameters/gov/dwp/disability_premia/severe_couple.yaml +1 -1
  49. policyengine_uk/parameters/gov/dwp/dla/mobility/higher.yaml +4 -4
  50. policyengine_uk/parameters/gov/dwp/dla/mobility/lower.yaml +8 -8
  51. policyengine_uk/parameters/gov/dwp/dla/self_care/higher.yaml +7 -7
  52. policyengine_uk/parameters/gov/dwp/dla/self_care/lower.yaml +8 -8
  53. policyengine_uk/parameters/gov/dwp/dla/self_care/middle.yaml +7 -7
  54. policyengine_uk/parameters/gov/dwp/housing_benefit/allowances/lone_parent/aged.yaml +1 -1
  55. policyengine_uk/parameters/gov/dwp/housing_benefit/allowances/lone_parent/older.yaml +3 -3
  56. policyengine_uk/parameters/gov/dwp/housing_benefit/allowances/single/aged.yaml +1 -1
  57. policyengine_uk/parameters/gov/dwp/housing_benefit/allowances/single/older.yaml +3 -3
  58. policyengine_uk/parameters/gov/dwp/housing_benefit/means_test/income_disregard/worker.yaml +1 -1
  59. policyengine_uk/parameters/gov/dwp/housing_benefit/non_dep_deduction/amount.yaml +1 -1
  60. policyengine_uk/parameters/gov/dwp/housing_benefit/takeup.yaml +7 -7
  61. policyengine_uk/parameters/gov/dwp/income_support/amounts/amount_16_24.yaml +1 -1
  62. policyengine_uk/parameters/gov/dwp/income_support/amounts/amount_couples_over_18.yaml +1 -1
  63. policyengine_uk/parameters/gov/dwp/income_support/means_test/earn_disregard.yaml +1 -1
  64. policyengine_uk/parameters/gov/dwp/income_support/means_test/income_disregard_couple.yaml +1 -1
  65. policyengine_uk/parameters/gov/dwp/income_support/means_test/income_disregard_lone_parent.yaml +1 -1
  66. policyengine_uk/parameters/gov/dwp/income_support/means_test/income_disregard_single.yaml +1 -1
  67. policyengine_uk/parameters/gov/dwp/income_support/means_test/pension_disregard.yaml +1 -1
  68. policyengine_uk/parameters/gov/dwp/income_support/takeup.yaml +7 -7
  69. policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/carer/addition.yaml +4 -4
  70. policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/minimum_guarantee.yaml +9 -9
  71. policyengine_uk/parameters/gov/dwp/pension_credit/guarantee_credit/severe_disability/addition.yaml +3 -3
  72. policyengine_uk/parameters/gov/dwp/pension_credit/savings_credit/threshold.yaml +5 -5
  73. policyengine_uk/parameters/gov/dwp/pip/daily_living/enhanced.yaml +7 -7
  74. policyengine_uk/parameters/gov/dwp/pip/daily_living/standard.yaml +8 -8
  75. policyengine_uk/parameters/gov/dwp/pip/mobility/enhanced.yaml +4 -4
  76. policyengine_uk/parameters/gov/dwp/pip/mobility/standard.yaml +9 -9
  77. policyengine_uk/parameters/gov/dwp/sda/maximum.yaml +7 -7
  78. policyengine_uk/parameters/gov/dwp/state_pension/basic_state_pension/amount.yaml +11 -11
  79. policyengine_uk/parameters/gov/dwp/state_pension/new_state_pension/amount.yaml +4 -4
  80. policyengine_uk/parameters/gov/dwp/tax_credits/child_tax_credit/limit/child_count.yaml +10 -1
  81. policyengine_uk/parameters/gov/dwp/tax_credits/child_tax_credit/takeup.yaml +7 -7
  82. policyengine_uk/parameters/gov/dwp/tax_credits/working_tax_credit/takeup.yaml +7 -7
  83. policyengine_uk/parameters/gov/dwp/universal_credit/elements/carer/amount.yaml +3 -3
  84. policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/amount.yaml +2 -4
  85. policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/disabled/amount.yaml +2 -4
  86. policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/first/higher_amount.yaml +6 -8
  87. policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/limit/child_count.yaml +6 -1
  88. policyengine_uk/parameters/gov/dwp/universal_credit/elements/child/severely_disabled/amount.yaml +3 -5
  89. policyengine_uk/parameters/gov/dwp/universal_credit/elements/childcare/cap.yaml +2 -6
  90. policyengine_uk/parameters/gov/dwp/universal_credit/elements/disabled/amount.yaml +4 -6
  91. policyengine_uk/parameters/gov/dwp/universal_credit/elements/housing/non_dep_deduction/amount.yaml +4 -1
  92. policyengine_uk/parameters/gov/dwp/universal_credit/rebalancing/active.yaml +9 -0
  93. policyengine_uk/parameters/gov/dwp/universal_credit/rebalancing/new_claimant_health_element.yaml +9 -0
  94. policyengine_uk/parameters/gov/dwp/universal_credit/rebalancing/standard_allowance_uplift.yaml +13 -0
  95. policyengine_uk/parameters/gov/dwp/universal_credit/standard_allowance/amount.yaml +5 -5
  96. policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/maximum_taxable_income.yaml +2 -1
  97. policyengine_uk/parameters/gov/dwp/winter_fuel_payment/eligibility/taxable_income_test/use_maximum_taxable_income.yaml +1 -0
  98. policyengine_uk/parameters/gov/dynamic/obr_labour_supply_assumptions.yaml +9 -0
  99. policyengine_uk/parameters/gov/economic_assumptions/create_economic_assumption_indices.py +1 -1
  100. policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml +522 -153
  101. policyengine_uk/parameters/gov/hmrc/cgt/additional_rate.yaml +5 -0
  102. policyengine_uk/parameters/gov/hmrc/cgt/basic_rate.yaml +5 -0
  103. policyengine_uk/parameters/gov/hmrc/cgt/higher_rate.yaml +4 -0
  104. policyengine_uk/parameters/gov/hmrc/child_benefit/amount/additional.yaml +6 -6
  105. policyengine_uk/parameters/gov/hmrc/child_benefit/amount/eldest.yaml +8 -8
  106. policyengine_uk/parameters/gov/hmrc/child_benefit/takeup/by_age.yaml +1 -1
  107. policyengine_uk/parameters/gov/hmrc/fuel_duty/calculate_fuel_duty_rates.py +464 -0
  108. policyengine_uk/parameters/gov/hmrc/fuel_duty/petrol_and_diesel.yaml +86 -10
  109. policyengine_uk/parameters/gov/hmrc/income_tax/allowances/personal_allowance/amount.yaml +6 -0
  110. policyengine_uk/parameters/gov/hmrc/income_tax/earned_taxable_income_exclusions.yaml +2 -1
  111. policyengine_uk/parameters/gov/hmrc/income_tax/income_tax_additions.yaml +1 -0
  112. policyengine_uk/parameters/gov/hmrc/income_tax/rates/dividends.yaml +12 -0
  113. policyengine_uk/parameters/gov/hmrc/income_tax/rates/property.yaml +46 -0
  114. policyengine_uk/parameters/gov/hmrc/income_tax/rates/savings.yaml +46 -0
  115. policyengine_uk/parameters/gov/hmrc/income_tax/rates/scotland/rates.yaml +2 -2
  116. policyengine_uk/parameters/gov/hmrc/income_tax/rates/uk.yaml +14 -2
  117. policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/rates/employee/additional.yaml +4 -6
  118. policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/rates/employer.yaml +3 -3
  119. policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/secondary_threshold.yaml +14 -4
  120. policyengine_uk/parameters/gov/hmrc/national_insurance/class_2/flat_rate.yaml +2 -2
  121. policyengine_uk/parameters/gov/hmrc/national_insurance/salary_sacrifice_pension_cap.yaml +16 -0
  122. policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/index.yaml +12 -0
  123. policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/plan_1/boe_margin.yaml +11 -0
  124. policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/plan_2/additional_rate.yaml +27 -0
  125. policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/plan_2/index.yaml +16 -0
  126. policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/plan_2/upper_threshold.yaml +48 -0
  127. policyengine_uk/parameters/gov/hmrc/student_loans/interest_rates/postgraduate_additional_rate.yaml +11 -0
  128. policyengine_uk/parameters/gov/hmrc/student_loans/postgraduate_repayment_rate.yaml +9 -0
  129. policyengine_uk/parameters/gov/hmrc/student_loans/repayment_rate.yaml +9 -0
  130. policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/plan_1.yaml +25 -0
  131. policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/plan_2.yaml +58 -0
  132. policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/plan_4.yaml +19 -0
  133. policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/plan_5.yaml +16 -0
  134. policyengine_uk/parameters/gov/hmrc/student_loans/thresholds/postgraduate.yaml +21 -0
  135. policyengine_uk/parameters/gov/hmrc/vat/reduced_rate_share.yaml +3 -3
  136. policyengine_uk/parameters/gov/indices/private_rent_index.yaml +9 -9
  137. policyengine_uk/parameters/gov/revenue_scotland/lbtt/non_residential.yaml +2 -2
  138. policyengine_uk/parameters/gov/revenue_scotland/lbtt/rent.yaml +2 -2
  139. policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/first_time_buyer_rate.yaml +2 -2
  140. policyengine_uk/parameters/gov/revenue_scotland/lbtt/residential/rate.yaml +2 -2
  141. policyengine_uk/parameters/gov/wra/land_transaction_tax/non_residential.yaml +2 -2
  142. policyengine_uk/parameters/gov/wra/land_transaction_tax/rent.yaml +2 -2
  143. policyengine_uk/parameters/gov/wra/land_transaction_tax/residential/higher_rate.yaml +1 -1
  144. policyengine_uk/parameters/gov/wra/land_transaction_tax/residential/primary.yaml +2 -2
  145. policyengine_uk/parameters/household/consumption/carbon/consumption.yaml +8 -6
  146. policyengine_uk/parameters/household/consumption/carbon/intensity.yaml +4 -1
  147. policyengine_uk/parameters/household/consumption/carbon/production.yaml +12 -7
  148. policyengine_uk/parameters/household/consumption/carbon/production_by_source.yaml +76 -41
  149. policyengine_uk/parameters/household/consumption/fuel/prices/petrol.yaml +1 -1
  150. policyengine_uk/parameters/household/poverty/absolute_poverty_threshold_bhc.yaml +1 -1
  151. policyengine_uk/reforms/policyengine/adjust_budgets.py +0 -1
  152. policyengine_uk/scenarios/__init__.py +4 -0
  153. policyengine_uk/scenarios/pip_reform.py +23 -0
  154. policyengine_uk/scenarios/reindex_benefit_cap.py +32 -0
  155. policyengine_uk/scenarios/repeal_two_child_limit.py +10 -0
  156. policyengine_uk/scenarios/uc_reform.py +50 -0
  157. policyengine_uk/simulation.py +619 -0
  158. policyengine_uk/system.py +3 -257
  159. policyengine_uk/tax_benefit_system.py +141 -0
  160. policyengine_uk/tests/behavioral_responses/test_labor_supply_responses.yaml +183 -0
  161. policyengine_uk/tests/microsimulation/reforms_config.yaml +8 -8
  162. policyengine_uk/tests/microsimulation/test_reform_impacts.py +2 -2
  163. policyengine_uk/tests/microsimulation/test_salary_sacrifice_cap_reform.py +401 -0
  164. policyengine_uk/tests/microsimulation/test_validity.py +2 -3
  165. policyengine_uk/tests/microsimulation/update_reform_impacts.py +104 -40
  166. policyengine_uk/tests/policy/baseline/contrib/policyengine/employer_ni/employer_ni_fixed_employer_cost_change.yaml +105 -0
  167. policyengine_uk/tests/policy/baseline/finance/benefit/family/child_benefit.yaml +2 -0
  168. policyengine_uk/tests/policy/baseline/finance/benefit/family/income_support.yaml +0 -23
  169. policyengine_uk/tests/policy/baseline/gov/dcms/bbc/tv-licence/tv_licence.yaml +3 -0
  170. policyengine_uk/tests/policy/baseline/gov/dfe/extended_childcare_entitlement/extended_childcare_entitlement.yaml +17 -17
  171. policyengine_uk/tests/policy/baseline/gov/dwp/basic_state_pension.yaml +44 -0
  172. policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/allowances/gift_aid.yaml +71 -0
  173. policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/allowances/personal_allowance.yaml +161 -0
  174. policyengine_uk/tests/policy/baseline/gov/hmrc/national_insurance/salary_sacrifice_pension_ni_employee.yaml +107 -0
  175. policyengine_uk/tests/policy/baseline/gov/hmrc/national_insurance/salary_sacrifice_pension_ni_employer.yaml +95 -0
  176. policyengine_uk/tests/policy/baseline/gov/hmrc/student_loans/student_loan_interest_rate.yaml +153 -0
  177. policyengine_uk/tests/policy/baseline/gov/hmrc/student_loans/student_loan_repayment.yaml +130 -0
  178. policyengine_uk/tests/policy/baseline/household/wealth/vehicle.yaml +27 -0
  179. policyengine_uk/tests/policy/reforms/nov_2025_budget/income_source_tax_rates.yaml +235 -0
  180. policyengine_uk/tests/policy/reforms/nov_2025_budget/income_tax_freeze.yaml +83 -0
  181. policyengine_uk/tests/policy/reforms/parametric/basic_income/basic_income.yaml +1 -0
  182. policyengine_uk/tests/test_behavioral_responses.py +215 -0
  183. policyengine_uk/tests/test_fiscal_year_parameters.py +131 -0
  184. policyengine_uk/utils/__init__.py +1 -0
  185. policyengine_uk/utils/compare.py +28 -0
  186. policyengine_uk/utils/create_ahc_deflator.py +169 -0
  187. policyengine_uk/utils/create_triple_lock.py +1 -1
  188. policyengine_uk/utils/dependencies.py +259 -0
  189. policyengine_uk/utils/parameters.py +12 -1
  190. policyengine_uk/utils/scenario.py +225 -0
  191. policyengine_uk/utils/solve_private_school_attendance_factor.py +4 -6
  192. policyengine_uk/variables/contrib/policyengine/education_budget_change.py +0 -1
  193. policyengine_uk/variables/contrib/policyengine/employer_ni/baseline_employer_cost.py +5 -1
  194. policyengine_uk/variables/contrib/policyengine/employer_ni/employer_ni_fixed_employer_cost_change.py +23 -23
  195. policyengine_uk/variables/contrib/policyengine/employer_ni/employer_ni_response_capital_incidence.py +1 -1
  196. policyengine_uk/variables/contrib/policyengine/employer_ni/employer_ni_response_consumer_incidence.py +1 -1
  197. policyengine_uk/variables/contrib/policyengine/other_public_spending_budget_change.py +0 -1
  198. policyengine_uk/variables/gov/dfe/targeted_childcare_entitlement/targeted_childcare_entitlement_eligible.py +0 -1
  199. policyengine_uk/variables/gov/dft/rail_subsidy_spending.py +16 -1
  200. policyengine_uk/variables/gov/dft/rail_usage.py +16 -0
  201. policyengine_uk/variables/gov/dwp/BRMA_LHA_rate.py +7 -2
  202. policyengine_uk/variables/gov/dwp/LHA_category.py +4 -2
  203. policyengine_uk/variables/gov/dwp/additional_state_pension.py +4 -2
  204. policyengine_uk/variables/gov/dwp/basic_state_pension.py +26 -8
  205. policyengine_uk/variables/gov/dwp/is_CTC_eligible.py +1 -1
  206. policyengine_uk/variables/gov/dwp/is_benefit_cap_exempt.py +9 -13
  207. policyengine_uk/variables/gov/dwp/is_benefit_cap_exempt_earnings.py +66 -0
  208. policyengine_uk/variables/gov/dwp/is_benefit_cap_exempt_health_disability.py +75 -0
  209. policyengine_uk/variables/gov/dwp/is_benefit_cap_exempt_other.py +66 -0
  210. policyengine_uk/variables/gov/dwp/winter_fuel_allowance.py +5 -4
  211. policyengine_uk/variables/gov/gov_tax.py +0 -2
  212. policyengine_uk/variables/gov/hmrc/household_tax.py +0 -1
  213. policyengine_uk/variables/gov/hmrc/income_tax/allowances/gift_aid.py +23 -0
  214. policyengine_uk/variables/gov/hmrc/income_tax/allowances/personal_allowance.py +9 -2
  215. policyengine_uk/variables/gov/hmrc/income_tax/income_tax_pre_charges.py +1 -0
  216. policyengine_uk/variables/gov/hmrc/income_tax/liability/property_income_tax.py +75 -0
  217. policyengine_uk/variables/gov/hmrc/income_tax/liability/savings_income_tax.py +4 -4
  218. policyengine_uk/variables/gov/hmrc/national_insurance/salary_sacrifice_broad_base_haircut.py +43 -0
  219. policyengine_uk/variables/gov/hmrc/national_insurance/salary_sacrifice_pension_ni_employee.py +38 -0
  220. policyengine_uk/variables/gov/hmrc/national_insurance/salary_sacrifice_pension_ni_employer.py +27 -0
  221. policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_via_salary_sacrifice_adjusted.py +31 -0
  222. policyengine_uk/variables/gov/hmrc/pensions/salary_sacrifice_returned_to_income.py +41 -0
  223. policyengine_uk/variables/gov/hmrc/student_loans/__init__.py +2 -0
  224. policyengine_uk/variables/gov/hmrc/student_loans/plan_1_interest_rate.py +23 -0
  225. policyengine_uk/variables/gov/hmrc/student_loans/plan_2_interest_rate.py +31 -0
  226. policyengine_uk/variables/gov/hmrc/student_loans/plan_4_interest_rate.py +22 -0
  227. policyengine_uk/variables/gov/hmrc/student_loans/plan_5_interest_rate.py +18 -0
  228. policyengine_uk/variables/gov/hmrc/student_loans/postgraduate_interest_rate.py +23 -0
  229. policyengine_uk/variables/gov/hmrc/student_loans/student_loan_plan.py +27 -0
  230. policyengine_uk/variables/gov/hmrc/student_loans/student_loan_repayment.py +91 -0
  231. policyengine_uk/variables/gov/hmrc/student_loans/student_loan_repayment_rate.py +31 -0
  232. policyengine_uk/variables/gov/hmrc/would_claim_child_benefit.py +5 -1
  233. policyengine_uk/variables/household/demographic/benunit/benunit_count_adults.py +11 -0
  234. policyengine_uk/variables/household/demographic/is_disabled_for_benefits.py +13 -1
  235. policyengine_uk/variables/household/income/hbai_household_net_income.py +29 -1
  236. policyengine_uk/variables/household/income/hbai_household_net_income_ahc.py +13 -0
  237. policyengine_uk/variables/household/income/household_net_income.py +5 -1
  238. policyengine_uk/variables/household/income/inflation_adjustment.py +24 -0
  239. policyengine_uk/variables/household/post_tax_income.py +12 -0
  240. policyengine_uk/variables/household/wealth/num_vehicles.py +9 -0
  241. policyengine_uk/variables/household/wealth/owns_vehicle.py +17 -0
  242. policyengine_uk/variables/input/consumption/property/council_tax.py +0 -35
  243. policyengine_uk/variables/input/consumption/property/employee_pension_contributions.py +8 -1
  244. policyengine_uk/variables/input/consumption/property/employee_pension_contributions_reported.py +16 -0
  245. policyengine_uk/variables/input/consumption/property/pension_contributions_via_salary_sacrifice.py +16 -0
  246. policyengine_uk/variables/input/employment_income.py +2 -0
  247. policyengine_uk/variables/input/rent.py +0 -40
  248. policyengine_uk/variables/input/savings_interest_income.py +3 -1
  249. {policyengine_uk-2.40.1.dist-info → policyengine_uk-2.65.6.dist-info}/METADATA +17 -8
  250. {policyengine_uk-2.40.1.dist-info → policyengine_uk-2.65.6.dist-info}/RECORD +252 -173
  251. {policyengine_uk-2.40.1.dist-info → policyengine_uk-2.65.6.dist-info}/WHEEL +1 -1
  252. policyengine_uk/repo.py +0 -3
  253. policyengine_uk/tests/policy/baseline/gov/abolitions/abolition_parameters.yaml +0 -250
  254. policyengine_uk/variables/contrib/policyengine/high_income_incident_tax_change.py +0 -22
  255. policyengine_uk-2.40.1.data/data/share/openfisca/openfisca-country-template/CHANGELOG.md +0 -2285
  256. policyengine_uk-2.40.1.data/data/share/openfisca/openfisca-country-template/README.md +0 -37
  257. policyengine_uk-2.40.1.dist-info/licenses/LICENSE +0 -661
  258. {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