From 8ddb50e659459e8b4ca074a5855ddc6151ad2957 Mon Sep 17 00:00:00 2001 From: patrickneyland Date: Wed, 11 Oct 2023 15:55:53 -0600 Subject: [PATCH 01/37] added variables to make salt deduction more accurate --- fiscalsim_us/variables/gov/irs/README.md | 11 ++++++++++ .../itemizing/prior_year_salt_paid.py | 12 +++++++++++ .../deductions/itemizing/salt_deduction.py | 4 ++-- .../prior_year_local_income_tax_paid.py | 9 ++++++++ .../prior_year_state_income_tax_paid.py | 9 ++++++++ ...r_prior_year_state_and_local_income_tax.py | 21 +++++++++++++++++++ 6 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 fiscalsim_us/variables/gov/irs/README.md create mode 100644 fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py create mode 100644 fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py create mode 100644 fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_state_income_tax_paid.py create mode 100644 fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py diff --git a/fiscalsim_us/variables/gov/irs/README.md b/fiscalsim_us/variables/gov/irs/README.md new file mode 100644 index 000000000..ac86d7968 --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/README.md @@ -0,0 +1,11 @@ +# IRS +### SALT Deduction + +- The SALT deduction depends on several input variables in Fiscalsim-us. + - 'sales_or_prior_year_state_and_local_income_tax.py' + - 'prior_year_state_income_tax_paid.py' + - 'prior_year_local_income_tax_paid.py' + - 'state_sales_tax.py' + - 'local_sales_tax.py' + - 'real_estate_taxes.py' + diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py new file mode 100644 index 000000000..5fed45b24 --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class prior_year_salt_paid(Variable): + value_type = float + entity = TaxUnit + label = "Prior year SALT liability paid" + unit = USD + documentation = "State and local taxes plus real estate tax deduction from taxable income." + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/164" + diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py index bde317503..8c50bbb2f 100644 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py @@ -6,7 +6,7 @@ class salt_deduction(Variable): entity = TaxUnit label = "SALT deduction" unit = USD - documentation = "State and local taxes plus real estate tax deduction from taxable income." + documentation = "State and local taxes paid plus real estate tax deduction from taxable income." definition_period = YEAR reference = "https://www.law.cornell.edu/uscode/text/26/164" @@ -14,7 +14,7 @@ def formula(tax_unit, period, parameters): salt_amount = add( tax_unit, period, - ["state_and_local_sales_or_income_tax", "real_estate_taxes"], + ["sales_or_prior_year_state_and_local_income_tax_paid", "real_estate_taxes"], ) salt = parameters( period diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py new file mode 100644 index 000000000..aff12c49d --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class prior_year_local_income_tax_paid(Variable): + value_type = float + entity = Person + label = "Prior year local income taxes paid" + unit = USD + definition_period = YEAR \ No newline at end of file diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_state_income_tax_paid.py b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_state_income_tax_paid.py new file mode 100644 index 000000000..9a3433402 --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_state_income_tax_paid.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class prior_year_state_income_tax_paid(Variable): + value_type = float + entity = Person + label = "Prior year state income taxes paid" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py new file mode 100644 index 000000000..3547c057c --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class sales_or_prior_year_state_and_local_income_tax_paid(Variable): + value_type = float + entity = TaxUnit + definition_period = YEAR + label = "Prior year state and local income taxes paid or state and local sales taxes paid" + unit = USD + + def formula(tax_unit, period, parameters): + # Only sales or income tax can be itemized, but not both. + prior_year_income_tax = add( + tax_unit, period, ["prior_year_state_income_tax_paid", + "prior_year_local_income_tax_paid"] + ) + sales_tax = add( + tax_unit, period, ["state_sales_tax", + "local_sales_tax"] + ) + return max_(prior_year_income_tax, sales_tax) \ No newline at end of file From 3a548e509f314ddd4b07005823f587fc25423c65 Mon Sep 17 00:00:00 2001 From: patrickneyland Date: Wed, 11 Oct 2023 15:57:56 -0600 Subject: [PATCH 02/37] added states back to state_income_tax.py --- .../variables/gov/states/tax/income/state_income_tax.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index b6f1facfb..8b5e4a97f 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -10,7 +10,7 @@ class state_income_tax(Variable): adds = [ # state income tax variables listed in alphabetical order: "ca_income_tax", - # "ia_income_tax", --- activating will cause circular logic errors + "ia_income_tax", "il_income_tax", "ks_income_tax", "la_income_tax", @@ -21,8 +21,8 @@ class state_income_tax(Variable): "mt_income_tax", # "mo_income_tax", --- activating will cause circular logic errors "nc_income_tax", - # "nd_income_tax", --- activating will cause circular logic errors - # "ne_income_tax", --- activating will cause circular logic errors + "nd_income_tax", + "ne_income_tax", "nh_income_tax", "nj_income_tax", "ny_income_tax", From fb2bd8c29886014b8f05896ba25862f921219dd5 Mon Sep 17 00:00:00 2001 From: patrickneyland Date: Wed, 11 Oct 2023 16:28:15 -0600 Subject: [PATCH 03/37] added documentation --- CHANGELOG.md | 7 +++++++ changelog.yaml | 6 ++++++ .../deductions/itemizing/prior_year_salt_paid.py | 1 - .../deductions/itemizing/salt_deduction.py | 5 ++++- .../itemized/prior_year_local_income_tax_paid.py | 2 +- ...ales_or_prior_year_state_and_local_income_tax.py | 13 ++++++++----- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5d9b0e37..92fa9bcec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.2.2] - 2023-10-11 16:00:00 + +### Added + +- added three files `prior_year_state_income_tax_paid.py`, `prior_year_local_income_tax_paid.py`, and `sales_or_prior_year_state_and_local_income_tax.py` +- adjusted `salt_deduction.py` to calculate based on the added variables above + ## [0.2.1] - 2023-10-09 02:00:00 ### Added diff --git a/changelog.yaml b/changelog.yaml index e57a8b6c7..c71000e6d 100644 --- a/changelog.yaml +++ b/changelog.yaml @@ -146,3 +146,9 @@ added: - Updates two files `la_nonrefundable_childcare.py` and `in_unemployment_compensation_deduction.py` that need a `min()` reference updated to `min_()` date: 2023-10-09 02:00:00 +- bump: patch + changes: + - adjusted `salt_deduction.py` to calculate based on the added variables + added: + - Adds three files `prior_year_state_income_tax_paid.py`, `prior_year_local_income_tax_paid.py`, and `sales_or_prior_year_state_and_local_income_tax.py` + date: 2023-10-11 16:00:00 diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py index 5fed45b24..0d61d3dd4 100644 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py @@ -9,4 +9,3 @@ class prior_year_salt_paid(Variable): documentation = "State and local taxes plus real estate tax deduction from taxable income." definition_period = YEAR reference = "https://www.law.cornell.edu/uscode/text/26/164" - diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py index 8c50bbb2f..c5d6ece80 100644 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py @@ -14,7 +14,10 @@ def formula(tax_unit, period, parameters): salt_amount = add( tax_unit, period, - ["sales_or_prior_year_state_and_local_income_tax_paid", "real_estate_taxes"], + [ + "sales_or_prior_year_state_and_local_income_tax_paid", + "real_estate_taxes", + ], ) salt = parameters( period diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py index aff12c49d..fa8b1c46e 100644 --- a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py +++ b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py @@ -6,4 +6,4 @@ class prior_year_local_income_tax_paid(Variable): entity = Person label = "Prior year local income taxes paid" unit = USD - definition_period = YEAR \ No newline at end of file + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py index 3547c057c..456fecf86 100644 --- a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py +++ b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py @@ -11,11 +11,14 @@ class sales_or_prior_year_state_and_local_income_tax_paid(Variable): def formula(tax_unit, period, parameters): # Only sales or income tax can be itemized, but not both. prior_year_income_tax = add( - tax_unit, period, ["prior_year_state_income_tax_paid", - "prior_year_local_income_tax_paid"] + tax_unit, + period, + [ + "prior_year_state_income_tax_paid", + "prior_year_local_income_tax_paid", + ], ) sales_tax = add( - tax_unit, period, ["state_sales_tax", - "local_sales_tax"] + tax_unit, period, ["state_sales_tax", "local_sales_tax"] ) - return max_(prior_year_income_tax, sales_tax) \ No newline at end of file + return max_(prior_year_income_tax, sales_tax) From f9da9e78187a67fae89041eb694ae8fb32e1332c Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 01:05:09 -0600 Subject: [PATCH 04/37] Updated .coveragerc --- .coveragerc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.coveragerc b/.coveragerc index 713715b1c..0e3bf94a6 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,2 +1,6 @@ [run] disable_warnings = couldnt-parse + +[report] +# Include only variables related to taxes and benefits: +include = */variables/* From 970452ad864e2e5caa5400bc4015a56dd0e15ad7 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 01:09:17 -0600 Subject: [PATCH 05/37] Updated changelog files --- CHANGELOG.md | 47 +++++++++++++++++++++++++++-------------------- changelog.yaml | 5 +++++ 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5d9b0e37..4be69743f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.2.2] - 2023-10-13 12:00:00 + +### Added + +- Updates files from PolicyEngine-US v0.500.0 (e4a95733baafca0a7bec9ae79e96797416a4d237) + ## [0.2.1] - 2023-10-09 02:00:00 ### Added @@ -158,23 +164,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - First prototype version based off of openfisca-us and tax-calculator. -[0.2.1]: https://github.com/TheCGO/fiscalsim-us/compare/0.2.0...0.2.1 -[0.2.0]: https://github.com/TheCGO/fiscalsim-us/compare/0.1.5...0.2.0 -[0.1.5]: https://github.com/TheCGO/fiscalsim-us/compare/0.1.4...0.1.5 -[0.1.4]: https://github.com/TheCGO/fiscalsim-us/compare/0.1.3...0.1.4 -[0.1.3]: https://github.com/TheCGO/fiscalsim-us/compare/0.1.2...0.1.3 -[0.1.2]: https://github.com/TheCGO/fiscalsim-us/compare/0.1.1...0.1.2 -[0.1.1]: https://github.com/TheCGO/fiscalsim-us/compare/0.1.0...0.1.1 -[0.1.0]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.12...0.1.0 -[0.0.12]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.11...0.0.12 -[0.0.11]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.10...0.0.11 -[0.0.10]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.9...0.0.10 -[0.0.9]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.8...0.0.9 -[0.0.8]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.7...0.0.8 -[0.0.7]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.6...0.0.7 -[0.0.6]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.5...0.0.6 -[0.0.5]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.4...0.0.5 -[0.0.4]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.3...0.0.4 -[0.0.3]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.2...0.0.3 -[0.0.2]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.1...0.0.2 -[0.0.1]: https://github.com/TheCGO/fiscalsim-us/compare/0.0.0...0.0.1 +[0.2.2]: https://github.com/TheCGO/fiscalsim-us/compare/v0.2.1...v0.2.2 +[0.2.1]: https://github.com/TheCGO/fiscalsim-us/compare/v0.2.0...v0.2.1 +[0.2.0]: https://github.com/TheCGO/fiscalsim-us/compare/v0.1.5...v0.2.0 +[0.1.5]: https://github.com/TheCGO/fiscalsim-us/compare/v0.1.4...v0.1.5 +[0.1.4]: https://github.com/TheCGO/fiscalsim-us/compare/v0.1.3...v0.1.4 +[0.1.3]: https://github.com/TheCGO/fiscalsim-us/compare/v0.1.2...v0.1.3 +[0.1.2]: https://github.com/TheCGO/fiscalsim-us/compare/v0.1.1...v0.1.2 +[0.1.1]: https://github.com/TheCGO/fiscalsim-us/compare/v0.1.0...v0.1.1 +[0.1.0]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.12...v0.1.0 +[0.0.12]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.11...v0.0.12 +[0.0.11]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.10...v0.0.11 +[0.0.10]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.9...v0.0.10 +[0.0.9]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.8...v0.0.9 +[0.0.8]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.7...v0.0.8 +[0.0.7]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.6...v0.0.7 +[0.0.6]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.5...v0.0.6 +[0.0.5]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.4...v0.0.5 +[0.0.4]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.3...v0.0.4 +[0.0.3]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.2...v0.0.3 +[0.0.2]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.1...v0.0.2 +[0.0.1]: https://github.com/TheCGO/fiscalsim-us/compare/v0.0.0...v0.0.1 diff --git a/changelog.yaml b/changelog.yaml index e57a8b6c7..8361d7182 100644 --- a/changelog.yaml +++ b/changelog.yaml @@ -146,3 +146,8 @@ added: - Updates two files `la_nonrefundable_childcare.py` and `in_unemployment_compensation_deduction.py` that need a `min()` reference updated to `min_()` date: 2023-10-09 02:00:00 +- bump: patch + changes: + added: + - Updates files from PolicyEngine-US v0.500.0 (e4a95733baafca0a7bec9ae79e96797416a4d237) + date: 2023-10-13 12:00:00 From 6fb5daed6601a0cc74af69586afd33a18a8d950d Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 01:14:45 -0600 Subject: [PATCH 06/37] Updated setup.py --- setup.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/setup.py b/setup.py index db1541a13..66b63d4d3 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name="fiscalsim-us", - version="0.2.1", + version="0.2.2", author="Center for Growth and Opportunity at Utah State University (CGO)", author_email="fiscalsim@thecgo.org", long_description=readme, @@ -35,9 +35,6 @@ "click==8.1.3", "h5py", "microdf_python", - # NumPy v1.21.0 breaks matplotlib (see - # https://matplotlib.org/stable/devel/min_dep_policy.html#list-of-dependency-versions) - # But policyengine-core requires numpy<1.22 and >=1.21 "numpy>=1.24, <1.25", "pandas", "pathlib", @@ -72,7 +69,6 @@ "survey-enhance", ], }, - # Windows CI requires Python 3.9. python_requires=">=3.10, <3.12", entry_points={ "console_scripts": [ From 98c2bccbe8bef74dd5a120fc49c4341cb0e4350d Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 01:22:36 -0600 Subject: [PATCH 07/37] Renamed test --- .../{ssbenefits.yaml => taxable_social_security.yaml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename fiscalsim_us/tests/policy/baseline/calcfunctions/{ssbenefits.yaml => taxable_social_security.yaml} (98%) diff --git a/fiscalsim_us/tests/policy/baseline/calcfunctions/ssbenefits.yaml b/fiscalsim_us/tests/policy/baseline/calcfunctions/taxable_social_security.yaml similarity index 98% rename from fiscalsim_us/tests/policy/baseline/calcfunctions/ssbenefits.yaml rename to fiscalsim_us/tests/policy/baseline/calcfunctions/taxable_social_security.yaml index 06abe151c..a30c8145e 100644 --- a/fiscalsim_us/tests/policy/baseline/calcfunctions/ssbenefits.yaml +++ b/fiscalsim_us/tests/policy/baseline/calcfunctions/taxable_social_security.yaml @@ -1,5 +1,5 @@ # Tests were generated from Tax-Calculator, but were amended after refactoring and editing variable names. -# `taxable_ss_magi` previously was `ymod`, which contains 50% of Social Security (in FiscalSim-US, this is +# `taxable_ss_magi` previously was `ymod`, which contains 50% of Social Security (in OpenFisca-US, this is # added separately). Therefore, all `taxable_ss_magi` values have been corrected by removing half of social # security inputs. From 5ae7c75fa13d06b181e4d7e59a90e6edcb0a262e Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 01:51:06 -0600 Subject: [PATCH 08/37] Updated cps.py --- fiscalsim_us/data/datasets/cps/cps.py | 752 +++++++++++++------------- 1 file changed, 378 insertions(+), 374 deletions(-) diff --git a/fiscalsim_us/data/datasets/cps/cps.py b/fiscalsim_us/data/datasets/cps/cps.py index 30a677fce..4573bcdb1 100644 --- a/fiscalsim_us/data/datasets/cps/cps.py +++ b/fiscalsim_us/data/datasets/cps/cps.py @@ -1,374 +1,378 @@ -import logging -from policyengine_core.data import Dataset -import h5py -from fiscalsim_us.data.datasets.cps.raw_cps import ( - RawCPS_2020, - RawCPS_2021, - RawCPS, -) -from fiscalsim_us.data.datasets.cps.uprated_cps import UpratedCPS -from fiscalsim_us.data.storage import STORAGE_FOLDER -from pandas import DataFrame, Series -import numpy as np -import pandas as pd -import os -import yaml -from typing import Type - - -class CPS(Dataset): - name = "cps" - label = "CPS" - raw_cps: Type[RawCPS] = None - data_format = Dataset.ARRAYS - - def generate(self): - """Generates the Current Population Survey dataset for FiscalSim US microsimulations. - Technical documentation and codebook here: https://www2.census.gov/programs-surveys/cps/techdocs/cpsmar21.pdf - """ - - raw_data = self.raw_cps().load() - cps = h5py.File(self.file_path, mode="w") - - ENTITIES = ("person", "tax_unit", "family", "spm_unit", "household") - person, tax_unit, family, spm_unit, household = [ - raw_data[entity] for entity in ENTITIES - ] - - add_id_variables(cps, person, tax_unit, family, spm_unit, household) - add_personal_variables(cps, person) - add_personal_income_variables(cps, person, self.raw_cps.time_period) - add_spm_variables(cps, spm_unit) - add_household_variables(cps, household) - - raw_data.close() - cps.close() - - cps = h5py.File(self.file_path, mode="a") - add_silver_plan_cost(self, cps, 2022) - cps.close() - - -def add_silver_plan_cost(self, cps: h5py.File, year: int): - """Adds the second-lowest silver plan cost for each tax unit, based on geography. - - Args: - cps (h5py.File): The CPS dataset file. - year (int): The year of the data. - """ - from fiscalsim_us import Microsimulation - - sim = Microsimulation(dataset=self) - slspc = sim.calc("second_lowest_silver_plan_cost", year).values - - cps["second_lowest_silver_plan_cost"] = slspc - - -def add_id_variables( - cps: h5py.File, - person: DataFrame, - tax_unit: DataFrame, - family: DataFrame, - spm_unit: DataFrame, - household: DataFrame, -) -> None: - """Add basic ID and weight variables. - - Args: - cps (h5py.File): The CPS dataset file. - person (DataFrame): The person table of the ASEC. - tax_unit (DataFrame): The tax unit table created from the person table - of the ASEC. - family (DataFrame): The family table of the ASEC. - spm_unit (DataFrame): The SPM unit table created from the person table - of the ASEC. - household (DataFrame): The household table of the ASEC. - """ - # Add primary and foreign keys - cps["person_id"] = person.PH_SEQ * 100 + person.P_SEQ - cps["family_id"] = family.FH_SEQ * 10 + family.FFPOS - cps["household_id"] = household.H_SEQ - cps["person_tax_unit_id"] = person.TAX_ID - cps["person_spm_unit_id"] = person.SPM_ID - cps["tax_unit_id"] = tax_unit.TAX_ID - cps["spm_unit_id"] = spm_unit.SPM_ID - cps["person_household_id"] = person.PH_SEQ - cps["person_family_id"] = person.PH_SEQ * 10 + person.PF_SEQ - - # Add weights - # Weights are multiplied by 100 to avoid decimals - cps["person_weight"] = person.A_FNLWGT / 1e2 - cps["family_weight"] = family.FSUP_WGT / 1e2 - - # Tax unit weight is the weight of the containing family. - family_weight = Series( - cps["family_weight"][...], index=cps["family_id"][...] - ) - person_family_id = cps["person_family_id"][...] - persons_family_weight = Series(family_weight[person_family_id]) - cps["tax_unit_weight"] = persons_family_weight.groupby( - cps["person_tax_unit_id"][...] - ).first() - - cps["spm_unit_weight"] = spm_unit.SPM_WEIGHT / 1e2 - - cps["household_weight"] = household.HSUP_WGT / 1e2 - - # Marital units - - marital_unit_id = person.PH_SEQ * 1e6 + np.maximum( - person.A_LINENO, person.A_SPOUSE - ) - - # marital_unit_id is not the household ID, zero padded and followed - # by the index within household (of each person, or their spouse if - # one exists earlier in the survey). - - marital_unit_id = Series(marital_unit_id).rank( - method="dense" - ) # Simplify to a natural number sequence with repetitions [0, 1, 1, 2, 3, ...] - - cps["person_marital_unit_id"] = marital_unit_id.values - cps["marital_unit_id"] = marital_unit_id.drop_duplicates().values - - -def add_personal_variables(cps: h5py.File, person: DataFrame) -> None: - """Add personal demographic variables. - - Args: - cps (h5py.File): The CPS dataset file. - person (DataFrame): The CPS person table. - """ - - # The CPS provides age as follows: - # 00-79 = 0-79 years of age - # 80 = 80-84 years of age - # 85 = 85+ years of age - # We assign the 80 ages randomly between 80 and 84. - # to avoid unrealistically bunching at 80. - cps["age"] = np.where( - person.A_AGE == 80, - # NB: randint is inclusive of first argument, exclusive of second. - np.random.randint(80, 85, len(person)), - person.A_AGE, - ) - # A_SEX is 1 -> male, 2 -> female. - cps["is_female"] = person.A_SEX == 2 - # "Is...blind or does...have serious difficulty seeing even when Wearing - # glasses?" 1 -> Yes - cps["is_blind"] = person.PEDISEYE == 1 - DISABILITY_FLAGS = [ - "PEDIS" + i for i in ["DRS", "EAR", "EYE", "OUT", "PHY", "REM"] - ] - cps["is_ssi_disabled"] = (person[DISABILITY_FLAGS] == 1).any(axis=1) - - def children_per_parent(col: str) -> pd.DataFrame: - """Calculate number of children in the household using parental - pointers. - - Args: - col (str): Either PEPAR1 and PEPAR2, which correspond to A_LINENO - of the person's first and second parent in the household, - respectively. - """ - return ( - person[person[col] > 0] - .groupby(["PH_SEQ", col]) - .size() - .reset_index() - .rename(columns={col: "A_LINENO", 0: "children"}) - ) - - # Aggregate to parent. - res = ( - pd.concat( - [children_per_parent("PEPAR1"), children_per_parent("PEPAR2")] - ) - .groupby(["PH_SEQ", "A_LINENO"]) - .children.sum() - .reset_index() - ) - tmp = person[["PH_SEQ", "A_LINENO"]].merge( - res, on=["PH_SEQ", "A_LINENO"], how="left" - ) - cps["own_children_in_household"] = tmp.children.fillna(0) - - cps["has_marketplace_health_coverage"] = person.MRK == 1 - - cps["cps_race"] = person.PRDTRACE - cps["is_hispanic"] = person.PRDTHSP != 0 - - -def add_personal_income_variables( - cps: h5py.File, person: DataFrame, year: int -): - """Add income variables. - - Args: - cps (h5py.File): The CPS dataset file. - person (DataFrame): The CPS person table. - year (int): The CPS year - """ - # Get income imputation parameters. - yamlfilename = os.path.join( - os.path.abspath(os.path.dirname(__file__)), "income_parameters.yaml" - ) - with open(yamlfilename, "r", encoding="utf-8") as yamlfile: - p = yaml.safe_load(yamlfile) - assert isinstance(p, dict) - - # Assign CPS variables. - cps["employment_income"] = person.WSAL_VAL - cps["taxable_interest_income"] = person.INT_VAL * ( - p["taxable_interest_fraction"][year] - ) - cps["tax_exempt_interest_income"] = person.INT_VAL * ( - 1 - p["taxable_interest_fraction"][year] - ) - cps["self_employment_income"] = person.SEMP_VAL - cps["farm_income"] = person.FRSE_VAL - cps["qualified_dividend_income"] = person.DIV_VAL * ( - p["qualified_dividend_fraction"][year] - ) - cps["non_qualified_dividend_income"] = person.DIV_VAL * ( - 1 - p["qualified_dividend_fraction"][year] - ) - cps["rental_income"] = person.RNT_VAL - # Assign Social Security retirement benefits if at least 62. - MINIMUM_RETIREMENT_AGE = 62 - cps["social_security_retirement"] = np.where( - person.A_AGE >= MINIMUM_RETIREMENT_AGE, person.SS_VAL, 0 - ) - # Otherwise assign them to Social Security disability benefits. - cps["social_security_disability"] = ( - person.SS_VAL - cps["social_security_retirement"] - ) - cps["unemployment_compensation"] = person.UC_VAL - # Add pensions and annuities. - cps_pensions = person.PNSN_VAL + person.ANN_VAL - cps["taxable_pension_income"] = cps_pensions * ( - p["taxable_pension_fraction"][year] - ) - cps["tax_exempt_pension_income"] = cps_pensions * ( - 1 - p["taxable_pension_fraction"][year] - ) - # Other income (OI_VAL) is a catch-all for all other income sources. - # The code for alimony income is 20. - cps["alimony_income"] = (person.OI_OFF == 20) * person.OI_VAL - # The code for strike benefits is 12. - cps["strike_benefits"] = (person.OI_OFF == 12) * person.OI_VAL - cps["child_support_received"] = person.CSP_VAL - # Assume all public assistance / welfare dollars (PAW_VAL) are TANF. - # They could also include General Assistance. - cps["tanf_reported"] = person.PAW_VAL - cps["ssi_reported"] = person.SSI_VAL - cps["pension_contributions"] = person.RETCB_VAL - cps["long_term_capital_gains"] = person.CAP_VAL * ( - p["long_term_capgain_fraction"][year] - ) - cps["short_term_capital_gains"] = person.CAP_VAL * ( - 1 - p["long_term_capgain_fraction"][year] - ) - cps["receives_wic"] = person.WICYN == 1 - cps["veterans_benefits"] = person.VET_VAL - cps["workers_compensation"] = person.WC_VAL - # Disability income has multiple sources and values split across two pairs - # of variables. Include everything except for worker's compensation - # (code 1), which is defined as WC_VAL. - WORKERS_COMP_DISABILITY_CODE = 1 - disability_benefits_1 = person.DIS_VAL1 * ( - person.DIS_SC1 != WORKERS_COMP_DISABILITY_CODE - ) - disability_benefits_2 = person.DIS_VAL2 * ( - person.DIS_SC2 != WORKERS_COMP_DISABILITY_CODE - ) - cps["disability_benefits"] = disability_benefits_1 + disability_benefits_2 - # Expenses. - # "What is the annual amount of child support paid?" - cps["child_support_expense"] = person.CHSP_VAL - cps["health_insurance_premiums"] = person.PHIP_VAL - cps["medical_out_of_pocket_expenses"] = person.MOOP - - -def add_spm_variables(cps: h5py.File, spm_unit: DataFrame) -> None: - SPM_RENAMES = dict( - spm_unit_total_income_reported="SPM_TOTVAL", - snap_reported="SPM_SNAPSUB", - spm_unit_capped_housing_subsidy_reported="SPM_CAPHOUSESUB", - free_school_meals_reported="SPM_SCHLUNCH", - spm_unit_energy_subsidy_reported="SPM_ENGVAL", - spm_unit_wic_reported="SPM_WICVAL", - spm_unit_payroll_tax_reported="SPM_FICA", - spm_unit_federal_tax_reported="SPM_FEDTAX", - spm_unit_state_tax_reported="SPM_STTAX", - spm_unit_work_childcare_expenses="SPM_CAPWKCCXPNS", - spm_unit_medical_expenses="SPM_MEDXPNS", - spm_unit_spm_threshold="SPM_POVTHRESHOLD", - spm_unit_net_income_reported="SPM_RESOURCES", - childcare_expenses="SPM_CHILDCAREXPNS", - ) - - for fiscalsim_variable, asec_variable in SPM_RENAMES.items(): - cps[fiscalsim_variable] = spm_unit[asec_variable] - - cps["reduced_price_school_meals_reported"] = ( - cps["free_school_meals_reported"][...] * 0 - ) - - -def add_household_variables(cps: h5py.File, household: DataFrame) -> None: - cps["state_fips"] = household.GESTFIPS - cps["county_fips"] = household.GTCO - state_county_fips = cps["state_fips"][...] * 1e3 + cps["county_fips"][...] - # Assign is_nyc here instead of as a variable formula so that it shows up - # as toggleable in the webapp. - # List county FIPS codes for each NYC county/borough. - NYC_COUNTY_FIPS = [ - 5, # Bronx - 47, # Kings (Brooklyn) - 61, # New York (Manhattan) - 81, # Queens - 85, # Richmond (Staten Island) - ] - # Compute NYC by concatenating NY state FIPS with county FIPS. - # For example, 36061 is Manhattan. - NYS_FIPS = 36 - nyc_full_county_fips = [ - NYS_FIPS * 1e3 + county_fips for county_fips in NYC_COUNTY_FIPS - ] - cps["in_nyc"] = np.isin(state_county_fips, nyc_full_county_fips) - - -class CPS_2020(CPS): - name = "cps_2020" - label = "CPS 2020" - raw_cps = RawCPS_2020 - file_path = STORAGE_FOLDER / "cps_2020.h5" - time_period = 2020 - - -class CPS_2021(CPS): - name = "cps_2021" - label = "CPS 2021" - raw_cps = RawCPS_2021 - file_path = STORAGE_FOLDER / "cps_2021.h5" - time_period = 2021 - - -CPS_2022 = UpratedCPS.from_dataset( - CPS_2021, - 2022, - "cps_2022", - "CPS 2022", - STORAGE_FOLDER / "cps_2022.h5", - new_url="release://policyengine/policyengine-us/cps-2022/cps_2022.h5", -) - -CPS_2023 = UpratedCPS.from_dataset( - CPS_2021, - 2023, - "cps_2023", - "CPS 2023", - STORAGE_FOLDER / "cps_2023.h5", - new_url="release://policyengine/policyengine-us/cps-2023/cps_2023.h5", -) +import logging +from policyengine_core.data import Dataset +import h5py +from fiscalsim_us.data.datasets.cps.raw_cps import ( + RawCPS_2020, + RawCPS_2021, + RawCPS_2022, + RawCPS, +) +from fiscalsim_us.data.datasets.cps.uprated_cps import UpratedCPS +from fiscalsim_us.data.storage import STORAGE_FOLDER +from pandas import DataFrame, Series +import numpy as np +import pandas as pd +import os +import yaml +from typing import Type + + +class CPS(Dataset): + name = "cps" + label = "CPS" + raw_cps: Type[RawCPS] = None + data_format = Dataset.ARRAYS + + def generate(self): + """Generates the Current Population Survey dataset for PolicyEngine US microsimulations. + Technical documentation and codebook here: https://www2.census.gov/programs-surveys/cps/techdocs/cpsmar21.pdf + """ + + raw_data = self.raw_cps().load() + cps = h5py.File(self.file_path, mode="w") + + ENTITIES = ("person", "tax_unit", "family", "spm_unit", "household") + person, tax_unit, family, spm_unit, household = [ + raw_data[entity] for entity in ENTITIES + ] + + add_id_variables(cps, person, tax_unit, family, spm_unit, household) + add_personal_variables(cps, person) + add_personal_income_variables(cps, person, self.raw_cps.time_period) + add_spm_variables(cps, spm_unit) + add_household_variables(cps, household) + + raw_data.close() + cps.close() + + cps = h5py.File(self.file_path, mode="a") + add_silver_plan_cost(self, cps, 2022) + cps.close() + + +def add_silver_plan_cost(self, cps: h5py.File, year: int): + """Adds the second-lowest silver plan cost for each tax unit, based on geography. + + Args: + cps (h5py.File): The CPS dataset file. + year (int): The year of the data. + """ + from policyengine_us import Microsimulation + + sim = Microsimulation(dataset=self) + slspc = sim.calc("second_lowest_silver_plan_cost", year).values + + cps["second_lowest_silver_plan_cost"] = slspc + + +def add_id_variables( + cps: h5py.File, + person: DataFrame, + tax_unit: DataFrame, + family: DataFrame, + spm_unit: DataFrame, + household: DataFrame, +) -> None: + """Add basic ID and weight variables. + + Args: + cps (h5py.File): The CPS dataset file. + person (DataFrame): The person table of the ASEC. + tax_unit (DataFrame): The tax unit table created from the person table + of the ASEC. + family (DataFrame): The family table of the ASEC. + spm_unit (DataFrame): The SPM unit table created from the person table + of the ASEC. + household (DataFrame): The household table of the ASEC. + """ + # Add primary and foreign keys + cps["person_id"] = person.PH_SEQ * 100 + person.P_SEQ + cps["family_id"] = family.FH_SEQ * 10 + family.FFPOS + cps["household_id"] = household.H_SEQ + cps["person_tax_unit_id"] = person.TAX_ID + cps["person_spm_unit_id"] = person.SPM_ID + cps["tax_unit_id"] = tax_unit.TAX_ID + cps["spm_unit_id"] = spm_unit.SPM_ID + cps["person_household_id"] = person.PH_SEQ + cps["person_family_id"] = person.PH_SEQ * 10 + person.PF_SEQ + + # Add weights + # Weights are multiplied by 100 to avoid decimals + cps["person_weight"] = person.A_FNLWGT / 1e2 + cps["family_weight"] = family.FSUP_WGT / 1e2 + + # Tax unit weight is the weight of the containing family. + family_weight = Series( + cps["family_weight"][...], index=cps["family_id"][...] + ) + person_family_id = cps["person_family_id"][...] + persons_family_weight = Series(family_weight[person_family_id]) + cps["tax_unit_weight"] = persons_family_weight.groupby( + cps["person_tax_unit_id"][...] + ).first() + + cps["spm_unit_weight"] = spm_unit.SPM_WEIGHT / 1e2 + + cps["household_weight"] = household.HSUP_WGT / 1e2 + + # Marital units + + marital_unit_id = person.PH_SEQ * 1e6 + np.maximum( + person.A_LINENO, person.A_SPOUSE + ) + + # marital_unit_id is not the household ID, zero padded and followed + # by the index within household (of each person, or their spouse if + # one exists earlier in the survey). + + marital_unit_id = Series(marital_unit_id).rank( + method="dense" + ) # Simplify to a natural number sequence with repetitions [0, 1, 1, 2, 3, ...] + + cps["person_marital_unit_id"] = marital_unit_id.values + cps["marital_unit_id"] = marital_unit_id.drop_duplicates().values + + +def add_personal_variables(cps: h5py.File, person: DataFrame) -> None: + """Add personal demographic variables. + + Args: + cps (h5py.File): The CPS dataset file. + person (DataFrame): The CPS person table. + """ + + # The CPS provides age as follows: + # 00-79 = 0-79 years of age + # 80 = 80-84 years of age + # 85 = 85+ years of age + # We assign the 80 ages randomly between 80 and 84. + # to avoid unrealistically bunching at 80. + cps["age"] = np.where( + person.A_AGE == 80, + # NB: randint is inclusive of first argument, exclusive of second. + np.random.randint(80, 85, len(person)), + person.A_AGE, + ) + # A_SEX is 1 -> male, 2 -> female. + cps["is_female"] = person.A_SEX == 2 + # "Is...blind or does...have serious difficulty seeing even when Wearing + # glasses?" 1 -> Yes + cps["is_blind"] = person.PEDISEYE == 1 + DISABILITY_FLAGS = [ + "PEDIS" + i for i in ["DRS", "EAR", "EYE", "OUT", "PHY", "REM"] + ] + cps["is_ssi_disabled"] = (person[DISABILITY_FLAGS] == 1).any(axis=1) + + def children_per_parent(col: str) -> pd.DataFrame: + """Calculate number of children in the household using parental + pointers. + + Args: + col (str): Either PEPAR1 and PEPAR2, which correspond to A_LINENO + of the person's first and second parent in the household, + respectively. + """ + return ( + person[person[col] > 0] + .groupby(["PH_SEQ", col]) + .size() + .reset_index() + .rename(columns={col: "A_LINENO", 0: "children"}) + ) + + # Aggregate to parent. + res = ( + pd.concat( + [children_per_parent("PEPAR1"), children_per_parent("PEPAR2")] + ) + .groupby(["PH_SEQ", "A_LINENO"]) + .children.sum() + .reset_index() + ) + tmp = person[["PH_SEQ", "A_LINENO"]].merge( + res, on=["PH_SEQ", "A_LINENO"], how="left" + ) + cps["own_children_in_household"] = tmp.children.fillna(0) + + cps["has_marketplace_health_coverage"] = person.MRK == 1 + + cps["cps_race"] = person.PRDTRACE + cps["is_hispanic"] = person.PRDTHSP != 0 + + cps["is_widowed"] = person.A_MARITL == 4 + cps["is_separated"] = person.A_MARITL == 6 + + +def add_personal_income_variables( + cps: h5py.File, person: DataFrame, year: int +): + """Add income variables. + + Args: + cps (h5py.File): The CPS dataset file. + person (DataFrame): The CPS person table. + year (int): The CPS year + """ + # Get income imputation parameters. + yamlfilename = os.path.join( + os.path.abspath(os.path.dirname(__file__)), "income_parameters.yaml" + ) + with open(yamlfilename, "r", encoding="utf-8") as yamlfile: + p = yaml.safe_load(yamlfile) + assert isinstance(p, dict) + + # Assign CPS variables. + cps["employment_income"] = person.WSAL_VAL + cps["taxable_interest_income"] = person.INT_VAL * ( + p["taxable_interest_fraction"][year] + ) + cps["tax_exempt_interest_income"] = person.INT_VAL * ( + 1 - p["taxable_interest_fraction"][year] + ) + cps["self_employment_income"] = person.SEMP_VAL + cps["farm_income"] = person.FRSE_VAL + cps["qualified_dividend_income"] = person.DIV_VAL * ( + p["qualified_dividend_fraction"][year] + ) + cps["non_qualified_dividend_income"] = person.DIV_VAL * ( + 1 - p["qualified_dividend_fraction"][year] + ) + cps["rental_income"] = person.RNT_VAL + # Assign Social Security retirement benefits if at least 62. + MINIMUM_RETIREMENT_AGE = 62 + cps["social_security_retirement"] = np.where( + person.A_AGE >= MINIMUM_RETIREMENT_AGE, person.SS_VAL, 0 + ) + # Otherwise assign them to Social Security disability benefits. + cps["social_security_disability"] = ( + person.SS_VAL - cps["social_security_retirement"] + ) + cps["unemployment_compensation"] = person.UC_VAL + # Add pensions and annuities. + cps_pensions = person.PNSN_VAL + person.ANN_VAL + cps["taxable_pension_income"] = cps_pensions * ( + p["taxable_pension_fraction"][year] + ) + cps["tax_exempt_pension_income"] = cps_pensions * ( + 1 - p["taxable_pension_fraction"][year] + ) + # Other income (OI_VAL) is a catch-all for all other income sources. + # The code for alimony income is 20. + cps["alimony_income"] = (person.OI_OFF == 20) * person.OI_VAL + # The code for strike benefits is 12. + cps["strike_benefits"] = (person.OI_OFF == 12) * person.OI_VAL + cps["child_support_received"] = person.CSP_VAL + # Assume all public assistance / welfare dollars (PAW_VAL) are TANF. + # They could also include General Assistance. + cps["tanf_reported"] = person.PAW_VAL + cps["ssi_reported"] = person.SSI_VAL + cps["pension_contributions"] = person.RETCB_VAL + cps["long_term_capital_gains"] = person.CAP_VAL * ( + p["long_term_capgain_fraction"][year] + ) + cps["short_term_capital_gains"] = person.CAP_VAL * ( + 1 - p["long_term_capgain_fraction"][year] + ) + cps["receives_wic"] = person.WICYN == 1 + cps["veterans_benefits"] = person.VET_VAL + cps["workers_compensation"] = person.WC_VAL + # Disability income has multiple sources and values split across two pairs + # of variables. Include everything except for worker's compensation + # (code 1), which is defined as WC_VAL. + WORKERS_COMP_DISABILITY_CODE = 1 + disability_benefits_1 = person.DIS_VAL1 * ( + person.DIS_SC1 != WORKERS_COMP_DISABILITY_CODE + ) + disability_benefits_2 = person.DIS_VAL2 * ( + person.DIS_SC2 != WORKERS_COMP_DISABILITY_CODE + ) + cps["disability_benefits"] = disability_benefits_1 + disability_benefits_2 + # Expenses. + # "What is the annual amount of child support paid?" + cps["child_support_expense"] = person.CHSP_VAL + cps["health_insurance_premiums"] = person.PHIP_VAL + cps["medical_out_of_pocket_expenses"] = person.MOOP + + +def add_spm_variables(cps: h5py.File, spm_unit: DataFrame) -> None: + SPM_RENAMES = dict( + spm_unit_total_income_reported="SPM_TOTVAL", + snap_reported="SPM_SNAPSUB", + spm_unit_capped_housing_subsidy_reported="SPM_CAPHOUSESUB", + free_school_meals_reported="SPM_SCHLUNCH", + spm_unit_energy_subsidy_reported="SPM_ENGVAL", + spm_unit_wic_reported="SPM_WICVAL", + spm_unit_payroll_tax_reported="SPM_FICA", + spm_unit_federal_tax_reported="SPM_FEDTAX", + spm_unit_state_tax_reported="SPM_STTAX", + spm_unit_work_childcare_expenses="SPM_CAPWKCCXPNS", + spm_unit_medical_expenses="SPM_MEDXPNS", + spm_unit_spm_threshold="SPM_POVTHRESHOLD", + spm_unit_net_income_reported="SPM_RESOURCES", + childcare_expenses="SPM_CHILDCAREXPNS", + ) + + for fiscalsim_variable, asec_variable in SPM_RENAMES.items(): + cps[fiscalsim_variable] = spm_unit[asec_variable] + + cps["reduced_price_school_meals_reported"] = ( + cps["free_school_meals_reported"][...] * 0 + ) + + +def add_household_variables(cps: h5py.File, household: DataFrame) -> None: + cps["state_fips"] = household.GESTFIPS + cps["county_fips"] = household.GTCO + state_county_fips = cps["state_fips"][...] * 1e3 + cps["county_fips"][...] + # Assign is_nyc here instead of as a variable formula so that it shows up + # as toggleable in the webapp. + # List county FIPS codes for each NYC county/borough. + NYC_COUNTY_FIPS = [ + 5, # Bronx + 47, # Kings (Brooklyn) + 61, # New York (Manhattan) + 81, # Queens + 85, # Richmond (Staten Island) + ] + # Compute NYC by concatenating NY state FIPS with county FIPS. + # For example, 36061 is Manhattan. + NYS_FIPS = 36 + nyc_full_county_fips = [ + NYS_FIPS * 1e3 + county_fips for county_fips in NYC_COUNTY_FIPS + ] + cps["in_nyc"] = np.isin(state_county_fips, nyc_full_county_fips) + + +class CPS_2020(CPS): + name = "cps_2020" + label = "CPS 2020" + raw_cps = RawCPS_2020 + file_path = STORAGE_FOLDER / "cps_2020.h5" + time_period = 2020 + + +class CPS_2021(CPS): + name = "cps_2021" + label = "CPS 2021" + raw_cps = RawCPS_2021 + file_path = STORAGE_FOLDER / "cps_2021.h5" + time_period = 2021 + + +class CPS_2022(CPS): + name = "cps_2022" + label = "CPS 2022" + raw_cps = RawCPS_2022 + file_path = STORAGE_FOLDER / "cps_2022.h5" + time_period = 2022 + # url = None + + +CPS_2023 = UpratedCPS.from_dataset( + CPS_2022, + 2023, + "cps_2023", + "CPS 2023", + STORAGE_FOLDER / "cps_2023.h5", + new_url="release://policyengine/policyengine-us/cps-2023/cps_2023.h5", +) From 360d24a822aa415b822e74fe46c4091be3799c91 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 01:54:11 -0600 Subject: [PATCH 09/37] Fixed variable name --- ... copy.py => social_security_taxable_self_employment_income.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename fiscalsim_us/variables/gov/irs/tax/self_employment/{social_security_taxable_self_employment_income copy.py => social_security_taxable_self_employment_income.py} (100%) diff --git a/fiscalsim_us/variables/gov/irs/tax/self_employment/social_security_taxable_self_employment_income copy.py b/fiscalsim_us/variables/gov/irs/tax/self_employment/social_security_taxable_self_employment_income.py similarity index 100% rename from fiscalsim_us/variables/gov/irs/tax/self_employment/social_security_taxable_self_employment_income copy.py rename to fiscalsim_us/variables/gov/irs/tax/self_employment/social_security_taxable_self_employment_income.py From 4b2e35f58e6e2f66f786b5a886c509223f5aa6bc Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 02:25:24 -0600 Subject: [PATCH 10/37] Updated MN sources.yaml --- .../parameters/gov/states/mn/tax/income/additions/sources.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fiscalsim_us/parameters/gov/states/mn/tax/income/additions/sources.yaml b/fiscalsim_us/parameters/gov/states/mn/tax/income/additions/sources.yaml index 981981422..947066881 100644 --- a/fiscalsim_us/parameters/gov/states/mn/tax/income/additions/sources.yaml +++ b/fiscalsim_us/parameters/gov/states/mn/tax/income/additions/sources.yaml @@ -1,7 +1,7 @@ description: Minnesota adds these variables to US AGI when computing its taxable income. values: 2021-01-01: - - c05700 # lump-sum distributions from federal Form 4972 + - form_4972_lumpsum_distributions - mn_other_additions # catch all for Unimplemented vars metadata: From 0a85353c8b864bc337d5e3547ad810537d496afa Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 02:36:34 -0600 Subject: [PATCH 11/37] Updated Minnesota variable --- .../mn_elderly_disabled_subtraction.py | 140 +++++++++--------- 1 file changed, 67 insertions(+), 73 deletions(-) diff --git a/fiscalsim_us/variables/gov/states/mn/tax/income/subtractions/mn_elderly_disabled_subtraction.py b/fiscalsim_us/variables/gov/states/mn/tax/income/subtractions/mn_elderly_disabled_subtraction.py index bd4ae5ebb..9dbac3fd7 100644 --- a/fiscalsim_us/variables/gov/states/mn/tax/income/subtractions/mn_elderly_disabled_subtraction.py +++ b/fiscalsim_us/variables/gov/states/mn/tax/income/subtractions/mn_elderly_disabled_subtraction.py @@ -1,73 +1,67 @@ -from fiscalsim_us.model_api import * - - -class mn_elderly_disabled_subtraction(Variable): - value_type = float - entity = TaxUnit - label = "Minnesota elderly/disabled subtraction" - unit = USD - definition_period = YEAR - reference = ( - "https://www.revenue.state.mn.us/sites/default/files/2023-01/m1r_21.pdf" - "https://www.revenue.state.mn.us/sites/default/files/2023-01/m1r_22.pdf" - ) - defined_for = StateCode.MN - - def formula(tax_unit, period, parameters): - mn_itax = parameters(period).gov.states.mn.tax.income - p = mn_itax.subtractions.elderly_disabled - filing_status = tax_unit("filing_status", period) - # calculate the subtraction amount - # ... determine age eligibility - person = tax_unit.members - is_elderly = person("age", period) >= p.minimum_age - is_head = person("is_tax_unit_head", period) - elderly_head = is_head & is_elderly - is_spouse = person("is_tax_unit_spouse", period) - elderly_spouse = is_spouse & is_elderly - # ... determine disability eligiblity - is_disabled = person("is_permanently_and_totally_disabled", period) - disabled_head = is_head & is_disabled - disabled_spouse = is_spouse & is_disabled - # ... determine base subtraction amount - base_amount = where( - tax_unit.any(elderly_head | elderly_spouse), - p.base_amount[filing_status], - 0, # because federally-taxable disability income - # included in federal Form 1040, line 1z, is unknown - ) - # ... determine disability income as on federal Schedule R - is_dependent = person("is_tax_unit_dependent", period) - dinc_person = person("total_disability_payments", period) - disinc_person = dinc_person * ~is_dependent * ~is_elderly - disability_income = tax_unit.sum(disinc_person) - # ... determine untaxed social security benefits - unit_socsec = add(tax_unit, period, ["social_security"]) - unit_taxed_socsec = add(tax_unit, period, ["taxable_social_security"]) - untaxed_social_security = unit_socsec - unit_taxed_socsec - # ... determine total disability and social security benefits - benefits = disability_income + untaxed_social_security - # ... subtract benefits from base amount - amount = max_(0, base_amount - benefits) - # ... determine net agi - agi = add( - tax_unit, - period, - [ - "adjusted_gross_income", - "c05700", # lump-sum Form 4972 distributions - ], - ) - agi_offset_base = p.agi_offset_base[filing_status] - joint = filing_status == filing_status.possible_values.JOINT - head_eligible = tax_unit.any(elderly_head | disabled_head) - spouse_eligible = tax_unit.any(elderly_spouse | disabled_spouse) - eligible = head_eligible | spouse_eligible - joint_with_two_eligibles = joint & head_eligible & spouse_eligible - agi_offset_extra = joint_with_two_eligibles * p.agi_offset_extra - agi_offset = agi_offset_base + agi_offset_extra - net_agi = max_(0, agi - agi_offset) - fraction_of_net_agi = p.net_agi_fraction * net_agi - # ... subtract fracton_of_net_agi from amount to get final amount - final_amount = max_(0, amount - fraction_of_net_agi) - return eligible * final_amount +from fiscalsim_us.model_api import * + + +class mn_elderly_disabled_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Minnesota elderly/disabled subtraction" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.state.mn.us/sites/default/files/2023-01/m1r_21.pdf" + "https://www.revenue.state.mn.us/sites/default/files/2023-01/m1r_22.pdf" + ) + defined_for = StateCode.MN + + def formula(tax_unit, period, parameters): + mn_itax = parameters(period).gov.states.mn.tax.income + p = mn_itax.subtractions.elderly_disabled + filing_status = tax_unit("filing_status", period) + # calculate the subtraction amount + # ... determine age eligibility + person = tax_unit.members + is_elderly = person("age", period) >= p.minimum_age + is_head = person("is_tax_unit_head", period) + elderly_head = is_head & is_elderly + is_spouse = person("is_tax_unit_spouse", period) + elderly_spouse = is_spouse & is_elderly + # ... determine disability eligiblity + is_disabled = person("is_permanently_and_totally_disabled", period) + disabled_head = is_head & is_disabled + disabled_spouse = is_spouse & is_disabled + # ... determine base subtraction amount + base_amount = where( + tax_unit.any(elderly_head | elderly_spouse), + p.base_amount[filing_status], + 0, # because federally-taxable disability income + # included in federal Form 1040, line 1z, is unknown + ) + # ... determine disability income as on federal Schedule R + is_dependent = person("is_tax_unit_dependent", period) + dinc_person = person("total_disability_payments", period) + disinc_person = dinc_person * ~is_dependent * ~is_elderly + disability_income = tax_unit.sum(disinc_person) + # ... determine untaxed social security benefits + unit_socsec = add(tax_unit, period, ["social_security"]) + unit_taxed_socsec = add(tax_unit, period, ["taxable_social_security"]) + untaxed_social_security = unit_socsec - unit_taxed_socsec + # ... determine total disability and social security benefits + benefits = disability_income + untaxed_social_security + # ... subtract benefits from base amount + amount = max_(0, base_amount - benefits) + # ... determine net agi + fed_agi = tax_unit("adjusted_gross_income", period) + agi = fed_agi + tax_unit("form_4972_lumpsum_distributions", period) + agi_offset_base = p.agi_offset_base[filing_status] + joint = filing_status == filing_status.possible_values.JOINT + head_eligible = tax_unit.any(elderly_head | disabled_head) + spouse_eligible = tax_unit.any(elderly_spouse | disabled_spouse) + eligible = head_eligible | spouse_eligible + joint_with_two_eligibles = joint & head_eligible & spouse_eligible + agi_offset_extra = joint_with_two_eligibles * p.agi_offset_extra + agi_offset = agi_offset_base + agi_offset_extra + net_agi = max_(0, agi - agi_offset) + fraction_of_net_agi = p.net_agi_fraction * net_agi + # ... subtract fracton_of_net_agi from amount to get final amount + final_amount = max_(0, amount - fraction_of_net_agi) + return eligible * final_amount From f83298e3a92240a8f2adb1321a9758410248454b Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 02:47:25 -0600 Subject: [PATCH 12/37] Updated state income tax variables --- .../gov/states/tax/income/state_income_tax.py | 20 ++++++++++++------- ...te_income_tax_before_refundable_credits.py | 10 ++++++++++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index b6f1facfb..5da2d0472 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -10,13 +10,17 @@ class state_income_tax(Variable): adds = [ # state income tax variables listed in alphabetical order: "ca_income_tax", + # "co_income_tax", --- activating will cause circular logic errors + # "dc_income_tax", --- activating will cause circular logic errors # "ia_income_tax", --- activating will cause circular logic errors "il_income_tax", + "in_income_tax", "ks_income_tax", - "la_income_tax", "ky_income_tax", - "ma_income_tax", - "md_income_tax", + "la_income_tax", + # "ma_income_tax", --- activating will cause circular logic errors + # "md_income_tax", --- activating will cause circular logic errors + # "me_income_tax", --- activating will cause circular logic errors "mn_income_tax", "mt_income_tax", # "mo_income_tax", --- activating will cause circular logic errors @@ -25,14 +29,16 @@ class state_income_tax(Variable): # "ne_income_tax", --- activating will cause circular logic errors "nh_income_tax", "nj_income_tax", - "ny_income_tax", - "ok_income_tax", - "or_income_tax", + # "nm_income_tax", --- activating will cause circular logic errors + # "ny_income_tax", --- activating will cause circular logic errors + # "ok_income_tax", --- activating will cause circular logic errors + # "or_income_tax", --- activating will cause circular logic errors "pa_income_tax", - "va_income_tax", "ri_income_tax", + "va_income_tax", "ut_income_tax", "wa_income_tax", + "wi_income_tax", ] def formula(tax_unit, period, parameters): diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax_before_refundable_credits.py index bb915a844..5f870eb03 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax_before_refundable_credits.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax_before_refundable_credits.py @@ -8,20 +8,30 @@ class state_income_tax_before_refundable_credits(Variable): unit = USD definition_period = YEAR adds = [ + "co_income_tax_before_refundable_credits", + "dc_income_tax_before_refundable_credits", "ia_income_tax_before_refundable_credits", "il_total_tax", + "in_income_tax_before_refundable_credits", "ks_income_tax_before_refundable_credits", "la_income_tax_before_refundable_credits", "ma_income_tax_before_refundable_credits", "md_income_tax_before_refundable_credits", + "me_income_tax_before_refundable_credits", "mn_income_tax_before_refundable_credits", "mo_income_tax_before_refundable_credits", + "nc_income_tax", # NC has no refundable credits. "nd_income_tax_before_refundable_credits", "ne_income_tax_before_refundable_credits", + "nh_income_tax_before_refundable_credits", + "nj_income_tax_before_refundable_credits", + "nm_income_tax_before_refundable_credits", "ny_income_tax_before_refundable_credits", "or_income_tax_before_refundable_credits", "pa_income_tax", # PA has no refundable credits. "ut_income_tax_before_refundable_credits", "va_income_tax_before_refundable_credits", + "vt_income_tax_before_refundable_credits", "wa_income_tax_before_refundable_credits", + "wi_income_tax_before_refundable_credits", ] From 0b619845cf80d3c725e87e0fc012b06ef2efe1de Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 03:06:17 -0600 Subject: [PATCH 13/37] Main commit of all updated files --- .gitignore | 3 + fiscalsim_us/data/datasets/__init__.py | 36 +- fiscalsim_us/data/datasets/cps/__init__.py | 24 +- .../datasets/cps/calibrated_cps/__init__.py | 1 - .../cps/calibrated_cps/calibrated_cps.py | 77 - .../populations/by_state.yaml | 108 - .../populations/total.yaml | 26 - .../programs/snap/budgetary_impact.yaml | 12 - .../programs/snap/caseload.yaml | 12 - .../cps/calibrated_cps/loss/__init__.py | 1 - .../loss/categories/populations.py | 35 - .../datasets/cps/calibrated_cps/loss/loss.py | 23 - .../datasets/cps/calibrated_cps/output_cps.py | 91 - .../datasets/cps/enhanced_cps/__init__.py | 3 + .../datasets/cps/enhanced_cps/calibrate.py | 304 ++ .../cps/enhanced_cps/calibrated_cps.py | 30 + .../datasets/cps/enhanced_cps/enhanced_cps.py | 32 + .../datasets/cps/enhanced_cps/process_puf.py | 617 +++ .../cps/enhanced_cps/puf_extended_cps.py | 63 + .../data/datasets/cps/enhanced_cps/tmp/app.py | 90 + .../cps/enhanced_cps/tmp/calibrate.py | 377 ++ .../datasets/cps/enhanced_cps/tmp/puf.ipynb | 2844 ++++++++++ .../cps/enhanced_cps/tmp/puf_imputation.py | 169 + .../datasets/cps/enhanced_cps/tmp/test.ipynb | 2632 ++++++++++ fiscalsim_us/data/datasets/cps/raw_cps.py | 447 +- .../poverty_tracker/poverty_tracker.py | 210 + fiscalsim_us/modelled_policies.yaml | 56 +- .../calibration/gov/cbo/income_by_source.yaml | 173 + .../calibration/gov/cbo/income_tax.yaml | 20 + .../calibration/gov/cbo/payroll_taxes.yaml | 25 + .../parameters/calibration/gov/cbo/snap.yaml | 25 + .../calibration/gov/cbo/social_security.yaml | 20 + .../parameters/calibration/gov/cbo/ssi.yaml | 20 + .../gov/cbo/unemployment_compensation.yaml | 20 + .../gov/hhs}/medicaid/budgetary_impact.yaml | 218 +- .../gov/hhs}/medicaid/enrollment.yaml | 218 +- .../gov/irs/soi/agi/number_of_returns.yaml | 84 + .../gov/irs/soi/agi/total_agi.yaml | 84 + .../gov/irs/soi/employment_income.yaml | 11 + .../calibration/gov/irs/soi/farm_income.yaml | 11 + .../gov/irs/soi/farm_rent_income.yaml | 11 + .../gov/irs/soi/long_term_capital_gains.yaml | 11 + .../soi/non_qualified_dividend_income.yaml | 11 + .../irs/soi/partnership_s_corp_income.yaml | 11 + .../irs/soi/qualified_dividend_income.yaml | 11 + .../gov/irs/soi/rental_income.yaml | 11 + .../gov/irs/soi/self_employment_income.yaml | 11 + .../gov/irs/soi/social_security.yaml | 11 + .../irs/soi/tax_exempt_interest_income.yaml | 11 + .../irs/soi/tax_exempt_pension_income.yaml | 11 + .../gov/irs/soi/taxable_interest_income.yaml | 11 + .../gov/irs/soi/taxable_pension_income.yaml | 11 + .../irs/soi/unemployment_compensation.yaml | 12 + .../ssa/social_security/participation.yaml | 8 + .../gov/ssa/ssi/participation.yaml | 8 + .../gov/treasury/tax_expenditures/eitc.yaml | 19 + .../gov/usda/snap/participation.yaml | 12 + fiscalsim_us/parameters/gov/bls/README.md | 2 +- fiscalsim_us/parameters/gov/bls/cpi/README.md | 1 + .../gov/contrib/congress/delauro/README.md | 1 + .../delauro/american_family_act/README.md | 1 + .../american_family_act/baby_bonus.yaml | 11 + .../adult_dependent_credit/amount.yaml | 1 - .../adult_dependent_credit/min_age.yaml | 1 - .../filer_credit/amount.yaml | 1 - .../filer_credit/eligibility/max_age.yaml | 1 - .../filer_credit/eligibility/min_age.yaml | 1 - .../filer_credit/phase_out/rate.yaml | 1 - .../filer_credit/phase_out/start.yaml | 1 - .../gov/contrib/dc_kccatc/README.md | 3 + .../gov/contrib/dc_kccatc/active.yaml | 6 + .../gov/contrib/dc_kccatc/expenses/max.yaml | 7 + .../gov/contrib/dc_kccatc/expenses/rate.yaml | 6 + .../gov/contrib/dc_kccatc/phase_out/rate.yaml | 7 + .../dc_kccatc/phase_out/threshold.yaml | 15 + .../contrib/dc_tax_threshold_joint_ratio.yaml | 6 + .../gov/contrib/individual_eitc/README.md | 1 + .../individual_eitc/agi_eitc_limit.yaml | 10 + .../gov/contrib/individual_eitc/enabled.yaml | 9 + .../abolish_non_refundable_child_eitc.yaml | 1 - .../abolish_refundable_child_eitc.yaml | 1 - fiscalsim_us/parameters/gov/doe/README.md | 2 +- fiscalsim_us/parameters/gov/dol/README.md | 1 + .../parameters/gov/dol/minimum_wage.yaml | 11 + fiscalsim_us/parameters/gov/ed/README.md | 1 + .../gov/{states/mo => ed}/index.yaml | 1 + .../parameters/gov/ed/pell_grant/README.md | 1 + .../gov/ed/pell_grant/amount/max.yaml | 9 + .../gov/ed/pell_grant/amount/min.yaml | 9 + .../gov/ed/pell_grant/efc/README.md | 1 + .../gov/ed/pell_grant/efc/automatic_zero.yaml | 53 + .../efc/dependent/asset_assessment_rate.yaml | 9 + .../efc/dependent/income_assessment_rate.yaml | 9 + .../gov/ed/pell_grant/efc/dependent/ipa.yaml | 9 + .../efc/head/asset_assessment_rate.yaml | 13 + .../efc/head/income_assessment_rate.yaml | 13 + .../ed/pell_grant/efc/head/marginal_rate.yaml | 167 + .../pell_grant/efc/head/min_contribution.yaml | 9 + .../ed/pell_grant/efc/head/negative_rate.yaml | 9 + .../pell_grant/efc/simplified/benefits.yaml | 15 + .../efc/simplified/income_limit.yaml | 9 + .../ed/pell_grant/months_in_school_year.yaml | 12 + fiscalsim_us/parameters/gov/fcc/README.md | 2 +- fiscalsim_us/parameters/gov/fcc/acp/README.md | 2 +- .../gov/fcc/acp/categorical_eligibility.yaml | 6 +- fiscalsim_us/parameters/gov/fcc/ebb/README.md | 2 +- .../gov/fcc/ebb/categorical_eligibility.yaml | 2 +- fiscalsim_us/parameters/gov/hhs/README.md | 2 +- .../parameters/gov/hhs/ccdf/README.md | 2 +- .../parameters/gov/hhs/ccdf/index.yaml | 4 + .../parameters/gov/hhs/medicaid/index.yaml | 4 + fiscalsim_us/parameters/gov/hhs/smi/README.md | 2 +- .../parameters/gov/hhs/tanf/README.md | 2 +- .../gov/hhs/tanf/non_cash/asset_limit.yaml | 7 + .../hhs/tanf/non_cash/income_limit/gross.yaml | 7 + fiscalsim_us/parameters/gov/hud/README.md | 2 +- .../parameters/gov/hud/ami_limit/README.md | 2 +- fiscalsim_us/parameters/gov/hud/index.yaml | 4 + fiscalsim_us/parameters/gov/irs/README.md | 2 +- .../gov/irs/ald/loss/capital/max.yaml | 16 +- .../parameters/gov/irs/credits/cdcc/README.md | 2 +- .../parameters/gov/irs/credits/ctc/README.md | 2 +- .../parameters/gov/irs/credits/eitc/README.md | 2 +- fiscalsim_us/parameters/gov/ssa/README.md | 2 +- fiscalsim_us/parameters/gov/ssa/ssi/README.md | 2 +- .../parameters/gov/states/al/index.yaml | 4 + .../parameters/gov/states/ar/index.yaml | 4 + .../ar/tax/income/credits/cdcc/README.md | 1 + .../ar/tax/income/credits/cdcc/match.yaml | 12 + .../inflationary_relief/max_amount.yaml | 27 + .../inflationary_relief/reduction/amount.yaml | 25 + .../reduction/increment.yaml | 25 + .../inflationary_relief/reduction/start.yaml | 26 + .../ar/tax/income/credits/non_refundable.yaml | 11 + .../ar/tax/income/credits/refundable.yaml | 11 + .../ar/tax/income/deductions/standard.yaml | 35 + .../gov/states/ar/tax/income/exemptions.yaml | 24 + .../gov/states/ar/tax/income/rates/main.yaml | 47 + .../parameters/gov/states/az/index.yaml | 4 + .../ceiling/qualifying_foster.yaml | 26 + .../ceiling/qualifying_organization.yaml | 25 + .../credits/dependent_credit/amount.yaml | 23 + .../dependent_credit/reduction/increment.yaml | 14 + .../reduction/percentage.yaml | 14 + .../dependent_credit/reduction/start.yaml | 24 + .../family_tax_credits/amount/cap.yaml | 24 + .../family_tax_credits/amount/per_person.yaml | 14 + .../income_limit/head_of_household.yaml | 34 + .../income_limit/joint.yaml | 30 + .../income_limit/separate.yaml | 14 + .../income_limit/single.yaml | 14 + .../income_limit/widow.yaml | 33 + .../credits/increased_excise/amount.yaml | 14 + .../increased_excise/income_threshold.yaml | 26 + .../credits/increased_excise/max_amount.yaml | 14 + .../income/deductions/standard/amount.yaml | 48 +- .../deductions/standard/increased/rate.yaml | 16 + .../az/tax/income/main/head_of_household.yaml | 39 + .../gov/states/az/tax/income/main/joint.yaml | 39 + .../states/az/tax/income/main/separate.yaml | 39 + .../gov/states/az/tax/income/main/single.yaml | 39 + .../gov/states/az/tax/income/main/widow.yaml | 39 + .../subtractions/capital_gains/rate.yaml | 16 + .../pension/public_pension_cap.yaml | 16 + .../tax/income/subtractions/subtractions.yaml | 16 + .../parameters/gov/states/ca/calepa/README.md | 2 +- .../gov/states/ca/calepa/carb/README.md | 2 +- .../gov/states/ca/calepa/carb/cvrp/README.md | 2 +- .../gov/states/ca/calepa/index.yaml | 4 + .../parameters/gov/states/ca/cpuc/README.md | 2 +- .../parameters/gov/states/ca/cpuc/index.yaml | 4 + .../gov/states/ca/tax/income/agi/README.md | 2 +- .../ca/tax/income/credits/renter/amount.yaml | 61 +- .../tax/income/credits/renter/income_cap.yaml | 65 +- .../tax/income/credits/renter}/index.yaml | 8 +- .../parameters/gov/states/co/cdhs/README.md | 2 +- .../gov/states/co/cdhs/tanf/README.md | 2 +- .../gov/states/co/hcpf/chp/child.yaml | 20 + .../states/co/hcpf/chp/copays/ambulance.yaml | 32 + .../states/co/hcpf/chp/copays/er_visit.yaml | 28 + .../states/co/hcpf/chp/copays/imaging.yaml | 28 + .../states/co/hcpf/chp/copays/inpatient.yaml | 32 + .../gov/states/co/hcpf/chp/copays/lab.yaml | 28 + .../states/co/hcpf/chp/copays/outpatient.yaml | 32 + .../hcpf/chp/copays/physician_services.yaml | 32 + .../co/hcpf/chp/copays/prescription.yaml | 32 + .../co/hcpf/chp/copays/urgent_care.yaml | 28 + .../gov/states/co/hcpf/chp/expenses.yaml | 18 + .../gov/states/co/hcpf/chp/income_limit.yaml | 11 + .../gov/states/co/hcpf/chp/out_of_pocket.yaml | 11 + .../parameters/gov/states/co/ssa/README.md | 1 + .../gov/states/co/ssa/oap/README.md | 1 + .../co/tax/income/additions/additions.yaml | 37 + .../federal_deductions/agi_threshold.yaml | 16 + .../federal_deductions/exemption.yaml | 30 + .../federal_deductions/itemized_only.yaml | 15 + .../agi_threshold.yaml | 27 + .../co/tax/income/credits/cdcc/README.md | 1 + .../cdcc/low_income/child_age_threshold.yaml | 15 + .../low_income/federal_agi_threshold.yaml | 15 + .../credits/cdcc/low_income/max_amount.yaml | 26 + .../income/credits/cdcc/low_income/rate.yaml | 14 + .../co/tax/income/credits/cdcc/match.yaml | 31 + .../co/tax/income/credits/ctc/README.md | 1 + .../tax/income/credits/ctc/age_threshold.yaml | 14 + .../credits/ctc/amount/head_of_household.yaml | 26 + .../tax/income/credits/ctc/amount/joint.yaml | 26 + .../income/credits/ctc/amount/separate.yaml | 26 + .../tax/income/credits/ctc/amount/single.yaml | 26 + .../tax/income/credits/ctc/amount/widow.yaml | 26 + .../ctc/ctc_matched_federal_credit.yaml | 12 + .../income/credits/ctc/eligible_child.yaml | 12 + .../credits/ctc/rate/head_of_household.yaml | 34 + .../co/tax/income/credits/ctc/rate/joint.yaml | 34 + .../tax/income/credits/ctc/rate/separate.yaml | 34 + .../tax/income/credits/ctc/rate/single.yaml | 34 + .../co/tax/income/credits/ctc/rate/widow.yaml | 34 + .../co/tax/income/credits/eitc/README.md | 1 + .../co/tax/income/credits/eitc/match.yaml | 32 +- .../age_limit.yaml | 11 + .../income_threshold.yaml | 14 + .../reduction/amount.yaml | 25 + .../reduction/increment.yaml | 14 + .../reduction/max_amount.yaml | 25 + .../reduction/start.yaml | 14 + .../co/tax/income/credits/refundable.yaml | 20 + .../sales_tax_refund/age_threshold.yaml | 14 + .../sales_tax_refund/amount/amount.yaml | 12 + .../amount/flat_amount_enabled.yaml | 14 + .../sales_tax_refund/amount/multiplier.yaml | 25 + .../sales_tax_refund/amount/scale.yaml | 61 + .../sales_tax_refund/magi_sources.yaml | 16 + .../gov/states/co/tax/income/rate.yaml | 25 + .../charitable_contribution/adjustment.yaml | 15 + .../max_amount.yaml | 27 + .../military_retirement/age_threshold.yaml | 16 + .../military_retirement/max_amount.yaml | 20 + .../pension/age_threshold/older.yaml | 16 + .../pension/age_threshold/younger.yaml | 16 + .../subtractions/pension/cap/older.yaml | 17 + .../subtractions/pension/cap/younger.yaml | 17 + .../subtractions/pension/income_sources.yaml | 22 + ...social_security_subtraction_available.yaml | 12 + .../tax/income/subtractions/subtractions.yaml | 31 + .../parameters/gov/states/ct/README.md | 1 + .../parameters/gov/states/ct/index.yaml | 4 + .../states/ct/tax/income/add_back/amount.yaml | 22 + .../ct/tax/income/add_back/increment.yaml | 22 + .../ct/tax/income/add_back/max_amount.yaml | 22 + .../states/ct/tax/income/add_back/start.yaml | 22 + .../income/credits/agi/head_of_household.yaml | 124 + .../ct/tax/income/credits/agi/joint.yaml | 124 + .../ct/tax/income/credits/agi/separate.yaml | 124 + .../ct/tax/income/credits/agi/single.yaml | 124 + .../ct/tax/income/credits/agi/widow.yaml | 124 + .../ct/tax/income/credits/eitc/README.md | 1 + .../ct/tax/income/credits/eitc/match.yaml | 16 + .../exemptions/personal/max_amount.yaml | 22 + .../exemptions/personal/reduction/amount.yaml | 12 + .../personal/reduction/increment.yaml | 12 + .../exemptions/personal/reduction/start.yaml | 22 + .../tax/income/rates/head_of_household.yaml | 40 + .../gov/states/ct/tax/income/rates/joint.yaml | 40 + .../states/ct/tax/income/rates/separate.yaml | 40 + .../states/ct/tax/income/rates/single.yaml | 40 + .../gov/states/ct/tax/income/rates/widow.yaml | 40 + .../tax/income/recapture/higher/amount.yaml | 22 + .../income/recapture/higher/increment.yaml | 22 + .../income/recapture/higher/max_amount.yaml | 22 + .../ct/tax/income/recapture/higher/start.yaml | 22 + .../ct/tax/income/recapture/lower/amount.yaml | 22 + .../tax/income/recapture/lower/increment.yaml | 22 + .../income/recapture/lower/max_amount.yaml | 22 + .../ct/tax/income/recapture/lower/start.yaml | 22 + .../tax/income/subtractions/subtractions.yaml | 12 + .../tax/income/subtractions/tuition/cap.yaml | 22 + .../parameters/gov/states/dc/dhs/README.md | 2 +- .../gov/states/dc/dhs/tanf/README.md | 2 +- .../dc/dhs/tanf/grant_standard/main.yaml | 3 + .../child_support.yaml} | 6 +- .../earned}/flat.yaml | 4 +- .../earned}/percentage.yaml | 7 +- .../dhs/tanf/income/{ => sources}/earned.yaml | 2 +- .../tanf/income/{ => sources}/unearned.yaml | 2 +- .../need_standard/additional_childcare.yaml | 12 +- .../dc/dhs/tanf/need_standard/main.yaml | 6 +- .../self_employment_loss/threshold.yaml | 13 + .../dc/tax/income/additions/sources.yaml | 14 + .../dc/tax/income/credits/cdcc/README.md | 1 + .../dc/tax/income/credits/cdcc/match.yaml | 12 + .../dc/tax/income/credits/eitc/README.md | 2 +- .../credits/eitc/with_children/match.yaml | 25 +- .../credits/eitc/without_children/match.yaml | 9 - .../eitc/without_children/phase_out/rate.yaml | 19 +- .../without_children/phase_out/start.yaml | 26 +- .../dc/tax/income/credits/kccatc/README.md | 1 + .../income/credits/kccatc/income_limit.yaml | 46 + .../dc/tax/income/credits/kccatc/max_age.yaml | 14 + .../tax/income/credits/kccatc/max_amount.yaml | 19 + .../dc/tax/income/credits/non_refundable.yaml | 12 + .../dc/tax/income/credits/ptc/README.md | 1 + .../income/credits/ptc/fraction_elderly.yaml | 21 + .../credits/ptc/fraction_nonelderly.yaml | 29 + .../states/dc/tax/income/credits/ptc/max.yaml | 13 + .../income/credits/ptc/min_elderly_age.yaml | 12 + .../dc/tax/income/credits/ptc/rent_ratio.yaml | 12 + .../dc/tax/income/credits/refundable.yaml | 14 + .../deductions/itemized/phase_out/rate.yaml | 11 + .../deductions/itemized/phase_out/start.yaml | 22 + .../income/deductions/standard/amount.yaml | 23 - .../tax/income/joint_separately_option.yaml | 11 + .../gov/states/dc/tax/income/rates.yaml | 46 + .../disabled_exclusion/amount.yaml | 15 + .../disabled_exclusion/income_limit.yaml | 13 + .../dc/tax/income/subtractions/sources.yaml | 16 + .../parameters/gov/states/de/README.md | 1 + .../parameters/gov/states/de/index.yaml | 4 + .../de/tax/income/credits/cdcc/README.md | 1 + .../de/tax/income/credits/cdcc/match.yaml | 10 + .../de/tax/income/credits/eitc/README.md | 1 + .../income/credits/eitc/non_refundable.yaml | 11 + .../tax/income/credits/eitc/refundable.yaml | 11 + .../de/tax/income/credits/non_refundable.yaml | 8 + .../income/credits/personal_credits/aged.yaml | 24 + .../credits/personal_credits/personal.yaml | 14 + .../de/tax/income/credits/refundable.yaml | 7 + .../standard/additional/age_threshold.yaml | 14 + .../standard/additional/amount.yaml | 14 + .../income/deductions/standard/amount.yaml | 22 + .../gov/states/de/tax/income/rate.yaml | 24 +- .../elderly_or_disabled/amount.yaml | 24 + .../eligibility/age_threshold.yaml | 13 + .../eligibility/agi_limit.yaml | 23 + .../eligibility/earned_income_limit.yaml | 24 + .../parameters/gov/states/ga/README.md | 1 + .../parameters/gov/states/ga/index.yaml | 4 + .../ga/tax/income/additions/additions.yaml | 15 + .../ga/tax/income/credits/cdcc/README.md | 1 + .../ga/tax/income/credits/cdcc/rate.yaml | 12 + .../tax/income/credits/low_income/amount.yaml | 38 + .../supplement_age_eligibility.yaml | 13 + .../standard/aged/age_threshold.yaml | 14 + .../deductions/standard/aged/amount/head.yaml | 14 + .../standard/aged/amount/spouse.yaml | 14 + .../income/deductions/standard/amount.yaml | 30 + .../deductions/standard/blind/head.yaml | 14 + .../deductions/standard/blind/spouse.yaml | 14 + .../ga/tax/income/exemptions/dependent.yaml | 14 + .../ga/tax/income/exemptions/personal.yaml | 25 + .../ga/tax/income/main/head_of_household.yaml | 35 + .../gov/states/ga/tax/income/main/joint.yaml | 35 + .../states/ga/tax/income/main/separate.yaml | 34 + .../gov/states/ga/tax/income/main/single.yaml | 34 + .../gov/states/ga/tax/income/main/widow.yaml | 35 + .../tax/income/subtractions/subtractions.yaml | 20 + .../parameters/gov/states/hi/index.yaml | 4 + .../hi/tax/income/credits/eitc/README.md | 1 + .../hi/tax/income/credits/eitc/match.yaml | 11 + .../amount/head_of_household.yaml | 46 + .../credits/food_excise_tax/amount/joint.yaml | 46 + .../food_excise_tax/amount/separate.yaml | 46 + .../food_excise_tax/amount/single.yaml | 38 + .../credits/food_excise_tax/amount/widow.yaml | 46 + .../minor_child/age_threshold.yaml | 9 + .../food_excise_tax/minor_child/amount.yaml | 14 + .../support_proportion_threshold.yaml | 15 + .../credits/lihrtc/aged_age_threshold.yaml | 17 + .../hi/tax/income/credits/lihrtc/amount.yaml | 17 + .../credits/lihrtc/eligibility/agi_limit.yaml | 19 + .../lihrtc/eligibility/rent_threshold.yaml | 17 + .../states/hi/tax/income/subtractions.yaml | 19 + .../parameters/gov/states/ia/README.md | 1 + .../tax/income/credits/child_care/README.md | 1 + .../income/credits/earned_income/README.md | 1 + .../ia/tax/income/gross_income/sources.yaml | 1 + .../parameters/gov/states/id/index.yaml | 4 + .../id/tax/income/credits/ctc/README.md | 1 + .../id/tax/income/credits/ctc/amount.yaml | 12 + .../id/tax/income/main/head_of_household.yaml | 41 + .../gov/states/id/tax/income/main/joint.yaml | 35 + .../states/id/tax/income/main/separate.yaml | 39 + .../gov/states/id/tax/income/main/single.yaml | 39 + .../gov/states/id/tax/income/main/widow.yaml | 35 + .../tax/income/subtractions/subtractions.yaml | 18 + .../income/deductions/rent => il}/index.yaml | 8 +- .../il/tax/income/credits/eitc/README.md | 2 +- .../il/tax/income/credits/k12/README.md | 1 + .../gov/states/in/tax/income/agi_rate.yaml | 14 + .../earned_income/childless/max_age.yaml | 9 + .../earned_income/childless/maximum.yaml | 11 + .../earned_income/childless/min_age.yaml | 9 + .../childless/phase_in_rate.yaml | 11 + .../childless/phase_out_rate.yaml | 11 + .../childless/phase_out_start.yaml | 11 + .../credits/earned_income/decoupled.yaml | 10 + .../investment_income_limit.yaml | 12 + .../credits/earned_income/match_rate.yaml | 11 + .../credits/earned_income/max_children.yaml | 9 + .../in/tax/income/credits/refundable.yaml | 11 + .../unified_elderly/amount/one_aged.yaml | 28 + .../unified_elderly/amount/two_aged.yaml | 28 + .../credits/unified_elderly/min_age.yaml | 9 + .../homeowners_property_tax/max.yaml | 5 +- .../deductions/military_service/max.yaml | 5 +- .../deductions/nonpublic_school/amount.yaml | 5 +- .../in/tax/income/deductions/renters/max.yaml | 5 +- .../agi_reduction.yaml | 5 +- .../reduced_agi_haircut.yaml | 5 +- .../income/exemptions/additional/amount.yaml | 5 +- .../income/exemptions/aged_blind/amount.yaml | 5 +- .../exemptions/aged_low_agi/amount.yaml | 5 +- .../exemptions/aged_low_agi/threshold.yaml | 5 +- .../in/tax/income/exemptions/base/amount.yaml | 5 +- .../max_ages/non_student.yaml | 5 +- .../qualifying_child/max_ages/student.yaml | 5 +- .../states/in/tax/income/taxes/agi/README.md | 1 - .../states/in/tax/income/taxes/agi/rate.yaml | 13 - .../agi/subtractions/oasdi/agi_limit.yaml | 1 + .../ks/tax/income/credits/cdcc_fraction.yaml | 2 +- .../parameters/gov/states/ky/README.md | 1 + .../parameters/gov/states/ky/index.yaml | 4 + .../credits/dependent_care_service/match.yaml | 12 + .../credits/family_size/family_size_cap.yaml | 12 + .../tax/income/credits/family_size/rate.yaml | 57 + .../ky/tax/income/credits/non_refundable.yaml | 7 + .../ky/tax/income/deductions/standard.yaml | 16 + .../gov/states/ky/tax/income/rate.yaml | 9 +- .../ma/tax/income/credits/eitc/README.md | 2 +- .../parameters/gov/states/md/tanf/README.md | 2 +- .../md/tax/income/credits/cdcc/README.md | 2 +- .../md/tax/income/credits/ctc/README.md | 2 +- .../credits/ctc/age_threshold/disabled.yaml | 10 + .../main.yaml} | 10 +- .../md/tax/income/credits/ctc/agi_cap.yaml | 4 +- .../md/tax/income/credits/ctc/amount.yaml | 3 +- .../ctc/reduced_by_federal_credit.yaml | 7 + .../md/tax/income/credits/eitc/README.md | 2 +- .../md/tax/income/credits/non_refundable.yaml | 5 + .../tax/income/credits/poverty_line/README.md | 2 +- .../credits/senior_tax/age_eligibility.yaml | 11 + .../senior_tax/amount/head_of_household.yaml | 14 + .../credits/senior_tax/amount/joint.yaml | 16 + .../credits/senior_tax/amount/separate.yaml | 13 + .../credits/senior_tax/amount/single.yaml | 14 + .../credits/senior_tax/amount/widow.yaml | 14 + .../credits/senior_tax/income_threshold.yaml | 22 + .../subtractions/pension_exclusion/cap.yaml | 1 + .../tax/income/credits/child_care/README.md | 1 + .../income/credits/child_care/max_amount.yaml | 22 +- .../share_of_federal_credit/non_step_4.yaml | 23 +- .../share_of_federal_credit/step_4.yaml | 28 +- .../me/tax/income/credits/eitc/README.md | 1 + .../eitc/rate/no_qualifying_child.yaml | 24 +- .../eitc/rate/with_qualifying_child.yaml | 25 +- .../me/tax/income/credits/non_refundable.yaml | 8 + .../me/tax/income/credits/refundable.yaml | 8 + .../dependent_exemption/amount.yaml | 26 +- .../phaseout/increment.yaml | 32 +- .../dependent_exemption/phaseout/start.yaml | 50 +- .../dependent_exemption/phaseout/step.yaml | 30 +- .../tax/income/deductions/itemized/cap.yaml | 39 + .../income/deductions/phase_out/start.yaml | 37 + .../income/deductions/phase_out/width.yaml | 26 +- .../income/deductions/standard/amount.yaml | 20 - .../parameters/gov/states/mi/index.yaml | 4 + .../mi/tax/income/credits/eitc/README.md | 1 + .../mi/tax/income/credits/eitc/match.yaml | 18 + .../exemptions/dependent_on_other_return.yaml | 24 + .../mi/tax/income/exemptions/disabled.yaml | 20 + .../income/exemptions/disabled_veteran.yaml | 19 + .../mi/tax/income/exemptions/personal.yaml | 26 + .../parameters/gov/states/mo/dss/README.md | 2 +- .../parameters/gov/states/mo/dss/index.yaml | 4 + .../parameters/gov/states/ms/README.md | 1 + .../parameters/gov/states/ms/index.yaml | 4 + .../tax/income/adjustments/adjustments.yaml | 18 + .../national_guard_or_reserve_pay/cap.yaml | 13 + .../adjustments/self_employment/rate.yaml | 14 + .../income/deductions/standard/amount.yaml | 27 + .../income/exemptions/aged/age_threshold.yaml | 11 + .../ms/tax/income/exemptions/aged/amount.yaml | 13 + .../tax/income/exemptions/blind/amount.yaml | 13 + .../states/ms/tax/income/income_sources.yaml | 25 + .../gov/states/ms/tax/income/rate.yaml | 44 + .../parameters/gov/states/mt/README.md | 1 + .../parameters/gov/states/mt/index.yaml | 4 + .../credits/capital_gain/percentage.yaml | 13 + .../mt/tax/income/credits/eitc/README.md | 1 + .../mt/tax/income/credits/eitc/rate.yaml | 9 + .../mt/tax/income/credits/non_refundable.yaml | 7 + .../tax/income/deductions/standard/max.yaml | 31 + .../tax/income/deductions/standard/min.yaml | 30 + .../tax/income/deductions/standard/rate.yaml | 14 + .../tax/income/exemptions/age_threshold.yaml | 13 + .../mt/tax/income/exemptions/amount.yaml | 15 + .../parameters/gov/states/nc/README.md | 1 + .../nc/tax/income/credits/ctc/README.md | 1 + .../income/credits/ctc/head_of_household.yaml | 31 + .../nc/tax/income/credits/ctc/joint.yaml | 30 + .../nc/tax/income/credits/ctc/separate.yaml | 30 + .../nc/tax/income/credits/ctc/single.yaml | 30 + .../nc/tax/income/credits/ctc/widow.yaml | 30 + .../nc/tax/income/credits/non_refundable.yaml | 15 + .../deductions/child/head_of_household.yaml | 50 + .../nc/tax/income/deductions/child/joint.yaml | 50 + .../tax/income/deductions/child/separate.yaml | 50 + .../tax/income/deductions/child/single.yaml | 50 + .../nc/tax/income/deductions/child/widow.yaml | 50 + .../nc/tax/income/deductions/deductions.yaml | 18 + .../cap/mortgage_and_property_tax.yaml | 12 + .../income/deductions/standard/amount.yaml | 35 + .../gov/states/nc/tax/income/rate.yaml | 21 +- .../taxable_income/additions/sources.yaml | 34 +- .../ne/tax/income/credits/cdcc/README.md | 1 + .../ne/tax/income/credits/eitc/README.md | 1 + .../parameters/gov/states/nh/README.md | 1 + .../states/nh/tax/credits/education/rate.yaml | 21 + .../nh/tax/income/exemptions/amount/base.yaml | 29 + .../exemptions/amount/blind_addition.yaml | 14 + .../exemptions/amount/disabled_addition.yaml | 14 + .../exemptions/amount/old_age_addition.yaml | 14 + .../exemptions/disability_age_threshold.yaml | 11 + .../exemptions/old_age_eligibility.yaml | 11 + .../nh/tax/income/{main.yaml => rate.yaml} | 9 +- .../parameters/gov/states/nj/njdhs/README.md | 1 + .../parameters/gov/states/nj/njdhs/index.yaml | 4 + .../gov/states/nj/njdhs/tanf/README.md | 1 + .../states/nj/tax/income/all_exclusions.yaml | 9 + .../nj/tax/income/credits/cdcc/README.md | 1 + .../nj/tax/income/credits/cdcc/rate.yaml | 76 +- .../nj/tax/income/credits/ctc/README.md | 1 + .../nj/tax/income/credits/ctc/amount.yaml | 53 + .../ineligible_age.yaml | 13 +- .../nj/tax/income/credits/eitc/README.md | 1 + .../credits/nj_child_tax_credit/rate.yaml | 40 - .../property_tax/senior_qualifying_age.yaml | 2 +- .../qualifying_rent_fraction.yaml | 12 +- .../deductions/property_tax/threshold.yaml | 12 +- .../exclusions/retirement/age_threshold.yaml | 11 + .../exclusions/retirement/max_amount.yaml | 62 + .../earned_income_threshold.yaml | 11 + .../income_threshold.yaml | 10 + .../retirement/pension/agi_subtractions.yaml | 9 + .../percentage/head_of_household.yaml | 27 + .../retirement/percentage/joint.yaml | 27 + .../retirement/percentage/separate.yaml | 27 + .../retirement/percentage/single.yaml | 27 + .../retirement/percentage/widow.yaml | 27 + .../retirement/special_exclusion/amount.yaml | 22 + .../exemptions/blind_or_disabled/amount.yaml | 24 +- .../income/exemptions/dependents/amount.yaml | 22 +- .../age_threshold.yaml | 24 +- .../dependents_attending_college/amount.yaml | 24 +- .../tax/income/exemptions/regular/amount.yaml | 44 +- .../exemptions/senior/age_threshold.yaml | 24 +- .../tax/income/exemptions/senior/amount.yaml | 24 +- .../nj/tax/income/filing_threshold.yaml | 44 +- .../states/nj/tax/income/subtractions.yaml | 7 + .../parameters/gov/states/nm/README.md | 1 + .../nm/tax/income/credits/cdcc/README.md | 1 + .../tax/income/credits/cdcc/age_eligible.yaml | 14 + .../nm/tax/income/credits/cdcc/divisor.yaml | 14 + .../income/credits/cdcc/full_time_hours.yaml | 18 + ...ome_limit_as_fraction_of_minimum_wage.yaml | 10 + .../credits/cdcc/max_amount/per_child.yaml | 13 + .../income/credits/cdcc/max_amount/total.yaml | 14 + .../nm/tax/income/credits/cdcc/rate.yaml | 13 + .../nm/tax/income/credits/ctc/README.md | 1 + .../nm/tax/income/credits/ctc/amount.yaml | 52 + .../nm/tax/income/credits/eitc/README.md | 1 + .../credits/eitc/eligibility/age/min.yaml | 13 + .../nm/tax/income/credits/eitc/match.yaml | 14 + .../nm/tax/income/credits/refundable.yaml | 15 + .../age_eligibility.yaml | 12 + .../amount.yaml | 12 + .../min_expenses.yaml | 12 + .../deductions/certain_dependents/amount.yaml | 23 + .../head_of_household.yaml | 29 + .../medical_care_expense/joint.yaml | 29 + .../medical_care_expense/separate.yaml | 29 + .../medical_care_expense/single.yaml | 29 + .../medical_care_expense/widow.yaml | 29 + .../net_capital_gains/capped_element.yaml | 22 + .../uncapped_element_percent.yaml | 11 + .../blind_and_aged/age_threshold.yaml | 14 + .../blind_and_aged/head_of_household.yaml | 50 + .../exemptions/blind_and_aged/joint.yaml | 50 + .../exemptions/blind_and_aged/separate.yaml | 50 + .../exemptions/blind_and_aged/single.yaml | 50 + .../exemptions/blind_and_aged/widow.yaml | 50 + .../hundred_year/age_eligibility.yaml | 12 + .../low_and_middle_income/income_limit.yaml | 25 + .../low_and_middle_income/max_amount.yaml | 13 + .../reduction/income_threshold.yaml | 26 + .../low_and_middle_income/reduction/rate.yaml | 25 + .../social_security_income/income_limit.yaml | 30 + .../age_eligibility.yaml | 12 + .../amount.yaml | 12 + .../min_expenses.yaml | 12 + .../nm/tax/income/main/head_of_household.yaml | 35 + .../gov/states/nm/tax/income/main/joint.yaml | 35 + .../states/nm/tax/income/main/separate.yaml | 35 + .../gov/states/nm/tax/income/main/single.yaml | 35 + .../gov/states/nm/tax/income/main/widow.yaml | 35 + .../nm/tax/income/modified_gross_income.yaml | 26 + .../other_deductions_and_exemptions.yaml | 18 + .../2021_income/additional/amount.yaml | 28 + .../rebates/2021_income/main/amount.yaml | 28 + .../2021_income/main/income_limit.yaml | 28 + .../2021_income/supplemental/amount.yaml | 28 + .../low_income/amount/five_exemptions.yaml | 96 + .../low_income/amount/four_exemptions.yaml | 100 + .../low_income/amount/one_exemption.yaml | 100 + .../low_income/amount/six_exemptions.yaml | 104 + .../low_income/amount/three_exemptions.yaml | 100 + .../low_income/amount/two_exemptions.yaml | 100 + .../income/rebates/low_income/divisor.yaml | 15 + .../rebates/low_income/exemptions/aged.yaml | 21 + .../rebates/low_income/exemptions/blind.yaml | 12 + .../rebates/property_tax/age_eligibility.yaml | 14 + .../property_tax/income_threshold.yaml | 14 + .../rebates/property_tax/max_amount.yaml | 25 + .../max_property_tax_liability.yaml | 84 + .../rebates/property_tax/rent_rate.yaml | 14 + .../parameters/gov/states/ny/otda/README.md | 1 + .../gov/states/ny/otda/tanf/README.md | 1 + .../ny/tax/income/credits/cdcc/README.md | 2 +- .../ny/tax/income/credits/ctc/README.md | 2 +- .../ny/tax/income/credits/eitc/README.md | 2 +- .../parameters/gov/states/oh/index.yaml | 1 + .../income/credits/adoption/age_limit.yaml | 16 + .../income/credits/adoption/amount/max.yaml | 19 + .../income/credits/adoption/amount/min.yaml | 18 + .../oh/tax/income/credits/cdcc/README.md | 1 + .../oh/tax/income/credits/cdcc/match.yaml | 25 + .../oh/tax/income/credits/eitc/README.md | 1 + .../oh/tax/income/credits/eitc/rate.yaml | 11 + .../income/credits/non_public_tuition.yaml | 27 + .../oh/tax/income/credits/non_refundable.yaml | 23 + .../credits/retirement_income/amount.yaml | 38 + .../retirement_income/income_threshold.yaml | 14 + .../credits/senior_citizen/age_threshold.yaml | 12 + .../credits/senior_citizen/agi_limit.yaml | 21 + .../ok/tax/income/credits/child/README.md | 1 + .../income/credits/earned_income/README.md | 1 + .../or/tax/income/credits/ctc/amount.yaml | 10 + .../tax/income/credits/ctc/child_limit.yaml | 9 + .../income/credits/ctc/ineligible_age.yaml | 9 + .../income/credits/ctc/reduction/start.yaml | 9 + .../income/credits/ctc/reduction/width.yaml | 9 + .../or/tax/income/credits/eitc/README.md | 2 +- .../or/tax/income/credits/nonrefundable.yaml | 15 +- .../or/tax/income/credits/refundable.yaml | 25 +- .../retirement_income/age_eligibility.yaml | 15 + .../credits/retirement_income/base.yaml | 22 + .../retirement_income/income_threshold.yaml | 23 + .../credits/retirement_income/percentage.yaml | 11 + .../parameters/gov/states/pa/dhs/README.md | 1 + .../gov/states/pa/dhs/tanf/README.md | 1 + .../dhs/tanf/cash_assistance/age_limit.yaml | 11 + .../tanf/pregnancy_eligibility/age_limit.yaml | 9 + .../states/pa/dhs/tanf/resource_limit.yaml | 13 + .../parameters/gov/states/ri/README.md | 1 + .../parameters/gov/states/ri/index.yaml | 4 + .../ri/tax/income/credits/cdcc/README.md | 1 + .../ri/tax/income/credits/cdcc/rate.yaml | 13 + .../ri/tax/income/credits/eitc/README.md | 1 + .../ri/tax/income/credits/eitc/match.yaml | 13 + .../credits/property_tax/age_threshold.yaml | 15 + .../tax/income/credits/property_tax/cap.yaml | 22 + .../credits/property_tax/max_amount.yaml | 22 + .../property_tax/rate/multiple_people.yaml | 36 + .../credits/property_tax/rate/one_person.yaml | 36 + .../credits/property_tax/rate/rent.yaml | 14 + .../income/deductions/standard/amount.yaml | 11 +- .../standard/phase_out/increment.yaml | 19 + .../standard/phase_out/percentage.yaml | 15 + .../deductions/standard/phase_out/start.yaml | 17 + .../states/ri/tax/income/income_sources.yaml | 31 + .../parameters/gov/states/sc/index.yaml | 4 + .../sc/tax/income/credits/cdcc/README.md | 1 + .../cdcc/max_care_expense_year_offset.yaml | 16 + .../sc/tax/income/credits/cdcc/rate.yaml | 15 + .../sc/tax/income/credits/eitc/README.md | 1 + .../sc/tax/income/credits/eitc/rate.yaml | 19 + .../two_wage_earner/earned_income.yaml | 23 + .../income/credits/two_wage_earner/rate.yaml | 28 + .../deductions/net_capital_gain/rate.yaml | 17 + .../exemptions/senior/age_threshold.yaml | 11 + .../tax/income/exemptions/senior/amount.yaml | 11 + .../exemptions/senior/spouse_amount.yaml | 11 + .../parameters/gov/states/tx/index.yaml | 4 + .../parameters/gov/states/vt/README.md | 1 + .../parameters/gov/states/vt/index.yaml | 4 + .../agi/exclusions/capital_gain/flat/cap.yaml | 15 + .../capital_gain/income_share_cap.yaml | 16 + .../capital_gain/percentage/cap.yaml | 15 + .../capital_gain/percentage/rate.yaml | 15 + .../vt/tax/income/agi/subtractions.yaml | 17 + .../vt/tax/income/credits/eitc/match.yaml | 14 + .../vt/tax/income/credits/refundable.yaml | 8 + .../deductions/standard/additional.yaml | 16 + .../tax/income/deductions/standard/base.yaml | 31 + .../vt/tax/income/exemption/personal.yaml | 16 + .../tax/income/rates/head_of_household.yaml | 34 + .../gov/states/vt/tax/income/rates/joint.yaml | 34 + .../states/vt/tax/income/rates/separate.yaml | 34 + .../states/vt/tax/income/rates/single.yaml | 34 + .../gov/states/vt/tax/income/rates/widow.yaml | 34 + .../parameters/gov/states/wa/dshs/index.yaml | 4 + .../parameters/gov/states/wi/README.md | 1 + .../income/additions/capital_loss/limit.yaml | 12 + .../wi/tax/income/additions/sources.yaml | 19 + .../credits/childcare_expense/README.md | 1 + .../credits/childcare_expense/fraction.yaml | 13 + .../income/credits/earned_income/README.md | 1 + .../credits/earned_income/fraction.yaml | 28 + .../investment_income_limit.yaml | 13 + .../homestead/eligible/earnings_sources.yaml | 13 + .../homestead/eligible/max_income.yaml | 13 + .../credits/homestead/eligible/min_age.yaml | 13 + .../homestead/eligible/min_elderly_age.yaml | 13 + .../credits/homestead/income/exemption.yaml | 11 + .../credits/homestead/income/sources.yaml | 19 + .../credits/homestead/phase_out/rate.yaml | 13 + .../credits/homestead/phase_out/start.yaml | 13 + .../credits/homestead/property_tax/max.yaml | 13 + .../homestead/property_tax/rent_ratio.yaml | 11 + .../wi/tax/income/credits/homestead/rate.yaml | 13 + .../credits/itemized_deduction/rate.yaml | 11 + .../married_couple/income_sources.yaml | 15 + .../income/credits/married_couple/max.yaml | 11 + .../income/credits/married_couple/rate.yaml | 11 + .../wi/tax/income/credits/non_refundable.yaml | 23 + .../tax/income/credits/property_tax/max.yaml | 11 + .../tax/income/credits/property_tax/rate.yaml | 11 + .../credits/property_tax/rent_fraction.yaml | 11 + .../wi/tax/income/credits/refundable.yaml | 17 + .../tax/income/deductions/standard/max.yaml | 29 + .../standard/phase_out/head_of_household.yaml | 24 + .../deductions/standard/phase_out/joint.yaml | 19 + .../standard/phase_out/separate.yaml | 19 + .../deductions/standard/phase_out/single.yaml | 19 + .../states/wi/tax/income/exemption/base.yaml | 9 + .../states/wi/tax/income/exemption/extra.yaml | 9 + .../wi/tax/income/exemption/old_age.yaml | 9 + .../tax/income/rates/head_of_household.yaml | 29 + .../gov/states/wi/tax/income/rates/joint.yaml | 29 + .../states/wi/tax/income/rates/separate.yaml | 29 + .../states/wi/tax/income/rates/single.yaml | 29 + .../subtractions/capital_gain/fraction.yaml | 12 + .../childcare_expense/max_amount.yaml | 11 + .../childcare_expense/max_dependents.yaml | 10 + .../retirement_income/max_agi.yaml | 26 + .../retirement_income/max_amount.yaml | 12 + .../retirement_income/min_age.yaml | 12 + .../wi/tax/income/subtractions/sources.yaml | 26 + .../income_phase_out/base.yaml | 26 + .../income_phase_out/rate.yaml | 12 + .../parameters/gov/states/wv/README.md | 1 + .../parameters/gov/states/wv/index.yaml | 4 + .../amount/head_of_household.yaml | 60 + .../amount/joint.yaml | 59 + .../amount/separate.yaml | 60 + .../amount/single.yaml | 59 + .../amount/widow.yaml | 59 + .../fpg_percent.yaml | 26 + .../max_family_size.yaml | 18 + .../wv/tax/income/credits/non_refundable.yaml | 7 + .../wv/tax/income/credits/refundable.yaml | 7 + .../income/credits/sctc/fpg_percentage.yaml | 17 + .../tax/income/credits/sctc/max_amount.yaml | 16 + .../homestead_exemption/max_amount.yaml | 16 + .../public_pension/max_amount.yaml | 16 + fiscalsim_us/parameters/gov/usda/README.md | 2 +- .../gov/usda/school_meals/income/limit.yaml | 2 - .../parameters/gov/usda/snap/README.md | 2 +- .../gov/usda/snap/asset_test/limit.yaml | 5 + .../snap/income/deductions/child_support.yaml | 11 +- .../snap/income/deductions/earned_income.yaml | 1 - .../excess_medical_expense/disregard.yaml | 1 - .../excess_medical_expense/standard.yaml | 7 +- .../excess_shelter_expense/cap.yaml | 10 +- .../homeless/available.yaml | 7 +- .../homeless/deduction.yaml | 7 +- .../income_share_disregard.yaml | 1 - .../excess_shelter_expense}/index.yaml | 1 + .../usda/snap/income/deductions/standard.yaml | 35 +- .../deductions/utility/limited/active.yaml | 1 - .../deductions/utility/limited/allowance.yaml | 7 +- .../utility/single/electricity.yaml | 7 +- .../utility/single/gas_and_fuel.yaml | 7 +- .../deductions/utility/single/phone.yaml | 7 +- .../deductions/utility/single/sewage.yaml | 7 +- .../deductions/utility/single/trash.yaml | 7 +- .../utility/single/utility_types.yaml | 1 - .../deductions/utility/single/water.yaml | 7 +- .../income/deductions/utility/standard.yaml | 7 +- .../gov/usda/snap/income/limit/gross.yaml | 1 - .../gov/usda/snap/income/limit/net.yaml | 1 - .../gov/usda/snap/max_allotment.yaml | 69 +- .../parameters/gov/usda/wic/README.md | 2 +- .../gov/usda/wic/nutritional_risk.yaml | 1 - .../parameters/gov/usda/wic/takeup.yaml | 1 - .../parameters/simulation/cliff_delta.yaml | 5 + .../simulation/cliff_threshold.yaml | 5 - ...ranch_to_determine_if_refundable_eitc.yaml | 6 + .../simulation/marginal_tax_rate_delta.yaml | 5 + fiscalsim_us/reforms/__init__.py | 1 + .../reforms/congress/delauro/__init__.py | 3 + .../congress/delauro/american_family_act.py | 51 + fiscalsim_us/reforms/dc_kccatc.py | 96 + .../reforms/dc_tax_threshold_joint_ratio.py | 51 + fiscalsim_us/reforms/reforms.py | 34 + fiscalsim_us/reforms/winship.py | 83 + fiscalsim_us/system.py | 199 +- .../tests/microsimulation/test_microsim.py | 27 +- .../pell_grant_dependent_allowances.yaml | 23 + .../pell_grant_dependent_contribution.yaml | 49 + .../pell_grant_dependents_in_college.yaml | 33 + .../efc/head/pell_grant_head_assets.yaml | 65 + .../pell_grant_head_available_income.yaml | 111 + .../head/pell_grant_head_contribution.yaml | 44 + .../gov/ed/pell_grant/efc/pell_grant_efc.yaml | 79 + .../ed/pell_grant/efc/pell_grant_formula.yaml | 35 + ...pell_grant_simplified_formula_applies.yaml | 155 + .../gov/ed/pell_grant/pell_grant.yaml | 26 + .../baseline/gov/fcc/acp/integration.yaml | 2 +- .../baseline/gov/fcc/acp/is_acp_eligible.yaml | 16 + .../baseline/gov/fcc/ebb/integration.yaml | 4 +- .../gov/irs/credits/cdcc/capped_cdcc.yaml | 35 + .../eitc_demographic_eligible.yaml | 25 + .../credits/earned_income/eitc_eligible.yaml | 29 +- .../eitc_investment_income_eligible.yaml | 13 + .../adjusted_gross_income_person.yaml | 109 + .../irs/integration/capital_gains_losses.yaml | 55 + .../baseline/gov/irs/irs_gross_income.yaml | 2 +- .../federal_income/capped_property_taxes.yaml | 15 + .../itemized_deductions_less_salt.yaml | 10 + .../gov/irs/tax/no_salt_income_tax.yaml | 6 - ...eligible_for_social_security_benefits.yaml | 23 + ...ome_tax_before_non_refundable_credits.yaml | 49 + ..._income_tax_before_refundable_credits.yaml | 17 + .../states/ar/tax/income/credits/ar_cdcc.yaml | 15 + .../ar_inflationary_relief_tax_credit.yaml | 44 + .../deductions/ar_standard_deduction.yaml | 40 + ...ome_tax_before_non_refundable_credits.yaml | 44 + ..._income_tax_before_refundable_credits.yaml | 17 + .../income/credits/az_family_tax_credit.yaml | 59 + .../az_family_tax_credit_eligible.yaml | 59 + .../az_increased_excise_tax_credit.yaml | 71 + ..._increased_excise_tax_credit_eligible.yaml | 89 + .../az_charitable_contributions_credit.yaml | 80 + .../az_dependent_tax_credit.yaml | 170 + .../itemized/az_itemized_deductions.yaml | 91 + .../standard/az_base_standard_deduction.yaml | 31 + ...eduction_for_charitable_contributions.yaml | 17 + .../standard/az_standard_deduction.yaml | 15 - .../az_public_pension_exclusion.yaml | 98 + ...z_long_term_capital_gains_subtraction.yaml | 15 + .../gov/states/co/hcpf/chp/co_chp.yaml | 125 + .../states/co/hcpf/chp/co_chp_eligible.yaml | 54 + .../chp/co_chp_out_of_pocket_maximum.yaml | 13 + .../co_federal_deduction_addback.yaml | 310 ++ ...co_federal_deduction_addback_required.yaml | 44 + ...ess_income_deduction_addback_eligible.yaml | 44 + .../state_addback/co_state_addback.yaml | 50 + ...ome_tax_before_non_refundable_credits.yaml | 57 + ..._income_tax_before_refundable_credits.yaml | 17 + .../co/tax/income/co_taxable_income.yaml | 9 + .../co/tax/income/credits/cdcc/co_cdcc.yaml | 93 + .../credits/cdcc/co_low_income_cdcc.yaml | 137 + .../cdcc/co_low_income_cdcc_eligible.yaml | 26 + .../tax/income/credits/cdcc/integration.yaml | 23 + .../co/tax/income/credits/ctc/co_ctc.yaml | 412 ++ ..._federal_ctc_child_individual_maximum.yaml | 26 + .../federal_ctc/co_non_refundable_ctc.yaml | 17 + .../ctc/federal_ctc/co_refundable_ctc.yaml | 199 + .../co/tax/income/credits/eitc/co_eitc.yaml | 58 +- .../co_income_qualified_senior_housing.yaml | 150 + ...ome_qualified_senior_housing_eligible.yaml | 103 + .../sales_tax_refund/co_sales_tax_refund.yaml | 53 + .../co_sales_tax_refund_eligible.yaml | 56 + .../gov/states/co/tax/income/integration.yaml | 33 + ...o_charitable_contribution_subtraction.yaml | 32 + ...ble_contribution_subtraction_eligible.yaml | 15 + .../co_collegeinvest_contribution.yaml | 39 + .../co_military_retirement_subtraction.yaml | 114 + .../pension/co_pension_subtraction_indv.yaml | 116 + .../co_pension_subtraction_indv_eligible.yaml | 26 + .../co_social_security_subtraction_indv.yaml | 63 + ...al_security_subtraction_indv_eligible.yaml | 26 + .../ct_income_tax_higher_tax_recapture.yaml | 62 + .../ct_income_tax_lower_tax_recapture.yaml | 53 + .../ct_income_tax_phase_out_add_back.yaml | 62 + .../credits/ct_personal_credit_rate.yaml | 45 + .../ct/tax/income/credits/eitc/ct_eitc.yaml | 15 + .../ct_income_tax_after_personal_credits.yaml | 47 + ..._income_tax_before_refundable_credits.yaml | 17 + .../ct/tax/income/ct_taxable_income.yaml | 26 + .../exemptions/ct_personal_exemptions.yaml | 26 + .../tuition/ct_tuition_subtraction.yaml | 89 + .../dc/dhs/tanf/dc_tanf_grant_standard.yaml | 4 +- .../gov/states/dc/dhs/tanf/integration.yaml | 16 + .../dc_eitc_without_qualifying_children.yaml | 40 - .../gov/states/dc/tax/income/dc_cdcc.yaml | 15 + .../dc/tax/income/dc_deduction_indiv.yaml | 27 + .../dc/tax/income/dc_deduction_joint.yaml | 19 + .../dc_disabled_exclusion_subtraction.yaml | 93 + .../income/{credits/eitc => }/dc_eitc.yaml | 38 +- .../dc_eitc_with_qualifying_child.yaml | 30 +- .../dc_eitc_without_qualifying_children.yaml | 43 + .../dc/tax/income/dc_files_separately.yaml | 27 + .../income/dc_income_tax_before_credits.yaml | 17 + .../dc_income_tax_before_credits_indiv.yaml | 39 + .../dc_income_tax_before_credits_joint.yaml | 39 + ..._income_tax_before_refundable_credits.yaml | 17 + .../dc/tax/income/dc_itemized_deductions.yaml | 55 + .../gov/states/dc/tax/income/dc_kccatc.yaml | 185 + .../gov/states/dc/tax/income/dc_ptc.yaml | 245 + .../dc_self_employment_loss_addition.yaml | 43 + .../standard/dc_standard_deduction.yaml | 15 - .../de/tax/income/credits/cdcc/de_cdcc.yaml | 15 + .../de/tax/income/credits/eitc/de_eitc.yaml | 19 + .../credits/eitc/de_non_refundable_eitc.yaml | 19 + .../de_non_refundable_eitc_if_claimed.yaml | 15 + .../eitc/de_refundable_eitc_if_claimed.yaml | 15 + .../de_claims_refundable_eitc.yaml | 17 + ...e_tax_if_claiming_non_refundable_eitc.yaml | 23 + ...ncome_tax_if_claiming_refundable_eitc.yaml | 14 + .../personal/de_aged_personal_credit.yaml | 44 + .../credits/personal/de_personal_credits.yaml | 31 + ...ome_tax_before_non_refundable_credits.yaml | 15 + ..._income_tax_before_refundable_credits.yaml | 14 +- .../de_additional_standard_deduction.yaml | 54 + .../standard/de_standard_deduction.yaml | 15 + ..._elderly_or_disabled_income_exclusion.yaml | 23 + ...or_disabled_income_exclusion_eligible.yaml | 118 + .../dependent_care_credit/ga_cdcc.yaml | 23 + .../income/credits/ga_low_income_credit.yaml | 87 + .../standard/ga_standard_deduction.yaml | 55 + .../tax/income/exemptions/ga_exemptions.yaml | 44 + ..._income_tax_before_refundable_credits.yaml | 44 + .../ga/tax/income/ga_taxable_income.yaml | 9 + .../food_excise/hi_food_excise_credit.yaml | 232 + ...credit_child_receiving_public_support.yaml | 49 + ...food_excise_credit_minor_child_amount.yaml | 23 + ..._food_excise_credit_minor_child_count.yaml | 77 + .../hi_food_excise_exemption_amount.yaml | 187 + .../states/hi/tax/income/credits/hi_eitc.yaml | 15 + .../hi_lihrtc_eligible.yaml | 39 + ...w_income_household_renters_tax_credit.yaml | 39 + .../ia/tax/income/ia_fedtax_deduction.yaml | 15 +- .../states/ia/tax/income/ia_integration.yaml | 160 + .../ia/tax/income/ia_qbi_deduction.yaml | 6 +- .../states/id/tax/income/credits/id_ctc.yaml | 23 + .../states/id/tax/income/id_deductions.yaml | 17 + ...ome_tax_before_non_refundable_credits.yaml | 56 + ..._income_tax_before_refundable_credits.yaml | 17 + .../id/tax/income/id_taxable_income.yaml | 17 + .../in_additional_exemptions.yaml | 0 .../in_aged_blind_exemptions.yaml | 0 .../in_aged_low_agi_exemptions.yaml | 0 .../in/tax/income/{taxes => }/in_agi_tax.yaml | 8 + .../{exemptions => }/in_base_exemptions.yaml | 0 .../gov/states/in/tax/income/in_eitc.yaml | 34 + .../in/tax/income/in_eitc_eligible.yaml | 77 + .../{exemptions => }/in_exemptions.yaml | 0 ...in_homeowners_property_tax_deduction.yaml} | 4 +- .../in_is_qualifying_dependent_child.yaml | 0 ...aml => in_military_service_deduction.yaml} | 0 .../in_nonpublic_school_deduction.yaml | 0 .../in/tax/income/in_refundable_credits.yaml | 8 + ...renters.yaml => in_renters_deduction.yaml} | 0 ..._unemployment_compensation_deduction.yaml} | 0 .../income/in_unified_elderly_tax_credit.yaml | 123 + .../dependent_care_credit/ky_cdcc.yaml | 15 + .../ky_family_size_tax_credit.yaml | 17 + .../ky_family_size_tax_credit_rate.yaml | 39 + .../ky_modified_agi.yaml | 19 + .../deductions/ky_standard_deduction.yaml | 13 + ...ome_tax_before_non_refundable_credits.yaml | 31 + ..._income_tax_before_refundable_credits.yaml | 21 +- .../la/tax/income/la_agi_subtractions.yaml | 16 - .../md/tax/income/credits/ctc/md_ctc.yaml | 171 + .../income/credits/ctc/md_ctc_eligible.yaml | 31 + .../states/md/tax/income/credits/md_ctc.yaml | 23 - .../senior_tax/md_senior_tax_credit.yaml | 107 + .../md_senior_tax_credit_eligible.yaml | 35 + .../tax/income/deductions/me_deduction.yaml | 45 - .../deductions/me_standard_deduction.yaml | 39 - ..._income_tax_before_refundable_credits.yaml | 29 + .../tax/income/me_non_refundable_credits.yaml | 9 + .../me/tax/income/me_refundable_credits.yaml | 9 + .../me_deduction_phaseout_percentage.yaml | 159 + .../deductions/me_deductions.yaml | 32 + .../deductions/me_dependent_exemption.yaml | 118 +- .../me_itemized_deductions_pre_phaseout.yaml | 101 + .../deductions/me_personal_exemption.yaml | 98 +- .../taxable_income/me_taxable_income.yaml | 40 +- .../states/mi/tax/income/credits/mi_eitc.yaml | 23 + .../tax/income/exemptions/mi_exemptions.yaml | 107 + ...ion_and_ss_or_ssd_deduction_section_b.yaml | 214 +- .../mo_net_state_income_taxes.yaml | 27 +- ...ional_guard_or_reserve_pay_adjustment.yaml | 15 + .../ms_self_employment_adjustment.yaml | 15 + .../tax/income/deductions/ms_deductions.yaml | 17 + .../standard/ms_standard_deduction.yaml | 39 + .../income/exemptions/ms_aged_exemption.yaml | 85 + .../income/exemptions/ms_blind_exemption.yaml | 77 + .../states/ms/tax/income/ms_income_tax.yaml | 17 + .../income/ms_income_tax_before_credits.yaml | 71 + .../ms/tax/income/ms_taxable_income.yaml | 19 + .../credits/mt_capital_gain_credit.yaml | 15 + .../standard/mt_standard_deduction.yaml | 44 + .../exemptions/mt_aged_exemption_count.yaml | 35 + .../mt_dependent_exemption_count.yaml | 79 + .../tax/income/exemptions/mt_exemptions.yaml | 23 + .../gov/states/mt/tax/income/mt_eitc.yaml | 26 + .../states/nc/tax/income/credits/nc_ctc.yaml | 71 + .../income/deductions/nc_child_deduction.yaml | 59 + .../deductions/nc_itemized_deductions.yaml | 47 + .../deductions/nc_standard_deduction.yaml | 23 + .../nc_standard_or_itemized_deductions.yaml | 8 + .../ne/tax/income/ne_itemized_deductions.yaml | 48 +- .../ne/tax/income/ne_taxable_income.yaml | 51 +- .../credits/nh_education_tax_credit.yaml | 125 + .../income/exemptions/nh_base_exemption.yaml | 39 + .../income/exemptions/nh_blind_exemption.yaml | 104 + .../exemptions/nh_disabled_exemption.yaml | 196 + .../exemptions/nh_old_age_exemption.yaml | 104 + ..._income_tax_before_refundable_credits.yaml | 8 + .../nj_child_tax_credit.yaml => nj_ctc.yaml} | 12 +- .../nj_other_retirement_income_exclusion.yaml | 34 + ...nj_other_retirement_special_exclusion.yaml | 71 + .../nj_pension_retirement_exclusion.yaml | 442 ++ .../states/nj/tax/income/nj_integration.yaml | 24 - .../nj_potential_property_tax_deduction.yaml | 70 +- .../nj_property_tax_credit_eligible.yaml | 62 +- .../nj_property_tax_deduction_eligible.yaml | 16 +- .../nj/tax/income/taxable_income/nj_agi.yaml | 106 + .../nm/tax/income/credits/cdcc/nm_cdcc.yaml | 42 + .../income/credits/cdcc/nm_cdcc_eligible.yaml | 228 + .../credits/cdcc/nm_cdcc_eligible_child.yaml | 26 + .../credits/cdcc/nm_cdcc_max_amount.yaml | 172 + .../nm/tax/income/credits/eitc/nm_eitc.yaml | 32 + .../eitc/nm_eitc_demographic_eligible.yaml | 50 + .../income/credits/eitc/nm_eitc_eligible.yaml | 29 + .../states/nm/tax/income/credits/nm_ctc.yaml | 39 + .../credits/nm_medical_expense_credit.yaml | 64 + .../nm_deduction_for_certain_dependents.yaml | 53 + ...ction_for_certain_dependents_eligible.yaml | 27 + .../tax/income/deductions/nm_deductions.yaml | 36 + .../deductions/nm_itemized_deductions.yaml | 64 + .../nm_medical_care_expense_deduction.yaml | 399 ++ .../nm_net_capital_gains_deduction.yaml | 35 + .../nm_blind_and_aged_exemption.yaml | 211 + .../exemptions/nm_hundred_year_exemption.yaml | 53 + .../nm_low_and_middle_income_exemption.yaml | 29 + .../nm_medical_expense_exemption.yaml | 49 + .../nm_social_security_income_exemption.yaml | 39 + ...ome_tax_before_non_refundable_credits.yaml | 26 + ..._income_tax_before_refundable_credits.yaml | 17 + .../nm/tax/income/nm_taxable_income.yaml | 23 + .../2021_income/nm_2021_income_rebate.yaml | 49 + .../nm_additional_2021_income_rebate.yaml | 62 + .../nm_supplemental_2021_income_rebate.yaml | 62 + .../low_income_comprehensive/integration.yaml | 31 + ...m_low_income_comprehensive_tax_rebate.yaml | 221 + ...e_comprehensive_tax_rebate_exemptions.yaml | 26 + .../rebates/nm_property_tax_rebate.yaml | 71 + .../nm_property_tax_rebate_eligibility.yaml | 49 + .../income/credits/oh_adoption_credit.yaml | 187 + .../states/oh/tax/income/credits/oh_cdcc.yaml | 35 + .../states/oh/tax/income/credits/oh_eitc.yaml | 24 + .../credits/oh_non_public_school_credits.yaml | 92 + .../credits/oh_senior_citizen_credit.yaml | 39 + .../oh_retirement_income_credit.yaml | 127 + .../oh_retirement_income_credit_eligible.yaml | 15 + .../gov/states/oh/tax/income/oh_agi.yaml | 36 +- .../ok/tax/income/ok_itemized_deductions.yaml | 61 +- .../ok/tax/income/ok_taxable_income.yaml | 103 +- .../states/or/tax/income/credits/or_ctc.yaml | 97 + .../or_retirement_credit.yaml | 199 + .../or_retirement_credit_eligible.yaml | 49 + .../gov/states/or/tax/income/integration.yaml | 31 + .../or_federal_tax_liability_subtraction.yaml | 42 +- .../cash_assistance/pa_tanf_age_eligible.yaml | 44 + .../pa_tanf_pregnancy_eligibility.yaml | 59 + .../pa_tanf_resources_eligible.yaml | 24 + .../ri/tax/income/credits/cdcc/ri_cdcc.yaml | 15 + .../ri/tax/income/credits/eitc/ri_eitc.yaml | 23 + .../property_tax/ri_property_tax_credit.yaml | 46 + .../ri_property_tax_credit_eligible.yaml | 65 + .../standard/ri_standard_deduction.yaml | 71 + ...ndard_deduction_applicable_percentage.yaml | 47 + .../sc/tax/income/credits/eitc/sc_eitc.yaml | 47 + .../states/sc/tax/income/credits/sc_cdcc.yaml | 87 + .../sc_two_wage_earner_credit.yaml | 94 + .../sc_net_capital_gain_deduction.yaml | 7 + .../exemptions/sc_senior_exemption.yaml | 85 + .../sc/tax/income/sc_state_tax_addback.yaml | 94 + .../vt_medical_expense_deductions.yaml | 39 + .../vt/agi/vt_capital_gains_exclusion.yaml | 49 + ...vt_percentage_capital_gains_exclusion.yaml | 31 + .../deductions/vt_standard_deduction.yaml | 72 + .../exemptions/vt_personal_exemptions.yaml | 145 + .../gov/states/vt/tax/income/vt_eitc.yaml | 23 + ...ome_tax_before_non_refundable_credits.yaml | 131 + ..._income_tax_before_refundable_credits.yaml | 18 + .../vt/tax/income/vt_taxable_income.yaml | 36 + .../policy/baseline/gov/states/vt/vt_agi.yaml | 32 - .../income/wi_capital_gain_loss_addition.yaml | 35 + .../wi_capital_gain_loss_subtration.yaml | 29 + .../states/wi/tax/income/wi_capital_loss.yaml | 19 + .../income/wi_childcare_expense_credit.yaml | 17 + .../wi_childcare_expense_subtraction.yaml | 43 + .../tax/income/wi_earned_income_credit.yaml | 21 + .../states/wi/tax/income/wi_exemption.yaml | 16 + .../wi/tax/income/wi_homestead_credit.yaml | 43 + .../wi/tax/income/wi_homestead_eligible.yaml | 97 + .../wi/tax/income/wi_homestead_income.yaml | 19 + .../tax/income/wi_homestead_property_tax.yaml | 9 + .../income/wi_income_tax_before_credits.yaml | 29 + ..._income_tax_before_refundable_credits.yaml | 19 + .../income/wi_itemized_deduction_credit.yaml | 27 + .../tax/income/wi_married_couple_credit.yaml | 47 + .../wi/tax/income/wi_property_tax_credit.yaml | 29 + .../wi_retirement_income_subtraction.yaml | 38 + ...ement_income_subtraction_agi_eligible.yaml | 19 + .../wi/tax/income/wi_standard_deduction.yaml | 39 + .../wi/tax/income/wi_taxable_income.yaml | 19 + ...unemployment_compensation_subtraction.yaml | 41 + .../wv/tax/income/credits/sctc/wv_sctc.yaml | 31 + .../income/credits/sctc/wv_sctc_eligible.yaml | 43 + .../wv_low_income_family_tax_credit.yaml | 57 + .../wv_low_income_family_tax_credit_fpg.yaml | 36 + .../wv_homestead_exemption.yaml | 17 + .../wv_public_pension_subtraction.yaml | 71 + ...me_tax_before_non_refundable_credits.yaml} | 6 +- ..._income_tax_before_refundable_credits.yaml | 17 + .../wv/tax/income/wv_taxable_income.yaml | 19 + ...snap_excess_shelter_expense_deduction.yaml | 11 +- .../deductions/snap_standard_deduction.yaml | 32 +- ...child_support_gross_income_deduction.yaml} | 6 +- .../snap_gross_income_fpg_ratio.yaml | 6 +- .../gov/usda/snap/income/snap_fpg.yaml | 19 + .../usda/snap/income/snap_gross_income.yaml | 7 - .../income/snap_net_income_fpg_ratio.yaml | 6 +- .../baseline/gov/usda/snap/integration.yaml | 44 +- .../policy/baseline/gov/usda/snap/snap.yaml | 2 +- .../usda/snap/snap_expected_contribution.yaml | 2 +- .../gov/usda/snap/snap_min_allotment.yaml | 2 +- .../baseline/household/cliff_evaluated.yaml | 44 + .../policy/baseline/household/cliff_gap.yaml | 149 + .../tax_unit/is_tax_unit_head_or_spouse.yaml | 23 + .../tax_unit_childcare_expenses.yaml | 29 +- .../household/household_state_income_tax.yaml | 14 + .../income/equiv_household_net_income.yaml | 7 + .../baseline/household/is_on_cliff.yaml | 6 + .../baseline/household/marginal_tax_rate.yaml | 90 + .../american_family_act_with_baby_bonus.yaml | 18 + .../tests/policy/contrib/dc_kccatc.yaml | 44 + .../dc_single_joint_threshold_ratio.yaml | 18 + .../contrib/snap_ea/snap_ca_ea_reform.yaml | 3 +- fiscalsim_us/tests/policy/reform/winship.yaml | 72 + fiscalsim_us/tests/test_variables.py | 3 + fiscalsim_us/tools/general.py | 10 - fiscalsim_us/tools/taxcalc/calcfunctions.py | 4620 ----------------- ...ntial_efficiency_electrification_rebate.py | 19 +- .../pell_grant_dependent_allowances.py | 19 + .../pell_grant_dependent_available_income.py | 8 + .../pell_grant_dependent_contribution.py | 18 + .../pell_grant_dependent_other_allowances.py | 8 + .../efc/head/pell_grant_head_allowances.py | 8 + .../efc/head/pell_grant_head_assets.py | 16 + .../head/pell_grant_head_available_income.py | 23 + .../efc/head/pell_grant_head_contribution.py | 33 + .../efc/head/pell_grant_head_income.py | 8 + .../efc/pell_grant_countable_assets.py | 9 + .../efc/pell_grant_dependents_in_college.py | 14 + .../gov/ed/pell_grant/efc/pell_grant_efc.py | 30 + .../ed/pell_grant/efc/pell_grant_formula.py | 33 + .../pell_grant_simplified_formula_applies.py | 17 + .../variables/gov/ed/pell_grant/pell_grant.py | 15 +- .../pell_grant_cost_of_attending_college.py | 8 + .../pell_grant/pell_grant_months_in_school.py | 8 + .../hhs/medicaid/income/medicaid_income.py | 2 +- .../is_person_demographic_tanf_eligible.py | 1 - .../variables/gov/hud/hud_income_level.py | 7 +- .../gov/irs/credits/cdcc/capped_cdcc.py | 27 + .../new/new_clean_vehicle_credit.py | 1 - .../credits/earned_income/eitc_eligible.py | 47 - .../eligibility/eitc_demographic_eligible.py | 20 + .../eligibility/eitc_eligible.py | 25 + .../eitc_investment_income_eligible.py | 14 + ...ater_heater_biomass_stove_boiler_credit.py | 1 - ...apital_loss.py => limited_capital_loss.py} | 12 +- .../{loss.py => loss_ald.py} | 13 +- .../tax_unit_capital_loss.py | 13 - .../adjusted_gross_income.py | 2 +- .../adjusted_gross_income_person.py | 38 + .../taxable_social_security.py | 14 +- .../deductions/capped_property_taxes.py | 16 + .../itemized_deductions_less_salt.py | 19 + .../deductions/tax_unit_itemizes.py | 17 +- .../federal_income/alternative_minimum_tax.py | 109 +- .../regular_tax_before_credits.py | 84 - .../capital_gains/net_capital_gain.py | 24 +- .../net_long_term_capital_gain.py | 20 - .../net_long_term_capital_loss.py | 20 - .../net_short_term_capital_gain.py | 18 - .../net_short_term_capital_loss.py | 18 - .../tax/federal_income/no_salt_income_tax.py | 17 - .../aged_blind_extra_standard_deduction.py | 28 - .../taxcalc/deductions/standard/standard.py | 29 - .../variables/gov/irs/taxcalc/outputs.py | 10 - .../nyc/tax/income/credits/cdcc/nyc_cdcc.py | 75 +- .../cdcc/nyc_cdcc_age_restricted_expenses.py | 7 +- ...dcc_share_qualifying_childcare_expenses.py | 14 +- ...r_eligible_for_social_security_benefits.py | 15 + ...ed_income_deemed_from_ineligible_parent.py | 18 +- .../gov/states/ar/tax/income/ar_exemptions.py | 12 + .../gov/states/ar/tax/income/ar_income_tax.py | 13 + ...ncome_tax_before_non_refundable_credits.py | 17 + ...ar_income_tax_before_refundable_credits.py | 17 + .../tax/income/ar_non_refundable_credits.py | 12 + .../ar/tax/income/ar_refundable_credits.py | 12 + .../states/ar/tax/income/ar_taxable_income.py | 14 + .../states/ar/tax/income/credits/ar_cdcc.py | 16 + .../ar_inflationary_relief_tax_credit.py | 27 + .../standard/ar_standard_deduction.py | 16 + .../gov/states/az/tax/income/az_income_tax.py | 13 + ...ncome_tax_before_non_refundable_credits.py | 32 + ...az_income_tax_before_refundable_credits.py | 17 + .../tax/income/az_non_refundable_credits.py | 10 + .../az/tax/income/az_refundable_credits.py | 10 + .../states/az/tax/income/az_taxable_income.py | 10 + .../credits/az_increased_excise_tax_credit.py | 21 + ...az_increased_excise_tax_credit_eligible.py | 19 + .../az_charitable_contributions_credit.py | 36 + ..._to_qualifying_charitable_organizations.py | 14 + ...to_qualifying_foster_care_organizations.py | 14 + .../az_dependent_tax_credit.py | 28 + .../credits/family_tax_credit/az_agi.py | 10 + .../family_tax_credit/az_family_tax_credit.py | 19 + .../az_family_tax_credit_eligible.py | 35 + .../itemized/az_itemized_deductions.py | 64 + .../standard/az_base_standard_deduction.py | 16 + ..._deduction_for_charitable_contributions.py | 24 + .../standard/az_standard_deduction.py | 32 +- .../az_public_pension_exclusion.py | 27 + .../az_long_term_capital_gains_subtraction.py | 22 + .../itemized/ca_itemized_deductions.py | 78 +- .../ca/tax/income/exemptions/ca_exemptions.py | 1 - .../gov/states/co/hcpf/chp/co_chp.py | 21 + .../gov/states/co/hcpf/chp/co_chp_eligible.py | 20 + .../hcpf/chp/co_chp_out_of_pocket_maximum.py | 13 + .../co/tax/income/additions/co_additions.py | 21 + .../tax/income/additions/co_state_addback.py | 32 + .../co_federal_deduction_addback.py | 30 + .../co_federal_deduction_addback_required.py | 28 + ...ified_business_income_deduction_addback.py | 22 + ...iness_income_deduction_addback_required.py | 29 + .../gov/states/co/tax/income/co_income_tax.py | 13 + ...ncome_tax_before_non_refundable_credits.py | 15 + ...co_income_tax_before_refundable_credits.py | 17 + .../tax/income/co_non_refundable_credits.py | 13 + .../co/tax/income/co_refundable_credits.py | 12 + .../states/co/tax/income/co_taxable_income.py | 16 + .../co/tax/income/credits/cdcc/co_cdcc.py | 24 + .../income/credits/cdcc/co_low_income_cdcc.py | 35 + .../cdcc/co_low_income_cdcc_eligible.py | 20 + .../co/tax/income/credits/ctc/co_ctc.py | 70 + .../credits/ctc/co_ctc_eligible_child.py | 14 + .../ctc/co_ctc_eligible_children_count.py | 14 + .../credits/ctc/federal_ctc/co_federal_ctc.py | 21 + ...co_federal_ctc_child_individual_maximum.py | 27 + .../ctc/federal_ctc/co_federal_ctc_maximum.py | 21 + .../ctc/federal_ctc/co_non_refundable_ctc.py | 29 + .../ctc/federal_ctc/co_refundable_ctc.py | 64 + .../co/tax/income/credits/eitc/co_eitc.py | 35 +- ..._income_qualified_senior_housing_credit.py | 29 + ...ncome_qualified_senior_housing_eligible.py | 35 + .../sales_tax_refund/co_modified_agi.py | 13 + .../sales_tax_refund/co_sales_tax_refund.py | 25 + .../co_sales_tax_refund_eligible.py | 32 + .../exemptions/co_property_tax_exemption.py | 11 + .../co_charitable_contribution_subtraction.py | 27 + ...table_contribution_subtraction_eligible.py | 21 + .../income/subtractions/co_subtractions.py | 12 + .../co_collegeinvest_subtraction.py | 24 + .../co_military_retirement_subtraction.py | 33 + .../pension/co_pension_subtraction.py | 15 + .../pension/co_pension_subtraction_income.py | 12 + .../pension/co_pension_subtraction_indv.py | 49 + .../co_pension_subtraction_indv_eligible..py | 20 + .../co_social_security_subtraction_indv.py | 41 + ...cial_security_subtraction_indv_eligible.py | 21 + .../ct_income_tax_higher_tax_recapture.py | 23 + .../ct_income_tax_lower_tax_recapture.py | 23 + .../ct_income_tax_phase_out_add_back.py | 23 + .../add_back/ct_income_tax_recapture.py | 15 + .../income/credits/ct_personal_credit_rate.py | 33 + .../ct/tax/income/credits/eitc/ct_eitc.py | 19 + .../gov/states/ct/tax/income/ct_agi.py | 13 + .../states/ct/tax/income/ct_agi_additions.py | 10 + .../ct/tax/income/ct_agi_subtractions.py | 10 + .../gov/states/ct/tax/income/ct_income_tax.py | 13 + .../ct_income_tax_after_personal_credits.py | 38 + ...ct_income_tax_before_refundable_credits.py | 19 + .../tax/income/ct_non_refundable_credits.py | 10 + .../ct/tax/income/ct_refundable_credits.py | 10 + .../states/ct/tax/income/ct_taxable_income.py | 15 + .../exemptions/ct_personal_exemptions.py | 23 + .../income/subtractions/ct_subtractions.py | 12 + .../tuition/ct_tuition_subtraction.py | 19 + .../income/dc_tanf_countable_earned_income.py | 2 +- ...dc_tanf_countable_gross_unearned_income.py | 6 +- .../tanf/income/dc_tanf_countable_income.py | 2 +- .../income/dc_tanf_gross_earned_income.py | 2 +- .../income/additions/dc_income_additions.py | 15 + .../dc_self_employment_loss_addition.py | 32 + .../states/dc/tax/income/credits/dc_cdcc.py | 19 + .../states/dc/tax/income/credits/dc_kccatc.py | 41 + .../credits/dc_non_refundable_credits.py | 15 + .../states/dc/tax/income/credits/dc_ptc.py | 32 + .../income/credits/dc_refundable_credits.py | 15 + .../eitc/dc_eitc_with_qualifying_child.py | 34 +- .../eitc/dc_eitc_without_qualifying_child.py | 50 +- .../gov/states/dc/tax/income/dc_agi.py | 16 + .../dc/tax/income/dc_files_separately.py | 17 + .../gov/states/dc/tax/income/dc_income_tax.py | 16 + .../income/dc_income_tax_before_credits.py | 21 + .../dc_income_tax_before_credits_indiv.py | 20 + .../dc_income_tax_before_credits_joint.py | 19 + ...dc_income_tax_before_refundable_credits.py | 19 + .../dc/tax/income/dc_taxable_income_indiv.py | 16 + .../dc/tax/income/dc_taxable_income_joint.py | 17 + .../income/deductions/dc_deduction_indiv.py | 26 + .../income/deductions/dc_deduction_joint.py | 25 + .../deductions/dc_itemized_deductions.py | 37 + .../deductions/dc_standard_deduction.py | 11 + .../standard/dc_standard_deduction.py | 15 - .../dc_disabled_exclusion_subtraction.py | 31 + .../subtractions/dc_income_subtractions.py | 15 + .../de/tax/income/additions/de_additions.py | 10 + .../de/tax/income/credits/cdcc/de_cdcc.py | 15 + .../de/tax/income/credits/eitc/de_eitc.py | 18 + .../credits/eitc/de_non_refundable_eitc.py | 20 + .../eitc/de_non_refundable_eitc_if_claimed.py | 17 + .../income/credits/eitc/de_refundable_eitc.py | 16 + .../eitc/de_refundable_eitc_if_claimed.py | 19 + .../de_claims_refundable_eitc.py | 23 + ...ome_tax_if_claiming_non_refundable_eitc.py | 20 + ..._income_tax_if_claiming_refundable_eitc.py | 20 + .../personal/de_aged_personal_credit.py | 29 + .../credits/personal/de_personal_credit.py | 18 + .../gov/states/de/tax/income/de_agi.py | 13 + ...ncome_tax_before_non_refundable_credits.py | 14 + ...de_income_tax_before_refundable_credits.py | 7 +- .../tax/income/de_non_refundable_credits.py | 12 + .../de/tax/income/de_pre_exclusions_agi.py | 13 + .../de/tax/income/de_refundable_credits.py | 2 + .../itemized/de_itemized_deductions.py | 20 + .../de_additional_standard_deduction.py | 37 + .../standard/de_standard_deduction.py | 16 + .../income/subtractions/de_subtractions.py | 10 + ...de_elderly_or_disabled_income_exclusion.py | 20 + ...y_or_disabled_income_exclusion_eligible.py | 52 + .../variables/gov/states/ga/ga_additions.py | 16 + .../variables/gov/states/ga/ga_agi.py | 16 + .../gov/states/ga/ga_subtractions.py | 15 + .../ga/tax/income/credits/cdcc/ga_cdcc.py | 15 + .../income/credits/ga_low_income_credit.py | 32 + .../ga/tax/income/deductions/ga_deductions.py | 10 + .../deductions/ga_standard_deduction.py | 43 + .../ga/tax/income/exemptions/ga_exemptions.py | 30 + .../gov/states/ga/tax/income/ga_income_tax.py | 12 + ...ga_income_tax_before_refundable_credits.py | 32 + .../ga/tax/income/ga_refundable_credits.py | 10 + .../states/ga/tax/income/ga_taxable_income.py | 21 + .../ga_investment_in_529_plan_deduction.py | 14 + .../ga_military_retirement_exclusion.py | 15 + .../subtractions/ga_retirement_exclusion.py | 15 + .../food_excise/hi_food_excise_credit.py | 25 + ...e_credit_child_receiving_public_support.py | 28 + ...i_food_excise_credit_minor_child_amount.py | 16 + ...hi_food_excise_credit_minor_child_count.py | 21 + .../hi_food_excise_exemption_amount.py | 46 + .../states/hi/tax/income/credits/hi_eitc.py | 16 + ...low_income_household_renters_tax_credit.py | 27 + ...r_low_income_household_renters_eligible.py | 21 + .../gov/states/hi/tax/income/hi_additions.py | 11 + .../gov/states/hi/tax/income/hi_agi.py | 4 + .../states/hi/tax/income/hi_subtractions.py | 12 + .../subtractions/hi_military_pay_exclusion.py | 13 + .../income/deductions/ia_fedtax_deduction.py | 19 +- .../deductions/ia_itemized_deductions_unit.py | 10 +- .../tax/income/deductions/ia_qbi_deduction.py | 9 +- .../ia/tax/income/ia_alternate_tax_unit.py | 1 - .../gov/states/ia/tax/income/ia_amt_indiv.py | 4 +- .../gov/states/ia/tax/income/ia_amt_joint.py | 4 +- .../states/ia/tax/income/ia_reduced_tax.py | 1 - .../income/net_income/ia_prorate_fraction.py | 8 +- .../states/id/tax/income/credits/id_ctc.py | 19 + .../id/tax/income/deductions/id_deductions.py | 20 + .../gov/states/id/tax/income/id_additions.py | 10 + .../gov/states/id/tax/income/id_agi.py | 13 + .../gov/states/id/tax/income/id_income_tax.py | 12 + ...ncome_tax_before_non_refundable_credits.py | 32 + ...id_income_tax_before_refundable_credits.py | 17 + .../tax/income/id_non_refundable_credits.py | 10 + .../id/tax/income/id_refundable_credits.py | 10 + .../states/id/tax/income/id_taxable_income.py | 17 + .../income/subtractions/id_subtractions.py | 11 + .../in/tax/income/add_backs/in_add_backs.py | 2 +- .../in_bonus_depreciation_add_back.py | 2 +- .../tax/income/add_backs/in_nol_add_back.py | 2 +- ..._municipal_obligation_interest_add_back.py | 2 +- .../income/add_backs/in_other_add_backs.py | 2 +- .../in_section_179_expense_add_back.py | 2 +- .../tax/income/add_backs/in_tax_add_back.py | 2 +- .../credits/earned_income_credit/in_eitc.py | 49 + .../earned_income_credit/in_eitc_eligible.py | 42 + .../in_unified_elderly_tax_credit.py | 34 + .../income/credits/in_refundable_credits.py | 14 + .../in/tax/income/deductions/in_deductions.py | 2 +- .../deductions/in_homeowners_property_tax.py | 13 - .../in_homeowners_property_tax_deduction.py | 12 +- .../in_military_service_deduction.py | 2 +- .../states/in/tax/income/deductions/in_nol.py | 2 +- .../in_nonpublic_school_deduction.py | 2 +- .../income/deductions/in_other_deductions.py | 2 +- .../income/deductions/in_renters_deduction.py | 11 +- .../in_unemployment_compensation_deduction.py | 4 +- .../exemptions/in_additional_exemptions.py | 2 +- .../exemptions/in_aged_blind_exemptions.py | 2 +- .../exemptions/in_aged_low_agi_exemptions.py | 6 +- .../income/exemptions/in_base_exemptions.py | 2 +- .../in/tax/income/exemptions/in_exemptions.py | 2 +- .../in_is_qualifying_dependent_child.py | 2 +- .../exemptions/in_qualifying_child_count.py | 2 +- .../gov/states/in/tax/income/in_agi.py | 2 +- .../in/tax/income/{taxes => }/in_agi_tax.py | 7 +- .../gov/states/in/tax/income/in_income_tax.py | 14 + ...in_income_tax_before_refundable_credits.py | 13 + .../in/tax/income/taxes/in_other_taxes.py | 10 - .../gov/states/in/tax/use/in_use_tax.py | 11 + .../deductions/ks_itemized_deductions.py | 62 +- .../credits/dependent_care_service/ky_cdcc.py | 20 + .../ky_family_size_tax_credit.py | 20 + .../ky_family_size_tax_credit_rate.py | 28 + .../family_size_credit/ky_modified_agi.py | 25 + .../deductions/ky_standard_deduction.py | 13 + .../gov/states/ky/tax/income/ky_agi.py | 11 + ...ncome_tax_before_non_refundable_credits.py | 15 + ...ky_income_tax_before_refundable_credits.py | 8 +- .../tax/income/ky_non_refundable_credits.py | 12 + .../credits/ma_limited_income_tax_credit.py | 18 +- .../subtractions/md_two_income_subtraction.py | 8 +- .../md/tax/income/credits/cdcc/md_cdcc.py | 1 - .../md/tax/income/credits/ctc/md_ctc.py | 30 +- .../tax/income/credits/ctc/md_ctc_eligible.py | 17 + .../eitc/federal_eitc_without_age_minimum.py | 2 + .../senior_tax/md_senior_tax_credit.py | 41 + .../md_senior_tax_credit_eligible.py | 18 + .../md/tax/income/deductions/md_deductions.py | 64 +- .../deductions/md_standard_deduction.py | 1 - .../gov/states/me/tax/income/me_income_tax.py | 12 + ...me_income_tax_before_refundable_credits.py | 17 + .../tax/income/me_non_refundable_credits.py | 12 + .../me/tax/income/me_refundable_credits.py | 12 + .../me_deduction_phaseout_percentage.py} | 22 +- .../deductions/me_itemized_deductions.py | 12 - .../me_itemized_deductions_pre_phaseout.py | 39 + .../deductions/me_standard_deduction.py | 22 - .../income/taxable_income/me_deductions.py | 43 +- .../states/mi/tax/income/credits/mi_eitc.py | 15 + .../mi/tax/income/exemptions/mi_exemptions.py | 52 + .../property_tax/mo_property_tax_credit.py | 1 - .../property_tax/mo_ptc_gross_income.py | 3 +- ...nsion_and_ss_or_ssd_deduction_section_b.py | 88 +- ...nsion_and_ss_or_ssd_deduction_section_c.py | 66 +- .../mo_qualified_health_insurance_premiums.py | 43 +- .../mo_net_state_income_taxes.py | 38 +- .../taxable_income/mo_taxable_income.py | 105 +- ...ational_guard_or_reserve_pay_adjustment.py | 21 + .../ms_self_employment_adjustment.py | 21 + .../itemized/ms_itemized_deductions.py | 21 + .../ms/tax/income/deductions/ms_deductions.py | 19 + .../standard/ms_standard_deduction.py | 20 + .../income/exemptions/ms_aged_exemption.py | 33 + .../income/exemptions/ms_blind_exemption.py | 29 + .../income/exemptions/ms_total_exemptions.py | 18 + .../gov/states/ms/tax/income/ms_agi.py | 18 + .../ms/tax/income/ms_agi_adjustments.py | 16 + .../gov/states/ms/tax/income/ms_income_tax.py | 17 + .../income/ms_income_tax_before_credits.py | 15 + .../tax/income/ms_non_refundable_credits.py | 10 + .../ms/tax/income/ms_refundable_credits.py | 10 + .../states/ms/tax/income/ms_taxable_income.py | 20 + .../income/credits/mt_capital_gain_credit.py | 18 + .../standard/mt_standard_deduction.py | 23 + .../exemptions/mt_aged_exemption_count.py | 20 + .../mt_dependent_exemption_count.py | 23 + .../mt/tax/income/exemptions/mt_exemptions.py | 15 + .../income/exemptions/mt_exemptions_count.py | 17 + .../gov/states/mt/tax/income/mt_agi.py | 10 + .../gov/states/mt/tax/income/mt_eitc.py | 20 + .../states/nc/tax/income/credits/nc_ctc.py | 35 + .../income/deductions/nc_child_deduction.py | 37 + .../nc/tax/income/deductions/nc_deductions.py | 13 + .../deductions/nc_itemized_deductions.py | 40 + .../deductions/nc_standard_deduction.py | 15 + .../nc_standard_or_itemized_deductions.py | 25 + .../gov/states/nc/tax/income/nc_additions.py | 10 + .../gov/states/nc/tax/income/nc_income_tax.py | 4 +- .../income/nc_income_tax_before_credits.py | 4 +- .../tax/income/nc_non_refundable_credits.py | 2 + .../states/nc/tax/income/nc_taxable_income.py | 3 + .../ne/tax/income/ne_itemized_deductions.py | 59 +- .../states/ne/tax/income/ne_taxable_income.py | 51 +- .../nh/tax/credits/nh_education_tax_credit.py | 24 + .../income/exemptions/nh_base_exemption.py | 17 + .../income/exemptions/nh_blind_exemption.py | 22 + .../exemptions/nh_disabled_exemption.py | 29 + .../income/exemptions/nh_old_age_exemption.py | 27 + .../income/exemptions/nh_total_exemptions.py | 17 + ...nh_income_tax_before_refundable_credits.py | 4 +- .../states/nh/tax/income/nh_taxable_income.py | 9 +- .../income/adjusted_gross_income/nj_agi.py | 31 +- .../adjusted_gross_income/nj_agi_additions.py | 22 +- .../nj_agi_subtractions.py | 9 +- .../adjusted_gross_income/nj_total_income.py | 17 + .../nj/tax/income/credits/cdcc/nj_cdcc.py | 56 +- .../nj_child_tax_credit.py => nj_ctc.py} | 18 +- .../exclusions/nj_eligible_pension_income.py | 30 + .../nj_other_retirement_income_exclusion.py | 51 + .../nj_other_retirement_special_exclusion.py | 41 + .../nj_pension_retirement_exclusion.py | 22 + .../nj_retirement_exclusion_fraction.py | 36 + .../nj/tax/income/nj_refundable_credits.py | 2 +- .../nj_homeowners_property_tax.py | 15 - .../nj_potential_property_tax_deduction.py | 35 +- .../property_tax/nj_property_tax_credit.py | 12 +- .../nj_property_tax_credit_eligible.py | 32 +- .../property_tax/nj_property_tax_deduction.py | 11 +- .../nj_property_tax_deduction_eligible.py | 10 +- .../nj_taking_property_tax_deduction.py | 25 +- .../nm/tax/income/credits/cdcc/nm_cdcc.py | 26 + .../income/credits/cdcc/nm_cdcc_eligible.py | 50 + .../credits/cdcc/nm_cdcc_eligible_child.py | 17 + .../income/credits/cdcc/nm_cdcc_max_amount.py | 27 + .../nm/tax/income/credits/eitc/nm_eitc.py | 21 + .../eitc/nm_eitc_demographic_eligible.py | 23 + .../income/credits/eitc/nm_eitc_eligible.py | 28 + .../states/nm/tax/income/credits/nm_ctc.py | 28 + .../credits/nm_medical_expense_credit.py | 30 + .../nm_deduction_for_certain_dependents.py | 25 + ...duction_for_certain_dependents_eligible.py | 17 + .../nm/tax/income/deductions/nm_deductions.py | 27 + .../deductions/nm_itemized_deductions.py | 50 + .../nm_medical_care_expense_deduction.py | 50 + .../nm_net_capital_gains_deduction.py | 26 + .../exemptions/nm_blind_and_aged_exemption.py | 65 + .../nm/tax/income/exemptions/nm_exemptions.py | 18 + .../exemptions/nm_hundred_year_exemption.py | 28 + .../nm_low_and_middle_income_exemption.py | 32 + .../nm_medical_expense_exemption.py | 27 + .../nm_social_security_income_exemption.py | 23 + .../gov/states/nm/tax/income/nm_additions.py | 13 + .../gov/states/nm/tax/income/nm_income_tax.py | 13 + ...ncome_tax_before_non_refundable_credits.py | 32 + ...nm_income_tax_before_refundable_credits.py | 17 + .../nm/tax/income/nm_modified_gross_income.py | 13 + .../tax/income/nm_non_refundable_credits.py | 10 + .../nm_other_deductions_and_exemptions.py | 12 + .../nm/tax/income/nm_refundable_credits.py | 12 + .../states/nm/tax/income/nm_taxable_income.py | 27 + .../2021_rebate/nm_2021_income_rebate.py | 24 + .../nm_additional_2021_income_rebate.py | 20 + .../nm_supplemental_2021_income_rebate.py | 20 + .../nm_low_income_comprehensive_tax_rebate.py | 53 + ...ome_comprehensive_tax_rebate_exemptions.py | 59 + .../nm_property_tax_rebate.py | 28 + .../nm_property_tax_rebate_eligible.py | 23 + .../ny/tax/income/credits/ctc/ny_ctc.py | 4 - .../tax/income/credits/ny_household_credit.py | 1 - .../itemized/ny_itemized_deductions_max.py | 50 +- .../income/adjusted_gross_income/oh_agi.py | 66 +- .../tax/income/credits/oh_adoption_credit.py | 35 + .../states/oh/tax/income/credits/oh_cdcc.py | 25 + .../states/oh/tax/income/credits/oh_eitc.py | 20 + .../credits/oh_non_public_school_credits.py | 19 + .../credits/oh_senior_citizen_credit.py | 30 + .../oh_retirement_income_credit.py | 33 + .../oh_retirement_income_credit_eligible.py | 19 + .../tax/income/oh_non_refundable_credits.py | 18 + .../oh/tax/income/oh_refundable_credits.py | 16 + .../credits/ok_child_care_child_tax_credit.py | 7 +- .../states/ok/tax/income/credits/ok_eitc.py | 5 +- .../deductions/ok_itemized_deductions.py | 73 +- .../states/ok/tax/income/ok_taxable_income.py | 52 +- .../states/or/tax/income/credits/or_ctc.py | 33 + .../or_retirement_income_credit.py | 58 + .../or_retirement_income_credit_eligible.py | 22 + ...tirement_income_credit_household_income.py | 14 + .../deductions/or_itemized_deductions.py | 38 +- .../or_federal_pension_subtraction.py | 11 + .../or_federal_tax_liability_subtraction.py | 45 +- .../cash_assistance/pa_tanf_age_eligible.py | 22 + .../pa_tanf_countable_resources.py | 10 + .../eligibility/pa_tanf_resources_eligible.py | 15 + .../pregnancy_eligibility/age_eligibility.py | 22 + .../forgiveness/pa_tax_forgiveness_rate.py | 1 - .../ri/tax/income/credits/cdcc/ri_cdcc.py | 15 + .../ri/tax/income/credits/eitc/ri_eitc.py | 15 + .../property_tax/ri_property_tax_credit.py | 29 + .../ri_property_tax_credit_eligible.py | 24 + .../standard/ri_standard_deduction.py | 5 +- ...tandard_deduction_applicable_percentage.py | 27 + .../gov/states/ri/tax/income/ri_agi.py | 10 + .../ri_property_tax_household_income.py | 13 + .../sc/tax/income/credits/cdcc/sc_cdcc.py | 42 + .../sc/tax/income/credits/eitc/sc_eitc.py | 15 + .../two_wage_earner/sc_gross_earned_income.py | 12 + .../sc_two_wage_earner_credit.py | 32 + .../sc_net_capital_gain_deduction.py | 22 + ...litary_retirement_income_deduction_head.py | 10 + ...tary_retirement_income_deduction_spouse.py | 10 + .../sc_retirement_income_deduction_head.py | 10 + .../sc_retirement_income_deduction_spouse.py | 10 + .../income/exemptions/sc_senior_exemption.py | 59 + .../sc/tax/income/sc_state_tax_addback.py | 51 + .../gov/states/tax/income/state_income_tax.py | 2 +- .../vt_capital_gains_exclusion.py | 39 + .../vt_percentage_capital_gains_exclusion.py | 29 + .../vt_medical_expense_deduction.py | 37 + .../subtractions/vt_subtractions.py | 18 + .../income/adjusted_gross_income/vt_agi.py | 2 +- .../adjusted_gross_income/vt_agi_additions.py | 12 +- .../vt_agi_subtractions.py | 15 - .../deductions/vt_standard_deduction.py | 25 + .../exemptions/vt_personal_exemptions.py | 30 + .../gov/states/vt/tax/income/vt_eitc.py | 16 + .../gov/states/vt/tax/income/vt_income_tax.py | 12 + ...ncome_tax_before_non_refundable_credits.py | 32 + ...vt_income_tax_before_refundable_credits.py | 17 + .../tax/income/vt_non_refundable_credits.py | 10 + .../vt/tax/income/vt_refundable_credits.py | 12 + .../states/vt/tax/income/vt_taxable_income.py | 20 + .../wi_capital_gain_loss_addition.py | 19 + .../tax/income/additions/wi_capital_loss.py | 23 + .../income/additions/wi_income_additions.py | 17 + .../wi_childcare_expense_credit.py | 20 + .../earned_income/wi_earned_income_credit.py | 26 + .../credits/homestead/wi_homestead_credit.py | 27 + .../homestead/wi_homestead_eligible.py | 34 + .../credits/homestead/wi_homestead_income.py | 20 + .../homestead/wi_homestead_property_tax.py | 21 + .../wi_itemized_deduction_credit.py | 22 + .../wi_married_couple_credit.py | 32 + .../property_tax/wi_property_tax_credit.py | 24 + .../credits/wi_nonrefundable_credits.py | 18 + .../income/credits/wi_refundable_credits.py | 18 + .../wi_capital_gain_loss_subtraction.py | 32 + .../wi_childcare_expense_subtraction.py | 29 + .../subtractions/wi_income_subtractions.py | 17 + .../wi_retirement_income_subtraction.py | 28 + ...irement_income_subtraction_agi_eligible.py | 22 + ...i_unemployment_compensation_subtraction.py | 27 + .../gov/states/wi/tax/income/wi_agi.py | 18 + .../gov/states/wi/tax/income/wi_exemption.py | 32 + .../wi/tax/income/wi_income_before_credits.py | 38 + .../gov/states/wi/tax/income/wi_income_tax.py | 18 + ...wi_income_tax_before_refundable_credits.py | 22 + .../wi/tax/income/wi_standard_deduction.py | 40 + .../states/wi/tax/income/wi_taxable_income.py | 25 + .../wv/tax/income/credits/sctc/wv_sctc.py | 19 + .../income/credits/sctc/wv_sctc_eligible.py | 35 + .../credits/sctc/wv_taxable_property_value.py | 14 + .../wv_low_income_family_tax_credit.py | 46 + .../wv_low_income_family_tax_credit_fpg.py | 25 + .../wv_homestead_exemption.py | 21 + .../wv_low_income_earned_income_exclusion.py | 10 + .../wv_public_pension_subtraction.py | 28 + .../gov/states/wv/tax/income/wv_additions.py | 10 + .../gov/states/wv/tax/income/wv_agi.py | 13 + ...come_tax_before_non_refundable_credits.py} | 4 +- ...wv_income_tax_before_refundable_credits.py | 17 + .../tax/income/wv_non_refundable_credits.py | 12 + .../wv/tax/income/wv_refundable_credits.py | 12 + .../states/wv/tax/income/wv_subtractions.py | 10 + .../states/wv/tax/income/wv_taxable_income.py | 8 + .../usda/snap/eligibility/is_snap_eligible.py | 2 +- .../snap/eligibility/meets_snap_asset_test.py | 1 - .../meets_snap_gross_income_test.py | 2 +- .../eligibility/meets_snap_net_income_test.py | 2 +- .../snap_excess_shelter_expense_deduction.py | 8 +- .../shelter/snap_net_income_pre_shelter.py | 2 +- .../shelter/snap_utility_allowance.py | 2 +- .../shelter/snap_utility_allowance_type.py | 2 +- .../snap_child_support_deduction.py | 10 +- .../snap/income/deductions/snap_deductions.py | 2 +- .../snap_dependent_care_deduction.py | 2 +- .../snap_earned_income_deduction.py | 2 +- .../snap_excess_medical_expense_deduction.py | 6 +- .../deductions/snap_standard_deduction.py | 7 +- ...ap_child_support_gross_income_deduction.py | 21 + .../income/{ => gross}/snap_gross_income.py | 5 +- .../snap_gross_income_fpg_ratio.py | 4 +- .../usda/snap/income/snap_earned_income.py | 2 +- .../gov/usda/snap/income/snap_fpg.py | 26 + .../gov/usda/snap/income/snap_net_income.py | 2 +- .../snap/income/snap_net_income_fpg_ratio.py | 4 +- .../usda/snap/income/snap_unearned_income.py | 2 +- fiscalsim_us/variables/gov/usda/snap/snap.py | 2 +- .../gov/usda/snap/snap_emergency_allotment.py | 26 +- .../snap/snap_emergency_allotment_monthly.py | 31 - .../usda/snap/snap_expected_contribution.py | 2 +- .../gov/usda/snap/snap_max_allotment.py | 4 +- .../gov/usda/snap/snap_min_allotment.py | 11 +- .../gov/usda/snap/snap_normal_allotment.py | 2 +- fiscalsim_us/variables/household/cliff.py | 49 +- .../household/demographic/age/age.py | 2 +- .../demographic/geographic/county/county.py | 67 +- .../demographic/marital_unit/is_separated.py | 9 + .../demographic/marital_unit/is_widowed.py | 9 + .../demographic/tax_unit/filing_status.py | 15 +- .../tax_unit/is_tax_unit_head_or_spouse.py | 13 + .../tax_unit/tax_unit_household_id.py | 14 + .../tax_unit/tax_unit_stillborn_children.py | 8 + .../demographic/weights/tax_unit_weight.py | 3 + .../childcare/tax_unit_childcare_expenses.py | 18 +- .../education/non_public_school_tuition.py | 8 + .../expense/health/ambulance_expense.py | 9 + .../expense/health/er_visit_expense.py | 9 + .../expense/health/imaging_expense.py | 9 + .../expense/health/inpatient_expense.py | 9 + .../household/expense/health/lab_expense.py | 9 + .../expense/health/outpatient_expense.py | 9 + .../health/physician_services_expense.py | 9 + .../expense/health/prescription_expense.py | 9 + .../expense/health/urgent_care_expense.py | 9 + .../household/expense/person/capital_loss.py | 14 - .../expense/person/interest_expense.py | 3 +- .../expense/person/mortgage_interest.py | 9 + .../expense/person/non_mortgage_interest.py | 9 + .../household/equiv_household_net_income.py | 6 +- .../income/household/household_benefits.py | 1 + .../household_refundable_tax_credits.py | 100 +- .../household/household_state_income_tax.py | 78 + ...household_tax_before_refundable_credits.py | 123 +- .../person/capital_gains/capital_gains.py | 25 +- .../person/capital_gains/capital_losses.py | 13 + .../capital_gains/long_term_capital_gains.py | 4 +- .../capital_gains/long_term_capital_losses.py | 14 - .../capital_gains/short_term_capital_gains.py | 4 +- .../short_term_capital_losses.py | 14 - .../non_qualified_dividend_income.py | 2 +- .../dividends/qualified_dividend_income.py | 2 +- .../income/person/farm/farm_rent_income.py | 2 +- .../interest/tax_exempt_interest_income.py | 2 +- .../interest/taxable_interest_income.py | 2 +- .../person/pensions/pension_survivors.py | 9 + .../taxable_federal_pension_income.py | 9 + .../partnership_s_corp_income.py | 2 +- .../income/spm_unit/spm_unit_benefits.py | 1 + .../income/spm_unit/spm_unit_pell_grant.py | 11 + .../form_4972_lumpsum_distributions.py | 10 + .../variables/household/marginal_tax_rate.py | 46 +- 1772 files changed, 49413 insertions(+), 9009 deletions(-) delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/__init__.py delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/calibrated_cps.py delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/populations/by_state.yaml delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/populations/total.yaml delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/snap/budgetary_impact.yaml delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/snap/caseload.yaml delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/loss/__init__.py delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/loss/categories/populations.py delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/loss/loss.py delete mode 100644 fiscalsim_us/data/datasets/cps/calibrated_cps/output_cps.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/__init__.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/calibrate.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/calibrated_cps.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/enhanced_cps.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/process_puf.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/puf_extended_cps.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/app.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/calibrate.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/puf.ipynb create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/puf_imputation.py create mode 100644 fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/test.ipynb create mode 100644 fiscalsim_us/data/datasets/poverty_tracker/poverty_tracker.py create mode 100644 fiscalsim_us/parameters/calibration/gov/cbo/income_by_source.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/cbo/income_tax.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/cbo/payroll_taxes.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/cbo/snap.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/cbo/social_security.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/cbo/ssi.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/cbo/unemployment_compensation.yaml rename fiscalsim_us/{data/datasets/cps/calibrated_cps/calibration_parameters/programs => parameters/calibration/gov/hhs}/medicaid/budgetary_impact.yaml (94%) rename fiscalsim_us/{data/datasets/cps/calibrated_cps/calibration_parameters/programs => parameters/calibration/gov/hhs}/medicaid/enrollment.yaml (94%) create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/agi/number_of_returns.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/agi/total_agi.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/employment_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/farm_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/farm_rent_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/long_term_capital_gains.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/non_qualified_dividend_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/partnership_s_corp_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/qualified_dividend_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/rental_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/self_employment_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/social_security.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/tax_exempt_interest_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/tax_exempt_pension_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/taxable_interest_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/taxable_pension_income.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/irs/soi/unemployment_compensation.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/ssa/social_security/participation.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/ssa/ssi/participation.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/treasury/tax_expenditures/eitc.yaml create mode 100644 fiscalsim_us/parameters/calibration/gov/usda/snap/participation.yaml create mode 100644 fiscalsim_us/parameters/gov/bls/cpi/README.md create mode 100644 fiscalsim_us/parameters/gov/contrib/congress/delauro/README.md create mode 100644 fiscalsim_us/parameters/gov/contrib/congress/delauro/american_family_act/README.md create mode 100644 fiscalsim_us/parameters/gov/contrib/congress/delauro/american_family_act/baby_bonus.yaml create mode 100644 fiscalsim_us/parameters/gov/contrib/dc_kccatc/README.md create mode 100644 fiscalsim_us/parameters/gov/contrib/dc_kccatc/active.yaml create mode 100644 fiscalsim_us/parameters/gov/contrib/dc_kccatc/expenses/max.yaml create mode 100644 fiscalsim_us/parameters/gov/contrib/dc_kccatc/expenses/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/contrib/dc_kccatc/phase_out/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/contrib/dc_kccatc/phase_out/threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/contrib/dc_tax_threshold_joint_ratio.yaml create mode 100644 fiscalsim_us/parameters/gov/contrib/individual_eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/contrib/individual_eitc/agi_eitc_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/contrib/individual_eitc/enabled.yaml create mode 100644 fiscalsim_us/parameters/gov/dol/README.md create mode 100644 fiscalsim_us/parameters/gov/dol/minimum_wage.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/README.md rename fiscalsim_us/parameters/gov/{states/mo => ed}/index.yaml (77%) create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/README.md create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/amount/max.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/amount/min.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/README.md create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/automatic_zero.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/asset_assessment_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/income_assessment_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/ipa.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/asset_assessment_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/income_assessment_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/marginal_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/min_contribution.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/negative_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/simplified/benefits.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/efc/simplified/income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/ed/pell_grant/months_in_school_year.yaml create mode 100644 fiscalsim_us/parameters/gov/hhs/ccdf/index.yaml create mode 100644 fiscalsim_us/parameters/gov/hhs/medicaid/index.yaml create mode 100644 fiscalsim_us/parameters/gov/hud/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/al/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/credits/cdcc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/increment.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/deductions/standard.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/exemptions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ar/tax/income/rates/main.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/charitable_contribution/ceiling/qualifying_foster.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/charitable_contribution/ceiling/qualifying_organization.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/increment.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/percentage.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/amount/cap.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/amount/per_person.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/income_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/deductions/standard/increased/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/main/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/main/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/main/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/main/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/main/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/capital_gains/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/pension/public_pension_cap.yaml create mode 100644 fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/subtractions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ca/calepa/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ca/cpuc/index.yaml rename fiscalsim_us/parameters/gov/states/{ma/tax/income/credits/senior_circuit_breaker => ca/tax/income/credits/renter}/index.yaml (95%) create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/child.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/ambulance.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/er_visit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/imaging.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/inpatient.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/lab.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/outpatient.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/physician_services.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/prescription.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/urgent_care.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/expenses.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/hcpf/chp/out_of_pocket.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/ssa/README.md create mode 100644 fiscalsim_us/parameters/gov/states/co/ssa/oap/README.md create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/additions/additions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/agi_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/exemption.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/itemized_only.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/additions/qualified_business_income_deduction/agi_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/child_age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/federal_agi_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/ctc_matched_federal_credit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/eligible_child.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/age_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/income_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/increment.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/flat_amount_enabled.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/multiplier.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/scale.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/magi_sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/charitable_contribution/adjustment.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/collegeinvest_contribution/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/military_retirement/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/military_retirement/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/age_threshold/older.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/age_threshold/younger.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/cap/older.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/cap/younger.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/income_sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/social_security_subtraction_available.yaml create mode 100644 fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/subtractions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ct/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/increment.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/credits/eitc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/increment.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/rates/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/rates/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/rates/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/rates/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/rates/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/increment.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/increment.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/subtractions/subtractions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ct/tax/income/subtractions/tuition/cap.yaml rename fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/{unearned_deduction/monthly_child_support.yaml => deductions/child_support.yaml} (55%) rename fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/{earned_deduction => deductions/earned}/flat.yaml (83%) rename fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/{earned_deduction => deductions/earned}/percentage.yaml (71%) rename fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/{ => sources}/earned.yaml (95%) rename fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/{ => sources}/unearned.yaml (97%) create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/additions/self_employment_loss/threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/additions/sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/cdcc/match.yaml delete mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/max_age.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/fraction_elderly.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/fraction_nonelderly.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/max.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/min_elderly_age.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/rent_ratio.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/itemized/phase_out/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/itemized/phase_out/start.yaml delete mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/standard/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/joint_separately_option.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/rates.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/disabled_exclusion/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/disabled_exclusion/income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/README.md create mode 100644 fiscalsim_us/parameters/gov/states/de/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/credits/cdcc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/credits/personal_credits/aged.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/credits/personal_credits/personal.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/additional/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/additional/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/agi_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/earned_income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ga/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/additions/additions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/credits/cdcc/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/credits/low_income/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/credits/low_income/supplement_age_eligibility.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/amount/head.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/amount/spouse.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/blind/head.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/blind/spouse.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/exemptions/dependent.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/exemptions/personal.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/main/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/main/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/main/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/main/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/main/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ga/tax/income/subtractions/subtractions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/eitc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/support_proportion_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/aged_age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/eligibility/agi_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/eligibility/rent_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/hi/tax/income/subtractions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ia/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ia/tax/income/credits/child_care/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ia/tax/income/credits/earned_income/README.md create mode 100644 fiscalsim_us/parameters/gov/states/id/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/id/tax/income/credits/ctc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/id/tax/income/credits/ctc/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/id/tax/income/main/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/id/tax/income/main/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/id/tax/income/main/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/id/tax/income/main/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/id/tax/income/main/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml rename fiscalsim_us/parameters/gov/states/{ma/tax/income/deductions/rent => il}/index.yaml (95%) create mode 100644 fiscalsim_us/parameters/gov/states/il/tax/income/credits/k12/README.md create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/agi_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/max_age.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/maximum.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/min_age.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_in_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_out_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_out_start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/decoupled.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/investment_income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/match_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/max_children.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/amount/one_aged.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/amount/two_aged.yaml create mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/min_age.yaml delete mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/taxes/agi/README.md delete mode 100644 fiscalsim_us/parameters/gov/states/in/tax/income/taxes/agi/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ky/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ky/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ky/tax/income/credits/dependent_care_service/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ky/tax/income/credits/family_size/family_size_cap.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ky/tax/income/credits/family_size/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ky/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ky/tax/income/deductions/standard.yaml create mode 100644 fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_threshold/disabled.yaml rename fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/{age_limit.yaml => age_threshold/main.yaml} (68%) create mode 100644 fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/reduced_by_federal_credit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/age_eligibility.yaml create mode 100644 fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/income_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/README.md create mode 100644 fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/me/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/me/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/me/tax/income/deductions/itemized/cap.yaml delete mode 100644 fiscalsim_us/parameters/gov/states/me/tax/income/deductions/standard/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mi/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mi/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/mi/tax/income/credits/eitc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/dependent_on_other_return.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/disabled.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/disabled_veteran.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/personal.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mo/dss/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ms/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/adjustments.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/national_guard_or_reserve_pay/cap.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/self_employment/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/tax/income/deductions/standard/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/aged/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/aged/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/blind/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/tax/income/income_sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ms/tax/income/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mt/README.md create mode 100644 fiscalsim_us/parameters/gov/states/mt/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mt/tax/income/credits/capital_gain/percentage.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mt/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/mt/tax/income/credits/eitc/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/max.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/min.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mt/tax/income/exemptions/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/mt/tax/income/exemptions/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/deductions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/itemized/cap/mortgage_and_property_tax.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/standard/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ne/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ne/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nh/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nh/tax/credits/education/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/base.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/blind_addition.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/disabled_addition.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/old_age_addition.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/disability_age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/old_age_eligibility.yaml rename fiscalsim_us/parameters/gov/states/nh/tax/income/{main.yaml => rate.yaml} (64%) create mode 100644 fiscalsim_us/parameters/gov/states/nj/njdhs/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nj/njdhs/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/njdhs/tanf/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/all_exclusions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/amount.yaml rename fiscalsim_us/parameters/gov/states/nj/tax/income/credits/{nj_child_tax_credit => ctc}/ineligible_age.yaml (59%) create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/credits/eitc/README.md delete mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/credits/nj_child_tax_credit/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/other_retirement_income/earned_income_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/other_retirement_income/income_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/pension/agi_subtractions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/special_exclusion/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nj/tax/income/subtractions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/age_eligible.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/divisor.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/full_time_hours.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/income_limit_as_fraction_of_minimum_wage.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/max_amount/per_child.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/max_amount/total.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/ctc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/ctc/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/eligibility/age/min.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/age_eligibility.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/min_expenses.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/certain_dependents/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/net_capital_gains/capped_element.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/net_capital_gains/uncapped_element_percent.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/hundred_year/age_eligibility.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/reduction/income_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/reduction/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/social_security_income/income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/age_eligibility.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/min_expenses.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/main/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/main/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/main/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/main/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/main/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/modified_gross_income.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/other_deductions_and_exemptions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/additional/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/main/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/main/income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/supplemental/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/five_exemptions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/four_exemptions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/one_exemption.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/six_exemptions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/three_exemptions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/two_exemptions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/divisor.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/exemptions/aged.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/exemptions/blind.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/age_eligibility.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/income_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/max_property_tax_liability.yaml create mode 100644 fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/rent_rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ny/otda/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ny/otda/tanf/README.md create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/age_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/amount/max.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/amount/min.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/cdcc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/eitc/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/non_public_tuition.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/retirement_income/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/retirement_income/income_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/senior_citizen/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/oh/tax/income/credits/senior_citizen/agi_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ok/tax/income/credits/child/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ok/tax/income/credits/earned_income/README.md create mode 100644 fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/child_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/ineligible_age.yaml create mode 100644 fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/reduction/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/reduction/width.yaml create mode 100644 fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/age_eligibility.yaml create mode 100644 fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/base.yaml create mode 100644 fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/income_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/percentage.yaml create mode 100644 fiscalsim_us/parameters/gov/states/pa/dhs/README.md create mode 100644 fiscalsim_us/parameters/gov/states/pa/dhs/tanf/README.md create mode 100644 fiscalsim_us/parameters/gov/states/pa/dhs/tanf/cash_assistance/age_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/pa/dhs/tanf/pregnancy_eligibility/age_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/pa/dhs/tanf/resource_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ri/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/cdcc/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/eitc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/cap.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/multiple_people.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/one_person.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/rent.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/increment.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/percentage.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/ri/tax/income/income_sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/max_care_expense_year_offset.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/credits/eitc/README.md create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/credits/eitc/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/credits/two_wage_earner/earned_income.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/credits/two_wage_earner/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/deductions/net_capital_gain/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/age_threshold.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/spouse_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/tx/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/README.md create mode 100644 fiscalsim_us/parameters/gov/states/vt/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/flat/cap.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/income_share_cap.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/percentage/cap.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/percentage/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/agi/subtractions.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/credits/eitc/match.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/deductions/standard/additional.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/deductions/standard/base.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/exemption/personal.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/rates/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/rates/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/rates/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/rates/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/vt/tax/income/rates/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wa/dshs/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/README.md create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/additions/capital_loss/limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/additions/sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/childcare_expense/README.md create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/childcare_expense/fraction.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/README.md create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/fraction.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/investment_income_limit.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/earnings_sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/max_income.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/min_age.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/min_elderly_age.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/income/exemption.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/income/sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/phase_out/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/phase_out/start.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/property_tax/max.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/property_tax/rent_ratio.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/itemized_deduction/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/income_sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/max.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/max.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/rent_fraction.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/max.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/base.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/extra.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/old_age.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/rates/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/rates/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/rates/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/rates/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/capital_gain/fraction.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/childcare_expense/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/childcare_expense/max_dependents.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/max_agi.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/min_age.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/sources.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/unemployment_compensation/income_phase_out/base.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/unemployment_compensation/income_phase_out/rate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/README.md create mode 100644 fiscalsim_us/parameters/gov/states/wv/index.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/head_of_household.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/joint.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/separate.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/single.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/widow.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/fpg_percent.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/max_family_size.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/non_refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/refundable.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/sctc/fpg_percentage.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/credits/sctc/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/exemptions/homestead_exemption/max_amount.yaml create mode 100644 fiscalsim_us/parameters/gov/states/wv/tax/income/subtractions/public_pension/max_amount.yaml rename fiscalsim_us/parameters/gov/{states/in => usda/snap/income/deductions/excess_shelter_expense}/index.yaml (78%) create mode 100644 fiscalsim_us/parameters/simulation/cliff_delta.yaml delete mode 100644 fiscalsim_us/parameters/simulation/cliff_threshold.yaml create mode 100644 fiscalsim_us/parameters/simulation/de/branch_to_determine_if_refundable_eitc.yaml create mode 100644 fiscalsim_us/parameters/simulation/marginal_tax_rate_delta.yaml create mode 100644 fiscalsim_us/reforms/congress/delauro/__init__.py create mode 100644 fiscalsim_us/reforms/congress/delauro/american_family_act.py create mode 100644 fiscalsim_us/reforms/dc_kccatc.py create mode 100644 fiscalsim_us/reforms/dc_tax_threshold_joint_ratio.py create mode 100644 fiscalsim_us/reforms/reforms.py create mode 100644 fiscalsim_us/reforms/winship.py create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_allowances.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_contribution.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependents_in_college.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_assets.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_available_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_contribution.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_efc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_formula.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/irs/credits/cdcc/capped_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_demographic_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_investment_income_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income_person.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/irs/integration/capital_gains_losses.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/irs/tax/federal_income/capped_property_taxes.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/irs/tax/federal_income/itemized_deductions_less_salt.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/irs/tax/no_salt_income_tax.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/ssa/ss/never_eligible_for_social_security_benefits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/ar_income_tax_before_non_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/ar_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/credits/ar_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/credits/ar_inflationary_relief_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/deductions/ar_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/az_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_family_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_family_tax_credit_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_increased_excise_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_increased_excise_tax_credit_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/dependent_credit/az_dependent_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/itemized/az_itemized_deductions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_base_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_increased_standard_deduction_for_charitable_contributions.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/subtractions/az_public_pension_exclusion.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/subtractions/capital_gains/az_long_term_capital_gains_subtraction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp_out_of_pocket_maximum.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/federal_deduction/co_federal_deduction_addback.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/federal_deduction/co_federal_deduction_addback_required.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/state_addback/co_state_addback.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_income_tax_before_non_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_taxable_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/integration.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/co_ctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_child_individual_maximum.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_non_refundable_ctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_refundable_ctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/integration.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/collegeinvest_contribution/co_collegeinvest_contribution.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/military_retirement/co_military_retirement_subtraction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_higher_tax_recapture.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_lower_tax_recapture.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_phase_out_add_back.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/credits/ct_personal_credit_rate.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/credits/eitc/ct_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_taxable_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/exemptions/ct_personal_exemptions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/subtractions/tuition/ct_tuition_subtraction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/dhs/tanf/integration.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc_without_qualifying_children.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_deduction_indiv.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_deduction_joint.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_disabled_exclusion_subtraction.yaml rename fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/{credits/eitc => }/dc_eitc.yaml (95%) rename fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/{credits/eitc => }/dc_eitc_with_qualifying_child.yaml (95%) create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_without_qualifying_children.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_files_separately.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits_indiv.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits_joint.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_itemized_deductions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_kccatc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_ptc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_self_employment_loss_addition.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/deductions/standard/dc_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/cdcc/de_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc_if_claimed.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_refundable_eitc_if_claimed.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_claims_refundable_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_non_refundable_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_refundable_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/personal/de_aged_personal_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/personal/de_personal_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/de_income_tax_before_non_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/deductions/standard/de_additional_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/deductions/standard/de_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/subtractions/de_elderly_or_disabled_income_exclusion.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/subtractions/de_elderly_or_disabled_income_exclusion_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/credits/dependent_care_credit/ga_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/credits/ga_low_income_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/deductions/standard/ga_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/exemptions/ga_exemptions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/ga_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/ga_taxable_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_child_receiving_public_support.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_amount.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_count.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_lihrtc_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_low_income_household_renters_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_deductions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{exemptions => }/in_additional_exemptions.yaml (100%) rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{exemptions => }/in_aged_blind_exemptions.yaml (100%) rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{exemptions => }/in_aged_low_agi_exemptions.yaml (100%) rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{taxes => }/in_agi_tax.yaml (68%) rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{exemptions => }/in_base_exemptions.yaml (100%) create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc_eligible.yaml rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{exemptions => }/in_exemptions.yaml (100%) rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{deductions/in_homeowners_property.yaml => in_homeowners_property_tax_deduction.yaml} (83%) rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{exemptions => }/in_is_qualifying_dependent_child.yaml (100%) rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{deductions/in_military_service.yaml => in_military_service_deduction.yaml} (100%) rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{deductions => }/in_nonpublic_school_deduction.yaml (100%) create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_refundable_credits.yaml rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{deductions/in_renters.yaml => in_renters_deduction.yaml} (100%) rename fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/{deductions/in_unemployment_compensation.yaml => in_unemployment_compensation_deduction.yaml} (100%) create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_unified_elderly_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/dependent_care_credit/ky_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_family_size_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_family_size_tax_credit_rate.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_modified_agi.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/deductions/ky_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/ky_income_tax_before_non_refundable_credits.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/la/tax/income/la_agi_subtractions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/md_ctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit_eligible.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_deduction.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_non_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_deduction_phaseout_percentage.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_deductions.yaml rename fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/{ => taxable_income}/deductions/me_dependent_exemption.yaml (95%) create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions_pre_phaseout.yaml rename fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/{ => taxable_income}/deductions/me_personal_exemption.yaml (96%) create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/mi/tax/income/credits/mi_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/mi/tax/income/exemptions/mi_exemptions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/adjustments/ms_national_guard_or_reserve_pay_adjustment.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/adjustments/ms_self_employment_adjustment.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/deductions/ms_deductions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/deductions/standard/ms_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/exemptions/ms_aged_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/exemptions/ms_blind_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_income_tax.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_income_tax_before_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_taxable_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/credits/mt_capital_gain_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/deductions/standard/mt_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_aged_exemption_count.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_dependent_exemption_count.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_exemptions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/mt_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/credits/nc_ctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_itemized_deductions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_standard_or_itemized_deductions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/credits/nh_education_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_base_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_blind_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_disabled_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_old_age_exemption.yaml rename fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/credits/{nj_child_tax_credit/nj_child_tax_credit.yaml => nj_ctc.yaml} (96%) create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_other_retirement_income_exclusion.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_other_retirement_special_exclusion.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_pension_retirement_exclusion.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/nj_integration.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/taxable_income/nj_agi.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible_child.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_max_amount.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc_demographic_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/nm_ctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/nm_medical_expense_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_deductions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_itemized_deductions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_net_capital_gains_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_hundred_year_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_low_and_middle_income_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_medical_expense_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_social_security_income_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_taxable_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_2021_income_rebate.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_additional_2021_income_rebate.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_supplemental_2021_income_rebate.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/integration.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate_exemptions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/nm_property_tax_rebate.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/nm_property_tax_rebate_eligibility.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_adoption_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_non_public_school_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_senior_citizen_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_ctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/retirement_income/or_retirement_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/retirement_income/or_retirement_credit_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/pa/tanf/cash_assistance/pa_tanf_age_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/pa/tanf/pregnancy_eligibility/pa_tanf_pregnancy_eligibility.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/pa/tax/income/dhs/tanf/eligibility/pa_tanf_resources_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/cdcc/ri_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/eitc/ri_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction_applicable_percentage.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/eitc/sc_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/sc_cdcc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/two_wage_earner/sc_two_wage_earner_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/deductions/net_captial_gain/sc_net_capital_gain_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/exemptions/sc_senior_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/sc_state_tax_addback.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/subtractions/vt_medical_expense_deductions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/vt_capital_gains_exclusion.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/vt_percentage_capital_gains_exclusion.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/deductions/vt_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/exemptions/vt_personal_exemptions.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_eitc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_income_tax_before_non_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_taxable_income.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/vt/vt_agi.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_gain_loss_addition.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_gain_loss_subtration.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_loss.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_childcare_expense_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_childcare_expense_subtraction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_earned_income_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_property_tax.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_income_tax_before_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_itemized_deduction_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_married_couple_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_property_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_retirement_income_subtraction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_retirement_income_subtraction_agi_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_standard_deduction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_taxable_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_unemployment_compensation_subtraction.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/sctc/wv_sctc.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/sctc/wv_sctc_eligible.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit_fpg.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/exemptions/homestead_exemption/wv_homestead_exemption.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/subtractions/wv_public_pension_subtraction.yaml rename fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/{rates/wv_income_tax_before_credits.yaml => wv_income_tax_before_non_refundable_credits.yaml} (86%) create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/wv_income_tax_before_refundable_credits.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/wv_taxable_income.yaml rename fiscalsim_us/tests/policy/baseline/gov/usda/snap/income/{deductions/snap_child_support_deduction.yaml => gross/snap_child_support_gross_income_deduction.yaml} (65%) rename fiscalsim_us/tests/policy/baseline/gov/usda/snap/income/{ => gross}/snap_gross_income_fpg_ratio.yaml (50%) create mode 100644 fiscalsim_us/tests/policy/baseline/gov/usda/snap/income/snap_fpg.yaml delete mode 100644 fiscalsim_us/tests/policy/baseline/gov/usda/snap/income/snap_gross_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/household/cliff_evaluated.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/household/cliff_gap.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/household/demographic/tax_unit/is_tax_unit_head_or_spouse.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/household/household_state_income_tax.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/household/income/equiv_household_net_income.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/household/is_on_cliff.yaml create mode 100644 fiscalsim_us/tests/policy/baseline/household/marginal_tax_rate.yaml create mode 100644 fiscalsim_us/tests/policy/contrib/congress/american_family_act_with_baby_bonus.yaml create mode 100644 fiscalsim_us/tests/policy/contrib/dc_kccatc.yaml create mode 100644 fiscalsim_us/tests/policy/contrib/dc_single_joint_threshold_ratio.yaml create mode 100644 fiscalsim_us/tests/policy/reform/winship.yaml delete mode 100644 fiscalsim_us/tools/taxcalc/calcfunctions.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_allowances.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_available_income.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_contribution.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_other_allowances.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_allowances.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_assets.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_available_income.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_contribution.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_income.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_countable_assets.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_dependents_in_college.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_efc.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_formula.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/pell_grant_cost_of_attending_college.py create mode 100644 fiscalsim_us/variables/gov/ed/pell_grant/pell_grant_months_in_school.py create mode 100644 fiscalsim_us/variables/gov/irs/credits/cdcc/capped_cdcc.py delete mode 100644 fiscalsim_us/variables/gov/irs/credits/earned_income/eitc_eligible.py create mode 100644 fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_demographic_eligible.py create mode 100644 fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_eligible.py create mode 100644 fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_investment_income_eligible.py rename fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/{maximum_capital_loss.py => limited_capital_loss.py} (55%) rename fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/{loss.py => loss_ald.py} (58%) delete mode 100644 fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/tax_unit_capital_loss.py create mode 100644 fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income_person.py create mode 100644 fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/capped_property_taxes.py create mode 100644 fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemized_deductions_less_salt.py delete mode 100644 fiscalsim_us/variables/gov/irs/tax/federal_income/before_credits/regular_tax_before_credits.py delete mode 100644 fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_long_term_capital_gain.py delete mode 100644 fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_long_term_capital_loss.py delete mode 100644 fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_short_term_capital_gain.py delete mode 100644 fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_short_term_capital_loss.py delete mode 100644 fiscalsim_us/variables/gov/irs/tax/federal_income/no_salt_income_tax.py delete mode 100644 fiscalsim_us/variables/gov/irs/taxcalc/deductions/standard/aged_blind_extra_standard_deduction.py delete mode 100644 fiscalsim_us/variables/gov/irs/taxcalc/deductions/standard/standard.py create mode 100644 fiscalsim_us/variables/gov/ssa/ss/never_eligible_for_social_security_benefits.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/ar_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax_before_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/ar_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/ar_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/ar_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/credits/ar_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/credits/ar_inflationary_relief_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/ar/tax/income/deductions/standard/ar_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/az_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/az_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/az_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/credits/az_increased_excise_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/credits/az_increased_excise_tax_credit_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_credit.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_to_qualifying_charitable_organizations.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_to_qualifying_foster_care_organizations.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/credits/dependent_credit/az_dependent_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_agi.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/deductions/itemized/az_itemized_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_base_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_increased_standard_deduction_for_charitable_contributions.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/subtractions/az_public_pension_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/az/tax/income/subtractions/capital_gains/az_long_term_capital_gains_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp.py create mode 100644 fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp_out_of_pocket_maximum.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/additions/co_additions.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/additions/federal_deductions/co_federal_deduction_addback.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/additions/federal_deductions/co_federal_deduction_addback_required.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback_required.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax_before_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/co_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/co_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/co_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_child.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_children_count.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_child_individual_maximum.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_maximum.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_non_refundable_ctc.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_refundable_ctc.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_credit.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_modified_agi.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/exemptions/co_property_tax_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/co_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/collegeinvest_contribution/co_collegeinvest_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/military_retirement/co_military_retirement_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_income.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv_eligible..py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv.py create mode 100644 fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_higher_tax_recapture.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_lower_tax_recapture.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_phase_out_add_back.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_recapture.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/credits/ct_personal_credit_rate.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/credits/eitc/ct_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi_additions.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/ct_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/ct_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/ct_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/exemptions/ct_personal_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/subtractions/ct_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/ct/tax/income/subtractions/tuition/ct_tuition_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/additions/dc_income_additions.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/additions/dc_self_employment_loss_addition.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_kccatc.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_ptc.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/dc_agi.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/dc_files_separately.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits_indiv.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits_joint.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/dc_taxable_income_indiv.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/dc_taxable_income_joint.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_deduction_indiv.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_deduction_joint.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_itemized_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_standard_deduction.py delete mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/deductions/standard/dc_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/subtractions/dc_disabled_exclusion_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/dc/tax/income/subtractions/dc_income_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/additions/de_additions.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/cdcc/de_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc_if_claimed.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_refundable_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_refundable_eitc_if_claimed.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_claims_refundable_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_non_refundable_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_refundable_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/personal/de_aged_personal_credit.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/credits/personal/de_personal_credit.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/de_agi.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/de_income_tax_before_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/de_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/de_pre_exclusions_agi.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/deductions/itemized/de_itemized_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/deductions/standard/de_additional_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/deductions/standard/de_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/subtractions/de_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/subtractions/exclusions/de_elderly_or_disabled_income_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/de/tax/income/subtractions/exclusions/de_elderly_or_disabled_income_exclusion_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/ga/ga_additions.py create mode 100644 fiscalsim_us/variables/gov/states/ga/ga_agi.py create mode 100644 fiscalsim_us/variables/gov/states/ga/ga_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/credits/cdcc/ga_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/credits/ga_low_income_credit.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/deductions/ga_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/deductions/ga_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/exemptions/ga_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/ga_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/ga_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/ga_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/ga_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_investment_in_529_plan_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_military_retirement_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_retirement_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_child_receiving_public_support.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_amount.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_count.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_low_income_household_renters_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_tax_credit_for_low_income_household_renters_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/hi_additions.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/hi_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/hi/tax/income/subtractions/hi_military_pay_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/credits/id_ctc.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/deductions/id_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/id_additions.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/id_agi.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/id_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/id_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/id_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/id/tax/income/subtractions/id_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/in/tax/income/credits/elderly_tax_credit/in_unified_elderly_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/in/tax/income/credits/in_refundable_credits.py delete mode 100644 fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_homeowners_property_tax.py rename fiscalsim_us/variables/gov/states/in/tax/income/{taxes => }/in_agi_tax.py (64%) create mode 100644 fiscalsim_us/variables/gov/states/in/tax/income/in_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/in/tax/income/in_income_tax_before_refundable_credits.py delete mode 100644 fiscalsim_us/variables/gov/states/in/tax/income/taxes/in_other_taxes.py create mode 100644 fiscalsim_us/variables/gov/states/in/tax/use/in_use_tax.py create mode 100644 fiscalsim_us/variables/gov/states/ky/tax/income/credits/dependent_care_service/ky_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_family_size_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_family_size_tax_credit_rate.py create mode 100644 fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_modified_agi.py create mode 100644 fiscalsim_us/variables/gov/states/ky/tax/income/deductions/ky_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/ky/tax/income/ky_agi.py create mode 100644 fiscalsim_us/variables/gov/states/ky/tax/income/ky_income_tax_before_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ky/tax/income/ky_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/me/tax/income/me_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/me/tax/income/me_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/me/tax/income/me_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/me/tax/income/me_refundable_credits.py rename fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/{me_deduction.py => deductions/me_deduction_phaseout_percentage.py} (53%) delete mode 100644 fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions_pre_phaseout.py delete mode 100644 fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/mi/tax/income/credits/mi_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/mi/tax/income/exemptions/mi_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/adjustments/ms_national_guard_or_reserve_pay_adjustment.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/adjustments/ms_self_employment_adjustment.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/deductions/itemized/ms_itemized_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/deductions/ms_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/deductions/standard/ms_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_aged_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_blind_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_total_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/ms_agi.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/ms_agi_adjustments.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/ms_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/ms_income_tax_before_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/ms_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/ms_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/ms/tax/income/ms_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/mt/tax/income/credits/mt_capital_gain_credit.py create mode 100644 fiscalsim_us/variables/gov/states/mt/tax/income/deductions/standard/mt_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_aged_exemption_count.py create mode 100644 fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_dependent_exemption_count.py create mode 100644 fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_exemptions_count.py create mode 100644 fiscalsim_us/variables/gov/states/mt/tax/income/mt_agi.py create mode 100644 fiscalsim_us/variables/gov/states/mt/tax/income/mt_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/nc/tax/income/credits/nc_ctc.py create mode 100644 fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_itemized_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_standard_or_itemized_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/nc/tax/income/nc_additions.py create mode 100644 fiscalsim_us/variables/gov/states/nh/tax/credits/nh_education_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_base_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_blind_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_disabled_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_old_age_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_total_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_total_income.py rename fiscalsim_us/variables/gov/states/nj/tax/income/credits/{nj_child_tax_credit/nj_child_tax_credit.py => nj_ctc.py} (66%) create mode 100644 fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_eligible_pension_income.py create mode 100644 fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_other_retirement_income_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_other_retirement_special_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_pension_retirement_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_retirement_exclusion_fraction.py delete mode 100644 fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_homeowners_property_tax.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible_child.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_max_amount.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc_demographic_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/credits/nm_ctc.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/credits/nm_medical_expense_credit.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_itemized_deductions.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_net_capital_gains_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_hundred_year_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_low_and_middle_income_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_medical_expense_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_social_security_income_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/nm_additions.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/nm_modified_gross_income.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/nm_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/nm_other_deductions_and_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/nm_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/nm_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_2021_income_rebate.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_additional_2021_income_rebate.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_supplemental_2021_income_rebate.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/rebates/property_tax_rebate/nm_property_tax_rebate.py create mode 100644 fiscalsim_us/variables/gov/states/nm/tax/income/rebates/property_tax_rebate/nm_property_tax_rebate_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_adoption_credit.py create mode 100644 fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_non_public_school_credits.py create mode 100644 fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_senior_citizen_credit.py create mode 100644 fiscalsim_us/variables/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit.py create mode 100644 fiscalsim_us/variables/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/oh/tax/income/oh_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/oh/tax/income/oh_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/or/tax/income/credits/or_ctc.py create mode 100644 fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit.py create mode 100644 fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit_household_income.py create mode 100644 fiscalsim_us/variables/gov/states/or/tax/income/subtractions/or_federal_pension_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/pa/dhs/tanf/cash_assistance/pa_tanf_age_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pa_tanf_countable_resources.py create mode 100644 fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pa_tanf_resources_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pregnancy_eligibility/age_eligibility.py create mode 100644 fiscalsim_us/variables/gov/states/ri/tax/income/credits/cdcc/ri_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/ri/tax/income/credits/eitc/ri_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction_applicable_percentage.py create mode 100644 fiscalsim_us/variables/gov/states/ri/tax/income/ri_agi.py create mode 100644 fiscalsim_us/variables/gov/states/ri/tax/income/ri_property_tax_household_income.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/credits/cdcc/sc_cdcc.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/credits/eitc/sc_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/credits/two_wage_earner/sc_gross_earned_income.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/credits/two_wage_earner/sc_two_wage_earner_credit.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/deductions/net_capital_gain/sc_net_capital_gain_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_military_retirement_income_deduction_head.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_military_retirement_income_deduction_spouse.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_retirement_income_deduction_head.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_retirement_income_deduction_spouse.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_senior_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/sc/tax/income/sc_state_tax_addback.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_capital_gain_exclusion/vt_capital_gains_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_capital_gain_exclusion/vt_percentage_capital_gains_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_medical_expense_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_subtractions.py delete mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/deductions/vt_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/exemptions/vt_personal_exemptions.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/vt_eitc.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax_before_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/vt_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/vt_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/vt/tax/income/vt_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_capital_gain_loss_addition.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_capital_loss.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_income_additions.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/childcare_expense/wi_childcare_expense_credit.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/earned_income/wi_earned_income_credit.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_credit.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_income.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_property_tax.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/itemized_deduction/wi_itemized_deduction_credit.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/married_couple/wi_married_couple_credit.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/property_tax/wi_property_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/wi_nonrefundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/credits/wi_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_capital_gain_loss_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_childcare_expense_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_income_subtractions.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_retirement_income_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_retirement_income_subtraction_agi_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_unemployment_compensation_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/wi_agi.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/wi_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_before_credits.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_tax.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py create mode 100644 fiscalsim_us/variables/gov/states/wi/tax/income/wi_taxable_income.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_sctc.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_sctc_eligible.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_taxable_property_value.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit_fpg.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/exemptions/homestead_exemption/wv_homestead_exemption.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/subtractions/wv_low_income_earned_income_exclusion.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/subtractions/wv_public_pension_subtraction.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/wv_additions.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/wv_agi.py rename fiscalsim_us/variables/gov/states/wv/tax/income/{wv_income_tax_before_credits.py => wv_income_tax_before_non_refundable_credits.py} (89%) create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/wv_non_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/wv_refundable_credits.py create mode 100644 fiscalsim_us/variables/gov/states/wv/tax/income/wv_subtractions.py create mode 100644 fiscalsim_us/variables/gov/usda/snap/income/gross/snap_child_support_gross_income_deduction.py rename fiscalsim_us/variables/gov/usda/snap/income/{ => gross}/snap_gross_income.py (64%) rename fiscalsim_us/variables/gov/usda/snap/income/{ => gross}/snap_gross_income_fpg_ratio.py (84%) create mode 100644 fiscalsim_us/variables/gov/usda/snap/income/snap_fpg.py delete mode 100644 fiscalsim_us/variables/gov/usda/snap/snap_emergency_allotment_monthly.py create mode 100644 fiscalsim_us/variables/household/demographic/marital_unit/is_separated.py create mode 100644 fiscalsim_us/variables/household/demographic/marital_unit/is_widowed.py create mode 100644 fiscalsim_us/variables/household/demographic/tax_unit/is_tax_unit_head_or_spouse.py create mode 100644 fiscalsim_us/variables/household/demographic/tax_unit/tax_unit_household_id.py create mode 100644 fiscalsim_us/variables/household/demographic/tax_unit/tax_unit_stillborn_children.py create mode 100644 fiscalsim_us/variables/household/expense/education/non_public_school_tuition.py create mode 100644 fiscalsim_us/variables/household/expense/health/ambulance_expense.py create mode 100644 fiscalsim_us/variables/household/expense/health/er_visit_expense.py create mode 100644 fiscalsim_us/variables/household/expense/health/imaging_expense.py create mode 100644 fiscalsim_us/variables/household/expense/health/inpatient_expense.py create mode 100644 fiscalsim_us/variables/household/expense/health/lab_expense.py create mode 100644 fiscalsim_us/variables/household/expense/health/outpatient_expense.py create mode 100644 fiscalsim_us/variables/household/expense/health/physician_services_expense.py create mode 100644 fiscalsim_us/variables/household/expense/health/prescription_expense.py create mode 100644 fiscalsim_us/variables/household/expense/health/urgent_care_expense.py delete mode 100644 fiscalsim_us/variables/household/expense/person/capital_loss.py create mode 100644 fiscalsim_us/variables/household/expense/person/mortgage_interest.py create mode 100644 fiscalsim_us/variables/household/expense/person/non_mortgage_interest.py create mode 100644 fiscalsim_us/variables/household/income/household/household_state_income_tax.py create mode 100644 fiscalsim_us/variables/household/income/person/capital_gains/capital_losses.py delete mode 100644 fiscalsim_us/variables/household/income/person/capital_gains/long_term_capital_losses.py delete mode 100644 fiscalsim_us/variables/household/income/person/capital_gains/short_term_capital_losses.py create mode 100644 fiscalsim_us/variables/household/income/person/pensions/pension_survivors.py create mode 100644 fiscalsim_us/variables/household/income/person/pensions/taxable_federal_pension_income.py create mode 100644 fiscalsim_us/variables/household/income/spm_unit/spm_unit_pell_grant.py create mode 100644 fiscalsim_us/variables/household/income/tax_unit/form_4972_lumpsum_distributions.py diff --git a/.gitignore b/.gitignore index fc27a0d05..8f780a625 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,6 @@ docs/book/_build # GitHub Codespaces. venv/** oryx-build-commands.txt + +**/*.csv.gz +**/*.pkl \ No newline at end of file diff --git a/fiscalsim_us/data/datasets/__init__.py b/fiscalsim_us/data/datasets/__init__.py index 11658b6ad..159df0f0d 100644 --- a/fiscalsim_us/data/datasets/__init__.py +++ b/fiscalsim_us/data/datasets/__init__.py @@ -1,11 +1,25 @@ -from .cps import ( - CPS_2020, - CPS_2021, - CPS_2022, - CPS_2023, - RawCPS_2020, - RawCPS_2021, - CalibratedCPS_2023, -) - -DATASETS = [CPS_2020, CPS_2021, CPS_2022, CPS_2023, CalibratedCPS_2023] +from .cps import ( + CPS_2020, + CPS_2021, + CPS_2022, + CPS_2023, + RawCPS_2020, + RawCPS_2021, + RawCPS_2022, + EnhancedCPS_2023, + PUFExtendedCPS_2023, + CalibratedCPS_2023, +) + +from .poverty_tracker.poverty_tracker import PovertyTracker + +DATASETS = [ + CPS_2020, + CPS_2021, + CPS_2022, + CPS_2023, + EnhancedCPS_2023, + PUFExtendedCPS_2023, + CalibratedCPS_2023, + PovertyTracker, +] diff --git a/fiscalsim_us/data/datasets/cps/__init__.py b/fiscalsim_us/data/datasets/cps/__init__.py index 5738784ad..373baeb0c 100644 --- a/fiscalsim_us/data/datasets/cps/__init__.py +++ b/fiscalsim_us/data/datasets/cps/__init__.py @@ -1,10 +1,14 @@ -from .cps import ( - CPS_2020, - CPS_2021, - CPS_2022, - CPS_2023, -) - -from .raw_cps import RawCPS_2020, RawCPS_2021 - -from .calibrated_cps import CalibratedCPS_2023 +from .cps import ( + CPS_2020, + CPS_2021, + CPS_2022, + CPS_2023, +) + +from .raw_cps import RawCPS_2020, RawCPS_2021, RawCPS_2022 + +from .enhanced_cps import ( + EnhancedCPS_2023, + PUFExtendedCPS_2023, + CalibratedCPS_2023, +) diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/__init__.py b/fiscalsim_us/data/datasets/cps/calibrated_cps/__init__.py deleted file mode 100644 index 327f059a2..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .calibrated_cps import CalibratedCPS_2023 diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibrated_cps.py b/fiscalsim_us/data/datasets/cps/calibrated_cps/calibrated_cps.py deleted file mode 100644 index 64438d36b..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibrated_cps.py +++ /dev/null @@ -1,77 +0,0 @@ -from policyengine_core.data import Dataset -import numpy as np -from pathlib import Path -from typing import Type -import pandas as pd -from fiscalsim_us.data.storage import STORAGE_FOLDER -from ..cps import CPS_2023 - - -class CalibratedCPS(Dataset): - input_dataset: Type[Dataset] - input_dataset_year: int - epochs: int = 32 - learning_rate: float = 2e1 - log_dir: str = None - time_period: str = None - log_verbose: bool = False - - @staticmethod - def from_dataset( - dataset: Type[Dataset], - new_name: str = None, - new_label: str = None, - year: int = None, - out_year: int = 2023, - log_folder: str = None, - verbose: bool = True, - ): - class CalibratedCPSFromDataset(CalibratedCPS): - name = new_name - label = new_label - input_dataset = dataset - input_dataset_year = year or dataset.time_period - time_period = out_year - log_dir = log_folder - file_path = STORAGE_FOLDER / f"{new_name}.h5" - data_format = dataset.data_format - log_verbose = verbose - - return CalibratedCPSFromDataset - - def generate(self): - from .output_cps import OutputDataset - from survey_enhance.reweight import CalibratedWeights - from .loss import Loss, calibration_parameters - - input_dataset = OutputDataset.from_dataset(self.input_dataset)() - - original_weights = input_dataset.household.household_weight.values - - calibrated_weights = CalibratedWeights( - original_weights, - input_dataset, - Loss, - calibration_parameters, - ) - weights = calibrated_weights.calibrate( - "2022-01-01", - epochs=self.epochs, - learning_rate=self.learning_rate, - verbose=self.log_verbose, - log_dir=self.log_dir, - ) - - data = self.input_dataset().load_dataset() - - data["household_weight"] = weights - - self.save_dataset(data) - - -CalibratedCPS_2023 = CalibratedCPS.from_dataset( - CPS_2023, - new_name="calibrated_cps_2023", - new_label="Calibrated CPS 2023", - out_year=2023, -) diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/populations/by_state.yaml b/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/populations/by_state.yaml deleted file mode 100644 index 96bd19e75..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/populations/by_state.yaml +++ /dev/null @@ -1,108 +0,0 @@ -description: Total population by state. -metadata: - unit: person - reference: - - title: "State Population Totals and Components of Change: 2020-2021 | Census Bureau" - href: https://www.census.gov/data/tables/time-series/demo/popest/2020s-state-total.html -AK: - 2020-01-01: 3_959_353 -AL: - 2020-01-01: 1_961_504 -AR: - 2020-01-01: 1_455_271 -AZ: - 2020-01-01: 886_667 -CA: - 2020-01-01: 6_910_840 -CO: - 2020-01-01: 3_104_614 -CT: - 2020-01-01: 2_117_522 -DC: - 2020-01-01: 3_190_369 -DE: - 2020-01-01: 2_937_880 -FL: - 2020-01-01: 689_545 -GA: - 2020-01-01: 29_145_505 -HI: - 2020-01-01: 6_154_913 -IA: - 2020-01-01: 3_011_524 -ID: - 2020-01-01: 10_077_331 -IL: - 2020-01-01: 1_377_529 -IN: - 2020-01-01: 10_439_388 -KS: - 2020-01-01: 11_799_448 -KY: - 2020-01-01: 5_118_425 -LA: - 2020-01-01: 576_851 -MA: - 2020-01-01: 39_538_223 -MD: - 2020-01-01: 779_094 -ME: - 2020-01-01: 4_657_757 -MI: - 2020-01-01: 6_177_224 -MN: - 2020-01-01: 989_948 -MO: - 2020-01-01: 13_002_700 -MS: - 2020-01-01: 10_711_908 -MT: - 2020-01-01: 4_237_256 -NC: - 2020-01-01: 5_706_494 -ND: - 2020-01-01: 5_773_714 -NE: - 2020-01-01: 9_288_994 -NH: - 2020-01-01: 4_505_836 -NJ: - 2020-01-01: 7_705_281 -NM: - 2020-01-01: 1_362_359 -NV: - 2020-01-01: 643_077 -NY: - 2020-01-01: 1_839_106 -OH: - 2020-01-01: 6_785_528 -OK: - 2020-01-01: 1_084_225 -OR: - 2020-01-01: 20_201_249 -PA: - 2020-01-01: 3_605_944 -RI: - 2020-01-01: 21_538_187 -SC: - 2020-01-01: 8_631_393 -SD: - 2020-01-01: 7_029_917 -TN: - 2020-01-01: 12_812_508 -TX: - 2020-01-01: 2_961_279 -UT: - 2020-01-01: 7_151_502 -VA: - 2020-01-01: 3_271_616 -VT: - 2020-01-01: 5_893_718 -WA: - 2020-01-01: 5_024_279 -WI: - 2020-01-01: 1_793_716 -WV: - 2020-01-01: 1_097_379 -WY: - 2020-01-01: 733_391 diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/populations/total.yaml b/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/populations/total.yaml deleted file mode 100644 index f27896b19..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/populations/total.yaml +++ /dev/null @@ -1,26 +0,0 @@ -description: Total US population. -metadata: - unit: person - reference: - # Data underlying figures spreadsheet > Figure 2 tab. - # Published 2022-07-27. - - title: "The Demographic Outlook: 2022 to 2052" - href: https://www.cbo.gov/publication/57975 -values: # 1980 to 2052. - 2020-01-01: 333_672_000 - 2021-01-01: 334_149_000 - 2022-01-01: 334_507_000 - 2023-01-01: 335_270_000 - 2024-01-01: 336_307_000 - 2025-01-01: 337_559_000 - 2026-01-01: 338_916_000 - 2027-01-01: 340_291_000 - 2028-01-01: 341_734_000 - 2029-01-01: 343_199_000 - 2030-01-01: 344_685_000 - 2031-01-01: 346_172_000 - 2032-01-01: 347_653_000 - 2033-01-01: 349_105_000 - 2034-01-01: 350_523_000 - 2035-01-01: 351_909_000 - 2036-01-01: 353_263_000 diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/snap/budgetary_impact.yaml b/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/snap/budgetary_impact.yaml deleted file mode 100644 index 65563d3bc..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/snap/budgetary_impact.yaml +++ /dev/null @@ -1,12 +0,0 @@ -snap: - description: Total benefit outlays for the Supplemental Nutrition Assistance Program. - values: - 2018-01-01: 60_916_850_000 - 2019-01-01: 55_622_280_000 - 2020-01-01: 74_275_360_000 - 2021-01-01: 108_232_590_000 - metadata: - unit: currency-USD - reference: - - title: Supplemental Nutrition Assistance Program Participation and Costs - href: https://fns-prod.azureedge.net/sites/default/files/resource-files/SNAPsummary-2.pdf diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/snap/caseload.yaml b/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/snap/caseload.yaml deleted file mode 100644 index cac1d3a07..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/snap/caseload.yaml +++ /dev/null @@ -1,12 +0,0 @@ -snap: - description: Average participation in the Supplemental Nutrition Assistance Program. - values: - 2018-01-01: 40_776_000 - 2019-01-01: 35_702_000 - 2020-01-01: 39_879_000 - 2021-01-01: 41_500_000 - metadata: - unit: person - reference: - - title: Supplemental Nutrition Assistance Program Participation and Costs - href: https://fns-prod.azureedge.net/sites/default/files/resource-files/SNAPsummary-2.pdf diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/loss/__init__.py b/fiscalsim_us/data/datasets/cps/calibrated_cps/loss/__init__.py deleted file mode 100644 index 855eb4c9c..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/loss/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .loss import Loss, calibration_parameters diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/loss/categories/populations.py b/fiscalsim_us/data/datasets/cps/calibrated_cps/loss/categories/populations.py deleted file mode 100644 index 002bbe61f..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/loss/categories/populations.py +++ /dev/null @@ -1,35 +0,0 @@ -from survey_enhance.reweight import LossCategory -from policyengine_core.data import Dataset -import torch -from typing import List, Tuple -import numpy as np -import pandas as pd - - -def sum_by_household(values: pd.Series, dataset: Dataset) -> np.ndarray: - return ( - pd.Series(values) - .groupby(dataset.person.person_household_id.values) - .sum() - .values - ) - - -class Populations(LossCategory): - weight = 1 - static_dataset = False - - def get_comparisons( - self, dataset: Dataset - ) -> List[Tuple[str, float, torch.Tensor]]: - comparisons = [] - age = dataset.person.age - comparisons += [ - ( - f"people", - sum_by_household(np.ones_like(age), dataset), - 330_000_000, - ) - ] - - return comparisons diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/loss/loss.py b/fiscalsim_us/data/datasets/cps/calibrated_cps/loss/loss.py deleted file mode 100644 index 273fedc2b..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/loss/loss.py +++ /dev/null @@ -1,23 +0,0 @@ -from .categories.populations import Populations -from survey_enhance.reweight import LossCategory -from policyengine_core.parameters import ParameterNode, uprate_parameters -from pathlib import Path - - -class Demographics(LossCategory): - weight = 1 - subcategories = [Populations] - - -class Loss(LossCategory): - subcategories = [ - Demographics, - ] - - -calibration_parameters = ParameterNode( - directory_path=Path(__file__).parent.parent / "calibration_parameters", - name="calibration", -) - -calibration_parameters = uprate_parameters(calibration_parameters) diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/output_cps.py b/fiscalsim_us/data/datasets/cps/calibrated_cps/output_cps.py deleted file mode 100644 index b8e256877..000000000 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/output_cps.py +++ /dev/null @@ -1,91 +0,0 @@ -from policyengine_core.data import Dataset -from fiscalsim_us.data.storage import STORAGE_FOLDER -from typing import Type -import pandas as pd -from pathlib import Path - - -class OutputDataset(Dataset): - data_format = Dataset.TABLES - input_dataset: Type[Dataset] - input_dataset_year: int - output_year: int - time_period: int - - @staticmethod - def from_dataset( - dataset: Type[Dataset], - year: int = None, - out_year: int = 2022, - ): - class OutputDatasetFromDataset(OutputDataset): - name = f"{dataset.name}" - label = f"{dataset.label}" - input_dataset = dataset - time_period = year or dataset.time_period - output_year = out_year - file_path = STORAGE_FOLDER / f"output_{dataset.name}.h5" - - return OutputDatasetFromDataset - - def generate(self): - from fiscalsim_us import Microsimulation - - sim = Microsimulation( - dataset=self.input_dataset(), - ) - - sim.default_calculation_period = self.output_year - - PERSON_VARIABLES = [ - "age", - "person_household_id", - ] - - HOUSEHOLD_VARIABLES = [ - "household_id", - "household_weight", - ] - - PROGRAM_VARIABLES = [ - "income_tax", - ] - - variables = sim.tax_benefit_system.variables - - person = pd.DataFrame() - - for variable in PERSON_VARIABLES: - person[variable] = sim.calculate(variable, map_to="person").values - - household = pd.DataFrame() - - for variable in HOUSEHOLD_VARIABLES: - household[variable] = sim.calculate(variable).values - - for variable in PROGRAM_VARIABLES: - if variables[variable].entity.key != "household": - person[variable] = sim.calculate( - variable, map_to="person" - ).values - household[variable] = sim.calculate( - variable, map_to="household" - ).values - household[f"{variable}_participants"] = sim.map_result( - sim.calculate(variable).values > 0, - variables[variable].entity.key, - "household", - ) - else: - household[variable] = sim.calculate(variable).values - - person["person_household_id"] = sim.calculate( - "household_id", map_to="person" - ).values - - self.save_dataset( - dict( - person=person, - household=household, - ) - ) diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/__init__.py b/fiscalsim_us/data/datasets/cps/enhanced_cps/__init__.py new file mode 100644 index 000000000..9defadf52 --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/__init__.py @@ -0,0 +1,3 @@ +from .puf_extended_cps import PUFExtendedCPS_2023 +from .enhanced_cps import EnhancedCPS_2023 +from .calibrated_cps import CalibratedCPS_2023 diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/calibrate.py b/fiscalsim_us/data/datasets/cps/enhanced_cps/calibrate.py new file mode 100644 index 000000000..db5680336 --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/calibrate.py @@ -0,0 +1,304 @@ +import torch +import pandas as pd +import numpy as np +from fiscalsim_us import Microsimulation +import plotly.express as px +from tqdm import tqdm +from policyengine_core.data import Dataset +from fiscalsim_us.data import CPS_2023 +import numpy as np +from fiscalsim_us import Microsimulation +import pandas as pd +from .process_puf import ( + FINANCIAL_SUBSET as FINANCIAL_VARIABLES, + puf_imputed_cps_person_level, +) +from typing import Tuple + + +def generate_model_variables(dataset: str, time_period: str = "2023") -> Tuple: + """Generates variables needed for the calibration process. + + Args: + dataset (str): The name of the dataset to use. + time_period (str, optional): The time period to use. Defaults to "2023". + + Returns: + household_weights (torch.Tensor): The household weights. + weight_adjustment (torch.Tensor): The weight adjustment. + values_df (pd.DataFrame): A 2D array of values to transform household weights into statistical predictions. + targets (dict): A dictionary of names and target values for the statistical predictions. + targets_array (dict): A 1D array of target values for the statistical predictions. + equivalisation_factors_array (dict): A 1D array of equivalisation factors for the statistical predictions to normalise the targets. + """ + simulation = Microsimulation(dataset=dataset) + simulation.default_calculation_period = time_period + parameters = simulation.tax_benefit_system.parameters.calibration( + f"{time_period}-01-01" + ) + + household_weights = torch.tensor( + simulation.calculate("household_weight").values, dtype=torch.float32 + ) + weight_adjustment = torch.tensor( + np.random.random(household_weights.shape) * 10, + requires_grad=True, + dtype=torch.float32, + ) + + values_df = pd.DataFrame() + targets = {} + equivalisation = {} + + # We need to normalise the targets. Common regression targets are often 1e1 to 1e3 (this informs the scale of the learning rate). + COUNT_HOUSEHOLDS = household_weights.sum().item() + FINANCIAL_EQUIVALISATION = COUNT_HOUSEHOLDS + POPULATION_EQUIVALISATION = COUNT_HOUSEHOLDS / 1e5 + + for variable_name in FINANCIAL_VARIABLES: + if variable_name not in parameters.gov.irs.soi: + continue + label = ( + simulation.tax_benefit_system.variables[variable_name].label + + " aggregate" + ) + values_df[label] = simulation.calculate( + variable_name, map_to="household" + ).values + targets[label] = parameters.gov.irs.soi[variable_name] + equivalisation[label] = FINANCIAL_EQUIVALISATION + + # Program spending from CBO baseline projections + + PROGRAMS = [ + "income_tax", + "snap", + "social_security", + "ssi", + "unemployment_compensation", + ] + + for variable_name in PROGRAMS: + label = simulation.tax_benefit_system.variables[variable_name].label + values_df[label] = simulation.calculate( + variable_name, map_to="household" + ).values + targets[label] = parameters.gov.cbo[variable_name] + equivalisation[label] = FINANCIAL_EQUIVALISATION + + snap_participation = parameters.gov.usda.snap.participation + ssi_participation = parameters.gov.ssa.ssi.participation + ss_participation = parameters.gov.ssa.social_security.participation + + for program, participation in zip( + ["snap", "ssi", "social_security"], + [snap_participation, ssi_participation, ss_participation], + ): + label = simulation.tax_benefit_system.variables[program].label + entity_level = simulation.tax_benefit_system.variables[ + program + ].entity.key + entity_level_value = simulation.calculate(program) + values_df[f"{label} participants"] = simulation.map_result( + entity_level_value > 0, entity_level, "household" + ) + targets[f"{label} participants"] = participation + equivalisation[f"{label} participants"] = POPULATION_EQUIVALISATION + + # Number of tax returns by AGI size + + agi_returns_thresholds = ( + parameters.gov.irs.soi.agi.number_of_returns.thresholds + ) + agi_returns_values = parameters.gov.irs.soi.agi.number_of_returns.amounts + agi = simulation.calculate("adjusted_gross_income").values + is_filer = simulation.calculate("income_tax").values != 0 + for i in range(len(agi_returns_thresholds)): + lower = agi_returns_thresholds[i] + if i == len(agi_returns_thresholds) - 1: + upper = np.inf + else: + upper = agi_returns_thresholds[i + 1] + + in_range = (agi >= lower) * (agi < upper) * is_filer + household_returns_in_range = simulation.map_result( + in_range, "tax_unit", "household" + ) + + name = f"Tax returns with ${lower:,.0f} <= AGI < ${upper:,.0f}" + values_df[name] = household_returns_in_range + targets[name] = agi_returns_values[i] + equivalisation[name] = POPULATION_EQUIVALISATION + # Total AGI aggregate by AGI band + + agi_returns_thresholds = parameters.gov.irs.soi.agi.total_agi.thresholds + agi_returns_values = parameters.gov.irs.soi.agi.total_agi.amounts + for i in range(len(agi_returns_thresholds)): + lower = agi_returns_thresholds[i] + if i == len(agi_returns_thresholds) - 1: + upper = np.inf + else: + upper = agi_returns_thresholds[i + 1] + + in_range = (agi >= lower) * (agi < upper) * is_filer + agi_in_range = agi * in_range + household_agi_in_range = simulation.map_result( + agi_in_range, "tax_unit", "household" + ) + + name = f"Total AGI from tax returns with ${lower:,.0f} <= AGI < ${upper:,.0f}" + values_df[name] = household_agi_in_range + targets[name] = agi_returns_values[i] + equivalisation[name] = FINANCIAL_EQUIVALISATION + + # Total population + values_df["U.S. population"] = simulation.calculate( + "people", map_to="household" + ).values + targets["U.S. population"] = parameters.populations.total + equivalisation["U.S. population"] = POPULATION_EQUIVALISATION + + # Population by 10-year age group and sex + age = simulation.calculate("age").values + is_male = simulation.calculate("is_male") + for lower_age_group in range(0, 90, 10): + for possible_is_male in (True, False): + in_age_range = (age >= lower_age_group) & ( + age < lower_age_group + 5 + ) + in_sex_category = is_male == possible_is_male + count_people_in_range = simulation.map_result( + in_age_range * in_sex_category, "person", "household" + ) + sex_category = "male" if possible_is_male else "female" + name = f"{lower_age_group} to {lower_age_group + 5} and {sex_category} population" + values_df[name] = count_people_in_range + targets[name] = ( + household_weights.numpy() * count_people_in_range + ).sum() + equivalisation[name] = POPULATION_EQUIVALISATION + + # Household population by number of adults and children + + household_count_adults = simulation.map_result( + age >= 18, "person", "household" + ) + household_count_children = simulation.map_result( + age < 18, "person", "household" + ) + + for count_adults in range(1, 3): + for count_children in range(0, 4): + in_criteria = ( + (household_count_adults == count_adults) + * (household_count_children == count_children) + * 1.0 + ) + name = f"{count_adults}-adult, {count_children}-child household population" + values_df[name] = in_criteria + targets[name] = (household_weights.numpy() * in_criteria).sum() + equivalisation[name] = POPULATION_EQUIVALISATION + + # Tax filing unit counts by filing status + + filing_status = simulation.calculate("filing_status").values + + for filing_status_value in np.unique(filing_status): + is_filing_status = filing_status == filing_status_value + name = f"Filing status {filing_status_value.lower()} population" + household_filing_status_unit_counts = simulation.map_result( + is_filing_status, "tax_unit", "household" + ) + values_df[name] = household_filing_status_unit_counts + targets[name] = ( + household_weights.numpy() * household_filing_status_unit_counts + ).sum() + equivalisation[name] = POPULATION_EQUIVALISATION + + targets_array = torch.tensor(list(targets.values()), dtype=torch.float32) + equivalisation_factors_array = torch.tensor( + list(equivalisation.values()), dtype=torch.float32 + ) + + return ( + household_weights, + weight_adjustment, + values_df, + targets, + targets_array, + equivalisation_factors_array, + ) + + +def aggregate( + adjusted_weights: torch.Tensor, values: pd.DataFrame +) -> torch.Tensor: + broadcasted_weights = adjusted_weights.reshape(-1, 1) + weighted_values = torch.matmul( + broadcasted_weights.T, torch.tensor(values.values, dtype=torch.float32) + ) + return weighted_values + + +def calibrate( + dataset: str, + time_period: str = "2023", + training_log_path: str = "training_log.csv.gz", + learning_rate: float = 1e-1, + epochs: int = 250_000, +) -> np.ndarray: + ( + household_weights, + weight_adjustment, + values_df, + targets, + targets_array, + equivalisation_factors_array, + ) = generate_model_variables(dataset, time_period) + training_log_df = pd.DataFrame() + + progress_bar = tqdm(range(epochs), desc="Calibrating weights") + starting_loss = None + for i in progress_bar: + adjusted_weights = torch.relu(household_weights + weight_adjustment) + result = ( + aggregate(adjusted_weights, values_df) + / equivalisation_factors_array + ) + loss = torch.mean( + (result - targets_array / equivalisation_factors_array) ** 2 + ) + if i == 0: + starting_loss = loss.item() + loss.backward() + if i % 20 == 0: + current_loss = loss.item() + progress_bar.set_description_str( + f"Calibrating weights | Loss = {current_loss:,.0f}" + ) + current_aggregates = ( + (result * equivalisation_factors_array).detach().numpy()[0] + ) + training_log_df = pd.concat( + [ + training_log_df, + pd.DataFrame( + { + "name": list(targets.keys()) + ["total"], + "epoch": [i] * len(targets) + [i], + "value": list(current_aggregates) + [current_loss], + "target": list(targets.values()) + [0], + } + ), + ] + ) + weight_adjustment.data -= learning_rate * weight_adjustment.grad + weight_adjustment.grad.zero_() + + training_log_df.to_csv(training_log_path, compression="gzip") + + loss_reduction = loss.item() / starting_loss - 1 + + print(f"Loss reduction: {loss_reduction:.2%}") + + return adjusted_weights.detach().numpy() diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/calibrated_cps.py b/fiscalsim_us/data/datasets/cps/enhanced_cps/calibrated_cps.py new file mode 100644 index 000000000..74488a321 --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/calibrated_cps.py @@ -0,0 +1,30 @@ +from fiscalsim_us.data.storage import STORAGE_FOLDER +from policyengine_core.data import Dataset +from fiscalsim_us.data.datasets.cps.cps import CPS_2023 + + +class CalibratedCPS_2023(Dataset): + name = "calibrated_cps_2023" + label = "Calibrated CPS (2023)" + file_path = STORAGE_FOLDER / "calibrated_cps.h5" + data_format = Dataset.ARRAYS + time_period = "2023" + + def generate(self): + from .calibrate import calibrate + + new_data = {} + cps = CPS_2023() + cps_data = cps.load() + adjusted_weights = calibrate( + "cps_2023", + time_period="2023", + training_log_path="calibration_log_cps.csv.gz", + ) + for variable in cps.variables: + if variable == "household_weight": + new_data[variable] = adjusted_weights + elif "_weight" not in variable: + new_data[variable] = cps_data[variable][...] + + self.save_dataset(new_data) diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/enhanced_cps.py b/fiscalsim_us/data/datasets/cps/enhanced_cps/enhanced_cps.py new file mode 100644 index 000000000..b984eb420 --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/enhanced_cps.py @@ -0,0 +1,32 @@ +from fiscalsim_us.data.storage import STORAGE_FOLDER +from policyengine_core.data import Dataset + + +class EnhancedCPS_2023(Dataset): + name = "enhanced_cps_2023" + label = "Enhanced CPS (2023)" + file_path = STORAGE_FOLDER / "enhanced_cps.h5" + data_format = Dataset.ARRAYS + time_period = "2023" + url = ( + "release://policyengine/fiscalsim-us/enhanced-cps-2023/enhanced_cps.h5" + ) + + def generate(self): + from .puf_extended_cps import PUFExtendedCPS_2023 + from .calibrate import calibrate + + new_data = {} + cps = PUFExtendedCPS_2023() + cps_data = cps.load() + adjusted_weights = calibrate( + "puf_extended_cps_2023", + time_period="2023", + ) + for variable in cps.variables: + if variable == "household_weight": + new_data[variable] = adjusted_weights + elif "_weight" not in variable: + new_data[variable] = cps_data[variable][...] + + self.save_dataset(new_data) diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/process_puf.py b/fiscalsim_us/data/datasets/cps/enhanced_cps/process_puf.py new file mode 100644 index 000000000..12950adeb --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/process_puf.py @@ -0,0 +1,617 @@ +import pandas as pd +from microdf import MicroDataFrame +from survey_enhance import Imputation +from typing import Tuple +from fiscalsim_us.system import system +from fiscalsim_us import Microsimulation +import numpy as np + +PUF_FILE_PATH = "~/Downloads/puf_2015.csv" +PUF_DEMOGRAPHICS_FILE_PATH = "~/Downloads/demographics_2015.csv" + +codebook = { + "E00200": "employment_income", + "E00300": "interest_received", + "E00400": "tax_exempt_interest_income", + "E00600": "dividends_included_in_agi", + "E00650": "qualified_dividend_income", + "E00700": "state_income_tax_refunds", + "E00800": "alimony_received", + "E00900": "self_employment_income", + "E01000": "net_capital_gain_loss", + "E01100": "capital_gain_distributions", + "E01200": "other_gains_loss", + "E01400": "taxable_ira_distribution", + "E01500": "total_pensions_annuities_received", + "E01700": "taxable_pension_income", + "E02000": "schedule_e_net_income_loss", + "E02100": "schedule_f_net_profit_loss", + "E02300": "unemployment_compensation_in_agi", + "E02400": "social_security", + "E02500": "social_security_benefits_in_agi", + "E03150": "total_deductible_ira_payments", + "E03210": "student_loan_interest_deduction", + "E03220": "educator_expenses", + "E03230": "tuition_fees_deduction", + "E03260": "self_employment_tax_deduction", + "E03270": "self_employed_health_insurance_deduction", + "E03240": "domestic_production_activities_deduction", + "E03290": "health_savings_account_deduction", + "E03300": "payments_to_keogh_accounts", + "E03400": "forfeited_interest_penalty", + "E03500": "alimony_paid", + "E00100": "adjusted_gross_income", + "P04470": "total_deductions_standard_itemized", + "E04600": "exemption_amount", + "E04800": "taxable_income", + "E05100": "tax_on_taxable_income", + "E05200": "computed_regular_tax", + "E05800": "income_tax_before_credits", + "E06000": "income_subject_to_tax", + "E06200": "marginal_tax_base", + "E06300": "tax_generated_tax_rate_tables", + "E09600": "alternative_minimum_tax", + "E07180": "child_dependent_care_credit", + "E07200": "elderly_disabled_credit", + "E07220": "child_tax_credit", + "E07230": "education_credits", + "E07240": "retirement_savings_credit", + "E07260": "residential_energy_credit", + "E07300": "foreign_tax_credit", + "E07400": "general_business_credit", + "E07600": "credit_prior_year_minimum_tax", + "P08000": "other_tax_credits", + "E07150": "total_tax_credit_soi", + "E06500": "total_income_tax", + "E08800": "income_tax_after_credits_soi", + "E09400": "self_employment_tax", + "E09700": "recapture_taxes", + "E09730": "total_additional_medicare_tax", + "E09740": "net_investment_income_tax", + "E09750": "health_care_individual_responsibility_payment", + "E09800": "social_security_tax_tip_income", + "E09900": "penalty_tax_ira", + "E10300": "total_tax_liability_soi", + "E10700": "income_tax_withheld", + "E10900": "estimated_tax_payments", + "E10960": "refundable_american_opportunity_credit", + "E59560": "earned_income_eic", + "E59680": "eic_offset_income_tax_before_credits", + "E59700": "eic_offset_other_taxes_except_advance_eic", + "E59720": "eic_refundable_portion", + "E11550": "refundable_prior_year_minimum_tax_credit", + "E11560": "net_premium_tax_credit", + "E11561": "net_premium_tax_credit_offset_income_tax_before_credits", + "E11562": "net_premium_tax_credit_offset_other_taxes", + "E11563": "net_premium_tax_credit_refundable_portion", + "E11070": "additional_child_tax_credit", + "E11100": "amount_paid_form_4868_request_extension", + "E11200": "excess_fica_rrta", + "E11300": "credit_federal_tax_special_fuels_oils", + "E11400": "regulated_investment_company_credit", + "E11601": "total_refundable_credits_offset_income_tax_before_credits", + "E11602": "total_refundable_credits_offset_other_taxes", + "E11603": "total_refundable_credits_refundable_parts", + "E10605": "total_tax_payments_soi", + "E11900": "balance_due_overpayment", + "E12000": "credit_elect", + "E12200": "predetermined_estimated_tax_penalty", + "E17500": "medical_dental_expenses_reduction_agi_limit", + "E18400": "state_local_taxes", + "E18500": "real_estate_tax_deductions", + "E19200": "total_interest_paid_deduction", + "E19550": "qualified_mortgage_insurance_premiums", + "E19800": "cash_contributions", + "E20100": "other_than_cash_contributions", + "E19700": "contributions_deduction_total", + "E20550": "unreimbursed_employee_business_expense", + "E20600": "tax_preparation_fee", + "E20400": "miscellaneous_deductions_agi_limitation_total", + "E20800": "net_limited_miscellaneous_deductions", + "E20500": "net_casualty_theft_loss", + "E21040": "itemized_deduction_limitation", + "P22250": "short_term_capital_gains", + "E22320": "long_term_capital_gains_1", + "E22370": "schedule_d_capital_gain_distributions", + "P23250": "long_term_capital_gains", + "E24515": "unrecaptured_section_1250_gain", + "E24516": "capital_gain_less_investment_expense", + "E24518": "28_percent_rate_gain_loss", + "E24560": "non_schedule_d_tax", + "E24598": "schedule_d_15_percent_tax_amount", + "E24615": "schedule_d_25_percent_tax_amount", + "E24570": "schedule_d_28_percent_tax_amount", + "P25350": "rental_income", + "P25380": "rent_royalty_interest_expenses", + "E25550": "total_depreciation_depletion_all_property", + "P25700": "rent_royalty_net_income_loss", + "E25820": "deductible_rental_loss", + "E25850": "rent_royalty_net_income", + "E25860": "rent_royalty_net_loss", + "E25940": "total_passive_income_partnerships", + "E25980": "total_non_passive_income_partnerships", + "E25920": "total_passive_loss_partnerships", + "E25960": "total_non_passive_loss_partnerships", + "E26110": "partnership_section_179_expense_deduction", + "E26170": "total_passive_income_small_business_corp", + "E26190": "total_non_passive_income_small_business_corp", + "E26160": "total_passive_loss_small_business_corp", + "E26180": "total_non_passive_loss_small_business_corp", + "E26270": "partnership_s_corp_income", + "E26100": "s_corp_section_179_expense_deduction", + "E26390": "total_income_estate_trust", + "E26400": "total_loss_estate_trust", + "E27200": "farm_rent_income", + "E30400": "self_employment_income_ss_tax_primary", + "E30500": "self_employment_income_ss_tax_secondary", + "E32800": "qualifying_individuals_expenses_form_2441", + "E33000": "expenses_limited_to_earned_income_form_2441", + "E53240": "work_opportunity_jobs_general_business_credit", + "E53280": "research_experimentation_general_business_credit", + "E53300": "low_income_housing_credit", + "E53317": "employer_credit_social_security_tax_tips", + "E58950": "total_investment_interest_expense_form_4952", + "E58990": "investment_income_elected_amount_form_4952", + "P60100": "net_operating_loss_tax_preference_adjustments_form_6251", + "P61850": "total_adjustments_preferences_form_6251", + "E60000": "taxable_income_amt_form_6251", + "E62100": "alternative_minimum_taxable_income", + "E62900": "alternative_tax_foreign_tax_credit", + "E62720": "alternative_minimum_schedule_d_less_investment_interest", + "E62730": "alternative_minimum_schedule_d_unrecaptured_section_1250_gain", + "E62740": "alternative_minimum_capital_gain_amount", + "P65300": "total_passive_net_income_form_8582", + "P65400": "total_passive_losses_form_8582", + "E68000": "total_losses_allowed_passive_activities", + "E82200": "carry_forward_minimum_tax_credit_form_8801", + "T27800": "farm_income", + "S27860": "tentative_current_prior_year_tax_schedule_j", + "P27895": "actual_prior_year_tax_schedule_j", + "P87482": "american_opportunity_qualified_expenses_form_8863", + "E87521": "american_opportunity_credit", + "E87530": "lifetime_learning_total_qualified_expenses", + "E87550": "lifetime_learning_credit", + "P86421": "bond_purchase_amount_form_8888", + "E85050": "total_rental_real_estate_royalties_partnerships_s_corps_trusts", + "E85090": "total_net_gain_loss_disposition_property", + "E85120": "total_investment_income", + "E85180": "total_deductions_modifications", + "E85570": "dependents_modified_adjusted_gross_income_amount_form_8962", + "E85595": "annual_contribution_health_care_amount", + "E85600": "monthly_contribution_health_care_amount", + "E85770": "total_premium_tax_credit_amount", + "E85775": "advance_premium_tax_credit_amount", + "E85785": "excess_advance_payment_premium_tax_credit", + "E85790": "repayment_limitation_amount", + "RECID": "return_id", + "S006": "decimal_weight", + "S008": "sample_count", + "S009": "population_count", + "WSAMP": "sample_code", + "TXRT": "marginal_tax_rate", +} + +codebook.update( + { + "AGIR1": "adjusted_gross_income_band", + "CLAIM8965": "health_coverage_exemptions", + "DSI": "dependent_status_indicator", + "EFI": "electronic_filing_indicator", + "EIC": "earned_income_credit_code", + "ELECT": "presidential_election_campaign_fund_boxes", + "FDED": "form_of_deduction_code", + "FLPDYR": "filing_accounting_period_year", + "FLPDMO": "filing_accounting_period_month", + "F2441": "form_2441_child_care_credit_qualified_individual", + "F3800": "form_3800_general_business_credit", + "F6251": "form_6251_alternative_minimum_tax", + "F8582": "form_8582_passive_activity_loss_limitation", + "F8606": "form_8606_nondeductible_ira_contributions", + "F8829": "form_8829_expenses_home_business_use", + "F8867": "form_8867_paid_preparer_earned_income_credit_checklist", + "F8949": "form_8949_sales_dispositions_capital_assets", + "F8959": "form_8959_additional_medicare_tax", + "F8960": "form_8960_net_investment_income_tax", + "F8962": "form_8962_premium_tax_credit", + "F8965": "form_8965_health_coverage_exemptions", + "IE": "itemized_deductions_election_indicator", + "MARS": "marital_filing_status", + "MIDR": "married_filing_separately_itemized_deductions_requirement_indicator", + "N24": "number_children_child_tax_credit", + "N25": "number_qualified_students_lifetime_learning_credit", + "N30": "number_qualified_students_american_opportunity_credit", + "PREP": "tax_preparer", + "PREMNTHS": "months_enrolled_health_insurance_marketplace", + "SCHB": "schedule_b_indicator", + "SCHCF": "schedule_c_or_f_indicator", + "SCHE": "schedule_e_indicator", + "TFORM": "form_of_return", + "TXST": "tax_status", + "XFPT": "primary_taxpayer_exemption", + "XFST": "secondary_taxpayer_exemption", + "XOCAH": "exemptions_children_living_at_home", + "XOCAWH": "exemptions_children_living_away_from_home", + "XOODEP": "exemptions_other_dependents", + "XOPAR": "exemptions_parents_living_at_away_from_home", + "XTOT": "total_exemptions", + "XTOT8962": "number_exemptions_form_8962", + "XTOT8965": "number_exemptions_form_8965", + } +) + +codebook.update( + { + "AGEDP1": "age_dependent_1", + "AGEDP2": "age_dependent_2", + "AGEDP3": "age_dependent_3", + "AGERANGE": "age_range_primary_filer", + "EARNSPLIT": "earnings_split_joint_returns", + "GENDER": "gender_primary_filer", + "RECID": "return_id", + } +) + +CPS_DATASET = "cps_2023" + + +DEMOGRAPHIC_VARIABLES = [ + "age_dependent_1", + "age_dependent_2", + "age_dependent_3", + "age_range_primary_filer", + "earnings_split_joint_returns", + "gender_primary_filer", +] + +FINANCIAL_VARIABLES = [ + column + for column in codebook.values() + if column + not in DEMOGRAPHIC_VARIABLES + + [ + "return_id", + "decimal_weight", + "sample_count", + "population_count", + "sample_code", + ] +] + +FINANCIAL_SUBSET = [ + "employment_income", + "self_employment_income", + "partnership_s_corp_income", + "farm_income", + "farm_rent_income", + "short_term_capital_gains", + "long_term_capital_gains", + "taxable_interest_income", + "tax_exempt_interest_income", + "rental_income", + "qualified_dividend_income", + "non_qualified_dividend_income", + "taxable_pension_income", + "social_security", +] + + +def load_puf() -> Tuple[pd.DataFrame, pd.DataFrame]: + """Load the PUF and demographics data. + + Returns: + puf (pd.DataFrame): The PUF data. + puf_with_demographics (pd.DataFrame): The subset of the PUF data that has demographic information. + """ + puf = pd.read_csv("~/Downloads/puf_2015.csv") + demographics = pd.read_csv("~/Downloads/demographics_2015.csv") + + puf = puf.dropna() + demographics = demographics.dropna() + + puf.S006 = puf.S006 / 100 + + puf["taxable_interest_income"] = ( + puf.E00300 - puf.E00400 + ) # Taxable interest income = interest received - tax-exempt interest income + puf["non_qualified_dividend_income"] = ( + puf.E00600 - puf.E00650 + ) # Non-qualified dividend income = dividends included in AGI - qualified dividend income + + puf = puf.rename(columns=codebook) + demographics = demographics.rename(columns=codebook) + return puf, demographics + + +def impute_missing_demographics( + puf: pd.DataFrame, + demographics: pd.DataFrame, +) -> pd.DataFrame: + """Impute missing demographic information from the PUF. + + Args: + puf (pd.DataFrame): The PUF data. + puf_with_demographics (pd.DataFrame): The subset of the PUF data that has demographic information. + + Returns: + puf_with_imputed_demographics (pd.DataFrame): The PUF data with imputed demographic information. + """ + + demographics_from_puf = Imputation() + puf_with_demographics = puf[ + puf.return_id.isin(demographics.return_id) + ].merge(demographics, on="return_id") + + soi = system.parameters.calibration.gov.irs.soi + + # Uprate the financial subset + + for variable_name in FINANCIAL_SUBSET: + value_in_2015 = soi.children[variable_name]("2015-01-01") + value_in_2023 = soi.children[variable_name]("2023-01-01") + uprating_factor = value_in_2023 / value_in_2015 + puf_with_demographics[variable_name] = ( + puf_with_demographics[variable_name] * uprating_factor + ) + + demographics_from_puf.train( + puf_with_demographics[FINANCIAL_VARIABLES], + puf_with_demographics[DEMOGRAPHIC_VARIABLES], + ) + + puf_without_demographics = puf[ + ~puf.return_id.isin(puf_with_demographics.return_id) + ].reset_index() + puf_without_demographics.marital_filing_status = ( + puf_without_demographics.marital_filing_status.replace( + { + 0: 1, + } + ) + ) # Aggregated returns -> single + predicted_demographics = demographics_from_puf.predict( + puf_without_demographics[FINANCIAL_VARIABLES] + ) + puf_with_imputed_demographics = pd.concat( + [puf_without_demographics, predicted_demographics], axis=1 + ) + + weighted_puf_with_demographics = MicroDataFrame( + puf_with_demographics, weights="decimal_weight" + ) + weighted_puf_with_imputed_demographics = MicroDataFrame( + puf_with_imputed_demographics, weights="decimal_weight" + ) + + puf_combined = pd.concat( + [ + weighted_puf_with_demographics, + weighted_puf_with_imputed_demographics, + ] + ) + puf_combined = MicroDataFrame(puf_combined, weights="decimal_weight") + + return puf_combined + + +def generate_puf_style_cps() -> pd.DataFrame: + """Generate a PUF-style table from the CPS. + + Returns: + cps (pd.DataFrame): The CPS data. + """ + + sim = Microsimulation(dataset=CPS_DATASET) + + cps_demographics = pd.DataFrame(index=sim.calculate("tax_unit_id").values) + + df = sim.calculate_dataframe( + ["age", "tax_unit_id", "is_tax_unit_dependent"] + ) + df = df[df.is_tax_unit_dependent] + df_sorted = df.sort_values(["tax_unit_id", "age"]) + df_sorted["rank"] = df_sorted.groupby("tax_unit_id")["age"].rank() + + df_sorted["age_dependent_1"] = np.where( + df_sorted["rank"] == 1, df_sorted["age"], -1 + ) + df_sorted["age_dependent_2"] = np.where( + df_sorted["rank"] == 2, df_sorted["age"], -1 + ) + df_sorted["age_dependent_3"] = np.where( + df_sorted["rank"] == 3, df_sorted["age"], -1 + ) + + df_sorted_maxed = df_sorted.groupby("tax_unit_id").max() + + cps_demographics["age_dependent_1"] = df_sorted_maxed["age_dependent_1"] + cps_demographics["age_dependent_2"] = df_sorted_maxed["age_dependent_2"] + cps_demographics["age_dependent_3"] = df_sorted_maxed["age_dependent_3"] + + cps_demographics = cps_demographics.fillna(-1) + + # Define the age bins and labels + bins = [-np.inf, -1, 4, 12, 16, 18, 23, np.inf] + labels = [0, 1, 2, 3, 4, 5, 6] + + # Create AGEDP1, AGEDP2, AGEDP3 based on the categories + for col in ["age_dependent_1", "age_dependent_2", "age_dependent_3"]: + cps_demographics[col] = pd.cut( + cps_demographics[col], bins=bins, labels=labels, right=True + ) + + cps_demographics.reset_index(inplace=True) + cps_demographics = cps_demographics[ + ["age_dependent_1", "age_dependent_2", "age_dependent_3"] + ] + + cps_demographics["age_range_primary_filer"] = sim.calculate( + "age_head" + ).values + + bins_head = [-np.inf, -1, 25, 34, 44, 54, 64, np.inf] + labels_head = [0, 1, 2, 3, 4, 5, 6] + + cps_demographics["age_range_primary_filer"] = pd.cut( + cps_demographics["age_range_primary_filer"], + bins=bins_head, + labels=labels_head, + right=True, + ) + + is_male = sim.calculate("is_male") + is_head = sim.calculate("is_tax_unit_head") + male_head = sim.map_result(is_male * is_head, "person", "tax_unit") + tax_unit_filer_gender = np.where(male_head, 1, 2) + + cps_demographics["gender_primary_filer"] = tax_unit_filer_gender + + filer_earned = sim.calculate("filer_earned") + spouse_earned = sim.calculate("spouse_earned") + filing_status = sim.calculate("filing_status") + + def determine_earning_split_value( + filer: float, spouse: float, filing_status: str + ) -> int: + if filing_status != "JOINT": + return 0 + if filer + spouse <= 0: + return 1 + ratio_filer = filer / (filer + spouse) + if ratio_filer >= 0.75: + return 1 + elif ratio_filer >= 0.25: + return 2 + else: + return 3 + + cps_demographics["earnings_split_joint_returns"] = np.vectorize( + determine_earning_split_value + )(filer_earned, spouse_earned, filing_status) + cps_demographics["tax_unit_weight"] = sim.calculate( + "tax_unit_weight" + ).values + return cps_demographics + + +def impute_puf_financials_to_cps( + cps_demographics: pd.DataFrame, + puf: pd.DataFrame, +): + """Impute PUF financials to the CPS. + + Args: + cps_demographics (pd.DataFrame): The CPS data with demographic information. + puf (pd.DataFrame): The PUF data. + + Returns: + cps_imputed (pd.DataFrame): The CPS data with imputed financial information. + """ + income_from_demographics = Imputation() + + income_from_demographics.train( + puf[DEMOGRAPHIC_VARIABLES], + puf[FINANCIAL_SUBSET], + sample_weight=puf.decimal_weight, + ) + + cps_financial_predictions = income_from_demographics.predict( + cps_demographics[DEMOGRAPHIC_VARIABLES], + mean_quantile=[0.9] + [0.5] * (len(FINANCIAL_SUBSET) - 1), + ) + cps_imputed = pd.concat( + [cps_demographics, cps_financial_predictions], axis=1 + ) + cps_imputed = MicroDataFrame( + cps_imputed, weights=cps_demographics.tax_unit_weight + ) + + return cps_imputed + + +def project_tax_unit_cps_to_person_level( + puf_style_cps: pd.DataFrame, +) -> pd.DataFrame: + """Project tax unit CPS to person level. + + Args: + puf_style_cps (pd.DataFrame): The CPS data with imputed financial information. + + Returns: + person_df (pd.DataFrame): The CPS data with imputed financial information projected to the person level. + """ + sim = Microsimulation(dataset=CPS_DATASET) + person_df = pd.DataFrame( + dict( + person_id=sim.calculate("person_id").values, + tax_unit_id=sim.calculate("person_tax_unit_id").values, + ) + ) + + person_is_tax_filer_head = sim.calculate("is_tax_unit_head").values + + for variable in FINANCIAL_SUBSET: + cps_original_value = sim.calculate(variable).values + cps_tax_unit_original_total = sim.map_result( + sim.map_result(cps_original_value, "person", "tax_unit"), + "tax_unit", + "person", + ) + cps_share_of_tax_unit_original_total = ( + cps_original_value / cps_tax_unit_original_total + ) + cps_share_of_tax_unit_original_total = np.where( + np.isnan(cps_share_of_tax_unit_original_total), + person_is_tax_filer_head, + cps_share_of_tax_unit_original_total, + ) + mapped_down_imputed_values = sim.map_result( + puf_style_cps[variable].values, "tax_unit", "person" + ) + person_df[variable] = ( + cps_share_of_tax_unit_original_total * mapped_down_imputed_values + ) + + person_df = person_df.fillna(0) + return person_df + + +def puf_imputed_cps_person_level( + verbose: bool = False, +) -> pd.DataFrame: + """Generate a PUF-imputed CPS at the person level. + + Args: + verbose (bool): Whether to print progress statements. + + Returns: + person_level_puf_imputed_cps (pd.DataFrame): The PUF-imputed CPS at the person level. + """ + if verbose: + print("Loading PUF and demographics") + puf, demographics = load_puf() + + if verbose: + print("Imputing missing demographics") + puf = impute_missing_demographics(puf, demographics) + + if verbose: + print("Generating PUF-style CPS") + puf_style_cps = generate_puf_style_cps() + + if verbose: + print("Imputing PUF financials to CPS") + puf_imputed_cps = impute_puf_financials_to_cps(puf_style_cps, puf) + + if verbose: + print("Projecting tax unit CPS to person level") + person_level_puf_imputed_cps = project_tax_unit_cps_to_person_level( + puf_imputed_cps + ) + + if verbose: + print("Done") + return person_level_puf_imputed_cps + + +if __name__ == "__main__": + puf_imputed_cps_person_level(verbose=True) diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/puf_extended_cps.py b/fiscalsim_us/data/datasets/cps/enhanced_cps/puf_extended_cps.py new file mode 100644 index 000000000..a1d9d9712 --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/puf_extended_cps.py @@ -0,0 +1,63 @@ +from policyengine_core.data import Dataset +from fiscalsim_us.data.datasets.cps.cps import CPS_2023 +from fiscalsim_us.data.storage import STORAGE_FOLDER +import numpy as np +import pandas as pd + + +class PUFExtendedCPS_2023(Dataset): + name = "puf_extended_cps_2023" + label = "PUF-extended CPS (2023)" + file_path = STORAGE_FOLDER / "puf_extended_cps_2023.h5" + data_format = Dataset.ARRAYS + time_period = "2023" + + def generate(self): + from .process_puf import ( + FINANCIAL_SUBSET as FINANCIAL_VARIABLES, + puf_imputed_cps_person_level, + ) + + person_df = puf_imputed_cps_person_level() + new_data = {} + cps = CPS_2023() + cps_data = cps.load() + for variable in list(set(cps.variables) | set(FINANCIAL_VARIABLES)): + if "_id" in variable: + # Append on a copy multiplied by 10 + new_data[variable] = np.concatenate( + [cps_data[variable][...], cps_data[variable][...] + 1e8] + ) + elif "_weight" in variable: + # Append on a zero-weighted copy + new_data[variable] = np.concatenate( + [ + cps_data[variable][...], + np.zeros_like(cps_data[variable][...]), + ] + ) + else: + # Append on a copy + if variable in FINANCIAL_VARIABLES: + if variable not in cps.variables: + if variable == "social_security": + ## SS is an edge case + original_values = ( + cps_data["social_security_retirement"][...] + + cps_data["social_security_disability"][...] + ) + else: + original_values = np.zeros_like( + cps_data["employment_income"][...] + ) + else: + original_values = cps_data[variable][...] + new_data[variable] = np.concatenate( + [original_values, person_df[variable].values] + ) + else: + new_data[variable] = np.concatenate( + [cps_data[variable][...], cps_data[variable][...]] + ) + + self.save_dataset(new_data) diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/app.py b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/app.py new file mode 100644 index 000000000..21a0b823f --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/app.py @@ -0,0 +1,90 @@ +import pandas as pd +import plotly.express as px +from policyengine_core.charts import format_fig, BLUE, GRAY, DARK_GRAY +import streamlit as st + +training_log_puf_extended_cps = pd.read_csv( + "training_log.csv.gz", compression="gzip" +) +training_log_cps = pd.read_csv("training_log_cps.csv.gz", compression="gzip") +calibration_final_results = pd.read_csv( + "calibration_final_results.csv.gz", compression="gzip" +) + +training_log_puf_extended_cps["Source dataset"] = "PUF-extended CPS" +training_log_cps["Source dataset"] = "CPS" + +training_log = pd.concat([training_log_puf_extended_cps, training_log_cps]) +training_log_targets = training_log.copy() +training_log_targets["value"] = training_log_targets["target"] +training_log_targets["Source dataset"] = "Official" +training_log = pd.concat([training_log, training_log_targets]) + +name = st.selectbox( + "Metric", + training_log.name.unique(), +) + +total_loss_log = training_log[training_log.name == name] + +fig = px.line( + total_loss_log, + x="epoch", + y="value", + color="Source dataset", + color_discrete_map={ + "PUF-extended CPS": BLUE, + "CPS": GRAY, + "Official": DARK_GRAY, + }, +) + +fig = format_fig(fig) +fig.update_layout( + title=f"{name} during reweighting, by source dataset", + yaxis_title="Relative loss change", + xaxis_title="Epoch", + legend_title="", +) + +# Add annotations for final values +for source_dataset in ["PUF-extended CPS", "CPS", "Official"]: + final_value = total_loss_log[ + total_loss_log["Source dataset"] == source_dataset + ].iloc[-1]["value"] + fig.add_annotation( + x=total_loss_log["epoch"].max(), + y=final_value, + text=f"{final_value:,.0f}", + arrowhead=1, + yshift=10, + ax=0, + ay=-20, + bgcolor="white", + ) + +fig + + +def plot_metric(name): + fig = px.bar( + calibration_final_results[ + calibration_final_results.Variable == name + ].sort_values("Value"), + x="Source dataset", + y="Value", + color_discrete_map={ + "Enhanced CPS": BLUE, + "Calibrated CPS": GRAY, + "CPS": GRAY, + "Official": DARK_GRAY, + }, + color="Source dataset", + ) + fig = format_fig(fig).update_layout( + title=f"{name} after reweighting, by source dataset", + ) + return fig + + +st.plotly_chart(plot_metric(name)) diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/calibrate.py b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/calibrate.py new file mode 100644 index 000000000..898bdfb47 --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/calibrate.py @@ -0,0 +1,377 @@ +import torch +import pandas as pd +import numpy as np +from fiscalsim_us import Microsimulation +import plotly.express as px +from tqdm import tqdm +from policyengine_core.data import Dataset +from fiscalsim_us.data import CPS_2023 +import numpy as np +from fiscalsim_us import Microsimulation +import pandas as pd + +person_df = pd.read_csv("puf_imputed_cps_person.csv.gz", compression="gzip") + +FINANCIAL_VARIABLES = [ + "employment_income", + "self_employment_income", + "partnership_s_corp_income", + "farm_income", + "farm_rent_income", + "short_term_capital_gains", + "long_term_capital_gains", + "taxable_interest_income", + "tax_exempt_interest_income", + "rental_income", + "qualified_dividend_income", + "non_qualified_dividend_income", + "taxable_pension_income", + "social_security", +] + + +class PUFExtendedCPS(Dataset): + name = "puf_extended_cps" + label = "PUF-extended CPS" + file_path = "puf_extended_cps.h5" + data_format = Dataset.ARRAYS + time_period = "2023" + + def generate(self): + new_data = {} + cps = CPS_2023() + cps_data = cps.load() + for variable in list(set(cps.variables) | set(FINANCIAL_VARIABLES)): + if "_id" in variable: + # Append on a copy multiplied by 10 + new_data[variable] = np.concatenate( + [cps_data[variable][...], cps_data[variable][...] + 1e8] + ) + elif "_weight" in variable: + # Append on a zero-weighted copy + new_data[variable] = np.concatenate( + [ + cps_data[variable][...], + np.zeros_like(cps_data[variable][...]), + ] + ) + else: + # Append on a copy + if variable in FINANCIAL_VARIABLES: + if variable not in cps.variables: + if variable == "social_security": + ## SS is an edge case + original_values = ( + cps_data["social_security_retirement"][...] + + cps_data["social_security_disability"][...] + ) + else: + original_values = np.zeros_like( + cps_data["employment_income"][...] + ) + else: + original_values = cps_data[variable][...] + new_data[variable] = np.concatenate( + [original_values, person_df[variable].values] + ) + else: + new_data[variable] = np.concatenate( + [cps_data[variable][...], cps_data[variable][...]] + ) + + self.save_dataset(new_data) + + +puf_extended_cps = PUFExtendedCPS() +puf_extended_cps.generate() + + +simulation = Microsimulation(dataset=puf_extended_cps) +TIME_PERIOD = 2023 +simulation.default_calculation_period = TIME_PERIOD +parameters = simulation.tax_benefit_system.parameters.calibration( + f"{TIME_PERIOD}-01-01" +) + +household_weights = torch.tensor( + simulation.calculate("household_weight").values, dtype=torch.float32 +) +weight_adjustment = torch.tensor( + np.random.random(household_weights.shape) * 10, + requires_grad=True, + dtype=torch.float32, +) + +values_df = pd.DataFrame() +targets = {} +equivalisation = {} + +# We need to normalise the targets. Common regression targets are often 1e1 to 1e3 (this informs the scale of the learning rate). +COUNT_HOUSEHOLDS = household_weights.sum().item() +FINANCIAL_EQUIVALISATION = COUNT_HOUSEHOLDS +POPULATION_EQUIVALISATION = COUNT_HOUSEHOLDS / 1e5 + +# Financial totals +""" +AGI_VARIABLES = [ + "adjusted_gross_income", + "employment_income", + # "taxable_interest_and_ordinary_dividends", Doesn't exist yet + "qualified_dividend_income", + "net_capital_gain", + "self_employment_income", + "taxable_pension_income", + "taxable_social_security", + # "irs_other_income", Doesn't exist yet + # "above_the_line_deductions", +] + + +for variable_name in AGI_VARIABLES: + label = simulation.tax_benefit_system.variables[variable_name].label + " aggregate" + values_df[label] = simulation.calculate( + variable_name, map_to="household" + ).values + targets[label] = parameters.gov.cbo.income_by_source[variable_name] + equivalisation[label] = FINANCIAL_EQUIVALISATION +""" + +# Above is commented because we'll use IRS SOI aggregates uprated by CBO forecasts, rather than just CBO forecasts (SOI aggregates have more detail) + +for variable_name in FINANCIAL_VARIABLES: + label = ( + simulation.tax_benefit_system.variables[variable_name].label + + " aggregate" + ) + values_df[label] = simulation.calculate( + variable_name, map_to="household" + ).values + targets[label] = parameters.gov.irs.soi[variable_name] + equivalisation[label] = FINANCIAL_EQUIVALISATION + + +# Program spending from CBO baseline projections + +PROGRAMS = [ + "income_tax", + "snap", + "social_security", + "ssi", + "unemployment_compensation", +] + +for variable_name in PROGRAMS: + label = simulation.tax_benefit_system.variables[variable_name].label + values_df[label] = simulation.calculate( + variable_name, map_to="household" + ).values + targets[label] = parameters.gov.cbo[variable_name] + equivalisation[label] = FINANCIAL_EQUIVALISATION + +snap_participation = parameters.gov.usda.snap.participation +ssi_participation = parameters.gov.ssa.ssi.participation +ss_participation = parameters.gov.ssa.social_security.participation + +for program, participation in zip( + ["snap", "ssi", "social_security"], + [snap_participation, ssi_participation, ss_participation], +): + label = simulation.tax_benefit_system.variables[program].label + entity_level = simulation.tax_benefit_system.variables[program].entity.key + entity_level_value = simulation.calculate(program) + values_df[f"{label} participants"] = simulation.map_result( + entity_level_value > 0, entity_level, "household" + ) + targets[f"{label} participants"] = participation + equivalisation[f"{label} participants"] = POPULATION_EQUIVALISATION + + +# Number of tax returns by AGI size + +agi_returns_thresholds = ( + parameters.gov.irs.soi.agi.number_of_returns.thresholds +) +agi_returns_values = parameters.gov.irs.soi.agi.number_of_returns.amounts +agi = simulation.calculate("adjusted_gross_income").values +is_filer = simulation.calculate("income_tax").values != 0 +for i in range(len(agi_returns_thresholds)): + lower = agi_returns_thresholds[i] + if i == len(agi_returns_thresholds) - 1: + upper = np.inf + else: + upper = agi_returns_thresholds[i + 1] + + in_range = (agi >= lower) * (agi < upper) * is_filer + household_returns_in_range = simulation.map_result( + in_range, "tax_unit", "household" + ) + + name = f"Tax returns with ${lower:,.0f} <= AGI < ${upper:,.0f}" + values_df[name] = household_returns_in_range + targets[name] = agi_returns_values[i] + equivalisation[name] = POPULATION_EQUIVALISATION +# Total AGI aggregate by AGI band + +agi_returns_thresholds = parameters.gov.irs.soi.agi.total_agi.thresholds +agi_returns_values = parameters.gov.irs.soi.agi.total_agi.amounts +for i in range(len(agi_returns_thresholds)): + lower = agi_returns_thresholds[i] + if i == len(agi_returns_thresholds) - 1: + upper = np.inf + else: + upper = agi_returns_thresholds[i + 1] + + in_range = (agi >= lower) * (agi < upper) * is_filer + agi_in_range = agi * in_range + household_agi_in_range = simulation.map_result( + agi_in_range, "tax_unit", "household" + ) + + name = ( + f"Total AGI from tax returns with ${lower:,.0f} <= AGI < ${upper:,.0f}" + ) + values_df[name] = household_agi_in_range + targets[name] = agi_returns_values[i] + equivalisation[name] = FINANCIAL_EQUIVALISATION + +# Total population +values_df["U.S. population"] = simulation.calculate( + "people", map_to="household" +).values +targets["U.S. population"] = parameters.populations.total +equivalisation["U.S. population"] = POPULATION_EQUIVALISATION + +# Population by 10-year age group and sex +age = simulation.calculate("age").values +is_male = simulation.calculate("is_male") +for lower_age_group in range(0, 90, 10): + for possible_is_male in (True, False): + in_age_range = (age >= lower_age_group) & (age < lower_age_group + 5) + in_sex_category = is_male == possible_is_male + count_people_in_range = simulation.map_result( + in_age_range * in_sex_category, "person", "household" + ) + sex_category = "male" if possible_is_male else "female" + name = f"{lower_age_group} to {lower_age_group + 5} and {sex_category} population" + values_df[name] = count_people_in_range + targets[name] = ( + household_weights.numpy() * count_people_in_range + ).sum() + equivalisation[name] = POPULATION_EQUIVALISATION + +# Household population by number of adults and children + +household_count_adults = simulation.map_result( + age >= 18, "person", "household" +) +household_count_children = simulation.map_result( + age < 18, "person", "household" +) + +for count_adults in range(1, 3): + for count_children in range(0, 4): + in_criteria = ( + (household_count_adults == count_adults) + * (household_count_children == count_children) + * 1.0 + ) + name = f"{count_adults}-adult, {count_children}-child household population" + values_df[name] = in_criteria + targets[name] = (household_weights.numpy() * in_criteria).sum() + equivalisation[name] = POPULATION_EQUIVALISATION + +# Tax filing unit counts by filing status + +filing_status = simulation.calculate("filing_status").values + +for filing_status_value in np.unique(filing_status): + is_filing_status = filing_status == filing_status_value + name = f"Filing status {filing_status_value.lower()} population" + household_filing_status_unit_counts = simulation.map_result( + is_filing_status, "tax_unit", "household" + ) + values_df[name] = household_filing_status_unit_counts + targets[name] = ( + household_weights.numpy() * household_filing_status_unit_counts + ).sum() + equivalisation[name] = POPULATION_EQUIVALISATION + +targets_array = torch.tensor(list(targets.values()), dtype=torch.float32) +equivalisation_factors_array = torch.tensor( + list(equivalisation.values()), dtype=torch.float32 +) + + +def aggregate( + adjusted_weights: torch.Tensor, values: pd.DataFrame +) -> torch.Tensor: + broadcasted_weights = adjusted_weights.reshape(-1, 1) + weighted_values = torch.matmul( + broadcasted_weights.T, torch.tensor(values.values, dtype=torch.float32) + ) + return weighted_values + + +training_log_df = pd.DataFrame() + +progress_bar = tqdm(range(250_000), desc="Calibrating weights") +for i in progress_bar: + adjusted_weights = torch.relu(household_weights + weight_adjustment) + result = ( + aggregate(adjusted_weights, values_df) / equivalisation_factors_array + ) + loss = torch.mean( + (result - targets_array / equivalisation_factors_array) ** 2 + ) + loss.backward() + if i % 20 == 0: + current_loss = loss.item() + progress_bar.set_description_str( + f"Calibrating weights | Loss = {current_loss:,.0f}" + ) + current_aggregates = ( + (result * equivalisation_factors_array).detach().numpy()[0] + ) + training_log_df = pd.concat( + [ + training_log_df, + pd.DataFrame( + { + "name": list(targets.keys()) + ["total"], + "epoch": [i] * len(targets) + [i], + "value": list(current_aggregates) + [current_loss], + "target": list(targets.values()) + [0], + } + ), + ] + ) + weight_adjustment.data -= 1e-1 * weight_adjustment.grad + weight_adjustment.grad.zero_() + +training_log_df.to_csv("training_log.csv.gz", compression="gzip") + +from fiscalsim_us.data.storage import STORAGE_FOLDER + + +class EnhancedCPS(Dataset): + name = "enhanced_cps" + label = "Enhanced CPS" + file_path = STORAGE_FOLDER / "enhanced_cps.h5" + data_format = Dataset.ARRAYS + time_period = "2023" + + def generate(self): + new_data = {} + cps = PUFExtendedCPS() + cps_data = cps.load() + for variable in cps.variables: + if variable == "household_weight": + new_data[variable] = adjusted_weights.detach().numpy() + elif "_weight" not in variable: + new_data[variable] = cps_data[variable][...] + + self.save_dataset(new_data) + + +enhanced_cps = EnhancedCPS() +enhanced_cps.generate() diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/puf.ipynb b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/puf.ipynb new file mode 100644 index 000000000..e77e64036 --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/puf.ipynb @@ -0,0 +1,2844 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# PUF data enhancement of the CPS\n", + "\n", + "## Step 1: Filling in missing PUF demographic data" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Uprating employment income by 47% (5% per year)\n", + "Uprating self-employment income by 34% (4% per year)\n", + "Uprating partnership/S-corp income by 48% (5% per year)\n", + "Uprating farm income by 17% (2% per year)\n", + "Uprating farm rental income by 27% (3% per year)\n", + "Uprating short-term capital gains by 19% (2% per year)\n", + "Uprating long-term capital gains by 105% (9% per year)\n", + "Uprating taxable interest income by 68% (7% per year)\n", + "Uprating tax-exempt interest income by 22% (2% per year)\n", + "Uprating rental income by 28% (3% per year)\n", + "Uprating qualified dividend income by 47% (5% per year)\n", + "Uprating non-qualified dividend income by 36% (4% per year)\n", + "Uprating taxable pension income by 45% (5% per year)\n", + "Uprating Social Security by 57% (6% per year)\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import plotly.express as px\n", + "from policyengine_core.charts import format_fig, BLUE, GRAY\n", + "from microdf import MicroDataFrame\n", + "from survey_enhance import Imputation\n", + "\n", + "puf = pd.read_csv(\"~/Downloads/puf_2015.csv\")\n", + "demographics = pd.read_csv(\"~/Downloads/demographics_2015.csv\")\n", + "\n", + "puf = puf.dropna()\n", + "demographics = demographics.dropna()\n", + "\n", + "puf.S006 = puf.S006 / 100\n", + "\n", + "codebook = {\n", + " \"E00200\": \"employment_income\",\n", + " \"E00300\": \"interest_received\",\n", + " \"E00400\": \"tax_exempt_interest_income\",\n", + " \"E00600\": \"dividends_included_in_agi\",\n", + " \"E00650\": \"qualified_dividend_income\",\n", + " \"E00700\": \"state_income_tax_refunds\",\n", + " \"E00800\": \"alimony_received\",\n", + " \"E00900\": \"self_employment_income\",\n", + " \"E01000\": \"net_capital_gain_loss\",\n", + " \"E01100\": \"capital_gain_distributions\",\n", + " \"E01200\": \"other_gains_loss\",\n", + " \"E01400\": \"taxable_ira_distribution\",\n", + " \"E01500\": \"total_pensions_annuities_received\",\n", + " \"E01700\": \"taxable_pension_income\",\n", + " \"E02000\": \"schedule_e_net_income_loss\",\n", + " \"E02100\": \"schedule_f_net_profit_loss\",\n", + " \"E02300\": \"unemployment_compensation_in_agi\",\n", + " \"E02400\": \"social_security\",\n", + " \"E02500\": \"social_security_benefits_in_agi\",\n", + " \"E03150\": \"total_deductible_ira_payments\",\n", + " \"E03210\": \"student_loan_interest_deduction\",\n", + " \"E03220\": \"educator_expenses\",\n", + " \"E03230\": \"tuition_fees_deduction\",\n", + " \"E03260\": \"self_employment_tax_deduction\",\n", + " \"E03270\": \"self_employed_health_insurance_deduction\",\n", + " \"E03240\": \"domestic_production_activities_deduction\",\n", + " \"E03290\": \"health_savings_account_deduction\",\n", + " \"E03300\": \"payments_to_keogh_accounts\",\n", + " \"E03400\": \"forfeited_interest_penalty\",\n", + " \"E03500\": \"alimony_paid\",\n", + " \"E00100\": \"adjusted_gross_income\",\n", + " \"P04470\": \"total_deductions_standard_itemized\",\n", + " \"E04600\": \"exemption_amount\",\n", + " \"E04800\": \"taxable_income\",\n", + " \"E05100\": \"tax_on_taxable_income\",\n", + " \"E05200\": \"computed_regular_tax\",\n", + " \"E05800\": \"income_tax_before_credits\",\n", + " \"E06000\": \"income_subject_to_tax\",\n", + " \"E06200\": \"marginal_tax_base\",\n", + " \"E06300\": \"tax_generated_tax_rate_tables\",\n", + " \"E09600\": \"alternative_minimum_tax\",\n", + " \"E07180\": \"child_dependent_care_credit\",\n", + " \"E07200\": \"elderly_disabled_credit\",\n", + " \"E07220\": \"child_tax_credit\",\n", + " \"E07230\": \"education_credits\",\n", + " \"E07240\": \"retirement_savings_credit\",\n", + " \"E07260\": \"residential_energy_credit\",\n", + " \"E07300\": \"foreign_tax_credit\",\n", + " \"E07400\": \"general_business_credit\",\n", + " \"E07600\": \"credit_prior_year_minimum_tax\",\n", + " \"P08000\": \"other_tax_credits\",\n", + " \"E07150\": \"total_tax_credit_soi\",\n", + " \"E06500\": \"total_income_tax\",\n", + " \"E08800\": \"income_tax_after_credits_soi\",\n", + " \"E09400\": \"self_employment_tax\",\n", + " \"E09700\": \"recapture_taxes\",\n", + " \"E09730\": \"total_additional_medicare_tax\",\n", + " \"E09740\": \"net_investment_income_tax\",\n", + " \"E09750\": \"health_care_individual_responsibility_payment\",\n", + " \"E09800\": \"social_security_tax_tip_income\",\n", + " \"E09900\": \"penalty_tax_ira\",\n", + " \"E10300\": \"total_tax_liability_soi\",\n", + " \"E10700\": \"income_tax_withheld\",\n", + " \"E10900\": \"estimated_tax_payments\",\n", + " \"E10960\": \"refundable_american_opportunity_credit\",\n", + " \"E59560\": \"earned_income_eic\",\n", + " \"E59680\": \"eic_offset_income_tax_before_credits\",\n", + " \"E59700\": \"eic_offset_other_taxes_except_advance_eic\",\n", + " \"E59720\": \"eic_refundable_portion\",\n", + " \"E11550\": \"refundable_prior_year_minimum_tax_credit\",\n", + " \"E11560\": \"net_premium_tax_credit\",\n", + " \"E11561\": \"net_premium_tax_credit_offset_income_tax_before_credits\",\n", + " \"E11562\": \"net_premium_tax_credit_offset_other_taxes\",\n", + " \"E11563\": \"net_premium_tax_credit_refundable_portion\",\n", + " \"E11070\": \"additional_child_tax_credit\",\n", + " \"E11100\": \"amount_paid_form_4868_request_extension\",\n", + " \"E11200\": \"excess_fica_rrta\",\n", + " \"E11300\": \"credit_federal_tax_special_fuels_oils\",\n", + " \"E11400\": \"regulated_investment_company_credit\",\n", + " \"E11601\": \"total_refundable_credits_offset_income_tax_before_credits\",\n", + " \"E11602\": \"total_refundable_credits_offset_other_taxes\",\n", + " \"E11603\": \"total_refundable_credits_refundable_parts\",\n", + " \"E10605\": \"total_tax_payments_soi\",\n", + " \"E11900\": \"balance_due_overpayment\",\n", + " \"E12000\": \"credit_elect\",\n", + " \"E12200\": \"predetermined_estimated_tax_penalty\",\n", + " \"E17500\": \"medical_dental_expenses_reduction_agi_limit\",\n", + " \"E18400\": \"state_local_taxes\",\n", + " \"E18500\": \"real_estate_tax_deductions\",\n", + " \"E19200\": \"total_interest_paid_deduction\",\n", + " \"E19550\": \"qualified_mortgage_insurance_premiums\",\n", + " \"E19800\": \"cash_contributions\",\n", + " \"E20100\": \"other_than_cash_contributions\",\n", + " \"E19700\": \"contributions_deduction_total\",\n", + " \"E20550\": \"unreimbursed_employee_business_expense\",\n", + " \"E20600\": \"tax_preparation_fee\",\n", + " \"E20400\": \"miscellaneous_deductions_agi_limitation_total\",\n", + " \"E20800\": \"net_limited_miscellaneous_deductions\",\n", + " \"E20500\": \"net_casualty_theft_loss\",\n", + " \"E21040\": \"itemized_deduction_limitation\",\n", + " \"P22250\": \"short_term_capital_gains\",\n", + " \"E22320\": \"long_term_capital_gains_1\",\n", + " \"E22370\": \"schedule_d_capital_gain_distributions\",\n", + " \"P23250\": \"long_term_capital_gains\",\n", + " \"E24515\": \"unrecaptured_section_1250_gain\",\n", + " \"E24516\": \"capital_gain_less_investment_expense\",\n", + " \"E24518\": \"28_percent_rate_gain_loss\",\n", + " \"E24560\": \"non_schedule_d_tax\",\n", + " \"E24598\": \"schedule_d_15_percent_tax_amount\",\n", + " \"E24615\": \"schedule_d_25_percent_tax_amount\",\n", + " \"E24570\": \"schedule_d_28_percent_tax_amount\",\n", + " \"P25350\": \"rental_income\",\n", + " \"P25380\": \"rent_royalty_interest_expenses\",\n", + " \"E25550\": \"total_depreciation_depletion_all_property\",\n", + " \"P25700\": \"rent_royalty_net_income_loss\",\n", + " \"E25820\": \"deductible_rental_loss\",\n", + " \"E25850\": \"rent_royalty_net_income\",\n", + " \"E25860\": \"rent_royalty_net_loss\",\n", + " \"E25940\": \"total_passive_income_partnerships\",\n", + " \"E25980\": \"total_non_passive_income_partnerships\",\n", + " \"E25920\": \"total_passive_loss_partnerships\",\n", + " \"E25960\": \"total_non_passive_loss_partnerships\",\n", + " \"E26110\": \"partnership_section_179_expense_deduction\",\n", + " \"E26170\": \"total_passive_income_small_business_corp\",\n", + " \"E26190\": \"total_non_passive_income_small_business_corp\",\n", + " \"E26160\": \"total_passive_loss_small_business_corp\",\n", + " \"E26180\": \"total_non_passive_loss_small_business_corp\",\n", + " \"E26270\": \"partnership_s_corp_income\",\n", + " \"E26100\": \"s_corp_section_179_expense_deduction\",\n", + " \"E26390\": \"total_income_estate_trust\",\n", + " \"E26400\": \"total_loss_estate_trust\",\n", + " \"E27200\": \"farm_rent_income\",\n", + " \"E30400\": \"self_employment_income_ss_tax_primary\",\n", + " \"E30500\": \"self_employment_income_ss_tax_secondary\",\n", + " \"E32800\": \"qualifying_individuals_expenses_form_2441\",\n", + " \"E33000\": \"expenses_limited_to_earned_income_form_2441\",\n", + " \"E53240\": \"work_opportunity_jobs_general_business_credit\",\n", + " \"E53280\": \"research_experimentation_general_business_credit\",\n", + " \"E53300\": \"low_income_housing_credit\",\n", + " \"E53317\": \"employer_credit_social_security_tax_tips\",\n", + " \"E58950\": \"total_investment_interest_expense_form_4952\",\n", + " \"E58990\": \"investment_income_elected_amount_form_4952\",\n", + " \"P60100\": \"net_operating_loss_tax_preference_adjustments_form_6251\",\n", + " \"P61850\": \"total_adjustments_preferences_form_6251\",\n", + " \"E60000\": \"taxable_income_amt_form_6251\",\n", + " \"E62100\": \"alternative_minimum_taxable_income\",\n", + " \"E62900\": \"alternative_tax_foreign_tax_credit\",\n", + " \"E62720\": \"alternative_minimum_schedule_d_less_investment_interest\",\n", + " \"E62730\": \"alternative_minimum_schedule_d_unrecaptured_section_1250_gain\",\n", + " \"E62740\": \"alternative_minimum_capital_gain_amount\",\n", + " \"P65300\": \"total_passive_net_income_form_8582\",\n", + " \"P65400\": \"total_passive_losses_form_8582\",\n", + " \"E68000\": \"total_losses_allowed_passive_activities\",\n", + " \"E82200\": \"carry_forward_minimum_tax_credit_form_8801\",\n", + " \"T27800\": \"farm_income\",\n", + " \"S27860\": \"tentative_current_prior_year_tax_schedule_j\",\n", + " \"P27895\": \"actual_prior_year_tax_schedule_j\",\n", + " \"P87482\": \"american_opportunity_qualified_expenses_form_8863\",\n", + " \"E87521\": \"american_opportunity_credit\",\n", + " \"E87530\": \"lifetime_learning_total_qualified_expenses\",\n", + " \"E87550\": \"lifetime_learning_credit\",\n", + " \"P86421\": \"bond_purchase_amount_form_8888\",\n", + " \"E85050\": \"total_rental_real_estate_royalties_partnerships_s_corps_trusts\",\n", + " \"E85090\": \"total_net_gain_loss_disposition_property\",\n", + " \"E85120\": \"total_investment_income\",\n", + " \"E85180\": \"total_deductions_modifications\",\n", + " \"E85570\": \"dependents_modified_adjusted_gross_income_amount_form_8962\",\n", + " \"E85595\": \"annual_contribution_health_care_amount\",\n", + " \"E85600\": \"monthly_contribution_health_care_amount\",\n", + " \"E85770\": \"total_premium_tax_credit_amount\",\n", + " \"E85775\": \"advance_premium_tax_credit_amount\",\n", + " \"E85785\": \"excess_advance_payment_premium_tax_credit\",\n", + " \"E85790\": \"repayment_limitation_amount\",\n", + " \"RECID\": \"return_id\",\n", + " \"S006\": \"decimal_weight\",\n", + " \"S008\": \"sample_count\",\n", + " \"S009\": \"population_count\",\n", + " \"WSAMP\": \"sample_code\",\n", + " \"TXRT\": \"marginal_tax_rate\",\n", + "}\n", + "\n", + "codebook.update(\n", + " {\n", + " \"AGIR1\": \"adjusted_gross_income_band\",\n", + " \"CLAIM8965\": \"health_coverage_exemptions\",\n", + " \"DSI\": \"dependent_status_indicator\",\n", + " \"EFI\": \"electronic_filing_indicator\",\n", + " \"EIC\": \"earned_income_credit_code\",\n", + " \"ELECT\": \"presidential_election_campaign_fund_boxes\",\n", + " \"FDED\": \"form_of_deduction_code\",\n", + " \"FLPDYR\": \"filing_accounting_period_year\",\n", + " \"FLPDMO\": \"filing_accounting_period_month\",\n", + " \"F2441\": \"form_2441_child_care_credit_qualified_individual\",\n", + " \"F3800\": \"form_3800_general_business_credit\",\n", + " \"F6251\": \"form_6251_alternative_minimum_tax\",\n", + " \"F8582\": \"form_8582_passive_activity_loss_limitation\",\n", + " \"F8606\": \"form_8606_nondeductible_ira_contributions\",\n", + " \"F8829\": \"form_8829_expenses_home_business_use\",\n", + " \"F8867\": \"form_8867_paid_preparer_earned_income_credit_checklist\",\n", + " \"F8949\": \"form_8949_sales_dispositions_capital_assets\",\n", + " \"F8959\": \"form_8959_additional_medicare_tax\",\n", + " \"F8960\": \"form_8960_net_investment_income_tax\",\n", + " \"F8962\": \"form_8962_premium_tax_credit\",\n", + " \"F8965\": \"form_8965_health_coverage_exemptions\",\n", + " \"IE\": \"itemized_deductions_election_indicator\",\n", + " \"MARS\": \"marital_filing_status\",\n", + " \"MIDR\": \"married_filing_separately_itemized_deductions_requirement_indicator\",\n", + " \"N24\": \"number_children_child_tax_credit\",\n", + " \"N25\": \"number_qualified_students_lifetime_learning_credit\",\n", + " \"N30\": \"number_qualified_students_american_opportunity_credit\",\n", + " \"PREP\": \"tax_preparer\",\n", + " \"PREMNTHS\": \"months_enrolled_health_insurance_marketplace\",\n", + " \"SCHB\": \"schedule_b_indicator\",\n", + " \"SCHCF\": \"schedule_c_or_f_indicator\",\n", + " \"SCHE\": \"schedule_e_indicator\",\n", + " \"TFORM\": \"form_of_return\",\n", + " \"TXST\": \"tax_status\",\n", + " \"XFPT\": \"primary_taxpayer_exemption\",\n", + " \"XFST\": \"secondary_taxpayer_exemption\",\n", + " \"XOCAH\": \"exemptions_children_living_at_home\",\n", + " \"XOCAWH\": \"exemptions_children_living_away_from_home\",\n", + " \"XOODEP\": \"exemptions_other_dependents\",\n", + " \"XOPAR\": \"exemptions_parents_living_at_away_from_home\",\n", + " \"XTOT\": \"total_exemptions\",\n", + " \"XTOT8962\": \"number_exemptions_form_8962\",\n", + " \"XTOT8965\": \"number_exemptions_form_8965\",\n", + " }\n", + ")\n", + "\n", + "codebook.update(\n", + " {\n", + " \"AGEDP1\": \"age_dependent_1\",\n", + " \"AGEDP2\": \"age_dependent_2\",\n", + " \"AGEDP3\": \"age_dependent_3\",\n", + " \"AGERANGE\": \"age_range_primary_filer\",\n", + " \"EARNSPLIT\": \"earnings_split_joint_returns\",\n", + " \"GENDER\": \"gender_primary_filer\",\n", + " \"RECID\": \"return_id\",\n", + " }\n", + ")\n", + "\n", + "\n", + "puf[\"taxable_interest_income\"] = (\n", + " puf.E00300 - puf.E00400\n", + ") # Taxable interest income = interest received - tax-exempt interest income\n", + "puf[\"non_qualified_dividend_income\"] = (\n", + " puf.E00600 - puf.E00650\n", + ") # Non-qualified dividend income = dividends included in AGI - qualified dividend income\n", + "\n", + "puf_with_demographics = puf[puf.RECID.isin(demographics.RECID)].merge(\n", + " demographics, on=\"RECID\"\n", + ")\n", + "\n", + "puf_renamed = puf.rename(columns=codebook)\n", + "\n", + "puf_with_demographics = puf_with_demographics.rename(columns=codebook)\n", + "\n", + "from survey_enhance import Imputation\n", + "\n", + "demographics_from_puf = Imputation()\n", + "\n", + "DEMOGRAPHIC_VARIABLES = [\n", + " \"age_dependent_1\",\n", + " \"age_dependent_2\",\n", + " \"age_dependent_3\",\n", + " \"age_range_primary_filer\",\n", + " \"earnings_split_joint_returns\",\n", + " \"gender_primary_filer\",\n", + "]\n", + "\n", + "FINANCIAL_VARIABLES = [\n", + " column\n", + " for column in puf_renamed.columns\n", + " if column\n", + " not in DEMOGRAPHIC_VARIABLES\n", + " + [\n", + " \"return_id\",\n", + " \"decimal_weight\",\n", + " \"sample_count\",\n", + " \"population_count\",\n", + " \"sample_code\",\n", + " ]\n", + "]\n", + "\n", + "FINANCIAL_SUBSET = [\n", + " \"employment_income\",\n", + " \"self_employment_income\",\n", + " \"partnership_s_corp_income\",\n", + " \"farm_income\",\n", + " \"farm_rent_income\",\n", + " \"short_term_capital_gains\",\n", + " \"long_term_capital_gains\",\n", + " \"taxable_interest_income\",\n", + " \"tax_exempt_interest_income\",\n", + " \"rental_income\",\n", + " \"qualified_dividend_income\",\n", + " \"non_qualified_dividend_income\",\n", + " \"taxable_pension_income\",\n", + " \"social_security\",\n", + "]\n", + "\n", + "from fiscalsim_us.system import system\n", + "\n", + "soi = system.parameters.calibration.gov.irs.soi\n", + "\n", + "# Uprate the financial subset\n", + "\n", + "for variable_name in FINANCIAL_SUBSET:\n", + " value_in_2015 = soi.children[variable_name](\"2015-01-01\")\n", + " value_in_2023 = soi.children[variable_name](\"2023-01-01\")\n", + " uprating_factor = value_in_2023 / value_in_2015\n", + " annualised_uprating_factor = uprating_factor ** (1 / 8)\n", + " print(\n", + " f\"Uprating {system.variables[variable_name].label} by {uprating_factor - 1:.0%} ({annualised_uprating_factor - 1:.0%} per year)\"\n", + " )\n", + " puf_with_demographics[variable_name] = (\n", + " puf_with_demographics[variable_name] * uprating_factor\n", + " )\n", + "\n", + "demographics_from_puf.train(\n", + " puf_with_demographics[FINANCIAL_VARIABLES],\n", + " puf_with_demographics[DEMOGRAPHIC_VARIABLES],\n", + ")\n", + "\n", + "puf_without_demographics = (\n", + " puf[~puf.RECID.isin(demographics.RECID)]\n", + " .rename(columns=codebook)\n", + " .reset_index()\n", + ")\n", + "puf_without_demographics.marital_filing_status = (\n", + " puf_without_demographics.marital_filing_status.replace(\n", + " {\n", + " 0: 1,\n", + " }\n", + " )\n", + ") # Aggregated returns -> single\n", + "predicted_demographics = demographics_from_puf.predict(\n", + " puf_without_demographics[FINANCIAL_VARIABLES]\n", + ")\n", + "puf_with_imputed_demographics = pd.concat(\n", + " [puf_without_demographics, predicted_demographics], axis=1\n", + ")\n", + "\n", + "weighted_puf_with_demographics = MicroDataFrame(\n", + " puf_with_demographics, weights=\"decimal_weight\"\n", + ")\n", + "weighted_puf_with_imputed_demographics = MicroDataFrame(\n", + " puf_with_imputed_demographics, weights=\"decimal_weight\"\n", + ")\n", + "\n", + "puf_combined = pd.concat(\n", + " [weighted_puf_with_demographics, weighted_puf_with_imputed_demographics]\n", + ")\n", + "puf_combined = MicroDataFrame(puf_combined, weights=\"decimal_weight\")\n", + "\n", + "puf_combined.to_csv(\n", + " \"puf_full_demographics.csv.gz\", index=False, compression=\"gzip\"\n", + ")\n", + "\n", + "# Uprate average amounts" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, to plot a chart showing the difference between the imputed and non-imputed demographic characteristic records." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "hovertemplate": "Source=Training
Value=%{x}
Variable=%{y}
text=%{text}", + "legendgroup": "Training", + "marker": { + "color": "#BDBDBD", + "pattern": { + "shape": "" + } + }, + "name": "Training", + "offsetgroup": "Training", + "orientation": "h", + "showlegend": true, + "text": [ + "0.2", + "0.4", + "0.4", + "0.5", + "0.8", + "1.4", + "3.5", + "6,582.7", + "53,098.5" + ], + "textposition": "auto", + "type": "bar", + "x": [ + 0.15876491469561888, + 0.4426939587150923, + 0.4482701311906943, + 0.5186609580291247, + 0.8090903381444285, + 1.380953404849433, + 3.4579384011485166, + 6582.697597473246, + 53098.48414744844 + ], + "xaxis": "x", + "y": [ + "age_dependent_3", + "number_children_child_tax_credit", + "age_dependent_2", + "earnings_split_joint_returns", + "age_dependent_1", + "gender_primary_filer", + "age_range_primary_filer", + "total_pensions_annuities_received", + "adjusted_gross_income" + ], + "yaxis": "y" + }, + { + "alignmentgroup": "True", + "hovertemplate": "Source=Imputed
Value=%{x}
Variable=%{y}
text=%{text}", + "legendgroup": "Imputed", + "marker": { + "color": "#2C6496", + "pattern": { + "shape": "" + } + }, + "name": "Imputed", + "offsetgroup": "Imputed", + "orientation": "h", + "showlegend": true, + "text": [ + "0.2", + "0.5", + "0.6", + "0.7", + "1.3", + "1.3", + "4.3", + "62,201.5", + "683,054.0" + ], + "textposition": "auto", + "type": "bar", + "x": [ + 0.20614422697086804, + 0.4816627830323708, + 0.6178286464972926, + 0.712161116430349, + 1.2752187358112854, + 1.2805809484388744, + 4.23989181905831, + 62201.48605593363, + 683054.0033706542 + ], + "xaxis": "x", + "y": [ + "age_dependent_3", + "age_dependent_2", + "number_children_child_tax_credit", + "age_dependent_1", + "earnings_split_joint_returns", + "gender_primary_filer", + "age_range_primary_filer", + "total_pensions_annuities_received", + "adjusted_gross_income" + ], + "yaxis": "y" + } + ], + "layout": { + "barmode": "group", + "font": { + "color": "black", + "family": "Roboto Serif" + }, + "height": 600, + "images": [ + { + "sizex": 0.2, + "sizey": 0.2, + "source": "https://raw.githubusercontent.com/PolicyEngine/policyengine-app/master/src/images/logos/policyengine/blue.png", + "x": 1, + "xanchor": "right", + "xref": "paper", + "y": -0.15, + "yanchor": "bottom", + "yref": "paper" + } + ], + "legend": { + "title": { + "text": "Subset" + }, + "tracegroupgap": 0 + }, + "modebar": { + "bgcolor": "rgba(0,0,0,0)", + "color": "rgba(0,0,0,0)" + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "PUF characteristics with and without recorded demographics" + }, + "width": 800, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Mean value" + }, + "type": "log" + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "tickmode": "array", + "ticktext": [ + "Tax filer gender", + "First dependent age", + "Second dependent age", + "Third dependent age", + "Earnings split", + "Tax filer age band", + "Adjusted gross income", + "Number of children", + "Salaries and wages", + "Total pensions and annuities" + ], + "tickvals": [ + "gender_primary_filer", + "age_dependent_1", + "age_dependent_2", + "age_dependent_3", + "earnings_split_joint_returns", + "age_range_primary_filer", + "adjusted_gross_income", + "number_children_child_tax_credit", + "salaries_and_wages", + "total_pensions_annuities_received" + ], + "title": { + "text": "Demographic variable" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "features = {\n", + " \"Total\": lambda column: column.sum(),\n", + " \"Mean\": lambda column: column.mean(),\n", + " \"Standard deviation\": lambda column: column.std(),\n", + " \"Q1\": lambda column: column.quantile(0.25),\n", + " \"Median\": lambda column: column.median(),\n", + " \"Q3\": lambda column: column.quantile(0.75),\n", + "}\n", + "\n", + "comparison_results = pd.DataFrame()\n", + "# Columns are [Feature, Source(Training, Imputed, Difference), Value]\n", + "feature_values = []\n", + "source_values = []\n", + "value_values = []\n", + "variable_values = []\n", + "\n", + "for feature in features:\n", + " for variable in FINANCIAL_VARIABLES + DEMOGRAPHIC_VARIABLES:\n", + " feature_values += [feature]\n", + " variable_values += [variable]\n", + " source_values += [\"Training\"]\n", + " value_values += [\n", + " features[feature](weighted_puf_with_demographics[variable])\n", + " ]\n", + "\n", + " feature_values += [feature]\n", + " variable_values += [variable]\n", + " source_values += [\"Imputed\"]\n", + " value_values += [\n", + " features[feature](weighted_puf_with_imputed_demographics[variable])\n", + " ]\n", + "\n", + "comparison_results[\"Feature\"] = feature_values\n", + "comparison_results[\"Source\"] = source_values\n", + "comparison_results[\"Value\"] = value_values\n", + "comparison_results[\"Variable\"] = variable_values\n", + "\n", + "comparison_results = comparison_results[comparison_results.Feature == \"Mean\"]\n", + "\n", + "labels = {\n", + " \"gender_primary_filer\": \"Tax filer gender\",\n", + " \"age_dependent_1\": \"First dependent age\",\n", + " \"age_dependent_2\": \"Second dependent age\",\n", + " \"age_dependent_3\": \"Third dependent age\",\n", + " \"earnings_split_joint_returns\": \"Earnings split\",\n", + " \"age_range_primary_filer\": \"Tax filer age band\",\n", + " \"adjusted_gross_income\": \"Adjusted gross income\",\n", + " \"number_children_child_tax_credit\": \"Number of children\",\n", + " \"salaries_and_wages\": \"Salaries and wages\",\n", + " \"total_pensions_annuities_received\": \"Total pensions and annuities\",\n", + "}\n", + "\n", + "comparison_results = comparison_results.sort_values(\"Value\")\n", + "\n", + "comparison_results = comparison_results[\n", + " comparison_results.Variable.isin(labels.keys())\n", + "]\n", + "\n", + "fig = px.bar(\n", + " comparison_results,\n", + " x=\"Value\",\n", + " y=\"Variable\",\n", + " color=\"Source\",\n", + " barmode=\"group\",\n", + " title=\"PUF characteristics with and without recorded demographics\",\n", + " orientation=\"h\",\n", + " color_discrete_map={\n", + " \"Training\": GRAY,\n", + " \"Imputed\": BLUE,\n", + " },\n", + " text=comparison_results.Value.apply(lambda x: f\"{x:,.1f}\"),\n", + " log_x=True,\n", + ").update_layout(\n", + " xaxis_title=\"Mean value\",\n", + " yaxis_title=\"Demographic variable\",\n", + " legend_title=\"Subset\",\n", + " yaxis=dict(\n", + " tickmode=\"array\",\n", + " tickvals=list(labels.keys()),\n", + " ticktext=list(labels.values()),\n", + " ),\n", + ")\n", + "format_fig(fig).update_layout(\n", + " width=800,\n", + " height=600,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Creating a PUF demographics data-styled CPS" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from fiscalsim_us import Microsimulation\n", + "\n", + "sim = Microsimulation(dataset=\"cps_2023\")\n", + "\n", + "cps_demographics = pd.DataFrame(index=sim.calculate(\"tax_unit_id\").values)\n", + "\n", + "df = sim.calculate_dataframe([\"age\", \"tax_unit_id\", \"is_tax_unit_dependent\"])\n", + "df = df[df.is_tax_unit_dependent]\n", + "dependent_ids = df.tax_unit_id.values\n", + "df_sorted = df.sort_values([\"tax_unit_id\", \"age\"])\n", + "df_sorted[\"rank\"] = df_sorted.groupby(\"tax_unit_id\")[\"age\"].rank()\n", + "\n", + "df_sorted[\"age_dependent_1\"] = np.where(\n", + " df_sorted[\"rank\"] == 1, df_sorted[\"age\"], -1\n", + ")\n", + "df_sorted[\"age_dependent_2\"] = np.where(\n", + " df_sorted[\"rank\"] == 2, df_sorted[\"age\"], -1\n", + ")\n", + "df_sorted[\"age_dependent_3\"] = np.where(\n", + " df_sorted[\"rank\"] == 3, df_sorted[\"age\"], -1\n", + ")\n", + "\n", + "df_sorted_maxed = df_sorted.groupby(\"tax_unit_id\").max()\n", + "\n", + "cps_demographics[\"age_dependent_1\"] = df_sorted_maxed[\"age_dependent_1\"]\n", + "cps_demographics[\"age_dependent_2\"] = df_sorted_maxed[\"age_dependent_2\"]\n", + "cps_demographics[\"age_dependent_3\"] = df_sorted_maxed[\"age_dependent_3\"]\n", + "\n", + "cps_demographics = cps_demographics.fillna(-1)\n", + "\n", + "# Define the age bins and labels\n", + "bins = [-np.inf, -1, 4, 12, 16, 18, 23, np.inf]\n", + "labels = [0, 1, 2, 3, 4, 5, 6]\n", + "\n", + "# Create AGEDP1, AGEDP2, AGEDP3 based on the categories\n", + "for col in [\"age_dependent_1\", \"age_dependent_2\", \"age_dependent_3\"]:\n", + " cps_demographics[col] = pd.cut(\n", + " cps_demographics[col], bins=bins, labels=labels, right=True\n", + " )\n", + "\n", + "cps_demographics.reset_index(inplace=True)\n", + "cps_demographics = cps_demographics[\n", + " [\"age_dependent_1\", \"age_dependent_2\", \"age_dependent_3\"]\n", + "]\n", + "\n", + "cps_demographics[\"age_range_primary_filer\"] = sim.calculate(\"age_head\").values\n", + "\n", + "bins_head = [-np.inf, -1, 25, 34, 44, 54, 64, np.inf]\n", + "labels_head = [0, 1, 2, 3, 4, 5, 6]\n", + "\n", + "cps_demographics[\"age_range_primary_filer\"] = pd.cut(\n", + " cps_demographics[\"age_range_primary_filer\"],\n", + " bins=bins_head,\n", + " labels=labels_head,\n", + " right=True,\n", + ")\n", + "\n", + "is_male = sim.calculate(\"is_male\")\n", + "is_head = sim.calculate(\"is_tax_unit_head\")\n", + "male_head = sim.map_result(is_male * is_head, \"person\", \"tax_unit\")\n", + "tax_unit_filer_gender = np.where(male_head, 1, 2)\n", + "\n", + "cps_demographics[\"gender_primary_filer\"] = tax_unit_filer_gender\n", + "\n", + "filer_earned = sim.calculate(\"filer_earned\")\n", + "spouse_earned = sim.calculate(\"spouse_earned\")\n", + "filing_status = sim.calculate(\"filing_status\")\n", + "\n", + "\n", + "def determine_earning_split_value(\n", + " filer: float, spouse: float, filing_status: str\n", + ") -> int:\n", + " if filing_status != \"JOINT\":\n", + " return 0\n", + " if filer + spouse <= 0:\n", + " return 1\n", + " ratio_filer = filer / (filer + spouse)\n", + " if ratio_filer >= 0.75:\n", + " return 1\n", + " elif ratio_filer >= 0.25:\n", + " return 2\n", + " else:\n", + " return 3\n", + "\n", + "\n", + "cps_demographics[\"earnings_split_joint_returns\"] = np.vectorize(\n", + " determine_earning_split_value\n", + ")(filer_earned, spouse_earned, filing_status)\n", + "\n", + "cps_demographics.to_csv(\n", + " \"puf_demographics_style_cps.csv.gz\", index=False, compression=\"gzip\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The chart below shows how the CPS and PUF compare on the PUF demographic characteristics." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "hovertemplate": "Source=CPS
Value=%{x}
Variable=%{y}
text=%{text}", + "legendgroup": "CPS", + "marker": { + "color": "#BDBDBD", + "pattern": { + "shape": "" + } + }, + "name": "CPS", + "offsetgroup": "CPS", + "orientation": "h", + "showlegend": true, + "text": [ + "0.5", + "0.3", + "0.1", + "3.9", + "0.5", + "1.5" + ], + "textposition": "auto", + "type": "bar", + "x": [ + 0.48627714165216257, + 0.2959161423305803, + 0.11740072816563998, + 3.8704507004108084, + 0.5421729484882434, + 1.4561017897794608 + ], + "xaxis": "x", + "y": [ + "age_dependent_1", + "age_dependent_2", + "age_dependent_3", + "age_range_primary_filer", + "earnings_split_joint_returns", + "gender_primary_filer" + ], + "yaxis": "y" + }, + { + "alignmentgroup": "True", + "hovertemplate": "Source=PUF
Value=%{x}
Variable=%{y}
text=%{text}", + "legendgroup": "PUF", + "marker": { + "color": "#2C6496", + "pattern": { + "shape": "" + } + }, + "name": "PUF", + "offsetgroup": "PUF", + "orientation": "h", + "showlegend": true, + "text": [ + "0.8", + "0.4", + "0.2", + "3.5", + "0.5", + "1.4" + ], + "textposition": "auto", + "type": "bar", + "x": [ + 0.8069461688323144, + 0.4490088093525827, + 0.15981299148415776, + 3.475235976560095, + 0.5353967570098167, + 1.378733067813695 + ], + "xaxis": "x", + "y": [ + "age_dependent_1", + "age_dependent_2", + "age_dependent_3", + "age_range_primary_filer", + "earnings_split_joint_returns", + "gender_primary_filer" + ], + "yaxis": "y" + } + ], + "layout": { + "barmode": "group", + "font": { + "color": "black", + "family": "Roboto Serif" + }, + "height": 600, + "images": [ + { + "sizex": 0.2, + "sizey": 0.2, + "source": "https://raw.githubusercontent.com/PolicyEngine/policyengine-app/master/src/images/logos/policyengine/blue.png", + "x": 1, + "xanchor": "right", + "xref": "paper", + "y": -0.15, + "yanchor": "bottom", + "yref": "paper" + } + ], + "legend": { + "title": { + "text": "Dataset" + }, + "tracegroupgap": 0 + }, + "modebar": { + "bgcolor": "rgba(0,0,0,0)", + "color": "rgba(0,0,0,0)" + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "PUF and CPS demographic characteristics" + }, + "width": 800, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Mean value" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "tickmode": "array", + "ticktext": [ + "Tax filer gender", + "First dependent age", + "Second dependent age", + "Third dependent age", + "Earnings split", + "Tax filer age band", + "Adjusted gross income", + "Number of children", + "Salaries and wages", + "Total pensions and annuities" + ], + "tickvals": [ + "gender_primary_filer", + "age_dependent_1", + "age_dependent_2", + "age_dependent_3", + "earnings_split_joint_returns", + "age_range_primary_filer", + "adjusted_gross_income", + "number_children_child_tax_credit", + "salaries_and_wages", + "total_pensions_annuities_received" + ], + "title": { + "text": "Demographic variable" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cps_demographics_weighted = MicroDataFrame(\n", + " cps_demographics, weights=sim.calculate(\"tax_unit_weight\")\n", + ")\n", + "\n", + "cps_means = cps_demographics_weighted.mean()\n", + "puf_means = puf_combined[DEMOGRAPHIC_VARIABLES].mean()\n", + "\n", + "labels = {\n", + " \"gender_primary_filer\": \"Tax filer gender\",\n", + " \"age_dependent_1\": \"First dependent age\",\n", + " \"age_dependent_2\": \"Second dependent age\",\n", + " \"age_dependent_3\": \"Third dependent age\",\n", + " \"earnings_split_joint_returns\": \"Earnings split\",\n", + " \"age_range_primary_filer\": \"Tax filer age band\",\n", + " \"adjusted_gross_income\": \"Adjusted gross income\",\n", + " \"number_children_child_tax_credit\": \"Number of children\",\n", + " \"salaries_and_wages\": \"Salaries and wages\",\n", + " \"total_pensions_annuities_received\": \"Total pensions and annuities\",\n", + "}\n", + "\n", + "comparison_results = pd.DataFrame()\n", + "variables = []\n", + "sources = []\n", + "values = []\n", + "for variable in DEMOGRAPHIC_VARIABLES:\n", + " variables += [variable]\n", + " sources += [\"CPS\"]\n", + " values += [cps_means[variable]]\n", + " variables += [variable]\n", + " sources += [\"PUF\"]\n", + " values += [puf_means[variable]]\n", + "\n", + "comparison_results[\"Variable\"] = variables\n", + "comparison_results[\"Source\"] = sources\n", + "comparison_results[\"Value\"] = values\n", + "\n", + "fig = px.bar(\n", + " comparison_results,\n", + " x=\"Value\",\n", + " y=\"Variable\",\n", + " color=\"Source\",\n", + " barmode=\"group\",\n", + " title=\"PUF and CPS demographic characteristics\",\n", + " orientation=\"h\",\n", + " color_discrete_map={\n", + " \"CPS\": GRAY,\n", + " \"PUF\": BLUE,\n", + " },\n", + " text=comparison_results.Value.apply(lambda x: f\"{x:,.1f}\"),\n", + " # log_x=True,\n", + ").update_layout(\n", + " xaxis_title=\"Mean value\",\n", + " yaxis_title=\"Demographic variable\",\n", + " legend_title=\"Dataset\",\n", + " yaxis=dict(\n", + " tickmode=\"array\",\n", + " tickvals=list(labels.keys()),\n", + " ticktext=list(labels.values()),\n", + " ),\n", + ")\n", + "fig = format_fig(fig)\n", + "\n", + "fig" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, imputing PUF financial columns into the CPS." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Training models: 100%|██████████| 14/14 [00:12<00:00, 1.08it/s]\n", + "Predicting: 14it [00:51, 3.71s/it]\n" + ] + } + ], + "source": [ + "# Now, we need to train a model to predict financial variables from demographics on the PUF, and apply it to the CPS\n", + "\n", + "income_from_demographics = Imputation()\n", + "\n", + "FINANCIAL_VARIABLES = [\n", + " \"employment_income\",\n", + " \"self_employment_income\",\n", + " \"partnership_s_corp_income\",\n", + " \"farm_income\",\n", + " \"farm_rent_income\",\n", + " \"short_term_capital_gains\",\n", + " \"long_term_capital_gains\",\n", + " \"taxable_interest_income\",\n", + " \"tax_exempt_interest_income\",\n", + " \"rental_income\",\n", + " \"qualified_dividend_income\",\n", + " \"non_qualified_dividend_income\",\n", + " \"taxable_pension_income\",\n", + " \"social_security\",\n", + "]\n", + "\n", + "income_from_demographics.train(\n", + " puf_combined[DEMOGRAPHIC_VARIABLES],\n", + " puf_combined[FINANCIAL_VARIABLES],\n", + " verbose=True,\n", + " sample_weight=puf_combined.weights,\n", + ")\n", + "\n", + "cps_financial_predictions = income_from_demographics.predict(\n", + " cps_demographics[DEMOGRAPHIC_VARIABLES],\n", + " verbose=True,\n", + " mean_quantile=[0.9] + [0.5] * (len(FINANCIAL_VARIABLES) - 1),\n", + ")\n", + "cps_imputed = pd.concat([cps_demographics, cps_financial_predictions], axis=1)\n", + "cps_imputed = MicroDataFrame(\n", + " cps_imputed, weights=sim.calculate(\"tax_unit_weight\").values\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "from fiscalsim_us import Microsimulation\n", + "\n", + "sim = Microsimulation(dataset=\"cps_2023\")\n", + "person_df = pd.DataFrame(\n", + " dict(\n", + " person_id=sim.calculate(\"person_id\").values,\n", + " tax_unit_id=sim.calculate(\"person_tax_unit_id\").values,\n", + " )\n", + ")\n", + "\n", + "person_is_tax_filer_head = sim.calculate(\"is_tax_unit_head\").values\n", + "\n", + "for variable in FINANCIAL_VARIABLES:\n", + " cps_original_value = sim.calculate(variable).values\n", + " cps_tax_unit_original_total = sim.map_result(\n", + " sim.map_result(cps_original_value, \"person\", \"tax_unit\"),\n", + " \"tax_unit\",\n", + " \"person\",\n", + " )\n", + " cps_share_of_tax_unit_original_total = (\n", + " cps_original_value / cps_tax_unit_original_total\n", + " )\n", + " cps_share_of_tax_unit_original_total = np.where(\n", + " np.isnan(cps_share_of_tax_unit_original_total),\n", + " person_is_tax_filer_head,\n", + " cps_share_of_tax_unit_original_total,\n", + " )\n", + " mapped_down_imputed_values = sim.map_result(\n", + " cps_imputed[variable].values, \"tax_unit\", \"person\"\n", + " )\n", + " person_df[variable] = (\n", + " cps_share_of_tax_unit_original_total * mapped_down_imputed_values\n", + " )\n", + "\n", + "person_df = person_df.fillna(0)\n", + "person_df.to_csv(\n", + " \"puf_imputed_cps_person.csv.gz\", index=False, compression=\"gzip\"\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/puf_imputation.py b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/puf_imputation.py new file mode 100644 index 000000000..114c71713 --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/puf_imputation.py @@ -0,0 +1,169 @@ +import streamlit as st + +st.set_page_config(layout="wide") + +st.title("PUF imputation") + +import pandas as pd +import numpy as np + +puf = pd.read_csv("~/Downloads/puf_2015.csv") +demographics = pd.read_csv("~/Downloads/demographics_2015.csv") + +# Variables to match on without demographics: +# - Filing status +# - Adult dependents + +from fiscalsim_us import Microsimulation + +simulation = Microsimulation() + +cps_data = simulation.calculate_dataframe( + [ + # Variables to match on. + "filing_status", + "tax_unit_count_dependents", + "tax_unit_children", + "people", + ] +) + +# Apply renames as computations. +# Exemptions: The IRS caps at 3 per type in the PUF. +EXEMPTION_CAP = 3 +# XOCAH: Exemptions for Children Living at Home +cps_data["XOCAH"] = np.minimum(cps_data.tax_unit_children, EXEMPTION_CAP) + +# XOODEP: Exemptions for Other Dependents. +cps_data["XOODEP"] = np.minimum( + cps_data.tax_unit_count_dependents - cps_data.tax_unit_children, + EXEMPTION_CAP, +) + +RENAMES = dict( + filing_status={ + "SINGLE": 1, + "JOINT": 2, + "WIDOW": 2, + "SEPARATE": 3, + "HEAD_OF_HOUSEHOLD": 4, + } +) + +cps_data["MARS"] = cps_data.filing_status.replace(RENAMES["filing_status"]) + +cps_data["XTOT"] = cps_data.people + +cps_data = cps_data[["MARS", "XOCAH", "XOODEP"]] + +INPUT_VARIABLES = ["MARS", "XOCAH", "XOODEP"] + +OUTPUT_VARIABLES = [ + "E00200", # Salaries and wages + "E00300", # Interest received + "E00400", # Tax-exempt interest income + "E00600", # Dividends included in AGI + "E00650", # Qualified Dividends + "E00700", # State income tax refunds + "E00800", # Alimony received + "E00900", # Business or profession (Schedule C) net profit/loss (+/-) + "E01000", # Net capital gain or loss (+/-) + "E01100", # Capital gain distributions reported on Form 1040 + "E01200", # Other gains (or loss) (+/-) + "E01400", # Taxable IRA distribution + "E01500", # Total pensions and annuities received + "E01700", # Pensions and annuities included in AGI + "E02000", # Schedule E net income or loss (+/-) + "E02100", # Schedule F net profit/loss (+/-) + "E02300", # Unemployment compensation in AGI + "E02400", # Gross Social Security benefits + "E02500", # Social Security benefits in AGI +] + +puf_data = puf[INPUT_VARIABLES + OUTPUT_VARIABLES] + +puf_data = puf_data[puf_data.MARS != 0] + +st.subheader("Training data") + +with st.expander("PUF training data"): + st.dataframe(puf_data) + +with st.expander("CPS data in PUF format for imputation"): + st.dataframe(cps_data) + +from survey_enhance import Imputation + + +@st.cache_resource +def load_model(): + IMPUTE = False + + if IMPUTE: + income = Imputation() + income.train( + puf_data[INPUT_VARIABLES], + puf_data[OUTPUT_VARIABLES], + num_trees=100, + ) + income.save("income.pkl") + else: + income = Imputation.load("income.pkl") + + return income + + +income = load_model() + +# cps_imputation_predictions = income.predict(cps_data[INPUT_VARIABLES]) + +# imputed_cps = pd.concat([cps_data.copy(), cps_imputation_predictions], axis=1) + +st.subheader("Household estimator") + +col1, col2 = st.columns(2) + +with col1: + mars = st.selectbox( + "MARS", ["SINGLE", "JOINT", "WIDOW", "SEPARATE", "HEAD_OF_HOUSEHOLD"] + ) + child_dependents = st.number_input( + "Child dependents", min_value=0, max_value=10, value=0 + ) + adult_dependents = st.number_input( + "Adult dependents", min_value=0, max_value=10, value=0 + ) + + +def get_predictions(input_data, num_predictions): + predictions = [] + for step in range(num_predictions): + predictions.append(income.predict(input_data)) + + prediction_df = pd.concat(predictions) + return prediction_df + + +with col2: + mars = RENAMES["filing_status"][mars] + + progress_bar = st.progress(0) + prediction_df = get_predictions( + [[mars, child_dependents, adult_dependents]], 100 + ) + + import plotly.express as px + + variable = st.selectbox("Variable", OUTPUT_VARIABLES) + + distribution = px.histogram( + prediction_df[variable], nbins=300 + ).update_layout( + title=f"{variable} distribution", + xaxis_title=variable, + yaxis_title="Count", + xaxis_tickformat="$", + showlegend=False, + ) + + st.plotly_chart(distribution) diff --git a/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/test.ipynb b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/test.ipynb new file mode 100644 index 000000000..3d8fb532c --- /dev/null +++ b/fiscalsim_us/data/datasets/cps/enhanced_cps/tmp/test.ipynb @@ -0,0 +1,2632 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "from fiscalsim_us import Microsimulation\n", + "import pandas as pd\n", + "from microdf import MicroDataFrame\n", + "\n", + "cps_sim = Microsimulation(dataset=\"cps_2023\")\n", + "enhanced_cps_sim = Microsimulation(dataset=\"enhanced_cps\")\n", + "\n", + "puf = MicroDataFrame(\n", + " pd.read_csv(\"puf_full_demographics.csv.gz\"), weights=\"decimal_weight\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "hovertemplate": "Source=CPS
Band=%{x}
Number of returns error=%{y}", + "legendgroup": "CPS", + "marker": { + "color": "#BDBDBD", + "pattern": { + "shape": "" + } + }, + "name": "CPS", + "offsetgroup": "CPS", + "orientation": "v", + "showlegend": true, + "textposition": "auto", + "type": "bar", + "x": [ + "1-5,000", + "5,000-10,000", + "10,000-15,000", + "15,000-20,000", + "20,000-25,000", + "25,000-30,000", + "30,000-40,000", + "40,000-50,000", + "50,000-75,000", + "75,000-100,000", + "100,000-200,000", + "200,000-500,000", + "500,000-1,000,000", + "1,000,000-1,500,000", + "1,500,000-2,000,000", + "2,000,000-5,000,000", + "5,000,000-10,000,000", + "10,000,000-inf" + ], + "xaxis": "x", + "y": [ + 0.4643912757857782, + -0.4372391912268059, + -0.40979509421078786, + -0.3142389356287413, + -0.19695705472557667, + -0.11833826287845839, + -0.0900709953083616, + -0.01715715160086906, + 0.09216943040445402, + 0.07009879141081843, + 0.24482670620753244, + 0.3871547096148533, + 0.023546162570253992, + 0.8486782321871176, + -0.7080954550234476, + -0.8359663616304394, + -1, + -1 + ], + "yaxis": "y" + }, + { + "alignmentgroup": "True", + "hovertemplate": "Source=Enhanced CPS
Band=%{x}
Number of returns error=%{y}", + "legendgroup": "Enhanced CPS", + "marker": { + "color": "#2C6496", + "pattern": { + "shape": "" + } + }, + "name": "Enhanced CPS", + "offsetgroup": "Enhanced CPS", + "orientation": "v", + "showlegend": true, + "textposition": "auto", + "type": "bar", + "x": [ + "1-5,000", + "5,000-10,000", + "10,000-15,000", + "15,000-20,000", + "20,000-25,000", + "25,000-30,000", + "30,000-40,000", + "40,000-50,000", + "50,000-75,000", + "75,000-100,000", + "100,000-200,000", + "200,000-500,000", + "500,000-1,000,000", + "1,000,000-1,500,000", + "1,500,000-2,000,000", + "2,000,000-5,000,000", + "5,000,000-10,000,000", + "10,000,000-inf" + ], + "xaxis": "x", + "y": [ + 0.5646760123443657, + -0.2549641161809797, + -0.17856401107333586, + 0.043024758239233796, + 0.05644263497329316, + 0.14870520465663173, + 0.05935522862388565, + 0.05707255683736734, + 0.02209538949664913, + 0.04827309956742831, + 0.018980852840265516, + 0.08869318285328309, + 0.24474302900523837, + 0.7171264543235345, + 0.7837755176617811, + 0.456774538428141, + 0.5253291704381582, + 1.6260324164659843 + ], + "yaxis": "y" + }, + { + "alignmentgroup": "True", + "hovertemplate": "Source=PUF (2015)
Band=%{x}
Number of returns error=%{y}", + "legendgroup": "PUF (2015)", + "marker": { + "color": "#616161", + "pattern": { + "shape": "" + } + }, + "name": "PUF (2015)", + "offsetgroup": "PUF (2015)", + "orientation": "v", + "showlegend": true, + "textposition": "auto", + "type": "bar", + "x": [ + "1-5,000", + "5,000-10,000", + "10,000-15,000", + "15,000-20,000", + "20,000-25,000", + "25,000-30,000", + "30,000-40,000", + "40,000-50,000", + "50,000-75,000", + "75,000-100,000", + "100,000-200,000", + "200,000-500,000", + "500,000-1,000,000", + "1,000,000-1,500,000", + "1,500,000-2,000,000", + "2,000,000-5,000,000", + "5,000,000-10,000,000", + "10,000,000-inf" + ], + "xaxis": "x", + "y": [ + -0.018442056220683845, + 0.14732599822632486, + 0.1681961597910715, + 0.1518983727922516, + 0.0412974951263847, + -0.06061021070756567, + -0.09824159919352937, + -0.09881976686197236, + -0.10866606621529307, + -0.10087379131625351, + -0.16873473455655397, + -0.2829217667770839, + -0.2816537975322604, + -0.2747066524864309, + -0.25902132895063035, + -0.2541134617088887, + -0.2781982892498829, + -0.6706938591210114 + ], + "yaxis": "y" + } + ], + "layout": { + "barmode": "group", + "font": { + "color": "black", + "family": "Roboto Serif" + }, + "height": 600, + "images": [ + { + "sizex": 0.2, + "sizey": 0.2, + "source": "https://raw.githubusercontent.com/PolicyEngine/policyengine-app/master/src/images/logos/policyengine/blue.png", + "x": 1, + "xanchor": "right", + "xref": "paper", + "y": -0.15, + "yanchor": "bottom", + "yref": "paper" + } + ], + "legend": { + "title": { + "text": "Source" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "modebar": { + "bgcolor": "rgba(0,0,0,0)", + "color": "rgba(0,0,0,0)" + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Number of returns error by dataset and AGI band" + }, + "width": 800, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Band" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "tickformat": ".0%", + "title": { + "text": "Number of returns error (thousands)" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "parameters = cps_sim.tax_benefit_system.parameters(\"2023-01-01\").calibration\n", + "import numpy as np\n", + "\n", + "agi_thresholds = list(\n", + " parameters.gov.irs.soi.agi.number_of_returns.thresholds\n", + ") + [np.inf]\n", + "num_returns = parameters.gov.irs.soi.agi.number_of_returns.amounts\n", + "\n", + "import plotly.express as px\n", + "\n", + "band_names = []\n", + "sources = []\n", + "values = []\n", + "\n", + "cps_agi = cps_sim.calculate(\"adjusted_gross_income\")\n", + "enhanced_cps_agi = enhanced_cps_sim.calculate(\"adjusted_gross_income\")\n", + "puf_agi = puf.adjusted_gross_income\n", + "for i in range(len(agi_thresholds[:-1])):\n", + " band_name = f\"{agi_thresholds[i]:,.0f}-{agi_thresholds[i+1]:,.0f}\"\n", + "\n", + " band_names.extend([band_name] * 3)\n", + " sources.extend([\"CPS\", \"Enhanced CPS\", \"PUF (2015)\"])\n", + "\n", + " cps_in_band = cps_agi.between(agi_thresholds[i], agi_thresholds[i + 1])\n", + " enhanced_cps_in_band = enhanced_cps_agi.between(\n", + " agi_thresholds[i], agi_thresholds[i + 1]\n", + " )\n", + " puf_in_band = puf_agi.between(agi_thresholds[i], agi_thresholds[i + 1])\n", + " target = num_returns[i]\n", + "\n", + " values.extend(\n", + " [\n", + " cps_agi[cps_in_band].count() / target - 1,\n", + " enhanced_cps_agi[enhanced_cps_in_band].count() / target - 1,\n", + " puf_agi[puf_in_band].count() / target - 1,\n", + " ]\n", + " )\n", + " # values = list(map(abs, values))\n", + "\n", + "df = pd.DataFrame(\n", + " {\"Band\": band_names, \"Source\": sources, \"Number of returns error\": values}\n", + ")\n", + "\n", + "df[\"Number of returns error\"] /= 1\n", + "\n", + "from policyengine_core.charts import format_fig, BLUE, GRAY, DARK_GRAY\n", + "\n", + "fig = px.bar(\n", + " df,\n", + " x=\"Band\",\n", + " y=\"Number of returns error\",\n", + " color=\"Source\",\n", + " barmode=\"group\",\n", + " color_discrete_map={\n", + " \"CPS\": GRAY,\n", + " \"PUF (2015)\": DARK_GRAY,\n", + " \"Enhanced CPS\": BLUE,\n", + " },\n", + ")\n", + "\n", + "fig.update_layout(\n", + " title=\"Number of returns error by dataset and AGI band\",\n", + " yaxis_title=\"Number of returns error (thousands)\",\n", + " yaxis_tickformat=\".0%\",\n", + ")\n", + "\n", + "format_fig(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "alignmentgroup": "True", + "hovertemplate": "Source=CPS
Band=%{x}
Total AGI error=%{y}", + "legendgroup": "CPS", + "marker": { + "color": "#BDBDBD", + "pattern": { + "shape": "" + } + }, + "name": "CPS", + "offsetgroup": "CPS", + "orientation": "v", + "showlegend": true, + "textposition": "auto", + "type": "bar", + "x": [ + "1", + "5,000", + "10,000", + "15,000", + "20,000", + "25,000", + "30,000", + "40,000", + "50,000", + "75,000", + "100,000", + "200,000", + "500,000", + "1,000,000", + "1,500,000", + "2,000,000", + "5,000,000", + "10,000,000" + ], + "xaxis": "x", + "y": [ + -0.245753727894246, + -0.43812285408085616, + -0.41219121191271, + -0.309659454820415, + -0.2023580366985358, + -0.11462539821127582, + -0.09908366604688079, + -0.021592887730219945, + 0.0788382162944079, + 0.062506166668721, + 0.25739757390134566, + 0.3642236728493333, + -0.0009752566672641683, + 0.7492975826021036, + -0.7204851459604381, + -0.8763917385616946, + -1, + -1 + ], + "yaxis": "y" + }, + { + "alignmentgroup": "True", + "hovertemplate": "Source=Enhanced CPS
Band=%{x}
Total AGI error=%{y}", + "legendgroup": "Enhanced CPS", + "marker": { + "color": "#2C6496", + "pattern": { + "shape": "" + } + }, + "name": "Enhanced CPS", + "offsetgroup": "Enhanced CPS", + "orientation": "v", + "showlegend": true, + "textposition": "auto", + "type": "bar", + "x": [ + "1", + "5,000", + "10,000", + "15,000", + "20,000", + "25,000", + "30,000", + "40,000", + "50,000", + "75,000", + "100,000", + "200,000", + "500,000", + "1,000,000", + "1,500,000", + "2,000,000", + "5,000,000", + "10,000,000" + ], + "xaxis": "x", + "y": [ + -0.06899866378368291, + -0.24973945675360043, + -0.1793780034898388, + 0.04879626233793988, + 0.05030723216442934, + 0.15194466670492934, + 0.04885532514320645, + 0.05131682310688279, + 0.013135621277317489, + 0.04224052300371128, + 0.031126555308844894, + 0.06170571997986718, + 0.21327660717951158, + 0.6129996367167359, + 0.754618508640736, + 0.2970804160862588, + 0.4361290337505914, + -0.0047557499171703155 + ], + "yaxis": "y" + }, + { + "alignmentgroup": "True", + "hovertemplate": "Source=PUF (2015)
Band=%{x}
Total AGI error=%{y}", + "legendgroup": "PUF (2015)", + "marker": { + "color": "#616161", + "pattern": { + "shape": "" + } + }, + "name": "PUF (2015)", + "offsetgroup": "PUF (2015)", + "orientation": "v", + "showlegend": true, + "textposition": "auto", + "type": "bar", + "x": [ + "1", + "5,000", + "10,000", + "15,000", + "20,000", + "25,000", + "30,000", + "40,000", + "50,000", + "75,000", + "100,000", + "200,000", + "500,000", + "1,000,000", + "1,500,000", + "2,000,000", + "5,000,000", + "10,000,000" + ], + "xaxis": "x", + "y": [ + 0.0918729912575813, + 0.15966635528662554, + 0.17497437529616033, + 0.1489978618238521, + 0.03949314086104527, + -0.06131577105784858, + -0.09765291036836021, + -0.09894253249526808, + -0.10786694106013717, + -0.1015164188511628, + -0.17608925917883933, + -0.2888103538915988, + -0.2782545590305783, + -0.2737538638947349, + -0.2597191169365899, + -0.25673331585095105, + -0.2832942617250771, + -0.7624587165892706 + ], + "yaxis": "y" + } + ], + "layout": { + "barmode": "group", + "font": { + "color": "black", + "family": "Roboto Serif" + }, + "height": 600, + "images": [ + { + "sizex": 0.2, + "sizey": 0.2, + "source": "https://raw.githubusercontent.com/PolicyEngine/policyengine-app/master/src/images/logos/policyengine/blue.png", + "x": 1, + "xanchor": "right", + "xref": "paper", + "y": -0.15, + "yanchor": "bottom", + "yref": "paper" + } + ], + "legend": { + "title": { + "text": "Source" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "modebar": { + "bgcolor": "rgba(0,0,0,0)", + "color": "rgba(0,0,0,0)" + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "white", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "#C8D4E3", + "linecolor": "#C8D4E3", + "minorgridcolor": "#C8D4E3", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "white", + "showlakes": true, + "showland": true, + "subunitcolor": "#C8D4E3" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "white", + "polar": { + "angularaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + }, + "bgcolor": "white", + "radialaxis": { + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "yaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + }, + "zaxis": { + "backgroundcolor": "white", + "gridcolor": "#DFE8F3", + "gridwidth": 2, + "linecolor": "#EBF0F8", + "showbackground": true, + "ticks": "", + "zerolinecolor": "#EBF0F8" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "baxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + }, + "bgcolor": "white", + "caxis": { + "gridcolor": "#DFE8F3", + "linecolor": "#A2B1C6", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "#EBF0F8", + "linecolor": "#EBF0F8", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "#EBF0F8", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Total AGI error by dataset and AGI band" + }, + "width": 800, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Band" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "tickformat": "+.0%", + "title": { + "text": "Total AGI error ($bn)" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "parameters = cps_sim.tax_benefit_system.parameters(\"2023-01-01\").calibration\n", + "import numpy as np\n", + "\n", + "agi_thresholds = list(parameters.gov.irs.soi.agi.total_agi.thresholds) + [\n", + " np.inf\n", + "]\n", + "num_returns = parameters.gov.irs.soi.agi.total_agi.amounts\n", + "\n", + "import plotly.express as px\n", + "\n", + "band_names = []\n", + "sources = []\n", + "values = []\n", + "\n", + "cps_agi = cps_sim.calculate(\"adjusted_gross_income\")\n", + "enhanced_cps_agi = enhanced_cps_sim.calculate(\"adjusted_gross_income\")\n", + "puf_agi = puf.adjusted_gross_income\n", + "for i in range(len(agi_thresholds[:-1])):\n", + " band_name = f\"{agi_thresholds[i]:,.0f}\"\n", + "\n", + " band_names.extend([band_name] * 3)\n", + " sources.extend([\"CPS\", \"Enhanced CPS\", \"PUF (2015)\"])\n", + "\n", + " cps_in_band = cps_agi.between(agi_thresholds[i], agi_thresholds[i + 1])\n", + " enhanced_cps_in_band = enhanced_cps_agi.between(\n", + " agi_thresholds[i], agi_thresholds[i + 1]\n", + " )\n", + " puf_in_band = puf_agi.between(agi_thresholds[i], agi_thresholds[i + 1])\n", + " target = num_returns[i]\n", + "\n", + " values.extend(\n", + " [\n", + " cps_agi[cps_in_band].sum() / target - 1,\n", + " enhanced_cps_agi[enhanced_cps_in_band].sum() / target - 1,\n", + " puf_agi[puf_in_band].sum() / target - 1,\n", + " ]\n", + " )\n", + "\n", + " # values = list(map(abs, values))\n", + "\n", + "df = pd.DataFrame(\n", + " {\"Band\": band_names, \"Source\": sources, \"Total AGI error\": values}\n", + ")\n", + "\n", + "df[\"Total AGI error\"] /= 1\n", + "\n", + "from policyengine_core.charts import format_fig, BLUE, GRAY, DARK_GRAY\n", + "\n", + "fig = px.bar(\n", + " df,\n", + " x=\"Band\",\n", + " y=\"Total AGI error\",\n", + " color=\"Source\",\n", + " barmode=\"group\",\n", + " color_discrete_map={\n", + " \"CPS\": GRAY,\n", + " \"PUF (2015)\": DARK_GRAY,\n", + " \"Enhanced CPS\": BLUE,\n", + " },\n", + ")\n", + "\n", + "fig.update_layout(\n", + " title=\"Total AGI error by dataset and AGI band\",\n", + " yaxis_title=\"Total AGI error ($bn)\",\n", + " yaxis_tickformat=\"+.0%\",\n", + ")\n", + "\n", + "format_fig(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from fiscalsim_us import Microsimulation\n", + "from policyengine_core.reforms import Reform\n", + "from policyengine_core.periods import instant\n", + "import pandas as pd\n", + "\n", + "\n", + "def modify_parameters(parameters):\n", + " parameters.gov.irs.income.bracket.rates.children[\"7\"].update(\n", + " start=instant(\"2023-01-01\"), stop=instant(\"2028-12-31\"), value=0.5\n", + " )\n", + " return parameters\n", + "\n", + "\n", + "class reform(Reform):\n", + " def apply(self):\n", + " self.modify_parameters(modify_parameters)\n", + "\n", + "\n", + "baseline = Microsimulation()\n", + "reformed = Microsimulation(reform=reform)\n", + "HOUSEHOLD_VARIABLES = [\n", + " \"person_id\",\n", + " \"household_id\",\n", + " \"age\",\n", + " \"household_net_income\",\n", + " \"adjusted_gross_income\",\n", + " \"employment_income\",\n", + " \"household_income_decile\",\n", + " \"in_poverty\",\n", + " \"household_tax\",\n", + " \"household_benefits\",\n", + "]\n", + "baseline_person_df = baseline.calculate_dataframe(\n", + " HOUSEHOLD_VARIABLES, 2023\n", + ").astype(float)\n", + "reformed_person_df = reformed.calculate_dataframe(\n", + " HOUSEHOLD_VARIABLES, 2023\n", + ").astype(float)\n", + "difference_person_df = reformed_person_df - baseline_person_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "HOUSEHOLD_VARIABLES = [\n", + " \"person_id\",\n", + " \"household_id\",\n", + " \"age\",\n", + " \"household_net_income\",\n", + " \"adjusted_gross_income\",\n", + " \"employment_income\",\n", + " \"household_income_decile\",\n", + " \"in_poverty\",\n", + " \"household_tax\",\n", + " \"household_benefits\",\n", + "]\n", + "baseline_person_df = baseline.calculate_dataframe(\n", + " HOUSEHOLD_VARIABLES, 2023\n", + ").astype(float)\n", + "reformed_person_df = reformed.calculate_dataframe(\n", + " HOUSEHOLD_VARIABLES, 2023\n", + ").astype(float)\n", + "difference_person_df = reformed_person_df - baseline_person_df\n", + "\n", + "baseline_person_df[\"gain\"] = difference_person_df[\"household_net_income\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
person_idhousehold_idagehousehold_net_incomehousehold_income_decilein_povertyhousehold_taxhousehold_benefitsgain
146135100000401.0100000000.052.0-861366.750001.01.02.964205e+060.0-770664.500
146136100000402.0100000000.051.0-861366.750001.01.02.964205e+060.0-770664.500
146138100001601.0100000016.065.0-708258.250001.01.01.596674e+0643562.0-389161.750
146139100001602.0100000016.068.0-708258.250001.01.01.596674e+0643562.0-389161.750
146144100002201.0100000024.063.0-681460.750001.01.01.072878e+060.0-233571.750
..............................
292105108893004.0100088928.028.0-500629.750001.01.01.104709e+0640867.0-299445.000
292106108893005.0100088928.085.0-500629.750001.01.01.104709e+0640867.0-299445.000
292107108893006.0100088928.075.0-500629.750001.00.01.104709e+0640867.0-299445.000
292114108893401.0100088936.058.0-32869.343751.01.04.075813e+050.0-65146.625
292115108893402.0100088936.055.0-32869.343751.01.04.075813e+050.0-65146.625
\n", + "

8834 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " person_id household_id age household_net_income \\\n", + "146135 100000401.0 100000000.0 52.0 -861366.75000 \n", + "146136 100000402.0 100000000.0 51.0 -861366.75000 \n", + "146138 100001601.0 100000016.0 65.0 -708258.25000 \n", + "146139 100001602.0 100000016.0 68.0 -708258.25000 \n", + "146144 100002201.0 100000024.0 63.0 -681460.75000 \n", + "... ... ... ... ... \n", + "292105 108893004.0 100088928.0 28.0 -500629.75000 \n", + "292106 108893005.0 100088928.0 85.0 -500629.75000 \n", + "292107 108893006.0 100088928.0 75.0 -500629.75000 \n", + "292114 108893401.0 100088936.0 58.0 -32869.34375 \n", + "292115 108893402.0 100088936.0 55.0 -32869.34375 \n", + "\n", + " household_income_decile in_poverty household_tax \\\n", + "146135 1.0 1.0 2.964205e+06 \n", + "146136 1.0 1.0 2.964205e+06 \n", + "146138 1.0 1.0 1.596674e+06 \n", + "146139 1.0 1.0 1.596674e+06 \n", + "146144 1.0 1.0 1.072878e+06 \n", + "... ... ... ... \n", + "292105 1.0 1.0 1.104709e+06 \n", + "292106 1.0 1.0 1.104709e+06 \n", + "292107 1.0 0.0 1.104709e+06 \n", + "292114 1.0 1.0 4.075813e+05 \n", + "292115 1.0 1.0 4.075813e+05 \n", + "\n", + " household_benefits gain \n", + "146135 0.0 -770664.500 \n", + "146136 0.0 -770664.500 \n", + "146138 43562.0 -389161.750 \n", + "146139 43562.0 -389161.750 \n", + "146144 0.0 -233571.750 \n", + "... ... ... \n", + "292105 40867.0 -299445.000 \n", + "292106 40867.0 -299445.000 \n", + "292107 40867.0 -299445.000 \n", + "292114 0.0 -65146.625 \n", + "292115 0.0 -65146.625 \n", + "\n", + "[8834 rows x 9 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "baseline_person_df[baseline_person_df.gain < 0][\n", + " baseline_person_df.household_net_income < 0\n", + "]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/fiscalsim_us/data/datasets/cps/raw_cps.py b/fiscalsim_us/data/datasets/cps/raw_cps.py index 3809b2e7f..9e5ad7fa6 100644 --- a/fiscalsim_us/data/datasets/cps/raw_cps.py +++ b/fiscalsim_us/data/datasets/cps/raw_cps.py @@ -1,219 +1,228 @@ -from io import BytesIO -from zipfile import ZipFile -from policyengine_core.data import Dataset -import pandas as pd -import requests -from tqdm import tqdm -from fiscalsim_us.data.storage import STORAGE_FOLDER - -TAX_UNIT_COLUMNS = [ - "ACTC_CRD", - "AGI", - "CTC_CRD", - "EIT_CRED", - "FEDTAX_AC", - "FEDTAX_BC", - "MARG_TAX", - "STATETAX_A", - "STATETAX_B", - "TAX_INC", -] - -SPM_UNIT_COLUMNS = [ - "ACTC", - "CAPHOUSESUB", - "CAPWKCCXPNS", - "CHILDCAREXPNS", - "CHILDSUPPD", - "EITC", - "ENGVAL", - "EQUIVSCALE", - "FAMTYPE", - "FEDTAX", - "FEDTAXBC", - "FICA", - "GEOADJ", - "HAGE", - "HHISP", - "HMARITALSTATUS", - "HRACE", - "MEDXPNS", - "NUMADULTS", - "NUMKIDS", - "NUMPER", - "POOR", - "POVTHRESHOLD", - "RESOURCES", - "SCHLUNCH", - "SNAPSUB", - "STTAX", - "TENMORTSTATUS", - "TOTVAL", - "WCOHABIT", - "WEIGHT", - "WFOSTER22", - "WICVAL", - "WKXPNS", - "WNEWHEAD", - "WNEWPARENT", - "WUI_LT15", - "ID", -] -SPM_UNIT_COLUMNS = ["SPM_" + column for column in SPM_UNIT_COLUMNS] -PERSON_COLUMNS = [ - "PH_SEQ", - "PF_SEQ", - "P_SEQ", - "TAX_ID", - "SPM_ID", - "A_FNLWGT", - "A_LINENO", - "A_SPOUSE", - "A_AGE", - "A_SEX", - "PEDISEYE", - "MRK", - "WSAL_VAL", - "INT_VAL", - "SEMP_VAL", - "FRSE_VAL", - "DIV_VAL", - "RNT_VAL", - "SS_VAL", - "UC_VAL", - "ANN_VAL", - "PNSN_VAL", - "OI_OFF", - "OI_VAL", - "CSP_VAL", - "PAW_VAL", - "SSI_VAL", - "RETCB_VAL", - "CAP_VAL", - "WICYN", - "VET_VAL", - "WC_VAL", - "DIS_VAL1", - "DIS_VAL2", - "CHSP_VAL", - "PHIP_VAL", - "MOOP", - "PEDISDRS", - "PEDISEAR", - "PEDISOUT", - "PEDISPHY", - "PEDISREM", - "PEPAR1", - "PEPAR2", - "DIS_SC1", - "DIS_SC2", - "PRDTRACE", - "PRDTHSP", -] - - -class RawCPS(Dataset): - name = "raw_cps" - label = "Raw CPS" - time_period = None - data_format = Dataset.TABLES - - def generate(self) -> pd.DataFrame: - """Generates the raw CPS dataset.""" - # Files are named for a year after the year the survey represents. - # For example, the 2020 CPS was administered in March 2021, so it's - # named 2021. - file_year = int(self.time_period) + 1 - file_year_code = str(file_year)[-2:] - - CPS_URL_BY_YEAR = { - 2020: "https://www2.census.gov/programs-surveys/cps/datasets/2021/march/asecpub21csv.zip", - 2021: "https://www2.census.gov/programs-surveys/cps/datasets/2022/march/asecpub22csv.zip", - } - - if self.time_period not in CPS_URL_BY_YEAR: - raise ValueError( - f"No raw CPS data URL known for year {self.time_period}." - ) - - url = CPS_URL_BY_YEAR[self.time_period] - - response = requests.get(url, stream=True) - total_size_in_bytes = int( - response.headers.get("content-length", 200e6) - ) - progress_bar = tqdm( - total=total_size_in_bytes, - unit="iB", - unit_scale=True, - desc="Downloading ASEC", - ) - if response.status_code == 404: - raise FileNotFoundError( - "Received a 404 response when fetching the data." - ) - try: - with BytesIO() as file, pd.HDFStore( - self.file_path, mode="w" - ) as storage: - content_length_actual = 0 - for data in response.iter_content(int(1e6)): - progress_bar.update(len(data)) - content_length_actual += len(data) - file.write(data) - progress_bar.set_description("Downloaded ASEC") - progress_bar.total = content_length_actual - progress_bar.close() - zipfile = ZipFile(file) - with zipfile.open(f"pppub{file_year_code}.csv") as f: - storage["person"] = pd.read_csv( - f, - usecols=PERSON_COLUMNS - + SPM_UNIT_COLUMNS - + TAX_UNIT_COLUMNS, - ).fillna(0) - person = storage["person"] - with zipfile.open(f"ffpub{file_year_code}.csv") as f: - person_family_id = person.PH_SEQ * 10 + person.PF_SEQ - family = pd.read_csv(f).fillna(0) - family_id = family.FH_SEQ * 10 + family.FFPOS - family = family[family_id.isin(person_family_id)] - storage["family"] = family - with zipfile.open(f"hhpub{file_year_code}.csv") as f: - person_household_id = person.PH_SEQ - household = pd.read_csv(f).fillna(0) - household_id = household.H_SEQ - household = household[ - household_id.isin(person_household_id) - ] - storage["household"] = household - storage["tax_unit"] = RawCPS._create_tax_unit_table(person) - storage["spm_unit"] = RawCPS._create_spm_unit_table(person) - except Exception as e: - raise ValueError( - f"Attempted to extract and save the CSV files, but encountered an error: {e} (removed the intermediate dataset)." - ) - - @staticmethod - def _create_tax_unit_table(person: pd.DataFrame) -> pd.DataFrame: - tax_unit_df = person[TAX_UNIT_COLUMNS].groupby(person.TAX_ID).sum() - tax_unit_df["TAX_ID"] = tax_unit_df.index - return tax_unit_df - - @staticmethod - def _create_spm_unit_table(person: pd.DataFrame) -> pd.DataFrame: - return person[SPM_UNIT_COLUMNS].groupby(person.SPM_ID).first() - - -class RawCPS_2020(RawCPS): - time_period = 2020 - name = "raw_cps_2020" - label = "Raw CPS 2020" - file_path = STORAGE_FOLDER / "raw_cps_2020.h5" - - -class RawCPS_2021(RawCPS): - time_period = 2021 - name = "raw_cps_2021" - label = "Raw CPS 2021" - file_path = STORAGE_FOLDER / "raw_cps_2021.h5" +from io import BytesIO +from zipfile import ZipFile +from policyengine_core.data import Dataset +import pandas as pd +import requests +from tqdm import tqdm +from fiscalsim_us.data.storage import STORAGE_FOLDER + +TAX_UNIT_COLUMNS = [ + "ACTC_CRD", + "AGI", + "CTC_CRD", + "EIT_CRED", + "FEDTAX_AC", + "FEDTAX_BC", + "MARG_TAX", + "STATETAX_A", + "STATETAX_B", + "TAX_INC", +] + +SPM_UNIT_COLUMNS = [ + "ACTC", + "CAPHOUSESUB", + "CAPWKCCXPNS", + "CHILDCAREXPNS", + "CHILDSUPPD", + "EITC", + "ENGVAL", + "EQUIVSCALE", + "FAMTYPE", + "FEDTAX", + "FEDTAXBC", + "FICA", + "GEOADJ", + "HAGE", + "HHISP", + "HMARITALSTATUS", + "HRACE", + "MEDXPNS", + "NUMADULTS", + "NUMKIDS", + "NUMPER", + "POOR", + "POVTHRESHOLD", + "RESOURCES", + "SCHLUNCH", + "SNAPSUB", + "STTAX", + "TENMORTSTATUS", + "TOTVAL", + "WCOHABIT", + "WEIGHT", + "WFOSTER22", + "WICVAL", + "WKXPNS", + "WNEWHEAD", + "WNEWPARENT", + "WUI_LT15", + "ID", +] +SPM_UNIT_COLUMNS = ["SPM_" + column for column in SPM_UNIT_COLUMNS] +PERSON_COLUMNS = [ + "PH_SEQ", + "PF_SEQ", + "P_SEQ", + "TAX_ID", + "SPM_ID", + "A_FNLWGT", + "A_LINENO", + "A_SPOUSE", + "A_AGE", + "A_SEX", + "PEDISEYE", + "MRK", + "WSAL_VAL", + "INT_VAL", + "SEMP_VAL", + "FRSE_VAL", + "DIV_VAL", + "RNT_VAL", + "SS_VAL", + "UC_VAL", + "ANN_VAL", + "PNSN_VAL", + "OI_OFF", + "OI_VAL", + "CSP_VAL", + "PAW_VAL", + "SSI_VAL", + "RETCB_VAL", + "CAP_VAL", + "WICYN", + "VET_VAL", + "WC_VAL", + "DIS_VAL1", + "DIS_VAL2", + "CHSP_VAL", + "PHIP_VAL", + "MOOP", + "PEDISDRS", + "PEDISEAR", + "PEDISOUT", + "PEDISPHY", + "PEDISREM", + "PEPAR1", + "PEPAR2", + "DIS_SC1", + "DIS_SC2", + "PRDTRACE", + "PRDTHSP", + "A_MARITL", +] + + +class RawCPS(Dataset): + name = "raw_cps" + label = "Raw CPS" + time_period = None + data_format = Dataset.TABLES + + def generate(self) -> pd.DataFrame: + """Generates the raw CPS dataset.""" + # Files are named for a year after the year the survey represents. + # For example, the 2020 CPS was administered in March 2021, so it's + # named 2021. + file_year = int(self.time_period) + 1 + file_year_code = str(file_year)[-2:] + + CPS_URL_BY_YEAR = { + 2020: "https://www2.census.gov/programs-surveys/cps/datasets/2021/march/asecpub21csv.zip", + 2021: "https://www2.census.gov/programs-surveys/cps/datasets/2022/march/asecpub22csv.zip", + 2022: "https://www2.census.gov/programs-surveys/cps/datasets/2023/march/asecpub23csv.zip", + } + + if self.time_period not in CPS_URL_BY_YEAR: + raise ValueError( + f"No raw CPS data URL known for year {self.time_period}." + ) + + url = CPS_URL_BY_YEAR[self.time_period] + + response = requests.get(url, stream=True) + total_size_in_bytes = int( + response.headers.get("content-length", 200e6) + ) + progress_bar = tqdm( + total=total_size_in_bytes, + unit="iB", + unit_scale=True, + desc="Downloading ASEC", + ) + if response.status_code == 404: + raise FileNotFoundError( + "Received a 404 response when fetching the data." + ) + try: + with BytesIO() as file, pd.HDFStore( + self.file_path, mode="w" + ) as storage: + content_length_actual = 0 + for data in response.iter_content(int(1e6)): + progress_bar.update(len(data)) + content_length_actual += len(data) + file.write(data) + progress_bar.set_description("Downloaded ASEC") + progress_bar.total = content_length_actual + progress_bar.close() + zipfile = ZipFile(file) + with zipfile.open(f"pppub{file_year_code}.csv") as f: + storage["person"] = pd.read_csv( + f, + usecols=PERSON_COLUMNS + + SPM_UNIT_COLUMNS + + TAX_UNIT_COLUMNS, + ).fillna(0) + person = storage["person"] + with zipfile.open(f"ffpub{file_year_code}.csv") as f: + person_family_id = person.PH_SEQ * 10 + person.PF_SEQ + family = pd.read_csv(f).fillna(0) + family_id = family.FH_SEQ * 10 + family.FFPOS + family = family[family_id.isin(person_family_id)] + storage["family"] = family + with zipfile.open(f"hhpub{file_year_code}.csv") as f: + person_household_id = person.PH_SEQ + household = pd.read_csv(f).fillna(0) + household_id = household.H_SEQ + household = household[ + household_id.isin(person_household_id) + ] + storage["household"] = household + storage["tax_unit"] = RawCPS._create_tax_unit_table(person) + storage["spm_unit"] = RawCPS._create_spm_unit_table(person) + except Exception as e: + raise ValueError( + f"Attempted to extract and save the CSV files, but encountered an error: {e} (removed the intermediate dataset)." + ) + + @staticmethod + def _create_tax_unit_table(person: pd.DataFrame) -> pd.DataFrame: + tax_unit_df = person[TAX_UNIT_COLUMNS].groupby(person.TAX_ID).sum() + tax_unit_df["TAX_ID"] = tax_unit_df.index + return tax_unit_df + + @staticmethod + def _create_spm_unit_table(person: pd.DataFrame) -> pd.DataFrame: + return person[SPM_UNIT_COLUMNS].groupby(person.SPM_ID).first() + + +class RawCPS_2020(RawCPS): + time_period = 2020 + name = "raw_cps_2020" + label = "Raw CPS 2020" + file_path = STORAGE_FOLDER / "raw_cps_2020.h5" + + +class RawCPS_2021(RawCPS): + time_period = 2021 + name = "raw_cps_2021" + label = "Raw CPS 2021" + file_path = STORAGE_FOLDER / "raw_cps_2021.h5" + + +class RawCPS_2022(RawCPS): + time_period = 2022 + name = "raw_cps_2022" + label = "Raw CPS 2022" + file_path = STORAGE_FOLDER / "raw_cps_2022.h5" diff --git a/fiscalsim_us/data/datasets/poverty_tracker/poverty_tracker.py b/fiscalsim_us/data/datasets/poverty_tracker/poverty_tracker.py new file mode 100644 index 000000000..532cec4dc --- /dev/null +++ b/fiscalsim_us/data/datasets/poverty_tracker/poverty_tracker.py @@ -0,0 +1,210 @@ +from policyengine_core.data import Dataset +from typing import Type +import pandas as pd +from pathlib import Path +from fiscalsim_us.data.storage import STORAGE_FOLDER +import os + + +class PovertyTracker(Dataset): + name = "poverty_tracker" + label = "Poverty Tracker" + data_format = Dataset.ARRAYS + time_period = "2023" + file_path = STORAGE_FOLDER / "poverty_tracker.h5" + + # Fetch the secret URL from the environment variable. + # Replace with a valid URL if running locally. + POVERTY_TRACKER_URL = os.environ.get("POVERTYTRACKER_RAW_URL") + + def generate(self): + household_df = self.load_pt_data() + situations = household_df.apply(get_hh_situtation, axis=1) + + if not self.POVERTY_TRACKER_URL: + raise ValueError( + "The POVERTY_TRACKER_URL environment variable is not set!" + ) + + person_ids = [] + person_group_ids = [] + group_ids = [] + + data = { + "age": [], + "employment_income": [], + } + + current_person_id = 0 + current_group_id = 0 + group_ids = household_df["public_id"].values + for situation in situations: + for person in situation["people"]: + person_ids.append(current_person_id) + person_group_ids.append(group_ids[current_group_id]) + + age = situation["people"][person]["age"] + employment_income = situation["people"][person][ + "employment_income" + ] + + # Clarify why age is sometimes directly in situation["people"][person]["age"] and sometimes in situation["people"][person]["age"][TAX_YEAR_STR] + data["age"].append( + age.get(TAX_YEAR_STR) if isinstance(age, dict) else age + ) + data["employment_income"].append( + employment_income.get(TAX_YEAR_STR) + if isinstance(employment_income, dict) + else employment_income + ) + + current_person_id += 1 + + current_group_id += 1 + + data["in_nyc"] = [True] * len(group_ids) + data["state_name"] = ["NY"] * len(group_ids) + + group_id_names = [ + "tax_unit", + "marital_unit", + "spm_unit", + "household", + "family", + ] + + for group_id_name in group_id_names: + data[group_id_name + "_id"] = group_ids + data["person_" + group_id_name + "_id"] = person_group_ids + + data["person_id"] = person_ids + + self.save_dataset(data) + + def load_pt_data( + self, + url: str = POVERTY_TRACKER_URL, + ) -> pd.DataFrame: + """ + Loads household-level raw PovertyTracker dataset. + """ + # Download raw data from PovertyTracker website. + pt = pd.read_csv(url) + + columns_to_rename = { + # "imp_qearnhd_tc": "hh_head_earnings", # not currently used + # "imp_qearnsp_tc": "spouse_earnings", # not currently used + "imp_qage_tc": "age", + "qopmres": "income", + } + + return pt.rename(columns=columns_to_rename) + + +def extract_hh_data(observation: pd.Series) -> dict: + """ + Takes in a row of the PovertyTracker dataframe and extracts + information on relatives living with the household head. + """ + relatives_dict = {} + + # If someone(s) else lives with respondent, q16a4 = 1. + if observation["q16a4"] != 1: + return relatives_dict + + var_number = 1 + relative_var = "q16a4_rel" + str(var_number) + dependent_counter = 1 + while pd.notnull(relative_var) and var_number < 10: + if observation[relative_var] == 1: # Spouse + partner_age = observation[f"q16a4_age{var_number}_tc"] + relatives_dict["your partner"] = { + "age": partner_age if partner_age != 970 else 40 + } + + elif observation[relative_var] in [ + 3, + 4, + 5, + 7, + ]: # child, stepchild, grandchild, or foster child + relative_age = observation[f"q16a4_age{var_number}_tc"] + if relative_age < 18: # assume only children are dependents + relatives_dict[f"dependent{dependent_counter}"] = { + "age": relative_age if relative_age != 970 else 40 + } + dependent_counter += 1 + + var_number += 1 + + return relatives_dict + + +TAX_YEAR = 2023 +TAX_YEAR_STR = str(TAX_YEAR) + + +def get_hh_situtation(row: pd.Series): + situation_dict = { + "people": { + "you": { + "age": {TAX_YEAR_STR: row["age"]}, + "employment_income": {TAX_YEAR_STR: row["income"]}, + } + }, + "families": {"your family": {"members": ["you"]}}, + "marital_units": {}, + "tax_units": {"your tax unit": {"members": ["you"]}}, + "spm_units": { + "your household": { + "members": [ + "you", + # "your partner", + # "your first dependent" + ] + } + }, + "households": { + "your household": { + "members": ["you"], + "state_name": {TAX_YEAR_STR: "NY"}, + "in_nyc": True, + } + }, + } + + hh_data = extract_hh_data(row) + situation_dict["people"].update(hh_data) + + # Add spouse and dependents to families, marital_units, tax_units, spm_units + family_members = ["you"] + marital_unit_members = ["you"] + for member, member_data in hh_data.items(): + family_members.append(member) + marital_unit_members.append(member) + situation_dict["people"][member].update( + {"employment_income": {TAX_YEAR_STR: 0}} + ) + situation_dict["tax_units"]["your tax unit"]["members"].append(member) + situation_dict["spm_units"]["your household"]["members"].append(member) + situation_dict["households"]["your household"]["members"].append( + member + ) + + # marital_unit_id = "{}'s marital unit".format(member) + # situation_dict["marital_units"][marital_unit_id] = { + # "members": [member] + # } + + # if member.startswith("dependent"): + # situation_dict["marital_units"][marital_unit_id]["marital_unit_id"] = { + # TAX_YEAR_STR: dependent_counter + # } + # dependent_counter += 1 + + situation_dict["families"]["your family"]["members"] = family_members + situation_dict["marital_units"]["your marital unit"] = { + "members": marital_unit_members + } + + return situation_dict diff --git a/fiscalsim_us/modelled_policies.yaml b/fiscalsim_us/modelled_policies.yaml index 0f440b644..05796aaca 100644 --- a/fiscalsim_us/modelled_policies.yaml +++ b/fiscalsim_us/modelled_policies.yaml @@ -14,15 +14,31 @@ filtered: modelled: - California state income tax - California TANF + - California's Clean Vehicle Rebate Project + CO: + modelled: + - Colorado state income tax + - Colorado Old Age Pension + - Colorado State Supplement + - Colorado TANF DC: modelled: + - District of Columbia income tax - District of Columbia TANF + IA: + modelled: + - Iowa state income tax not_modelled: - - District of Columbia income tax + - Iowa TANF IL: modelled: - Illinois state income tax - Illinois TANF + IN: + modelled: + - Indiana state income tax + not_modelled: + - Indiana TANF KS: modelled: - Kansas state income tax @@ -48,6 +64,11 @@ filtered: - Missouri state income tax not_modelled: - Missouri TANF + NC: + modelled: + - North Carolina state income tax + not_modelled: + - North Carolina TANF ND: modelled: - North Dakota state income tax @@ -58,10 +79,30 @@ filtered: - Nebraska state income tax not_modelled: - Nebraska TANF + NH: + modelled: + - New Hampshire state income tax + not_modelled: + - New Hampshire TANF + NJ: + modelled: + - New Jersey state income tax + not_modelled: + - New Jersey TANF + NM: + modelled: + - New Mexico state income tax + not_modelled: + - New Mexico TANF NY: modelled: - - New York state income tax + - New York state and city income tax - New York TANF + OK: + modelled: + - Oklahoma state income tax + not_modelled: + - Oklahoma TANF OR: modelled: - Oregon state income tax @@ -72,13 +113,18 @@ filtered: - Pennsylvania state income tax not_modelled: - Pennsylvania TANF + UT: + modelled: + - Utah state income tax + not_modelled: + - Utah TANF WA: modelled: - Washington state income tax not_modelled: - Washington TANF - UT: + WI: modelled: - - Utah state income tax + - Wisconsin state income tax not_modelled: - - Utah TANF + - Wisconsin TANF diff --git a/fiscalsim_us/parameters/calibration/gov/cbo/income_by_source.yaml b/fiscalsim_us/parameters/calibration/gov/cbo/income_by_source.yaml new file mode 100644 index 000000000..5dec4182b --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/cbo/income_by_source.yaml @@ -0,0 +1,173 @@ +description: Historical data and projections of detailed adjusted gross income (AGI) by source (2019-2033) +metadata: + unit: currency-USD + reference: + - title: The Budget and Economic Outlook 2023 to 2033 | Congressional Budget Office + # Revenue Projections, by Category > Feb 2023 > Sheet 3.Individual Income Tax Details + href: https://www.cbo.gov/publication/58848 +adjusted_gross_income: + metadata: + label: Total AGI + values: + 2019-01-01: 11_962_000_000_000 + 2020-01-01: 12_650_000_000_000 + 2021-01-01: 14_758_000_000_000 + 2022-01-01: 15_104_000_000_000 + 2023-01-01: 15_514_000_000_000 + 2024-01-01: 16_081_000_000_000 + 2025-01-01: 16_770_000_000_000 + 2026-01-01: 17_463_000_000_000 + 2027-01-01: 18_187_000_000_000 + 2028-01-01: 18_858_000_000_000 + 2029-01-01: 19_496_000_000_000 + 2030-01-01: 20_233_000_000_000 + 2031-01-01: 20_983_000_000_000 + 2032-01-01: 21_767_000_000_000 + 2033-01-01: 22_564_000_000_000 +employment_income: + metadata: + label: Total employment income + values: + 2019-01-01: 8_273_000_000_000 + 2020-01-01: 8_414_000_000_000 + 2021-01-01: 9_165_000_000_000 + 2022-01-01: 9_944_000_000_000 + 2023-01-01: 10_435_000_000_000 + 2024-01-01: 10_931_000_000_000 + 2025-01-01: 11_466_000_000_000 + 2026-01-01: 11_963_000_000_000 + 2027-01-01: 12_421_000_000_000 + 2028-01-01: 12_898_000_000_000 + 2029-01-01: 13_396_000_000_000 + 2030-01-01: 13_905_000_000_000 + 2031-01-01: 14_424_000_000_000 + 2032-01-01: 14_953_000_000_000 + 2033-01-01: 15_488_000_000_000 +taxable_interest_and_ordinary_dividends: # excludes qualified_dividend_income + 2019-01-01: 237_000_000_000 + 2020-01-01: 241_000_000_000 + 2021-01-01: 243_000_000_000 + 2022-01-01: 257_000_000_000 + 2023-01-01: 305_000_000_000 + 2024-01-01: 330_000_000_000 + 2025-01-01: 338_000_000_000 + 2026-01-01: 360_000_000_000 + 2027-01-01: 382_000_000_000 + 2028-01-01: 400_000_000_000 + 2029-01-01: 416_000_000_000 + 2030-01-01: 422_000_000_000 + 2031-01-01: 428_000_000_000 + 2032-01-01: 436_000_000_000 + 2033-01-01: 445_000_000_000 +qualified_dividend_income: + 2019-01-01: 248_000_000_000 + 2020-01-01: 246_000_000_000 + 2021-01-01: 262_000_000_000 + 2022-01-01: 276_000_000_000 + 2023-01-01: 282_000_000_000 + 2024-01-01: 281_000_000_000 + 2025-01-01: 286_000_000_000 + 2026-01-01: 297_000_000_000 + 2027-01-01: 310_000_000_000 + 2028-01-01: 323_000_000_000 + 2029-01-01: 336_000_000_000 + 2030-01-01: 357_000_000_000 + 2031-01-01: 379_000_000_000 + 2032-01-01: 400_000_000_000 + 2033-01-01: 420_000_000_000 +net_capital_gain: + 2019-01-01: 884_000_000_000 + 2020-01-01: 1_152_000_000_000 + 2021-01-01: 2_037_000_000_000 + 2022-01-01: 1_698_000_000_000 + 2023-01-01: 1_485_000_000_000 + 2024-01-01: 1_370_000_000_000 + 2025-01-01: 1_315_000_000_000 + 2026-01-01: 1_288_000_000_000 + 2027-01-01: 1_285_000_000_000 + 2028-01-01: 1_298_000_000_000 + 2029-01-01: 1_322_000_000_000 + 2030-01-01: 1_356_000_000_000 + 2031-01-01: 1_397_000_000_000 + 2032-01-01: 1_442_000_000_000 + 2033-01-01: 1_491_000_000_000 +self_employment_income: + 2019-01-01: 1_103_000_000_000 + 2020-01-01: 1_170_000_000_000 + 2021-01-01: 1_302_000_000_000 + 2022-01-01: 1_395_000_000_000 + 2023-01-01: 1_408_000_000_000 + 2024-01-01: 1_470_000_000_000 + 2025-01-01: 1_572_000_000_000 + 2026-01-01: 1_667_000_000_000 + 2027-01-01: 1_754_000_000_000 + 2028-01-01: 1_800_000_000_000 + 2029-01-01: 1_851_000_000_000 + 2030-01-01: 1_909_000_000_000 + 2031-01-01: 1_971_000_000_000 + 2032-01-01: 2_038_000_000_000 + 2033-01-01: 2_107_000_000_000 +taxable_pension_income: + 2019-01-01: 1_125_000_000_000 + 2020-01-01: 1_127_000_000_000 + 2021-01-01: 1_336_000_000_000 + 2022-01-01: 1_333_000_000_000 + 2023-01-01: 1_363_000_000_000 + 2024-01-01: 1_423_000_000_000 + 2025-01-01: 1_484_000_000_000 + 2026-01-01: 1_551_000_000_000 + 2027-01-01: 1_618_000_000_000 + 2028-01-01: 1_687_000_000_000 + 2029-01-01: 1_757_000_000_000 + 2030-01-01: 1_827_000_000_000 + 2031-01-01: 1_897_000_000_000 + 2032-01-01: 1_974_000_000_000 + 2033-01-01: 2_053_000_000_000 +taxable_social_security: + 2019-01-01: 361_000_000_000 + 2020-01-01: 376_000_000_000 + 2021-01-01: 422_000_000_000 + 2022-01-01: 457_000_000_000 + 2023-01-01: 517_000_000_000 + 2024-01-01: 569_000_000_000 + 2025-01-01: 611_000_000_000 + 2026-01-01: 652_000_000_000 + 2027-01-01: 695_000_000_000 + 2028-01-01: 743_000_000_000 + 2029-01-01: 795_000_000_000 + 2030-01-01: 848_000_000_000 + 2031-01-01: 897_000_000_000 + 2032-01-01: 949_000_000_000 + 2033-01-01: 1_003_000_000_000 +irs_other_income: + 2019-01-01: -125_000_000_000 + 2020-01-01: 62_000_000_000 + 2021-01-01: 136_000_000_000 + 2022-01-01: -96_000_000_000 + 2023-01-01: -110_000_000_000 + 2024-01-01: -113_000_000_000 + 2025-01-01: -116_000_000_000 + 2026-01-01: -118_000_000_000 + 2027-01-01: -74_000_000_000 + 2028-01-01: -78_000_000_000 + 2029-01-01: -156_000_000_000 + 2030-01-01: -163_000_000_000 + 2031-01-01: -169_000_000_000 + 2032-01-01: -176_000_000_000 + 2033-01-01: -185_000_000_000 +above_the_line_deductions: + 2019-01-01: 145_000_000_000 + 2020-01-01: 139_000_000_000 + 2021-01-01: 146_000_000_000 + 2022-01-01: 160_000_000_000 + 2023-01-01: 170_000_000_000 + 2024-01-01: 179_000_000_000 + 2025-01-01: 187_000_000_000 + 2026-01-01: 197_000_000_000 + 2027-01-01: 204_000_000_000 + 2028-01-01: 213_000_000_000 + 2029-01-01: 221_000_000_000 + 2030-01-01: 230_000_000_000 + 2031-01-01: 239_000_000_000 + 2032-01-01: 248_000_000_000 + 2033-01-01: 258_000_000_000 diff --git a/fiscalsim_us/parameters/calibration/gov/cbo/income_tax.yaml b/fiscalsim_us/parameters/calibration/gov/cbo/income_tax.yaml new file mode 100644 index 000000000..ffe318b44 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/cbo/income_tax.yaml @@ -0,0 +1,20 @@ +description: Individual income tax revenue projections. +values: + 2022-01-01: 2_632_000_000_000 + 2023-01-01: 2_525_000_000_000 + 2024-01-01: 2_475_000_000_000 + 2025-01-01: 2_517_000_000_000 + 2026-01-01: 2_768_000_000_000 + 2027-01-01: 3_019_000_000_000 + 2028-01-01: 3_123_000_000_000 + 2029-01-01: 3_248_000_000_000 + 2030-01-01: 3_380_000_000_000 + 2031-01-01: 3_517_000_000_000 + 2032-01-01: 3_652_000_000_000 + 2033-01-01: 3_806_000_000_000 +metadata: + unit: currency-USD + label: Income tax revenue + reference: + - title: CBO baseline projections (May 2023) + href: https://www.cbo.gov/data/budget-economic-data diff --git a/fiscalsim_us/parameters/calibration/gov/cbo/payroll_taxes.yaml b/fiscalsim_us/parameters/calibration/gov/cbo/payroll_taxes.yaml new file mode 100644 index 000000000..3de568f31 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/cbo/payroll_taxes.yaml @@ -0,0 +1,25 @@ +description: Historical total federal revenues from payroll taxes (2017-2022) +metadata: + unit: currency-USD + label: Payroll tax revenues + reference: + - title: The Budget and Economic Outlook 2023 to 2033 - Historical Budget Data | Congressional Budget Office + href: https://www.cbo.gov/publication/58848 +values: + 2017-01-01: 1_161_900_000_000 + 2018-01-01: 1_170_700_000_000 + 2019-01-01: 1_243_100_000_000 + 2020-01-01: 1_310_000_000_000 + 2021-01-01: 1_314_100_000_000 + 2022-01-01: 1_483_500_000_000 + 2023-01-01: 1_562_000_000_000 + 2024-01-01: 1_633_000_000_000 + 2025-01-01: 1_703_000_000_000 + 2026-01-01: 1_778_000_000_000 + 2027-01-01: 1_849_000_000_000 + 2028-01-01: 1_920_000_000_000 + 2029-01-01: 1_993_000_000_000 + 2030-01-01: 2_068_000_000_000 + 2031-01-01: 2_147_000_000_000 + 2032-01-01: 2_226_000_000_000 + 2033-01-01: 2_307_000_000_000 diff --git a/fiscalsim_us/parameters/calibration/gov/cbo/snap.yaml b/fiscalsim_us/parameters/calibration/gov/cbo/snap.yaml new file mode 100644 index 000000000..b1cb0f263 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/cbo/snap.yaml @@ -0,0 +1,25 @@ +description: Total SNAP outlays. +values: + 2018-01-01: 60_916_850_000 + 2019-01-01: 55_622_280_000 + 2020-01-01: 74_275_360_000 + 2021-01-01: 108_232_590_000 + 2023-01-01: 127_027_000_000 + 2024-01-01: 124_625_000_000 + 2025-01-01: 123_327_000_000 + 2026-01-01: 118_525_000_000 + 2027-01-01: 119_763_000_000 + 2028-01-01: 118_763_000_000 + 2029-01-01: 118_352_000_000 + 2030-01-01: 118_421_000_000 + 2031-01-01: 118_698_000_000 + 2032-01-01: 122_164_000_000 + 2033-01-01: 122_827_000_000 +metadata: + unit: currency-USD + label: Total SNAP outlays + reference: + - title: CBO Baseline Projections - SNAP + href: https://www.cbo.gov/system/files/2023-02/51312-2023-02-snap.pdf + - title: Supplemental Nutrition Assistance Program Participation and Costs + href: https://fns-prod.azureedge.net/sites/default/files/resource-files/SNAPsummary-2.pdf diff --git a/fiscalsim_us/parameters/calibration/gov/cbo/social_security.yaml b/fiscalsim_us/parameters/calibration/gov/cbo/social_security.yaml new file mode 100644 index 000000000..edd12dcf0 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/cbo/social_security.yaml @@ -0,0 +1,20 @@ +description: Social Security total outlays. +values: + 2022-01-01: 1_212_000_000_000 + 2023-01-01: 1_345_000_000_000 + 2024-01-01: 1_457_000_000_000 + 2025-01-01: 1_554_000_000_000 + 2026-01-01: 1_644_000_000_000 + 2027-01-01: 1_732_000_000_000 + 2028-01-01: 1_826_000_000_000 + 2029-01-01: 1_924_000_000_000 + 2030-01-01: 2_028_000_000_000 + 2031-01-01: 2_137_000_000_000 + 2032-01-01: 2_250_000_000_000 + 2033-01-01: 2_365_000_000_000 +metadata: + unit: currency-USD + label: Social Security outlays + reference: + - title: CBO baseline projections (May 2023) + href: https://www.cbo.gov/data/budget-economic-data diff --git a/fiscalsim_us/parameters/calibration/gov/cbo/ssi.yaml b/fiscalsim_us/parameters/calibration/gov/cbo/ssi.yaml new file mode 100644 index 000000000..ddb8a1762 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/cbo/ssi.yaml @@ -0,0 +1,20 @@ +description: SSI total outlays. +values: + 2022-01-01: 61_000_000_000 + 2023-01-01: 60_000_000_000 + 2024-01-01: 57_000_000_000 + 2025-01-01: 63_000_000_000 + 2026-01-01: 65_000_000_000 + 2027-01-01: 67_000_000_000 + 2028-01-01: 74_000_000_000 + 2029-01-01: 65_000_000_000 + 2030-01-01: 72_000_000_000 + 2031-01-01: 74_000_000_000 + 2032-01-01: 76_000_000_000 + 2033-01-01: 85_000_000_000 +metadata: + unit: currency-USD + label: SSI outlays + reference: + - title: CBO baseline projections (May 2023) + href: https://www.cbo.gov/data/budget-economic-data diff --git a/fiscalsim_us/parameters/calibration/gov/cbo/unemployment_compensation.yaml b/fiscalsim_us/parameters/calibration/gov/cbo/unemployment_compensation.yaml new file mode 100644 index 000000000..cf81d2c99 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/cbo/unemployment_compensation.yaml @@ -0,0 +1,20 @@ +description: Unemployment compensation total outlays. +values: + 2022-01-01: 33_000_000_000 + 2023-01-01: 35_000_000_000 + 2024-01-01: 49_000_000_000 + 2025-01-01: 48_000_000_000 + 2026-01-01: 48_000_000_000 + 2027-01-01: 48_000_000_000 + 2028-01-01: 49_000_000_000 + 2029-01-01: 49_000_000_000 + 2030-01-01: 51_000_000_000 + 2031-01-01: 53_000_000_000 + 2032-01-01: 55_000_000_000 + 2033-01-01: 56_000_000_000 +metadata: + unit: currency-USD + label: Unemployment compensation outlays + reference: + - title: CBO baseline projections (May 2023) + href: https://www.cbo.gov/data/budget-economic-data diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/medicaid/budgetary_impact.yaml b/fiscalsim_us/parameters/calibration/gov/hhs/medicaid/budgetary_impact.yaml similarity index 94% rename from fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/medicaid/budgetary_impact.yaml rename to fiscalsim_us/parameters/calibration/gov/hhs/medicaid/budgetary_impact.yaml index f1d33218d..68e3031ab 100644 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/medicaid/budgetary_impact.yaml +++ b/fiscalsim_us/parameters/calibration/gov/hhs/medicaid/budgetary_impact.yaml @@ -1,109 +1,109 @@ -description: Total Medicaid spending by state. -metadata: - unit: currency-USD - period: year - reference: - - title: Total Medicaid Spending | KFF - href: https://www.kff.org/medicaid/state-indicator/total-medicaid-spending/?currentTimeframe=0&sortModel=%7B%22colId%22:%22Location%22,%22sort%22:%22asc%22%7D -AL: - 2020-01-01: 6_127_207_059 -AK: - 2020-01-01: 2_042_605_168 -AZ: - 2020-01-01: 14_384_920_061 -AR: - 2020-01-01: 6_659_520_559 -CA: - 2020-01-01: 97_800_335_114 -CO: - 2020-01-01: 9_664_892_065 -CT: - 2020-01-01: 8_720_344_626 -DE: - 2020-01-01: 2_394_421_408 -DC: - 2020-01-01: 3_122_332_643 -FL: - 2020-01-01: 25_377_406_571 -GA: - 2020-01-01: 11_361_576_133 -HI: - 2020-01-01: 2_376_211_696 -ID: - 2020-01-01: 2_508_313_203 -IL: - 2020-01-01: 22_502_374_187 -IN: - 2020-01-01: 14_326_557_851 -IA: - 2020-01-01: 5_881_321_787 -KS: - 2020-01-01: 3_852_837_415 -KY: - 2020-01-01: 11_933_626_395 -LA: - 2020-01-01: 12_683_430_378 -ME: - 2020-01-01: 3_255_294_077 -MD: - 2020-01-01: 11_955_707_422 -MA: - 2020-01-01: 18_115_071_266 -MI: - 2020-01-01: 19_530_991_514 -MN: - 2020-01-01: 13_675_611_709 -MS: - 2020-01-01: 5_611_112_655 -MO: - 2020-01-01: 10_537_261_664 -MT: - 2020-01-01: 2_019_715_002 -NE: - 2020-01-01: 2_310_841_500 -NV: - 2020-01-01: 4_146_062_955 -NH: - 2020-01-01: 2_262_698_000 -NJ: - 2020-01-01: 16_586_529_893 -NM: - 2020-01-01: 6_305_311_494 -NY: - 2020-01-01: 72_806_428_892 -NC: - 2020-01-01: 14_946_535_882 -ND: - 2020-01-01: 1_282_676_949 -OH: - 2020-01-01: 25_375_896_532 -OK: - 2020-01-01: 5_358_411_344 -OR: - 2020-01-01: 10_656_322_957 -PA: - 2020-01-01: 35_162_135_812 -RI: - 2020-01-01: 2_822_139_010 -SC: - 2020-01-01: 6_869_663_193 -SD: - 2020-01-01: 934_996_256 -TN: - 2020-01-01: 11_593_910_801 -TX: - 2020-01-01: 42_538_924_857 -UT: - 2020-01-01: 3_119_421_372 -VT: - 2020-01-01: 1_617_949_401 -VA: - 2020-01-01: 13_565_556_185 -WA: - 2020-01-01: 18_586_229_402 -WV: - 2020-01-01: 4_169_411_129 -WI: - 2020-01-01: 9_422_856_399 -WY: - 2020-01-01: 618_981_335 +description: Total Medicaid spending by state. +metadata: + unit: currency-USD + period: year + reference: + - title: Total Medicaid Spending | KFF + href: https://www.kff.org/medicaid/state-indicator/total-medicaid-spending/?currentTimeframe=0&sortModel=%7B%22colId%22:%22Location%22,%22sort%22:%22asc%22%7D +AL: + 2020-01-01: 6_127_207_059 +AK: + 2020-01-01: 2_042_605_168 +AZ: + 2020-01-01: 14_384_920_061 +AR: + 2020-01-01: 6_659_520_559 +CA: + 2020-01-01: 97_800_335_114 +CO: + 2020-01-01: 9_664_892_065 +CT: + 2020-01-01: 8_720_344_626 +DE: + 2020-01-01: 2_394_421_408 +DC: + 2020-01-01: 3_122_332_643 +FL: + 2020-01-01: 25_377_406_571 +GA: + 2020-01-01: 11_361_576_133 +HI: + 2020-01-01: 2_376_211_696 +ID: + 2020-01-01: 2_508_313_203 +IL: + 2020-01-01: 22_502_374_187 +IN: + 2020-01-01: 14_326_557_851 +IA: + 2020-01-01: 5_881_321_787 +KS: + 2020-01-01: 3_852_837_415 +KY: + 2020-01-01: 11_933_626_395 +LA: + 2020-01-01: 12_683_430_378 +ME: + 2020-01-01: 3_255_294_077 +MD: + 2020-01-01: 11_955_707_422 +MA: + 2020-01-01: 18_115_071_266 +MI: + 2020-01-01: 19_530_991_514 +MN: + 2020-01-01: 13_675_611_709 +MS: + 2020-01-01: 5_611_112_655 +MO: + 2020-01-01: 10_537_261_664 +MT: + 2020-01-01: 2_019_715_002 +NE: + 2020-01-01: 2_310_841_500 +NV: + 2020-01-01: 4_146_062_955 +NH: + 2020-01-01: 2_262_698_000 +NJ: + 2020-01-01: 16_586_529_893 +NM: + 2020-01-01: 6_305_311_494 +NY: + 2020-01-01: 72_806_428_892 +NC: + 2020-01-01: 14_946_535_882 +ND: + 2020-01-01: 1_282_676_949 +OH: + 2020-01-01: 25_375_896_532 +OK: + 2020-01-01: 5_358_411_344 +OR: + 2020-01-01: 10_656_322_957 +PA: + 2020-01-01: 35_162_135_812 +RI: + 2020-01-01: 2_822_139_010 +SC: + 2020-01-01: 6_869_663_193 +SD: + 2020-01-01: 934_996_256 +TN: + 2020-01-01: 11_593_910_801 +TX: + 2020-01-01: 42_538_924_857 +UT: + 2020-01-01: 3_119_421_372 +VT: + 2020-01-01: 1_617_949_401 +VA: + 2020-01-01: 13_565_556_185 +WA: + 2020-01-01: 18_586_229_402 +WV: + 2020-01-01: 4_169_411_129 +WI: + 2020-01-01: 9_422_856_399 +WY: + 2020-01-01: 618_981_335 diff --git a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/medicaid/enrollment.yaml b/fiscalsim_us/parameters/calibration/gov/hhs/medicaid/enrollment.yaml similarity index 94% rename from fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/medicaid/enrollment.yaml rename to fiscalsim_us/parameters/calibration/gov/hhs/medicaid/enrollment.yaml index 4fb05cad3..586782849 100644 --- a/fiscalsim_us/data/datasets/cps/calibrated_cps/calibration_parameters/programs/medicaid/enrollment.yaml +++ b/fiscalsim_us/parameters/calibration/gov/hhs/medicaid/enrollment.yaml @@ -1,109 +1,109 @@ -description: Total Medicaid enrollment by state. -metadata: - unit: person - period: year - reference: - - title: Total Monthly Medicaid/CHIP Enrollment and Pre-ACA Enrollment | KFF - href: https://www.kff.org/health-reform/state-indicator/total-monthly-medicaid-and-chip-enrollment/?currentTimeframe=0&sortModel=%7B%22colId%22:%22Location%22,%22sort%22:%22asc%22%7D -AK: - 2020-01-01: 922_592 -AL: - 2020-01-01: 223_963 -AR: - 2020-01-01: 808_905 -AZ: - 2020-01-01: 1_702_632 -CA: - 2020-01-01: 11_614_902 -CO: - 2020-01-01: 1_286_834 -CT: - 2020-01-01: 847_119 -DC: - 2020-01-01: 253_265 -DE: - 2020-01-01: 230_809 -FL: - 2020-01-01: 3_601_113 -GA: - 2020-01-01: 1_830_095 -HI: - 2020-01-01: 325_833 -IA: - 2020-01-01: 680_117 -ID: - 2020-01-01: 313_122 -IL: - 2020-01-01: 2_830_864 -IN: - 2020-01-01: 1_492_183 -KS: - 2020-01-01: 377_740 -KY: - 2020-01-01: 1_289_517 -LA: - 2020-01-01: 1_506_162 -MA: - 2020-01-01: 1_554_381 -MD: - 2020-01-01: 1_329_134 -ME: - 2020-01-01: 264_849 -MI: - 2020-01-01: 2_327_041 -MN: - 2020-01-01: 1_040_843 -MO: - 2020-01-01: 848_304 -MS: - 2020-01-01: 616_266 -MT: - 2020-01-01: 258_898 -NC: - 2020-01-01: 1_767_109 -ND: - 2020-01-01: 89_890 -NE: - 2020-01-01: 247_737 -NH: - 2020-01-01: 181_909 -NJ: - 2020-01-01: 1_705_106 -NM: - 2020-01-01: 745_341 -NV: - 2020-01-01: 626_116 -NY: - 2020-01-01: 6_004_128 -OH: - 2020-01-01: 2_612_947 -OK: - 2020-01-01: 721_273 -OR: - 2020-01-01: 1_000_654 -PA: - 2020-01-01: 2_941_466 -RI: - 2020-01-01: 293_293 -SC: - 2020-01-01: 1_039_640 -SD: - 2020-01-01: 109_264 -TN: - 2020-01-01: 1_452_561 -TX: - 2020-01-01: 4_194_734 -UT: - 2020-01-01: 312_988 -VA: - 2020-01-01: 1_422_802 -VT: - 2020-01-01: 150_895 -WA: - 2020-01-01: 1_727_441 -WI: - 2020-01-01: 1_048_524 -WV: - 2020-01-01: 506_562 -WY: - 2020-01-01: 56_199 +description: Total Medicaid enrollment by state. +metadata: + unit: person + period: year + reference: + - title: Total Monthly Medicaid/CHIP Enrollment and Pre-ACA Enrollment | KFF + href: https://www.kff.org/health-reform/state-indicator/total-monthly-medicaid-and-chip-enrollment/?currentTimeframe=0&sortModel=%7B%22colId%22:%22Location%22,%22sort%22:%22asc%22%7D +AK: + 2020-01-01: 922_592 +AL: + 2020-01-01: 223_963 +AR: + 2020-01-01: 808_905 +AZ: + 2020-01-01: 1_702_632 +CA: + 2020-01-01: 11_614_902 +CO: + 2020-01-01: 1_286_834 +CT: + 2020-01-01: 847_119 +DC: + 2020-01-01: 253_265 +DE: + 2020-01-01: 230_809 +FL: + 2020-01-01: 3_601_113 +GA: + 2020-01-01: 1_830_095 +HI: + 2020-01-01: 325_833 +IA: + 2020-01-01: 680_117 +ID: + 2020-01-01: 313_122 +IL: + 2020-01-01: 2_830_864 +IN: + 2020-01-01: 1_492_183 +KS: + 2020-01-01: 377_740 +KY: + 2020-01-01: 1_289_517 +LA: + 2020-01-01: 1_506_162 +MA: + 2020-01-01: 1_554_381 +MD: + 2020-01-01: 1_329_134 +ME: + 2020-01-01: 264_849 +MI: + 2020-01-01: 2_327_041 +MN: + 2020-01-01: 1_040_843 +MO: + 2020-01-01: 848_304 +MS: + 2020-01-01: 616_266 +MT: + 2020-01-01: 258_898 +NC: + 2020-01-01: 1_767_109 +ND: + 2020-01-01: 89_890 +NE: + 2020-01-01: 247_737 +NH: + 2020-01-01: 181_909 +NJ: + 2020-01-01: 1_705_106 +NM: + 2020-01-01: 745_341 +NV: + 2020-01-01: 626_116 +NY: + 2020-01-01: 6_004_128 +OH: + 2020-01-01: 2_612_947 +OK: + 2020-01-01: 721_273 +OR: + 2020-01-01: 1_000_654 +PA: + 2020-01-01: 2_941_466 +RI: + 2020-01-01: 293_293 +SC: + 2020-01-01: 1_039_640 +SD: + 2020-01-01: 109_264 +TN: + 2020-01-01: 1_452_561 +TX: + 2020-01-01: 4_194_734 +UT: + 2020-01-01: 312_988 +VA: + 2020-01-01: 1_422_802 +VT: + 2020-01-01: 150_895 +WA: + 2020-01-01: 1_727_441 +WI: + 2020-01-01: 1_048_524 +WV: + 2020-01-01: 506_562 +WY: + 2020-01-01: 56_199 diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/agi/number_of_returns.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/agi/number_of_returns.yaml new file mode 100644 index 000000000..f6c4dd76a --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/agi/number_of_returns.yaml @@ -0,0 +1,84 @@ +description: Adjusted gross number of returns by lower AGI value. +metadata: + label: Tax return counts by AGI band + amount_unit: currency-USD + threshold_unit: currency-USD + reference: + - title: IRS SOI 2021 (20in11.xls) +brackets: + - threshold: + 2015-01-01: 1 + amount: + 2015-01-01: 10_356_651 + - threshold: + 2015-01-01: 5_000 + amount: + 2015-01-01: 10_107_828 + - threshold: + 2015-01-01: 10_000 + amount: + 2015-01-01: 10_580_466 + - threshold: + 2015-01-01: 15_000 + amount: + 2015-01-01: 10_023_674 + - threshold: + 2015-01-01: 20_000 + amount: + 2015-01-01: 9_725_840 + - threshold: + 2015-01-01: 25_000 + amount: + 2015-01-01: 9_515_795 + - threshold: + 2015-01-01: 30_000 + amount: + 2015-01-01: 16_776_306 + - threshold: + 2015-01-01: 40_000 + amount: + 2015-01-01: 13_154_096 + - threshold: + 2015-01-01: 50_000 + amount: + 2015-01-01: 22_602_996 + - threshold: + 2015-01-01: 75_000 + amount: + 2015-01-01: 14_379_692 + - threshold: + 2015-01-01: 100_000 + amount: + 2015-01-01: 22_415_415 + - threshold: + 2015-01-01: 200_000 + amount: + 2015-01-01: 7_615_358 + - threshold: + 2015-01-01: 500_000 + amount: + 2015-01-01: 1_237_975 + - threshold: + 2015-01-01: 1_000_000 + amount: + 2015-01-01: 272_680 + - threshold: + 2015-01-01: 1_500_000 + amount: + 2015-01-01: 108_913 + - threshold: + 2015-01-01: 2_000_000 + amount: + 2015-01-01: 157_974 + - threshold: + 2015-01-01: 5_000_000 + amount: + 2015-01-01: 40_567 + - threshold: + 2015-01-01: 10_000_000 + amount: + 2015-01-01: 26_576 + - threshold: + 2015-01-01: 10_000_000 + amount: + 2015-01-01: 26_576 diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/agi/total_agi.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/agi/total_agi.yaml new file mode 100644 index 000000000..a1fc98283 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/agi/total_agi.yaml @@ -0,0 +1,84 @@ +description: Total AGI size in each bucket by lower AGI value. +metadata: + label: AGI aggregate by band + amount_unit: currency-USD + threshold_unit: currency-USD + reference: + - title: IRS SOI PUF 2015 (20in11.xls) +brackets: + - threshold: + 2015-01-01: 1 + amount: + 2015-01-01: 24_087_842_000 + - threshold: + 2015-01-01: 5_000 + amount: + 2015-01-01: 76_144_251_000 + - threshold: + 2015-01-01: 10_000 + amount: + 2015-01-01: 131_879_612_000 + - threshold: + 2015-01-01: 15_000 + amount: + 2015-01-01: 175_213_815_000 + - threshold: + 2015-01-01: 20_000 + amount: + 2015-01-01: 218_827_831_000 + - threshold: + 2015-01-01: 25_000 + amount: + 2015-01-01: 261_305_433_000 + - threshold: + 2015-01-01: 30_000 + amount: + 2015-01-01: 583_890_556_000 + - threshold: + 2015-01-01: 40_000 + amount: + 2015-01-01: 589_155_857_000 + - threshold: + 2015-01-01: 50_000 + amount: + 2015-01-01: 1_388_153_537_000 + - threshold: + 2015-01-01: 75_000 + amount: + 2015-01-01: 1_247_263_301_000 + - threshold: + 2015-01-01: 100_000 + amount: + 2015-01-01: 3_060_065_884_000 + - threshold: + 2015-01-01: 200_000 + amount: + 2015-01-01: 2_187_228_752_000 + - threshold: + 2015-01-01: 500_000 + amount: + 2015-01-01: 833_075_077_000 + - threshold: + 2015-01-01: 1_000_000 + amount: + 2015-01-01: 328_832_716_000 + - threshold: + 2015-01-01: 1_500_000 + amount: + 2015-01-01: 187_713_632_000 + - threshold: + 2015-01-01: 2_000_000 + amount: + 2015-01-01: 471_209_618_000 + - threshold: + 2015-01-01: 5_000_000 + amount: + 2015-01-01: 278_473_308_000 + - threshold: + 2015-01-01: 10_000_000 + amount: + 2015-01-01: 824_093_126_000 + - threshold: + 2015-01-01: 10_000_000 + amount: + 2015-01-01: 824_093_126_000 diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/employment_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/employment_income.yaml new file mode 100644 index 000000000..529124a2a --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/employment_income.yaml @@ -0,0 +1,11 @@ +description: Total employment income. +values: + 2015-01-01: 7_112_222_959_000 + 2020-01-01: 8_416_495_535_000 +metadata: + unit: currency-USD + label: SOI employment income + uprating: calibration.gov.cbo.income_by_source.employment_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/farm_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/farm_income.yaml new file mode 100644 index 000000000..589923342 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/farm_income.yaml @@ -0,0 +1,11 @@ +description: Total farm income. +values: + 2015-01-01: 13_533_867_000 + 2020-01-01: 12_887_044_000 +metadata: + unit: currency-USD + label: SOI farm income + uprating: calibration.gov.cbo.income_by_source.adjusted_gross_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/farm_rent_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/farm_rent_income.yaml new file mode 100644 index 000000000..d7f314bf8 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/farm_rent_income.yaml @@ -0,0 +1,11 @@ +description: Total farm rental income. +values: + 2015-01-01: 5_205_330_000 + 2020-01-01: 5_399_164_000 +metadata: + unit: currency-USD + label: SOI farm rental income + uprating: calibration.gov.cbo.income_by_source.adjusted_gross_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/long_term_capital_gains.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/long_term_capital_gains.yaml new file mode 100644 index 000000000..8413bf3ba --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/long_term_capital_gains.yaml @@ -0,0 +1,11 @@ +description: Total long-term capital gains. +values: + 2015-01-01: 713_598_090_000 + 2020-01-01: 1_137_020_477_000 +metadata: + unit: currency-USD + label: SOI long-term capital gains + uprating: calibration.gov.cbo.income_by_source.net_capital_gain + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/non_qualified_dividend_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/non_qualified_dividend_income.yaml new file mode 100644 index 000000000..4cc477806 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/non_qualified_dividend_income.yaml @@ -0,0 +1,11 @@ +description: Total non-qualified dividend income. +values: + 2015-01-01: 57_064_932_000 + 2020-01-01: 67_632_347_000 +metadata: + unit: currency-USD + label: SOI non-qualified dividend income + uprating: calibration.gov.cbo.income_by_source.qualified_dividend_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/partnership_s_corp_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/partnership_s_corp_income.yaml new file mode 100644 index 000000000..f99243b6a --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/partnership_s_corp_income.yaml @@ -0,0 +1,11 @@ +description: Total partnership and S-corp income. +values: + 2015-01-01: 755_622_761_000 + 2020-01-01: 931_608_828_000 +metadata: + unit: currency-USD + label: SOI partnership and S-corp income + uprating: calibration.gov.cbo.income_by_source.self_employment_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/qualified_dividend_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/qualified_dividend_income.yaml new file mode 100644 index 000000000..8fd4e3d44 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/qualified_dividend_income.yaml @@ -0,0 +1,11 @@ +description: Total qualified dividend income. +values: + 2015-01-01: 203_187_788_000 + 2020-01-01: 260_244_440_000 +metadata: + unit: currency-USD + label: SOI qualified dividend income + uprating: calibration.gov.cbo.income_by_source.qualified_dividend_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/rental_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/rental_income.yaml new file mode 100644 index 000000000..6834d1fbb --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/rental_income.yaml @@ -0,0 +1,11 @@ +description: Total rental income. +values: + 2015-01-01: 100_311_600_000 + 2020-01-01: 104_600_610_000 +metadata: + unit: currency-USD + label: SOI rental income + uprating: calibration.gov.cbo.income_by_source.adjusted_gross_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/self_employment_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/self_employment_income.yaml new file mode 100644 index 000000000..4a7c618b6 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/self_employment_income.yaml @@ -0,0 +1,11 @@ +description: Total self-employment income. +values: + 2015-01-01: 391_975_736_000 + 2020-01-01: 436_378_623_000 +metadata: + unit: currency-USD + label: SOI self-employment income + uprating: calibration.gov.cbo.income_by_source.self_employment_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/social_security.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/social_security.yaml new file mode 100644 index 000000000..dbb55e8bb --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/social_security.yaml @@ -0,0 +1,11 @@ +description: Total social security. +values: + 2015-01-01: 605_152_093_000 + 2021-01-01: 774_017_713_000 +metadata: + unit: currency-USD + label: SOI social security + uprating: calibration.gov.cbo.income_by_source.taxable_social_security + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/tax_exempt_interest_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/tax_exempt_interest_income.yaml new file mode 100644 index 000000000..678cda28a --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/tax_exempt_interest_income.yaml @@ -0,0 +1,11 @@ +description: Total tax-exempt interest income. +values: + 2015-01-01: 61_871_455_000 + 2020-01-01: 59_449_107_000 +metadata: + unit: currency-USD + label: SOI tax-exempt interest income + uprating: calibration.gov.cbo.income_by_source.taxable_interest_and_ordinary_dividends + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/tax_exempt_pension_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/tax_exempt_pension_income.yaml new file mode 100644 index 000000000..5f7ff7375 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/tax_exempt_pension_income.yaml @@ -0,0 +1,11 @@ +description: Total tax-exempt pension income. +values: + 2015-01-01: 479_075_149_000 + 2020-01-01: 580_350_454_000 +metadata: + unit: currency-USD + label: SOI tax-exempt pension income + uprating: calibration.gov.cbo.income_by_source.taxable_pension_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/taxable_interest_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/taxable_interest_income.yaml new file mode 100644 index 000000000..86bdcc531 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/taxable_interest_income.yaml @@ -0,0 +1,11 @@ +description: Total taxable interest income. +values: + 2015-01-01: 95_881_223_000 + 2020-01-01: 127_375_994_000 +metadata: + unit: currency-USD + label: SOI taxable interest income + uprating: calibration.gov.cbo.income_by_source.taxable_interest_and_ordinary_dividends + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/taxable_pension_income.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/taxable_pension_income.yaml new file mode 100644 index 000000000..7a86dca62 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/taxable_pension_income.yaml @@ -0,0 +1,11 @@ +description: Total taxable pension income. +values: + 2015-01-01: 689_991_999_000 + 2020-01-01: 827_597_726_000 +metadata: + unit: currency-USD + label: SOI taxable pension income + uprating: calibration.gov.cbo.income_by_source.taxable_pension_income + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/irs/soi/unemployment_compensation.yaml b/fiscalsim_us/parameters/calibration/gov/irs/soi/unemployment_compensation.yaml new file mode 100644 index 000000000..f102b05c6 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/irs/soi/unemployment_compensation.yaml @@ -0,0 +1,12 @@ +description: Total unemployment compensation. +values: + 2015-01-01: 27_225_383_000 + # 2020-01-01: 405_283_667_000 Remove for now to avoid spiking before we can uprate + 2021-01-01: 27_225_383_000 +metadata: + unit: currency-USD + label: SOI unemployment compensation + uprating: calibration.gov.cbo.income_by_source.taxable_social_security + reference: + - title: IRS SOI Tax Stats - Individual Statistical Tables by Size of Adjusted Gross Income + href: https://www.irs.gov/statistics/soi-tax-stats-individual-statistical-tables-by-size-of-adjusted-gross-income diff --git a/fiscalsim_us/parameters/calibration/gov/ssa/social_security/participation.yaml b/fiscalsim_us/parameters/calibration/gov/ssa/social_security/participation.yaml new file mode 100644 index 000000000..8a9458d40 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/ssa/social_security/participation.yaml @@ -0,0 +1,8 @@ +description: Average participation in Social Security. +values: + 2022-12-01: 65_994_457 +metadata: + unit: person + reference: + - title: Number and average monthly benefit, December 2022 + href: https://www.ssa.gov/policy/docs/statcomps/supplement/2023/5a.pdf diff --git a/fiscalsim_us/parameters/calibration/gov/ssa/ssi/participation.yaml b/fiscalsim_us/parameters/calibration/gov/ssa/ssi/participation.yaml new file mode 100644 index 000000000..c425ae382 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/ssa/ssi/participation.yaml @@ -0,0 +1,8 @@ +description: Average participation in Supplemental Security Income. +values: + 2022-12-01: 7_407_730 +metadata: + unit: person + reference: + - title: Number of recipients of federally administered payments, December 2022 + href: https://www.ssa.gov/policy/docs/statcomps/supplement/2023/7a.pdf diff --git a/fiscalsim_us/parameters/calibration/gov/treasury/tax_expenditures/eitc.yaml b/fiscalsim_us/parameters/calibration/gov/treasury/tax_expenditures/eitc.yaml new file mode 100644 index 000000000..87bf9a35d --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/treasury/tax_expenditures/eitc.yaml @@ -0,0 +1,19 @@ +description: EITC estimated outlays by the Treasury Department. +values: + 2021-01-01: 68_870_000_000 + 2022-01-01: 77_290_000_000 + 2023-01-01: 64_440_000_000 + 2024-01-01: 67_330_000_000 + 2025-01-01: 68_650_000_000 + 2026-01-01: 69_260_000_000 + 2027-01-01: 68_940_000_000 + 2028-01-01: 69_610_000_000 + 2029-01-01: 70_440_000_000 + 2030-01-01: 71_480_000_000 + 2031-01-01: 72_710_000_000 +metadata: + unit: currency-USD + label: EITC outlays + reference: + - title: Treasury Dept Tax Expenditures report (FY 2023) + href: https://home.treasury.gov/system/files/131/Tax-Expenditures-FY2023.pdf diff --git a/fiscalsim_us/parameters/calibration/gov/usda/snap/participation.yaml b/fiscalsim_us/parameters/calibration/gov/usda/snap/participation.yaml new file mode 100644 index 000000000..3f66e1dc0 --- /dev/null +++ b/fiscalsim_us/parameters/calibration/gov/usda/snap/participation.yaml @@ -0,0 +1,12 @@ +description: Average participation in the Supplemental Nutrition Assistance Program. +values: + 2018-01-01: 40_776_000 + 2019-01-01: 35_702_000 + 2020-01-01: 39_879_000 + 2021-01-01: 41_500_000 + 2022-01-01: 41_209_000 +metadata: + unit: person + reference: + - title: Supplemental Nutrition Assistance Program Participation and Costs + href: https://fns-prod.azureedge.us/sites/default/files/resource-files/snap-annualsummary-9.pdf diff --git a/fiscalsim_us/parameters/gov/bls/README.md b/fiscalsim_us/parameters/gov/bls/README.md index d8aa2ad67..123e23db3 100644 --- a/fiscalsim_us/parameters/gov/bls/README.md +++ b/fiscalsim_us/parameters/gov/bls/README.md @@ -1 +1 @@ -# BLS +# Bureau of Labor Statistics (BLS) diff --git a/fiscalsim_us/parameters/gov/bls/cpi/README.md b/fiscalsim_us/parameters/gov/bls/cpi/README.md new file mode 100644 index 000000000..8933c0cbc --- /dev/null +++ b/fiscalsim_us/parameters/gov/bls/cpi/README.md @@ -0,0 +1 @@ +# Consumer Price Index (CPI) diff --git a/fiscalsim_us/parameters/gov/contrib/congress/delauro/README.md b/fiscalsim_us/parameters/gov/contrib/congress/delauro/README.md new file mode 100644 index 000000000..8e341f2c4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/congress/delauro/README.md @@ -0,0 +1 @@ +# Rep Rosa DeLauro diff --git a/fiscalsim_us/parameters/gov/contrib/congress/delauro/american_family_act/README.md b/fiscalsim_us/parameters/gov/contrib/congress/delauro/american_family_act/README.md new file mode 100644 index 000000000..210b264a8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/congress/delauro/american_family_act/README.md @@ -0,0 +1 @@ +# American Family Act diff --git a/fiscalsim_us/parameters/gov/contrib/congress/delauro/american_family_act/baby_bonus.yaml b/fiscalsim_us/parameters/gov/contrib/congress/delauro/american_family_act/baby_bonus.yaml new file mode 100644 index 000000000..f726da158 --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/congress/delauro/american_family_act/baby_bonus.yaml @@ -0,0 +1,11 @@ +description: The Child Tax Credit increases by this amount for newborns, above the normal amount for young children. +values: + 2000-01-01: 0 +metadata: + unit: float + label: American Family Act baby bonus + reference: + # Specifies as 800% of the base amount for the first month. + # This is $2,000, or $1,700 compared to the core $300 for young children in the rest of the AFA. + - title: American Family Act of 2023 + href: https://delauro.house.gov/sites/evo-subsites/delauro.house.gov/files/evo-media-document/delaur_017_xml.pdf#page=3 diff --git a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/adult_dependent_credit/amount.yaml b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/adult_dependent_credit/amount.yaml index 7a58b3238..6041f8622 100644 --- a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/adult_dependent_credit/amount.yaml +++ b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/adult_dependent_credit/amount.yaml @@ -6,6 +6,5 @@ metadata: label: End Child Poverty Act adult dependent credit amount period: year unit: currency-USD - name: end_child_poverty_act_adult_dependent_credit_amount values: 2020-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/adult_dependent_credit/min_age.yaml b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/adult_dependent_credit/min_age.yaml index c2f4bfac2..649299759 100644 --- a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/adult_dependent_credit/min_age.yaml +++ b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/adult_dependent_credit/min_age.yaml @@ -5,6 +5,5 @@ metadata: href: https://tlaib.house.gov/sites/tlaib.house.gov/files/EndChildPovertyAct.pdf#page=15 label: End Child Poverty Act adult dependent credit minimum age unit: years - name: end_child_poverty_act_adult_dependent_credit_min_age values: 2020-01-01: 19 diff --git a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/amount.yaml b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/amount.yaml index 2d5db34ae..34cb481bf 100644 --- a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/amount.yaml +++ b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/amount.yaml @@ -6,7 +6,6 @@ metadata: label: End Child Poverty Act filer credit amount unit: currency-USD period: year - name: end_child_poverty_act_filer_credit_amount breakdown: - filing_status JOINT: diff --git a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/eligibility/max_age.yaml b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/eligibility/max_age.yaml index c937dba51..4f8ba15c7 100644 --- a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/eligibility/max_age.yaml +++ b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/eligibility/max_age.yaml @@ -5,6 +5,5 @@ metadata: href: https://tlaib.house.gov/sites/tlaib.house.gov/files/EndChildPovertyAct.pdf#page=15 label: End Child Poverty Act filer credit maximum age unit: years - name: end_child_poverty_act_filer_credit_max_age values: 2020-01-01: 64 diff --git a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/eligibility/min_age.yaml b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/eligibility/min_age.yaml index 031e86748..e4537c68b 100644 --- a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/eligibility/min_age.yaml +++ b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/eligibility/min_age.yaml @@ -5,6 +5,5 @@ metadata: href: https://tlaib.house.gov/sites/tlaib.house.gov/files/EndChildPovertyAct.pdf#page=15 label: End Child Poverty Act filer credit minimum age unit: years - name: end_child_poverty_act_filer_credit_min_age values: 2020-01-01: 19 diff --git a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/phase_out/rate.yaml b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/phase_out/rate.yaml index 104f02a71..09dd63801 100644 --- a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/phase_out/rate.yaml +++ b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/phase_out/rate.yaml @@ -6,6 +6,5 @@ metadata: label: End Child Poverty Act filer credit phase-out rate period: year unit: /1 - name: end_child_poverty_act_filer_credit_phase_out_rate values: 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/phase_out/start.yaml b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/phase_out/start.yaml index 4058b9e82..042443143 100644 --- a/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/phase_out/start.yaml +++ b/fiscalsim_us/parameters/gov/contrib/congress/tlaib/end_child_poverty_act/filer_credit/phase_out/start.yaml @@ -6,7 +6,6 @@ metadata: label: End Child Poverty Act filer credit phase-out start unit: currency-USD period: year - name: end_child_poverty_act_filer_credit_phase_out_start breakdown: - filing_status JOINT: diff --git a/fiscalsim_us/parameters/gov/contrib/dc_kccatc/README.md b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/README.md new file mode 100644 index 000000000..86f9c5f14 --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/README.md @@ -0,0 +1,3 @@ +# DC KCCATC + +Reforms that affect the Keep Child Care Affordable Tax Credit. diff --git a/fiscalsim_us/parameters/gov/contrib/dc_kccatc/active.yaml b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/active.yaml new file mode 100644 index 000000000..618a531b9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/active.yaml @@ -0,0 +1,6 @@ +description: Whether to reform the DC KCCATC in line with the parameters in this folder. +values: + 2020-01-01: false +metadata: + unit: bool + label: DC KCCATC custom reforms active diff --git a/fiscalsim_us/parameters/gov/contrib/dc_kccatc/expenses/max.yaml b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/expenses/max.yaml new file mode 100644 index 000000000..6685ee7ce --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/expenses/max.yaml @@ -0,0 +1,7 @@ +description: DC caps the KCCATC at this amount per eligible child. +values: + 2000-01-01: 0 +metadata: + unit: currency-USD + period: year + label: DC KCCATC maximum diff --git a/fiscalsim_us/parameters/gov/contrib/dc_kccatc/expenses/rate.yaml b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/expenses/rate.yaml new file mode 100644 index 000000000..485df866b --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/expenses/rate.yaml @@ -0,0 +1,6 @@ +description: The DC KCCATC covers this percentage of child care expenses for the tax unit. +values: + 2000-01-01: 0.00 +metadata: + unit: /1 + label: DC KCCATC expense share diff --git a/fiscalsim_us/parameters/gov/contrib/dc_kccatc/phase_out/rate.yaml b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/phase_out/rate.yaml new file mode 100644 index 000000000..2ac05bb75 --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/phase_out/rate.yaml @@ -0,0 +1,7 @@ +description: DC phases out the KCCATC at this rate of AGI above the threshold. +values: + 2000-01-01: 0.00 +metadata: + unit: /1 + period: year + label: DC KCCATC phase-out rate diff --git a/fiscalsim_us/parameters/gov/contrib/dc_kccatc/phase_out/threshold.yaml b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/phase_out/threshold.yaml new file mode 100644 index 000000000..e7852667e --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/dc_kccatc/phase_out/threshold.yaml @@ -0,0 +1,15 @@ +description: AGI after this amount phases out the DC KCCATC. +SINGLE: + 2000-01-01: 0 +JOINT: + 2000-01-01: 0 +SEPARATE: + 2000-01-01: 0 +HEAD_OF_HOUSEHOLD: + 2000-01-01: 0 +WIDOW: + 2000-01-01: 0 +metadata: + breakdown: filing_status + unit: currency-USD + label: DC KCCATC phase-out threshold diff --git a/fiscalsim_us/parameters/gov/contrib/dc_tax_threshold_joint_ratio.yaml b/fiscalsim_us/parameters/gov/contrib/dc_tax_threshold_joint_ratio.yaml new file mode 100644 index 000000000..ce9bb64c4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/dc_tax_threshold_joint_ratio.yaml @@ -0,0 +1,6 @@ +description: Ratio of single to joint tax thresholds for DC's income tax. +values: + 2000-01-01: 1 +metadata: + unit: /1 + label: DC single-joint tax threshold ratio diff --git a/fiscalsim_us/parameters/gov/contrib/individual_eitc/README.md b/fiscalsim_us/parameters/gov/contrib/individual_eitc/README.md new file mode 100644 index 000000000..e856d7129 --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/individual_eitc/README.md @@ -0,0 +1 @@ +# Individual EITCs diff --git a/fiscalsim_us/parameters/gov/contrib/individual_eitc/agi_eitc_limit.yaml b/fiscalsim_us/parameters/gov/contrib/individual_eitc/agi_eitc_limit.yaml new file mode 100644 index 000000000..9a8210021 --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/individual_eitc/agi_eitc_limit.yaml @@ -0,0 +1,10 @@ +description: Tax filers with combined earned income over this cannot claim the EITC. This is only active if the Winship EITC reform is active. +values: + 2020-01-01: 0 +metadata: + label: EITC AGI limit + unit: currency-USD + period: year + reference: + - title: Reforming the EITC to Reduce Single Parenthood and Ease Work-Family Balance + href: https://ifstudies.org/blog/reforming-the-eitc-to-reduce-single-parenthood-and-ease-work-family-balance diff --git a/fiscalsim_us/parameters/gov/contrib/individual_eitc/enabled.yaml b/fiscalsim_us/parameters/gov/contrib/individual_eitc/enabled.yaml new file mode 100644 index 000000000..75a13f2cf --- /dev/null +++ b/fiscalsim_us/parameters/gov/contrib/individual_eitc/enabled.yaml @@ -0,0 +1,9 @@ +description: A proposal by Scott Winship to assess EITC income at the individual level, regardless of filing status. +values: + 2020-01-01: false +metadata: + label: Individual-income EITCs + unit: bool + reference: + - title: Reforming the EITC to Reduce Single Parenthood and Ease Work-Family Balance + href: https://ifstudies.org/blog/reforming-the-eitc-to-reduce-single-parenthood-and-ease-work-family-balance diff --git a/fiscalsim_us/parameters/gov/contrib/maryland_child_alliance/abolish_non_refundable_child_eitc.yaml b/fiscalsim_us/parameters/gov/contrib/maryland_child_alliance/abolish_non_refundable_child_eitc.yaml index fabdd89e5..f5d7377ad 100644 --- a/fiscalsim_us/parameters/gov/contrib/maryland_child_alliance/abolish_non_refundable_child_eitc.yaml +++ b/fiscalsim_us/parameters/gov/contrib/maryland_child_alliance/abolish_non_refundable_child_eitc.yaml @@ -4,4 +4,3 @@ values: metadata: unit: bool label: Abolish MD non-refundable EITC for families with children - name: mca_md_non_refundable_eitc_abolish_children diff --git a/fiscalsim_us/parameters/gov/contrib/maryland_child_alliance/abolish_refundable_child_eitc.yaml b/fiscalsim_us/parameters/gov/contrib/maryland_child_alliance/abolish_refundable_child_eitc.yaml index 03f5b3ed4..56e2f801f 100644 --- a/fiscalsim_us/parameters/gov/contrib/maryland_child_alliance/abolish_refundable_child_eitc.yaml +++ b/fiscalsim_us/parameters/gov/contrib/maryland_child_alliance/abolish_refundable_child_eitc.yaml @@ -4,4 +4,3 @@ values: metadata: unit: bool label: Abolish MD refundable EITC for families with children - name: mca_md_refundable_eitc_abolish_children diff --git a/fiscalsim_us/parameters/gov/doe/README.md b/fiscalsim_us/parameters/gov/doe/README.md index bed7b3a6f..33a61bff4 100644 --- a/fiscalsim_us/parameters/gov/doe/README.md +++ b/fiscalsim_us/parameters/gov/doe/README.md @@ -1 +1 @@ -# DOE +# Department of Energy (DOE) diff --git a/fiscalsim_us/parameters/gov/dol/README.md b/fiscalsim_us/parameters/gov/dol/README.md new file mode 100644 index 000000000..72eefc0d4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/dol/README.md @@ -0,0 +1 @@ +# Department of Labor (DOL) diff --git a/fiscalsim_us/parameters/gov/dol/minimum_wage.yaml b/fiscalsim_us/parameters/gov/dol/minimum_wage.yaml new file mode 100644 index 000000000..0c2422019 --- /dev/null +++ b/fiscalsim_us/parameters/gov/dol/minimum_wage.yaml @@ -0,0 +1,11 @@ +description: The US requires each employer to pay each of its employees the following federal minimum wage rate. +values: + 2007-07-24: 5.84 + 2008-07-24: 6.55 + 2009-07-24: 7.25 +metadata: + unit: currency-USD + label: Federal minimum wage + reference: + - title: 29 U.S. Code § 206 - Minimum wage + href: https://www.law.cornell.edu/uscode/text/29/206 diff --git a/fiscalsim_us/parameters/gov/ed/README.md b/fiscalsim_us/parameters/gov/ed/README.md new file mode 100644 index 000000000..fabe1a582 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/README.md @@ -0,0 +1 @@ +# Department of Education diff --git a/fiscalsim_us/parameters/gov/states/mo/index.yaml b/fiscalsim_us/parameters/gov/ed/index.yaml similarity index 77% rename from fiscalsim_us/parameters/gov/states/mo/index.yaml rename to fiscalsim_us/parameters/gov/ed/index.yaml index a50c592b9..2852e302a 100644 --- a/fiscalsim_us/parameters/gov/states/mo/index.yaml +++ b/fiscalsim_us/parameters/gov/ed/index.yaml @@ -1,3 +1,4 @@ metadata: propagate_metadata_to_children: true economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/README.md b/fiscalsim_us/parameters/gov/ed/pell_grant/README.md new file mode 100644 index 000000000..5fea230ce --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/README.md @@ -0,0 +1 @@ +# Pell Grant diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/amount/max.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/amount/max.yaml new file mode 100644 index 000000000..d5b1793f2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/amount/max.yaml @@ -0,0 +1,9 @@ +description: The Department of Education limits Pell Grants to this amount. +values: + 2023-01-01: 7_395 +metadata: + unit: currency-USD + label: Maximum value of the Pell Grant + reference: + - title: 2023-2024 Federal Pell Grant Payment and Disbursement Schedules + href: https://fsapartners.ed.gov/knowledge-center/library/dear-colleague-letters/2023-01-26/2023-2024-federal-pell-grant-payment-and-disbursement-schedules diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/amount/min.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/amount/min.yaml new file mode 100644 index 000000000..b467374e3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/amount/min.yaml @@ -0,0 +1,9 @@ +description: The Department of Education does not provide Pell Grants if the calculated amount is less than this value. +values: + 2023-01-01: 750 +metadata: + unit: currency-USD + label: Minimum value of the Pell Grant + reference: + - title: 2023-2024 Federal Pell Grant Payment and Disbursement Schedules + href: https://fsapartners.ed.gov/knowledge-center/library/dear-colleague-letters/2023-01-26/2023-2024-federal-pell-grant-payment-and-disbursement-schedules diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/README.md b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/README.md new file mode 100644 index 000000000..23f372881 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/README.md @@ -0,0 +1 @@ +# Expected Family Contribution diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/automatic_zero.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/automatic_zero.yaml new file mode 100644 index 000000000..2a35d4289 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/automatic_zero.yaml @@ -0,0 +1,53 @@ +description: The Department of Education sets the Expected Family Contribution to zero if a family has income below this value. +values: + 2009-08-01: + value: 30_000 + metadata: + reference: + title: THE EFC FORMULA, 2009–2010 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/111408EFCFormulaGuide0910.pdf#page=5 + 2011-08-01: + value: 31_000 + metadata: + reference: + - title: THE EFC FORMULA, 2011–2012 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/101310EFCFormulaGuide1112.pdf#page=5 + 2012-08-01: + value: 23_000 + metadata: + reference: + - title: PELL GRANT ELIGIBILITY CHANGES + href: https://www.acct.org/files/Advocacy/Factsheets%20and%20Summaries/pell%20grant%20eligibility%20changes%20website.pdf. + 2013-08-01: + value: 24_000 + metadata: + reference: + - title: THE EFC FORMULA, 2013–2014 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/091312EFCFormulaGuide1314.pdf#page=5 + 2016-08-01: + value: 25_000 + metadata: + reference: + - title: THE EFC FORMULA, 2016–2017 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/100615EFCFormulaGuide1617Attach.pdf#page=5 + 2019-08-01: + value: 26_000 + metadata: + reference: + - title: THE EFC FORMULA, 2019–2020 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/1920EFCFormulaGuide.pdf#page=5 + 2021-08-01: + value: 27_000 + metadata: + reference: + - title: THE EFC FORMULA, 2021–2022 + href: https://fsapartners.ed.gov/sites/default/files/attachments/2020-08/2122EFCFormulaGuide.pdf#page=5 + 2023-08-01: + value: 29_000 + metadata: + reference: + - title: THE EFC FORMULA, 2023–2024 + href: https://fsapartners.ed.gov/sites/default/files/2022-08/2324EFCFormulaGuide.pdf#page=5 +metadata: + unit: currency-USD + label: Max income for an automatic 0 EFC diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/asset_assessment_rate.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/asset_assessment_rate.yaml new file mode 100644 index 000000000..f60caa45b --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/asset_assessment_rate.yaml @@ -0,0 +1,9 @@ +description: The Department of Education counts this share of a dependent student's assets towards the expected family contribution. +values: + 2023-01-01: 0.2 +metadata: + unit: /1 + label: EFC dependent asset assessment rate + reference: + - title: THE EFC FORMULA, 2022–2023, line 49 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf#page=10 diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/income_assessment_rate.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/income_assessment_rate.yaml new file mode 100644 index 000000000..8a78097e5 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/income_assessment_rate.yaml @@ -0,0 +1,9 @@ +description: The Education Department counts this percent of a dependent student's income towards the Pell Grant expected family contribution. +values: + 2023-01-01: 0.5 +metadata: + unit: /1 + label: Pell Grant EFC dependent income assessment rate + reference: + - title: THE EFC FORMULA, 2022–2023, line 43 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf#page=10 diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/ipa.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/ipa.yaml new file mode 100644 index 000000000..37fe57dc5 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/dependent/ipa.yaml @@ -0,0 +1,9 @@ +description: The Department of Education disregards this amount of income when computing the expected family contribution. +values: + 2023-01-01: 7_040 +metadata: + unit: currency-USD + label: Income protection allowance + reference: + - title: THE EFC FORMULA, 2022–2023, line 39 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf#page=10 diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/asset_assessment_rate.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/asset_assessment_rate.yaml new file mode 100644 index 000000000..7d7bebfbf --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/asset_assessment_rate.yaml @@ -0,0 +1,13 @@ +description: The Department of Education counts this percent of assets of the head and their spouse towards the expected family contribution. +A: + 2023-01-01: 0.12 +B: + 2023-01-01: 0.2 +C: + 2023-01-01: 0.07 +metadata: + unit: /1 + label: Percent of head assets for the head contribution + reference: + - title: THE EFC FORMULA, 2022–2023, page 9 line 23, page 17 line 25, page 21 line 23 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/income_assessment_rate.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/income_assessment_rate.yaml new file mode 100644 index 000000000..df6ee7028 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/income_assessment_rate.yaml @@ -0,0 +1,13 @@ +description: The Department of Education adjusts the income of the head and their spouse by these factors based on the formula being used. +A: + 2023-01-01: 1 +B: + 2023-01-01: 0.5 +C: + 2023-01-01: 1 +metadata: + unit: /1 + label: Income modification based off of the formula used + reference: + - title: THE EFC FORMULA, 2022–2023, line 16 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf#page=17 diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/marginal_rate.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/marginal_rate.yaml new file mode 100644 index 000000000..bb3a0e11b --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/marginal_rate.yaml @@ -0,0 +1,167 @@ +description: The Department of Education calculates the contribution from available income with the following percents. +brackets: + - threshold: + 2009-08-01: 0 + rate: + 2023-01-01: 0.22 + - threshold: + 2009-08-01: + value: 14_200 + metadata: + reference: + - title: THE EFC FORMULA, 2009–2010 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/111408EFCFormulaGuide0910.pdf#page=35 + 2010-08-01: + value: 14_500 + metadata: + reference: + - title: THE EFC FORMULA, 2010–2011 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/062810EFCFormulaGuideUpdate1011.pdf#page=35 + 2012-08-01: + value: 14_600 + metadata: + reference: + - title: THE EFC FORMULA, 2012–2013 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/082511EFCFormulaGuide1213.pdf#page=35 + 2013-08-01: + value: 15_300 + metadata: + reference: + - title: THE EFC FORMULA, 2013–2014 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/091312EFCFormulaGuide1314.pdf#page=35 + 2014-08-01: + value: 15_600 + metadata: + reference: + - title: THE EFC FORMULA, 2014–2015 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/091913EFCFormulaGuide1415.pdf#page=35 + 2015-08-01: + value: 15_700 + metadata: + reference: + - title: THE EFC FORMULA, 2015–2016 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/090214EFCFormulaGuide1516.pdf#page=35 + 2016-08-01: + value: 15_900 + metadata: + reference: + - title: THE EFC FORMULA, 2016–2017 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/100615EFCFormulaGuide1617Attach.pdf#page=35 + 2017-08-01: + value: 16_000 + metadata: + reference: + - title: THE EFC FORMULA, 2017–2018 + href: https://www.luminafoundation.org/wp-content/uploads/2019/06/2017-18-efc-formula.pdf#page=35 + 2018-08-01: + value: 16_400 + metadata: + reference: + - title: THE EFC FORMULA, 2018–2019 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/071017EFCFormulaGuide1819.pdf#page=35 + 2019-08-01: + value: 16_600 + metadata: + reference: + - title: THE EFC FORMULA, 2019–2020 + href: https://fsapartners.ed.gov/sites/default/files/attachments/efcformulaguide/1920EFCFormulaGuide.pdf#page=35 + 2020-08-01: + value: 17_000 + metadata: + reference: + - title: THE EFC FORMULA, 2020–2021 + href: https://fsapartners.ed.gov/sites/default/files/attachments/2019-10/2021EFCFormulaGuideOct2019UpdateAttach.pdf#page=35 + 2021-08-01: + value: 17_400 + metadata: + reference: + - title: THE EFC FORMULA, 2021–2022 + href: https://fsapartners.ed.gov/sites/default/files/attachments/2020-08/2122EFCFormulaGuide.pdf#page=29 + 2022-08-01: + value: 17_500 + metadata: + reference: + - title: THE EFC FORMULA, 2022–2023 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf#page=29 + 2023-08-01: + value: 18_900 + metadata: + reference: + - title: THE EFC FORMULA, 2023–2024 + href: https://fsapartners.ed.gov/sites/default/files/2022-08/2324EFCFormulaGuide.pdf#page=29 + rate: + 2023-01-01: 0.25 + - threshold: + 2009-08-01: 17_800 + 2010-08-01: 18_200 + 2012-08-01: 18_400 + 2013-08-01: 19_200 + 2014-08-01: 19_600 + 2015-08-01: 19_700 + 2016-08-01: 20_000 + 2017-08-01: 20_100 + 2018-08-01: 20_500 + 2019-08-01: 20_800 + 2020-08-01: 21_400 + 2021-08-01: 21_800 + 2022-08-01: 22_000 + 2023-08-01: 23_800 + rate: + 2023-01-01: 0.29 + - threshold: + 2009-08-01: 21_400 + 2010-08-01: 21_900 + 2012-08-01: 22_100 + 2013-08-01: 23_100 + 2014-08-01: 23_500 + 2015-08-01: 23_700 + 2016-08-01: 24_100 + 2017-08-01: 24_200 + 2018-08-01: 24_700 + 2019-08-01: 25_100 + 2020-08-01: 25_700 + 2021-08-01: 26_200 + 2022-08-01: 26_500 + 2023-08-01: 28_600 + rate: + 2023-01-01: 0.34 + - threshold: + 2009-08-01: 25_000 + 2010-08-01: 25_600 + 2012-08-01: 25_900 + 2013-08-01: 27_000 + 2014-08-01: 27_500 + 2015-08-01: 27_700 + 2016-08-01: 28_200 + 2017-08-01: 28_300 + 2018-08-01: 28_900 + 2019-08-01: 29_300 + 2020-08-01: 30_100 + 2021-08-01: 30_700 + 2022-08-01: 31_000 + 2023-08-01: 33_500 + rate: + 2023-01-01: 0.4 + - threshold: + 2009-08-01: 28_600 + 2010-08-01: 29_300 + 2012-08-01: 29_600 + 2013-08-01: 30_900 + 2014-08-01: 31_500 + 2015-08-01: 31_700 + 2016-08-01: 32_200 + 2017-08-01: 32_300 + 2018-08-01: 33_100 + 2019-08-01: 33_600 + 2020-08-01: 34_500 + 2021-08-01: 35_100 + 2022-08-01: 35_500 + 2023-08-01: 38_300 + rate: + 2023-01-01: 0.47 +metadata: + label: EFC rate + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD + rate_unit: /1 diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/min_contribution.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/min_contribution.yaml new file mode 100644 index 000000000..9aefd2f18 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/min_contribution.yaml @@ -0,0 +1,9 @@ +description: The Department of Education defines the minimum contribution as this value. +values: + 2023-01-01: -750 +metadata: + unit: currency-USD + label: Minimum head contribution + reference: + - title: THE EFC FORMULA, 2022–2023 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf#page=29 diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/negative_rate.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/negative_rate.yaml new file mode 100644 index 000000000..3d133d984 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/head/negative_rate.yaml @@ -0,0 +1,9 @@ +description: The Department of Education defines the percent of negative available income that counts towards contibution as this value. +values: + 2023-01-01: 0.22 +metadata: + unit: /1 + label: Percent of income for negative head available income + reference: + - title: THE EFC FORMULA, 2022–2023 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf#page=29 diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/simplified/benefits.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/simplified/benefits.yaml new file mode 100644 index 000000000..cdd6b73ee --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/simplified/benefits.yaml @@ -0,0 +1,15 @@ +description: The Department of Education will used a simplified formula if a household has any of these benefits. +values: + 2023-01-01: + - snap + - school_meal_net_subsidy + - tanf + - spm_unit_wic + - medicaid + - ssi +metadata: + unit: list + label: Qualifying benefits for EFC simplified formula + reference: + - title: THE EFC FORMULA, 2022–2023 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf#page=4 diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/efc/simplified/income_limit.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/simplified/income_limit.yaml new file mode 100644 index 000000000..27820f564 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/efc/simplified/income_limit.yaml @@ -0,0 +1,9 @@ +description: The Department of Education uses the simplified formula if the head and spouse income are below this amount. +values: + 2023-01-01: 50_000 +metadata: + unit: currency-USD + label: Simplified formula max income + reference: + - title: THE EFC FORMULA, 2022–2023 + href: https://fsapartners.ed.gov/sites/default/files/2021-08/2223EFCFormulaGuide.pdf#page=5 diff --git a/fiscalsim_us/parameters/gov/ed/pell_grant/months_in_school_year.yaml b/fiscalsim_us/parameters/gov/ed/pell_grant/months_in_school_year.yaml new file mode 100644 index 000000000..2796f2883 --- /dev/null +++ b/fiscalsim_us/parameters/gov/ed/pell_grant/months_in_school_year.yaml @@ -0,0 +1,12 @@ +description: The Department of Education defines a full school year as this number of months. +values: + 2023-01-01: 9 +metadata: + unit: int + label: Months in school year + reference: + - title: THE EFC FORMULA, 2022–2023 + # "As a reminder, in using the attached schedules for awarding a Federal Pell Grant + # to a student, the full nine-month EFC must always be used regardless of the + # student’s actual period of attendance." + href: https://fsapartners.ed.gov/knowledge-center/library/dear-colleague-letters/2023-01-26/2023-2024-federal-pell-grant-payment-and-disbursement-schedules diff --git a/fiscalsim_us/parameters/gov/fcc/README.md b/fiscalsim_us/parameters/gov/fcc/README.md index dea0c21a7..8d3fb9f79 100644 --- a/fiscalsim_us/parameters/gov/fcc/README.md +++ b/fiscalsim_us/parameters/gov/fcc/README.md @@ -1 +1 @@ -# FCC +# Federal Communications Commission (FCC) diff --git a/fiscalsim_us/parameters/gov/fcc/acp/README.md b/fiscalsim_us/parameters/gov/fcc/acp/README.md index bbf1b4371..4dcdcd85c 100644 --- a/fiscalsim_us/parameters/gov/fcc/acp/README.md +++ b/fiscalsim_us/parameters/gov/fcc/acp/README.md @@ -1 +1 @@ -# Affordable Connectivity Program +# Affordable Connectivity Program (ACP) diff --git a/fiscalsim_us/parameters/gov/fcc/acp/categorical_eligibility.yaml b/fiscalsim_us/parameters/gov/fcc/acp/categorical_eligibility.yaml index 798e4ae5d..15fa6ab58 100644 --- a/fiscalsim_us/parameters/gov/fcc/acp/categorical_eligibility.yaml +++ b/fiscalsim_us/parameters/gov/fcc/acp/categorical_eligibility.yaml @@ -6,13 +6,13 @@ values: - lifeline # fcc.gov/acp - free_school_meals # 47 USC 1752(a)(6)(B) - reduced_price_school_meals # 47 USC 1752(a)(6)(B) - - pell_grant # 47 USC 1752(a)(6)(C) + - spm_unit_pell_grant # 47 USC 1752(a)(6)(C) # Also a broadband provider's existing low-income program. - wic # 47 USC 1752(a)(6)(E) metadata: period: month reference: - - name: "47 USC 1752: Benefit for broadband service (a)(6)" + - name: '47 USC 1752: Benefit for broadband service (a)(6)' href: https://uscode.house.gov/view.xhtml?req=granuleid:USC-prelim-title47-section1752&edition=prelim - name: Affordable Connectivity Program - href: "https://www.fcc.gov/acp" + href: https://www.fcc.gov/acp diff --git a/fiscalsim_us/parameters/gov/fcc/ebb/README.md b/fiscalsim_us/parameters/gov/fcc/ebb/README.md index 63f776254..b4e085a08 100644 --- a/fiscalsim_us/parameters/gov/fcc/ebb/README.md +++ b/fiscalsim_us/parameters/gov/fcc/ebb/README.md @@ -1 +1 @@ -# Emergency Broadband Benefit +# Emergency Broadband Benefit (EBB) diff --git a/fiscalsim_us/parameters/gov/fcc/ebb/categorical_eligibility.yaml b/fiscalsim_us/parameters/gov/fcc/ebb/categorical_eligibility.yaml index d4b127159..6007bcb2f 100644 --- a/fiscalsim_us/parameters/gov/fcc/ebb/categorical_eligibility.yaml +++ b/fiscalsim_us/parameters/gov/fcc/ebb/categorical_eligibility.yaml @@ -7,7 +7,7 @@ values: - is_lifeline_eligible - free_school_meals - reduced_price_school_meals - - pell_grant + - spm_unit_pell_grant # At least one household member, since 2020-02-29. # This documents also limits this criterion by income: # https://www.fcc.gov/document/fcc-emergency-broadband-benefit-program-fact-sheet diff --git a/fiscalsim_us/parameters/gov/hhs/README.md b/fiscalsim_us/parameters/gov/hhs/README.md index 06fd71751..59da4f62c 100644 --- a/fiscalsim_us/parameters/gov/hhs/README.md +++ b/fiscalsim_us/parameters/gov/hhs/README.md @@ -1 +1 @@ -# HHS +# Department of Health and Human Services (HHS) diff --git a/fiscalsim_us/parameters/gov/hhs/ccdf/README.md b/fiscalsim_us/parameters/gov/hhs/ccdf/README.md index dd7af17d5..6a35370fa 100644 --- a/fiscalsim_us/parameters/gov/hhs/ccdf/README.md +++ b/fiscalsim_us/parameters/gov/hhs/ccdf/README.md @@ -1 +1 @@ -# Child Care Development Fund +# Child Care Development Fund (CCDF) diff --git a/fiscalsim_us/parameters/gov/hhs/ccdf/index.yaml b/fiscalsim_us/parameters/gov/hhs/ccdf/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/hhs/ccdf/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/hhs/medicaid/index.yaml b/fiscalsim_us/parameters/gov/hhs/medicaid/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/hhs/medicaid/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/hhs/smi/README.md b/fiscalsim_us/parameters/gov/hhs/smi/README.md index e023f5041..b049a19d8 100644 --- a/fiscalsim_us/parameters/gov/hhs/smi/README.md +++ b/fiscalsim_us/parameters/gov/hhs/smi/README.md @@ -1 +1 @@ -# State median income +# State Median Income (SMI) diff --git a/fiscalsim_us/parameters/gov/hhs/tanf/README.md b/fiscalsim_us/parameters/gov/hhs/tanf/README.md index eb8aeb3f9..5d5a891e7 100644 --- a/fiscalsim_us/parameters/gov/hhs/tanf/README.md +++ b/fiscalsim_us/parameters/gov/hhs/tanf/README.md @@ -1 +1 @@ -# Temporary Assistance for Needy Families +# Temporary Assistance for Needy Families (TANF) diff --git a/fiscalsim_us/parameters/gov/hhs/tanf/non_cash/asset_limit.yaml b/fiscalsim_us/parameters/gov/hhs/tanf/non_cash/asset_limit.yaml index 8c2546a34..df7aa98a6 100644 --- a/fiscalsim_us/parameters/gov/hhs/tanf/non_cash/asset_limit.yaml +++ b/fiscalsim_us/parameters/gov/hhs/tanf/non_cash/asset_limit.yaml @@ -19,6 +19,13 @@ CA: # * 2020-07-01: .inf CO: # * 2020-07-01: -.inf # Non-BBCE. + # May have changed prior to 2022-11-30. + 2022-11-30: + value: .inf + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.206(C)(2)(b) (page 35) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2020-07-01: .inf DE: diff --git a/fiscalsim_us/parameters/gov/hhs/tanf/non_cash/income_limit/gross.yaml b/fiscalsim_us/parameters/gov/hhs/tanf/non_cash/income_limit/gross.yaml index 71d8e6eae..b6c0b07fa 100644 --- a/fiscalsim_us/parameters/gov/hhs/tanf/non_cash/income_limit/gross.yaml +++ b/fiscalsim_us/parameters/gov/hhs/tanf/non_cash/income_limit/gross.yaml @@ -14,6 +14,13 @@ CA: 2020-07-01: 2 CO: 2020-07-01: -.inf # Non-BBCE. + # Maybe have changed prior to 2022-11-30. + 2022-11-30: + value: 2 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.206(C)(2)(a)(1) (page 34) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2020-07-01: 1.85 DE: diff --git a/fiscalsim_us/parameters/gov/hud/README.md b/fiscalsim_us/parameters/gov/hud/README.md index 2dd2962b8..4a463588a 100644 --- a/fiscalsim_us/parameters/gov/hud/README.md +++ b/fiscalsim_us/parameters/gov/hud/README.md @@ -1 +1 @@ -# HUD +# Department of Housing and Urban Development (HUD) diff --git a/fiscalsim_us/parameters/gov/hud/ami_limit/README.md b/fiscalsim_us/parameters/gov/hud/ami_limit/README.md index fda64d22a..baa12a471 100644 --- a/fiscalsim_us/parameters/gov/hud/ami_limit/README.md +++ b/fiscalsim_us/parameters/gov/hud/ami_limit/README.md @@ -1 +1 @@ -# AMI limit +# Area Median Income (AMI) Limit diff --git a/fiscalsim_us/parameters/gov/hud/index.yaml b/fiscalsim_us/parameters/gov/hud/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/hud/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/irs/README.md b/fiscalsim_us/parameters/gov/irs/README.md index 620f1ac97..c661ecef1 100644 --- a/fiscalsim_us/parameters/gov/irs/README.md +++ b/fiscalsim_us/parameters/gov/irs/README.md @@ -1 +1 @@ -# IRS +# Internal Revenue Service (IRS) diff --git a/fiscalsim_us/parameters/gov/irs/ald/loss/capital/max.yaml b/fiscalsim_us/parameters/gov/irs/ald/loss/capital/max.yaml index 804b71c0a..20226ed36 100644 --- a/fiscalsim_us/parameters/gov/irs/ald/loss/capital/max.yaml +++ b/fiscalsim_us/parameters/gov/irs/ald/loss/capital/max.yaml @@ -1,4 +1,13 @@ description: Maximum capital loss deductible from gross income to reach AGI. +metadata: + unit: currency-USD + label: Maximum capital loss deductible above-the-line + breakdown: + - filing_status + reference: + - title: 26 U.S. Code § 1211 - Limitation on capital losses + href: https://www.law.cornell.edu/uscode/text/26/1211 + SINGLE: 2010-01-01: 3_000 JOINT: @@ -9,10 +18,3 @@ HEAD_OF_HOUSEHOLD: 2010-01-01: 3_000 WIDOW: 2010-01-01: 3_000 -metadata: - unit: currency-USD - name: max_capital_loss_ald - label: Maximum capital loss deductible above-the-line - reference: - - title: 26 U.S. Code § 1211 - Limitation on capital losses - href: https://www.law.cornell.edu/uscode/text/26/1211 diff --git a/fiscalsim_us/parameters/gov/irs/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/irs/credits/cdcc/README.md index 486fa4406..03da87d0c 100644 --- a/fiscalsim_us/parameters/gov/irs/credits/cdcc/README.md +++ b/fiscalsim_us/parameters/gov/irs/credits/cdcc/README.md @@ -1 +1 @@ -# Child and dependent care deduction +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/irs/credits/ctc/README.md b/fiscalsim_us/parameters/gov/irs/credits/ctc/README.md index 2d2df5ce5..412bf336c 100644 --- a/fiscalsim_us/parameters/gov/irs/credits/ctc/README.md +++ b/fiscalsim_us/parameters/gov/irs/credits/ctc/README.md @@ -1 +1 @@ -# Child tax credit +# Child Tax Credit diff --git a/fiscalsim_us/parameters/gov/irs/credits/eitc/README.md b/fiscalsim_us/parameters/gov/irs/credits/eitc/README.md index 2e7ee9ede..4808d739a 100644 --- a/fiscalsim_us/parameters/gov/irs/credits/eitc/README.md +++ b/fiscalsim_us/parameters/gov/irs/credits/eitc/README.md @@ -1 +1 @@ -# Earned income tax credit +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/ssa/README.md b/fiscalsim_us/parameters/gov/ssa/README.md index f955e467a..d1efc9333 100644 --- a/fiscalsim_us/parameters/gov/ssa/README.md +++ b/fiscalsim_us/parameters/gov/ssa/README.md @@ -1 +1 @@ -# SSA +# Social Security Administration (SSA) diff --git a/fiscalsim_us/parameters/gov/ssa/ssi/README.md b/fiscalsim_us/parameters/gov/ssa/ssi/README.md index 54f6d59e5..dd19b5c5a 100644 --- a/fiscalsim_us/parameters/gov/ssa/ssi/README.md +++ b/fiscalsim_us/parameters/gov/ssa/ssi/README.md @@ -1 +1 @@ -# Supplemental Security Income +# Supplemental Security Income (SSI) diff --git a/fiscalsim_us/parameters/gov/states/al/index.yaml b/fiscalsim_us/parameters/gov/states/al/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/al/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ar/index.yaml b/fiscalsim_us/parameters/gov/states/ar/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..3ec6ea2cb --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit \ No newline at end of file diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/cdcc/match.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/cdcc/match.yaml new file mode 100644 index 000000000..4708df973 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/cdcc/match.yaml @@ -0,0 +1,12 @@ +description: Arkansas matches this percentage of the federal child and dependent care credit. +metadata: + unit: /1 + period: year + label: Arkansas household and dependents care credit match + reference: + - title: Ark. Code R. § 26-51-502(c)(1)(A)(ii) + href: https://codes.findlaw.com/ar/title-26-taxation/ar-code-sect-26-51-502/ + - title: Arkansas 2022 AR2441 | line 10 + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_AR2441_Child_andDependentCareExpenses.pdf#page=1 +values: + 2013-01-01: 0.2 diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/max_amount.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/max_amount.yaml new file mode 100644 index 000000000..a5d4baeac --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/max_amount.yaml @@ -0,0 +1,27 @@ +description: Arkansas allows for this maximum inflationary relief tax credit amount, based on filing status. +metadata: + period: year + unit: currency-USD + label: Arkansas income-tax credit maximum amount + reference: + # The inflation relief credit is not mentioned in the Arkansas statutes + - title: Arkansas 2022 Individual Income Tax Forms and Instructions + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_AR1000F_and_AR1000NR_Instructions.pdf#page=26 + - title: Inflationary relief income-tax credit worksheet + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_Final_InflationaryReliefIncomeTaxCredit_FI.pdf#page=1 + - title: Department of finance and administration, Bill HB1002 + href: https://www.arkleg.state.ar.us/Home/FTPDocument?path=%2FAssembly%2F2021%2F2022S3%2FFiscal+Impacts%2FHB1002-DFA1.pdf#page=2 + + breakdown: + - filing_status +JOINT: + 2022-01-01: 300 +WIDOW: + 2022-01-01: 150 +HEAD_OF_HOUSEHOLD: + 2022-01-01: 150 +SINGLE: + 2022-01-01: 150 +SEPARATE: + 2022-01-01: 150 + diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/amount.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/amount.yaml new file mode 100644 index 000000000..035fb89e8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/amount.yaml @@ -0,0 +1,25 @@ +description: Arkansas reduces the inflationary relief tax credit by this amount for each increment of taxable income above the threshold, based on the filing status. +metadata: + period: year + unit: currency-USD + label: Arkansas inflation relief credit reduction amount + reference: + # The inflation relief credit is not mentioned in the Arkansas statutes + # House bill did not specify reduction amount + - title: Arkansas 2022 Individual Income Tax Forms and Instructions + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_AR1000F_and_AR1000NR_Instructions.pdf#page=26 + - title: Inflationary relief income-tax credit worksheet + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_Final_InflationaryReliefIncomeTaxCredit_FI.pdf#page=1 + breakdown: + - filing_status +JOINT: + 2022-01-01: 20 +WIDOW: + 2022-01-01: 10 +HEAD_OF_HOUSEHOLD: + 2022-01-01: 10 +SINGLE: + 2022-01-01: 10 +SEPARATE: + 2022-01-01: 10 + diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/increment.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/increment.yaml new file mode 100644 index 000000000..44e95d247 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/increment.yaml @@ -0,0 +1,25 @@ +description: Arkansas reduces the inflationary relief tax credit for each of these increments of taxable income above the threshold, based on filing status. +metadata: + period: year + unit: currency-USD + label: Arkansas income reduction increment + reference: + # The inflation relief credit is not mentioned in the Arkansas statutes + # House bill did not specify reduction increment + - title: Arkansas 2022 Individual Income Tax Forms and Instructions + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_AR1000F_and_AR1000NR_Instructions.pdf#page=26 + - title: Inflationary relief income-tax credit worksheet + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_Final_InflationaryReliefIncomeTaxCredit_FI.pdf#page=1 + + breakdown: + - filing_status +JOINT: + 2022-01-01: 2_000 +WIDOW: + 2022-01-01: 1_000 +HEAD_OF_HOUSEHOLD: + 2022-01-01: 1_000 +SINGLE: + 2022-01-01: 1_000 +SEPARATE: + 2022-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/start.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/start.yaml new file mode 100644 index 000000000..6968b359d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/inflationary_relief/reduction/start.yaml @@ -0,0 +1,26 @@ +description: Arkansas provides inflationary relief tax credit to filers with taxable income above this amount, based on filing status. +metadata: + reference: + # The inflation relief credit is not mentioned in the Arkansas statutes + - title: Arkansas 2022 Individual Income Tax Forms and Instructions + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_AR1000F_and_AR1000NR_Instructions.pdf#page=26 + - title: Inflationary relief income-tax credit worksheet + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_Final_InflationaryReliefIncomeTaxCredit_FI.pdf#page=1 + - title: Department of finance and administration, Bill HB1002 + href: https://www.arkleg.state.ar.us/Home/FTPDocument?path=%2FAssembly%2F2021%2F2022S3%2FFiscal+Impacts%2FHB1002-DFA1.pdf#page=2 + label: Arkansas inflation reduction credit reduction start + unit: currency-USD + period: year + + breakdown: + - filing_status +JOINT: + 2022-01-01: 174_000 +WIDOW: + 2022-01-01: 87_000 +HEAD_OF_HOUSEHOLD: + 2022-01-01: 87_000 +SINGLE: + 2022-01-01: 87_000 +SEPARATE: + 2022-01-01: 87_000 diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..d323914a1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/non_refundable.yaml @@ -0,0 +1,11 @@ +description: Arkansas provides these nonrefundable income tax credits. +values: + 2022-01-01: + - ar_inflation_relief_credit +metadata: + reference: + - title: Inflationary relief income-tax credit worksheet + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_Final_InflationaryReliefIncomeTaxCredit_FI.pdf#page=1 + unit: list + period: year + label: Arkansas nonrefundable income tax credits diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..aeb1e0686 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/credits/refundable.yaml @@ -0,0 +1,11 @@ +description: Arkansas provides these refundable income tax credits. +values: + 2021-01-01: + - ar_cdcc +metadata: + reference: + - title: Ark. Code R. § 26-51-502 Household and dependent care expenses (c)(1)(A)(ii) + href: https://codes.findlaw.com/ar/title-26-taxation/ar-code-sect-26-51-502/ + unit: list + period: year + label: Arkansas refundable income tax credits diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/deductions/standard.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/deductions/standard.yaml new file mode 100644 index 000000000..3492fb804 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/deductions/standard.yaml @@ -0,0 +1,35 @@ +description: Arkansas provides a standard deduction of this amount, based on filing status. +metadata: + label: Arkansas standard deduction + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: Code of Arkansas Public Access A.C.A. Subchapter 4. § 26-51-430.(b).(1).(A) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=8a0a4a46-62e0-41b6-8539-42452c3a9e46&nodeid=ABAAAFAACAAFABG&nodepath=%2FROOT%2FABA%2FABAAAF%2FABAAAFAAC%2FABAAAFAACAAF%2FABAAAFAACAAFABG&level=5&haschildren=&populated=false&title=26-51-430.+Deductions+%E2%80%94+Standard+deduction+%E2%80%94+Definition.&config=00JAA2ZjZiM2VhNS0wNTVlLTQ3NzUtYjQzYy0yYWZmODJiODRmMDYKAFBvZENhdGFsb2fXiYCnsel0plIgqpYkw9PK&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A649P-FBD0-R03K-54BT-00008-00&ecomp=7gf5kkk&prid=4b6d04eb-5f42-47a5-b744-f8596299a894 + - title: Arkansas 2022 Individual Income Tax Forms and Instructions + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_AR1000F_and_AR1000NR_Instructions.pdf#page=14 + - title: Arkansas 2021 Individual Income Tax Forms and Instructions + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2021_AR1000F_and_AR1000NR_Instructions.pdf#page=13 + +JOINT: + # $4,400 in 2015 + COLA, rounded by $10. + 2021-01-01: 4_400 + 2022-01-01: 4_540 +SINGLE: + # $2_200 in 2015 + COLA, rounded by $10. + 2021-01-01: 2_200 + 2022-01-01: 2_270 +SEPARATE: + # $2,200 in 2015 + COLA, rounded by $10. + 2021-01-01: 2_200 + 2022-01-01: 2_270 +HEAD_OF_HOUSEHOLD: + # $2,200 in 2015 + COLA, rounded by $10. + 2021-01-01: 2_200 + 2022-01-01: 2_270 +WIDOW: + # $2,200 in 2015 + COLA, rounded by $10. + 2021-01-01: 2_200 + 2022-01-01: 2_270 diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/exemptions.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/exemptions.yaml new file mode 100644 index 000000000..cb9d2e00a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/exemptions.yaml @@ -0,0 +1,24 @@ +description: Arkansas accounts for these exemptions when calculating the state adjusted gross income. +values: + 2021-01-01: + - military_retirement_pay # Item 1 + - child_support_received # Item 4 + - us_govt_interest # Item 7 + - workers_compensation # Item 8 + - social_security # Item 8 + - veterans_benefits # Item 8 + - disability_benefits # Item 10 + # disability benefits pursuant to IRS §104 + - military_basic_pay # Item 11 + +metadata: + unit: list + label: Arkansas exemptions + reference: + - title: Arkansas 2022 Individual Income Tax Forms and Instructions + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_AR1000F_and_AR1000NR_Instructions.pdf#page=10 + - title: Arkansas 2021 Individual Income Tax Forms and Instructions + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2021_AR1000F_and_AR1000NR_Instructions.pdf#page=9 + - title: 2020 Arkansas Code § 26-51-301 ~ 316 + href: https://law.justia.com/codes/arkansas/2020/title-26/subtitle-5/chapter-51/subchapter-3/ + # The legal code does not give detailed description on each exemption. diff --git a/fiscalsim_us/parameters/gov/states/ar/tax/income/rates/main.yaml b/fiscalsim_us/parameters/gov/states/ar/tax/income/rates/main.yaml new file mode 100644 index 000000000..ee71d9445 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ar/tax/income/rates/main.yaml @@ -0,0 +1,47 @@ +description: Arkansas taxes personal income at these rates. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Arkansas income tax rate + reference: + - title: Tax Legislation for 2022 Ark. Code § 26-51-201 (a)(1)(A) + href: https://casetext.com/statute/arkansas-code-of-1987/title-26-taxation/subtitle-5-state-taxes/chapter-51-income-taxes/subchapter-2-imposition-of-tax/section-26-51-201-effective-90-days-after-sine-die-adjournment-individuals-trusts-and-estates + + - title: 2022 Indexed Tax Brackets + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/TaxBrackets_2022.pdf#page=1 + - title: 2021 Indexed Tax Brackets + href: https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/TaxBrackets_2021.pdf#page=1 + +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0 + - threshold: + 2021-01-01: 4_800 + 2022-01-01: 5_100 + rate: + 2021-01-01: 0.02 + - threshold: + 2021-01-01: 9_500 + 2022-01-01: 10_300 + rate: + 2021-01-01: 0.03 + - threshold: + 2021-01-01: 14_300 + 2022-01-01: 14_700 + rate: + 2021-01-01: 0.034 + - threshold: + 2021-01-01: 23_600 + 2022-01-01: 24_300 + rate: + 2021-01-01: 0.05 + 2022-01-01: 0.049 + - threshold: + 2021-01-01: 39_700 + 2022-01-01: .inf + rate: + 2021-01-01: 0.059 + 2022-01-01: 0.049 diff --git a/fiscalsim_us/parameters/gov/states/az/index.yaml b/fiscalsim_us/parameters/gov/states/az/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/charitable_contribution/ceiling/qualifying_foster.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/charitable_contribution/ceiling/qualifying_foster.yaml new file mode 100644 index 000000000..804221f8f --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/charitable_contribution/ceiling/qualifying_foster.yaml @@ -0,0 +1,26 @@ +description: Arizona caps the credit for contributions to a qualifying foster care charitable organization at this amount. +metadata: + label: Arizona credit for contributions to foster organizations cap + + unit: currency-USD + breakdown: + - filing_status + reference: + - title: Ariz. Rev. Stat. § 43-1088 (B) + href: https://casetext.com/statute/arizona-revised-statutes/title-43-taxation-of-income/chapter-10-individuals/article-5-credits/section-43-1088-effective-until-ninety-one-days-after-adjournment-credit-for-contribution-to-qualifying-charitable-organizations-definitions + - title: Arizona Schedule A + href: https://azdor.gov/forms/individual/itemized-deduction-adjustments-form + - title: Credit for Contributions to Qualifying Charitable Foster + href: https://azdor.gov/forms/tax-credits-forms/credit-contributions-qualifying-foster-care-charitable-organizations + +JOINT: + 2021-01-01: 1_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 1_000 +WIDOW: + 2021-01-01: 1_000 +SINGLE: + 2021-01-01: 1_000 +SEPARATE: + 2021-01-01: 500 + diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/charitable_contribution/ceiling/qualifying_organization.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/charitable_contribution/ceiling/qualifying_organization.yaml new file mode 100644 index 000000000..a7479c89a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/charitable_contribution/ceiling/qualifying_organization.yaml @@ -0,0 +1,25 @@ +description: Arizona caps its credit for contributions to Arizona-based organizations at this amount. +metadata: + label: Arizona charitable contribution credit cap + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: Ariz. Rev. Stat. § 43-1088 (A) + href: https://casetext.com/statute/arizona-revised-statutes/title-43-taxation-of-income/chapter-10-individuals/article-5-credits/section-43-1088-effective-until-ninety-one-days-after-adjournment-credit-for-contribution-to-qualifying-charitable-organizations-definitions + - title: Arizona Schedule A Year 2022 Page 1 + href: https://azdor.gov/forms/individual/itemized-deduction-adjustments-form#page=1 + - title: Credit for Contributions to Qualifying Charitable Organizations + href: https://azdor.gov/forms/tax-credits-forms/credit-contributions-qualifying-charitable-organizations + +JOINT: + 2021-01-01: 800 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 800 +WIDOW: + 2021-01-01: 800 +SINGLE: + 2021-01-01: 800 +SEPARATE: + 2021-01-01: 400 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/amount.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/amount.yaml new file mode 100644 index 000000000..e9903581b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/amount.yaml @@ -0,0 +1,23 @@ +description: Arizona allows this base amount under the dependent tax credit, based on the dependent age. +metadata: + type: single_amount + period: year + threshold_unit: age + amount_unit: currency-USD + label: Arizona dependent tax credit amount + reference: + - title: Arizona Form 140 - 2021 Resident Personal Income Tax Return + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page=20 + - title: Arizona Form 140 - 2022 Resident Personal Income Tax Return + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page=21 + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1073.01 (B), (1) & (2) + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01073-01.htm +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 17 + amount: + 2021-01-01: 25 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/increment.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/increment.yaml new file mode 100644 index 000000000..d7991856e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/increment.yaml @@ -0,0 +1,14 @@ +description: Arizona reduces the dependent tax credit amount in these increments of federal adjusted gross income. +metadata: + period: year + unit: currency-USD + label: Arizona dependent tax credit reduction increment + reference: + - title: Arizona Form 140 - 2021 Resident Personal Income Tax Return + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page=20 + - title: Arizona Form 140 - 2022 Resident Personal Income Tax Return + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page=21 + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1073.01 (C), (1) & (2) + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01073-01.htm +values: + 2021-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/percentage.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/percentage.yaml new file mode 100644 index 000000000..f3eb90045 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/percentage.yaml @@ -0,0 +1,14 @@ +description: Arizona reduces the dependent tax credit amount by this percentage based on the federal adjusted gross income increments. +metadata: + period: year + unit: /1 + label: Arizona dependent tax credit reduction percentage + reference: + - title: Arizona Form 140 - 2021 Resident Personal Income Tax Return + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page=20 + - title: Arizona Form 140 - 2022 Resident Personal Income Tax Return + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page=21 + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1073.01 (C), (1) & (2) + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01073-01.htm +values: + 2021-01-01: 0.05 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/start.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/start.yaml new file mode 100644 index 000000000..0c00f427c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/dependent_credit/reduction/start.yaml @@ -0,0 +1,24 @@ +description: Arizona phases the dependent tax credit out for filers with adjusted gross income above this threshold. +SINGLE: + 2021-01-01: 200_000 +JOINT: + 2021-01-01: 400_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 200_000 +SEPARATE: + 2021-01-01: 200_000 +WIDOW: + 2021-01-01: 200_000 +metadata: + unit: currency-USD + period: year + label: Arizona dependent tax credit phase out start + reference: + - title: Arizona Form 140 - 2021 Resident Personal Income Tax Return + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page=20 + - title: Arizona Form 140 - 2022 Resident Personal Income Tax Return + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page=21 + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1073.01 (C), (1) & (2) + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01073-01.htm + breakdown: + - filing_status diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/amount/cap.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/amount/cap.yaml new file mode 100644 index 000000000..cdc4300bb --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/amount/cap.yaml @@ -0,0 +1,24 @@ +description: Arizona caps its family tax credit at this total amount, depending on filing status. +metadata: + period: year + unit: currency-USD + label: Arizona family tax credit maximum amount + breakdown: + - filing_status +SINGLE: + 2021-01-01: 120 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 240 +JOINT: + 2021-01-01: 240 +WIDOW: + 2021-01-01: 240 +SEPARATE: + 2021-01-01: 120 +reference: + - title: 43-1073. Family income tax credit (B) + href: https://www.azleg.gov/ars/43/01073.htm + - title: 2022 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page23 + - title: 2021 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page21 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/amount/per_person.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/amount/per_person.yaml new file mode 100644 index 000000000..dd67517cb --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/amount/per_person.yaml @@ -0,0 +1,14 @@ +description: Arizona provides the following family income tax credit amount per person. +metadata: + unit: currency-USD + period: year + label: Arizona Family Income Tax Credit amount + reference: + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1073. Family income tax credit (B) + href: https://www.azleg.gov/ars/43/01073.htm + - title: 2022 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page23 + - title: 2021 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page21 +values: + 2021-01-01: 40 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/head_of_household.yaml new file mode 100644 index 000000000..12e5c7db0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/head_of_household.yaml @@ -0,0 +1,34 @@ +description: Arizona qualifies head of household with income below this amount for the family tax credit. +metadata: + type: single_amount + threshold_unit: dependent + rate_unit: currency-USD + label: Arizona family tax credit head of household maximum income + reference: + - title: 43-1073. Family income tax credit (a) (1, 5-8) + href: https://www.azleg.gov/ars/43/01073.htm + - title: 2022 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page22 + - title: 2021 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page21 +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 20_000 + - threshold: + 2021-01-01: 2 + amount: + 2021-01-01: 20_135 + - threshold: + 2021-01-01: 3 + amount: + 2021-01-01: 23_800 + - threshold: + 2021-01-01: 4 + amount: + 2021-01-01: 25_200 + - threshold: + 2021-01-01: 5 + amount: + 2021-01-01: 26_575 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/joint.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/joint.yaml new file mode 100644 index 000000000..c9b7566b6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/joint.yaml @@ -0,0 +1,30 @@ +description: Arizona qualifies joint filers with income below this amount for the family tax credit. +metadata: + type: single_amount + threshold_unit: dependent + rate_unit: currency-USD + label: Arizona family tax credit joint maximum income + reference: + - title: 43-1073. Family income tax credit (a) (1-4) + href: https://www.azleg.gov/ars/43/01073.htm + - title: 2022 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page22 + - title: 2021 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page21 +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 20_000 + - threshold: + 2021-01-01: 2 + amount: + 2021-01-01: 23_600 + - threshold: + 2021-01-01: 3 + amount: + 2021-01-01: 27_300 + - threshold: + 2021-01-01: 4 + amount: + 2021-01-01: 31_000 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/separate.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/separate.yaml new file mode 100644 index 000000000..3570a6157 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/separate.yaml @@ -0,0 +1,14 @@ +description: Arizona qualifies separate filers with income below this amount for the family tax credit. +metadata: + period: year + unit: currency-USD + label: Arizona family tax credit separate maximum income + reference: + - title: 43-1073. Family income tax credit (a) (9) + href: https://www.azleg.gov/ars/43/01073.htm + - title: 2022 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page22 + - title: 2021 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page21 +values: + 2021-01-01: 10_000 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/single.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/single.yaml new file mode 100644 index 000000000..5b6aff647 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/single.yaml @@ -0,0 +1,14 @@ +description: Arizona qualifies single filers with income below this amount for the family tax credit. +metadata: + period: year + unit: currency-USD + label: Arizona family tax credit single maximum income + reference: + - title: 43-1073. Family income tax credit (a) (9) + href: https://www.azleg.gov/ars/43/01073.htm + - title: 2022 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page22 + - title: 2021 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page21 +values: + 2021-01-01: 10_000 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/widow.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/widow.yaml new file mode 100644 index 000000000..9712ef633 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/family_tax_credits/income_limit/widow.yaml @@ -0,0 +1,33 @@ +description: Arizona qualifies widow with income below this amount for the family tax credit. +metadata: + type: single_amount + rate_unit: currency-USD + label: Arizona family tax credit widow maximum income + reference: + - title: 43-1073. Family income tax credit (a) (1, 5-8) + href: https://www.azleg.gov/ars/43/01073.htm + - title: 2022 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i-2D.pdf#page22 + - title: 2021 Arizona Tax Form Instructions Line50 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140i-2D.pdf#page21 +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 20_000 + - threshold: + 2021-01-01: 2 + amount: + 2021-01-01: 20_135 + - threshold: + 2021-01-01: 3 + amount: + 2021-01-01: 23_800 + - threshold: + 2021-01-01: 4 + amount: + 2021-01-01: 25_200 + - threshold: + 2021-01-01: 5 + amount: + 2021-01-01: 26_575 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/amount.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/amount.yaml new file mode 100644 index 000000000..9f5aa5a62 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/amount.yaml @@ -0,0 +1,14 @@ +description: Arizona provides the following amount per personal or dependent exemption under the Increased Excise Tax Credit. +metadata: + unit: currency-USD + period: year + label: Arizona increase excise tax credit amount + reference: + - title: Taxation of Income § 43-1072.01 - Credit for increased excise taxes paid (C) + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01072-01.htm + - title: AZ tax-140 From Year 2021 Line 56 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf#page=45 + - title: AZ tax-140 From Year 2022 Line 56 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf#page=43 +values: + 2001-01-01: 25 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/income_threshold.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/income_threshold.yaml new file mode 100644 index 000000000..4435fee58 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/income_threshold.yaml @@ -0,0 +1,26 @@ +description: Arizona limits its Increased Excise Tax Credit to filers with federal adjusted gross income below the following amount, based on filing status. +metadata: + label: Arizona Increased Excise Tax Credit income threshold + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: Taxation of Income § 43-1072.01 - Credit for increased excise taxes paid (A), (1 & 2) + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01072-01.htm + - title: AZ tax-140 From Year 2021 Line 56 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf#page=45 + - title: AZ tax-140 From Year 2022 Line 56 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf#page=43 + +SINGLE: + 2001-01-01: 12_500 +HEAD_OF_HOUSEHOLD: + 2001-01-01: 25_000 +JOINT: + 2001-01-01: 25_000 +WIDOW: + 2001-01-01: 25_000 +SEPARATE: + 2001-01-01: 12_500 + diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/max_amount.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/max_amount.yaml new file mode 100644 index 000000000..d409cd75c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/credits/increased_excise/max_amount.yaml @@ -0,0 +1,14 @@ +description: Arizona allows for the following increase excise tax credit maximum amount. +metadata: + unit: currency-USD + period: year + label: Arizona increase excise tax credit max amount + reference: + - title: Taxation of Income § 43-1072.01 - Credit for increased excise taxes paid (C) + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01072-01.htm + - title: AZ tax-140 From Year 2021 Line 56 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf#page=45 + - title: AZ tax-140 From Year 2022 Line 56 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf#page=43 +values: + 2001-01-01: 100 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/deductions/standard/amount.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/deductions/standard/amount.yaml index d4637e66b..87be257d5 100644 --- a/fiscalsim_us/parameters/gov/states/az/tax/income/deductions/standard/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/deductions/standard/amount.yaml @@ -1,21 +1,27 @@ -description: Arizona provides filers a standard deduction of this amount, depending on their filing status. -metadata: - label: Arizona standard deduction - period: year - unit: currency-USD - breakdown: - - filing_status - reference: - - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet - href: https://azdor.gov/forms/individual/form-140-arizona-resident-personal-income-tax-booklet - -JOINT: - 2022-01-01: 25_900 -HEAD_OF_HOUSEHOLD: - 2022-01-01: 19_400 -WIDOW: - 2022-01-01: 25_900 -SINGLE: - 2022-01-01: 12_950 -SEPARATE: - 2022-01-01: 12_950 +description: Arizona provides filers a standard deduction of this amount, depending on their filing status. +metadata: + label: Arizona standard deduction + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/forms/individual/form-140-arizona-resident-personal-income-tax-booklet + - title: 2021 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf#page=43 +JOINT: + 2021-01-01: 25_100 + 2022-01-01: 25_900 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 18_800 + 2022-01-01: 19_400 +WIDOW: + 2021-01-01: 25_100 + 2022-01-01: 25_900 +SINGLE: + 2021-01-01: 12_550 + 2022-01-01: 12_950 +SEPARATE: + 2021-01-01: 12_550 + 2022-01-01: 12_950 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/deductions/standard/increased/rate.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/deductions/standard/increased/rate.yaml new file mode 100644 index 000000000..63b6f2b37 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/deductions/standard/increased/rate.yaml @@ -0,0 +1,16 @@ +description: Arizona increases the standard deduction by this fraction of charitable contributions that would have been allowed if the taxpayer elected to claim itemized deductions. +metadata: + label: Arizona increased standard deduction for charitable contributions rate + period: year + unit: currency-USD + reference: + - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf#page=24 + - title: 2021 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf#page=43 + - title: 43-1041. Optional standard deduction Line I + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01041.htm + +values: + 2019-01-01: 0.25 + 2022-01-01: 0.27 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/main/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/main/head_of_household.yaml new file mode 100644 index 000000000..7abdad3b0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/main/head_of_household.yaml @@ -0,0 +1,39 @@ +description: Arizona taxes the personal income for head of household filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Arizona income tax rate head of household filers + reference: + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1011 + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01011.htm + - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf + - title: 2021 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf +brackets: + - threshold: + 2019-01-01: 0 + rate: + 2019-01-01: 0.0259 + 2022-01-01: 0.0255 + - threshold: + 2019-01-01: 53_000 + 2021-01-01: 55_615 + 2022-01-01: 57_305 + rate: + 2019-01-01: 0.0334 + 2022-01-01: 0.0298 + - threshold: + 2019-01-01: 106_000 + 2021-01-01: 111_229 + 2022-01-01: .inf + rate: + 2019-01-01: 0.0417 + - threshold: + 2019-01-01: 318_000 + 2021-01-01: 333_684 + 2022-01-01: .inf + # in 2021 Arizona broke the highest income tax rate up into a 1.00% base rate and 3.5% surcharge + rate: + 2019-01-01: 0.045 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/main/joint.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/main/joint.yaml new file mode 100644 index 000000000..2cc48befa --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/main/joint.yaml @@ -0,0 +1,39 @@ +description: Arizona taxes the personal income for joint filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Arizona income tax rate joint filers + reference: + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1011 + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01011.htm + - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf + - title: 2021 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf +brackets: + - threshold: + 2019-01-01: 0 + rate: + 2019-01-01: 0.0259 + 2022-01-01: 0.0255 + - threshold: + 2019-01-01: 53_000 + 2021-01-01: 55_615 + 2022-01-01: 57_305 + rate: + 2019-01-01: 0.0334 + 2022-01-01: 0.0298 + - threshold: + 2019-01-01: 106_000 + 2021-01-01: 111_229 + 2022-01-01: .inf + rate: + 2019-01-01: 0.0417 + - threshold: + 2019-01-01: 318_000 + 2021-01-01: 333_684 + 2022-01-01: .inf + # in 2021 Arizona broke the highest income tax rate up into a 1.00% base rate and 3.5% surcharge + rate: + 2019-01-01: 0.045 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/main/separate.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/main/separate.yaml new file mode 100644 index 000000000..cb77d828d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/main/separate.yaml @@ -0,0 +1,39 @@ +description: Arizona taxes the personal income for separate filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Arizona income tax rate separate filers + reference: + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1011 + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01011.htm + - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf + - title: 2021 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf +brackets: + - threshold: + 2019-01-01: 0 + rate: + 2019-01-01: 0.0259 + 2022-01-01: 0.0255 + - threshold: + 2019-01-01: 26_500 + 2021-01-01: 27_808 + 2022-01-01: 28_653 + rate: + 2019-01-01: 0.0334 + 2022-01-01: 0.0298 + - threshold: + 2019-01-01: 53_000 + 2021-01-01: 55_615 + 2022-01-01: .inf + rate: + 2019-01-01: 0.0417 + - threshold: + 2019-01-01: 159_000 + 2021-01-01: 166_843 + 2022-01-01: .inf + # in 2021 Arizona broke the highest income tax rate up into a 1.00% base rate and 3.5% surcharge + rate: + 2019-01-01: 0.045 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/main/single.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/main/single.yaml new file mode 100644 index 000000000..12701c233 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/main/single.yaml @@ -0,0 +1,39 @@ +description: Arizona taxes the personal income for single filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Arizona income tax rate single filers + reference: + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1011 + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01011.htm + - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf + - title: 2021 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf +brackets: + - threshold: + 2019-01-01: 0 + rate: + 2019-01-01: 0.0259 + 2022-01-01: 0.0255 + - threshold: + 2019-01-01: 26_500 + 2021-01-01: 27_808 + 2022-01-01: 28_653 + rate: + 2019-01-01: 0.0334 + 2022-01-01: 0.0298 + - threshold: + 2019-01-01: 53_000 + 2021-01-01: 55_615 + 2022-01-01: .inf + rate: + 2019-01-01: 0.0417 + - threshold: + 2019-01-01: 159_000 + 2021-01-01: 166_843 + 2022-01-01: .inf + # in 2021 Arizona broke the highest income tax rate up into a 1.00% base rate and 3.5% surcharge + rate: + 2019-01-01: 0.045 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/main/widow.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/main/widow.yaml new file mode 100644 index 000000000..5f4dfb563 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/main/widow.yaml @@ -0,0 +1,39 @@ +description: Arizona taxes the personal income for widow filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Arizona income tax rate widow filers + reference: + - title: Arizona State Legislature Title 43 - Taxation of Income, Chapter 10, Article 5, 43-1011 + href: https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01011.htm + - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf + - title: 2021 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf +brackets: + - threshold: + 2019-01-01: 0 + rate: + 2019-01-01: 0.0259 + 2022-01-01: 0.0255 + - threshold: + 2019-01-01: 53_000 + 2021-01-01: 55_615 + 2022-01-01: 57_305 + rate: + 2019-01-01: 0.0334 + 2022-01-01: 0.0298 + - threshold: + 2019-01-01: 106_000 + 2021-01-01: 111_229 + 2022-01-01: .inf + rate: + 2019-01-01: 0.0417 + - threshold: + 2019-01-01: 318_000 + 2021-01-01: 333_684 + 2022-01-01: .inf + # in 2021 Arizona broke the highest income tax rate up into a 1.00% base rate and 3.5% surcharge + rate: + 2019-01-01: 0.045 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/capital_gains/rate.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/capital_gains/rate.yaml new file mode 100644 index 000000000..37697ed27 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/capital_gains/rate.yaml @@ -0,0 +1,16 @@ +description: Arizona subtracts this fraction of long term capital gains from adjusted gross income. +metadata: + label: Arizona long-term net capital gains subtraction rate + period: year + unit: /1 + reference: + - title: 43-1022. Subtractions from Arizona gross income (22) + href: https://www.azleg.gov/ars/43/01022.htm + - title: 2022 Arizona Resident Personal Income Tax Return Form140 Line24 + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140.pdf#page=1 + - title: 2022 Arizona Resident Personal Income Tax Form140 Instructions + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i.pdf#page=13 +values: + 2013-01-01: 0.1 + 2014-01-01: 0.2 + 2015-01-01: 0.25 diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/pension/public_pension_cap.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/pension/public_pension_cap.yaml new file mode 100644 index 000000000..7a40e2bc4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/pension/public_pension_cap.yaml @@ -0,0 +1,16 @@ +description: Arizona caps the pension exclusion at this amount. +metadata: + label: Arizona pension exclusion cap + period: year + unit: currency-USD + reference: + - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf#page=18 + - title: 2021 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf#page=23 + - title: 43-1022. Subtractions from Arizona gross income (2) + href: https://www.azleg.gov/ars/43/01022.htm + +values: + 2021-01-01: 2_500 + diff --git a/fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/subtractions.yaml b/fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/subtractions.yaml new file mode 100644 index 000000000..cb22163c1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/az/tax/income/subtractions/subtractions.yaml @@ -0,0 +1,16 @@ +description: Arizona counts these sources as subtractions. +values: + 2021-01-01: + # salt_refund_income + # - us_govt_interest + - az_public_pension_exclusion + - az_long_term_capital_gains_subtraction +metadata: + unit: list + reference: + - title: 2022 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf#page=30 + - title: 2021 Arizona Form 140 Resident Personal Income Tax Booklet + href: https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf#page=25 + - title: 43-1022. Subtractions from Arizona gross income + href: https://www.azleg.gov/ars/43/01022.htm diff --git a/fiscalsim_us/parameters/gov/states/ca/calepa/README.md b/fiscalsim_us/parameters/gov/states/ca/calepa/README.md index b05c12534..b0bab55c8 100644 --- a/fiscalsim_us/parameters/gov/states/ca/calepa/README.md +++ b/fiscalsim_us/parameters/gov/states/ca/calepa/README.md @@ -1 +1 @@ -# CalEPA +# California Environmental Protection Agency (CalEPA) diff --git a/fiscalsim_us/parameters/gov/states/ca/calepa/carb/README.md b/fiscalsim_us/parameters/gov/states/ca/calepa/carb/README.md index 511ff7a75..e031a0365 100644 --- a/fiscalsim_us/parameters/gov/states/ca/calepa/carb/README.md +++ b/fiscalsim_us/parameters/gov/states/ca/calepa/carb/README.md @@ -1 +1 @@ -# CARB +# California Air Resources Board (CARB) diff --git a/fiscalsim_us/parameters/gov/states/ca/calepa/carb/cvrp/README.md b/fiscalsim_us/parameters/gov/states/ca/calepa/carb/cvrp/README.md index 7703a51cf..03f258292 100644 --- a/fiscalsim_us/parameters/gov/states/ca/calepa/carb/cvrp/README.md +++ b/fiscalsim_us/parameters/gov/states/ca/calepa/carb/cvrp/README.md @@ -1 +1 @@ -# CVRP +# Clean Vehicle Rebate Project diff --git a/fiscalsim_us/parameters/gov/states/ca/calepa/index.yaml b/fiscalsim_us/parameters/gov/states/ca/calepa/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ca/calepa/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ca/cpuc/README.md b/fiscalsim_us/parameters/gov/states/ca/cpuc/README.md index f8fe8a8d1..6a6412f97 100644 --- a/fiscalsim_us/parameters/gov/states/ca/cpuc/README.md +++ b/fiscalsim_us/parameters/gov/states/ca/cpuc/README.md @@ -1 +1 @@ -# CPUC +# California Public Utilities Commission (CPUC) diff --git a/fiscalsim_us/parameters/gov/states/ca/cpuc/index.yaml b/fiscalsim_us/parameters/gov/states/ca/cpuc/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ca/cpuc/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ca/tax/income/agi/README.md b/fiscalsim_us/parameters/gov/states/ca/tax/income/agi/README.md index d9579a756..60459b766 100644 --- a/fiscalsim_us/parameters/gov/states/ca/tax/income/agi/README.md +++ b/fiscalsim_us/parameters/gov/states/ca/tax/income/agi/README.md @@ -1 +1 @@ -# AGI +# Adjusted Gross Income diff --git a/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/amount.yaml b/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/amount.yaml index 6d326059e..75edd6920 100644 --- a/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/amount.yaml @@ -1,30 +1,31 @@ -description: California provides a renter credit of this amount. -SINGLE: - 2021-01-01: 60 - 2022-01-01: 60 -SEPARATE: - 2021-01-01: 60 - 2022-01-01: 60 -WIDOW: - 2021-01-01: 120 - 2022-01-01: 120 -JOINT: - 2021-01-01: 120 - 2022-01-01: 120 -HEAD_OF_HOUSEHOLD: - 2021-01-01: 120 - 2022-01-01: 120 - -metadata: - period: year - unit: currency-USD - breakdown: - - filing_status - label: California renter tax credit amount - reference: - - title: Cal. Rev. & Tax. Code § 17053.5 - href: https://casetext.com/statute/california-codes/california-revenue-and-taxation-code/division-2-other-taxes/part-10-personal-income-tax/chapter-2-imposition-of-tax/section-170535-credit-for-qualified-renter - - title: 2021 California Form 540 instructions - href: https://www.ftb.ca.gov/forms/2021/2021-540-booklet.html - - title: 2022 California Form 540 instructions - href: https://www.ftb.ca.gov/forms/2022/2022-540-booklet.html +description: California provides a renter credit of this amount. +SINGLE: + 2021-01-01: 60 + 2022-01-01: 60 +SEPARATE: + 2021-01-01: 60 + 2022-01-01: 60 +WIDOW: + 2021-01-01: 120 + 2022-01-01: 120 +JOINT: + 2021-01-01: 120 + 2022-01-01: 120 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 120 + 2022-01-01: 120 + +metadata: + period: year + unit: currency-USD + breakdown: + - filing_status + label: California renter tax credit amount + reference: + - title: Cal. Rev. & Tax. Code § 17053.5 + href: https://casetext.com/statute/california-codes/california-revenue-and-taxation-code/division-2-other-taxes/part-10-personal-income-tax/chapter-2-imposition-of-tax/section-170535-credit-for-qualified-renter + - title: 2021 California Form 540 instructions + href: https://www.ftb.ca.gov/forms/2021/2021-540-booklet.html + - title: 2022 California Form 540 instructions + href: https://www.ftb.ca.gov/forms/2022/2022-540-booklet.html + economy: false diff --git a/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/income_cap.yaml b/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/income_cap.yaml index 7070d6de9..59ba77019 100644 --- a/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/income_cap.yaml +++ b/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/income_cap.yaml @@ -1,32 +1,33 @@ -description: California limits the renter credit to filers with California AGI below this amount. -SINGLE: - 2021-01-01: 45_448 - 2022-01-01: 49_220 -SEPARATE: - 2021-01-01: 45_448 - 2022-01-01: 49_220 -WIDOW: - 2021-01-01: 90_896 - 2022-01-01: 98_440 -JOINT: - 2021-01-01: 90_896 - 2022-01-01: 98_440 -HEAD_OF_HOUSEHOLD: - 2021-01-01: 90_896 - 2022-01-01: 98_440 - -metadata: - period: year - unit: currency-USD - breakdown: - - filing_status - label: "California renter tax credit AGI cap" - # single/separate: $25,000 starting in 1998 indexed by California CPI - # widow/joint/head: $50,000 starting in 1998 indexed by California CPI - reference: - - title: Cal. Rev. & Tax. Code § 17053.5 - href: https://casetext.com/statute/california-codes/california-revenue-and-taxation-code/division-2-other-taxes/part-10-personal-income-tax/chapter-2-imposition-of-tax/section-170535-credit-for-qualified-renter - - title: 2021 California Form 540 instructions - href: https://www.ftb.ca.gov/forms/2021/2021-540-booklet.html - - title: 2022 California Form 540 instructions - href: https://www.ftb.ca.gov/forms/2022/2022-540-booklet.html +description: California limits the renter credit to filers with California AGI below this amount. +SINGLE: + 2021-01-01: 45_448 + 2022-01-01: 49_220 +SEPARATE: + 2021-01-01: 45_448 + 2022-01-01: 49_220 +WIDOW: + 2021-01-01: 90_896 + 2022-01-01: 98_440 +JOINT: + 2021-01-01: 90_896 + 2022-01-01: 98_440 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 90_896 + 2022-01-01: 98_440 + +metadata: + period: year + unit: currency-USD + breakdown: + - filing_status + label: "California renter tax credit AGI cap" + # single/separate: $25,000 starting in 1998 indexed by California CPI + # widow/joint/head: $50,000 starting in 1998 indexed by California CPI + reference: + - title: Cal. Rev. & Tax. Code § 17053.5 + href: https://casetext.com/statute/california-codes/california-revenue-and-taxation-code/division-2-other-taxes/part-10-personal-income-tax/chapter-2-imposition-of-tax/section-170535-credit-for-qualified-renter + - title: 2021 California Form 540 instructions + href: https://www.ftb.ca.gov/forms/2021/2021-540-booklet.html + - title: 2022 California Form 540 instructions + href: https://www.ftb.ca.gov/forms/2022/2022-540-booklet.html + economy: false diff --git a/fiscalsim_us/parameters/gov/states/ma/tax/income/credits/senior_circuit_breaker/index.yaml b/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/index.yaml similarity index 95% rename from fiscalsim_us/parameters/gov/states/ma/tax/income/credits/senior_circuit_breaker/index.yaml rename to fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/index.yaml index f0977ed9b..cb39cde8a 100644 --- a/fiscalsim_us/parameters/gov/states/ma/tax/income/credits/senior_circuit_breaker/index.yaml +++ b/fiscalsim_us/parameters/gov/states/ca/tax/income/credits/renter/index.yaml @@ -1,4 +1,4 @@ -metadata: - propagate_metadata_to_children: true - economy: false - household: true +metadata: + propagate_metadata_to_children: true + economy: false + household: true diff --git a/fiscalsim_us/parameters/gov/states/co/cdhs/README.md b/fiscalsim_us/parameters/gov/states/co/cdhs/README.md index 5b2660243..b9c6b0b47 100644 --- a/fiscalsim_us/parameters/gov/states/co/cdhs/README.md +++ b/fiscalsim_us/parameters/gov/states/co/cdhs/README.md @@ -1 +1 @@ -# CDHS +# Colorado Department of Human Services diff --git a/fiscalsim_us/parameters/gov/states/co/cdhs/tanf/README.md b/fiscalsim_us/parameters/gov/states/co/cdhs/tanf/README.md index 26b95cf35..eb8aeb3f9 100644 --- a/fiscalsim_us/parameters/gov/states/co/cdhs/tanf/README.md +++ b/fiscalsim_us/parameters/gov/states/co/cdhs/tanf/README.md @@ -1 +1 @@ -# TANF +# Temporary Assistance for Needy Families diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/child.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/child.yaml new file mode 100644 index 000000000..de80ce04a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/child.yaml @@ -0,0 +1,20 @@ +description: Colorado limits eligibility for its Child Health Plan Plus to children in this age range. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: true + - threshold: + 2023-01-01: 19 + amount: + 2023-01-01: false + +metadata: + type: single_amount + amount_unit: bool + threshold_unit: year + label: Colorado CHP+ child age range + reference: + - title: Medical Services Board | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10779#page=2 diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/ambulance.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/ambulance.yaml new file mode 100644 index 000000000..a4ac20356 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/ambulance.yaml @@ -0,0 +1,32 @@ +description: Colorado limits the ambulance co-pay under the Child Health Plan Plus to this amount, based on income as a percent of the poverty line. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 1.01 + amount: + 2023-01-01: 2 + - threshold: + 2023-01-01: 1.57 + amount: + 2023-01-01: 15 + - threshold: + 2023-01-01: 2.01 + amount: + 2023-01-01: 25 + - threshold: + 2023-01-01: 2.61 + amount: + 2023-01-01: .inf + +metadata: + type: single_amount + rate_unit: currency-USD + threshold_unit: /1 + label: Colorado CHP+ ambulance co-pay + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/er_visit.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/er_visit.yaml new file mode 100644 index 000000000..663b6835e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/er_visit.yaml @@ -0,0 +1,28 @@ +description: Colorado limits the emergency room visit co-pay under the Child Health Plan Plus to this amount, based on income as a percent of the poverty line. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 3 + - threshold: + 2023-01-01: 1.57 + amount: + 2023-01-01: 30 + - threshold: + 2023-01-01: 2.01 + amount: + 2023-01-01: 50 + - threshold: + 2023-01-01: 2.61 + amount: + 2023-01-01: .inf + +metadata: + type: single_amount + rate_unit: currency-USD + threshold_unit: /1 + label: Colorado CHP+ emergency room co-pay + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/imaging.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/imaging.yaml new file mode 100644 index 000000000..8371083d1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/imaging.yaml @@ -0,0 +1,28 @@ +description: Colorado limits the imaging co-pay under the Child Health Plan Plus to this amount, based on income as a percent of the poverty line. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 1.57 + amount: + 2023-01-01: 5 + - threshold: + 2023-01-01: 2.01 + amount: + 2023-01-01: 10 + - threshold: + 2023-01-01: 2.61 + amount: + 2023-01-01: .inf + +metadata: + type: single_amount + rate_unit: currency-USD + threshold_unit: /1 + label: Colorado CHP+ Imaging co-pay + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/inpatient.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/inpatient.yaml new file mode 100644 index 000000000..9713cae57 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/inpatient.yaml @@ -0,0 +1,32 @@ +description: Colorado limits the inpatient co-pay under the Child Health Plan Plus to this amount, based on income as a percent of the poverty line. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 1.01 + amount: + 2023-01-01: 2 + - threshold: + 2023-01-01: 1.57 + amount: + 2023-01-01: 20 + - threshold: + 2023-01-01: 2.01 + amount: + 2023-01-01: 50 + - threshold: + 2023-01-01: 2.61 + amount: + 2023-01-01: .inf + +metadata: + type: single_amount + rate_unit: currency-USD + threshold_unit: /1 + label: Colorado CHP+ inpatient hospital co-pay + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/lab.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/lab.yaml new file mode 100644 index 000000000..5a18c9df1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/lab.yaml @@ -0,0 +1,28 @@ +description: Colorado limits the lab co-pay under the Child Health Plan Plus to this amount, based on income as a percent of the poverty line. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 1.57 + amount: + 2023-01-01: 5 + - threshold: + 2023-01-01: 2.01 + amount: + 2023-01-01: 10 + - threshold: + 2023-01-01: 2.61 + amount: + 2023-01-01: .inf + +metadata: + type: single_amount + rate_unit: currency-USD + threshold_unit: /1 + label: Colorado CHP+ lab co-pay + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/outpatient.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/outpatient.yaml new file mode 100644 index 000000000..3d5efbb8b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/outpatient.yaml @@ -0,0 +1,32 @@ +description: Colorado limits the outpatient co-pay under the Child Health Plan Plus to this amount, based on income as a percent of the poverty line. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 1.01 + amount: + 2023-01-01: 2 + - threshold: + 2023-01-01: 1.57 + amount: + 2023-01-01: 5 + - threshold: + 2023-01-01: 2.01 + amount: + 2023-01-01: 10 + - threshold: + 2023-01-01: 2.61 + amount: + 2023-01-01: .inf + +metadata: + type: single_amount + rate_unit: currency-USD + threshold_unit: /1 + label: Colorado CHP+ outpatient hospital co-pay + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/physician_services.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/physician_services.yaml new file mode 100644 index 000000000..82c7294fd --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/physician_services.yaml @@ -0,0 +1,32 @@ +description: Colorado limits the physician services co-pay under the Child Health Plan Plus to this amount, based on income as a percent of the poverty line. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 1.01 + amount: + 2023-01-01: 2 + - threshold: + 2023-01-01: 1.57 + amount: + 2023-01-01: 5 + - threshold: + 2023-01-01: 2.01 + amount: + 2023-01-01: 10 + - threshold: + 2023-01-01: 2.61 + amount: + 2023-01-01: .inf + +metadata: + type: single_amount + rate_unit: currency-USD + threshold_unit: /1 + label: Colorado CHP+ physician services co-pay + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/prescription.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/prescription.yaml new file mode 100644 index 000000000..db5479288 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/prescription.yaml @@ -0,0 +1,32 @@ +description: Colorado limits the prescription co-pay under the Child Health Plan Plus to this amount, based on income as a percent of the poverty line. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 0 + - threshold: + 2023-01-01: 1.01 + amount: + 2023-01-01: 1 + - threshold: + 2023-01-01: 1.57 + amount: + 2023-01-01: 6.5 + - threshold: + 2023-01-01: 2.01 + amount: + 2023-01-01: 10 + - threshold: + 2023-01-01: 2.61 + amount: + 2023-01-01: .inf + +metadata: + type: single_amount + rate_unit: currency-USD + threshold_unit: /1 + label: Colorado CHP+ mean prescription co-pay + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/urgent_care.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/urgent_care.yaml new file mode 100644 index 000000000..e69d94424 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/copays/urgent_care.yaml @@ -0,0 +1,28 @@ +description: Colorado limits the urgent care co-pay under the Child Health Plan Plus to this amount, based on income as a percent of the poverty line. + +brackets: + - threshold: + 2023-01-01: 0 + amount: + 2023-01-01: 1 + - threshold: + 2023-01-01: 1.57 + amount: + 2023-01-01: 20 + - threshold: + 2023-01-01: 2.01 + amount: + 2023-01-01: 30 + - threshold: + 2023-01-01: 2.61 + amount: + 2023-01-01: .inf + +metadata: + type: single_amount + rate_unit: currency-USD + threshold_unit: /1 + label: Colorado CHP+ urgent care co-pay + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/expenses.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/expenses.yaml new file mode 100644 index 000000000..c103a0f32 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/expenses.yaml @@ -0,0 +1,18 @@ +description: Colorado Child Health Plan Plus has co-pays for the following expenses. +values: + 2023-01-01: + - ambulance + - er_visit + - imaging + - inpatient + - lab + - outpatient + - physician_services + - prescription + - urgent_care +metadata: + unit: list + label: Colorado CHP+ co-pays + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/income_limit.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/income_limit.yaml new file mode 100644 index 000000000..532b0dd96 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/income_limit.yaml @@ -0,0 +1,11 @@ +description: Colorado limits the Child Health Plan Plus to households with income up to this percentage of the federal poverty level. + +values: + 2023-04-01: 2.6 + +metadata: + amount_unit: /1 + label: Colorado CHP+ maximum household income as percent of FPL + reference: + - title: Monthly Maximum Income Guidelines | CHILD HEALTH PLAN PLUS + href: https://hcpf.colorado.gov/sites/hcpf/files/April%202023%20CHP%2B%20Income%20Chart%20_.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/co/hcpf/chp/out_of_pocket.yaml b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/out_of_pocket.yaml new file mode 100644 index 000000000..77b5ebabc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/hcpf/chp/out_of_pocket.yaml @@ -0,0 +1,11 @@ +description: Colorado limits its Child Health Plan Plus out of pocket expense to this fraction of income. + +values: + 2023-04-01: 0.05 + +metadata: + amount_unit: /1 + label: Colorado CHP+ out of pocket maximum percent + reference: + - title: Child Health Plan Plus (CHP+) | DEPARTMENT OF HEALTH CARE POLICY AND FINANCING + href: https://hcpf.colorado.gov/child-health-plan-plus diff --git a/fiscalsim_us/parameters/gov/states/co/ssa/README.md b/fiscalsim_us/parameters/gov/states/co/ssa/README.md new file mode 100644 index 000000000..0cf278627 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/ssa/README.md @@ -0,0 +1 @@ +# Social Security Administration \ No newline at end of file diff --git a/fiscalsim_us/parameters/gov/states/co/ssa/oap/README.md b/fiscalsim_us/parameters/gov/states/co/ssa/oap/README.md new file mode 100644 index 000000000..a66a78f86 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/ssa/oap/README.md @@ -0,0 +1 @@ +# Old Age Pension \ No newline at end of file diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/additions/additions.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/additions.yaml new file mode 100644 index 000000000..63b6544c6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/additions.yaml @@ -0,0 +1,37 @@ +description: Colorado adds these variables to the federal taxable income when computing the state taxable income. +values: + 2021-01-01: + - co_state_addback + - co_qualified_business_income_deduction_addback + # - Non-Colorado state and local bond interest + # - Improper distributions from a qualified state tuition program for which tuition program contribution subtraction was previously claimed. + # - Charitable gross conservation easement + # - Alien labor + # - Partnership/Fiduciary + # - Clubs that restrict membership + # - Distributions from a medical savings account not made for an eligible expense + 2022-01-01: + - co_state_addback + - co_qualified_business_income_deduction_addback + - co_federal_deduction_addback + # - Non-qualifying Distribution addback + # - Non-Colorado state and local bond interest + # - Improper distributions from a qualified state tuition program for which tuition program contribution subtraction was previously claimed. + # - Charitable gross conservation easement + # - Alien labor + # - Partnership/Fiduciary + # - Distributions from a medical savings account not made for an eligible expense + # - Food and beverage expense deduction + +metadata: + unit: list + label: Colorado federal taxable income additions + reference: + - title: C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3) + href: https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-until-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal + - title: 2022 Colorado Individual Income Tax Filing Guide - Additions + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5 + - title: 2021 Colorado Individual Income Tax Filing Guide - Additions + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=5 + - title: Individual Income Tax Guide - Part 3 Additions to Taxable Income + href: https://tax.colorado.gov/individual-income-tax-guide diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/agi_threshold.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/agi_threshold.yaml new file mode 100644 index 000000000..eccd93ce5 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/agi_threshold.yaml @@ -0,0 +1,16 @@ +description: Colorado adds back federal deductions for filers with adjusted gross income above this threshold. +metadata: + period: year + unit: currency-USD + label: Colorado federal deductions add-back AGI threshold + reference: + # 2023 values only appear in the Individual Income Tax Guide + - title: C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3)(p) + href: https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-upon-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal + - title: 2022 Colorado Individual Income Tax Filing Guide - Additions - Line 4 + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5 + - title: Individual Income Tax Guide - Part 3 Additions to Taxable Income - Federal itemized or standard deductions + href: https://tax.colorado.gov/individual-income-tax-guide +values: + 2022-01-01: 400_000 + 2023-01-01: 300_000 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/exemption.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/exemption.yaml new file mode 100644 index 000000000..ae9d1d966 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/exemption.yaml @@ -0,0 +1,30 @@ +description: Colorado adds back federal deductions above this exemption amount for filers, based on filing status. +metadata: + period: year + unit: currency-USD + label: Colorado itemized or standard deduction add back exemption + reference: + # 2023 values only appear in the Individual Income Tax Guide + - title: C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3)(p) + href: https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-upon-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal + - title: 2022 Colorado Individual Income Tax Filing Guide - Additions - Line 4 + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5 + - title: Individual Income Tax Guide - Part 3 Additions to Taxable Income - Federal itemized or standard deductions + href: https://tax.colorado.gov/individual-income-tax-guide + breakdown: + - filing_status +JOINT: + 2022-01-01: 60_000 + 2023-01-01: 16_000 +SINGLE: + 2022-01-01: 30_000 + 2023-01-01: 12_000 +SEPARATE: + 2022-01-01: 30_000 + 2023-01-01: 12_000 +HEAD_OF_HOUSEHOLD: + 2022-01-01: 30_000 + 2023-01-01: 12_000 +WIDOW: + 2022-01-01: 30_000 + 2023-01-01: 12_000 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/itemized_only.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/itemized_only.yaml new file mode 100644 index 000000000..76e6b8d6e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/federal_deductions/itemized_only.yaml @@ -0,0 +1,15 @@ +description: Whether the Colorado federal deductions addback is only itemized. +metadata: + unit: bool + label: Colorado federal deduction addback itemized only + reference: + # 2023 values only appear in the Individual Income Tax Guide + - title: C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3)(p) + href: https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-upon-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal + - title: 2022 Colorado Individual Income Tax Filing Guide - Additions - Line 4 + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5 + - title: Individual Income Tax Guide - Part 3 Additions to Taxable Income - Federal itemized or standard deductions + href: https://tax.colorado.gov/individual-income-tax-guide +values: + 2022-01-01: true + 2023-01-01: false diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/additions/qualified_business_income_deduction/agi_threshold.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/qualified_business_income_deduction/agi_threshold.yaml new file mode 100644 index 000000000..5066895a0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/additions/qualified_business_income_deduction/agi_threshold.yaml @@ -0,0 +1,27 @@ +description: Colorado adds back the qualified business income deduction for filers with adjusted gross income above this threshold, based on filing status. +metadata: + period: year + unit: currency-USD + label: Colorado qualified business income deduction addback AGI threshold + reference: + - title: C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3)(o) + href: https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-upon-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal + - title: 2022 Colorado Individual Income Tax Filing Guide - Additions - Line 3 + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5 + - title: Individual Income Tax Guide - Part 3 Additions to Taxable Income + href: https://tax.colorado.gov/individual-income-tax-guide + - title: 2021 Colorado Individual Income Tax Filing Guide - Additions - Line 3 + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=5 + breakdown: + - filing_status + +SINGLE: + 2021-01-01: 500_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 500_000 +JOINT: + 2021-01-01: 1_000_000 +WIDOW: + 2021-01-01: 500_000 +SEPARATE: + 2021-01-01: 500_000 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/child_age_threshold.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/child_age_threshold.yaml new file mode 100644 index 000000000..8a108d09d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/child_age_threshold.yaml @@ -0,0 +1,15 @@ +description: Colorado qualifies children for the low-income family child care expenses credit below this age threshold. +values: + 2018-01-01: 13 +metadata: + reference: + - title: 39-22-119.5. Child care expenses tax credit - legislative declaration - definitions. (3)(a)(III) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-119-5/ + - title: 2022 Colorado Individual Income Tax Filing Guide, page 46, Eligible, 4, b + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=46 + - title: 2021 Colorado Individual Income Tax Filing Guide, page 44, Eligible, 4, b + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104Book_2021_V3.pdf#page=44 + + unit: year + period: year + label: Colorado low-income child care expenses credit child age threshold diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/federal_agi_threshold.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/federal_agi_threshold.yaml new file mode 100644 index 000000000..abfb4dd3d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/federal_agi_threshold.yaml @@ -0,0 +1,15 @@ +description: Colorado limits the low-income child care expenses credit to filers with adjusted gross income up to this amount. +values: + 2021-01-01: 25_000 +metadata: + reference: + - title: 39-22-119.5. Child care expenses tax credit - legislative declaration - definitions. (3)(a)(I) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-119-5/ + - title: 2022 Colorado Individual Income Tax Filing Guide, Eligible, 4, b + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=46 + - title: 2021 Colorado Individual Income Tax Filing Guide, Eligible, 4, b + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104Book_2021_V3.pdf#page=44 + + unit: currency-USD + period: year + label: Colorado low-income child care expenses credit income threshold diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/max_amount.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/max_amount.yaml new file mode 100644 index 000000000..b47c076dd --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/max_amount.yaml @@ -0,0 +1,26 @@ +description: Colorado allows for the following low income child care expense credit maximum amount, based on the number of dependents. +metadata: + type: single_amount + threshold_unit: child + amount_unit: currency-USD + label: Colorado low income child care expense credit max amount + reference: + - title: Colorado revised statutes, Section 39-22-119.5 - Child care expenses tax credit (3), (a), (I) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-119-5/ + - title: 2022 Colorado Individual Income Tax Filing Guide, page 48 + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=48 + - title: 2021 Colorado Individual Income Tax Filing Guide, page 46 + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104Book_2021_V3.pdf#page=46 +brackets: + - threshold: + 2018-01-01: 0 + amount: + 2018-01-01: 0 + - threshold: + 2018-01-01: 1 + amount: + 2018-01-01: 500 + - threshold: + 2018-01-01: 2 + amount: + 2018-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/rate.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/rate.yaml new file mode 100644 index 000000000..975d44d69 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/low_income/rate.yaml @@ -0,0 +1,14 @@ +description: Colorado matches up to this fraction of qualifying child care expenses in its low income child care expenses credit. +metadata: + period: year + unit: /1 + label: Colorado low income child care expense credit rate + reference: + - title: Colorado revised statutes, Section 39-22-119.5 - Child care expenses tax credit (3), (c), (I) + href: https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-1195-child-care-expenses-tax-credit-legislative-declaration-definitions + - title: 2022 Colorado Individual Income Tax Filing Guide, page 48 + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=48 + - title: 2021 Colorado Individual Income Tax Filing Guide, page 46 + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104Book_2021_V3.pdf#page=46 +values: + 2018-01-01: 0.25 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/match.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/match.yaml new file mode 100644 index 000000000..e6267a5b1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/cdcc/match.yaml @@ -0,0 +1,31 @@ +description: Colorado matches this percentage of the child care credit, depending on federal AGI. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Colorado child care credit match + reference: + - title: Colorado Revised Statutes Annotated, Title 39. Taxation (§§ 39-1-101 — 39-36-107), Specific Taxes (§§ 39-20-101 — 39-36-107), Income Tax (Art. 22)Article 22., Income Tax (Pts. 1 — 53), Part 1. General (§§ 39-22-101 — 39-22-129) (1.7) + href: https://advance.lexis.com/documentpage/teaserdocument/?pdmfid=1000516&crid=332c1448-d489-4eb9-8b41-1b2a309a2480&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65HV-06G3-CGX8-050B-00008-00&pddocid=urn%3AcontentItem%3A65HV-06G3-CGX8-050B-00008-00&pdcontentcomponentid=234176&pdteaserkey=h1&pditab=allpods&ecomp=7s65kkk&earg=sr0&prid=2f64ea9c-fb0a-423d-8792-dccfebe94d6c + - title: Colorado Individual Tax Filing Guide 104 Book | Page 48 line 7 + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=48 + +brackets: + - threshold: + 1996-01-01: 0 + amount: + 1996-01-01: 0.5 + - threshold: + 1996-01-01: 25_000 + amount: + 1996-01-01: 0.3 + 2019-01-01: 0.5 + - threshold: + 1996-01-01: 35_000 + amount: + 1996-01-01: 0.1 + 2019-01-01: 0.5 + - threshold: + 1996-01-01: 60_000 + amount: + 1996-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/README.md b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/README.md new file mode 100644 index 000000000..412bf336c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/README.md @@ -0,0 +1 @@ +# Child Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/age_threshold.yaml new file mode 100644 index 000000000..129e86e7b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/age_threshold.yaml @@ -0,0 +1,14 @@ +description: Colorado issues the child tax credit to taxpayers with children below this age. +values: + 2021-01-01: 0 + 2022-01-01: 6 +metadata: + unit: years + label: Colorado child tax credit age threshold + reference: + - title: C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=4f86a852-765a-489a-b554-66f6e7d5b065&nodeid=ABPAACAACAABAACABN&nodepath=%2fROOT%2fABP%2fABPAAC%2fABPAACAAC%2fABPAACAACAAB%2fABPAACAACAABAAC%2fABPAACAACAABAACABN&level=6&haschildren=&populated=false&title=39-22-129.+Child+tax+credit+-+legislative+declaration+-+definitions.&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a633G-B1C3-GXJ9-30GW-00008-00&ecomp=7gf59kk&prid=2fe6fa8e-8df8-4d74-a340-c4fa9bc603d5 + - title: 2022 Colorado Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1 + - title: Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/head_of_household.yaml new file mode 100644 index 000000000..932c919bd --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/head_of_household.yaml @@ -0,0 +1,26 @@ +description: Colorado provides this child tax credit per child for head of household filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: currency-USD + label: Colorado child tax credit head of household amount + reference: + - title: House Bill 23-1112, Section 2, (4.5), (a), (I) + href: https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=5 +brackets: + - threshold: + 2024-01-01: -.inf + amount: + 2024-01-01: 1_200 + - threshold: + 2024-01-01: 25_000 + amount: + 2024-01-01: 600 + - threshold: + 2024-01-01: 50_000 + amount: + 2024-01-01: 200 + - threshold: + 2024-01-01: 75_000 + amount: + 2024-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/joint.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/joint.yaml new file mode 100644 index 000000000..64b751f61 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/joint.yaml @@ -0,0 +1,26 @@ +description: Colorado provides this child tax credit per child for joint filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: currency-USD + label: Colorado child tax credit joint amount + reference: + - title: House Bill 23-1112, Section 2, (4.5), (a), (II) + href: https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=6 +brackets: + - threshold: + 2024-01-01: -.inf + amount: + 2024-01-01: 1_200 + - threshold: + 2024-01-01: 35_000 + amount: + 2024-01-01: 600 + - threshold: + 2024-01-01: 60_000 + amount: + 2024-01-01: 200 + - threshold: + 2024-01-01: 85_000 + amount: + 2024-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/separate.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/separate.yaml new file mode 100644 index 000000000..72c2054bb --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/separate.yaml @@ -0,0 +1,26 @@ +description: Colorado provides this child tax credit per child for separate filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: currency-USD + label: Colorado child tax credit separate amount + reference: + - title: House Bill 23-1112, Section 2, (4.5), (a), (I) + href: https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=5 +brackets: + - threshold: + 2024-01-01: -.inf + amount: + 2024-01-01: 1_200 + - threshold: + 2024-01-01: 25_000 + amount: + 2024-01-01: 600 + - threshold: + 2024-01-01: 50_000 + amount: + 2024-01-01: 200 + - threshold: + 2024-01-01: 75_000 + amount: + 2024-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/single.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/single.yaml new file mode 100644 index 000000000..51de19d26 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/single.yaml @@ -0,0 +1,26 @@ +description: Colorado provides this child tax credit per child for single filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: currency-USD + label: Colorado child tax credit single amount + reference: + - title: House Bill 23-1112, Section 2, (4.5), (a), (I) + href: https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=5 +brackets: + - threshold: + 2024-01-01: -.inf + amount: + 2024-01-01: 1_200 + - threshold: + 2024-01-01: 25_000 + amount: + 2024-01-01: 600 + - threshold: + 2024-01-01: 50_000 + amount: + 2024-01-01: 200 + - threshold: + 2024-01-01: 75_000 + amount: + 2024-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/widow.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/widow.yaml new file mode 100644 index 000000000..e143cf157 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/amount/widow.yaml @@ -0,0 +1,26 @@ +description: Colorado provides this child tax credit per child for widow(er) filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: currency-USD + label: Colorado child tax credit widow(er) amount + reference: + - title: House Bill 23-1112, Section 2, (4.5), (a), (I) + href: https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=5 +brackets: + - threshold: + 2024-01-01: -.inf + amount: + 2024-01-01: 1_200 + - threshold: + 2024-01-01: 25_000 + amount: + 2024-01-01: 600 + - threshold: + 2024-01-01: 50_000 + amount: + 2024-01-01: 200 + - threshold: + 2024-01-01: 75_000 + amount: + 2024-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/ctc_matched_federal_credit.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/ctc_matched_federal_credit.yaml new file mode 100644 index 000000000..b997a3115 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/ctc_matched_federal_credit.yaml @@ -0,0 +1,12 @@ +description: Colorado matches a fraction of the federal child tax credit when this is true; otherwise, Colorado provides an amount based on income. +metadata: + unit: bool + label: Colorado child tax credit federal CTC match + reference: + # Change in CTC payout was introduced in the House Bill 23-1112 and has not been reflected in the Individual Income Tax Guide + # in the 2022 tax forms + - title: House Bill 23-1112, Section 2, (3.5) / (4) + href: https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=5 +values: + 2022-01-01: true + 2024-01-01: false diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/eligible_child.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/eligible_child.yaml new file mode 100644 index 000000000..fb004cfec --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/eligible_child.yaml @@ -0,0 +1,12 @@ +description: Colorado qualifies children for the child tax credit under this federal eligibility. +values: + 2021-01-01: + - ctc_qualifying_child + 2024-01-01: + - is_eitc_qualifying_child +metadata: + unit: list + label: Colorado child tax credit child eligibility + reference: + - title: House Bill 23-1112, Section 2, (1), (a) + href: https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=4 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/head_of_household.yaml new file mode 100644 index 000000000..6084f7d97 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/head_of_household.yaml @@ -0,0 +1,34 @@ +description: Colorado matches this fraction of the federal child tax credit for head of household filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: Colorado child tax credit head of household rate + reference: + - title: C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=4f86a852-765a-489a-b554-66f6e7d5b065&nodeid=ABPAACAACAABAACABN&nodepath=%2fROOT%2fABP%2fABPAAC%2fABPAACAAC%2fABPAACAACAAB%2fABPAACAACAABAAC%2fABPAACAACAABAACABN&level=6&haschildren=&populated=false&title=39-22-129.+Child+tax+credit+-+legislative+declaration+-+definitions.&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a633G-B1C3-GXJ9-30GW-00008-00&ecomp=7gf59kk&prid=2fe6fa8e-8df8-4d74-a340-c4fa9bc603d5 + - title: 2022 Colorado Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1 + - title: Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16 +brackets: + - threshold: + 2022-01-01: 0 + amount: + 2021-01-01: 0 + 2022-01-01: 0.6 + - threshold: + 2022-01-01: 25_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.3 + - threshold: + 2015-01-01: 50_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.1 + - threshold: + 2022-01-01: 75_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/joint.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/joint.yaml new file mode 100644 index 000000000..3b94df5a9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/joint.yaml @@ -0,0 +1,34 @@ +description: Colorado matches this fraction of the federal child tax credit for joint filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: Colorado child tax credit joint rate + reference: + - title: C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=4f86a852-765a-489a-b554-66f6e7d5b065&nodeid=ABPAACAACAABAACABN&nodepath=%2fROOT%2fABP%2fABPAAC%2fABPAACAAC%2fABPAACAACAAB%2fABPAACAACAABAAC%2fABPAACAACAABAACABN&level=6&haschildren=&populated=false&title=39-22-129.+Child+tax+credit+-+legislative+declaration+-+definitions.&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a633G-B1C3-GXJ9-30GW-00008-00&ecomp=7gf59kk&prid=2fe6fa8e-8df8-4d74-a340-c4fa9bc603d5 + - title: 2022 Colorado Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1 + - title: Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16 +brackets: + - threshold: + 2022-01-01: 0 + amount: + 2021-01-01: 0 + 2022-01-01: 0.6 + - threshold: + 2022-01-01: 35_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.3 + - threshold: + 2022-01-01: 60_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.1 + - threshold: + 2022-01-01: 85_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/separate.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/separate.yaml new file mode 100644 index 000000000..2c0878e51 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/separate.yaml @@ -0,0 +1,34 @@ +description: Colorado matches this fraction of the federal child tax credit for separate filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: Colorado child tax credit separate rate + reference: + - title: C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=4f86a852-765a-489a-b554-66f6e7d5b065&nodeid=ABPAACAACAABAACABN&nodepath=%2fROOT%2fABP%2fABPAAC%2fABPAACAAC%2fABPAACAACAAB%2fABPAACAACAABAAC%2fABPAACAACAABAACABN&level=6&haschildren=&populated=false&title=39-22-129.+Child+tax+credit+-+legislative+declaration+-+definitions.&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a633G-B1C3-GXJ9-30GW-00008-00&ecomp=7gf59kk&prid=2fe6fa8e-8df8-4d74-a340-c4fa9bc603d5 + - title: 2022 Colorado Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1 + - title: Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16 +brackets: + - threshold: + 2022-01-01: 0 + amount: + 2021-01-01: 0 + 2022-01-01: 0.6 + - threshold: + 2022-01-01: 25_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.3 + - threshold: + 2022-01-01: 50_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.1 + - threshold: + 2022-01-01: 75_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/single.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/single.yaml new file mode 100644 index 000000000..d9bd06631 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/single.yaml @@ -0,0 +1,34 @@ +description: Colorado matches this fraction of the federal child tax credit for single filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: Colorado child tax credit single rate + reference: + - title: C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=4f86a852-765a-489a-b554-66f6e7d5b065&nodeid=ABPAACAACAABAACABN&nodepath=%2fROOT%2fABP%2fABPAAC%2fABPAACAAC%2fABPAACAACAAB%2fABPAACAACAABAAC%2fABPAACAACAABAACABN&level=6&haschildren=&populated=false&title=39-22-129.+Child+tax+credit+-+legislative+declaration+-+definitions.&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a633G-B1C3-GXJ9-30GW-00008-00&ecomp=7gf59kk&prid=2fe6fa8e-8df8-4d74-a340-c4fa9bc603d5 + - title: 2022 Colorado Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1 + - title: Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16 +brackets: + - threshold: + 2022-01-01: 0 + amount: + 2021-01-01: 0 + 2022-01-01: 0.6 + - threshold: + 2022-01-01: 25_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.3 + - threshold: + 2022-01-01: 50_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.1 + - threshold: + 2022-01-01: 75_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/widow.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/widow.yaml new file mode 100644 index 000000000..131f2b414 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/ctc/rate/widow.yaml @@ -0,0 +1,34 @@ +description: Colorado matches this fraction of the federal child tax credit for widow(er) filers, depending on federal adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: Colorado child tax credit widow(er) rate + reference: + - title: C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=4f86a852-765a-489a-b554-66f6e7d5b065&nodeid=ABPAACAACAABAACABN&nodepath=%2fROOT%2fABP%2fABPAAC%2fABPAACAAC%2fABPAACAACAAB%2fABPAACAACAABAAC%2fABPAACAACAABAACABN&level=6&haschildren=&populated=false&title=39-22-129.+Child+tax+credit+-+legislative+declaration+-+definitions.&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a633G-B1C3-GXJ9-30GW-00008-00&ecomp=7gf59kk&prid=2fe6fa8e-8df8-4d74-a340-c4fa9bc603d5 + - title: 2022 Colorado Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1 + - title: Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16 +brackets: + - threshold: + 2022-01-01: 0 + amount: + 2021-01-01: 0 + 2022-01-01: 0.6 + - threshold: + 2022-01-01: 25_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.3 + - threshold: + 2022-01-01: 50_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0.1 + - threshold: + 2022-01-01: 75_000 + amount: + 2021-01-01: 0 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/eitc/match.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/eitc/match.yaml index b48eb1dcf..5474f7ae0 100644 --- a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/eitc/match.yaml +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/eitc/match.yaml @@ -1,14 +1,18 @@ -description: Colorado matches this percent of the federal EITC. -values: - 2021-01-01: 0.1 - 2022-01-01: 0.2 - 2023-01-01: 0.25 - 2026-01-01: 0.20 -metadata: - unit: /1 - label: CO EITC match for filers - reference: - - title: C.R.S. 39-22-123.5 - href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=7ef6a138-0938-45da-8cae-2a6e84fad24f&nodeid=ABPAACAACAABAACABH&nodepath=%2fROOT%2fABP%2fABPAAC%2fABPAACAAC%2fABPAACAACAAB%2fABPAACAACAABAAC%2fABPAACAACAABAACABH&level=6&haschildren=&populated=false&title=39-22-123.5.+Earned+income+tax+credit+-+not+a+refund+of+excess+state+revenues+-+trigger+-+legislative+declaration+-+repeal.&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a633G-9WJ3-CH1B-T4M6-00008-00&ecomp=8gf59kk&prid=a788d381-b05e-42fa-b2df-4d78bdbd5e6c - - title: Individual Estimated Income Tax - href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104EP_2023.pdf +description: Colorado matches this fraction of the federal Earned Income Tax Credit. +values: + 2021-01-01: 0.1 + 2022-01-01: 0.2 + 2023-01-01: 0.25 + 2024-01-01: 0.38 + 2025-01-01: 0.25 + 2026-01-01: 0.20 +metadata: + unit: /1 + label: Colorado EITC match + reference: + - title: C.R.S. 39-22-123.5 + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=7ef6a138-0938-45da-8cae-2a6e84fad24f&nodeid=ABPAACAACAABAACABH&nodepath=%2fROOT%2fABP%2fABPAAC%2fABPAACAAC%2fABPAACAACAAB%2fABPAACAACAABAAC%2fABPAACAACAABAACABH&level=6&haschildren=&populated=false&title=39-22-123.5.+Earned+income+tax+credit+-+not+a+refund+of+excess+state+revenues+-+trigger+-+legislative+declaration+-+repeal.&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a633G-9WJ3-CH1B-T4M6-00008-00&ecomp=8gf59kk&prid=a788d381-b05e-42fa-b2df-4d78bdbd5e6c + - title: Individual Estimated Income Tax + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104EP_2023.pdf + - title: House Bill 23-1112, Section 1, (d), (1) + href: https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=2 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/age_limit.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/age_limit.yaml new file mode 100644 index 000000000..bb4d6309c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/age_limit.yaml @@ -0,0 +1,11 @@ +description: Colorado provides the Income Qualified Senior Housing Tax Credit for filers' at or above this age threshold. +values: + 2022-01-01: 65 +metadata: + unit: year + label: Colorado Age Income-Qualified Senior Housing Tax Credit age threshold + reference: + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=17 + - title: 39-22-544 - Credit against tax - qualifying seniors (4) (a) + href: https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-5-special-rules/section-39-22-544-credit-against-tax-qualifying-seniors-creation-legislative-declaration-definitions diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/income_threshold.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/income_threshold.yaml new file mode 100644 index 000000000..8c7e6ea16 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/income_threshold.yaml @@ -0,0 +1,14 @@ +description: Colorado provides the Income Qualified Senior Housing Tax Credit for filers with adjusted gross income at or below this threshold. +metadata: + label: Colorado Income Qualified Senior Housing Tax Credit agi threshold + period: year + unit: currency-USD + reference: + # Tax Form specifies birth year as opposed to age + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=17 + - title: 39-22-544 - Credit against tax - qualifying seniors (4) (a) + href: https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-5-special-rules/section-39-22-544-credit-against-tax-qualifying-seniors-creation-legislative-declaration-definitions + +values: + 2022-01-01: 75_000 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/amount.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/amount.yaml new file mode 100644 index 000000000..03eede271 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/amount.yaml @@ -0,0 +1,25 @@ +description: Colorado reduces the income qualified senior housing income tax credit amount by this amount for each increment of adjusted gross income exceeding the threshold. +metadata: + period: year + unit: currency-USD + label: Colorado income qualified senior housing income tax credit reduction amount + reference: + - title: Income Qualified Senior Housing Income Tax Credit + href: https://tax.colorado.gov/income-qualified-senior-housing-income-tax-credit + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=17 + - title: C.R.S. 39-22-544 (4) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=36044aec-3814-40aa-973a-a3c829f9fd0b&action=pawlinkdoc&pdcomponentid=&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a6633-05N3-GXF6-81C6-00008-00&pdtocnodeidentifier=ABPAACAACAABAAGACL&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&ecomp=k2vckkk&prid=0823b89b-e2f2-4942-affb-ba0d59f746b8 + breakdown: + - filing_status + +SINGLE: + 2022-01-01: 10 +HEAD_OF_HOUSEHOLD: + 2022-01-01: 10 +JOINT: + 2022-01-01: 10 +WIDOW: + 2022-01-01: 10 +SEPARATE: + 2022-01-01: 5 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/increment.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/increment.yaml new file mode 100644 index 000000000..c3459fa4f --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/increment.yaml @@ -0,0 +1,14 @@ +description: Colorado reduces the income qualified senior housing income tax credit for each of these increments of adjusted gross income exceeding the threshold. +metadata: + period: year + unit: currency-USD + label: Colorado income qualified senior housing income tax credit increment amount + reference: + - title: Income Qualified Senior Housing Income Tax Credit + href: https://tax.colorado.gov/income-qualified-senior-housing-income-tax-credit + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=17 + - title: C.R.S. 39-22-544 (4) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=36044aec-3814-40aa-973a-a3c829f9fd0b&action=pawlinkdoc&pdcomponentid=&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a6633-05N3-GXF6-81C6-00008-00&pdtocnodeidentifier=ABPAACAACAABAAGACL&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&ecomp=k2vckkk&prid=0823b89b-e2f2-4942-affb-ba0d59f746b8 +values: + 2022-01-01: 500 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/max_amount.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/max_amount.yaml new file mode 100644 index 000000000..42286112c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/max_amount.yaml @@ -0,0 +1,25 @@ +description: Colorado allows for the following maximum income qualified senior housing income tax credit, based on filing status. +metadata: + period: year + unit: currency-USD + label: Colorado income qualified senior housing income tax credit max amount + breakdown: + - filing_status + reference: + - title: Income Qualified Senior Housing Income Tax Credit + href: https://tax.colorado.gov/income-qualified-senior-housing-income-tax-credit + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=17 + - title: C.R.S. 39-22-544 (4) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=36044aec-3814-40aa-973a-a3c829f9fd0b&action=pawlinkdoc&pdcomponentid=&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a6633-05N3-GXF6-81C6-00008-00&pdtocnodeidentifier=ABPAACAACAABAAGACL&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&ecomp=k2vckkk&prid=0823b89b-e2f2-4942-affb-ba0d59f746b8 + +SINGLE: + 2022-01-01: 1_000 +HEAD_OF_HOUSEHOLD: + 2022-01-01: 1_000 +JOINT: + 2022-01-01: 1_000 +WIDOW: + 2022-01-01: 1_000 +SEPARATE: + 2022-01-01: 500 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/start.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/start.yaml new file mode 100644 index 000000000..9efff6d96 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/income_qualified_senior_housing/reduction/start.yaml @@ -0,0 +1,14 @@ +description: Colorado reduces the income qualified senior housing income tax credit for filers with adjusted gross income above this amount, based on filing status. +metadata: + period: year + unit: currency-USD + label: Colorado personal income qualified senior housing income tax credit start + reference: + - title: Income Qualified Senior Housing Income Tax Credit + href: https://tax.colorado.gov/income-qualified-senior-housing-income-tax-credit + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=17 + - title: C.R.S. 39-22-544 (4) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=36044aec-3814-40aa-973a-a3c829f9fd0b&action=pawlinkdoc&pdcomponentid=&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a6633-05N3-GXF6-81C6-00008-00&pdtocnodeidentifier=ABPAACAACAABAAGACL&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&ecomp=k2vckkk&prid=0823b89b-e2f2-4942-affb-ba0d59f746b8 +values: + 2022-01-01: 25_499 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..bca4b958d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/refundable.yaml @@ -0,0 +1,20 @@ +description: Colorado refundable tax credits. +metadata: + unit: list + label: Colorado refundable credits + +values: + 2021-01-01: + - co_ctc + - co_cdcc + - co_low_income_cdcc + - co_eitc + - co_sales_tax_refund + + 2022-01-01: + - co_ctc + - co_cdcc + - co_low_income_cdcc + - co_eitc + - co_income_qualified_senior_housing_credit + - co_sales_tax_refund diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/age_threshold.yaml new file mode 100644 index 000000000..20c30c2f5 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/age_threshold.yaml @@ -0,0 +1,14 @@ +description: Colorado limits its sales tax refund to filers this age or older. +values: + 2021-01-01: 18 + +metadata: + unit: year + label: Colorado sales tax refund age threshold + reference: + - title: Colo. Code Regs. 39-22-2003 State Sales Tax Refund (1) (a) (II) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-20/section-39-22-2003/ + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=23 + - title: 2021 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=21 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/amount.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/amount.yaml new file mode 100644 index 000000000..dabc7ed5e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/amount.yaml @@ -0,0 +1,12 @@ +description: Colorado provides a flat sales tax refund credit of this amount. +values: + 2023-01-01: 661 + +metadata: + unit: year + label: Colorado sales tax refund credit flat amount + reference: + - title: 2023 Colorado Individual Income Tax Filing Guide + href: https://leg.colorado.gov/sites/default/files/documents/2023A/bills/fn/2023a_hb1311_00.pdf#page=3 + - title: Colorado General Assembly HB23-1311 Identical Temporary TABOR Refund + href: https://leg.colorado.gov/bills/hb23-1311#:~:text=The%20act%20creates%20a%20new,2022%2D23%20state%20fiscal%20year diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/flat_amount_enabled.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/flat_amount_enabled.yaml new file mode 100644 index 000000000..2699f95f9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/flat_amount_enabled.yaml @@ -0,0 +1,14 @@ +description: Colorado allows for a flat sales tax refund credit if this is true. +values: + 2021-01-01: false + 2023-01-01: true +metadata: + unit: bool + label: Colorado sales tax refund credit flat amount enabled + reference: + - title: 2023 Colorado Individual Income Tax Filing Guide + href: https://leg.colorado.gov/sites/default/files/documents/2023A/bills/fn/2023a_hb1311_00.pdf#page=3 + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=23 + - title: Colorado General Assembly HB23-1311 Identical Temporary TABOR Refund + href: https://leg.colorado.gov/bills/hb23-1311#:~:text=The%20act%20creates%20a%20new,2022%2D23%20state%20fiscal%20year diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/multiplier.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/multiplier.yaml new file mode 100644 index 000000000..fc46147fe --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/multiplier.yaml @@ -0,0 +1,25 @@ +description: Colorado multiplies the base sales tax refund amount by this amount, based on filing status. +metadata: + period: year + unit: /1 + label: Colorado sales tax refund filing status multiplier + reference: + - title: Colo. Code Regs. 39-22-2003 State Sales Tax Refund (3), (b) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-20/section-39-22-2003/ + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=23 + - title: 2021 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=21 + breakdown: + - filing_status + +HEAD_OF_HOUSEHOLD: + 2021-01-01: 1 +JOINT: + 2021-01-01: 2 +SEPARATE: + 2021-01-01: 1 +SINGLE: + 2021-01-01: 1 +WIDOW: + 2021-01-01: 1 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/scale.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/scale.yaml new file mode 100644 index 000000000..e67b37813 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/amount/scale.yaml @@ -0,0 +1,61 @@ +description: Colorado provides this base sales tax refund amount, based on modified adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: Colorado sales tax refund base amount + reference: + - title: Colo. Code Regs. 39-22-2003 State Sales Tax Refund (1), (b) + href: https://casetext.com/regulation/colorado-administrative-code/department-200-department-of-revenue/division-201-taxation-division/rule-1-ccr-201-2-income-tax/rule-39-22-2003-effective-until-8302023-state-sales-tax-refund + # In 2023 Colorado switched to a flat amount as opposed to a scale based on income. + - title: 2023 Colorado Individual Income Tax Filing Guide + href: https://leg.colorado.gov/sites/default/files/documents/2023A/bills/fn/2023a_hb1311_00.pdf#page=3 + - title: Colorado General Assembly HB23-1311 Identical Temporary TABOR Refund + href: https://leg.colorado.gov/bills/hb23-1311#:~:text=The%20act%20creates%20a%20new,2022%2D23%20state%20fiscal%20year + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=23 + - title: 2021 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=21 +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 37 + 2022-01-01: 153 + 2023-01-01: 0 + - threshold: + 2021-01-01: 44_001 + 2022-01-01: 48_001 + amount: + 2021-01-01: 49 + 2022-01-01: 208 + 2023-01-01: 0 + - threshold: + 2021-01-01: 88_001 + 2022-01-01: 95_001 + amount: + 2021-01-01: 56 + 2022-01-01: 234 + 2023-01-01: 0 + - threshold: + 2021-01-01: 139_001 + 2022-01-01: 151_001 + amount: + 2021-01-01: 68 + 2022-01-01: 285 + 2023-01-01: 0 + - threshold: + 2021-01-01: 193_001 + 2022-01-01: 209_001 + amount: + 2021-01-01: 74 + 2022-01-01: 300 + 2023-01-01: 0 + - threshold: + 2021-01-01: 246_001 + 2022-01-01: 268_001 + amount: + 2021-01-01: 117 + 2022-01-01: 486 + 2023-01-01: 0 + diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/magi_sources.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/magi_sources.yaml new file mode 100644 index 000000000..4423bc9b6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/credits/sales_tax_refund/magi_sources.yaml @@ -0,0 +1,16 @@ +description: Colorado accounts for these income sources for the modified adjusted gross income. +values: + 1999-01-01: + - adjusted_gross_income + - tax_exempt_social_security +# - non_taxable_interest_income_from_state_and_local_bonds +metadata: + unit: list + label: Colorado modified adjusted gross income sources + reference: + - title: Colo. Code Regs. 39-22-2003 State Sales Tax Refund (1.5) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-20/section-39-22-2003/ + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=23 + - title: 2021 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=21 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/rate.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/rate.yaml new file mode 100644 index 000000000..95374d017 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/rate.yaml @@ -0,0 +1,25 @@ +description: Colorado taxes personal income at this flat rate. +metadata: + unit: /1 + label: Colorado income tax rate + # THE FOLLOWING THREE REFERENCES JOINTLY DETERMINE THE TAX RATE ON THE FORM + reference: + - title: Colorado Legislation, C.R.S. 39-22-104 (1.5), (1.7) (a), (b) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/ + - title: Colorado Constitution, Article 10, Taxpayer's Bill of Rights (TABOR) + href: https://law.justia.com/constitution/colorado/cnart10.html + - title: Colorado Proposition 121, passed by the electorate in November 2022 + href: https://leg.colorado.gov/sites/default/files/initiative%2520referendum_proposition%20121%20final%20lc%20packet.pdf#page=1 + - title: 2022 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=19 + - title: 2021 Colorado Individual Income Tax Filing Guide + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104Book_2021_V3.pdf#page=6 + +values: + 1987-01-01: 0.05 # form rate determined by Legislation + 1999-01-01: 0.0475 # form rate determined by Legislation + 2000-01-01: 0.0463 # form rate determined by Legislation + 2019-01-01: 0.045 # form rate determined by Constitution TABOR limit + 2020-01-01: 0.0455 # form rate determined by Legislation + 2021-01-01: 0.045 # form rate determined by Constitution TABOR limit + 2022-01-01: 0.044 # form rate determined by Proposition 121 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/charitable_contribution/adjustment.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/charitable_contribution/adjustment.yaml new file mode 100644 index 000000000..e789d206d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/charitable_contribution/adjustment.yaml @@ -0,0 +1,15 @@ +description: Colorado subtracts charitable contributions above this amount from the adjusted gross income of filers who do not itemize on their federal return. +values: + 2021-01-01: 500 + +metadata: + unit: currency-USD + period: year + label: Colorado charitable contributions subtraction adjustment + reference: + - title: 2022 Colorado Individual Tax Filing Guide 104 Book + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12 + - title: C.R.S. 39-22-104(4)(m)(1) + href: https://casetext.com/regulation/colorado-administrative-code/department-200-department-of-revenue/division-201-taxation-division/rule-1-ccr-201-2-income-tax/rule-39-22-1044m-charitable-contribution-subtraction-for-taxpayers-claiming-the-federal-standard-deduction + - title: 2021 Colorado Individual Tax Filing Guide 104 Book + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=12 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/collegeinvest_contribution/max_amount.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/collegeinvest_contribution/max_amount.yaml new file mode 100644 index 000000000..1942f3a38 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/collegeinvest_contribution/max_amount.yaml @@ -0,0 +1,27 @@ +description: Colorado limits the CollegeInvest contribution subtraction to this maximum amount. +metadata: + unit: currency-USD + period: year + label: Colorado CollegeInvest contribution subtraction max amount + breakdown: + - filing_status + reference: + # Subtraction amount is only specified in the Legal Code but not in the Tax Forms + - title: C.R.S. 39-22-104(4)(j)(II)(B) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/ + +HEAD_OF_HOUSEHOLD: + 2021-01-01: .inf + 2022-01-01: 20_000 +JOINT: + 2021-01-01: .inf + 2022-01-01: 30_000 +SEPARATE: + 2021-01-01: .inf + 2022-01-01: 20_000 +SINGLE: + 2021-01-01: .inf + 2022-01-01: 20_000 +WIDOW: + 2021-01-01: .inf + 2022-01-01: 20_000 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/military_retirement/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/military_retirement/age_threshold.yaml new file mode 100644 index 000000000..e517657a6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/military_retirement/age_threshold.yaml @@ -0,0 +1,16 @@ +description: Colorado limits its military retirement subtraction to filers below this age. +values: + 2019-01-01: 55 + +metadata: + unit: year + label: Colorado military retirement subtraction age threshold + reference: + - title: 2022 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1 + - title: Colorado Individual Tax Filing Guide 104 Book + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12 + - title: C.R.S. 39-22-104(4)(y)(II)(B) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/ + - title: 2021 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2021.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/military_retirement/max_amount.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/military_retirement/max_amount.yaml new file mode 100644 index 000000000..a1205b5c8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/military_retirement/max_amount.yaml @@ -0,0 +1,20 @@ +description: Colorado allows for this maximum military retirement subtraction for each eligible individual. +values: + 2019-01-01: 4_500 + 2020-01-01: 7_500 + 2021-01-01: 10_000 + 2022-01-01: 15_000 + +metadata: + unit: currency-USD + period: year + label: Colorado military retirement subtraction max amount + reference: + - title: 2022 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1 + - title: Colorado Individual Tax Filing Guide 104 Book + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12 + - title: C.R.S. 39-22-104(4)(y)(I) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/ + - title: 2021 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2021.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/age_threshold/older.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/age_threshold/older.yaml new file mode 100644 index 000000000..7b44bd80e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/age_threshold/older.yaml @@ -0,0 +1,16 @@ +description: Colorado limits its older pension subtraction to filers above this age threshold. +values: + 2019-01-01: 65 + +metadata: + unit: year + label: Colorado pension subtraction upper age threshold + reference: + - title: 2022 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1 + - title: Colorado Individual Tax Filing Guide 104 Book + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12 + - title: C.R.S. 39-22-104(4)(g)(III)(B) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/ + - title: 2021 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2021.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/age_threshold/younger.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/age_threshold/younger.yaml new file mode 100644 index 000000000..63e82bfbc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/age_threshold/younger.yaml @@ -0,0 +1,16 @@ +description: Colorado limits its younger pension subtraction to filers below this age threshold. +values: + 2019-01-01: 55 + +metadata: + unit: year + label: Colorado pension subtraction lower age threshold + reference: + - title: 2022 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1 + - title: Colorado Individual Tax Filing Guide 104 Book + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12 + - title: C.R.S. 39-22-104(4)(g)(I) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/ + - title: 2021 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2021.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/cap/older.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/cap/older.yaml new file mode 100644 index 000000000..42c1c95b9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/cap/older.yaml @@ -0,0 +1,17 @@ +description: Colorado allows a pension and annuity subtraction to get its net income that is capped at this amount. +values: + 2021-01-01: 24_000 + +metadata: + unit: currency-USD + period: year + label: Colorado capped pension and annuity income amount + reference: + - title: 2022 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1 + - title: Colorado Individual Tax Filing Guide 104 Book + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12 + - title: C.R.S. 39-22-104(4)(g)(III)(B) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/ + - title: 2021 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2021.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/cap/younger.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/cap/younger.yaml new file mode 100644 index 000000000..be4c304f7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/cap/younger.yaml @@ -0,0 +1,17 @@ +description: Colorado allows a pension and annuity subtraction to get its net income that is capped at this amount. +values: + 2021-01-01: 20_000 + +metadata: + unit: currency-USD + period: year + label: Colorado capped pension and annuity income amount + reference: + - title: 2022 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1 + - title: Colorado Individual Tax Filing Guide 104 Book + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12 + - title: C.R.S. 39-22-104(4)(g)(III)(A) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/ + - title: 2021 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2021.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/income_sources.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/income_sources.yaml new file mode 100644 index 000000000..f55e88b3e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/income_sources.yaml @@ -0,0 +1,22 @@ +description: Colorado counts these income sources for the pension subtraction. +values: + 2021-01-01: + - taxable_pension_income + - taxable_social_security + - ira_contributions + - disability_benefits +# In 2022 the taxable social security is calculated separately + 2022-01-01: + - taxable_pension_income + - ira_contributions + - disability_benefits +metadata: + unit: list + label: Colorado pension subtraction income sources + reference: + - title: 2022 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1 + - title: 2021 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2021.pdf#page=1 + - title: Government of Colorado - Income Tax Topics, Social Security, Pensions, and Annuities + href: https://tax.colorado.gov/sites/tax/files/documents/ITT_Social_Security_Pensions_and_Annuities_Feb_2023.pdf#page=2 diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/social_security_subtraction_available.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/social_security_subtraction_available.yaml new file mode 100644 index 000000000..e2927c4d2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/pension/social_security_subtraction_available.yaml @@ -0,0 +1,12 @@ +description: Colorado separates Social Security income from pension income for the pension subtraction if this is true. +values: + 2021-01-01: false + 2022-01-01: true +metadata: + unit: bool + label: Colorado social security subtraction available + reference: + - title: C.R.S. 39-22-104(4)(f)(II) + href: https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/ + - title: C.R.S. 39-22-104(4)(f)(II) + href: https://law.justia.com/codes/colorado/2021/title-39/article-22/part-1/section-39-22-104/ diff --git a/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/subtractions.yaml b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/subtractions.yaml new file mode 100644 index 000000000..3e915a448 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/co/tax/income/subtractions/subtractions.yaml @@ -0,0 +1,31 @@ +description: Colorado counts these sources as subtractions. +values: + 2021-01-01: + # salt_refund_income + - us_govt_interest + - co_pension_subtraction + - co_military_retirement_subtraction + - co_collegeinvest_subtraction + - co_charitable_contribution_subtraction + # Colorado Agricultural Land Capital Gain Subtraction + # Qualified Reservation Income + # PERA/DPSRS Subtraction, for PERA contributions made in 1984–1986 or DPSRS contributions made in 1986 + # Railroad Benefit Subtraction + # Wildfire Mitigation Measures Subtraction + # Colorado Marijuana Business Deduction + # Non-Resident Disaster Relief Worker Subtraction + # Reacquisition of Colorado Residency During Active Duty Military Service Subtraction + # First Time Home Buyer Savings Account Interest Deduction + # Other Subtractions + # Carryforward Subtractions Allowed Under HB21-1002 +metadata: + unit: list + reference: + - title: 2022 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1 + - title: Colorado Individual Tax Filing Guide 104 Book + href: https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=11 + - title: 2021 DR 0104AD + href: https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2021.pdf#page=1 + - title: C.R.S. 39-22-104(4) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=20b2023b-0bab-47de-9fb8-549524cac008&action=pawlinkdoc&pdcomponentid=&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a683G-JJ73-CGX8-04HR-00008-00&pdtocnodeidentifier=ABPAACAACAABAACAAF&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&ecomp=k2vckkk&prid=49fe2864-b8f7-4db8-8819-3b6d1cabfe53 diff --git a/fiscalsim_us/parameters/gov/states/ct/README.md b/fiscalsim_us/parameters/gov/states/ct/README.md new file mode 100644 index 000000000..bf4de1f84 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/README.md @@ -0,0 +1 @@ +# Connecticut diff --git a/fiscalsim_us/parameters/gov/states/ct/index.yaml b/fiscalsim_us/parameters/gov/states/ct/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/amount.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/amount.yaml new file mode 100644 index 000000000..4d3345c06 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/amount.yaml @@ -0,0 +1,22 @@ +description: Connecticut phases its bottom income tax rate out by this amount, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut bottom income tax phase out amount + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 20 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 32 +JOINT: + 2015-01-01: 40 +WIDOW: + 2015-01-01: 40 +SEPARATE: + 2015-01-01: 20 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/increment.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/increment.yaml new file mode 100644 index 000000000..0a43ac505 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/increment.yaml @@ -0,0 +1,22 @@ +description: Connecticut phases its bottom income tax rate out in these increments, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax phase out brackets + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 5_000 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 4_000 +JOINT: + 2015-01-01: 5_000 +WIDOW: + 2015-01-01: 5_000 +SEPARATE: + 2015-01-01: 2_500 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/max_amount.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/max_amount.yaml new file mode 100644 index 000000000..7aae9ec05 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/max_amount.yaml @@ -0,0 +1,22 @@ +description: Connecticut has an phase-out add-back of this maximum amount, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax phase out max amount + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 200 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 320 +JOINT: + 2015-01-01: 400 +WIDOW: + 2015-01-01: 400 +SEPARATE: + 2015-01-01: 200 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/start.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/start.yaml new file mode 100644 index 000000000..ffc25caa7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/add_back/start.yaml @@ -0,0 +1,22 @@ +description: Connecticut phases its bottom income tax rate out for filers with adjusted gross income above this threshold, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax phase out start + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 56_500 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 78_500 +JOINT: + 2015-01-01: 100_500 +WIDOW: + 2015-01-01: 100_500 +SEPARATE: + 2015-01-01: 50_250 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/head_of_household.yaml new file mode 100644 index 000000000..010965370 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/head_of_household.yaml @@ -0,0 +1,124 @@ +description: Connecticut provides head of household filers a credit for this fraction of taxes, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Connecticut AGI credit for head of household filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-703, (1), (I) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-703 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=23 +brackets: + - threshold: + 2016-01-01: 19_000 + amount: + 2016-01-01: 0.75 + - threshold: + 2016-01-01: 24_000 + amount: + 2016-01-01: 0.70 + - threshold: + 2016-01-01: 24_500 + amount: + 2016-01-01: 0.65 + - threshold: + 2016-01-01: 25_000 + amount: + 2016-01-01: 0.60 + - threshold: + 2016-01-01: 25_500 + amount: + 2016-01-01: 0.55 + - threshold: + 2016-01-01: 26_000 + amount: + 2016-01-01: 0.50 + - threshold: + 2016-01-01: 26_500 + amount: + 2016-01-01: 0.45 + - threshold: + 2016-01-01: 27_000 + amount: + 2016-01-01: 0.40 + - threshold: + 2016-01-01: 27_500 + amount: + 2016-01-01: 0.35 + - threshold: + 2016-01-01: 34_000 + amount: + 2016-01-01: 0.30 + - threshold: + 2016-01-01: 34_500 + amount: + 2016-01-01: 0.25 + - threshold: + 2016-01-01: 35_000 + amount: + 2016-01-01: 0.20 + - threshold: + 2016-01-01: 35_500 + amount: + 2016-01-01: 0.15 + - threshold: + 2016-01-01: 44_000 + amount: + 2016-01-01: 0.14 + - threshold: + 2016-01-01: 44_500 + amount: + 2016-01-01: 0.13 + - threshold: + 2016-01-01: 45_000 + amount: + 2016-01-01: 0.12 + - threshold: + 2016-01-01: 45_500 + amount: + 2016-01-01: 0.11 + - threshold: + 2016-01-01: 46_000 + amount: + 2016-01-01: 0.10 + - threshold: + 2016-01-01: 74_000 + amount: + 2016-01-01: 0.09 + - threshold: + 2016-01-01: 74_500 + amount: + 2016-01-01: 0.08 + - threshold: + 2016-01-01: 75_000 + amount: + 2016-01-01: 0.07 + - threshold: + 2016-01-01: 75_500 + amount: + 2016-01-01: 0.06 + - threshold: + 2016-01-01: 76_000 + amount: + 2016-01-01: 0.05 + - threshold: + 2016-01-01: 76_500 + amount: + 2016-01-01: 0.04 + - threshold: + 2016-01-01: 77_000 + amount: + 2016-01-01: 0.03 + - threshold: + 2016-01-01: 77_500 + amount: + 2016-01-01: 0.02 + - threshold: + 2016-01-01: 78_000 + amount: + 2016-01-01: 0.01 + - threshold: + 2016-01-01: 78_500 + amount: + 2016-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/joint.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/joint.yaml new file mode 100644 index 000000000..b93e41055 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/joint.yaml @@ -0,0 +1,124 @@ +description: Connecticut provides joint filers a credit for this fraction of taxes, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Connecticut AGI credit for joint filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-703, (1), (I) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-703 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=23 +brackets: + - threshold: + 2016-01-01: 24_000 + amount: + 2016-01-01: 0.75 + - threshold: + 2016-01-01: 30_000 + amount: + 2016-01-01: 0.70 + - threshold: + 2016-01-01: 30_500 + amount: + 2016-01-01: 0.65 + - threshold: + 2016-01-01: 31_000 + amount: + 2016-01-01: 0.60 + - threshold: + 2016-01-01: 31_500 + amount: + 2016-01-01: 0.55 + - threshold: + 2016-01-01: 32_000 + amount: + 2016-01-01: 0.50 + - threshold: + 2016-01-01: 32_500 + amount: + 2016-01-01: 0.45 + - threshold: + 2016-01-01: 33_000 + amount: + 2016-01-01: 0.40 + - threshold: + 2016-01-01: 33_500 + amount: + 2016-01-01: 0.35 + - threshold: + 2016-01-01: 40_000 + amount: + 2016-01-01: 0.30 + - threshold: + 2016-01-01: 40_500 + amount: + 2016-01-01: 0.25 + - threshold: + 2016-01-01: 41_000 + amount: + 2016-01-01: 0.20 + - threshold: + 2016-01-01: 41_500 + amount: + 2016-01-01: 0.15 + - threshold: + 2016-01-01: 50_000 + amount: + 2016-01-01: 0.14 + - threshold: + 2016-01-01: 50_500 + amount: + 2016-01-01: 0.13 + - threshold: + 2016-01-01: 51_000 + amount: + 2016-01-01: 0.12 + - threshold: + 2016-01-01: 51_500 + amount: + 2016-01-01: 0.11 + - threshold: + 2016-01-01: 52_000 + amount: + 2016-01-01: 0.10 + - threshold: + 2016-01-01: 96_000 + amount: + 2016-01-01: 0.09 + - threshold: + 2016-01-01: 96_500 + amount: + 2016-01-01: 0.08 + - threshold: + 2016-01-01: 97_000 + amount: + 2016-01-01: 0.07 + - threshold: + 2016-01-01: 97_500 + amount: + 2016-01-01: 0.06 + - threshold: + 2016-01-01: 98_000 + amount: + 2016-01-01: 0.05 + - threshold: + 2016-01-01: 98_500 + amount: + 2016-01-01: 0.04 + - threshold: + 2016-01-01: 99_000 + amount: + 2016-01-01: 0.03 + - threshold: + 2016-01-01: 99_500 + amount: + 2016-01-01: 0.02 + - threshold: + 2016-01-01: 100_000 + amount: + 2016-01-01: 0.01 + - threshold: + 2016-01-01: 100_500 + amount: + 2016-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/separate.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/separate.yaml new file mode 100644 index 000000000..7f87b50ef --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/separate.yaml @@ -0,0 +1,124 @@ +description: Connecticut provides separate filers a credit for this fraction of taxes, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Connecticut AGI credit for separate filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-703, (1), (I) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-703 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=23 +brackets: + - threshold: + 2016-01-01: 12_000 + amount: + 2016-01-01: 0.75 + - threshold: + 2016-01-01: 15_000 + amount: + 2016-01-01: 0.70 + - threshold: + 2016-01-01: 15_500 + amount: + 2016-01-01: 0.65 + - threshold: + 2016-01-01: 16_000 + amount: + 2016-01-01: 0.60 + - threshold: + 2016-01-01: 16_500 + amount: + 2016-01-01: 0.55 + - threshold: + 2016-01-01: 17_000 + amount: + 2016-01-01: 0.50 + - threshold: + 2016-01-01: 17_500 + amount: + 2016-01-01: 0.45 + - threshold: + 2016-01-01: 18_000 + amount: + 2016-01-01: 0.40 + - threshold: + 2016-01-01: 18_500 + amount: + 2016-01-01: 0.35 + - threshold: + 2016-01-01: 20_000 + amount: + 2016-01-01: 0.30 + - threshold: + 2016-01-01: 20_500 + amount: + 2016-01-01: 0.25 + - threshold: + 2016-01-01: 21_000 + amount: + 2016-01-01: 0.20 + - threshold: + 2016-01-01: 21_500 + amount: + 2016-01-01: 0.15 + - threshold: + 2016-01-01: 25_000 + amount: + 2016-01-01: 0.14 + - threshold: + 2016-01-01: 25_500 + amount: + 2016-01-01: 0.13 + - threshold: + 2016-01-01: 26_000 + amount: + 2016-01-01: 0.12 + - threshold: + 2016-01-01: 26_500 + amount: + 2016-01-01: 0.11 + - threshold: + 2016-01-01: 27_000 + amount: + 2016-01-01: 0.10 + - threshold: + 2016-01-01: 48_000 + amount: + 2016-01-01: 0.09 + - threshold: + 2016-01-01: 48_500 + amount: + 2016-01-01: 0.08 + - threshold: + 2016-01-01: 49_000 + amount: + 2016-01-01: 0.07 + - threshold: + 2016-01-01: 49_500 + amount: + 2016-01-01: 0.06 + - threshold: + 2016-01-01: 50_000 + amount: + 2016-01-01: 0.05 + - threshold: + 2016-01-01: 50_500 + amount: + 2016-01-01: 0.04 + - threshold: + 2016-01-01: 51_000 + amount: + 2016-01-01: 0.03 + - threshold: + 2016-01-01: 51_500 + amount: + 2016-01-01: 0.02 + - threshold: + 2016-01-01: 52_000 + amount: + 2016-01-01: 0.01 + - threshold: + 2016-01-01: 52_500 + amount: + 2016-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/single.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/single.yaml new file mode 100644 index 000000000..497ae5172 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/single.yaml @@ -0,0 +1,124 @@ +description: Connecticut provides single filers a credit for this fraction of taxes, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Connecticut AGI credit for single filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-703, (1), (I) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-703 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=23 +brackets: + - threshold: + 2016-01-01: 15_000 + amount: + 2016-01-01: 0.75 + - threshold: + 2016-01-01: 18_800 + amount: + 2016-01-01: 0.70 + - threshold: + 2016-01-01: 19_300 + amount: + 2016-01-01: 0.65 + - threshold: + 2016-01-01: 19_800 + amount: + 2016-01-01: 0.60 + - threshold: + 2016-01-01: 20_300 + amount: + 2016-01-01: 0.55 + - threshold: + 2016-01-01: 20_800 + amount: + 2016-01-01: 0.50 + - threshold: + 2016-01-01: 21_300 + amount: + 2016-01-01: 0.45 + - threshold: + 2016-01-01: 21_800 + amount: + 2016-01-01: 0.40 + - threshold: + 2016-01-01: 22_300 + amount: + 2016-01-01: 0.35 + - threshold: + 2016-01-01: 25_000 + amount: + 2016-01-01: 0.30 + - threshold: + 2016-01-01: 25_500 + amount: + 2016-01-01: 0.25 + - threshold: + 2016-01-01: 26_000 + amount: + 2016-01-01: 0.20 + - threshold: + 2016-01-01: 26_500 + amount: + 2016-01-01: 0.15 + - threshold: + 2016-01-01: 31_300 + amount: + 2016-01-01: 0.14 + - threshold: + 2016-01-01: 31_800 + amount: + 2016-01-01: 0.13 + - threshold: + 2016-01-01: 32_300 + amount: + 2016-01-01: 0.12 + - threshold: + 2016-01-01: 32_800 + amount: + 2016-01-01: 0.11 + - threshold: + 2016-01-01: 33_300 + amount: + 2016-01-01: 0.10 + - threshold: + 2016-01-01: 60_000 + amount: + 2016-01-01: 0.09 + - threshold: + 2016-01-01: 60_500 + amount: + 2016-01-01: 0.08 + - threshold: + 2016-01-01: 61_000 + amount: + 2016-01-01: 0.07 + - threshold: + 2016-01-01: 61_500 + amount: + 2016-01-01: 0.06 + - threshold: + 2016-01-01: 62_000 + amount: + 2016-01-01: 0.05 + - threshold: + 2016-01-01: 62_500 + amount: + 2016-01-01: 0.04 + - threshold: + 2016-01-01: 63_000 + amount: + 2016-01-01: 0.03 + - threshold: + 2016-01-01: 63_500 + amount: + 2016-01-01: 0.02 + - threshold: + 2016-01-01: 64_000 + amount: + 2016-01-01: 0.01 + - threshold: + 2016-01-01: 64_500 + amount: + 2016-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/widow.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/widow.yaml new file mode 100644 index 000000000..ed470f928 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/agi/widow.yaml @@ -0,0 +1,124 @@ +description: Connecticut provides widow filers a credit for this fraction of taxes, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Connecticut AGI credit for widow filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-703, (1), (I) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-703 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=23 +brackets: + - threshold: + 2016-01-01: 24_000 + amount: + 2016-01-01: 0.75 + - threshold: + 2016-01-01: 30_000 + amount: + 2016-01-01: 0.70 + - threshold: + 2016-01-01: 30_500 + amount: + 2016-01-01: 0.65 + - threshold: + 2016-01-01: 31_000 + amount: + 2016-01-01: 0.60 + - threshold: + 2016-01-01: 31_500 + amount: + 2016-01-01: 0.55 + - threshold: + 2016-01-01: 32_000 + amount: + 2016-01-01: 0.50 + - threshold: + 2016-01-01: 32_500 + amount: + 2016-01-01: 0.45 + - threshold: + 2016-01-01: 33_000 + amount: + 2016-01-01: 0.40 + - threshold: + 2016-01-01: 33_500 + amount: + 2016-01-01: 0.35 + - threshold: + 2016-01-01: 40_000 + amount: + 2016-01-01: 0.30 + - threshold: + 2016-01-01: 40_500 + amount: + 2016-01-01: 0.25 + - threshold: + 2016-01-01: 41_000 + amount: + 2016-01-01: 0.20 + - threshold: + 2016-01-01: 41_500 + amount: + 2016-01-01: 0.15 + - threshold: + 2016-01-01: 50_000 + amount: + 2016-01-01: 0.14 + - threshold: + 2016-01-01: 50_500 + amount: + 2016-01-01: 0.13 + - threshold: + 2016-01-01: 51_000 + amount: + 2016-01-01: 0.12 + - threshold: + 2016-01-01: 51_500 + amount: + 2016-01-01: 0.11 + - threshold: + 2016-01-01: 52_000 + amount: + 2016-01-01: 0.10 + - threshold: + 2016-01-01: 96_000 + amount: + 2016-01-01: 0.09 + - threshold: + 2016-01-01: 96_500 + amount: + 2016-01-01: 0.08 + - threshold: + 2016-01-01: 97_000 + amount: + 2016-01-01: 0.07 + - threshold: + 2016-01-01: 97_500 + amount: + 2016-01-01: 0.06 + - threshold: + 2016-01-01: 98_000 + amount: + 2016-01-01: 0.05 + - threshold: + 2016-01-01: 98_500 + amount: + 2016-01-01: 0.04 + - threshold: + 2016-01-01: 99_000 + amount: + 2016-01-01: 0.03 + - threshold: + 2016-01-01: 99_500 + amount: + 2016-01-01: 0.02 + - threshold: + 2016-01-01: 100_000 + amount: + 2016-01-01: 0.01 + - threshold: + 2016-01-01: 100_500 + amount: + 2016-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..03042587d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit \ No newline at end of file diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/eitc/match.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/eitc/match.yaml new file mode 100644 index 000000000..c3b815158 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/credits/eitc/match.yaml @@ -0,0 +1,16 @@ +description: Connecticut matches this percent of the federal earned income tax credit. +values: + 2017-01-01: 0.230 + 2021-01-01: 0.305 +metadata: + unit: /1 + label: Connecticut EITC match + reference: + - title: Connecticut Earned Income Tax Credit Form (2022) + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/Schedule-CT-EITC_1222.pdf#page=2 + - title: Connecticut Earned Income Tax Credit Form (2020) + href: https://portal.ct.gov/-/media/DRS/Forms/2020/Income/Schedule-CT-EITC_0121.pdf#page=2 + - title: Connecticut Earned Income Tax Credit Legal Code Sec. 12-704e (a) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-704e + - title: Connecticut Earned Income Tax Credit Form (2021) + href: https://portal.ct.gov/-/media/DRS/Forms/2021/Income/Schedule-CT-EITC_1221.pdf diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/max_amount.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/max_amount.yaml new file mode 100644 index 000000000..dfc2009fe --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/max_amount.yaml @@ -0,0 +1,22 @@ +description: Connecticut allows for the following maximum personal exemption amount, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut personal exemption max amount + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-702, (b & c) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-702 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page19 +SINGLE: + 2016-01-01: 15_000 +HEAD_OF_HOUSEHOLD: + 2016-01-01: 19_000 +JOINT: + 2016-01-01: 24_000 +WIDOW: + 2016-01-01: 24_000 +SEPARATE: + 2016-01-01: 12_000 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/amount.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/amount.yaml new file mode 100644 index 000000000..6f9931fca --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/amount.yaml @@ -0,0 +1,12 @@ +description: Connecticut reduces the personal exemption amount by this amount for each increment of state adjusted gross income exceeding the threshold. +metadata: + period: year + unit: currency-USD + label: Connecticut personal exemption reduction amount + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-702, (b), (2) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-702 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page19 +values: + 2016-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/increment.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/increment.yaml new file mode 100644 index 000000000..961c33c7e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/increment.yaml @@ -0,0 +1,12 @@ +description: Connecticut reduces the personal exemption amount for each of these increments of state adjusted gross income exceeding the threshold. +metadata: + period: year + unit: currency-USD + label: Connecticut personal exemption reduction increment + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-702, (b), (2) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-702 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page19 +values: + 2016-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/start.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/start.yaml new file mode 100644 index 000000000..3d96e38cf --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/exemptions/personal/reduction/start.yaml @@ -0,0 +1,22 @@ +description: Connecticut reduces the personal exemption for filers with state adjusted gross income above this amount, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut personal exemption reduction start + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-702, (b & c) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-702 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page19 +SINGLE: + 2016-01-01: 30_000 +HEAD_OF_HOUSEHOLD: + 2016-01-01: 38_000 +JOINT: + 2016-01-01: 48_000 +WIDOW: + 2016-01-01: 48_000 +SEPARATE: + 2016-01-01: 24_000 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/head_of_household.yaml new file mode 100644 index 000000000..1d294f2af --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/head_of_household.yaml @@ -0,0 +1,40 @@ +description: Connecticut taxes income of head of household filers at these rates. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Connecticut income tax rate head of household filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=20 +brackets: + - threshold: + 2015-01-01: 0 + rate: + 2015-01-01: 0.03 + - threshold: + 2015-01-01: 16_000 + rate: + 2015-01-01: 0.05 + - threshold: + 2015-01-01: 80_000 + rate: + 2015-01-01: 0.055 + - threshold: + 2015-01-01: 160_000 + rate: + 2015-01-01: 0.06 + - threshold: + 2015-01-01: 320_000 + rate: + 2015-01-01: 0.065 + - threshold: + 2015-01-01: 400_000 + rate: + 2015-01-01: 0.069 + - threshold: + 2015-01-01: 800_000 + rate: + 2015-01-01: 0.0699 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/joint.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/joint.yaml new file mode 100644 index 000000000..1bf8620d7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/joint.yaml @@ -0,0 +1,40 @@ +description: Connecticut taxes income of head of household filers at these rates. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Connecticut income tax rate joint filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (C) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=20 +brackets: + - threshold: + 2015-01-01: 0 + rate: + 2015-01-01: 0.03 + - threshold: + 2015-01-01: 20_000 + rate: + 2015-01-01: 0.05 + - threshold: + 2015-01-01: 100_000 + rate: + 2015-01-01: 0.055 + - threshold: + 2015-01-01: 200_000 + rate: + 2015-01-01: 0.06 + - threshold: + 2015-01-01: 400_000 + rate: + 2015-01-01: 0.065 + - threshold: + 2015-01-01: 500_000 + rate: + 2015-01-01: 0.069 + - threshold: + 2015-01-01: 1_000_000 + rate: + 2015-01-01: 0.0699 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/separate.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/separate.yaml new file mode 100644 index 000000000..440e5a76c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/separate.yaml @@ -0,0 +1,40 @@ +description: Connecticut taxes income of separate filers at these rates. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Connecticut income tax rate separate filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (A) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=20 +brackets: + - threshold: + 2015-01-01: 0 + rate: + 2015-01-01: 0.03 + - threshold: + 2015-01-01: 10_000 + rate: + 2015-01-01: 0.05 + - threshold: + 2015-01-01: 50_000 + rate: + 2015-01-01: 0.055 + - threshold: + 2015-01-01: 100_000 + rate: + 2015-01-01: 0.06 + - threshold: + 2015-01-01: 200_000 + rate: + 2015-01-01: 0.065 + - threshold: + 2015-01-01: 250_000 + rate: + 2015-01-01: 0.069 + - threshold: + 2015-01-01: 500_000 + rate: + 2015-01-01: 0.0699 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/single.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/single.yaml new file mode 100644 index 000000000..092d7d80c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/single.yaml @@ -0,0 +1,40 @@ +description: Connecticut taxes income of single filers at these rates. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Connecticut income tax rate single filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (A) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=20 +brackets: + - threshold: + 2015-01-01: 0 + rate: + 2015-01-01: 0.03 + - threshold: + 2015-01-01: 10_000 + rate: + 2015-01-01: 0.05 + - threshold: + 2015-01-01: 50_000 + rate: + 2015-01-01: 0.055 + - threshold: + 2015-01-01: 100_000 + rate: + 2015-01-01: 0.06 + - threshold: + 2015-01-01: 200_000 + rate: + 2015-01-01: 0.065 + - threshold: + 2015-01-01: 250_000 + rate: + 2015-01-01: 0.069 + - threshold: + 2015-01-01: 500_000 + rate: + 2015-01-01: 0.0699 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/widow.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/widow.yaml new file mode 100644 index 000000000..52484f78b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/rates/widow.yaml @@ -0,0 +1,40 @@ +description: Connecticut taxes income of widow(er) filers at these rates. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Connecticut income tax rate widow(er) filers + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (C) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=20 +brackets: + - threshold: + 2015-01-01: 0 + rate: + 2015-01-01: 0.03 + - threshold: + 2015-01-01: 20_000 + rate: + 2015-01-01: 0.05 + - threshold: + 2015-01-01: 100_000 + rate: + 2015-01-01: 0.055 + - threshold: + 2015-01-01: 200_000 + rate: + 2015-01-01: 0.06 + - threshold: + 2015-01-01: 400_000 + rate: + 2015-01-01: 0.065 + - threshold: + 2015-01-01: 500_000 + rate: + 2015-01-01: 0.069 + - threshold: + 2015-01-01: 1_000_000 + rate: + 2015-01-01: 0.0699 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/amount.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/amount.yaml new file mode 100644 index 000000000..19068f88a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/amount.yaml @@ -0,0 +1,22 @@ +description: Connecticut allows for this higher tax recapture amount for each additional increment of state adjusted gross income, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax higher recapture amount + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 50 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 80 +JOINT: + 2015-01-01: 100 +WIDOW: + 2015-01-01: 100 +SEPARATE: + 2015-01-01: 50 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/increment.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/increment.yaml new file mode 100644 index 000000000..b67d2073e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/increment.yaml @@ -0,0 +1,22 @@ +description: Connecticut increases the higher tax recapture amount in these increments of State adjusted gross income, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax higher recapture brackets + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 5_000 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 8_000 +JOINT: + 2015-01-01: 10_000 +WIDOW: + 2015-01-01: 10_000 +SEPARATE: + 2015-01-01: 5_000 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/max_amount.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/max_amount.yaml new file mode 100644 index 000000000..a97393697 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/max_amount.yaml @@ -0,0 +1,22 @@ +description: Connecticut provides a higher tax recapture amount of up to this maximum amount, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax higher recapture max amount + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 450 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 720 +JOINT: + 2015-01-01: 900 +WIDOW: + 2015-01-01: 900 +SEPARATE: + 2015-01-01: 450 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/start.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/start.yaml new file mode 100644 index 000000000..a39c923c3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/higher/start.yaml @@ -0,0 +1,22 @@ +description: Connecticut allows a higher tax recapture amount for filers with income above this threshold, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax higher recapture start + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page22 +SINGLE: + 2015-01-01: 500_000 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 800_000 +JOINT: + 2015-01-01: 1_000_000 +WIDOW: + 2015-01-01: 1_000_000 +SEPARATE: + 2015-01-01: 500_000 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/amount.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/amount.yaml new file mode 100644 index 000000000..3dddb286e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/amount.yaml @@ -0,0 +1,22 @@ +description: Connecticut allows for this lower tax recapture amount for each additional increment of state adjusted gross income, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax lower recapture amount + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 90 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 140 +JOINT: + 2015-01-01: 180 +WIDOW: + 2015-01-01: 180 +SEPARATE: + 2015-01-01: 90 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/increment.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/increment.yaml new file mode 100644 index 000000000..06494a2ae --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/increment.yaml @@ -0,0 +1,22 @@ +description: Connecticut increases the higher tax recapture amount in these increments of State adjusted gross income, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax lower recapture brackets + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 5_000 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 8_000 +JOINT: + 2015-01-01: 10_000 +WIDOW: + 2015-01-01: 10_000 +SEPARATE: + 2015-01-01: 5_000 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/max_amount.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/max_amount.yaml new file mode 100644 index 000000000..c6db3e210 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/max_amount.yaml @@ -0,0 +1,22 @@ +description: Connecticut provides a lower tax recapture amount of up to this maximum amount, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax higher recapture max amount + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 2_700 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 4_200 +JOINT: + 2015-01-01: 5_400 +WIDOW: + 2015-01-01: 5_400 +SEPARATE: + 2015-01-01: 2_700 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/start.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/start.yaml new file mode 100644 index 000000000..95079017b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/recapture/lower/start.yaml @@ -0,0 +1,22 @@ +description: Connecticut allows a lower tax recapture amount for filers with income above this threshold, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut income tax lower recapture start + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-700, (9), (B) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-700 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page21 +SINGLE: + 2015-01-01: 200_000 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 320_000 +JOINT: + 2015-01-01: 400_000 +WIDOW: + 2015-01-01: 400_000 +SEPARATE: + 2015-01-01: 200_000 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/subtractions/subtractions.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/subtractions/subtractions.yaml new file mode 100644 index 000000000..31f80b42b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/subtractions/subtractions.yaml @@ -0,0 +1,12 @@ +description: Connecticut counts these sources as subtractions. +values: + 2021-01-01: + - military_retirement_pay +metadata: + unit: list + label: Connecticut adjusted gross income subtractions + reference: + - title: Connecticut General Statutes, Chapter 229, §12-707(g)(4)(D) + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-707 + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions, Line 44 + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=9 diff --git a/fiscalsim_us/parameters/gov/states/ct/tax/income/subtractions/tuition/cap.yaml b/fiscalsim_us/parameters/gov/states/ct/tax/income/subtractions/tuition/cap.yaml new file mode 100644 index 000000000..423472ad8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ct/tax/income/subtractions/tuition/cap.yaml @@ -0,0 +1,22 @@ +description: Connecticut limits the state tuition subtraction to this amount, based on filing status. +metadata: + period: year + unit: currency-USD + label: Connecticut state tuition subtraction max amount + breakdown: + - filing_status + reference: + - title: Connecticut General Statutes, Chapter 229, Sec. 12-701a + href: https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-701a + - title: 2022 Form CT-1040 Connecticut Resident Income Tax Return Instructions + href: https://portal.ct.gov/-/media/DRS/Forms/2022/Income/2022-CT-1040-Instructions_1222.pdf#page=21 +SINGLE: + 2015-01-01: 5_000 +HEAD_OF_HOUSEHOLD: + 2015-01-01: 5_000 +JOINT: + 2015-01-01: 10_000 +WIDOW: + 2015-01-01: 5_000 +SEPARATE: + 2015-01-01: 5_000 diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/README.md b/fiscalsim_us/parameters/gov/states/dc/dhs/README.md index d11baf803..4f379ec3e 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/README.md +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/README.md @@ -1 +1 @@ -# DHS +# Department of Human Services diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/README.md b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/README.md index 26b95cf35..5d5a891e7 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/README.md +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/README.md @@ -1 +1 @@ -# TANF +# Temporary Assistance for Needy Families (TANF) diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/grant_standard/main.yaml b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/grant_standard/main.yaml index 8c2269626..fda6398fc 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/grant_standard/main.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/grant_standard/main.yaml @@ -9,6 +9,9 @@ metadata: reference: - title: TANF for District Families href: https://dhs.dc.gov/service/tanf-district-families + # Adjusted for inflation beginning 2014-10-01. + - title: Code of the District of Columbia § 4–205.52(c) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.52#(c) 1: 2022-10-01: 437 diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/unearned_deduction/monthly_child_support.yaml b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/deductions/child_support.yaml similarity index 55% rename from fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/unearned_deduction/monthly_child_support.yaml rename to fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/deductions/child_support.yaml index 2fdad5ef0..a70a716db 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/unearned_deduction/monthly_child_support.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/deductions/child_support.yaml @@ -1,12 +1,12 @@ description: DC excludes this amount of monthly child support when computing unearned income. values: - 2022-03-01: 150 + 2005-10-01: 150 metadata: unit: currency-USD period: month label: DC TANF child support exclusion reference: - - title: TANF for District Families - href: https://dhs.dc.gov/service/tanf-district-families + - title: Code of the District of Columbia § 4–205.11(a)(8) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.11#(a)(8) diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/earned_deduction/flat.yaml b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/deductions/earned/flat.yaml similarity index 83% rename from fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/earned_deduction/flat.yaml rename to fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/deductions/earned/flat.yaml index bc1db5a94..70afee70d 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/earned_deduction/flat.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/deductions/earned/flat.yaml @@ -1,12 +1,12 @@ description: DC excludes this amount of earnings from TANF countable income when determining need for new applicants. values: - 2022-03-01: 160 + 2020-10-01: 160 metadata: unit: currency-USD period: month label: DC TANF flat earnings exclusion reference: - - title: DC TANF Announcement State Plan For Comments + - title: DC TANF State Plan | Section 4 (4)(a) href: https://dhs.dc.gov/sites/default/files/dc/sites/dhs/service_content/attachments/TANF_Announcement_StatePlan_ForComment_01072020.pdf#page=22 diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/earned_deduction/percentage.yaml b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/deductions/earned/percentage.yaml similarity index 71% rename from fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/earned_deduction/percentage.yaml rename to fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/deductions/earned/percentage.yaml index f46a40479..78ca37ce0 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/earned_deduction/percentage.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/deductions/earned/percentage.yaml @@ -1,12 +1,13 @@ description: DC excludes this share of earnings from TANF countable income, except for determining need for new applicants. values: - 2022-03-01: 0.67 + # Actually 2/3, but yaml does not accept "2/3". + 2020-10-01: 0.67 metadata: unit: /1 period: month label: DC TANF earnings exclusion percent reference: - - title: DC TANF Announcement State Plan For Comments - href: https://dhs.dc.gov/sites/default/files/dc/sites/dhs/service_content/attachments/TANF_Announcement_StatePlan_ForComment_01072020.pdf#page=22 + - title: DC TANF State Plan | Section 4 (4)(a) + href: https://dhs.dc.gov/sites/default/files/dc/sites/dhs/service_content/attachments/TANF_Announcement_StatePlan_ForComment_01072020.pdf#page=23 diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/earned.yaml b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/sources/earned.yaml similarity index 95% rename from fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/earned.yaml rename to fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/sources/earned.yaml index fd6e1bcc6..8eb0e2d5c 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/earned.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/sources/earned.yaml @@ -1,6 +1,6 @@ description: DC TANF counts these income sources as earned income. values: - 2023-03-22: + 2020-01-01: - employment_income - self_employment_income metadata: diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/unearned.yaml b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/sources/unearned.yaml similarity index 97% rename from fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/unearned.yaml rename to fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/sources/unearned.yaml index 3efcc2f71..5a916510f 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/unearned.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/income/sources/unearned.yaml @@ -1,6 +1,6 @@ description: DC TANF counts these income sources as unearned income. values: - 2023-03-22: + 2020-01-01: - veterans_benefits - rental_income - alimony_income diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/need_standard/additional_childcare.yaml b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/need_standard/additional_childcare.yaml index 1f5842393..ba5025b39 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/need_standard/additional_childcare.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/need_standard/additional_childcare.yaml @@ -8,18 +8,18 @@ metadata: threshold_unit: year amount_unit: currency-USD reference: - - title: TANF for District Families - href: https://dhs.dc.gov/service/tanf-district-families + - title: TANF State Plan | Section 4 (4)(a) + href: https://dhs.dc.gov/sites/default/files/dc/sites/dhs/service_content/attachments/TANF_Announcement_StatePlan_ForComment_01072020.pdf#page=22 # Use a scale parameter with two brackets: $200 for under 2, $175 for 2 and older. brackets: - amount: - 2022-10-01: 200 + 2020-10-01: 200 threshold: - 2022-10-01: 0 # Age zero until the next bracket threshold. + 2020-10-01: 0 # Age zero until the next bracket threshold. - amount: - 2022-10-01: 175 + 2020-10-01: 175 threshold: - 2022-10-01: 2 + 2020-10-01: 2 diff --git a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/need_standard/main.yaml b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/need_standard/main.yaml index a92d517b1..9ba0bc850 100644 --- a/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/need_standard/main.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/dhs/tanf/need_standard/main.yaml @@ -9,12 +9,14 @@ metadata: reference: - title: TANF for District Families href: https://dhs.dc.gov/service/tanf-district-families - https://code.dccouncil.gov/us/dc/council/code/sections/4-205.52 + # Not adjusted for inflation. + - title: Code of the District of Columbia § 4–205.52(c) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.52#(c) 1: 2022-10-01: 450 2: - 2022-10-01: 560 + 2022-10-01: 560 3: 2022-10-01: 712 4: diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/additions/self_employment_loss/threshold.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/additions/self_employment_loss/threshold.yaml new file mode 100644 index 000000000..040265c48 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/additions/self_employment_loss/threshold.yaml @@ -0,0 +1,13 @@ +description: DC AGI excludes self-employment losses in excess of this threshold. +metadata: + unit: currency-USD + label: DC AGI addition self-employment loss threshold + reference: + - title: Code of the District of Columbia § 47–1803.02. Gross income — Items included and excluded; "adjusted gross income" defined. + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1803.02 + - title: 2021 DC Form D-40 Booklet, Calculation A, Line 6 + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=63 + - title: 2022 DC Form D-40 Booklet, Calculation A, Line 6 + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=55 +values: + 2021-01-01: 12_000 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/additions/sources.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/additions/sources.yaml new file mode 100644 index 000000000..f05464512 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/additions/sources.yaml @@ -0,0 +1,14 @@ +description: DC adds these items to US AGI when computing DC AGI. +metadata: + unit: variable + label: DC additions to US adjusted gross income + reference: + - title: Code of the District of Columbia § 47–1803.02. Gross income — Items included and excluded; "adjusted gross income" defined. + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1803.02 + - title: 2021 Form D40 Booklet, Schedule I + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=63 + - title: 2022 Form D40 Booklet, Schedule I + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=55 +values: + 2021-01-01: + - dc_self_employment_loss_addition diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/cdcc/match.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/cdcc/match.yaml new file mode 100644 index 000000000..d217d69db --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/cdcc/match.yaml @@ -0,0 +1,12 @@ +description: DC matches this share of the federal child/dependent care credit. +metadata: + unit: /1 + label: DC CDCC match rate + period: year + reference: + - title: 2021 DC Form D-40 Booklet, Page 36, Line 2 + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36 + - title: 2022 DC Form D-40 Booklet, Page 34, Line 2 + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34 +values: + 2021-01-01: 0.32 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/README.md index ee5ac73c1..4808d739a 100644 --- a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/README.md +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/README.md @@ -1 +1 @@ -# EITC +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/with_children/match.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/with_children/match.yaml index 69e5911dd..2fd424a21 100644 --- a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/with_children/match.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/with_children/match.yaml @@ -1,12 +1,13 @@ -description: DC matches this percentage of the federal earned income tax credit for filers with qualifying children. -values: - 2015-01-01: 0.4 # (f)(1)(A) and (f)(1)(B) - 2022-01-01: 0.7 # (f)(1)(B-1) - 2025-01-01: 0.85 # (f)(1)(B-2) - 2026-01-01: 1 # (f)(1)(B-3) -metadata: - unit: /1 - label: DC EITC match for filers with qualifying children - reference: - - title: Code of the District of Columbia § 47–1806.04 (f)(1) - href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04#(f)(1) +description: DC matches this percentage of the federal earned income tax credit for filers with qualifying children. +metadata: + unit: /1 + label: DC EITC match for filers with qualifying children + period: year + reference: + - title: Code of the District of Columbia § 47–1806.04 (f)(1) + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04#(f)(1) +values: + 2015-01-01: 0.4 # (f)(1)(A) and (f)(1)(B) + 2022-01-01: 0.7 # (f)(1)(B-1) + 2025-01-01: 0.85 # (f)(1)(B-2) + 2026-01-01: 1 # (f)(1)(B-3) diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/match.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/match.yaml deleted file mode 100644 index 0890d2876..000000000 --- a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/match.yaml +++ /dev/null @@ -1,9 +0,0 @@ -description: DC matches this percentage of the federal earned income tax credit for filers without qualifying children. -values: - 2015-01-01: 1 -metadata: - unit: /1 - label: DC EITC match for filers without qualifying children - reference: - - title: Code of the District of Columbia § 47–1806.04 (f)(1)(C)(i) - href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04#(f)(1)(C)(i) diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/phase_out/rate.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/phase_out/rate.yaml index 036c6eb34..6fbe8d274 100644 --- a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/phase_out/rate.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/phase_out/rate.yaml @@ -1,9 +1,10 @@ -description: DC phases out its EITC for filers without qualifying children at this rate for income above the threshold. -values: - 2015-01-01: 0.0848 -metadata: - unit: /1 - label: DC EITC phase-out rate for filers without qualifying children - reference: - - title: Code of the District of Columbia § 47–1806.04 (f)(1)(C)(ii) # $17,235 increased annually by cost of living adjustment - href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04#(f)(1)(C)(ii) +description: DC phases out its EITC for filers without qualifying children at this rate for income above the threshold. +metadata: + unit: /1 + label: DC EITC phase-out rate for filers without qualifying children + period: year + reference: + - title: Code of the District of Columbia § 47–1806.04 (f)(1)(C)(ii) # $17,235 increased annually by cost of living adjustment + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04#(f)(1)(C)(ii) +values: + 2015-01-01: 0.0848 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/phase_out/start.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/phase_out/start.yaml index 0f41919e3..a94761518 100644 --- a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/phase_out/start.yaml +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/eitc/without_children/phase_out/start.yaml @@ -1,11 +1,15 @@ -description: DC phases out its EITC for filers without qualifying children for income above this threshold. -values: - 2022-01-01: 20_532 -metadata: - unit: currency-USD - label: DC EITC phase-out threshold for filers without qualifying children - reference: - - title: Code of the District of Columbia § 47–1806.04 (f)(1)(C)(ii) - href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04#(f)(1)(C)(ii) - - title: District of Columbia (DC) Individual Income Tax Forms and Instructions # Page 23, Line 5 - href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf +description: DC phases out its EITC for filers without qualifying children for income above this threshold. +metadata: + unit: currency-USD + label: DC EITC phase-out threshold for filers without qualifying children + period: year + reference: + - title: Code of the District of Columbia § 47–1806.04 (f)(1)(C)(ii) + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04#(f)(1)(C)(ii) + - title: 2021 DC Form D-40 Booklet, Page 24, Line 5 + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=24 + - title: 2022 DC Form D-40 Booklet, Page 23, Line 5 + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=23 +values: + 2021-01-01: 19_743 + 2022-01-01: 20_532 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/README.md b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/README.md new file mode 100644 index 000000000..177962ac9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/README.md @@ -0,0 +1 @@ +# Keep Child Care Affordable Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/income_limit.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/income_limit.yaml new file mode 100644 index 000000000..ba51408e8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/income_limit.yaml @@ -0,0 +1,46 @@ +description: DC limits the keep child care affordable tax credit to those whose DC taxable income does not exceed this limit. +metadata: + unit: year + label: DC KCCATC DC taxable income limit + breakdown: + - filing_status + period: year + reference: + - title: Code of the District of Columbia § 47–1806.15(d)(5) + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.15#(d)(5) + - title: 2020 DC Schedule ELC + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2020_Schedule_ELC.pdf#page=2 + - title: 2021 DC Form D-40 Booklet, Schedule ELC + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=68 + - title: 2022 DC Form D-40 Booklet, Schedule ELC + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=60 + +SINGLE: + 2018-01-01: 750_000 # (A) + 2019-01-01: 150_000 # (B) + 2021-01-01: 153_400 + 2022-01-01: 157_200 +JOINT: + 2018-01-01: 750_000 # (A) + 2019-01-01: 150_000 # (B) + 2020-01-01: 151_900 + 2021-01-01: 153_400 + 2022-01-01: 157_200 +SEPARATE: + 2018-01-01: 375_000 # (A) + 2019-01-01: 75_000 # (B) + 2020-01-01: 151_900 + 2021-01-01: 76_700 + 2022-01-01: 78_600 +HEAD_OF_HOUSEHOLD: + 2018-01-01: 750_000 # (A) + 2019-01-01: 150_000 # (B) + 2020-01-01: 151_900 + 2021-01-01: 153_400 + 2022-01-01: 157_200 +WIDOW: + 2018-01-01: 750_000 # (A) + 2019-01-01: 150_000 # (B) + 2020-01-01: 151_900 + 2021-01-01: 153_400 + 2022-01-01: 157_200 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/max_age.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/max_age.yaml new file mode 100644 index 000000000..98cb60a8b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/max_age.yaml @@ -0,0 +1,14 @@ +description: DC keep child care affordable tax credit is for children this age or less. +metadata: + unit: year + label: DC KCCATC maximum child age + period: year + reference: + - title: Code of the District of Columbia § 47–1806.15(a)(3) + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.15#(a)(3) + - title: 2021 DC Form D-40 Booklet, Schedule ELC + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=67 + - title: 2022 DC Form D-40 Booklet, Schedule ELC + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=59 +values: + 2018-01-01: 3 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/max_amount.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/max_amount.yaml new file mode 100644 index 000000000..491cc763f --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/kccatc/max_amount.yaml @@ -0,0 +1,19 @@ +description: DC keep child care affordable tax credit is limited to this maximum amount per eligible child. +metadata: + unit: currency-USD + label: DC KCCATC maximum amount per eligible child + period: year + reference: + - title: Code of the District of Columbia § 47–1806.15(b)(2)(B) + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.15#(b)(2)(B) + - title: 2020 DC Schedule ELC + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2020_Schedule_ELC.pdf#page=1 + - title: 2021 DC Form D-40 Booklet, Schedule ELC + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=67 + - title: 2022 DC Form D-40 Booklet, Schedule ELC + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=59 +values: + 2018-01-01: 1_000 + 2020-01-01: 1_010 + 2021-01-01: 1_020 + 2022-01-01: 1_045 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..4fcedabf4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/non_refundable.yaml @@ -0,0 +1,12 @@ +description: DC income tax has these non-refundable credits. +metadata: + unit: variable + label: DC non-refundable credits + reference: + - title: 2021 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36 + - title: 2022 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34 +values: + 2021-01-01: + - dc_cdcc # DC child/dependent care expense credit diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/README.md b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/README.md new file mode 100644 index 000000000..3147fbfaf --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/README.md @@ -0,0 +1 @@ +# Property Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/fraction_elderly.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/fraction_elderly.yaml new file mode 100644 index 000000000..92f5f4e8d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/fraction_elderly.yaml @@ -0,0 +1,21 @@ +description: DC property tax credit offset is this AGI-specific fraction of US AGI for elderly. +metadata: + type: single_amount + threshold_period: year + threshold_unit: currency-USD # federal AGI + amount_unit: /1 + reference: + - title: 2021 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=49 + - title: 2022 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=47 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 0.03 + - threshold: + 2021-01-01: 76_700 + 2022-01-01: 78_600 + amount: + 2021-01-01: .inf # infinite offset implies ineligible for credit diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/fraction_nonelderly.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/fraction_nonelderly.yaml new file mode 100644 index 000000000..01776356b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/fraction_nonelderly.yaml @@ -0,0 +1,29 @@ +description: DC property tax credit offset is this AGI-specific fraction of US AGI for non-elderly. +metadata: + type: single_amount + threshold_period: year + threshold_unit: currency-USD # federal AGI + amount_unit: /1 + reference: + - title: 2021 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=49 + - title: 2022 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=47 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 0.03 + - threshold: + 2021-01-01: 25_000 + amount: + 2021-01-01: 0.04 + - threshold: + 2021-01-01: 52_000 + amount: + 2021-01-01: 0.05 + - threshold: + 2021-01-01: 56_200 + 2022-01-01: 57_600 + amount: + 2021-01-01: .inf # infinite offset implies ineligible for credit diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/max.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/max.yaml new file mode 100644 index 000000000..d01c9da01 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/max.yaml @@ -0,0 +1,13 @@ +description: DC property tax credit is limited to this maximum amount. +metadata: + unit: currency-USD + label: DC property tax credit maximum amount + period: year + reference: + - title: 2021 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=49 + - title: 2022 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=47 +values: + 2021-01-01: 1_225 + 2022-01-01: 1_250 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/min_elderly_age.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/min_elderly_age.yaml new file mode 100644 index 000000000..3f67d2af6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/min_elderly_age.yaml @@ -0,0 +1,12 @@ +description: DC property tax credit has a different credit rate for those this age or older. +metadata: + unit: year + label: DC property tax minimum elderly age + period: year + reference: + - title: 2021 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=49 + - title: 2022 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=47 +values: + 2021-01-01: 70 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/rent_ratio.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/rent_ratio.yaml new file mode 100644 index 000000000..2c75ba5f6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/ptc/rent_ratio.yaml @@ -0,0 +1,12 @@ +description: DC property tax credit assumes property taxes are this ratio to rent. +metadata: + unit: /1 + label: DC property tax credit property tax to rent ratio + period: year + reference: + - title: 2021 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=49 + - title: 2022 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=47 +values: + 2021-01-01: 0.2 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..895247a9c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/credits/refundable.yaml @@ -0,0 +1,14 @@ +description: DC income tax has these refundable credits. +metadata: + unit: variable + label: DC refundable credits + reference: + - title: 2021 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36 + - title: 2022 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34 +values: + 2021-01-01: + - dc_eitc # DC earned income tax credit + - dc_ptc # DC property tax credit + - dc_kccatc # DC keep child care affordable tax credit diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/itemized/phase_out/rate.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/itemized/phase_out/rate.yaml new file mode 100644 index 000000000..f03c715f6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/itemized/phase_out/rate.yaml @@ -0,0 +1,11 @@ +description: DC phases out some itemized deductions at this rate on DC AGI above a threshold. +metadata: + unit: /1 + label: DC itemized deduction phase-out rate + reference: + - title: 2021 DC Form D-40 Booklet, Calculation F + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=18 + - title: 2022 DC Form D-40 Booklet, Calculation F + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=17 +values: + 2021-01-01: 0.05 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/itemized/phase_out/start.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/itemized/phase_out/start.yaml new file mode 100644 index 000000000..2b3676fc5 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/itemized/phase_out/start.yaml @@ -0,0 +1,22 @@ +description: DC phases out some itemized deductions over this DC AGI threshold. +metadata: + unit: currency-USD + label: DC itemized deduction phase-out DC AGI start + breakdown: + - filing_status + reference: + - title: 2021 DC Form D-40 Booklet, Calculation F + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=18 + - title: 2022 DC Form D-40 Booklet, Calculation F + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=17 + +SINGLE: + 2021-01-01: 200_000 +JOINT: + 2021-01-01: 200_000 +SEPARATE: + 2021-01-01: 100_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 200_000 +WIDOW: + 2021-01-01: 200_000 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/standard/amount.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/standard/amount.yaml deleted file mode 100644 index 76a4976dd..000000000 --- a/fiscalsim_us/parameters/gov/states/dc/tax/income/deductions/standard/amount.yaml +++ /dev/null @@ -1,23 +0,0 @@ -description: DC provides filers a standard deduction of this amount, depending on filing status. -metadata: - label: DC standard deduction - period: year - unit: currency-USD - breakdown: - - filing_status - reference: - - title: Code of the District of Columbia § 47–1801.04(44) - href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1801.04#(44) - - title: District of Columbia (DC) Individual Income Tax Forms and Instructions - href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=11 - -JOINT: - 2022-01-01: 25_900 -HEAD_OF_HOUSEHOLD: - 2022-01-01: 19_400 -WIDOW: - 2022-01-01: 25_900 -SINGLE: - 2022-01-01: 12_950 -SEPARATE: - 2022-01-01: 12_950 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/joint_separately_option.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/joint_separately_option.yaml new file mode 100644 index 000000000..224bd806e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/joint_separately_option.yaml @@ -0,0 +1,11 @@ +description: DC offers taxpayers who file married joint on federal return the option to file separately on DC return if this parameter is true. +metadata: + unit: bool + label: Whether DC offers filing separate option to married-joint taxpayers + reference: + - title: 2021 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=44 + - title: 2022 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=44 +values: + 2021-01-01: true diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/rates.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/rates.yaml new file mode 100644 index 000000000..46d6664c3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/rates.yaml @@ -0,0 +1,46 @@ +description: DC uses these income tax brackets and rates for all filing units. +metadata: + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD # non-negative DC taxable income + rate_unit: /1 + reference: + - title: 2021 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=19 + - title: 2022 Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=17 +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.04 + - threshold: + 2021-01-01: 10_000 + rate: + 2021-01-01: 0.06 + - threshold: + 2021-01-01: 40_000 + rate: + 2021-01-01: 0.065 + - threshold: + 2021-01-01: 60_000 + rate: + 2021-01-01: 0.085 + - threshold: + 2021-01-01: 350_000 + 2022-01-01: 250_000 + rate: + 2021-01-01: 0.0875 + 2022-01-01: 0.0925 + - threshold: + 2021-01-01: 1_000_000 + 2022-01-01: 500_000 + rate: + 2021-01-01: 0.0895 + 2022-01-01: 0.0975 + - threshold: + 2021-01-01: .inf + 2022-01-01: 1_000_000 + rate: + 2021-01-01: 0 + 2022-01-01: 0.1075 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/disabled_exclusion/amount.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/disabled_exclusion/amount.yaml new file mode 100644 index 000000000..f87e54b07 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/disabled_exclusion/amount.yaml @@ -0,0 +1,15 @@ +description: DC allows an AGI subtraction of this amount for disabled persons who meet certain eligibility requirements. +metadata: + unit: currency-USD + label: DC disabled exclusion amount + reference: + - title: Code of the District of Columbia § 47–1803.02. Gross income — Items included and excluded; "adjusted gross income" defined. + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1803.02 + - title: Code of the District of Columbia § 47–1806.04 (f)(1)(C)(ii) + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04#(f)(1)(C)(ii) + - title: 2021 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=64 + - title: 2022 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=56 +values: + 2021-01-01: 10_000 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/disabled_exclusion/income_limit.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/disabled_exclusion/income_limit.yaml new file mode 100644 index 000000000..90c0c13e7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/disabled_exclusion/income_limit.yaml @@ -0,0 +1,13 @@ +description: DC allows an AGI subtraction for disabled persons who meet certain eligibility requirements and have household income below this limit. +metadata: + unit: currency-USD + label: DC disabled exclusion income limit + reference: + - title: Code of the District of Columbia § 47–1803.02. Gross income — Items included and excluded; "adjusted gross income" defined. + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1803.02 + - title: 2021 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=64 + - title: 2022 DC Form D-40 Booklet + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=56 +values: + 2021-01-01: 100_000 diff --git a/fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/sources.yaml b/fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/sources.yaml new file mode 100644 index 000000000..7e893d335 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/dc/tax/income/subtractions/sources.yaml @@ -0,0 +1,16 @@ +description: DC subtracts these items from US AGI when computing DC AGI. +metadata: + unit: variable + label: DC subtractions from US adjusted gross income + reference: + - title: Code of the District of Columbia § 47–1803.02. Gross income — Items included and excluded; "adjusted gross income" defined. + href: https://code.dccouncil.gov/us/dc/council/code/sections/47-1803.02 + - title: 2021 Form D40 Booklet, Form D-40 (page 36) and Schedule I (page 63) + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36 + - title: 2022 Form D40 Booklet, Form D-40 (page 34) and Schedule I (page 55) + href: https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34 +values: + 2021-01-01: + - taxable_social_security + - taxable_unemployment_compensation + - dc_disabled_exclusion_subtraction diff --git a/fiscalsim_us/parameters/gov/states/de/README.md b/fiscalsim_us/parameters/gov/states/de/README.md new file mode 100644 index 000000000..2ce21c386 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/README.md @@ -0,0 +1 @@ +# Delaware diff --git a/fiscalsim_us/parameters/gov/states/de/index.yaml b/fiscalsim_us/parameters/gov/states/de/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/credits/cdcc/match.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/cdcc/match.yaml new file mode 100644 index 000000000..1ae18ffa6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/cdcc/match.yaml @@ -0,0 +1,10 @@ +description: Delaware matches up to this share of the federal Child and Dependent Care Credit. +values: + 2023-01-01: 0.5 +metadata: + reference: + - title: "Del. Code tit. 30 § 1114" + href: https://casetext.com/statute/delaware-code/title-30-state-taxes/part-ii-income-inheritance-and-estate-taxes/chapter-11-personal-income-tax/subchapter-ii-resident-individuals/section-1114-child-care-and-dependent-care-expense-credit + unit: /1 + period: year + label: Delaware federal CDCC match diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/non_refundable.yaml new file mode 100644 index 000000000..b531148d7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/non_refundable.yaml @@ -0,0 +1,11 @@ +description: Delaware matches this percent of the federal Earned Income Tax Credit as a non-refundable credit. +values: + 2022-01-01: 0.2 +metadata: + unit: /1 + label: Delaware non-refundable EITC match + reference: + - title: PIT-RES_TY22_2022-02_Instructions.pdf + href: https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf + - title: The Delaware Code Online - Title 30 - Chapter 11 - Subchapter II - § 1111 + href: https://delcode.delaware.gov/title30/c011/sc02/index.html diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/refundable.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/refundable.yaml new file mode 100644 index 000000000..4be64599e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/eitc/refundable.yaml @@ -0,0 +1,11 @@ +description: Delaware matches this percent of the federal Earned Income Tax Credit as a refundable credit. +values: + 2020-01-01: 0.045 +metadata: + unit: /1 + label: Delaware refundable EITC match + reference: + - title: PIT-RES_TY22_2022-02_Instructions.pdf + href: https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf + - title: The Delaware Code Online - Title 30 - Chapter 11 - Subchapter II - § 1111 + href: https://delcode.delaware.gov/title30/c011/sc02/index.html diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..3584e2bee --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/non_refundable.yaml @@ -0,0 +1,8 @@ +description: Delaware non-refundable tax credits. +values: + 2019-01-01: + - de_cdcc + - de_non_refundable_eitc +metadata: + unit: list + label: Delaware non-refundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/credits/personal_credits/aged.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/personal_credits/aged.yaml new file mode 100644 index 000000000..10633d6fb --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/personal_credits/aged.yaml @@ -0,0 +1,24 @@ +description: Delaware provides this aged additional personal credit amount to the head and spouse of a filing unit based on their age. +metadata: + type: single_amount + unit: year + threshold_unit: currency-USD + amount_unit: year + period: year + label: Delaware additional aged personal credits age eligibility + reference: + - title: PIT-RES_TY22_2022-02_Instruction Page 8 Line 26b. + href: https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf#page=8 + - title: PIT-RES_TY22_2021-02_Instruction Page 8 Line 26b. + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=8 + - title: Delaware Code Online Chapter 11 § 1110(b)(2) + href: https://delcode.delaware.gov/title30/c011/sc02/index.html#1110 +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 0 + - threshold: + 2021-01-01: 60 + amount: + 2021-01-01: 110 diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/credits/personal_credits/personal.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/personal_credits/personal.yaml new file mode 100644 index 000000000..206365157 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/personal_credits/personal.yaml @@ -0,0 +1,14 @@ +description: Delaware provides this personal credit amount. +values: + 1996-01-01: 110 +metadata: + reference: + - title: Delaware individual income tax instructions for 2021 line 26a + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-02_Instructions.pdf#page=2 + - title: Delaware individual income tax instructions for 2022 line 26a + href: https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf#page=8 + - title: The Delaware Code Online - Title 30 - Chapter 11 - Subchapter II - Personal Credits - § 1110(b)(1) + href: https://delcode.delaware.gov/title30/c011/sc02/index.html#1110 + label: Delaware personal credits amount + unit: currency-USD + period: year diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..f7af68704 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/credits/refundable.yaml @@ -0,0 +1,7 @@ +description: Delaware refundable tax credits. +values: + 2019-01-01: + - de_refundable_eitc +metadata: + unit: list + label: Delaware refundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/additional/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/additional/age_threshold.yaml new file mode 100644 index 000000000..f77061b82 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/additional/age_threshold.yaml @@ -0,0 +1,14 @@ +description: Delaware provides the aged deduction amount to filers at or above this age. +values: + 2021-01-01: 65 +metadata: + unit: year + period: year + label: Delaware additional aged deduction age eligibility + reference: + - title: PIT-RES_TY22_2022-02_Instruction Page 8 Line 20. + href: https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf#page=8 + - title: PIT-RES_TY22_2021-02_Instruction Page 8 Line 20. + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=8 + - title: Delaware Code Online Chapter § 1108(b)(2) + href: https://delcode.delaware.gov/title30/c011/sc02/index.html#1108 diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/additional/amount.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/additional/amount.yaml new file mode 100644 index 000000000..57c0ede2b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/additional/amount.yaml @@ -0,0 +1,14 @@ +description: Delaware provides this deduction amount for aged or blind filers. +values: + 2021-01-01: 2_500 +metadata: + unit: currency-USD + period: year + label: Delaware aged deduction amount + reference: + - title: PIT-RES_TY22_2022-02_Instruction Page 8 Line 20. + href: https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf#page=8 + - title: PIT-RES_TY22_2021-02_Instruction Page 8 Line 20. + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=8 + - title: Delaware Code Online Chapter § 1108(b) + href: https://delcode.delaware.gov/title30/c011/sc02/index.html#1108 diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/amount.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/amount.yaml new file mode 100644 index 000000000..a20c8b57c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/deductions/standard/amount.yaml @@ -0,0 +1,22 @@ +description: Delaware provides this standard deduction based on filing status. +metadata: + reference: + - title: Delaware individual income tax instructions for 2022 + href: https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf#page=7 + - title: The Delaware Code - Title 30 - Chapter 11 - Subchapter II - § 1109 - (a) - (3) + href: https://delcode.delaware.gov/title30/c011/sc02/index.html + label: Delaware Standard Deduction + unit: currency-USD + period: year + breakdown: + - filing_status +JOINT: + 2000-01-01: 6_500 +SINGLE: + 2000-01-01: 3_250 +SEPARATE: + 2000-01-01: 3_250 +HEAD_OF_HOUSEHOLD: + 2000-01-01: 3_250 +WIDOW: + 2000-01-01: 3_250 diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/rate.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/rate.yaml index c45f5134a..61e27a7b0 100644 --- a/fiscalsim_us/parameters/gov/states/de/tax/income/rate.yaml +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/rate.yaml @@ -11,30 +11,40 @@ metadata: href: https://delcode.delaware.gov/title30/c011/sc01/index.html brackets: - threshold: - 2014-01-01: 0 + 1996-01-01: 0 rate: - 2014-01-01: 0 + 1996-01-01: 0 - threshold: - 2014-01-01: 2_000 + 1996-01-01: 2_000 rate: + 1996-01-01: 0.031 + 1999-01-01: 0.026 2014-01-01: 0.022 - threshold: - 2014-01-01: 5_000 + 1996-01-01: 5_000 rate: + 1996-01-01: 0.0485 2014-01-01: 0.039 - threshold: - 2014-01-01: 10_000 + 1996-01-01: 10_000 rate: + 1996-01-01: 0.058 + 1999-01-01: 0.043 2014-01-01: 0.048 - threshold: - 2014-01-01: 20_000 + 1996-01-01: 20_000 rate: + 1996-01-01: 0.0615 + 1999-01-01: 0.052 2014-01-01: 0.052 - threshold: - 2014-01-01: 25_000 + 1996-01-01: 25_000 rate: + 1996-01-01: 0.0645 2014-01-01: 0.0555 - threshold: + 1996-01-01: 30_000 2014-01-01: 60_000 rate: + 1996-01-01: 0.069 2014-01-01: 0.066 diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/amount.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/amount.yaml new file mode 100644 index 000000000..21b9e9380 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/amount.yaml @@ -0,0 +1,24 @@ +description: Delaware provides this income exclusion to elderly and disabled filers, based on filing status. +JOINT: + 2021-01-01: 4_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 2_000 +WIDOW: + 2021-01-01: 2_000 +SINGLE: + 2021-01-01: 2_000 +SEPARATE: + 2021-01-01: 2_000 +metadata: + reference: + - title: "PIT-RES_TY21_2021-02_Instruction Line 11" + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=7 + - title: "PIT-RES_TY22_2022-02_Instruction Line 11" + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=7 + - title: Delaware State Taxes, Part II, Chapter 11, Subchapter 2, § 1106. Modifications,(b), (2) + href: https://delcode.delaware.gov/title30/c011/sc02/index.html#1106 + period: year + unit: currency-USD + breakdown: + - filing_status + label: Delaware aged or disabled exclusion amount diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/age_threshold.yaml new file mode 100644 index 000000000..e671a560b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/age_threshold.yaml @@ -0,0 +1,13 @@ +description: Delaware qualifies filers above his age threshold to receive the aged or disabled exclusion. +values: + 2021-01-01: 60 +metadata: + reference: + - title: "Delaware individual income tax instructions for 2022 Page 7 Line 11" + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=7 + - title: "Delaware individual income tax instructions for 2021 Page 7 Line 11" + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=7 + - title: Delaware State Taxes, Part II, Chapter 11, Subchapter 2, § 1106. Modifications,(b), (2) + href: https://delcode.delaware.gov/title30/c011/sc02/index.html#1106 + unit: year + label: Delaware aged or disabled exclusion age threshold diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/agi_limit.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/agi_limit.yaml new file mode 100644 index 000000000..d25b24091 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/agi_limit.yaml @@ -0,0 +1,23 @@ +description: Delaware limits its elderly and disabled exclusion to filers with adjusted gross income below this amount, based on filing status. +JOINT: + 2021-01-01: 20_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 10_000 +WIDOW: + 2021-01-01: 10_000 +SINGLE: + 2021-01-01: 10_000 +SEPARATE: + 2021-01-01: 10_000 +metadata: + reference: + - title: "Delaware individual income tax instructions for 2022 Page 7 Line 11" + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=7 + - title: "Delaware individual income tax instructions for 2021 Page 7 Line 11" + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=7 + - title: Delaware State Taxes, Part II, Chapter 11, Subchapter 2, § 1106. Modifications,(b), (2) + href: https://delcode.delaware.gov/title30/c011/sc02/index.html#1106 + unit: year + label: Delaware aged or disabled exclusion subtraction adjusted gross income limit + breakdown: + - filing_status diff --git a/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/earned_income_limit.yaml b/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/earned_income_limit.yaml new file mode 100644 index 000000000..1535e5d40 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/de/tax/income/subtractions/exclusions/elderly_or_disabled/eligibility/earned_income_limit.yaml @@ -0,0 +1,24 @@ +description: Delaware limits its elderly and disabled exclusion to filers with earned income below this amount, depending on filing status. +JOINT: + 2021-01-01: 5_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 2_500 +WIDOW: + 2021-01-01: 2_500 +SINGLE: + 2021-01-01: 2_500 +SEPARATE: + 2021-01-01: 2_500 +metadata: + reference: + - title: "PIT-RES_TY21_2021-02_Instruction Page 7 Line 11" + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=7 + - title: "PIT-RES_TY22_2022-02_Instruction Page 7 Line 11" + href: https://revenuefiles.delaware.gov/2021/PIT-RES_TY21_2021-01_Instructions.pdf#page=7 + - title: Delaware State Taxes, Part II, Chapter 11, Subchapter 2, § 1106. Modifications,(b), (2) + href: https://delcode.delaware.gov/title30/c011/sc02/index.html#1106 + period: year + unit: currency-USD + breakdown: + - filing_status + label: Delaware aged or disabled exclusion earned income limit diff --git a/fiscalsim_us/parameters/gov/states/ga/README.md b/fiscalsim_us/parameters/gov/states/ga/README.md new file mode 100644 index 000000000..05f0922d9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/README.md @@ -0,0 +1 @@ +# Georgia diff --git a/fiscalsim_us/parameters/gov/states/ga/index.yaml b/fiscalsim_us/parameters/gov/states/ga/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/additions/additions.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/additions/additions.yaml new file mode 100644 index 000000000..98b28562c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/additions/additions.yaml @@ -0,0 +1,15 @@ +description: Georgia adds these variables to the federal taxable income when computing the state taxable income. +values: + 2021-01-01: + - form_4972_lumpsum_distributions + +metadata: + unit: list + label: Georgia adjusted gross income additions + reference: + - title: 2022 Form 500 Instructions + href: https://apps.dor.ga.gov/FillableForms/PDFViewer/Index?form=2022GA500 + - title: 2021 Form 500 Instructions + href: https://www.zillionforms.com/2021/I2122607361.PDF + - title: 2022 Official Code of Georgia Annotated | CH7 Income Taxes | § 48-7-27 + href: https://law.justia.com/codes/georgia/2022/title-48/chapter-7/article-2/section-48-7-27/ diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/cdcc/rate.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/cdcc/rate.yaml new file mode 100644 index 000000000..88c7c8e22 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/cdcc/rate.yaml @@ -0,0 +1,12 @@ +description: Georgia matches this percentage of the federal child and dependent care credit. +values: + 2006-01-01: 0.10 + 2007-01-01: 0.20 + 2008-01-01: 0.30 +metadata: + period: year + unit: /1 + label: Georgia tax credits for qualified child and dependent care expenses + reference: + - title: Document O.C.G.A. § 48-7-29.10 + href: https://advance.lexis.com/documentpage/teaserdocument/?pdmfid=1000516&crid=849798b8-0b2c-47d0-a404-02db4136dc5b&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2fshared%2fdocument%2fstatutes-legislation%2furn%3acontentItem%3a6348-G0H1-DYB7-W3KD-00008-00&pddocid=urn%3acontentItem%3a6348-G0H1-DYB7-W3KD-00008-00&pdcontentcomponentid=234186&pdteaserkey=h1&pditab=allpods&ecomp=8s65kkk&earg=sr0&prid=975a6cc4-c661-4f86-a704-4f0844c233b9 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/low_income/amount.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/low_income/amount.yaml new file mode 100644 index 000000000..64dd0db27 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/low_income/amount.yaml @@ -0,0 +1,38 @@ +description: Georgia provides the following low income tax credit amount based on adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: Georgia low income tax credit amount + reference: + - title: 2022 Form 500 Instructions + href: https://houpl.org/wp-content/uploads/2023/01/2022-IT-511_Individual_Income_Tax_-Booklet-compressed.pdf#page=12 + - title: 2021 Form 500 Instructions + href: https://www.zillionforms.com/2021/I2122607361.PDF#page=21 + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § § 48-7A-3 (b) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=0d6fd3c6-6e65-4928-9679-0b33bed98769&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A6348-G0H1-DYB7-W3SK-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr0&pditab=allpods&ecomp=7s65kkk&earg=sr0&prid=8be67d32-0de2-4977-a057-d9d01bc94c88 +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 26 + - threshold: + 2021-01-01: 6_000 + amount: + 2021-01-01: 20 + - threshold: + 2021-01-01: 8_000 + amount: + 2021-01-01: 14 + - threshold: + 2021-01-01: 10_000 + amount: + 2021-01-01: 8 + - threshold: + 2021-01-01: 15_000 + amount: + 2021-01-01: 5 + - threshold: + 2021-01-01: 20_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/low_income/supplement_age_eligibility.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/low_income/supplement_age_eligibility.yaml new file mode 100644 index 000000000..8f7b51c52 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/credits/low_income/supplement_age_eligibility.yaml @@ -0,0 +1,13 @@ +description: Georgia provides an additional exemption under the low income credit for head and spouse at or above this age threshold. +values: + 2021-01-01: 65 +metadata: + unit: year + label: Georgia low income credit supplement age eligibility + reference: + - title: 2022 Form 500 Instructions + href: https://houpl.org/wp-content/uploads/2023/01/2022-IT-511_Individual_Income_Tax_-Booklet-compressed.pdf#page=12 + - title: 2021 Form 500 Instructions + href: https://houpl.org/wp-content/uploads/2022/01/2021_IT-511_Individual_Income_Tax_Booklet-12.29.21-Web-Version.pdf#page=13 + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § § 48-7A-3 (b) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=0d6fd3c6-6e65-4928-9679-0b33bed98769&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A6348-G0H1-DYB7-W3SK-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr0&pditab=allpods&ecomp=7s65kkk&earg=sr0&prid=8be67d32-0de2-4977-a057-d9d01bc94c88 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/age_threshold.yaml new file mode 100644 index 000000000..fbd9485fd --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/age_threshold.yaml @@ -0,0 +1,14 @@ +description: Georgia provides additional standard deduction for the taxpayer or spouse at or above the following age. +metadata: + label: Georgia additional standard deduction age threshold + period: year + unit: year + reference: + - title: 2021 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11b + href: https://dor.georgia.gov/document/booklet/2021-it-511-individual-income-tax-booklet/download + - title: 2022 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11b + href: https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet/download + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § 48-7-27 | (a)(1)(D) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=fb5db531-a80f-4790-bddb-eefc8327ef60&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65D2-CDH3-CGX8-044N-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr1&pditab=allpods&ecomp=8s65kkk&earg=sr1&prid=66f02b0a-c5ae-4162-9535-127751546807 +values: + 2021-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/amount/head.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/amount/head.yaml new file mode 100644 index 000000000..d69041eef --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/amount/head.yaml @@ -0,0 +1,14 @@ +description: Georgia provides this additional standard deduction for aged filers. +metadata: + label: Georgia additional standard deduction for aged head + period: year + unit: currency-USD + reference: + - title: 2021 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/booklet/2021-it-511-individual-income-tax-booklet/download + - title: 2022 IT-511 Individual Income Tax Booklet - - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet/download + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § 48-7-27 | (a)(1)(D) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=fb5db531-a80f-4790-bddb-eefc8327ef60&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65D2-CDH3-CGX8-044N-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr1&pditab=allpods&ecomp=8s65kkk&earg=sr1&prid=66f02b0a-c5ae-4162-9535-127751546807 +values: + 2021-01-01: 1_300 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/amount/spouse.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/amount/spouse.yaml new file mode 100644 index 000000000..0863b1384 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/aged/amount/spouse.yaml @@ -0,0 +1,14 @@ +description: Georgia provides this additional standard deduction for the aged spouse. +metadata: + label: Georgia additional standard deduction for aged spouse + period: year + unit: currency-USD + reference: + - title: 2021 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/booklet/2021-it-511-individual-income-tax-booklet/download + - title: 2022 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet/download + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § 48-7-27 | (a)(1)(D) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=fb5db531-a80f-4790-bddb-eefc8327ef60&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65D2-CDH3-CGX8-044N-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr1&pditab=allpods&ecomp=8s65kkk&earg=sr1&prid=66f02b0a-c5ae-4162-9535-127751546807 +values: + 2021-01-01: 1_300 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/amount.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/amount.yaml new file mode 100644 index 000000000..20bd3b722 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/amount.yaml @@ -0,0 +1,30 @@ +description: Georgia provides filers a standard deduction of this amount, depending on filing status. +metadata: + label: Georgia standard deduction amount + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: 2021 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/booklet/2021-it-511-individual-income-tax-booklet/download + - title: 2022 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet/download + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § 48-7-27 | (a)(1)(A)-(C) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=fb5db531-a80f-4790-bddb-eefc8327ef60&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65D2-CDH3-CGX8-044N-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr1&pditab=allpods&ecomp=8s65kkk&earg=sr1&prid=66f02b0a-c5ae-4162-9535-127751546807 + +JOINT: + 2021-01-01: 6_000 + 2022-01-01: 7_100 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 4_600 + 2022-01-01: 5_400 +SINGLE: + 2021-01-01: 4_600 + 2022-01-01: 5_400 +SEPARATE: + 2021-01-01: 3_000 + 2022-01-01: 3_550 +WIDOW: + 2021-01-01: 4_600 + 2022-01-01: 5_400 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/blind/head.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/blind/head.yaml new file mode 100644 index 000000000..740bb33be --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/blind/head.yaml @@ -0,0 +1,14 @@ +description: Georgia allows for this additional standard deduction for blind filers. +metadata: + label: Georgia additional standard deduction for blind head + period: year + unit: currency-USD + reference: + - title: 2021 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/booklet/2021-it-511-individual-income-tax-booklet/download + - title: 2022 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet/download + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § 48-7-27 | (a)(1)(E) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=fb5db531-a80f-4790-bddb-eefc8327ef60&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65D2-CDH3-CGX8-044N-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr1&pditab=allpods&ecomp=8s65kkk&earg=sr1&prid=66f02b0a-c5ae-4162-9535-127751546807 +values: + 2021-01-01: 1_300 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/blind/spouse.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/blind/spouse.yaml new file mode 100644 index 000000000..87ff39b2a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/deductions/standard/blind/spouse.yaml @@ -0,0 +1,14 @@ +description: Georgia allows for this additional standard deduction for the blind spouse. +metadata: + label: Georgia additional standard deduction for blind spouse + period: year + unit: currency-USD + reference: + - title: 2021 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/booklet/2021-it-511-individual-income-tax-booklet/download + - title: 2022 IT-511 Individual Income Tax Booklet - page 11 - FORM 500, LINE 11a + href: https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet/download + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § 48-7-27 | (a)(1)(E) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=fb5db531-a80f-4790-bddb-eefc8327ef60&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65D2-CDH3-CGX8-044N-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr1&pditab=allpods&ecomp=8s65kkk&earg=sr1&prid=66f02b0a-c5ae-4162-9535-127751546807 +values: + 2021-01-01: 1_300 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/exemptions/dependent.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/exemptions/dependent.yaml new file mode 100644 index 000000000..1b8d688ac --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/exemptions/dependent.yaml @@ -0,0 +1,14 @@ +description: Georgia issues the following exemption amount for each dependent. +values: + 2003-01-01: 3_000 +metadata: + period: year + unit: currency-USD + label: Georgia dependent exemption amount + reference: + - title: 2022 Form 500 Instructions + href: https://houpl.org/wp-content/uploads/2023/01/2022-IT-511_Individual_Income_Tax_-Booklet-compressed.pdf#page=12 + - title: 2021 Form 500 Instructions + href: https://houpl.org/wp-content/uploads/2022/01/2021_IT-511_Individual_Income_Tax_Booklet-12.29.21-Web-Version.pdf#page=13 + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § 48-7-26 (b)(3) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=5c65c45e-44b1-4c09-be93-e1cf5dc8590c&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A6348-G0H1-DYB7-W3JT-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr0&pditab=allpods&ecomp=7s65kkk&earg=sr0&prid=f512a2f2-3c2b-498a-8f4c-dd1c2ee7934f diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/exemptions/personal.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/exemptions/personal.yaml new file mode 100644 index 000000000..483ff2c1f --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/exemptions/personal.yaml @@ -0,0 +1,25 @@ +description: Georgia issues the following exemption amount depending on the filing status. +metadata: + period: year + unit: currency-USD + label: Georgia exemption amount + breakdown: + - filing_status + reference: + - title: 2022 Form 500 Instructions + href: https://houpl.org/wp-content/uploads/2023/01/2022-IT-511_Individual_Income_Tax_-Booklet-compressed.pdf#page=12 + - title: 2021 Form 500 Instructions + href: https://houpl.org/wp-content/uploads/2022/01/2021_IT-511_Individual_Income_Tax_Booklet-12.29.21-Web-Version.pdf#page=13 + - title: Official Code of Georgia Annotated | CH17 Income Taxes | O.C.G.A. § 48-7-26 (b)(1 & 2) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=5c65c45e-44b1-4c09-be93-e1cf5dc8590c&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A6348-G0H1-DYB7-W3JT-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr0&pditab=allpods&ecomp=7s65kkk&earg=sr0&prid=f512a2f2-3c2b-498a-8f4c-dd1c2ee7934f + +JOINT: + 2020-01-01: 7_400 +HEAD_OF_HOUSEHOLD: + 2020-01-01: 2_700 +SINGLE: + 2020-01-01: 2_700 +SEPARATE: + 2020-01-01: 3_700 +WIDOW: + 2020-01-01: 2_700 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/main/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/head_of_household.yaml new file mode 100644 index 000000000..42c95edbc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/head_of_household.yaml @@ -0,0 +1,35 @@ +description: Georgia taxes the personal income of head of household filers at this rate. + +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Georgia income tax rate joint filers + reference: + - title: Depertment of Revenue - Tax Tables & Georgia Tax Rate Schedule + href: https://dor.georgia.gov/tax-tables-georgia-tax-rate-schedule +brackets: + - threshold: + 2022-01-01: 0 + rate: + 2022-01-01: 0.01 + - threshold: + 2022-01-01: 1_000 + rate: + 2022-01-01: 0.02 + - threshold: + 2022-01-01: 3_000 + rate: + 2022-01-01: 0.03 + - threshold: + 2022-01-01: 5_000 + rate: + 2022-01-01: 0.04 + - threshold: + 2022-01-01: 7_000 + rate: + 2022-01-01: 0.05 + - threshold: + 2022-01-01: 10_000 + rate: + 2022-01-01: 0.0575 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/main/joint.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/joint.yaml new file mode 100644 index 000000000..61ab5c2f3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/joint.yaml @@ -0,0 +1,35 @@ +description: Georgia taxes the personal income of joint filers at this rate. + +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Georgia income tax rate joint filers + reference: + - title: Depertment of Revenue - Tax Tables & Georgia Tax Rate Schedule + href: https://dor.georgia.gov/tax-tables-georgia-tax-rate-schedule +brackets: + - threshold: + 2022-01-01: 0 + rate: + 2022-01-01: 0.01 + - threshold: + 2022-01-01: 1_000 + rate: + 2022-01-01: 0.02 + - threshold: + 2022-01-01: 3_000 + rate: + 2022-01-01: 0.03 + - threshold: + 2022-01-01: 5_000 + rate: + 2022-01-01: 0.04 + - threshold: + 2022-01-01: 7_000 + rate: + 2022-01-01: 0.05 + - threshold: + 2022-01-01: 10_000 + rate: + 2022-01-01: 0.0575 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/main/separate.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/separate.yaml new file mode 100644 index 000000000..e36572062 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/separate.yaml @@ -0,0 +1,34 @@ +description: Georgia taxes the personal income of married couples filing separate at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Georgia income tax rate separate filers + reference: + - title: Depertment of Revenue - Tax Tables & Georgia Tax Rate Schedule + href: https://dor.georgia.gov/tax-tables-georgia-tax-rate-schedule +brackets: + - threshold: + 2022-01-01: 0 + rate: + 2022-01-01: 0.01 + - threshold: + 2022-01-01: 500 + rate: + 2022-01-01: 0.02 + - threshold: + 2022-01-01: 1_500 + rate: + 2022-01-01: 0.03 + - threshold: + 2022-01-01: 2_500 + rate: + 2022-01-01: 0.04 + - threshold: + 2022-01-01: 3_500 + rate: + 2022-01-01: 0.05 + - threshold: + 2022-01-01: 5_000 + rate: + 2022-01-01: 0.0575 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/main/single.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/single.yaml new file mode 100644 index 000000000..6d9b2c0e7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/single.yaml @@ -0,0 +1,34 @@ +description: Georgia taxes the personal income of single filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Georgia income tax rate single filers + reference: + - title: Depertment of Revenue - Tax Tables & Georgia Tax Rate Schedule + href: https://dor.georgia.gov/tax-tables-georgia-tax-rate-schedule +brackets: + - threshold: + 2022-01-01: 0 + rate: + 2022-01-01: 0.01 + - threshold: + 2022-01-01: 750 + rate: + 2022-01-01: 0.02 + - threshold: + 2022-01-01: 2_250 + rate: + 2022-01-01: 0.03 + - threshold: + 2022-01-01: 3_750 + rate: + 2022-01-01: 0.04 + - threshold: + 2022-01-01: 5_250 + rate: + 2022-01-01: 0.05 + - threshold: + 2022-01-01: 7_000 + rate: + 2022-01-01: 0.0575 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/main/widow.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/widow.yaml new file mode 100644 index 000000000..4a7d75355 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/main/widow.yaml @@ -0,0 +1,35 @@ +description: Georgia taxes the personal income of widow filers at this rate. + +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Georgia income tax rate joint filers + reference: + - title: Depertment of Revenue - Tax Tables & Georgia Tax Rate Schedule + href: https://dor.georgia.gov/tax-tables-georgia-tax-rate-schedule +brackets: + - threshold: + 2022-01-01: 0 + rate: + 2022-01-01: 0.01 + - threshold: + 2022-01-01: 1_000 + rate: + 2022-01-01: 0.02 + - threshold: + 2022-01-01: 3_000 + rate: + 2022-01-01: 0.03 + - threshold: + 2022-01-01: 5_000 + rate: + 2022-01-01: 0.04 + - threshold: + 2022-01-01: 7_000 + rate: + 2022-01-01: 0.05 + - threshold: + 2022-01-01: 10_000 + rate: + 2022-01-01: 0.0575 diff --git a/fiscalsim_us/parameters/gov/states/ga/tax/income/subtractions/subtractions.yaml b/fiscalsim_us/parameters/gov/states/ga/tax/income/subtractions/subtractions.yaml new file mode 100644 index 000000000..b9334c128 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ga/tax/income/subtractions/subtractions.yaml @@ -0,0 +1,20 @@ +description: Colorado counts these sources as subtractions. +values: + 2021-01-01: + - us_govt_interest + - ga_retirement_exclusion + - ga_military_retirement_exclusion + - taxable_social_security + - ga_investment_in_529_plan_deduction + + +metadata: + unit: list + label: Georgia adjusted gross income subtractions + reference: + - title: 2022 Form 500 Instructions + href: https://apps.dor.ga.gov/FillableForms/PDFViewer/Index?form=2022GA500 + - title: 2021 Form 500 Instructions + href: https://www.zillionforms.com/2021/I2122607361.PDF + - title: 2022 Official Code of Georgia Annotated | CH7 Income Taxes | § 48-7-27 + href: https://law.justia.com/codes/georgia/2022/title-48/chapter-7/article-2/section-48-7-27/ diff --git a/fiscalsim_us/parameters/gov/states/hi/index.yaml b/fiscalsim_us/parameters/gov/states/hi/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/eitc/match.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/eitc/match.yaml new file mode 100644 index 000000000..7d8271a72 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/eitc/match.yaml @@ -0,0 +1,11 @@ +description: Hawaii matches this percent of the federal EITC. +values: + 2017-01-01: 0.2 +metadata: + unit: /1 + label: Hawaii EITC match rate + reference: + - title: Hawaii Income Tax Law, Chapter 235, Section 235-55.675 + href: https://www.capitol.hawaii.gov/hrscurrent/Vol04_Ch0201-0257/HRS0235/HRS_0235-0055_0075.htm + - title: Hawaii Tax Form N-365 + href: https://files.hawaii.gov/tax/forms/2022/n356_i.pdf diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/head_of_household.yaml new file mode 100644 index 000000000..fac3cf25e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/head_of_household.yaml @@ -0,0 +1,46 @@ +description: Hawaii provides this amount under the food excise tax credit for head-of-household filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: Hawaii Food/Excise Tax Credit head of household amount + reference: + - title: Hawaii Income Tax Law, Chapter 235, Section 235-55.85, (b) + href: https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=44 + - title: Hawaii Tax Form N-311 2022 + href: https://files.hawaii.gov/tax/forms/2022/n311_i.pdf#page=1 + - title: Hawaii Tax Form N-311 2021 page 1 + href: https://www.dochub.com/jsfiller-desk14/?mode=cors&lang=en&ref=https://www.dochub.com&projectId=1317406362&loader=tips&MEDIUM_PDFJS=true&PAGE_REARRANGE_V2_MVP=true&isPageRearrangeV2MVP=true&jsf-page-rearrange-v2=true&jsf-new-header=false#ede2dc134a0b435eb2449575bffabfdb +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 110 + - threshold: + 2021-01-01: 5_000 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 10_000 + amount: + 2021-01-01: 85 + - threshold: + 2021-01-01: 15_000 + amount: + 2021-01-01: 70 + - threshold: + 2021-01-01: 20_000 + amount: + 2021-01-01: 55 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 45 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 35 + - threshold: + 2021-01-01: 50_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/joint.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/joint.yaml new file mode 100644 index 000000000..68762eb79 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/joint.yaml @@ -0,0 +1,46 @@ +description: Hawaii provides this amount under the Food/Excise Tax Credit for joint filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: Hawaii Food/Excise Tax Credit joint amount + reference: + - title: Hawaii Income Tax Law, Chapter 235, Section 235-55.85, (b) + href: https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=44 + - title: Hawaii Tax Form N-311 2022 + href: https://files.hawaii.gov/tax/forms/2022/n311_i.pdf#page=1 + - title: Hawaii Tax Form N-311 2021 page 1 + href: https://www.dochub.com/jsfiller-desk14/?mode=cors&lang=en&ref=https://www.dochub.com&projectId=1317406362&loader=tips&MEDIUM_PDFJS=true&PAGE_REARRANGE_V2_MVP=true&isPageRearrangeV2MVP=true&jsf-page-rearrange-v2=true&jsf-new-header=false#ede2dc134a0b435eb2449575bffabfdb +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 110 + - threshold: + 2021-01-01: 5_000 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 10_000 + amount: + 2021-01-01: 85 + - threshold: + 2021-01-01: 15_000 + amount: + 2021-01-01: 70 + - threshold: + 2021-01-01: 20_000 + amount: + 2021-01-01: 55 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 45 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 35 + - threshold: + 2021-01-01: 50_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/separate.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/separate.yaml new file mode 100644 index 000000000..39c6c74ff --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/separate.yaml @@ -0,0 +1,46 @@ +description: Hawaii provides this amount under the food excise tax credit for separate filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: Hawaii Food/Excise Tax Credit separate amount + reference: + - title: Hawaii Income Tax Law, Chapter 235, Section 235-55.85, (b) + href: https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=44 + - title: Hawaii Tax Form N-311 2022 + href: https://files.hawaii.gov/tax/forms/2022/n311_i.pdf#page=1 + - title: Hawaii Tax Form N-311 2021 page 1 + href: https://www.dochub.com/jsfiller-desk14/?mode=cors&lang=en&ref=https://www.dochub.com&projectId=1317406362&loader=tips&MEDIUM_PDFJS=true&PAGE_REARRANGE_V2_MVP=true&isPageRearrangeV2MVP=true&jsf-page-rearrange-v2=true&jsf-new-header=false#ede2dc134a0b435eb2449575bffabfdb +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 110 + - threshold: + 2021-01-01: 5_000 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 10_000 + amount: + 2021-01-01: 85 + - threshold: + 2021-01-01: 15_000 + amount: + 2021-01-01: 70 + - threshold: + 2021-01-01: 20_000 + amount: + 2021-01-01: 55 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 45 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 35 + - threshold: + 2021-01-01: 50_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/single.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/single.yaml new file mode 100644 index 000000000..66f4cba83 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/single.yaml @@ -0,0 +1,38 @@ +description: Hawaii provides this amount under the Food/Excise Tax Credit for single filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: Hawaii Food/Excise Tax Credit single amount + reference: + - title: Hawaii Income Tax Law, Chapter 235, Section 235-55.85, (b) + href: https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=44 + - title: Hawaii Tax Form N-311 2022 + href: https://files.hawaii.gov/tax/forms/2022/n311_i.pdf#page=1 + - title: Hawaii Tax Form N-311 2021 page 1 + href: https://www.dochub.com/jsfiller-desk14/?mode=cors&lang=en&ref=https://www.dochub.com&projectId=1317406362&loader=tips&MEDIUM_PDFJS=true&PAGE_REARRANGE_V2_MVP=true&isPageRearrangeV2MVP=true&jsf-page-rearrange-v2=true&jsf-new-header=false#ede2dc134a0b435eb2449575bffabfdb +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 110 + - threshold: + 2021-01-01: 5_000 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 10_000 + amount: + 2021-01-01: 85 + - threshold: + 2021-01-01: 15_000 + amount: + 2021-01-01: 70 + - threshold: + 2021-01-01: 20_000 + amount: + 2021-01-01: 55 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/widow.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/widow.yaml new file mode 100644 index 000000000..4b4abd8f8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/amount/widow.yaml @@ -0,0 +1,46 @@ +description: Hawaii provides this amount under the food excise tax credit for widow(er) filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: Hawaii Food/Excise Tax Credit widow amount + reference: + - title: Hawaii Income Tax Law, Chapter 235, Section 235-55.85, (b) + href: https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=44 + - title: Hawaii Tax Form N-311 2022 + href: https://files.hawaii.gov/tax/forms/2022/n311_i.pdf#page=1 + - title: Hawaii Tax Form N-311 2021 page 1 + href: https://www.dochub.com/jsfiller-desk14/?mode=cors&lang=en&ref=https://www.dochub.com&projectId=1317406362&loader=tips&MEDIUM_PDFJS=true&PAGE_REARRANGE_V2_MVP=true&isPageRearrangeV2MVP=true&jsf-page-rearrange-v2=true&jsf-new-header=false#ede2dc134a0b435eb2449575bffabfdb +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 110 + - threshold: + 2021-01-01: 5_000 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 10_000 + amount: + 2021-01-01: 85 + - threshold: + 2021-01-01: 15_000 + amount: + 2021-01-01: 70 + - threshold: + 2021-01-01: 20_000 + amount: + 2021-01-01: 55 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 45 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 35 + - threshold: + 2021-01-01: 50_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/age_threshold.yaml new file mode 100644 index 000000000..634524d67 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/age_threshold.yaml @@ -0,0 +1,9 @@ +description: Hawaii extends an additional food/excise credit amount to filers with minor children below this age threshold. +values: + 2021-01-01: 18 +metadata: + unit: year + label: Hawaii Food/Excise Tax Credit minor child age threshold + reference: + - title: 571-2 Definitions + href: https://www.capitol.hawaii.gov/hrscurrent/vol12_ch0501-0588/HRS0571/HRS_0571-0002.htm#:~:text=%C2%A7571%2D2%20Definitions.,and%20without%20regular%20court%20appearances. diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/amount.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/amount.yaml new file mode 100644 index 000000000..c84b285bb --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/amount.yaml @@ -0,0 +1,14 @@ +description: Hawaii provides this amount under the Food/Excise Tax Credit for each minor child receiving support from public agencies. +values: + 2021-01-01: 110 +metadata: + unit: currency-USD + label: Hawaii Food/Excise Tax Credit minor child amount + reference: + - title: Hawaii Income Tax Law, Chapter 235, Section 235-55.85, (c) + href: https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=44 + - title: Hawaii Tax Form N-311 2022 + href: https://files.hawaii.gov/tax/forms/2022/n311_i.pdf#page=1 + - title: Hawaii Tax Form N-311 2021 + href: https://www.dochub.com/jsfiller-desk14/?mode=cors&lang=en&ref=https://www.dochub.com&projectId=1317406362&loader=tips&MEDIUM_PDFJS=true&PAGE_REARRANGE_V2_MVP=true&isPageRearrangeV2MVP=true&jsf-page-rearrange-v2=true&jsf-new-header=false#ede2dc134a0b435eb2449575bffabfdb + diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/support_proportion_threshold.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/support_proportion_threshold.yaml new file mode 100644 index 000000000..9010d44dd --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/food_excise_tax/minor_child/support_proportion_threshold.yaml @@ -0,0 +1,15 @@ +description: Hawaii allows for an additional food/excise credit amount for each minor child receiving more than this proportion of support from public agencies. +values: + 2021-01-01: 0.5 +metadata: + unit: /1 + label: Hawaii Food/Excise Tax Credit minor child public agency support's proportion threshold + reference: + # Law does not specify the public support rate but it is specified in Form N-311 + - title: Hawaii Income Tax Law, Chapter 235, Section 235-55.85, (c) + href: https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=44 + - title: Hawaii Tax Form N-311 2022 + href: https://files.hawaii.gov/tax/forms/2022/n311_i.pdf#page=1 + - title: Hawaii Tax Form N-311 2021 page 1 + href: https://www.dochub.com/jsfiller-desk14/?mode=cors&lang=en&ref=https://www.dochub.com&projectId=1317406362&loader=tips&MEDIUM_PDFJS=true&PAGE_REARRANGE_V2_MVP=true&isPageRearrangeV2MVP=true&jsf-page-rearrange-v2=true&jsf-new-header=false#ede2dc134a0b435eb2449575bffabfdb + diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/aged_age_threshold.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/aged_age_threshold.yaml new file mode 100644 index 000000000..9c7cce524 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/aged_age_threshold.yaml @@ -0,0 +1,17 @@ +description: Hawaii counts filer heads and spouses as additional exemptions for the income tax credit for low-income household renters if they are this age or older. +values: + 2021-01-01: 65 + +metadata: + unit: year + period: year + label: Hawaii low-income household renters credit age threshold + reference: + - title: Hawaii Income Tax Law, HRS §235-55.7 §18-235-55.7 (b) + href: https://files.hawaii.gov/tax/legal/har/har_235.pdf#page=105 + - title: 2021 Hawaii Revised Statutes §235-55.7 (b) + href: https://law.justia.com/codes/hawaii/2021/title-14/chapter-235/section-235-55-7/ + - title: Schedule X (FORM N-11/N-15) Tax credits for Hawaii residents Rev.2022 + href: https://files.hawaii.gov/tax/forms/2022/schx_i.pdf#page=1 + - title: Schedule X (FORM N-11/N-15) Tax credits for Hawaii residents Rev.2021 + href: https://files.hawaii.gov/tax/forms/2021/schx_i.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/amount.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/amount.yaml new file mode 100644 index 000000000..a866af803 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/amount.yaml @@ -0,0 +1,17 @@ +description: Hawaii extends this amount for each exemption under the income tax credit for low-income household renters. +values: + 2021-01-01: 50 + +metadata: + unit: currency-USD + period: year + label: Hawaii income tax credit for low-income household renters base amount + reference: + - title: Hawaii Income Tax Law, HRS §235-55.7 §18-235-55.7 (b) + href: https://files.hawaii.gov/tax/legal/har/har_235.pdf#page=105 + - title: 2021 Hawaii Revised Statutes §235-55.7 (b) + href: https://law.justia.com/codes/hawaii/2021/title-14/chapter-235/section-235-55-7/ + - title: Schedule X (FORM N-11/N-15) Tax credits for Hawaii residents Rev.2022 + href: https://files.hawaii.gov/tax/forms/2022/schx_i.pdf#page=1 + - title: Schedule X (FORM N-11/N-15) Tax credits for Hawaii residents Rev.2021 + href: https://files.hawaii.gov/tax/forms/2021/schx_i.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/eligibility/agi_limit.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/eligibility/agi_limit.yaml new file mode 100644 index 000000000..72a697985 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/eligibility/agi_limit.yaml @@ -0,0 +1,19 @@ +description: Hawaii limits the tax credit for low-income household renters to filers with adjusted gross income below this amount. +values: + 2021-01-01: 30_000 + +metadata: + unit: currency-USD + period: year + label: Hawaii low-income household renters credit AGI limit + + reference: + - title: Hawaii Income Tax Law, HRS §235-55.7 §18-235-55.7 (b) + href: https://files.hawaii.gov/tax/legal/har/har_235.pdf#page=105 + - title: 2021 Hawaii Revised Statutes §235-55.7 (b) + href: https://law.justia.com/codes/hawaii/2021/title-14/chapter-235/section-235-55-7/ + - title: Schedule X (FORM N-11/N-15) Tax credits for Hawaii residents Rev.2022 + href: https://files.hawaii.gov/tax/forms/2022/schx_i.pdf#page=1 + - title: Schedule X (FORM N-11/N-15) Tax credits for Hawaii residents Rev.2021 + href: https://files.hawaii.gov/tax/forms/2021/schx_i.pdf#page=1 + diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/eligibility/rent_threshold.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/eligibility/rent_threshold.yaml new file mode 100644 index 000000000..a655aa8ee --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/credits/lihrtc/eligibility/rent_threshold.yaml @@ -0,0 +1,17 @@ +description: Hawaii limits the tax credit for low-income household renters to filers that paid more than this amount in rent. + +values: + 2021-01-01: 1_000 +metadata: + unit: currency-USD + period: year + label: Hawaii tax credit for low-income household renters rent threshold + reference: + - title: Hawaii Income Tax Law, HRS §235-55.7 §18-235-55.7 (b) + href: https://files.hawaii.gov/tax/legal/har/har_235.pdf#page=105 + - title: 2021 Hawaii Revised Statutes §235-55.7 (b) + href: https://law.justia.com/codes/hawaii/2021/title-14/chapter-235/section-235-55-7/ + - title: Schedule X (FORM N-11/N-15) Tax credits for Hawaii residents Rev.2022 + href: https://files.hawaii.gov/tax/forms/2022/schx_i.pdf#page=1 + - title: Schedule X (FORM N-11/N-15) Tax credits for Hawaii residents Rev.2021 + href: https://files.hawaii.gov/tax/forms/2021/schx_i.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/hi/tax/income/subtractions.yaml b/fiscalsim_us/parameters/gov/states/hi/tax/income/subtractions.yaml new file mode 100644 index 000000000..b41630edb --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/hi/tax/income/subtractions.yaml @@ -0,0 +1,19 @@ +description: Hawaii subtracts these sources from adjusted gross income. +values: + 2021-01-01: + - pension_income # Line 13 + - taxable_social_security # Line 14 + - hi_military_pay_exclusion # Line 15 + - us_govt_interest # Line 18 + - student_loan_interest # Line 18 + +metadata: + unit: list + label: Hawaii subtractions from federal adjusted gross income + reference: + - title: 2022 N-11 Hawaii Resident Income Tax Instructions + href: https://files.hawaii.gov/tax/forms/2022/n11ins.pdf#page=13 + - title: 2021 N-11 Hawaii Resident Income Tax Instructions + href: https://files.hawaii.gov/tax/forms/2021/n11ins.pdf#page=13 + - title: HI Rev Stat § 235-7 (2022) + href: https://law.justia.com/codes/hawaii/2022/title-14/chapter-235/section-235-7/ diff --git a/fiscalsim_us/parameters/gov/states/ia/README.md b/fiscalsim_us/parameters/gov/states/ia/README.md new file mode 100644 index 000000000..42c775d65 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ia/README.md @@ -0,0 +1 @@ +# Iowa diff --git a/fiscalsim_us/parameters/gov/states/ia/tax/income/credits/child_care/README.md b/fiscalsim_us/parameters/gov/states/ia/tax/income/credits/child_care/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ia/tax/income/credits/child_care/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/ia/tax/income/credits/earned_income/README.md b/fiscalsim_us/parameters/gov/states/ia/tax/income/credits/earned_income/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ia/tax/income/credits/earned_income/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/ia/tax/income/gross_income/sources.yaml b/fiscalsim_us/parameters/gov/states/ia/tax/income/gross_income/sources.yaml index 3e205ca6b..14c7b5a51 100644 --- a/fiscalsim_us/parameters/gov/states/ia/tax/income/gross_income/sources.yaml +++ b/fiscalsim_us/parameters/gov/states/ia/tax/income/gross_income/sources.yaml @@ -9,6 +9,7 @@ values: - capital_gains - taxable_pension_income - partnership_s_corp_income + - rental_income - farm_income - taxable_unemployment_compensation - miscellaneous_income diff --git a/fiscalsim_us/parameters/gov/states/id/index.yaml b/fiscalsim_us/parameters/gov/states/id/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/id/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/id/tax/income/credits/ctc/README.md b/fiscalsim_us/parameters/gov/states/id/tax/income/credits/ctc/README.md new file mode 100644 index 000000000..60b34fd67 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/id/tax/income/credits/ctc/README.md @@ -0,0 +1 @@ +# Child Tax Credit \ No newline at end of file diff --git a/fiscalsim_us/parameters/gov/states/id/tax/income/credits/ctc/amount.yaml b/fiscalsim_us/parameters/gov/states/id/tax/income/credits/ctc/amount.yaml new file mode 100644 index 000000000..36d0fbdef --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/id/tax/income/credits/ctc/amount.yaml @@ -0,0 +1,12 @@ +description: Idaho provides this child tax credit amount for each qualifying child. +values: + 2018-01-01: 205 +metadata: + unit: currency-USD + period: year + label: Idaho child tax credit amount + reference: + - title: IDAHO STATUTES - TITLE 63 - 067 - SECTION 63-3029L (1) + href: https://legislature.idaho.gov/statutesrules/idstat/Title63/T63CH30/SECT63-3029L/ + - title: Form 40 2022 Individual Income Tax Return + href: https://tax.idaho.gov/wp-content/uploads/forms/EFO00089/EFO00089_12-30-2022.pdf#page=6 diff --git a/fiscalsim_us/parameters/gov/states/id/tax/income/main/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/id/tax/income/main/head_of_household.yaml new file mode 100644 index 000000000..70c0108c7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/id/tax/income/main/head_of_household.yaml @@ -0,0 +1,41 @@ +description: Idaho taxes income of head of household filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Idaho head of household income tax schedule + reference: + # As of 2023-08-04, the legal code specifies a flat 5.8% tax rate on taxable income exceeding + # $2,500/5,000, reflecting 2022 House Bill 1 and taking effect in 2023. + # The tax commission only shows tax schedules through 2022, which have more rates. + - title: Idaho State Tax Comission - Individual Income Tax Rate Schedule + href: https://tax.idaho.gov/taxes/income-tax/individual-income/individual-income-tax-rate-schedule/ + - title: IDAHO STATUTES || Section 35.01.01.075 - TAX ON INDIVIDUALS, ESTATES, AND TRUSTS + href: https://casetext.com/regulation/idaho-administrative-code/title-idapa-35-tax-commission-state/rule-350101-income-tax-administrative-rules/section-350101075-tax-on-individuals-estates-and-trusts + - title: IDAHO STATUTES, TITLE 63, CHAPTER 30, SECTION 63-3024 + href: https://legislature.idaho.gov/statutesrules/idstat/title63/t63ch30/sect63-3024/ + - title: LEGISLATIVE SESSIONS || 2022 EXTRAORDINARY LEGISLATIVE SESSION || 2022 EXTRAORDINARY SESSION LEGISLATIONHOUSE BILL 1 + href: https://legislature.idaho.gov/sessioninfo/2022spcl/legislation/H0001/ +brackets: + + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.01 + - threshold: + 2021-01-01: 3_176 + 2022-01-01: 3_324 + rate: + 2021-01-01: 0.031 + 2022-01-01: 0.03 + - threshold: + 2021-01-01: 9_526 + 2022-01-01: 9_974 + rate: + 2021-01-01: 0.045 + - threshold: + 2021-01-01: 15_878 + 2022-01-01: 16_622 + rate: + 2021-01-01: 0.065 + 2022-01-01: 0.06 diff --git a/fiscalsim_us/parameters/gov/states/id/tax/income/main/joint.yaml b/fiscalsim_us/parameters/gov/states/id/tax/income/main/joint.yaml new file mode 100644 index 000000000..96c6d687c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/id/tax/income/main/joint.yaml @@ -0,0 +1,35 @@ +description: Idaho taxes income of joint filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Idaho married filers income tax schedule + reference: + - title: Idaho State Tax Comission - Individual Income Tax Rate Schedule + href: https://tax.idaho.gov/taxes/income-tax/individual-income/individual-income-tax-rate-schedule/ + - title: IDAHO STATUTES || Section 35.01.01.075 - TAX ON INDIVIDUALS, ESTATES, AND TRUSTS + href: https://casetext.com/regulation/idaho-administrative-code/title-idapa-35-tax-commission-state/rule-350101-income-tax-administrative-rules/section-350101075-tax-on-individuals-estates-and-trusts + - title: IDAHO STATUTES, TITLE 63, CHAPTER 30, SECTION 63-3024 + href: https://legislature.idaho.gov/statutesrules/idstat/title63/t63ch30/sect63-3024/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.01 + - threshold: + 2021-01-01: 3_176 + 2022-01-01: 3_324 + rate: + 2021-01-01: 0.031 + 2022-01-01: 0.03 + - threshold: + 2021-01-01: 9_526 + 2022-01-01: 9_974 + rate: + 2021-01-01: 0.045 + - threshold: + 2021-01-01: 15_878 + 2022-01-01: 16_622 + rate: + 2021-01-01: 0.065 + 2022-01-01: 0.06 diff --git a/fiscalsim_us/parameters/gov/states/id/tax/income/main/separate.yaml b/fiscalsim_us/parameters/gov/states/id/tax/income/main/separate.yaml new file mode 100644 index 000000000..111bcdfd9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/id/tax/income/main/separate.yaml @@ -0,0 +1,39 @@ +description: Idaho taxes income of separate filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Idaho separate filers tax schedule + reference: + - title: Idaho State Tax Comission - Individual Income Tax Rate Schedule + href: https://tax.idaho.gov/taxes/income-tax/individual-income/individual-income-tax-rate-schedule/ + - title: IDAHO STATUTES || Section 35.01.01.075 - TAX ON INDIVIDUALS, ESTATES, AND TRUSTS + href: https://casetext.com/regulation/idaho-administrative-code/title-idapa-35-tax-commission-state/rule-350101-income-tax-administrative-rules/section-350101075-tax-on-individuals-estates-and-trusts + - title: IDAHO STATUTES, TITLE 63, CHAPTER 30, SECTION 63-3024 + href: https://legislature.idaho.gov/statutesrules/idstat/title63/t63ch30/sect63-3024/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.01 + - threshold: + 2021-01-01: 1_588 + 2022-01-01: 1_662 + rate: + 2021-01-01: 0.031 + 2022-01-01: 0.03 + - threshold: + 2021-01-01: 4_763 + 2022-01-01: 4_987 + rate: + 2021-01-01: 0.045 + - threshold: + 2021-01-01: 6_351 + 2022-01-01: 8_311 + rate: + 2021-01-01: 0.055 + 2022-01-01: 0.06 + - threshold: + 2021-01-01: 7_939 + rate: + 2021-01-01: 0.065 diff --git a/fiscalsim_us/parameters/gov/states/id/tax/income/main/single.yaml b/fiscalsim_us/parameters/gov/states/id/tax/income/main/single.yaml new file mode 100644 index 000000000..1cef29aea --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/id/tax/income/main/single.yaml @@ -0,0 +1,39 @@ +description: Idaho taxes income of single filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Idaho single filers income tax schedule + reference: + - title: Idaho State Tax Comission - Individual Income Tax Rate Schedule + href: https://tax.idaho.gov/taxes/income-tax/individual-income/individual-income-tax-rate-schedule/ + - title: IDAHO STATUTES || Section 35.01.01.075 - TAX ON INDIVIDUALS, ESTATES, AND TRUSTS + href: https://casetext.com/regulation/idaho-administrative-code/title-idapa-35-tax-commission-state/rule-350101-income-tax-administrative-rules/section-350101075-tax-on-individuals-estates-and-trusts + - title: IDAHO STATUTES, TITLE 63, CHAPTER 30, SECTION 63-3024 + href: https://legislature.idaho.gov/statutesrules/idstat/title63/t63ch30/sect63-3024/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.01 + - threshold: + 2021-01-01: 1_588 + 2022-01-01: 1_662 + rate: + 2021-01-01: 0.031 + 2022-01-01: 0.03 + - threshold: + 2021-01-01: 4_763 + 2022-01-01: 4_987 + rate: + 2021-01-01: 0.045 + - threshold: + 2021-01-01: 6_351 + 2022-01-01: 8_311 + rate: + 2021-01-01: 0.055 + 2022-01-01: 0.06 + - threshold: + 2021-01-01: 7_939 + rate: + 2021-01-01: 0.065 diff --git a/fiscalsim_us/parameters/gov/states/id/tax/income/main/widow.yaml b/fiscalsim_us/parameters/gov/states/id/tax/income/main/widow.yaml new file mode 100644 index 000000000..526b06bdf --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/id/tax/income/main/widow.yaml @@ -0,0 +1,35 @@ +description: Idaho taxes income of widow filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Idaho widow filers income tax schedule + reference: + - title: Idaho State Tax Comission - Individual Income Tax Rate Schedule + href: https://tax.idaho.gov/taxes/income-tax/individual-income/individual-income-tax-rate-schedule/ + - title: IDAHO STATUTES || Section 35.01.01.075 - TAX ON INDIVIDUALS, ESTATES, AND TRUSTS + href: https://casetext.com/regulation/idaho-administrative-code/title-idapa-35-tax-commission-state/rule-350101-income-tax-administrative-rules/section-350101075-tax-on-individuals-estates-and-trusts + - title: IDAHO STATUTES, TITLE 63, CHAPTER 30, SECTION 63-3024 + href: https://legislature.idaho.gov/statutesrules/idstat/title63/t63ch30/sect63-3024/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.01 + - threshold: + 2021-01-01: 3_176 + 2022-01-01: 3_324 + rate: + 2021-01-01: 0.031 + 2022-01-01: 0.03 + - threshold: + 2021-01-01: 9_526 + 2022-01-01: 9_974 + rate: + 2021-01-01: 0.045 + - threshold: + 2021-01-01: 15_878 + 2022-01-01: 16_622 + rate: + 2021-01-01: 0.065 + 2022-01-01: 0.06 diff --git a/fiscalsim_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml b/fiscalsim_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml new file mode 100644 index 000000000..fb13d13ab --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/id/tax/income/subtractions/subtractions.yaml @@ -0,0 +1,18 @@ +description: Idaho subtracts these items when calculating state adjusted gross income. +values: + 2021-01-01: + - salt_refund_income # (2) + - us_govt_interest # (3)(a) + - taxable_social_security # (5) + - military_service_income # (4) + - workers_compensation # (13) + +metadata: + unit: list + references: + - title: 2022 Idaho CodeSection 63-3022D - deduction of expenses for household and dependent care services + href: https://law.justia.com/codes/idaho/2022/title-63/chapter-30/section-63-3022d/ + - title: Individual Income Tax Forms and Instructions 2021 + href: https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_11-15-2021.pdf#page=30 + - title: Section 35.01.01.254 - (5) / (3) (a) + href: https://regulations.justia.com/states/idaho/35/35-01-01/section-35-01-01-254/ diff --git a/fiscalsim_us/parameters/gov/states/ma/tax/income/deductions/rent/index.yaml b/fiscalsim_us/parameters/gov/states/il/index.yaml similarity index 95% rename from fiscalsim_us/parameters/gov/states/ma/tax/income/deductions/rent/index.yaml rename to fiscalsim_us/parameters/gov/states/il/index.yaml index f0977ed9b..cb39cde8a 100644 --- a/fiscalsim_us/parameters/gov/states/ma/tax/income/deductions/rent/index.yaml +++ b/fiscalsim_us/parameters/gov/states/il/index.yaml @@ -1,4 +1,4 @@ -metadata: - propagate_metadata_to_children: true - economy: false - household: true +metadata: + propagate_metadata_to_children: true + economy: false + household: true diff --git a/fiscalsim_us/parameters/gov/states/il/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/il/tax/income/credits/eitc/README.md index ee5ac73c1..4808d739a 100644 --- a/fiscalsim_us/parameters/gov/states/il/tax/income/credits/eitc/README.md +++ b/fiscalsim_us/parameters/gov/states/il/tax/income/credits/eitc/README.md @@ -1 +1 @@ -# EITC +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/il/tax/income/credits/k12/README.md b/fiscalsim_us/parameters/gov/states/il/tax/income/credits/k12/README.md new file mode 100644 index 000000000..96171f325 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/il/tax/income/credits/k12/README.md @@ -0,0 +1 @@ +# K-12 Credit diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/agi_rate.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/agi_rate.yaml new file mode 100644 index 000000000..b5b1f3e6e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/agi_rate.yaml @@ -0,0 +1,14 @@ +description: Indiana taxes Indiana adjusted gross income at this rate. +values: + 2014-01-01: 0.034 # "For taxable years beginning before January 1, 2015" + 2015-01-01: 0.033 + 2017-01-01: 0.0323 + 2023-01-01: 0.0315 + # From 2025 onwards, the rate depends on the state's revenue growth. +metadata: + period: year + unit: /1 + label: Indiana AGI tax rate + reference: + - title: IC 6-3-2-1 Tax rate (a)(3) + href: http://iga.in.gov/legislative/laws/2023/ic/titles/006#6-3-2-1 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/max_age.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/max_age.yaml new file mode 100644 index 000000000..61fc4d2cf --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/max_age.yaml @@ -0,0 +1,9 @@ +description: Indiana limits its earned income tax credit to filers this age or below if they have no children. +metadata: + unit: float + label: Indiana EITC maximum age for childless eligibility + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2021-01-01: 64 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/maximum.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/maximum.yaml new file mode 100644 index 000000000..4ba1d17b1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/maximum.yaml @@ -0,0 +1,11 @@ +description: Indiana has a state EITC that used this maximum childless credit in 2021. +metadata: + unit: float + label: Indiana EITC maximum childless credit in 2021 + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2020-01-01: 0 + 2021-01-01: 545 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/min_age.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/min_age.yaml new file mode 100644 index 000000000..bd2e5bd53 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/min_age.yaml @@ -0,0 +1,9 @@ +description: Indiana limits its earned income tax credit to filers this age or above if they have no children. +metadata: + unit: float + label: Indiana EITC minimum age for childless eligibility + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2021-01-01: 25 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_in_rate.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_in_rate.yaml new file mode 100644 index 000000000..bb81a2da8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_in_rate.yaml @@ -0,0 +1,11 @@ +description: Indiana has a state EITC that used this phase-in rate for childless credit in 2021. +metadata: + unit: /1 + label: Indiana EITC phase-in rate for childless credit in 2021 + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2020-01-01: 0 + 2021-01-01: 0.0765 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_out_rate.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_out_rate.yaml new file mode 100644 index 000000000..bae2b47d7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_out_rate.yaml @@ -0,0 +1,11 @@ +description: Indiana has a state EITC that used this phase-out rate for childless credit in 2021. +metadata: + unit: /1 + label: Indiana EITC phase-out rate for childless credit in 2021 + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2020-01-01: 0 + 2021-01-01: 0.0765 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_out_start.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_out_start.yaml new file mode 100644 index 000000000..c2c7b2a32 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/childless/phase_out_start.yaml @@ -0,0 +1,11 @@ +description: Indiana has a state EITC that used this phase-out start income for childless credit in 2021. +metadata: + unit: /1 + label: Indiana EITC phase-out start income for childless credit in 2021 + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2020-01-01: 0 + 2021-01-01: 8_950 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/decoupled.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/decoupled.yaml new file mode 100644 index 000000000..1dd011829 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/decoupled.yaml @@ -0,0 +1,10 @@ +description: Indiana has a state EITC that is decoupled from the federal EITC if this parameter is true. +metadata: + unit: bool + label: Whether IN EITC is decoupled from federal EITC + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2010-01-01: false + 2011-01-01: true diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/investment_income_limit.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/investment_income_limit.yaml new file mode 100644 index 000000000..2f58a2948 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/investment_income_limit.yaml @@ -0,0 +1,12 @@ +description: Indiana makes any taxpayer with investment income that exceeds this limit EITC ineligible. +metadata: + unit: float + label: Indiana EITC investment income limit + period: year + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2020-01-01: 3_650 + 2021-01-01: 3_650 + 2022-01-01: 3_800 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/match_rate.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/match_rate.yaml new file mode 100644 index 000000000..0d664f4a5 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/match_rate.yaml @@ -0,0 +1,11 @@ +description: Indiana matches this fraction of the federal earned income tax credit. +metadata: + unit: /1 + label: Indiana federal-EITC match rate + period: year + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2021-01-01: 0.09 + 2022-01-01: 0.10 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/max_children.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/max_children.yaml new file mode 100644 index 000000000..402fda3c0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/earned_income/max_children.yaml @@ -0,0 +1,9 @@ +description: Indiana has a state EITC that recognizes at most this maximum number of eligible children. +metadata: + unit: int + label: IN EITC maximum allowable children + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21 +values: + 2011-01-01: 2 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..55df552d6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/refundable.yaml @@ -0,0 +1,11 @@ +description: Indiana income tax has these refundable credits. +metadata: + unit: variable + label: Indiana refundable credits + reference: + - title: Indiana General Assembly Laws + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3.1 +values: + 2021-01-01: + - in_eitc # Indiana earned income tax credit + - in_unified_elderly_tax_credit diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/amount/one_aged.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/amount/one_aged.yaml new file mode 100644 index 000000000..5c206956a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/amount/one_aged.yaml @@ -0,0 +1,28 @@ +description: Indiana provides the following amounts under the unified elderly tax credit for filing units containing just one aged head or spouse. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: Indiana unified elderly tax credit amount for one aged + reference: + - title: 2021 Indiana General Assembly Laws, Title 6, Article 3, Chapter 3 + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3-3-9 + - title: 2022 Indiana General Assembly Laws, Title 6, Article 3, Chapter 3 + href: https://iga.in.gov/laws/2022/ic/titles/6#6-3-3-9 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 1_000 + amount: + 2021-01-01: 50 + - threshold: + 2021-01-01: 3_000 + amount: + 2021-01-01: 40 + - threshold: + 2021-01-01: 10_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/amount/two_aged.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/amount/two_aged.yaml new file mode 100644 index 000000000..cf842be83 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/amount/two_aged.yaml @@ -0,0 +1,28 @@ +description: Indiana provides the following amounts under the unified elderly tax credit for filing units containing both an aged head and an aged spouse. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: Indiana unified elderly tax credit amount for two aged + reference: + - title: 2021 Indiana General Assembly Laws, Title 6, Article 3, Chapter 3 + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3-3-9 + - title: 2022 Indiana General Assembly Laws, Title 6, Article 3, Chapter 3 + href: https://iga.in.gov/laws/2022/ic/titles/6#6-3-3-9 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 140 + - threshold: + 2021-01-01: 1_000 + amount: + 2021-01-01: 90 + - threshold: + 2021-01-01: 3_000 + amount: + 2021-01-01: 80 + - threshold: + 2021-01-01: 10_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/min_age.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/min_age.yaml new file mode 100644 index 000000000..1dc0290ce --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/credits/unified_elderly/min_age.yaml @@ -0,0 +1,9 @@ +description: Indiana allows filers at or above this age to receive the unified tax credit for the elderly. +metadata: + reference: + - title: Indiana General Assembly Laws, Title 6, Article 3, Chapter 3 + href: https://iga.in.gov/laws/2021/ic/titles/6#6-3-3-9 + unit: year + label: Indiana unified elderly tax credit minimum age for eligibility +values: + 2021-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/homeowners_property_tax/max.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/homeowners_property_tax/max.yaml index 523683939..08709c990 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/homeowners_property_tax/max.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/homeowners_property_tax/max.yaml @@ -1,9 +1,8 @@ -description: Maximum homeowner's property tax deduction in IN. +description: Indiana provides a homeowner's property tax deduction up to this amount, by filing status. metadata: period: year unit: currency-USD - name: in_max_homeowners_property_tax_deduction - label: IN max homeowner's property tax deduction + label: Indiana max homeowner's property tax deduction reference: - title: C 6-3-1-3.5 "Adjusted gross income" (a)(13) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/military_service/max.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/military_service/max.yaml index 6efc90d8d..39bd6a36f 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/military_service/max.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/military_service/max.yaml @@ -1,11 +1,10 @@ -description: Maximum per-person military service deduction for IN +description: Indiana provides up a military service deduction of up to this amount per person. values: 2021-01-01: 5_000 metadata: period: year unit: currency-USD - name: in_max_military_service_deduction - label: IN max military service deduction + label: Indiana max military service deduction reference: - title: IC 6-3-2-4 Military service deduction; retirement income or survivor's benefits deduction (a)(1) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-4 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/nonpublic_school/amount.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/nonpublic_school/amount.yaml index ccce9a8c5..de8525b92 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/nonpublic_school/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/nonpublic_school/amount.yaml @@ -1,11 +1,10 @@ -description: IN deduction for qualified dependent children in private, parochial, or home school with unreimbursed expense +description: Indiana provides a deduction of this amount for qualified dependent children in private, parochial, or home school with unreimbursed expenses. values: 2021-01-01: 1_000 metadata: period: year unit: currency-USD - name: in_nonpublic_school_deduction - label: IN nonpublic school deduction + label: Indiana nonpublic school deduction reference: - title: IC 6-3-2-22 Deduction; unreimbursed education expenditures (d)(1) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-22 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/renters/max.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/renters/max.yaml index 7d99ebd8a..5a13e041d 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/renters/max.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/renters/max.yaml @@ -1,9 +1,8 @@ -description: Maximum Renter's deduction in IN. +description: Indiana allows a deduction of up to this amount in rent paid, by filing status. metadata: period: year unit: currency-USD - name: in_max_renters_deduction - label: IN max renter's deduction + label: Indiana max renter's deduction breakdown: - filing_status reference: diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/unemployment_compensation/agi_reduction.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/unemployment_compensation/agi_reduction.yaml index a406d0135..67988cf8c 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/unemployment_compensation/agi_reduction.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/unemployment_compensation/agi_reduction.yaml @@ -1,9 +1,8 @@ -description: Reduction to AGI for computation of maximum unemployment compensation deduction. +description: Indiana reduces adjusted gross income by this amount when computing the maximum unemployment compensation deduction. metadata: period: year unit: currency-USD - name: in_agi_reduction_unemployment_compensation_deduction - label: AGI reduction for calculation of maximum unemployment compensation deduction in IN + label: Indiana AGI reduction for calculation of maximum unemployment compensation deduction breakdown: - filing_status reference: diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/unemployment_compensation/reduced_agi_haircut.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/unemployment_compensation/reduced_agi_haircut.yaml index 55754bb08..d29153726 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/unemployment_compensation/reduced_agi_haircut.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/deductions/unemployment_compensation/reduced_agi_haircut.yaml @@ -1,11 +1,10 @@ -description: Haircut to reduced AGI for computing maximum unemployment compensation deduction in IN +description: Indiana applies this haircut when reducing adjusted gross income for computing the maximum unemployment compensation deduction. values: 2021-01-01: 0.5 metadata: period: year unit: /1 - name: in_reduced_agi_haircut - label: Haircut to reduced AGI for computing maximum unemployment compensation deduction in IN + label: Indiana haircut to reduced AGI for computing maximum unemployment compensation deduction reference: - title: IC 6-3-2-10 Unemployment compensation; deduction (a) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-10 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/additional/amount.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/additional/amount.yaml index 8fbfef3cd..7660b31a6 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/additional/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/additional/amount.yaml @@ -1,11 +1,10 @@ -description: Additional exemption amount for qualifying dependent children in IN. +description: Indiana provides this additional exemption amount for qualifying dependent children. values: 2021-01-01: 1_500 metadata: unit: currency-USD period: year - name: in_exemptions_additional_amount_dependent_child - label: IN exemptions additional amount for dependent childen + label: Indiana exemptions additional amount for dependent childen reference: - title: IC 6-3-1-3.5 "Adjusted gross income" (a)(5)(A) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_blind/amount.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_blind/amount.yaml index d4c75a5a1..c1f889e96 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_blind/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_blind/amount.yaml @@ -1,11 +1,10 @@ -description: Additional exemption amount for aged and/or blind filers in IN. +description: Indiana provides this additional exemption amount for aged and/or blind filers. values: 2021-01-01: 1_000 metadata: unit: /1 period: year - name: in_exemptions_additional_amount_aged_blind - label: IN exemptions additional amount for aged and or blind + label: Indiana exemptions additional amount for aged and or blind reference: - title: IC 6-3-1-3.5 "Adjusted gross income" (a)(4)(B) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_low_agi/amount.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_low_agi/amount.yaml index 7853de0dc..4c250cc33 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_low_agi/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_low_agi/amount.yaml @@ -1,11 +1,10 @@ -description: Additional exemption amount for low-agi aged filers in IN. +description: Indiana provides this additional exemption amount for low-income aged filers. values: 2021-01-01: 500 metadata: unit: /1 period: year - name: in_exemptions_additional_amount_low_agi_aged - label: IN exemptions additional amount for low agi aged + label: Indiana exemptions additional amount for low AGI aged reference: - title: IC 6-3-1-3.5 "Adjusted gross income" (a)(5)(C) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_low_agi/threshold.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_low_agi/threshold.yaml index 340fa739c..835f29e90 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_low_agi/threshold.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/aged_low_agi/threshold.yaml @@ -1,9 +1,8 @@ -description: Maximum income to be eligible for additional exemption for low-AGI aged filers in IN. +description: Indiana limits its additional exemption for aged filers with low adjusted gross income to this income, by filing status. metadata: period: year unit: currency-USD - name: in_additional_exemptions_threshold_low_agi_aged - label: IN additional exemptions threshold for low AGI aged + label: Indiana low AGI aged exemption income limit breakdown: - filing_status SINGLE: diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/base/amount.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/base/amount.yaml index 17191cb72..d5e88be8e 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/base/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/base/amount.yaml @@ -1,11 +1,10 @@ -description: Base exemption amount for IN. +description: Indiana provides this base exemption amount. values: 2021-01-01: 1_000 metadata: period: year unit: currency-USD - name: in_exemptions_base_amount - label: IN exemptions base amount + label: Indiana exemptions base amount reference: - title: IC 6-3-1-3.5 "Adjusted gross income" (a)(3)-(4) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/qualifying_child/max_ages/non_student.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/qualifying_child/max_ages/non_student.yaml index 73f2e6f26..023ca7089 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/qualifying_child/max_ages/non_student.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/qualifying_child/max_ages/non_student.yaml @@ -1,8 +1,7 @@ -description: Maximum age for non-student dependents to qualify as children for the IN additional exemption. +description: Indiana considers as children people below this age when compute its additional exemption for non-student dependents. metadata: unit: year - name: in_exemptions_qualifying_child_max_age_non_student - label: Maximum age for non-students to qualify for IN additional exemption + label: Indiana additional exemption age limit for non-students reference: - title: IC 6-3-1-3.5 "Adjusted gross income" (5)(B)(i) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/qualifying_child/max_ages/student.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/qualifying_child/max_ages/student.yaml index c4fa6967d..94406da1b 100644 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/qualifying_child/max_ages/student.yaml +++ b/fiscalsim_us/parameters/gov/states/in/tax/income/exemptions/qualifying_child/max_ages/student.yaml @@ -1,8 +1,7 @@ -description: Maximum age for student dependents to qualify as children for the IN additional exemption. +description: Indiana considers as children people below this age when compute its additional exemption for student dependents. metadata: unit: year - name: in_exemptions_qualifying_child_max_age_student - label: Maximum age for students to qualify for IN additional exemption + label: Indiana additional exemption age limit for students reference: - title: IC 6-3-1-3.5 "Adjusted gross income" (5)(B)(i) href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5 diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/taxes/agi/README.md b/fiscalsim_us/parameters/gov/states/in/tax/income/taxes/agi/README.md deleted file mode 100644 index c74f6f3f4..000000000 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/taxes/agi/README.md +++ /dev/null @@ -1 +0,0 @@ -# AGI diff --git a/fiscalsim_us/parameters/gov/states/in/tax/income/taxes/agi/rate.yaml b/fiscalsim_us/parameters/gov/states/in/tax/income/taxes/agi/rate.yaml deleted file mode 100644 index 7b7622d92..000000000 --- a/fiscalsim_us/parameters/gov/states/in/tax/income/taxes/agi/rate.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: IN adjusted gross income tax rate. -values: - 2014-01-01: 0.034 # "For taxable years beginning before January 1, 2015" - 2015-01-01: 0.033 - 2017-01-01: 0.0323 -metadata: - period: year - unit: /1 - name: in_agi_tax_rate - label: IN AGI tax rate - reference: - - title: IC 6-3-2-1 Tax rate (a)(3) - href: http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-1 diff --git a/fiscalsim_us/parameters/gov/states/ks/tax/income/agi/subtractions/oasdi/agi_limit.yaml b/fiscalsim_us/parameters/gov/states/ks/tax/income/agi/subtractions/oasdi/agi_limit.yaml index bfcee88d7..59eabede3 100644 --- a/fiscalsim_us/parameters/gov/states/ks/tax/income/agi/subtractions/oasdi/agi_limit.yaml +++ b/fiscalsim_us/parameters/gov/states/ks/tax/income/agi/subtractions/oasdi/agi_limit.yaml @@ -13,3 +13,4 @@ metadata: href: https://www.ksrevenue.gov/pdf/ip22.pdf - title: Kansas 2022 Statute | Article 32 | §79-32,271(c)(xviii) href: http://www.kslegislature.org/li/b2023_24/statute/079_000_0000_chapter/079_032_0000_article/079_032_0117_section/079_032_0117_k/ + diff --git a/fiscalsim_us/parameters/gov/states/ks/tax/income/credits/cdcc_fraction.yaml b/fiscalsim_us/parameters/gov/states/ks/tax/income/credits/cdcc_fraction.yaml index e0c000e07..12092d4c4 100644 --- a/fiscalsim_us/parameters/gov/states/ks/tax/income/credits/cdcc_fraction.yaml +++ b/fiscalsim_us/parameters/gov/states/ks/tax/income/credits/cdcc_fraction.yaml @@ -1,4 +1,4 @@ -description: Kansas matches this percentage of the federal CDCC. +description: Kansas matches this percentage of the federal Child and Dependent Care Credit. values: 2018-01-01: 0.125 2019-01-01: 0.1875 diff --git a/fiscalsim_us/parameters/gov/states/ky/README.md b/fiscalsim_us/parameters/gov/states/ky/README.md new file mode 100644 index 000000000..e8101ca76 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ky/README.md @@ -0,0 +1 @@ +# Kentucky diff --git a/fiscalsim_us/parameters/gov/states/ky/index.yaml b/fiscalsim_us/parameters/gov/states/ky/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ky/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/dependent_care_service/match.yaml b/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/dependent_care_service/match.yaml new file mode 100644 index 000000000..14da079be --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/dependent_care_service/match.yaml @@ -0,0 +1,12 @@ +description: Kentucky matches the federal child and dependent care credit at the following rate for its dependent care service credit. +values: + 1990-01-01: 0.2 + +metadata: + unit: /1 + label: Kentucky dependent care service credit rate + reference: + - title: Kentucky Revised Statutes Chapter 141.067 Household and dependent care service credit + href: https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=29058 + - title: 2022 KENTUCKY Form 740 + href: https://revenue.ky.gov/Forms/Form%20740%205-9-23.pdf#page=2 diff --git a/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/family_size/family_size_cap.yaml b/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/family_size/family_size_cap.yaml new file mode 100644 index 000000000..1f624f5fc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/family_size/family_size_cap.yaml @@ -0,0 +1,12 @@ +description: Kentucky caps the family size at this number when calculating the poverty threshold for the family size tax credit. +values: + 2005-01-01: 4 +metadata: + label: Kentucky family size tax credit family size cap + period: year + unit: people + reference: + - title: Kentucky 141.066, (1) (e) (4) + href: https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=49188 + - title: 2022 Kentucky individual tax credit schedule, ITC + href: https://revenue.ky.gov/Forms/Schedule%20ITC%202022.pdf#page=2 diff --git a/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/family_size/rate.yaml b/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/family_size/rate.yaml new file mode 100644 index 000000000..8f72aa2a2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/family_size/rate.yaml @@ -0,0 +1,57 @@ +description: Kentucky provides a credit for a fraction of tax liability, based on modified gross income as a percent of a modified poverty line. +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + label: Kentucky family size tax credit rate + reference: + - title: Kentucky 141.066, (3) + href: https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=49188 + - title: 2022 Kentucky individual tax credit schedule, ITC + href: https://revenue.ky.gov/Forms/Schedule%20ITC%202022.pdf#page=2 + +brackets: + - threshold: + 2005-01-01: -.inf + amount: + 2005-01-01: 1 + - threshold: + 2005-01-01: 1 + amount: + 2005-01-01: 0.9 + - threshold: + 2005-01-01: 1.04 + amount: + 2005-01-01: 0.8 + - threshold: + 2005-01-01: 1.08 + amount: + 2005-01-01: 0.7 + - threshold: + 2005-01-01: 1.12 + amount: + 2005-01-01: 0.6 + - threshold: + 2005-01-01: 1.16 + amount: + 2005-01-01: 0.5 + - threshold: + 2005-01-01: 1.2 + amount: + 2005-01-01: 0.4 + - threshold: + 2005-01-01: 1.24 + amount: + 2005-01-01: 0.3 + - threshold: + 2005-01-01: 1.27 + amount: + 2005-01-01: 0.2 + - threshold: + 2005-01-01: 1.3 + amount: + 2005-01-01: 0.1 + - threshold: + 2005-01-01: 1.33 + amount: + 2005-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..72e4da45d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ky/tax/income/credits/non_refundable.yaml @@ -0,0 +1,7 @@ +description: Kentucky non-refundable tax credits. +metadata: + unit: list + label: Kentucky non-refundable credits +values: + 2021-01-01: + - ky_family_size_tax_credit diff --git a/fiscalsim_us/parameters/gov/states/ky/tax/income/deductions/standard.yaml b/fiscalsim_us/parameters/gov/states/ky/tax/income/deductions/standard.yaml new file mode 100644 index 000000000..7c9141437 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ky/tax/income/deductions/standard.yaml @@ -0,0 +1,16 @@ +description: Kentucky provides this standard deduction amount. +values: + 2021-01-01: 2_690 + 2022-01-01: 2_770 +metadata: + label: Kentucky standard deduction amount + period: year + unit: currency-USD + reference: + # Legal code specifies $1,700 in 1999, CPI-inflated since. + - title: Kentucky Revised Statutes, KRS Chapter 141.081 Optional standard deduction for individuals - Exception. + href: https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=29067 + - title: 2022 KENTUCKY Form 2022 + href: https://revenue.ky.gov/Forms/Form%20740%205-9-23.pdf + - title: 2021 KENTUCKY Form 740 + href: https://www.taxformfinder.org/forms/2021/2021-kentucky-form-740.pdf diff --git a/fiscalsim_us/parameters/gov/states/ky/tax/income/rate.yaml b/fiscalsim_us/parameters/gov/states/ky/tax/income/rate.yaml index 57b0288c4..6c0720f85 100644 --- a/fiscalsim_us/parameters/gov/states/ky/tax/income/rate.yaml +++ b/fiscalsim_us/parameters/gov/states/ky/tax/income/rate.yaml @@ -1,15 +1,16 @@ -description: Kentucky provides this flat personal income tax rate. +description: Kentucky taxes individual income at this rate. values: - 2022-01-01: 0.05 + 2021-01-01: 0.05 2023-01-01: 0.045 metadata: unit: /1 label: Kentucky income tax rate reference: + - title: Kentucky Individual Income Tax Return Residents Only - Form 740 - Line 12 + href: https://revenue.ky.gov/Forms/Form%20740-2021.pdf#page=1 - title: Kentucky Department of Revenue href: https://revenue.ky.gov/News/Pages/DOR-Announces-Updates-to-Individual-Income-Tax-for-2023-Tax-Year.aspx - - title: Kentucky Individual Income Tax Return Residents Only - From 740 + - title: Kentucky Individual Income Tax Return Residents Only - Form 740 href: https://revenue.ky.gov/Forms/Form%20740%205-9-23.pdf - title: Kentucky Estimated Tax Voucher Instructions href: https://revenue.ky.gov/Forms/740-ES%20Instructions%203-21-23.pdf - diff --git a/fiscalsim_us/parameters/gov/states/ma/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/ma/tax/income/credits/eitc/README.md index 154f07eec..4808d739a 100644 --- a/fiscalsim_us/parameters/gov/states/ma/tax/income/credits/eitc/README.md +++ b/fiscalsim_us/parameters/gov/states/ma/tax/income/credits/eitc/README.md @@ -1 +1 @@ -# EITC +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/md/tanf/README.md b/fiscalsim_us/parameters/gov/states/md/tanf/README.md index 26b95cf35..eb8aeb3f9 100644 --- a/fiscalsim_us/parameters/gov/states/md/tanf/README.md +++ b/fiscalsim_us/parameters/gov/states/md/tanf/README.md @@ -1 +1 @@ -# TANF +# Temporary Assistance for Needy Families diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/cdcc/README.md index ab56c53c0..03da87d0c 100644 --- a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/cdcc/README.md +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/cdcc/README.md @@ -1 +1 @@ -# Child and dependent care credit +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/README.md b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/README.md index 2d2df5ce5..412bf336c 100644 --- a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/README.md +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/README.md @@ -1 +1 @@ -# Child tax credit +# Child Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_threshold/disabled.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_threshold/disabled.yaml new file mode 100644 index 000000000..970a97b9b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_threshold/disabled.yaml @@ -0,0 +1,10 @@ +description: Maryland limits its Child Tax Credit to disabled children below this age. +values: + 2021-01-01: 17 +metadata: + label: Maryland Child Tax Credit disabled age limit + unit: year + period: year + reference: + - title: Md. Code, Tax-Gen. § 10-751 (a)(2)(ii)(2) + href: https://casetext.com/statute/code-of-maryland/article-tax-general/title-10-income-tax/subtitle-7-income-tax-credits/section-10-751-effective-until-712026-tax-credit-for-qualified-child diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_limit.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_threshold/main.yaml similarity index 68% rename from fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_limit.yaml rename to fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_threshold/main.yaml index 63eb57978..aa19e09f6 100644 --- a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_limit.yaml +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/age_threshold/main.yaml @@ -1,11 +1,11 @@ description: Maryland limits its Child Tax Credit to children below this age. values: - 2021-01-01: 17 + 2021-01-01: 0 + 2023-01-01: 6 metadata: - name: md_ctc_age_limit - label: Maryland CTC age limit - unit: currency-USD + label: Maryland Child Tax Credit main age limit + unit: year period: year reference: - - title: Md. Code, Tax-Gen. § 10-751 (a)(2)(ii.) + - title: Md. Code, Tax-Gen. § 10-751 (a)(2)(ii)(1) href: https://casetext.com/statute/code-of-maryland/article-tax-general/title-10-income-tax/subtitle-7-income-tax-credits/section-10-751-effective-until-712026-tax-credit-for-qualified-child diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/agi_cap.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/agi_cap.yaml index e6ae41a30..0a76542b1 100644 --- a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/agi_cap.yaml +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/agi_cap.yaml @@ -1,11 +1,11 @@ description: Maryland limits its Child Tax Credit to filers below this adjusted gross income. values: 2021-01-01: 6_000 + 2023-01-01: 15_000 metadata: reference: - title: "Md. Code, Tax-Gen. § 10-751 (b)" href: https://casetext.com/statute/code-of-maryland/article-tax-general/title-10-income-tax/subtitle-7-income-tax-credits/section-10-751-effective-until-712026-tax-credit-for-qualified-child unit: currency-USD period: year - name: md_ctc_agi_cap - label: MD CTC AGI cap + label: Maryland Child Tax Credit AGI cap diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/amount.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/amount.yaml index f13d65c0a..40f400a02 100644 --- a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/amount.yaml @@ -2,8 +2,7 @@ description: Maryland's Child Tax Credit provides this amount to eligible childr values: 2021-01-01: 500 metadata: - name: md_ctc_refund_per_child - label: Maryland CTC refund per eligible child + label: Maryland Child Tax Credit amount per eligible child unit: currency-USD period: year reference: diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/reduced_by_federal_credit.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/reduced_by_federal_credit.yaml new file mode 100644 index 000000000..95bf31dd7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/ctc/reduced_by_federal_credit.yaml @@ -0,0 +1,7 @@ +description: Maryland reduces its child tax credit by the federal child tax credit amount when this is true. +values: + 2021-01-01: true + 2023-01-01: false +metadata: + unit: bool + label: Maryland CTC reduced by federal credit diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/eitc/README.md index 154f07eec..4808d739a 100644 --- a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/eitc/README.md +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/eitc/README.md @@ -1 +1 @@ -# EITC +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/non_refundable.yaml index 90b1a5544..fab184289 100644 --- a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/non_refundable.yaml +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/non_refundable.yaml @@ -4,3 +4,8 @@ values: - md_cdcc - md_non_single_childless_non_refundable_eitc - md_poverty_line_credit + 2022-01-01: + - md_cdcc + - md_non_single_childless_non_refundable_eitc + - md_poverty_line_credit + - md_senior_tax_credit diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/poverty_line/README.md b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/poverty_line/README.md index 10bcd99fe..ea21c05cf 100644 --- a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/poverty_line/README.md +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/poverty_line/README.md @@ -1 +1 @@ -# Poverty line credit +# Poverty Line Credit diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/age_eligibility.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/age_eligibility.yaml new file mode 100644 index 000000000..589ddb6b9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/age_eligibility.yaml @@ -0,0 +1,11 @@ +description: Maryland allows filers at or above this age to receive the senior tax credit. +values: + 2022-01-01: 65 +metadata: + reference: + - title: MD 2022 Resident Booklet + href: https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=15 + - title: Md. Code, Tax-Gen. § 10-754 (a) + href: https://govt.westlaw.com/mdc/Document/N9D9D6B70E6C811ECB80FD99D7E19CB35?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default) + unit: year + label: Maryland Senior Tax Credit age eligibility diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/head_of_household.yaml new file mode 100644 index 000000000..0f1466eb6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/head_of_household.yaml @@ -0,0 +1,14 @@ +description: Maryland provides this senior tax credit amount for head of household filers. +values: + 2022-01-01: 1_750 +metadata: + reference: + - title: MD 2022 Resident Booklet + href: https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=15 + - title: Md. Code, Tax-Gen. § 10-754 (b) (2) (i) + href: https://govt.westlaw.com/mdc/Document/N9D9D6B70E6C811ECB80FD99D7E19CB35?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default) + + label: Maryland Senior Tax Credit head of houshehold amount + unit: currency-USD + period: year + diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/joint.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/joint.yaml new file mode 100644 index 000000000..0513385e1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/joint.yaml @@ -0,0 +1,16 @@ +description: Maryland provides this senior tax credit amount for joint filers, based on the number of aged people. +metadata: + reference: + - title: MD 2022 Resident Booklet + href: https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=15 + - title: Md. Code, Tax-Gen. § 10-754 (b) (2) + href: https://govt.westlaw.com/mdc/Document/N9D9D6B70E6C811ECB80FD99D7E19CB35?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default) + label: Maryland Senior Tax Credit joint amount + unit: currency-USD + period: year + breakdown: + - range(0,2) +1: + 2022-01-01: 1_000 +2: + 2022-01-01: 1_750 diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/separate.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/separate.yaml new file mode 100644 index 000000000..c0f288b0e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/separate.yaml @@ -0,0 +1,13 @@ +description: Maryland provides this senior tax credit amount for separate filers. +values: + 2022-01-01: 1_000 +metadata: + reference: + - title: MD 2022 Resident Booklet + href: https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=15 + - title: Md. Code, Tax-Gen. § 10-754 (b) (1) + href: https://govt.westlaw.com/mdc/Document/N9D9D6B70E6C811ECB80FD99D7E19CB35?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default) + label: Maryland Senior Tax Credit separate amount + unit: currency-USD + period: year + diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/single.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/single.yaml new file mode 100644 index 000000000..8f77c1afc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/single.yaml @@ -0,0 +1,14 @@ +description: Maryland provides this senior tax credit amount for single filers. +values: + 2022-01-01: 1_000 +metadata: + reference: + - title: MD 2022 Resident Booklet + href: https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=15 + - title: Md. Code, Tax-Gen. § 10-754 (b) (1) + href: https://govt.westlaw.com/mdc/Document/N9D9D6B70E6C811ECB80FD99D7E19CB35?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default) + + label: Maryland Senior Tax Credit single amount + unit: currency-USD + period: year + diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/widow.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/widow.yaml new file mode 100644 index 000000000..d918f6c40 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/amount/widow.yaml @@ -0,0 +1,14 @@ +description: Maryland provides this senior tax credit amount for widow(er) filers. +values: + 2022-01-01: 1_750 +metadata: + reference: + - title: MD 2022 Resident Booklet + href: https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=15 + - title: Md. Code, Tax-Gen. § 10-754 (b) (2) (i) + href: https://govt.westlaw.com/mdc/Document/N9D9D6B70E6C811ECB80FD99D7E19CB35?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default) + + label: Maryland Senior Tax Credit widow(er) amount + unit: currency-USD + period: year + diff --git a/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/income_threshold.yaml b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/income_threshold.yaml new file mode 100644 index 000000000..63df88470 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/md/tax/income/credits/senior_tax/income_threshold.yaml @@ -0,0 +1,22 @@ +description: Maryland limits its senior tax credit to filers with adjusted gross income threshold below this amount, based on filing status. +metadata: + reference: + - title: MD 2022 Resident Booklet + href: https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=21 + - title: Md. Code, Tax-Gen. § 10-754 (b) + href: https://govt.westlaw.com/mdc/Document/N9D9D6B70E6C811ECB80FD99D7E19CB35?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default) + label: Maryland Senior Tax Credit income threshold + unit: currency-USD + period: year + breakdown: + - filing_status +JOINT: + 2022-01-01: 150_000 +SINGLE: + 2022-01-01: 100_000 +HEAD_OF_HOUSEHOLD: + 2022-01-01: 150_000 +WIDOW: + 2022-01-01: 150_000 +SEPARATE: + 2022-01-01: 100_000 diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/agi/subtractions/pension_exclusion/cap.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/agi/subtractions/pension_exclusion/cap.yaml index 59addd820..6831fb913 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/agi/subtractions/pension_exclusion/cap.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/agi/subtractions/pension_exclusion/cap.yaml @@ -1,5 +1,6 @@ description: Maine subtracts this amount from pensions and annuities included in federal AGI from Maine AGI. values: + 2014-01-01: 10_000 2022-01-01: 25_000 2023-01-01: 30_000 2024-01-01: 35_000 diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/README.md b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/max_amount.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/max_amount.yaml index 1e4ee5b78..27cc4905b 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/max_amount.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/max_amount.yaml @@ -1,10 +1,12 @@ -description: Maine provides up to this amount in its child care credit. -values: - 2022-01-01: 500 -metadata: - reference: - - title: 2022 - Worksheet for Child Care Credit (Line 5) - href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf - unit: currency-USD - period: year - label: ME child care credit amount refundable max +description: Maine provides up to this amount in its child care credit. +values: + 2003-01-01: 500 +metadata: + reference: + - title: 2022 - Worksheet for Child Care Credit (Line 5) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf + - title: §5218. Income tax credit for child care expenses + href: https://www.mainelegislature.org/legis/statutes/36/title36sec5218.html + unit: currency-USD + period: year + label: ME child care credit amount refundable max diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/share_of_federal_credit/non_step_4.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/share_of_federal_credit/non_step_4.yaml index 4e9e69829..250578b2e 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/share_of_federal_credit/non_step_4.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/share_of_federal_credit/non_step_4.yaml @@ -1,10 +1,13 @@ -description: Maine matches this share of the federal child and dependent care credit for child care expenses that don't qualify as Step 4. -values: - 2022-01-01: 0.25 -metadata: - reference: - - title: 2022 - Worksheet for Child Care Credit (Line 5) - href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf - unit: /1 - period: year - label: Maine CDCC match for non-Step 4 child care expenses +description: Maine matches this share of the federal child and dependent care credit for child care expenses that don't qualify as Step 4. +values: + 2003-01-01: 0.215 + 2006-01-01: 0.25 +metadata: + reference: + - title: 2022 - Worksheet for Child Care Credit (Line 5) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf + - title: §5218. Income tax credit for child care expenses + href: https://www.mainelegislature.org/legis/statutes/36/title36sec5218.html + unit: /1 + period: year + label: Maine CDCC match for non-Step 4 child care expenses diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/share_of_federal_credit/step_4.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/share_of_federal_credit/step_4.yaml index d52c9e21f..c21aea424 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/share_of_federal_credit/step_4.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/child_care/share_of_federal_credit/step_4.yaml @@ -1,10 +1,18 @@ -description: Maine matches this share of the federal child and dependent care credit for child care expenses that qualify as Step 4. -values: - 2022-01-01: 0.50 -metadata: - reference: - - title: 2022 - Worksheet for Child Care Credit (Line 5) - href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf - unit: /1 - period: year - label: Maine CDCC match for Step 4 child care expenses +description: Maine matches this share of the federal child and dependent care credit for child care expenses that qualify as Step 4. +values: + 2018-01-01: 0.50 +metadata: + reference: + - title: 2022 - Worksheet for Child Care Credit (Line 5) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf + - title: Form 1040ME Schedule A (2021) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/21_1040me_sched_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2020) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/20_1040me_sched_a_dwnloadff.pdf + - title: Form 1040ME Schedule A (2019) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/19_1040me_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2018) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/18_1040me_a_d.pdf + unit: /1 + period: year + label: Maine CDCC match for Step 4 child care expenses diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/rate/no_qualifying_child.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/rate/no_qualifying_child.yaml index d2318ea40..2b68cb232 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/rate/no_qualifying_child.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/rate/no_qualifying_child.yaml @@ -1,11 +1,13 @@ -description: Maine matches this share of the federal EITC for filers without qualifying children. -values: - 2022-01-01: 0.50 -metadata: - unit: /1 - label: ME EITC percent - reference: - - title: ME Legal Code §5219-S. Earned income credit - href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-S.html - - title: ME Earned Income Tax Credit Worksheet - href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_earned_income_cred_ff.pdf +description: Maine matches this share of the federal EITC for filers without qualifying children. +values: + 2020-01-01: 0.25 + 2021-01-01: 0.20 + 2022-01-01: 0.50 +metadata: + unit: /1 + label: ME EITC percent + reference: + - title: ME Legal Code §5219-S. Earned income credit + href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-S.html + - title: ME Earned Income Tax Credit Worksheet + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_earned_income_cred_ff.pdf diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/rate/with_qualifying_child.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/rate/with_qualifying_child.yaml index f7a65d2a0..bd3c07e51 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/rate/with_qualifying_child.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/eitc/rate/with_qualifying_child.yaml @@ -1,12 +1,13 @@ -description: Maine matches this share of the federal EITC for filers with qualifying children. - -values: - 2022-01-01: 0.25 -metadata: - unit: /1 - label: ME EITC percent - reference: - - title: ME Legal Code §5219-S. Earned income credit - href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-S.html - - title: ME Earned Income Tax Credit Worksheet - href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_earned_income_cred_ff.pdf +description: Maine matches this share of the federal EITC for filers with qualifying children. +values: + 2020-01-01: 0.12 + 2021-01-01: 0.20 + 2022-01-01: 0.25 +metadata: + unit: /1 + label: ME EITC percent + reference: + - title: ME Legal Code §5219-S. Earned income credit + href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-S.html + - title: ME Earned Income Tax Credit Worksheet + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_earned_income_cred_ff.pdf diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..4ef7c4988 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/non_refundable.yaml @@ -0,0 +1,8 @@ +description: Maine non-refundable tax credits. +values: + 2021-01-01: + - me_dependent_exemption + - me_non_refundable_child_care_credit +metadata: + unit: list + label: Maine non-refundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..00a223694 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/credits/refundable.yaml @@ -0,0 +1,8 @@ +description: Maine refundable tax credits. +values: + 2021-01-01: + - me_refundable_child_care_credit + - me_eitc +metadata: + unit: list + label: Maine refundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/amount.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/amount.yaml index 21109aa5e..e5dc41778 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/amount.yaml @@ -1,9 +1,17 @@ -description: Maine dependents exemption amount -metadata: - unit: currency-USD - label: Maine Dependents Exemption Amount - reference: - - title: §5219-SS. Dependent exemption tax credit - href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-SS.html -values: - 2022-01-01: 300 +description: Maine dependent exemption amount +metadata: + unit: currency-USD + label: Maine Dependent Exemption Amount + reference: + - title: §5219-SS. Dependent exemption tax credit + href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-SS.html + - title: Form 1040ME Schedule A (2021) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/21_1040me_sched_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2020) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/20_1040me_sched_a_dwnloadff.pdf + - title: Form 1040ME Schedule A (2019) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/19_1040me_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2018) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/18_1040me_a_d.pdf +values: + 2018-01-01: 300 diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/increment.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/increment.yaml index b371cdcb7..4a6571f2b 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/increment.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/increment.yaml @@ -1,12 +1,20 @@ -description: Phaseout increment of the Maine dependent exemption. -metadata: - label: Maine dependent exemption phaseout increment - period: year - unit: currency-USD - reference: - - title: Instructions for Form 1040ME - href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf#page=2 - - title: §5219-SS. Dependent exemption tax credit - href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-SS.html -values: - 2022-01-01: 1_000 +description: Phaseout increment of the Maine dependent exemption. +metadata: + label: Maine dependent exemption phaseout increment + period: year + unit: currency-USD + reference: + - title: Instructions for Form 1040ME (2022) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf#page=2 + - title: §5219-SS. Dependent exemption tax credit + href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-SS.html + - title: Form 1040ME Schedule A (2021) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/21_1040me_sched_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2020) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/20_1040me_sched_a_dwnloadff.pdf + - title: Form 1040ME Schedule A (2019) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/19_1040me_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2018) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/18_1040me_a_d.pdf +values: + 2018-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/start.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/start.yaml index 6d16a2a77..e2d9b4dc0 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/start.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/start.yaml @@ -1,21 +1,29 @@ -description: Maine starts phasing out its dependents exemption for filers with Maine AGI above this threshold. -metadata: - unit: currency-USD - label: Maine dependents exemption phase-out start - reference: - - title: Instructions for Form 1040ME - href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf#page=2 - - title: §5219-SS. Dependent exemption tax credit - href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-SS.html - breakdown: - - filing_status -SINGLE: - 2022-01-01: 200_000 -SEPARATE: - 2022-01-01: 200_000 -HEAD_OF_HOUSEHOLD: - 2022-01-01: 200_000 -JOINT: - 2022-01-01: 400_000 -WIDOW: - 2022-01-01: 200_000 +description: Maine starts phasing out its dependents exemption for filers with Maine AGI above this threshold. +metadata: + unit: currency-USD + label: Maine dependents exemption phase-out start + reference: + - title: Instructions for Form 1040ME (2022) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf#page=2 + - title: §5219-SS. Dependent exemption tax credit + href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-SS.html + - title: Form 1040ME Schedule A (2021) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/21_1040me_sched_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2020) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/20_1040me_sched_a_dwnloadff.pdf + - title: Form 1040ME Schedule A (2019) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/19_1040me_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2018) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/18_1040me_a_d.pdf + breakdown: + - filing_status +SINGLE: + 2018-01-01: 200_000 +SEPARATE: + 2018-01-01: 200_000 +HEAD_OF_HOUSEHOLD: + 2018-01-01: 200_000 +JOINT: + 2018-01-01: 400_000 +WIDOW: + 2018-01-01: 200_000 diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/step.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/step.yaml index 5a572ee98..bf4b6a82d 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/step.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/dependent_exemption/phaseout/step.yaml @@ -1,10 +1,20 @@ -description: Maine reduces the dependent exemption by this amount for every phaseout increment in AGI above phaseout start. -metadata: - type: single_amount - unit: currency-USD - label: Maine dependent exemption phaseout amount per phaseout increment - reference: - - title: Instructions for Form 1040ME - href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf#page=2 -values: - 2022-01-01: 7.50 +description: Maine reduces the dependent exemption by this amount for every phaseout increment in AGI above phaseout start. +metadata: + type: single_amount + unit: currency-USD + label: Maine dependent exemption phaseout amount per phaseout increment + reference: + - title: Instructions for Form 1040ME (2022) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_a_ff.pdf#page=2 + - title: §5219-SS. Dependent exemption tax credit + href: https://www.mainelegislature.org/legis/statutes/36/title36sec5219-SS.html + - title: Form 1040ME Schedule A (2021) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/21_1040me_sched_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2020) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/20_1040me_sched_a_dwnloadff.pdf + - title: Form 1040ME Schedule A (2019) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/19_1040me_a_dwnldff.pdf + - title: Form 1040ME Schedule A (2018) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/18_1040me_a_d.pdf +values: + 2018-01-01: 7.50 diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/itemized/cap.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/itemized/cap.yaml new file mode 100644 index 000000000..48ab8e157 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/itemized/cap.yaml @@ -0,0 +1,39 @@ +description: Maine caps its itemized deductions before medical and dental expenses at this amount. +values: + 2013-01-01: 27_500 + 2014-01-01: 27_950 + 2015-01-01: 28_350 + 2016-01-01: 28_450 + 2017-01-01: 28_600 + 2018-01-01: 29_050 + 2019-01-01: 29_550 + 2020-01-01: 30_050 + 2021-01-01: 30_400 + 2022-01-01: 31_150 +metadata: + unit: currency-USD + period: year + label: Maine itemized deduction pre medical and dental expenses cap + reference: + - title: Maine legislative code §5125. Itemized deductions + href: https://www.mainelegislature.org/legis/statutes/36/title36sec5125.html + - title: Maine form 1040 Schedule 2 (2022) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_2_ff.pdf + - title: Maine form 1040 Schedule 2 (2021) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/21_1040me_2_dwnldff.pdf + - title: Maine form 1040 Schedule 2 (2020) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/20_1040me_2_dwnldff.pdf + - title: Maine form 1040 Schedule 2 (2019) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/19_1040me_2_dwnldff.pdf + - title: Maine form 1040 Schedule 2 (2018) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/18_1040_2_d.pdf + - title: Maine form 1040 Schedule 2 (2017) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/17_1040me_sch2_d_sept18.pdf + - title: Maine form 1040 Schedule 2 (2016) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/16_1040%20sched%202_download.pdf + - title: Maine form 1040 Schedule 2 (2015) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/15_1040%20sched%202_download.pdf + - title: Maine form 1040 Schedule 2 (2014) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/14_1040%20sched%202_download.pdf + - title: Maine form 1040 Schedule 2 (2013) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/13_1040_sched2_downloadable.pdf diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/phase_out/start.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/phase_out/start.yaml index b1783e6b1..a927c6728 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/phase_out/start.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/phase_out/start.yaml @@ -3,17 +3,54 @@ metadata: unit: currency-USD label: Maine standard/itemized exemption phase-out start reference: + - title: Maine form 1040 Schedule 2 (2022) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_2_ff.pdf - title: Instructions for Form 1040ME href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/21_1040me_book_gen_instr_revMay2022.pdf#page=4 + - title: Maine form 1040 Schedule 2 (2020) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/20_1040me_2_dwnldff.pdf + - title: Maine form 1040 Schedule 2 (2019) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/19_1040me_2_dwnldff.pdf + - title: Maine form 1040 Schedule 2 (2018) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/18_1040_2_d.pdf + - title: Maine form 1040 Schedule 2 (2017) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/17_1040me_sch2_d_sept18.pdf + - title: Maine form 1040 Schedule 2 (2016) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/16_1040%20sched%202_download.pdf breakdown: - filing_status SINGLE: + 2016-01-01: 70_000 + 2018-01-01: 80_000 + 2019-01-01: 81_450 + 2020-01-01: 82_900 + 2021-01-01: 83_850 2022-01-01: 85_850 SEPARATE: + 2016-01-01: 70_000 + 2018-01-01: 80_000 + 2019-01-01: 81_450 + 2020-01-01: 82_900 + 2021-01-01: 83_850 2022-01-01: 85_850 HEAD_OF_HOUSEHOLD: + 2016-01-01: 105_000 + 2018-01-01: 120_000 + 2019-01-01: 122_200 + 2020-01-01: 124_350 + 2021-01-01: 125_750 2022-01-01: 128_750 JOINT: + 2016-01-01: 140_000 + 2018-01-01: 160_000 + 2019-01-01: 162_950 + 2020-01-01: 165_800 + 2021-01-01: 167_700 2022-01-01: 171_700 WIDOW: + 2016-01-01: 140_000 + 2018-01-01: 160_000 + 2019-01-01: 162_950 + 2020-01-01: 165_800 + 2021-01-01: 167_700 2022-01-01: 171_700 diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/phase_out/width.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/phase_out/width.yaml index d11b86455..b35d7cc54 100644 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/phase_out/width.yaml +++ b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/phase_out/width.yaml @@ -3,17 +3,31 @@ metadata: unit: currency-USD label: Maine standard/itemized deduction phase-out width reference: - - title: Instructions for Form 1040ME + - title: §5124-C. Standard deduction + href: "https://www.mainelegislature.org/legis/statutes/36/title36sec5124-C.html" + - title: Instructions for Form 1040ME (2022) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_book_gen_instruc_revisedFeb23.pdf + - title: Instructions for Form 1040ME (2021) href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/21_1040me_book_gen_instr_revMay2022.pdf#page=4 + - title: Instructions for Form 1040ME (2020) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/20_1040me_gen_instr.pdf#page=6 + - title: Instructions for Form 1040ME (2019) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/19_1040me_instr_noncon.pdf#page=5 + - title: Instructions for Form 1040ME (2018) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/18_1040me_book_noncon.pdf#page=5 + - title: Instructions for Form 1040ME (2017) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/17_1040me_book_dwnld_sept18.pdf + - title: Instructions for Form 1040ME (2016) + href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/16_1040me_book_download.pdf breakdown: - filing_status SINGLE: - 2022-01-01: 75_000 + 2016-01-01: 75_000 SEPARATE: - 2022-01-01: 75_000 + 2016-01-01: 75_000 HEAD_OF_HOUSEHOLD: - 2022-01-01: 112_500 + 2016-01-01: 112_500 JOINT: - 2022-01-01: 150_000 + 2016-01-01: 150_000 WIDOW: - 2022-01-01: 150_000 + 2016-01-01: 150_000 diff --git a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/standard/amount.yaml b/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/standard/amount.yaml deleted file mode 100644 index 33a8dceab..000000000 --- a/fiscalsim_us/parameters/gov/states/me/tax/income/deductions/standard/amount.yaml +++ /dev/null @@ -1,20 +0,0 @@ -description: Maine state tax standard deduction -SINGLE: - 2022-01-01: 12_950 -JOINT: - 2022-01-01: 25_900 -SEPARATE: - 2022-01-01: 12_950 -HEAD_OF_HOUSEHOLD: - 2022-01-01: 19_400 -WIDOW: - 2022-01-01: 25_900 -metadata: - unit: currency-USD - period: year - breakdown: - - filing_status - label: Maine standard deduction - reference: - - title: State of Maine - Individual Income Tax 2022 Rates - href: https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/ind_tax_rate_sched_2022.pdf diff --git a/fiscalsim_us/parameters/gov/states/mi/index.yaml b/fiscalsim_us/parameters/gov/states/mi/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mi/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/mi/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/mi/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..03042587d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mi/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit \ No newline at end of file diff --git a/fiscalsim_us/parameters/gov/states/mi/tax/income/credits/eitc/match.yaml b/fiscalsim_us/parameters/gov/states/mi/tax/income/credits/eitc/match.yaml new file mode 100644 index 000000000..5d4385bf5 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mi/tax/income/credits/eitc/match.yaml @@ -0,0 +1,18 @@ +description: Michigan matches this share of the federal Earned Income Tax Credit. + +metadata: + unit: /1 + label: Michigan EITC match + reference: + - title: INCOME TAX ACT OF 1967 - Section 206.272, (1) + href: http://www.legislature.mi.gov/(S(ttmppzfvkzs3qs04dtrpwcfp))/mileg.aspx?page=getObject&objectName=mcl-206-272-amended&highlight=income%20AND%20tax + - title: 2022 MICHIGAN Individual Income Tax Return MI-1040 Form Page 2 Line 27 + href: https://www.michigan.gov/taxes/-/media/Project/Websites/taxes/Forms/2022/2022-IIT-Forms/MI-1040.pdf?rev=94571ffae1b04033ad368668974dec7a&hash=837A1A7BC58EE291E23535581A7F88DC +values: + 2008-01-01: 0.1 + 2009-01-01: 0.2 + 2012-01-01: 0.06 + # Reflected starting with 2023 tax form. + # In 2022, Michigan enacted a supplemental 24% match after tax filing season. + 2022-01-01: 0.3 + diff --git a/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/dependent_on_other_return.yaml b/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/dependent_on_other_return.yaml new file mode 100644 index 000000000..d43d6f428 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/dependent_on_other_return.yaml @@ -0,0 +1,24 @@ +description: Michigan provides this exemption amount for a taxpayer who can be claimed as a dependent on someone else’s return. +SINGLE: + 2021-01-01: 1_500 +JOINT: + 2021-01-01: 3_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 1_500 +WIDOW: + 2021-01-01: 1_500 +SEPARATE: + 2021-01-01: 1_500 +metadata: + unit: currency-USD + period: year + breakdown: + - filing_status + label: Michigan dependent on other return exemption amount + reference: + - title: Michigan Legal Code Section 206.30 - (4) + href: http://legislature.mi.gov/doc.aspx?mcl-206-30 + - title: Michigan Taxpayer's Guide 2022 - page 23 + href: https://www.legislature.mi.gov/Publications/TaxpayerGuide.pdf#page=23 + - title: 2021 Michigan Taxpayer Assistance Manual - page 35 + href: https://www.michigan.gov/-/media/Project/Websites/taxes/2022RM/UNCAT/2019_Taxpayer_Assistance_Manual.pdf#page=35 diff --git a/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/disabled.yaml b/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/disabled.yaml new file mode 100644 index 000000000..0864c19c0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/disabled.yaml @@ -0,0 +1,20 @@ +description: Michigan provides this exemption amount for each disabled person or dependent in the household. +values: + 2017-01-01: 2_600 + 2018-01-01: 2_700 + 2020-01-01: 2_800 + 2022-01-01: 2_900 + +metadata: + period: year + unit: currency-USD + label: Michigan disabled exemption amount + reference: + # Legal code specified $1,800. + - title: Michigan Legal Code Section 206.30 - (3)(a) + href: http://legislature.mi.gov/doc.aspx?mcl-206-30 + - title: Michigan Taxpayer's Guide 2022 - page 12 + href: https://www.legislature.mi.gov/Publications/TaxpayerGuide.pdf#page=12 + # 2021 manual contains values dating to 2017. + - title: 2021 Michigan Taxpayer Assistance Manual - page 10 + href: https://www.michigan.gov/-/media/Project/Websites/taxes/2022RM/UNCAT/2019_Taxpayer_Assistance_Manual.pdf#page=10 diff --git a/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/disabled_veteran.yaml b/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/disabled_veteran.yaml new file mode 100644 index 000000000..1eb8f0ba3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/disabled_veteran.yaml @@ -0,0 +1,19 @@ +description: Michigan provides this exemption amount for each disabled veteran in the household. +values: + # Law specifies $250 as of 2008. + # Tax guide specifies $400 since 2017. + 2017-01-01: 400 + +metadata: + period: year + unit: currency-USD + label: Michigan disabled veteran exemption amount + reference: + # Legal code specified $250. + - title: Michigan Legal Code Section 206.30 - (3)(b) + href: http://legislature.mi.gov/doc.aspx?mcl-206-30 + - title: Michigan Taxpayer's Guide 2022 - page 12 + href: https://www.legislature.mi.gov/Publications/TaxpayerGuide.pdf#page=12 + # 2021 manual contains values dating to 2017. + - title: 2021 Michigan Taxpayer Assistance Manual - page 10 + href: https://www.michigan.gov/-/media/Project/Websites/taxes/2022RM/UNCAT/2019_Taxpayer_Assistance_Manual.pdf#page=10 diff --git a/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/personal.yaml b/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/personal.yaml new file mode 100644 index 000000000..9ba4910af --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mi/tax/income/exemptions/personal.yaml @@ -0,0 +1,26 @@ +description: Michigan provides this exemption amount for the filer and spouse of the tax unit, each dependent, and each of the filers stillborn children. +values: + 2017-01-01: 4_000 + 2018-01-01: 4_050 + 2019-01-01: 4_400 + 2020-01-01: 4_750 + 2021-01-01: 4_900 + 2022-01-01: 5_000 + 2023-01-01: 5_400 + +metadata: + period: year + unit: currency-USD + label: Michigan exemption base amount + reference: + # Legal code specified $3,700. + - title: Michigan Legal Code Section 206.30 - (2) + href: http://legislature.mi.gov/doc.aspx?mcl-206-30 + - title: Michigan Taxpayer's Guide 2022 - page 12 + href: https://www.legislature.mi.gov/Publications/TaxpayerGuide.pdf#page=12 + # 2021 manual contains values dating to 2017. + - title: 2021 Michigan Taxpayer Assistance Manual - page 10 + href: https://www.michigan.gov/-/media/Project/Websites/taxes/2022RM/UNCAT/2019_Taxpayer_Assistance_Manual.pdf#page=10 + - title: What is Michigan’s 2023 personal exemption amount? + href: https://www.michigan.gov/taxes/business-taxes/withholding/withholding-tax-faqs/what-is-michigans-2023-personal-exemption-amount + diff --git a/fiscalsim_us/parameters/gov/states/mo/dss/README.md b/fiscalsim_us/parameters/gov/states/mo/dss/README.md index a09593de6..aa8d0900e 100644 --- a/fiscalsim_us/parameters/gov/states/mo/dss/README.md +++ b/fiscalsim_us/parameters/gov/states/mo/dss/README.md @@ -1 +1 @@ -# DSS +# Department of Social Services diff --git a/fiscalsim_us/parameters/gov/states/mo/dss/index.yaml b/fiscalsim_us/parameters/gov/states/mo/dss/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mo/dss/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ms/README.md b/fiscalsim_us/parameters/gov/states/ms/README.md new file mode 100644 index 000000000..4dd9b8f24 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/README.md @@ -0,0 +1 @@ +# Mississippi diff --git a/fiscalsim_us/parameters/gov/states/ms/index.yaml b/fiscalsim_us/parameters/gov/states/ms/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/adjustments.yaml b/fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/adjustments.yaml new file mode 100644 index 000000000..7902310af --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/adjustments.yaml @@ -0,0 +1,18 @@ +description: Mississippi subtracts these adjustments from federal adjusted gross income when computing state adjusted gross income. +values: + 2020-01-01: + - ira_contributions # Line 50 + - ms_self_employment_adjustment # Line 61 + - ms_national_guard_or_reserve_pay_adjustment # Line 55 + - alimony_expense # Line 53 + +metadata: + label: Mississippi AGI adjustments + unit: list + reference: + - title: Mississippi Resident INCOME TAX Instruction + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=12 + - title: 2020 Mississippi Code Title 27 - Income Tax and Withholding Article 1 + href: https://law.justia.com/codes/mississippi/2020/title-27/chapter-7/article-1/section-27-7-18/ # 1 - 7 + - title: Mississippi Resident Individual Income Tax Return 2022 + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80105228.pdf#page=2 # Line 50 - 64 diff --git a/fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/national_guard_or_reserve_pay/cap.yaml b/fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/national_guard_or_reserve_pay/cap.yaml new file mode 100644 index 000000000..b4b3c1dea --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/national_guard_or_reserve_pay/cap.yaml @@ -0,0 +1,13 @@ +description: Mississippi limits the national guard or reserve pay adjustment to the following amount. +values: + 2004-01-01: 5_000 + 2005-01-01: 15_000 +metadata: + period: year + unit: currency-USD + label: Mississippi national guard or reserve pay adjustment cap + reference: + - title: Mississippi Resident INCOME TAX Instruction + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=12 # Line 61 + - title: 2020 Mississippi Code Title 27 Income Tax § 27-7-15. (4) (m) + href: https://law.justia.com/codes/mississippi/2020/title-27/chapter-7/article-1/section-27-7-18/ diff --git a/fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/self_employment/rate.yaml b/fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/self_employment/rate.yaml new file mode 100644 index 000000000..2564075c2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/tax/income/adjustments/self_employment/rate.yaml @@ -0,0 +1,14 @@ +description: Mississippi subtracts this fraction of self-employment taxes from adjusted gross income. +values: + 2017-01-01: 0.17 + 2018-01-01: 0.34 + 2019-01-01: 0.5 +metadata: + period: year + unit: /1 + label: Mississippi self-employment tax adjustment rate + reference: + - title: Mississippi Resident INCOME TAX Instruction + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=13 # Line 61 + - title: 2020 Mississippi Code Title 27 Income Tax § 27-7-15. (6) (c) + href: https://law.justia.com/codes/mississippi/2020/title-27/chapter-7/article-1/section-27-7-18/ # 6(c) diff --git a/fiscalsim_us/parameters/gov/states/ms/tax/income/deductions/standard/amount.yaml b/fiscalsim_us/parameters/gov/states/ms/tax/income/deductions/standard/amount.yaml new file mode 100644 index 000000000..60b875135 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/tax/income/deductions/standard/amount.yaml @@ -0,0 +1,27 @@ +description: Mississippi provides personal standard deduction of this value depending on filing status. +metadata: + unit: currency-USD + label: Mississippi standard deduction + reference: + - title: Mississippi State FORMS 80-105 AND 80-205 + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=5 + - title: § 27-7-17. Individual nonbusiness deductions. 3(i)(i - iv) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=7a1c7bb2-7110-478b-aa87-7a0f540809eb&config=00JABhZDIzMTViZS04NjcxLTQ1MDItOTllOS03MDg0ZTQxYzU4ZTQKAFBvZENhdGFsb2f8inKxYiqNVSihJeNKRlUp&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A67NM-4K73-CGX8-048B-00008-00&pdcontentcomponentid=234190&pdteaserkey=sr0&pditab=allpods&ecomp=8s65kkk&earg=sr0&prid=e8257a64-6769-47fa-91b1-982d7b418151 + breakdown: + - filing_status +SINGLE: + 1997-01-01: 2_300 +SEPARATE: + 1997-01-01: 1_700 + 1998-01-01: 2_100 + 1999-01-01: 2_300 +HEAD_OF_HOUSEHOLD: + 1997-01-01: 3_400 +JOINT: + 1997-01-01: 3_400 + 1998-01-01: 4_200 + 1999-01-01: 4_600 +WIDOW: + 1997-01-01: 3_400 + 1998-01-01: 4_200 + 1999-01-01: 4_600 diff --git a/fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/aged/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/aged/age_threshold.yaml new file mode 100644 index 000000000..d829e942c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/aged/age_threshold.yaml @@ -0,0 +1,11 @@ +description: Mississippi provides the aged exemption amount for aged filers or spouse at or above this age. +metadata: + unit: year + label: Mississippi senior exemption age threshold + reference: + - title: Miss. Code Ann. § 27-7-21 (f) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=e1d2bafd-2018-44e8-a4fc-e9e2b08a4daa&nodeid=AAPAAFAABAAP&nodepath=%2FROOT%2FAAP%2FAAPAAF%2FAAPAAFAAB%2FAAPAAFAABAAP&level=4&haschildren=&populated=false&title=%C2%A7+27-7-21.+Exemptions+allowed.&config=00JABhZDIzMTViZS04NjcxLTQ1MDItOTllOS03MDg0ZTQxYzU4ZTQKAFBvZENhdGFsb2f8inKxYiqNVSihJeNKRlUp&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A8V3T-78H2-D6RV-H4WK-00008-00&ecomp=8gf5kkk&prid=1ae106b3-6378-4ac5-8291-6c5f714f357c + - title: Instructions for Mississippi State FORMS 80-105 AND 80-205 + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=6 +values: + 2019-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/aged/amount.yaml b/fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/aged/amount.yaml new file mode 100644 index 000000000..a4ca820fa --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/aged/amount.yaml @@ -0,0 +1,13 @@ +description: Mississippi provides an exemption of this amount per aged filer or spouse. +metadata: + unit: currency-USD + label: Mississippi aged exemption amount + reference: + - title: Instructions for Mississippi State FORMS 80-105 AND 80-205 + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf + - title: Department of Revenue, State of Mississippi - Tax rates, Exemptions, & Deductions. + href: https://www.dor.ms.gov/individual/tax-rates + - title: Miss. Code Ann. § 27-7-21 (f-g) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=64d1b349-1e6e-47a6-a6f5-cdaa9a3fc78f&nodeid=AAPAAFAABAAP&nodepath=%2FROOT%2FAAP%2FAAPAAF%2FAAPAAFAAB%2FAAPAAFAABAAP&level=4&haschildren=&populated=false&title=%C2%A7+27-7-21.+Exemptions+allowed.&config=00JABhZDIzMTViZS04NjcxLTQ1MDItOTllOS03MDg0ZTQxYzU4ZTQKAFBvZENhdGFsb2f8inKxYiqNVSihJeNKRlUp&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A8V3T-78H2-D6RV-H4WK-00008-00&ecomp=8gf5kkk&prid=1ae106b3-6378-4ac5-8291-6c5f714f357c +values: + 2020-01-01: 1_500 diff --git a/fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/blind/amount.yaml b/fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/blind/amount.yaml new file mode 100644 index 000000000..5ac16707b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/tax/income/exemptions/blind/amount.yaml @@ -0,0 +1,13 @@ +description: Mississippi provides an exemption of this amount per blind filer or spouse. +metadata: + unit: currency-USD + label: Mississippi blind exemption amount + reference: + - title: Instructions for Mississippi State FORMS 80-105 AND 80-205 + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf + - title: Department of Revenue, State of Mississippi - Tax rates, Exemptions, & Deductions. + href: https://www.dor.ms.gov/individual/tax-rates + - title: Miss. Code Ann. § 27-7-21 (f-g) + href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=64d1b349-1e6e-47a6-a6f5-cdaa9a3fc78f&nodeid=AAPAAFAABAAP&nodepath=%2FROOT%2FAAP%2FAAPAAF%2FAAPAAFAAB%2FAAPAAFAABAAP&level=4&haschildren=&populated=false&title=%C2%A7+27-7-21.+Exemptions+allowed.&config=00JABhZDIzMTViZS04NjcxLTQ1MDItOTllOS03MDg0ZTQxYzU4ZTQKAFBvZENhdGFsb2f8inKxYiqNVSihJeNKRlUp&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A8V3T-78H2-D6RV-H4WK-00008-00&ecomp=8gf5kkk&prid=1ae106b3-6378-4ac5-8291-6c5f714f357c +values: + 2020-01-01: 1_500 diff --git a/fiscalsim_us/parameters/gov/states/ms/tax/income/income_sources.yaml b/fiscalsim_us/parameters/gov/states/ms/tax/income/income_sources.yaml new file mode 100644 index 000000000..1377e7303 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/tax/income/income_sources.yaml @@ -0,0 +1,25 @@ +description: Mississippi counts these income sources toward adjusted gross income. +values: + 2021-01-01: + - employment_income # Wages, salaries, tips, etc. + - self_employment_income + - qualified_business_income + - capital_gains + - rent + - farm_income + - interest_income + - qualified_dividend_income + - alimony_income + - taxable_pension_income + - unemployment_compensation + +metadata: + label: Mississippi AGI income sources + unit: list + reference: + - title: Mississippi Resident INCOME TAX Instructions + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=10 # Line 38 - 48 + - title: Mississippi Income Tax and Withholding Article 1 § 27-7-15 + href: https://law.justia.com/codes/mississippi/2020/title-27/chapter-7/article-1/section-27-7-15/ + - title: Mississippi Resident Individual Income Tax Return 2022 + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80105228.pdf#page=2 # Line 38 - 48 diff --git a/fiscalsim_us/parameters/gov/states/ms/tax/income/rate.yaml b/fiscalsim_us/parameters/gov/states/ms/tax/income/rate.yaml new file mode 100644 index 000000000..c621d52f3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ms/tax/income/rate.yaml @@ -0,0 +1,44 @@ +description: Mississippi taxes personal income using these income tax brackets. + +brackets: + - threshold: + 2017-01-01: 0 + rate: + 2017-01-01: 0.03 + 2018-01-01: 0 + - threshold: + 2017-01-01: 5_000 + 2018-01-01: 1_000 + 2019-01-01: 2_000 + 2020-01-01: 3_000 + 2021-01-01: 4_000 + 2022-01-01: 5_000 + rate: + 2017-01-01: 0.04 + 2018-01-01: 0.03 + 2022-01-01: 0.04 + - threshold: + 2017-01-01: 10_000 + 2018-01-01: 5_000 + 2022-01-01: 10_000 + rate: + 2017-01-01: 0.05 + 2018-01-01: 0.04 + 2022-01-01: 0.05 + - threshold: + 2017-01-01: .inf + 2018-01-01: 10_000 + 2022-01-01: .inf + rate: + 2018-01-01: 0.05 + +metadata: + type: marginal_rate + rate_unit: /1 + threshold_unit: currency-USD + label: Mississippi income tax rate + reference: + - title: MS Code § 27-7-5 (2020) (1) + href: https://law.justia.com/codes/mississippi/2020/title-27/chapter-7/article-1/section-27-7-5/ + - title: Mississippi Income Tax Instructions 2022 + href: https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=20 diff --git a/fiscalsim_us/parameters/gov/states/mt/README.md b/fiscalsim_us/parameters/gov/states/mt/README.md new file mode 100644 index 000000000..a9c279465 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/README.md @@ -0,0 +1 @@ +# Montana diff --git a/fiscalsim_us/parameters/gov/states/mt/index.yaml b/fiscalsim_us/parameters/gov/states/mt/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/capital_gain/percentage.yaml b/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/capital_gain/percentage.yaml new file mode 100644 index 000000000..d02740bdf --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/capital_gain/percentage.yaml @@ -0,0 +1,13 @@ +description: Montana provides a credit for this fraction of the filer's net capital gains. +values: + 2021-01-01: 0.02 +metadata: + unit: /1 + label: Montana capital gains credit rate + reference: + - title: MT Code, Income Tax - Deductions, § 42.4.502 (1) + href: https://rules.mt.gov/gateway/RuleNo.asp?RN=42%2E4%2E502 + - title: Montana Tax Form 2022 | Nonrefundable Credits Schedule | Line 1 + href: https://mtrevenue.gov/wp-content/uploads/dlm_uploads/2023/05/Montana-Idividiual-Income-Tax-Return-Form-2-2022v6.2.pdf#page=9 + - title: Montana Tax Form 2021 | Nonrefundable Credits Schedule | Line 1 + href: https://mtrevenue.gov/wp-content/uploads/mdocs/form%202%202021.pdf#page=9 diff --git a/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/eitc/rate.yaml b/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/eitc/rate.yaml new file mode 100644 index 000000000..7b030f48e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/eitc/rate.yaml @@ -0,0 +1,9 @@ +description: Montana provides this rate to match the federal EITC. +values: + 2021-01-01: 0.03 +metadata: + unit: year + label: Montana EITC Rate + reference: + title: Montana Code15-30-2318. Earned income tax credit + href: https://leg.mt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0180/0150-0300-0230-0180.html diff --git a/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..3ecd4fb8a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/tax/income/credits/non_refundable.yaml @@ -0,0 +1,7 @@ +description: Montana non-refundable tax credits. +values: + 2021-01-01: + - mt_capital_gain_credit +metadata: + unit: list + label: Montana non-refundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/max.yaml b/fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/max.yaml new file mode 100644 index 000000000..1025c46b4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/max.yaml @@ -0,0 +1,31 @@ +description: Montana provides this maximum standard deduction amount, based on filing status. +metadata: + label: Montana standard deduction max amount + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: MT Code, Income Tax - Deductions, § 42-15-523 (2) + href: https://rules.mt.gov/gateway/RuleNo.asp?RN=42%2E15%2E523 + - title: Montana Tax Form 2022 | Standard Deduction | Line 3 + href: https://mtrevenue.gov/wp-content/uploads/dlm_uploads/2023/05/Montana-Idividiual-Income-Tax-Return-Form-2-2022v6.2.pdf#page=7 + - title: Montana Tax Form 2021 | Standard Deduction | Line 3 + href: https://mtrevenue.gov/wp-content/uploads/mdocs/form%202%202021.pdf#page=7 + + +JOINT: + 2021-01-01: 9_660 + 2022-01-01: 10_180 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 9_660 + 2022-01-01: 10_180 +WIDOW: + 2021-01-01: 4_830 + 2022-01-01: 5_090 +SINGLE: + 2021-01-01: 4_830 + 2022-01-01: 5_090 +SEPARATE: + 2021-01-01: 4_830 + 2022-01-01: 5_090 diff --git a/fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/min.yaml b/fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/min.yaml new file mode 100644 index 000000000..619a2f39c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/min.yaml @@ -0,0 +1,30 @@ +description: Montana provides a minimum standard deduction of this amount, based on filing status. +metadata: + label: Montana minimum standard deduction + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: MT Code, Income Tax - Deductions, § 42-15-523 (2) + href: https://rules.mt.gov/gateway/RuleNo.asp?RN=42%2E15%2E523 + - title: Montana Tax Form 2022 | Standard Deduction | Line 5 + href: https://mtrevenue.gov/wp-content/uploads/dlm_uploads/2023/05/Montana-Idividiual-Income-Tax-Return-Form-2-2022v6.2.pdf#page=7 + - title: Montana Tax Form 2021 | Standard Deduction | Line 5 + href: https://mtrevenue.gov/wp-content/uploads/mdocs/form%202%202021.pdf#page=7 + +JOINT: + 2021-01-01: 4_280 + 2022-01-01: 4_520 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 4_280 + 2022-01-01: 4_520 +WIDOW: + 2021-01-01: 2_140 + 2022-01-01: 2_260 +SINGLE: + 2021-01-01: 2_140 + 2022-01-01: 2_260 +SEPARATE: + 2021-01-01: 2_140 + 2022-01-01: 2_260 diff --git a/fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/rate.yaml b/fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/rate.yaml new file mode 100644 index 000000000..c330f74c3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/tax/income/deductions/standard/rate.yaml @@ -0,0 +1,14 @@ +description: Montana provides a standard deduction equal to this percentage of Montana adjusted gross income, subject to minimum and maximum values. +values: + 2021-01-01: 0.2 +metadata: + period: year + unit: /1 + label: Montana standard deduction rate + reference: + - title: MT Code, Income Tax - Deductions, § 42-15-512 (2) + href: https://rules.mt.gov/gateway/RuleNo.asp?RN=42%2E15%2E523 + - title: Montana Tax Form 2022 | Standard Deduction | Line 2 + href: https://mtrevenue.gov/wp-content/uploads/dlm_uploads/2023/05/Montana-Idividiual-Income-Tax-Return-Form-2-2022v6.2.pdf#page=7 + - title: Montana Tax Form 2021 | Standard Deduction | Line 2 + href: https://mtrevenue.gov/wp-content/uploads/mdocs/form%202%202021.pdf#page=7 diff --git a/fiscalsim_us/parameters/gov/states/mt/tax/income/exemptions/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/mt/tax/income/exemptions/age_threshold.yaml new file mode 100644 index 000000000..ffbd7edea --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/tax/income/exemptions/age_threshold.yaml @@ -0,0 +1,13 @@ +description: Montana provides an additional tax exemption to filers this age or older. +values: + 2021-01-01: 65 +metadata: + reference: + - title: "2022 Montana Form Instructions | Exemptions" + href: https://mtrevenue.gov/wp-content/uploads/dlm_uploads/2022/12/Form-2-2022-Instructions.pdf#page=15 + - title: Rule 42.15.402 - Personal Exemptions (1) + href: https://regulations.justia.com/states/montana/department-42/chapter-42-15/subchapter-42-15-4/rule-42-15-402/ + - title: "Montana Tax Form 2021 | Exemptions" + href: https://mtrevenue.gov/wp-content/uploads/mdocs/form%202%202021.pdf#page=1 + unit: year + label: Montana income tax aged exemption age threshold diff --git a/fiscalsim_us/parameters/gov/states/mt/tax/income/exemptions/amount.yaml b/fiscalsim_us/parameters/gov/states/mt/tax/income/exemptions/amount.yaml new file mode 100644 index 000000000..282cb22bc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/mt/tax/income/exemptions/amount.yaml @@ -0,0 +1,15 @@ +description: Montana deducts this amount for each eligible exemption when computing taxable income. +values: + 2021-01-01: 2_580 + 2022-01-01: 2_710 +metadata: + reference: + - title: "Montana Tax Form 2021 | Exemptions | Line 16" + href: https://mtrevenue.gov/wp-content/uploads/mdocs/form%202%202021.pdf#page=1 + - title: "Montana Tax Form 2022 | Exemptions | Line 16" + href: https://mtrevenue.gov/wp-content/uploads/dlm_uploads/2023/05/Montana-Idividiual-Income-Tax-Return-Form-2-2022v6.2.pdf#page=1 + - title: Rule 42.15.402 - Personal Exemptions (4) (b) + href: https://regulations.justia.com/states/montana/department-42/chapter-42-15/subchapter-42-15-4/rule-42-15-402/ + unit: currency-USD + period: year + label: Montana income tax exemption amount diff --git a/fiscalsim_us/parameters/gov/states/nc/README.md b/fiscalsim_us/parameters/gov/states/nc/README.md new file mode 100644 index 000000000..663bb2bb2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/README.md @@ -0,0 +1 @@ +# North Carolina diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/README.md b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/README.md new file mode 100644 index 000000000..412bf336c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/README.md @@ -0,0 +1 @@ +# Child Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/head_of_household.yaml new file mode 100644 index 000000000..06373b7e6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/head_of_household.yaml @@ -0,0 +1,31 @@ +description: North Carolina provides the following child tax credit amount for head of household filers. + +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 125 + 2018-01-01: 0 + - threshold: + 2015-01-01: 32_000 + amount: + 2015-01-01: 100 + 2018-01-01: 0 + - threshold: + 2015-01-01: 80_000 + amount: + 2015-01-01: 0 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + period: year + label: North Carolina CTC head of household filer amount + reference: + - title: North Carolina Department of Revenue - Credit for Children + href: https://www.ncdor.gov/taxes-forms/individual-income-tax/credit-children + - title: Code of North Carolina | § 105-153.10 Repealed by Session Laws. + href: https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_105/GS_105-153.10.html + - title: North Carolina Department of Revenue - 2017 Individual Income Tax Instructions + href: https://www.ncdor.gov/documents/files/2017-d-401-individual-income-tax-instructions/open diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/joint.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/joint.yaml new file mode 100644 index 000000000..0f5003a20 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/joint.yaml @@ -0,0 +1,30 @@ +description: North Carolina provides the following child tax credit amount for joint filers. +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 125 + 2018-01-01: 0 + - threshold: + 2015-01-01: 40_000 + amount: + 2015-01-01: 100 + 2018-01-01: 0 + - threshold: + 2015-01-01: 100_000 + amount: + 2015-01-01: 0 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + period: year + label: North Carolina CTC joint filer amount + reference: + - title: North Carolina Department of Revenue - Credit for Children + href: https://www.ncdor.gov/taxes-forms/individual-income-tax/credit-children + - title: Code of North Carolina | § 105-153.10 Repealed by Session Laws. + href: https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_105/GS_105-153.10.html + - title: North Carolina Department of Revenue - 2017 Individual Income Tax Instructions + href: https://www.ncdor.gov/documents/files/2017-d-401-individual-income-tax-instructions/open diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/separate.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/separate.yaml new file mode 100644 index 000000000..ec3293b84 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/separate.yaml @@ -0,0 +1,30 @@ +description: North Carolina provides the following child tax credit amount for separate filers. +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 125 + 2018-01-01: 0 + - threshold: + 2015-01-01: 20_000 + amount: + 2015-01-01: 100 + 2018-01-01: 0 + - threshold: + 2015-01-01: 50_000 + amount: + 2015-01-01: 0 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + period: year + label: North Carolina CTC separate filer amount + reference: + - title: North Carolina Department of Revenue - Credit for Children + href: https://www.ncdor.gov/taxes-forms/individual-income-tax/credit-children + - title: Code of North Carolina | § 105-153.10 Repealed by Session Laws. + href: https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_105/GS_105-153.10.html + - title: North Carolina Department of Revenue - 2017 Individual Income Tax Instructions + href: https://www.ncdor.gov/documents/files/2017-d-401-individual-income-tax-instructions/open diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/single.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/single.yaml new file mode 100644 index 000000000..a198bba52 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/single.yaml @@ -0,0 +1,30 @@ +description: North Carolina provides the following child tax credit amount for single filers. +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 125 + 2018-01-01: 0 + - threshold: + 2015-01-01: 20_000 + amount: + 2015-01-01: 100 + 2018-01-01: 0 + - threshold: + 2015-01-01: 50_000 + amount: + 2015-01-01: 0 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + period: year + label: North Carolina CTC single filer amount + reference: + - title: North Carolina Department of Revenue - Credit for Children + href: https://www.ncdor.gov/taxes-forms/individual-income-tax/credit-children + - title: Code of North Carolina | § 105-153.10 Repealed by Session Laws. + href: https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_105/GS_105-153.10.html + - title: North Carolina Department of Revenue - 2017 Individual Income Tax Instructions + href: https://www.ncdor.gov/documents/files/2017-d-401-individual-income-tax-instructions/open diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/widow.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/widow.yaml new file mode 100644 index 000000000..3418f4201 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/ctc/widow.yaml @@ -0,0 +1,30 @@ +description: North Carolina provides the following child tax credit amount for widow filers. +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 125 + 2018-01-01: 0 + - threshold: + 2015-01-01: 40_000 + amount: + 2015-01-01: 100 + 2018-01-01: 0 + - threshold: + 2015-01-01: 100_000 + amount: + 2015-01-01: 0 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + period: year + label: North Carolina CTC widow filer amount + reference: + - title: North Carolina Department of Revenue - Credit for Children + href: https://www.ncdor.gov/taxes-forms/individual-income-tax/credit-children + - title: Code of North Carolina | § 105-153.10 Repealed by Session Laws. + href: https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_105/GS_105-153.10.html + - title: North Carolina Department of Revenue - 2017 Individual Income Tax Instructions + href: https://www.ncdor.gov/documents/files/2017-d-401-individual-income-tax-instructions/open diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..3216211c0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/credits/non_refundable.yaml @@ -0,0 +1,15 @@ +description: North Carolina provides these non refundable income tax credits. +values: + 2017-01-01: + - nc_ctc +# The ctc has been discontinued in 2018 but due to the absence of other non-refundable credits, we keep it in the list. +# credits it can not be reflected in this list +metadata: + reference: + - title: 2022 Individual Income Tax Credits + href: https://www.ncdor.gov/2022-d-400tc-web-fill-version/open + - title: 2017 Individual Income Tax Credits + href: https://www.ncdor.gov/documents/files/2017-d-400tc-webfill-0/open + unit: currency-USD + period: year + label: North Carolina non-refundable income tax credits diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/head_of_household.yaml new file mode 100644 index 000000000..336cc1098 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/head_of_household.yaml @@ -0,0 +1,50 @@ +description: North Carolina provides a child deduction of this amount per eligible child for head-of-household filers. + +metadata: + label: North Carolina child deduction per eligible child for head-of-household filers + type: single_amount + threshold_unit: currency-USD # federal adjusted gross income + amount_unit: currency-USD # NC child deduction amount per eligible child + reference: + - title: 2021 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2021-d-401-individual-income-tax-instructions/open#page=13 + - title: 2022 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2022-d-401-individual-income-tax-instructions/open#page=13 + - title: Code of North Carolina | § 105-153.10 (a1) + href: https://law.justia.com/codes/north-carolina/2022/chapter-105/article-4/section-105-153-5/ + +brackets: # ranges are > lower threshold and <= upper threshold + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 2_500 + 2022-01-01: 3_000 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 2_000 + 2022-01-01: 2_500 + - threshold: + 2021-01-01: 45_000 + amount: + 2021-01-01: 1_500 + 2022-01-01: 2_000 + - threshold: + 2021-01-01: 60_000 + amount: + 2021-01-01: 1_000 + 2022-01-01: 1_500 + - threshold: + 2021-01-01: 75_000 + amount: + 2021-01-01: 500 + 2022-01-01: 1_000 + - threshold: + 2021-01-01: 90_000 + amount: + 2021-01-01: 0 + 2022-01-01: 500 + - threshold: + 2021-01-01: 105_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/joint.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/joint.yaml new file mode 100644 index 000000000..2e5ea8851 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/joint.yaml @@ -0,0 +1,50 @@ +description: North Carolina provides a child deduction of this amount per eligible child for joint filers. + +metadata: + label: North Carolina child deduction per eligible child for joint filers + type: single_amount + threshold_unit: currency-USD # federal adjusted gross income + amount_unit: currency-USD # NC child deduction amount per eligible child + reference: + - title: 2021 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2021-d-401-individual-income-tax-instructions/open#page=13 + - title: 2022 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2022-d-401-individual-income-tax-instructions/open#page=13 + - title: Code of North Carolina | § 105-153.10 (a1) + href: https://law.justia.com/codes/north-carolina/2022/chapter-105/article-4/section-105-153-5/ + +brackets: # ranges are > lower threshold and <= upper threshold + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 2_500 + 2022-01-01: 3_000 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 2_000 + 2022-01-01: 2_500 + - threshold: + 2021-01-01: 60_000 + amount: + 2021-01-01: 1_500 + 2022-01-01: 2_000 + - threshold: + 2021-01-01: 80_000 + amount: + 2021-01-01: 1_000 + 2022-01-01: 1_500 + - threshold: + 2021-01-01: 100_000 + amount: + 2021-01-01: 500 + 2022-01-01: 1_000 + - threshold: + 2021-01-01: 120_000 + amount: + 2021-01-01: 0 + 2022-01-01: 500 + - threshold: + 2021-01-01: 140_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/separate.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/separate.yaml new file mode 100644 index 000000000..0f9127853 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/separate.yaml @@ -0,0 +1,50 @@ +description: North Carolina provides a child deduction of this amount per eligible child for separate filers. + +metadata: + label: North Carolina child deduction per eligible child for separate filers + type: single_amount + threshold_unit: currency-USD # federal adjusted gross income + amount_unit: currency-USD # NC child deduction amount per eligible child + reference: + - title: 2021 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2021-d-401-individual-income-tax-instructions/open#page=13 + - title: 2022 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2022-d-401-individual-income-tax-instructions/open#page=13 + - title: Code of North Carolina | § 105-153.10 (a1) + href: https://law.justia.com/codes/north-carolina/2022/chapter-105/article-4/section-105-153-5/ + +brackets: # ranges are > lower threshold and <= upper threshold + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 2_500 + 2022-01-01: 3_000 + - threshold: + 2021-01-01: 20_000 + amount: + 2021-01-01: 2_000 + 2022-01-01: 2_500 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 1_500 + 2022-01-01: 2_000 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 1_000 + 2022-01-01: 1_500 + - threshold: + 2021-01-01: 50_000 + amount: + 2021-01-01: 500 + 2022-01-01: 1_000 + - threshold: + 2021-01-01: 60_000 + amount: + 2021-01-01: 0 + 2022-01-01: 500 + - threshold: + 2021-01-01: 70_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/single.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/single.yaml new file mode 100644 index 000000000..a3db8aad0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/single.yaml @@ -0,0 +1,50 @@ +description: North Carolina provides a child deduction of this amount per eligible child for single filers. + +metadata: + label: North Carolina child deduction per eligible child for single filers + type: single_amount + threshold_unit: currency-USD # federal adjusted gross income + amount_unit: currency-USD # NC child deduction amount per eligible child + reference: + - title: 2021 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2021-d-401-individual-income-tax-instructions/open#page=13 + - title: 2022 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2022-d-401-individual-income-tax-instructions/open#page=13 + - title: Code of North Carolina | § 105-153.10 (a1) + href: https://law.justia.com/codes/north-carolina/2022/chapter-105/article-4/section-105-153-5/ + +brackets: # ranges are > lower threshold and <= upper threshold + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 2_500 + 2022-01-01: 3_000 + - threshold: + 2021-01-01: 20_000 + amount: + 2021-01-01: 2_000 + 2022-01-01: 2_500 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 1_500 + 2022-01-01: 2_000 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 1_000 + 2022-01-01: 1_500 + - threshold: + 2021-01-01: 50_000 + amount: + 2021-01-01: 500 + 2022-01-01: 1_000 + - threshold: + 2021-01-01: 60_000 + amount: + 2021-01-01: 0 + 2022-01-01: 500 + - threshold: + 2021-01-01: 70_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/widow.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/widow.yaml new file mode 100644 index 000000000..db9a91ab1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/child/widow.yaml @@ -0,0 +1,50 @@ +description: North Carolina provides a child deduction of this amount per eligible child for widow filers. + +metadata: + label: North Carolina child deduction per eligible child for widow filers. + type: single_amount + threshold_unit: currency-USD # federal adjusted gross income + amount_unit: currency-USD # NC child deduction amount per eligible child + reference: + - title: 2021 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2021-d-401-individual-income-tax-instructions/open#page=13 + - title: 2022 North Carolina Form D-401, Line 10 + href: https://www.ncdor.gov/2022-d-401-individual-income-tax-instructions/open#page=13 + - title: Code of North Carolina | § 105-153.10 (a1) + href: https://law.justia.com/codes/north-carolina/2022/chapter-105/article-4/section-105-153-5/ + +brackets: # ranges are > lower threshold and <= upper threshold + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 2_500 + 2022-01-01: 3_000 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 2_000 + 2022-01-01: 2_500 + - threshold: + 2021-01-01: 60_000 + amount: + 2021-01-01: 1_500 + 2022-01-01: 2_000 + - threshold: + 2021-01-01: 80_000 + amount: + 2021-01-01: 1_000 + 2022-01-01: 1_500 + - threshold: + 2021-01-01: 100_000 + amount: + 2021-01-01: 500 + 2022-01-01: 1_000 + - threshold: + 2021-01-01: 120_000 + amount: + 2021-01-01: 0 + 2022-01-01: 500 + - threshold: + 2021-01-01: 140_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/deductions.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/deductions.yaml new file mode 100644 index 000000000..57ea86410 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/deductions.yaml @@ -0,0 +1,18 @@ +description: North Carolina allows for these deductions from taxable income. +values: + 2021-01-01: + - us_govt_interest + - nc_standard_or_itemized_deductions + - nc_child_deduction + - taxable_social_security + + +metadata: + unit: list + reference: + - title: N.C. Gen. Stat. § 105-153.5 + href: https://casetext.com/statute/general-statutes-of-north-carolina/chapter-105-taxation/subchapter-i-levy-of-taxes/article-4-income-tax/part-2-individual-income-tax/section-105-1535-modifications-to-adjusted-gross-income + - title: 2022 D-400 Schedule S + href: https://www.ncdor.gov/2022-d-400-schedule-s-web-fill-version/open + - title: 2021 D-400 Schedule S + href: https://www.ncdor.gov/2021-d-400-schedule-s-north-carolina-supplemental-schedule-web/open diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/itemized/cap/mortgage_and_property_tax.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/itemized/cap/mortgage_and_property_tax.yaml new file mode 100644 index 000000000..29a8657c3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/itemized/cap/mortgage_and_property_tax.yaml @@ -0,0 +1,12 @@ +description: North Carolina caps the mortgage interest and property tax deduction at this amount. +values: + 2021-01-01: 20_000 +metadata: + lable: North Carolina mortgage interest and property tax deduction cap + period: year + unit: currency-USD + reference: + - title: North Carolina Department of Revenue + href: https://www.ncdor.gov/taxes-forms/individual-income-tax/north-carolina-standard-deduction-or-north-carolina-itemized-deductions + - title: N.C. Gen. Stat. § 105-153.5 (2) (b) + href: https://casetext.com/statute/general-statutes-of-north-carolina/chapter-105-taxation/subchapter-i-levy-of-taxes/article-4-income-tax/part-2-individual-income-tax/section-105-1535-modifications-to-adjusted-gross-income diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/standard/amount.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/standard/amount.yaml new file mode 100644 index 000000000..bfa266c93 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/deductions/standard/amount.yaml @@ -0,0 +1,35 @@ +description: North Carolina provides this standard deduction amount. +metadata: + label: North Carolina standard deduction amount + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: 2021 North Carolina Form D-401, Line 11 + href: https://www.ncdor.gov/2021-d-401-individual-income-tax-instructions/open#page=14 + - title: 2022 North Carolina Form D-401, Line 11 + href: https://www.ncdor.gov/2022-d-401-individual-income-tax-instructions/open#page=14 + - title: Code of North Carolina | § 105-153.10 (a) (1) + href: https://law.justia.com/codes/north-carolina/2022/chapter-105/article-4/section-105-153-5/ + +SINGLE: + 2019-01-01: 10_000 + 2020-01-01: 10_750 + 2022-01-01: 12_750 +JOINT: + 2019-01-01: 20_000 + 2020-01-01: 21_500 + 2022-01-01: 25_500 +WIDOW: + 2019-01-01: 20_000 + 2020-01-01: 21_500 + 2022-01-01: 25_500 +SEPARATE: + 2019-01-01: 10_000 + 2020-01-01: 10_750 + 2022-01-01: 12_750 +HEAD_OF_HOUSEHOLD: + 2019-01-01: 15_000 + 2020-01-01: 16_125 + 2022-01-01: 19_125 diff --git a/fiscalsim_us/parameters/gov/states/nc/tax/income/rate.yaml b/fiscalsim_us/parameters/gov/states/nc/tax/income/rate.yaml index 7ef24071b..586ad74ed 100644 --- a/fiscalsim_us/parameters/gov/states/nc/tax/income/rate.yaml +++ b/fiscalsim_us/parameters/gov/states/nc/tax/income/rate.yaml @@ -1,15 +1,20 @@ -description: North Carolina taxes the personal income at this rate. +description: North Carolina taxes individual taxable income at this rate. +metadata: + unit: /1 + period: year + label: North Carolina individual income tax rate + reference: + - title: North Carolina Department of Revenue - Tax Rate Schedules + href: https://www.ncdor.gov/taxes-forms/tax-rate-schedules + - title: 2022 North Carolina Form D-400, Line 15 + href: https://www.ncdor.gov/2022-d-400-handwritten-version/open#page=2 values: + 2015-01-01: 0.0575 + 2017-01-01: 0.05499 2019-01-01: 0.0525 + 2022-01-01: 0.0499 2023-01-01: 0.0475 2024-01-01: 0.046 2025-01-01: 0.045 2026-01-01: 0.0425 2027-01-01: 0.0399 -metadata: - unit: /1 - period: year - label: North Carolina income tax rate - reference: - - title: North Carolina Department of Revenue - Tax Rate Schedules - href: https://www.ncdor.gov/taxes-forms/tax-rate-schedules#:~:text=For%20Tax%20Year%202023%2C%20the,is%205.25%25%20(0.0525) diff --git a/fiscalsim_us/parameters/gov/states/nd/tax/income/taxable_income/additions/sources.yaml b/fiscalsim_us/parameters/gov/states/nd/tax/income/taxable_income/additions/sources.yaml index 5ed3725c7..8fb525419 100644 --- a/fiscalsim_us/parameters/gov/states/nd/tax/income/taxable_income/additions/sources.yaml +++ b/fiscalsim_us/parameters/gov/states/nd/tax/income/taxable_income/additions/sources.yaml @@ -1,17 +1,17 @@ -description: North Dakota adds these variables to US taxable income when computing its taxable income. -values: - 2021-01-01: - - c05700 # lump-sum distributions from federal Form 4972 - -metadata: - unit: variable - label: ND additions to US taxable income - reference: - - title: 2021 ND income tax form - href: https://www.tax.nd.gov/sites/www/files/documents/forms/form-nd-1-2021.pdf - - title: 2021 ND income tax instructions, line 2 - href: https://www.tax.nd.gov/sites/www/files/documents/forms/2021-individual-income-tax-booklet.pdf#page=14 - - title: 2022 ND income tax form - href: https://www.tax.nd.gov/sites/www/files/documents/forms/form-nd-1-2022.pdf - - title: 2022 ND income tax instructions, line 2 - href: https://www.tax.nd.gov/sites/www/files/documents/forms/2022-individual-income-tax-booklet.pdf#page=14 +description: North Dakota adds these variables to US taxable income when computing its taxable income. +values: + 2021-01-01: + - form_4972_lumpsum_distributions + +metadata: + unit: variable + label: ND additions to US taxable income + reference: + - title: 2021 ND income tax form + href: https://www.tax.nd.gov/sites/www/files/documents/forms/form-nd-1-2021.pdf + - title: 2021 ND income tax instructions, line 2 + href: https://www.tax.nd.gov/sites/www/files/documents/forms/2021-individual-income-tax-booklet.pdf#page=14 + - title: 2022 ND income tax form + href: https://www.tax.nd.gov/sites/www/files/documents/forms/form-nd-1-2022.pdf + - title: 2022 ND income tax instructions, line 2 + href: https://www.tax.nd.gov/sites/www/files/documents/forms/2022-individual-income-tax-booklet.pdf#page=14 diff --git a/fiscalsim_us/parameters/gov/states/ne/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/ne/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ne/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/ne/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/ne/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ne/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/nh/README.md b/fiscalsim_us/parameters/gov/states/nh/README.md new file mode 100644 index 000000000..e8a4044d1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nh/README.md @@ -0,0 +1 @@ +# New Hampshire diff --git a/fiscalsim_us/parameters/gov/states/nh/tax/credits/education/rate.yaml b/fiscalsim_us/parameters/gov/states/nh/tax/credits/education/rate.yaml new file mode 100644 index 000000000..c820beadd --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nh/tax/credits/education/rate.yaml @@ -0,0 +1,21 @@ +description: New Hampshire's Education Tax Credit equals this share of charitable donations, depending on the amount. +metadata: + threshold_unit: currency-USD + rate_unit: /1 + threshold_period: year + type: marginal_rate + label: New Hampshire Education Tax Credit + reference: + - title: TITLE V- TAXATION - CHAPTER 77-G - EDUCATION TAX CREDIT - Section 77-G:4 + href: https://www.gencourt.state.nh.us/rsa/html/V/77-G/77-G-4.htm + - title: The NH Education Tax Credit Program + href: https://www.revenue.nh.gov/quick-links/education-tax-credit.htm +brackets: + - threshold: + 2013-01-01: 0 + rate: + 2013-01-01: 0.85 + - threshold: + 2013-01-01: 600_000 + rate: + 2013-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/base.yaml b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/base.yaml new file mode 100644 index 000000000..2882e7855 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/base.yaml @@ -0,0 +1,29 @@ +description: New Hampshire provides this base exemption based on filing status. +metadata: + unit: currency-USD + period: year + breakdown: + - filing_status + label: New Hampshire base exemption amount + reference: + - title: TITLE V - TAXATION - CHAPTER 77 - TAXATION OF INCOMES - Section 77:5 + href: https://www.gencourt.state.nh.us/rsa/html/V/77/77-5.htm + - title: 2022 DP-10 Interest and Dividends Tax Return Instructions + href: https://www.revenue.nh.gov/forms/2023/documents/dp-10-instructions-2022.pdf#page=4 + - title: 2021 New Hampshire DP-10 Form + href: https://www.revenue.nh.gov/forms/2022/documents/dp-10-2021-print.pdf#page=3 +SINGLE: + 2021-01-01: 2_400 + 2027-01-01: 0 +JOINT: + 2021-01-01: 4_800 + 2027-01-01: 0 +SEPARATE: + 2021-01-01: 2_400 + 2027-01-01: 0 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 2_400 + 2027-01-01: 0 +WIDOW: + 2021-01-01: 2_400 + 2027-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/blind_addition.yaml b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/blind_addition.yaml new file mode 100644 index 000000000..afb8b929b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/blind_addition.yaml @@ -0,0 +1,14 @@ +description: New Hampshire provides an exemption of this amount per blind filer. +metadata: + unit: currency-USD + label: New Hampshire blind exemption + reference: + - title: TITLE V - TAXATION - CHAPTER 77 - TAXATION OF INCOMES - Section 77:5 + href: https://www.gencourt.state.nh.us/rsa/html/V/77/77-5.htm + - title: 2022 DP-10 Interest and Dividends Tax Return Instructions + href: https://www.revenue.nh.gov/forms/2023/documents/dp-10-instructions-2022.pdf#page=4 + - title: 2021 New Hampshire DP-10 Form + href: https://www.revenue.nh.gov/forms/2022/documents/dp-10-2021-print.pdf#page=3 +values: + 2021-01-01: 1_200 + 2027-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/disabled_addition.yaml b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/disabled_addition.yaml new file mode 100644 index 000000000..20099bca3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/disabled_addition.yaml @@ -0,0 +1,14 @@ +description: New Hampshire provided an exemption amount for disabled filers below the age of 65. +metadata: + unit: currency-USD + label: New Hampshire disabled exemption amount + reference: + - title: TITLE V - TAXATION - CHAPTER 77 - TAXATION OF INCOMES - Section 77:5 + href: https://www.gencourt.state.nh.us/rsa/html/V/77/77-5.htm + - title: 2022 DP-10 Interest and Dividends Tax Return Instructions + href: https://www.revenue.nh.gov/forms/2023/documents/dp-10-instructions-2022.pdf#page=4 + - title: 2021 New Hampshire DP-10 Form + href: https://www.revenue.nh.gov/forms/2022/documents/dp-10-2021-print.pdf#page=3 +values: + 2021-01-01: 1_200 + 2027-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/old_age_addition.yaml b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/old_age_addition.yaml new file mode 100644 index 000000000..cc8250f56 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/amount/old_age_addition.yaml @@ -0,0 +1,14 @@ +description: New Hampshire provides an old age exemption amount for filers of or above the age 65. +metadata: + unit: currency-USD + label: New Hampshire old age exemption amount + reference: + - title: TITLE V - TAXATION - CHAPTER 77 - TAXATION OF INCOMES - Section 77:5 + href: https://www.gencourt.state.nh.us/rsa/html/V/77/77-5.htm + - title: 2022 DP-10 Interest and Dividends Tax Return Instructions + href: https://www.revenue.nh.gov/forms/2023/documents/dp-10-instructions-2022.pdf#page=4 + - title: 2021 New Hampshire DP-10 Form + href: https://www.revenue.nh.gov/forms/2022/documents/dp-10-2021-print.pdf#page=3 +values: + 2021-01-01: 1_200 + 2027-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/disability_age_threshold.yaml b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/disability_age_threshold.yaml new file mode 100644 index 000000000..64f47d4e8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/disability_age_threshold.yaml @@ -0,0 +1,11 @@ +description: New Hampshire provides an exemption for disabled filers below this age. +metadata: + unit: currency-USD + label: New Hampshire disabled exemption age threshold + reference: + - title: TITLE V - TAXATION - CHAPTER 77 - TAXATION OF INCOMES - Section 77:5 + href: https://www.gencourt.state.nh.us/rsa/html/V/77/77-5.htm + - title: 2021 New Hampshire DP-10 Form + href: https://www.revenue.nh.gov/forms/2022/documents/dp-10-2021-print.pdf#page=3 +values: + 2021-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/old_age_eligibility.yaml b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/old_age_eligibility.yaml new file mode 100644 index 000000000..cd193f5b1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nh/tax/income/exemptions/old_age_eligibility.yaml @@ -0,0 +1,11 @@ +description: New Hampshire provides an exemption for taxpayers on or older than this age. +metadata: + unit: currency-USD + label: New Hampshire old age exemption eligibility + reference: + - title: TITLE V - TAXATION - CHAPTER 77 - TAXATION OF INCOMES - Section 77:5 + href: https://www.gencourt.state.nh.us/rsa/html/V/77/77-5.htm + - title: 2021 New Hampshire DP-10 Form + href: https://www.revenue.nh.gov/forms/2022/documents/dp-10-2021-print.pdf#page=3 +values: + 2021-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/nh/tax/income/main.yaml b/fiscalsim_us/parameters/gov/states/nh/tax/income/rate.yaml similarity index 64% rename from fiscalsim_us/parameters/gov/states/nh/tax/income/main.yaml rename to fiscalsim_us/parameters/gov/states/nh/tax/income/rate.yaml index 469e041a0..cb3988bab 100644 --- a/fiscalsim_us/parameters/gov/states/nh/tax/income/main.yaml +++ b/fiscalsim_us/parameters/gov/states/nh/tax/income/rate.yaml @@ -1,10 +1,11 @@ -description: New Hampshire taxes bonds, notes, and money at interest at this rate. +description: New Hampshire taxes interest and dividends at this rate. values: - 2022-01-01: 0.05 + 2021-01-01: 0.05 2023-01-01: 0.04 2024-01-01: 0.03 2025-01-01: 0.02 2026-01-01: 0.01 + 2027-01-01: 0 metadata: unit: /1 period: year @@ -13,4 +14,6 @@ metadata: - title: New Hampshire Statutes - TITLE V - CHAPTER 77 - Section 77:1 href: https://www.gencourt.state.nh.us/rsa/html/V/77/77-1.htm - title: New Hampshire Statutes - TITLE V - CHAPTER 77 - Section 77:4 - href: https://www.gencourt.state.nh.us/rsa/html/V/77/77-4.htm + href: https://www.gencourt.state.nh.us/rsa/html/V/77/77-4.htm + - title: 2021 New Hampshire DP-10 Form + href: https://www.revenue.nh.gov/forms/2022/documents/dp-10-2021-print.pdf#page=4 diff --git a/fiscalsim_us/parameters/gov/states/nj/njdhs/README.md b/fiscalsim_us/parameters/gov/states/nj/njdhs/README.md new file mode 100644 index 000000000..4f379ec3e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/njdhs/README.md @@ -0,0 +1 @@ +# Department of Human Services diff --git a/fiscalsim_us/parameters/gov/states/nj/njdhs/index.yaml b/fiscalsim_us/parameters/gov/states/nj/njdhs/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/njdhs/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/nj/njdhs/tanf/README.md b/fiscalsim_us/parameters/gov/states/nj/njdhs/tanf/README.md new file mode 100644 index 000000000..eb8aeb3f9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/njdhs/tanf/README.md @@ -0,0 +1 @@ +# Temporary Assistance for Needy Families diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/all_exclusions.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/all_exclusions.yaml new file mode 100644 index 000000000..c405601f0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/all_exclusions.yaml @@ -0,0 +1,9 @@ +description: All exclusions from New Jersey total income. +metadata: + unit: variable + label: New Jersey exclusions from New Jersey total income +values: + 2021-01-01: + - nj_pension_retirement_exclusion + - nj_other_retirement_income_exclusion + - nj_other_retirement_special_exclusion diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/cdcc/rate.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/cdcc/rate.yaml index f28ce20e7..1b4035337 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/cdcc/rate.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/cdcc/rate.yaml @@ -1,37 +1,39 @@ -description: New Jersey matches this share of the federal Child and Dependent Care Credit, depending on taxable income. -metadata: - threshold_unit: currency-USD - amount_unit: /1 - threshold_period: year - type: single_amount - label: New Jersey Child and Dependent Care Credit match - reference: - - title: Child and Dependent Care Credit - - href: https://www.nj.gov/treasury/taxation/depcarecred.shtml - - title: Instructions for Form NJ-1040 (line 64) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=44 -brackets: - - threshold: - 2022-01-01: 0 - amount: - 2022-01-01: 0.5 - - threshold: - 2022-01-01: 30_000 - amount: - 2022-01-01: 0.4 - - threshold: - 2022-01-01: 60_000 - amount: - 2022-01-01: 0.3 - - threshold: - 2022-01-01: 90_000 - amount: - 2022-01-01: 0.2 - - threshold: - 2022-01-01: 120_000 - amount: - 2022-01-01: 0.1 - - threshold: - 2022-01-01: 150_000 - amount: - 2022-01-01: 0 +description: New Jersey matches this share of the federal Child and Dependent Care Credit, depending on taxable income. +metadata: + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: year + type: single_amount + label: New Jersey Child and Dependent Care Credit match rate + reference: + - title: Child and Dependent Care Credit + href: https://www.nj.gov/treasury/taxation/depcarecred.shtml + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=44 + - title: Instructions for Form NJ-1040 (line 64) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=44 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 0.5 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 0.4 + - threshold: + 2021-01-01: 60_000 + amount: + 2021-01-01: 0.3 + - threshold: + 2021-01-01: 90_000 + amount: + 2021-01-01: 0.2 + - threshold: + 2021-01-01: 120_000 + amount: + 2021-01-01: 0.1 + - threshold: + 2021-01-01: 150_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/README.md b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/README.md new file mode 100644 index 000000000..412bf336c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/README.md @@ -0,0 +1 @@ +# Child Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/amount.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/amount.yaml new file mode 100644 index 000000000..89ee3d6dd --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/amount.yaml @@ -0,0 +1,53 @@ +description: New Jersey provides this child credit amount for each qualifying dependent, depending on taxable income. +metadata: + type: single_amount + threshold_unit: currency-USD + threshold_period: year + amount_unit: currency-USD + label: New Jersey Child Tax Credit + reference: + - title: New Jersey Statutes Title 54A:4-17.1(1)(a) Child tax credit, income limit. + href: https://lis.njleg.state.nj.us/nxt/gateway.dll?f=templates&fn=default.htm&vid=Publish:10.1048/Enu + # 2021 form listed to show the absence of the credit. + - title: Instructions for 2021 Form NJ-1040 + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf + - title: Instructions for 2022 Form NJ-1040 (line 65) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=45 + # Not yet reflected in the statute, but this law schedules it to double in 2023. + - title: P.L. 2023, Chapter 72 (1)(a) + href: https://pub.njleg.state.nj.us/Bills/2022/AL23/72_.PDF +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 0 + 2022-01-01: 500 + 2023-01-01: 1_000 + - threshold: + 2021-01-01: 30_000 + amount: + 2021-01-01: 0 + 2022-01-01: 400 + 2023-01-01: 800 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 0 + 2022-01-01: 300 + 2023-01-01: 600 + - threshold: + 2021-01-01: 50_000 + amount: + 2021-01-01: 0 + 2022-01-01: 200 + 2023-01-01: 400 + - threshold: + 2021-01-01: 60_000 + amount: + 2021-01-01: 0 + 2022-01-01: 100 + 2023-01-01: 200 + - threshold: + 2021-01-01: 80_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/nj_child_tax_credit/ineligible_age.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/ineligible_age.yaml similarity index 59% rename from fiscalsim_us/parameters/gov/states/nj/tax/income/credits/nj_child_tax_credit/ineligible_age.yaml rename to fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/ineligible_age.yaml index ff1dff53d..3f4d46734 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/nj_child_tax_credit/ineligible_age.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/ctc/ineligible_age.yaml @@ -1,10 +1,13 @@ description: New Jersey provides a child tax credit to filers for each dependent below this age. -values: - 2022-01-01: 6 metadata: - reference: - - title: Instructions for Form NJ-1040 (line 65) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=45 unit: year period: year label: New Jersey child tax credit ineligible age + reference: + - title: New Jersey Statutes Title 54A:4-17.1(1)(a) Child tax credit, income limit. + href: https://lis.njleg.state.nj.us/nxt/gateway.dll?f=templates&fn=default.htm&vid=Publish:10.1048/Enu + - title: Instructions for Form NJ-1040 (line 65) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=45 +values: + 2021-01-01: 0 # NJ CTC did not exist before 2022 + 2022-01-01: 6 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/nj_child_tax_credit/rate.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/nj_child_tax_credit/rate.yaml deleted file mode 100644 index 1c8b1c5b8..000000000 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/nj_child_tax_credit/rate.yaml +++ /dev/null @@ -1,40 +0,0 @@ -description: New Jersey provides this credit amount for each qualifying dependent, depending on income. -metadata: - type: single_amount - threshold_unit: currency-USD - threshold_period: year - amount_unit: 1 - label: New Jersey Child Tax Credit - reference: - - title: Instructions for 2022 Form NJ-1040 (line 65) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=45 -brackets: - - threshold: - 2021-01-01: 0 - amount: - 2021-01-01: 0 - 2022-01-01: 500 - - threshold: - 2021-01-01: 30_000 - amount: - 2021-01-01: 0 - 2022-01-01: 400 - - threshold: - 2021-01-01: 40_000 - amount: - 2021-01-01: 0 - 2022-01-01: 300 - - threshold: - 2021-01-01: 50_000 - amount: - 2021-01-01: 0 - 2022-01-01: 200 - - threshold: - 2021-01-01: 60_000 - amount: - 2021-01-01: 0 - 2022-01-01: 100 - - threshold: - 2021-01-01: 80_000 - amount: - 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/property_tax/senior_qualifying_age.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/property_tax/senior_qualifying_age.yaml index 7e76dea32..a88014b93 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/property_tax/senior_qualifying_age.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/credits/property_tax/senior_qualifying_age.yaml @@ -6,4 +6,4 @@ metadata: - title: 2022 New Jersey Revised Statutes Title 54A - New Jersey Gross Income Tax Act Section 54A:3A-20 - Credit instead of deduction href: https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-3a-20/ values: - 2022-01-01: 65 + 2021-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/deductions/property_tax/qualifying_rent_fraction.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/deductions/property_tax/qualifying_rent_fraction.yaml index f1ad1c8fe..8b9027636 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/deductions/property_tax/qualifying_rent_fraction.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/deductions/property_tax/qualifying_rent_fraction.yaml @@ -1,10 +1,12 @@ description: New Jersey considers this percent of rent paid property taxes. -values: - 2022-01-01: 0.18 metadata: - reference: - - title: Instructions for Form NJ-1040 (line 40a) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=30 unit: /1 period: year label: New Jersey percent of rent considered property taxes + reference: + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=29 + - title: Instructions for Form NJ-1040 (line 40a) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=30 +values: + 2021-01-01: 0.18 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/deductions/property_tax/threshold.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/deductions/property_tax/threshold.yaml index b83ea2afd..1680b08f9 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/deductions/property_tax/threshold.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/deductions/property_tax/threshold.yaml @@ -1,10 +1,12 @@ description: New Jersey allows for a property tax credit or deduction on up to this amount of paid property taxes. -values: - 2022-01-01: 15_000 metadata: - reference: - - title: Instructions for Form NJ-1040 (Worksheet H, Line 2) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=30 unit: currency-USD period: year label: New Jersey property tax deduction/credit threshold + reference: + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=30 + - title: Instructions for Form NJ-1040 (Worksheet H, Line 2) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=30 +values: + 2021-01-01: 15_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/age_threshold.yaml new file mode 100644 index 000000000..e1106d10e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/age_threshold.yaml @@ -0,0 +1,11 @@ +description: Filers (and/or spouses) must be at or above this age to subtract retirement income from taxable income +metadata: + type: single_amount + label: NJ pension/retirement exclusion qualifying age + reference: + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=21 + - title: Instructions for Form NJ-1040 (line 28a) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21 +values: + 2021-01-01: 62 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/max_amount.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/max_amount.yaml new file mode 100644 index 000000000..b8c808637 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/max_amount.yaml @@ -0,0 +1,62 @@ +description: Filers (and/or spouses) can exclude no more than this amount of retirement income from taxable income +metadata: + unit: currency-USD + label: NJ pension/retirement maximum exclusion amount + reference: + - title: 2022 New Jersey Revised Statutes Title 54A - New Jersey Gross Income Tax Act Section 54A:6-10 - Pensions and annuities. + href: https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-6-10/ + - title: 2022 New Jersey Revised Statutes Title 54A - New Jersey Gross Income Tax Act Section 54A:6-15 - Other retirement income. + href: https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-6-15/ + - title: Instructions for Form NJ-1040 (lines 28a-28b) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21 + - filing_status +SINGLE: + 2000-01-01: 9_375 + 2001-01-01: 11_250 + 2002-01-01: 13_125 + 2003-01-01: 15_000 + 2017-01-01: 30_000 + 2018-01-01: 45_000 + 2019-01-01: 60_000 + 2020-01-01: 75_000 + 2021-01-01: 75_000 +SEPARATE: + 2000-01-01: 6_250 + 2001-01-01: 7_500 + 2002-01-01: 8_750 + 2003-01-01: 10_000 + 2017-01-01: 20_000 + 2018-01-01: 30_000 + 2019-01-01: 40_000 + 2020-01-01: 50_000 + 2021-01-01: 50_000 +HEAD_OF_HOUSEHOLD: + 2000-01-01: 9_375 + 2001-01-01: 11_250 + 2002-01-01: 13_125 + 2003-01-01: 15_000 + 2017-01-01: 30_000 + 2018-01-01: 45_000 + 2019-01-01: 60_000 + 2020-01-01: 75_000 + 2021-01-01: 75_000 +JOINT: + 2000-01-01: 12_500 + 2001-01-01: 15_000 + 2002-01-01: 17_500 + 2003-01-01: 20_000 + 2017-01-01: 40_000 + 2018-01-01: 60_000 + 2019-01-01: 80_000 + 2020-01-01: 100_000 + 2021-01-01: 100_000 +WIDOW: + 2000-01-01: 9_375 + 2001-01-01: 11_250 + 2002-01-01: 13_125 + 2003-01-01: 15_000 + 2017-01-01: 30_000 + 2018-01-01: 45_000 + 2019-01-01: 60_000 + 2020-01-01: 75_000 + 2021-01-01: 75_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/other_retirement_income/earned_income_threshold.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/other_retirement_income/earned_income_threshold.yaml new file mode 100644 index 000000000..74875aab0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/other_retirement_income/earned_income_threshold.yaml @@ -0,0 +1,11 @@ +description: New Jersey filers with more than this amount of earned income are not eligible for other retirement exclusion. +metadata: + type: currency-USD + label: NJ other retirement earned income exclusion threshold. + reference: + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=22 + - title: 2022 New Jersey Revised Statutes Title 54A - New Jersey Gross Income Tax Act Section 54A:6-15 - Other retirement income. + href: https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-6-15/ +values: + 2021-01-01: 3_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/other_retirement_income/income_threshold.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/other_retirement_income/income_threshold.yaml new file mode 100644 index 000000000..065b0b69f --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/other_retirement_income/income_threshold.yaml @@ -0,0 +1,10 @@ +description: New Jersey filers above this income are not eligible for other income exclusion. +metadata: + type: currency-USD + label: NJ other retirement income exclusion threshold. + reference: + - title: Instructions for Form NJ-1040 (line 28a) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21 +values: + 2005-01-01: 100_000 + 2021-01-01: 150_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/pension/agi_subtractions.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/pension/agi_subtractions.yaml new file mode 100644 index 000000000..6aec706b8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/pension/agi_subtractions.yaml @@ -0,0 +1,9 @@ +description: Deductions from AGI to calculate qualifying income for pension retirement exclusion. +values: + 2021-01-01: + - tax_exempt_interest_income + - tax_exempt_pension_income + - taxable_social_security +metadata: + unit: variable + label: AGI subtractions for qualifying income for pension retirement exclusion diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/head_of_household.yaml new file mode 100644 index 000000000..ac256131e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/head_of_household.yaml @@ -0,0 +1,27 @@ +description: New Jersey allows the exclusion of this fraction of retirement income depending on total income. +metadata: + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: year + type: single_amount + label: New Jersey pension/retirement exclusion fraction + reference: + - title: Instructions for Form NJ-1040 (line 64) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 1 + - threshold: + 2021-01-01: 100_000 + amount: + 2021-01-01: 0.375 + - threshold: + 2021-01-01: 125_000 + amount: + 2021-01-01: 0.1875 + - threshold: + 2021-01-01: 150_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/joint.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/joint.yaml new file mode 100644 index 000000000..bfc9ae228 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/joint.yaml @@ -0,0 +1,27 @@ +description: New Jersey allows the exclusion of this fraction of retirement income depending on total income. +metadata: + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: year + type: single_amount + label: New Jersey pension/retirement exclusion fraction + reference: + - title: Instructions for Form NJ-1040 (line 64) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 1 + - threshold: + 2021-01-01: 100_000 + amount: + 2021-01-01: 0.5 + - threshold: + 2021-01-01: 125_000 + amount: + 2021-01-01: 0.25 + - threshold: + 2021-01-01: 150_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/separate.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/separate.yaml new file mode 100644 index 000000000..2d31340c4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/separate.yaml @@ -0,0 +1,27 @@ +description: New Jersey allows the exclusion of this fraction of retirement income depending on total income. +metadata: + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: year + type: single_amount + label: New Jersey pension/retirement exclusion fraction + reference: + - title: Instructions for Form NJ-1040 (line 64) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 1 + - threshold: + 2021-01-01: 100_000 + amount: + 2021-01-01: 0.25 + - threshold: + 2021-01-01: 125_000 + amount: + 2021-01-01: 0.125 + - threshold: + 2021-01-01: 150_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/single.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/single.yaml new file mode 100644 index 000000000..ac256131e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/single.yaml @@ -0,0 +1,27 @@ +description: New Jersey allows the exclusion of this fraction of retirement income depending on total income. +metadata: + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: year + type: single_amount + label: New Jersey pension/retirement exclusion fraction + reference: + - title: Instructions for Form NJ-1040 (line 64) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 1 + - threshold: + 2021-01-01: 100_000 + amount: + 2021-01-01: 0.375 + - threshold: + 2021-01-01: 125_000 + amount: + 2021-01-01: 0.1875 + - threshold: + 2021-01-01: 150_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/widow.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/widow.yaml new file mode 100644 index 000000000..ac256131e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/percentage/widow.yaml @@ -0,0 +1,27 @@ +description: New Jersey allows the exclusion of this fraction of retirement income depending on total income. +metadata: + threshold_unit: currency-USD + amount_unit: /1 + threshold_period: year + type: single_amount + label: New Jersey pension/retirement exclusion fraction + reference: + - title: Instructions for Form NJ-1040 (line 64) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21 +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 1 + - threshold: + 2021-01-01: 100_000 + amount: + 2021-01-01: 0.375 + - threshold: + 2021-01-01: 125_000 + amount: + 2021-01-01: 0.1875 + - threshold: + 2021-01-01: 150_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/special_exclusion/amount.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/special_exclusion/amount.yaml new file mode 100644 index 000000000..4cdd6069e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exclusions/retirement/special_exclusion/amount.yaml @@ -0,0 +1,22 @@ +description: Filers that will never be eligible for social security or railroad benefits get this exclusion. +metadata: + unit: currency-USD + label: NJ other retirement income special exclusion. + breakdown: + - filing_status + reference: + - title: 2022 New Jersey Revised Statutes Title 54A - New Jersey Gross Income Tax Act Section 54A:6-15(3)(b) - Other retirement income. + href: https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-6-15/ + - title: Instructions for Form NJ-1040 (line 28b) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=24 + +SINGLE: + 2021-01-01: 3_000 +SEPARATE: + 2021-01-01: 3_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 6_000 +JOINT: + 2021-01-01: 6_000 +WIDOW: + 2021-01-01: 6_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/blind_or_disabled/amount.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/blind_or_disabled/amount.yaml index d953821c5..24656e1f5 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/blind_or_disabled/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/blind_or_disabled/amount.yaml @@ -1,11 +1,13 @@ -description: New Jersey provides an exemption of this amount per blind or disabled filer or spouse. -metadata: - unit: currency-USD - label: New Jersey blind or disabled exemption - reference: - - title: New Jersey State 54A 3-1(b)(5-6) - href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions - - title: Instructions for Form NJ-1040 (line 8) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 -values: - 2022-01-01: 1_000 +description: New Jersey provides an exemption of this amount per blind or disabled filer or spouse. +metadata: + unit: currency-USD + label: New Jersey blind or disabled exemption + reference: + - title: New Jersey State 54A 3-1(b)(5-6) + href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=8 + - title: Instructions for Form NJ-1040 (line 8) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 +values: + 2021-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents/amount.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents/amount.yaml index 86c7e8280..2b65c94a2 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents/amount.yaml @@ -1,10 +1,12 @@ -description: New Jersey provides an exemption of this value per dependent. -metadata: - label: New Jersey dependent exemption - reference: - - title: New Jersey State 54A 3-1(b)(2) - href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions - - title: Instructions for Form NJ-1040 (line 10-11) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 -values: - 2022-01-01: 1_500 +description: New Jersey provides an exemption of this value per dependent. +metadata: + label: New Jersey dependent exemption + reference: + - title: New Jersey State 54A 3-1(b)(2) + href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=8 + - title: Instructions for Form NJ-1040 (line 10-11) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 +values: + 2021-01-01: 1_500 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents_attending_college/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents_attending_college/age_threshold.yaml index f0b900d9e..33254bd2f 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents_attending_college/age_threshold.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents_attending_college/age_threshold.yaml @@ -1,11 +1,13 @@ -description: New Jersey limits its exemption for dependents attending college to people below this age. - -metadata: - label: New Jersey dependent attending college exemption age limit - reference: - - title: New Jersey State 54A 3-1.1 - href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-11-dependent-under-22-in-attendance-at-accredited-post-secondary-institution - - title: Instructions for Form NJ-1040 (line 12) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 -values: - 2022-01-01: 22 +description: New Jersey limits its exemption for dependents attending college to people below this age. + +metadata: + label: New Jersey dependent attending college exemption age limit + reference: + - title: New Jersey State 54A 3-1.1 + href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-11-dependent-under-22-in-attendance-at-accredited-post-secondary-institution + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=8 + - title: Instructions for Form NJ-1040 (line 12) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 +values: + 2021-01-01: 22 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents_attending_college/amount.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents_attending_college/amount.yaml index 0485dbc29..a245ca695 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents_attending_college/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/dependents_attending_college/amount.yaml @@ -1,11 +1,13 @@ -description: New Jersey provides an exemption of this value per dependent attending colleges. -metadata: - unit: currency-USD - label: New Jersey dependent attending college exemption - reference: - - title: New Jersey State 54A 3-1.1 - href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-11-dependent-under-22-in-attendance-at-accredited-post-secondary-institution - - title: Instructions for Form NJ-1040 (line 12) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 -values: - 2022-01-01: 1_000 +description: New Jersey provides an exemption of this value per dependent attending colleges. +metadata: + unit: currency-USD + label: New Jersey dependent attending college exemption + reference: + - title: New Jersey State 54A 3-1.1 + href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-11-dependent-under-22-in-attendance-at-accredited-post-secondary-institution + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=8 + - title: Instructions for Form NJ-1040 (line 12) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 +values: + 2021-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/regular/amount.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/regular/amount.yaml index 96327f685..6540626a0 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/regular/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/regular/amount.yaml @@ -1,21 +1,23 @@ -description: NJ provides a regular exemption of $1k for individuals and $2k for couples. -metadata: - unit: currency-USD - label: NJ Regular Exemption - reference: - - title: New Jersey State 54A 3-1(a) - href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions - - title: Instructions for Form NJ-1040 (line 6) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 - breakdown: - - filing_status -SINGLE: - 2022-01-01: 1_000 -SEPARATE: - 2022-01-01: 1_000 -HEAD_OF_HOUSEHOLD: - 2022-01-01: 1_000 -JOINT: - 2022-01-01: 2_000 -WIDOW: - 2022-01-01: 1_000 +description: NJ provides a regular exemption of $1k for individuals and $2k for couples. +metadata: + unit: currency-USD + label: NJ Regular Exemption + reference: + - title: New Jersey State 54A 3-1(a) + href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=8 + - title: Instructions for Form NJ-1040 (line 6) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 + breakdown: + - filing_status +SINGLE: + 2021-01-01: 1_000 +SEPARATE: + 2021-01-01: 1_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 1_000 +JOINT: + 2021-01-01: 2_000 +WIDOW: + 2021-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/senior/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/senior/age_threshold.yaml index 5643d3633..12c737e1e 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/senior/age_threshold.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/senior/age_threshold.yaml @@ -1,11 +1,13 @@ -description: NJ provides an additional $1k exemption for filers above age 65 (and additional $1k if spouse above 65) -metadata: - type: single_amount - label: NJ senior exemption age threshold - reference: - - title: New Jersey State 54A 3-1(b)(3-4) - href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions - - title: Instructions for Form NJ-1040 (line 7) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 -values: - 2022-01-01: 65 +description: NJ provides an additional $1k exemption for filers above age 65 (and additional $1k if spouse above 65) +metadata: + type: single_amount + label: NJ senior exemption age threshold + reference: + - title: New Jersey State 54A 3-1(b)(3-4) + href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=8 + - title: Instructions for Form NJ-1040 (line 7) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 +values: + 2021-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/senior/amount.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/senior/amount.yaml index 47b29c078..82bfa6534 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/senior/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/exemptions/senior/amount.yaml @@ -1,11 +1,13 @@ -description: NJ exemption amount per qualifying person (individual and possibly spouse) -metadata: - unit: currency-USD - label: NJ senior exemption amount - reference: - - title: New Jersey State 54A 3-1(b)(3-4) - href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions - - title: Instructions for Form NJ-1040 (line 7) - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 -values: - 2022-01-01: 1_000 +description: NJ exemption amount per qualifying person (individual and possibly spouse) +metadata: + unit: currency-USD + label: NJ senior exemption amount + reference: + - title: New Jersey State 54A 3-1(b)(3-4) + href: https://casetext.com/statute/new-jersey-statutes/title-54a-new-jersey-gross-income-tax-act/chapter-54a3-personal-exemptions-and-deductions/section-54a3-1-personal-exemptions-and-deductions + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=8 + - title: Instructions for Form NJ-1040 (line 7) + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=8 +values: + 2021-01-01: 1_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/filing_threshold.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/filing_threshold.yaml index e1ecddf8c..3e67df50e 100644 --- a/fiscalsim_us/parameters/gov/states/nj/tax/income/filing_threshold.yaml +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/filing_threshold.yaml @@ -1,20 +1,24 @@ -description: New Jersey requires filing income taxes if income is this amount or higher. -metadata: - unit: currency-USD - label: NJ filing threshold - reference: - - title: Instructions for Form IT-201 - href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=24 - - title: NJ Legal Code - href: https://lis.njleg.state.nj.us/nxt/gateway.dll?f=templates&fn=default.htm&vid=Publish:10.1048/Enu - - filing_status -SINGLE: - 2022-01-01: 10_000 -SEPARATE: - 2022-01-01: 10_000 -HEAD_OF_HOUSEHOLD: - 2022-01-01: 20_000 -JOINT: - 2022-01-01: 20_000 -WIDOW: - 2022-01-01: 20_000 +description: New Jersey requires filing income taxes if income is this amount or higher. +metadata: + unit: currency-USD + label: NJ filing threshold + breakdown: + - filing_status + reference: + - title: 2021 New Jersey NJ-1040 Resident Return + href: https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=21 + - title: Instructions for Form IT-201 + href: https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=24 + - title: NJ Legal Code + href: https://lis.njleg.state.nj.us/nxt/gateway.dll?f=templates&fn=default.htm&vid=Publish:10.1048/Enu + +SINGLE: + 2021-01-01: 10_000 +SEPARATE: + 2021-01-01: 10_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 20_000 +JOINT: + 2021-01-01: 20_000 +WIDOW: + 2021-01-01: 20_000 diff --git a/fiscalsim_us/parameters/gov/states/nj/tax/income/subtractions.yaml b/fiscalsim_us/parameters/gov/states/nj/tax/income/subtractions.yaml new file mode 100644 index 000000000..9699f9b04 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nj/tax/income/subtractions.yaml @@ -0,0 +1,7 @@ +description: Subtractions from federal adjusted gross income. +metadata: + unit: variable + label: New Jersey subtractions from federal adjusted gross income +values: + 2021-01-01: + - taxable_social_security diff --git a/fiscalsim_us/parameters/gov/states/nm/README.md b/fiscalsim_us/parameters/gov/states/nm/README.md new file mode 100644 index 000000000..7b94ee1e9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/README.md @@ -0,0 +1 @@ +# New Mexico diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/age_eligible.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/age_eligible.yaml new file mode 100644 index 000000000..bdfc32a63 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/age_eligible.yaml @@ -0,0 +1,14 @@ +description: New Mexico provides the credit for dependent day care for dependents below this age threshold. +values: + 2021-01-01: 15 +metadata: + unit: year + period: year + label: New Mexico credit for dependent day care child eligible age + reference: + - title: New Mexico Statetus Annotated 1978, 7-2-18.1. part G (1) + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: 2022 New Mexico Income Tax Form Intructions SECTION V, New Mexico Child Day Care Credit. + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=73 + - title: 2021 New Mexico Income Tax Form Intructions SECTION V, New Mexico Child Day Care Credit. + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=63 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/divisor.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/divisor.yaml new file mode 100644 index 000000000..0c9d4540b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/divisor.yaml @@ -0,0 +1,14 @@ +description: New Mexico divides the credit for dependent day care for separate filers by this divisor. +values: + 2021-01-01: 2 +metadata: + unit: /1 + period: year + label: New Mexico credit for dependent day care separate divisor + reference: + - title: New Mexico Statetus Annotated 1978, 7-2-18.1. part G (1) + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: 2022 New Mexico Income Tax Form Intructions SECTION V, New Mexico Child Day Care Credit. + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=72 + - title: 2021 New Mexico Income Tax Form Intructions SECTION V, New Mexico Child Day Care Credit. + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=62 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/full_time_hours.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/full_time_hours.yaml new file mode 100644 index 000000000..05539d522 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/full_time_hours.yaml @@ -0,0 +1,18 @@ +description: New Mexico provides the credit for child and dependent day care for filers with modified gross income based on these full time working hours. + # Per law - maximum income is derived from the annual income that would + # be derived from earnings at double the federal minimum wage + # Per Tax Form - $30,160 = 7.25 * 40 * 52 * 2 +metadata: + unit: hours + label: New Mexico credit for dependent day care full time hours + reference: + - title: New Mexico Statetus Annotated 1978, 7-2-18.1. part G (2) + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + # Tax Form references only the calculation that derives the annual gross income. + - title: 2022 New Mexico Income Tax Form Intructions SECTION V, New Mexico Child Day Care Credit. + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=72 + # Tax Form references only the calculation that derives the annual gross income. + - title: 2021 New Mexico Income Tax Form Intructions SECTION V, New Mexico Child Day Care Credit. + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=62 +values: + 2021-01-01: 40 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/income_limit_as_fraction_of_minimum_wage.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/income_limit_as_fraction_of_minimum_wage.yaml new file mode 100644 index 000000000..f0c2bcdc0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/income_limit_as_fraction_of_minimum_wage.yaml @@ -0,0 +1,10 @@ +description: New Mexico provides the child and dependent day care credit for filers with modified gross income at or below this fraction of full-time minimum wage. +metadata: + unit: /1 + period: year + label: New Mexico CDCC MAGI limit as fraction of minimum wage + reference: + - title: New Mexico Statetus Annotated 1978, 7-2-18.1. part G (2) + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA +values: + 2021-01-01: 2 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/max_amount/per_child.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/max_amount/per_child.yaml new file mode 100644 index 000000000..c646a9931 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/max_amount/per_child.yaml @@ -0,0 +1,13 @@ +description: New Mexico provides up to this amount per child under its Child Day Care Credit. +values: + 2021-01-01: 480 +metadata: + unit: currency-USD + label: New Mexico credit for child and dependent care one dependent max amount + reference: + - title: New Mexico Statutes, Chapter 7 - Taxation, 7-2-18.1. (C) Credit for expenses for dependent child day care necessary to enable gainful employment to prevent indigency. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: 2022 New Mexico Income Tax Form Intructions Page RC-9 Line 22 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=64 + - title: 2021 New Mexico Income Tax Form Intructions Page RC-9 Line 22 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=64 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/max_amount/total.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/max_amount/total.yaml new file mode 100644 index 000000000..93b643db2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/max_amount/total.yaml @@ -0,0 +1,14 @@ +description: New Mexico provides up to this total amount under its Child Day Care Credit. +values: + 2021-01-01: 1_200 + +metadata: + unit: currency-USD + label: New Mexico credit for child and dependent care max amount + reference: + - title: New Mexico Statutes, Chapter 7 - Taxation, 7-2-18.1. (C) Credit for expenses for dependent child day care necessary to enable gainful employment to prevent indigency. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: 2022 New Mexico Income Tax Form Intructions Page RC-9 Line 22 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=72 + - title: 2021 New Mexico Income Tax Form Intructions Page RC-9 Line 22 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=62 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/rate.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/rate.yaml new file mode 100644 index 000000000..6391dd13a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/cdcc/rate.yaml @@ -0,0 +1,13 @@ +description: New Mexico matches up to this share of the federal Child and Dependent Care Credit for its Child Day Care Credit. +values: + 2021-01-01: 0.4 +metadata: + unit: /1 + label: New Mexico dependent day care credit rate + reference: + - title: New Mexico Administrative Code, § 3.3.13.9 - CREDIT FOR EXPENSES FOR DEPENDENT CHILD DAY CARE NECESSARY TO ENABLE GAINFUL EMPLOYMENT TO PREVENT INDIGENCY + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: 2022 New Mexico Income Tax Form Intructions Page RC-7 SECTION V + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=66 + - title: 2021 New Mexico Income Tax Form Intructions Page RC-6 Section V + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=66 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/ctc/README.md b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/ctc/README.md new file mode 100644 index 000000000..412bf336c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/ctc/README.md @@ -0,0 +1 @@ +# Child Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/ctc/amount.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/ctc/amount.yaml new file mode 100644 index 000000000..9dc903b3c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/ctc/amount.yaml @@ -0,0 +1,52 @@ +description: New Mexico provides the following child income tax credit amount for filers, based on adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: New Mexico child income tax credit amount + reference: + - title: New Mexico Statutes, 7-2-18.34. Child income tax credit. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503818/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcHYQEoANMmylCEAIqJCuAJ7QA5BskRCYXAiUr1WnXoMgAynlIAhdQCUAogBknANQCCAOQDCTyVIwACNoUnZxcSA + - title: New Mexico Session Laws, Laws 2023 - First Session, Fifty-Sixth Legislature, Chapter 211 Section 9 Laws 2023 + href: https://nmonesource.com/nmos/nmsl/en/item/18775/index.do#!fragment/undefined/BQCwhgziBcwMYgK4DsDWsBGB7LqC2YATqgJIAm0cATAIw0QCcAlADTJYAuAphAIqJdCAT2gByUSwhciCfoJHjJ0wggDKWQhwBCIgEoBRADL6AagEEAcgGF9LDmAzQOWOEyZA + - title: 2022 New Mexico personal income tax form packet - absent + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf + - title: 2021 New Mexico personal income tax form packet - absent + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf +brackets: + - threshold: + # If the AGI is less than 0, the filer may claim the full credit + 2021-01-01: -.inf + amount: + 2021-01-01: 0 + 2023-01-01: 600 + - threshold: + 2021-01-01: 25_001 + amount: + 2021-01-01: 0 + 2023-01-01: 400 + - threshold: + 2021-01-01: 50_001 + amount: + 2021-01-01: 0 + 2023-01-01: 200 + - threshold: + 2021-01-01: 75_001 + amount: + 2021-01-01: 0 + 2023-01-01: 100 + - threshold: + 2021-01-01: 100_001 + amount: + 2021-01-01: 0 + 2023-01-01: 75 + - threshold: + 2021-01-01: 200_001 + amount: + 2021-01-01: 0 + 2023-01-01: 50 + - threshold: + 2021-01-01: 350_001 + amount: + 2021-01-01: 0 + 2023-01-01: 25 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/eligibility/age/min.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/eligibility/age/min.yaml new file mode 100644 index 000000000..c057d3e48 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/eligibility/age/min.yaml @@ -0,0 +1,13 @@ +description: New Mexico limits Earned Income Tax Credit eligibility for filers without children to those this age or older. +metadata: + unit: year + label: New Mexico EITC minimum childless age + reference: + - title: New Mexico Income Tax Act, 7-2-18.15, part A + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf + - title: New Mexico Income Tax, Title 3, Chapter 7, 7-2-18.15 - Working families tax credit + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503780/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsADh4BKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: 2022 Personal Income Tax Form Packet + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=36 +values: + 2021-01-01: 18 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/match.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/match.yaml new file mode 100644 index 000000000..f903de23c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/eitc/match.yaml @@ -0,0 +1,14 @@ +description: New Mexico matches this percentage of the federal Earned Income Tax Credit. +values: + 2021-01-01: 0.2 + 2023-01-01: 0.25 +metadata: + unit: /1 + label: New Mexico EITC match + reference: + - title: New Mexico Income Tax Act, 7-2-18.15, A + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=133 + - title: New Mexico Income Tax, Title 3, Chapter 7, 7-2-18.15 - Working families tax credit + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503780/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsADh4BKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: 2022 Personal Income Tax Form Packet + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=36 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..2a64daeff --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/refundable.yaml @@ -0,0 +1,15 @@ +description: New Mexico refundable tax credits. +values: + 2021-01-01: + - nm_cdcc + - nm_ctc + - nm_medical_expense_credit + - nm_eitc + - nm_low_income_comprehensive_tax_rebate + - nm_property_tax_rebate + - nm_2021_income_rebate + - nm_additional_2021_income_rebate + - nm_supplemental_2021_income_rebate +metadata: + unit: list + label: New Mexico refundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/age_eligibility.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/age_eligibility.yaml new file mode 100644 index 000000000..44c0ae9f7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/age_eligibility.yaml @@ -0,0 +1,12 @@ +description: New Mexico provides the unreimbursed medical care expense credit for filers at or above this age threshold. +values: + 2005-01-01: 65 +metadata: + label: New Mexico medical care expense credit age threshold + period: year + unit: year + reference: + - title: 7-2-18.13. Credit; unreimbursed or uncompensated medical care expenses of individuals sixty-five years of age or older. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503776/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDswgGwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: Tax Form Instructions Page RC-10 LINE 23. Refundable Medical Care Credit for Persons 65 or Older + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=65 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/amount.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/amount.yaml new file mode 100644 index 000000000..5f8ddf424 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/amount.yaml @@ -0,0 +1,12 @@ +description: New Mexico provides this amount under the unreimbursed medical care expense credit. +values: + 2005-01-01: 2_800 +metadata: + unit: currency-USD + period: year + label: New Mexico medical care expense credit amount + reference: + - title: 7-2-18.13. Credit; unreimbursed or uncompensated medical care expenses of individuals sixty-five years of age or older. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503776/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDswgGwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: Tax Form Instructions Page RC-10 LINE 23. Refundable Medical Care Credit for Persons 65 or Older + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=65 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/min_expenses.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/min_expenses.yaml new file mode 100644 index 000000000..1119a4440 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/credits/unreimbursed_medical_care_expense/min_expenses.yaml @@ -0,0 +1,12 @@ +description: New Mexico provides the unreimbursed medical care expense credit for filers with expenses at or above this amount. +values: + 2005-01-01: 28_000 +metadata: + unit: currency-USD + period: year + label: New Mexico medical care expense credit minimum expenses + reference: + - title: 7-2-18.13. Credit; unreimbursed or uncompensated medical care expenses of individuals sixty-five years of age or older. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503776/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDswgGwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: Tax Form Instructions Page RC-10 LINE 23. Refundable Medical Care Credit for Persons 65 or Older + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=65 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/certain_dependents/amount.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/certain_dependents/amount.yaml new file mode 100644 index 000000000..377ab9ff7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/certain_dependents/amount.yaml @@ -0,0 +1,23 @@ +description: New Mexico provides this amount per dependent for its deduction for certain dependents. +metadata: + label: New Mexico deduction for certain dependents + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: 2022 New Mexico personal income tax form packet PIT-1-25 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=29 + - title: New Mexico Statutes, Chapter 7 - Taxation, 7-2-39. Deduction from net income for certain dependents. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503892/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcATgBMASgA0ybKUIQAiokK4AntADkW6REJhcCFWs069BoyADKeUgCFNAJQCiAGRcA1AIIA5AMIu0qRgAEbQpOySkkA + +JOINT: + 2019-01-01: 4_000 +HEAD_OF_HOUSEHOLD: + 2019-01-01: 4_000 +WIDOW: + 2019-01-01: 0 +SINGLE: + 2019-01-01: 0 +SEPARATE: + 2019-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/head_of_household.yaml new file mode 100644 index 000000000..f5efc3e17 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/head_of_household.yaml @@ -0,0 +1,29 @@ +description: New Mexico provides the medical care expense deduction at these rates for individuals filing as head of household, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico medical care expense deduction head of household filers rate + reference: + - title: 7-2-35. DEDUCTION - UNREIMBURSED OR UNCOMPENSATED MEDICAL CARE EXPENSES + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=249 + - title: Tax Form Instructions Page PIT-1-26 LINE 16. Medical Care Expense Deduction + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=31 + - title: 7-2-37. Deduction; unreimbursed or uncompensated medical care expenses. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503888/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 0.25 + 2025-01-01: 0 + - threshold: + 2015-01-01: 20_000 + amount: + 2015-01-01: 0.15 + 2025-01-01: 0 + - threshold: + 2015-01-01: 50_000 + amount: + 2015-01-01: 0.1 + 2025-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/joint.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/joint.yaml new file mode 100644 index 000000000..7baeb2cdc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/joint.yaml @@ -0,0 +1,29 @@ +description: New Mexico provides the medical care expense deduction at these rates for joint filers, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico medical care expense deduction joint filers rate + reference: + - title: 7-2-35. DEDUCTION - UNREIMBURSED OR UNCOMPENSATED MEDICAL CARE EXPENSES + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=249 + - title: Tax Form Instructions Page PIT-1-26 LINE 16. Medical Care Expense Deduction + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=31 + - title: 7-2-37. Deduction; unreimbursed or uncompensated medical care expenses. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503888/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 0.25 + 2025-01-01: 0 + - threshold: + 2015-01-01: 30_000 + amount: + 2015-01-01: 0.15 + 2025-01-01: 0 + - threshold: + 2015-01-01: 70_000 + amount: + 2015-01-01: 0.1 + 2025-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/separate.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/separate.yaml new file mode 100644 index 000000000..b7a108517 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/separate.yaml @@ -0,0 +1,29 @@ +description: New Mexico provides the medical care expense deduction at these rates for separate filers, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico medical care expense deduction separate filers rate + reference: + - title: 7-2-35. DEDUCTION - UNREIMBURSED OR UNCOMPENSATED MEDICAL CARE EXPENSES + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=249 + - title: Tax Form Instructions Page PIT-1-26 LINE 16. Medical Care Expense Deduction + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=31 + - title: 7-2-37. Deduction; unreimbursed or uncompensated medical care expenses. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503888/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 0.25 + 2025-01-01: 0 + - threshold: + 2015-01-01: 15_000 + amount: + 2015-01-01: 0.15 + 2025-01-01: 0 + - threshold: + 2015-01-01: 35_000 + amount: + 2015-01-01: 0.1 + 2025-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/single.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/single.yaml new file mode 100644 index 000000000..3a072fa3b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/single.yaml @@ -0,0 +1,29 @@ +description: New Mexico provides the medical care expense deduction at these rates for single filers, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico medical care expense deduction single filers rate + reference: + - title: 7-2-35. DEDUCTION - UNREIMBURSED OR UNCOMPENSATED MEDICAL CARE EXPENSES + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=249 + - title: Tax Form Instructions Page PIT-1-26 LINE 16. Medical Care Expense Deduction + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=31 + - title: 7-2-37. Deduction; unreimbursed or uncompensated medical care expenses. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503888/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 0.25 + 2025-01-01: 0 + - threshold: + 2015-01-01: 15_000 + amount: + 2015-01-01: 0.15 + 2025-01-01: 0 + - threshold: + 2015-01-01: 35_000 + amount: + 2015-01-01: 0.1 + 2025-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/widow.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/widow.yaml new file mode 100644 index 000000000..1893fb112 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/medical_care_expense/widow.yaml @@ -0,0 +1,29 @@ +description: New Mexico provides the medical care expense deduction at these rates for widow(er) filers, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico medical care expense deduction widow(er) filers rate + reference: + - title: 7-2-35. DEDUCTION - UNREIMBURSED OR UNCOMPENSATED MEDICAL CARE EXPENSES + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=249 + - title: Tax Form Instructions Page PIT-1-26 LINE 16. Medical Care Expense Deduction + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=31 + - title: 7-2-37. Deduction; unreimbursed or uncompensated medical care expenses + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503888/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 0.25 + 2025-01-01: 0 + - threshold: + 2015-01-01: 30_000 + amount: + 2015-01-01: 0.15 + 2025-01-01: 0 + - threshold: + 2015-01-01: 70_000 + amount: + 2015-01-01: 0.1 + 2025-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/net_capital_gains/capped_element.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/net_capital_gains/capped_element.yaml new file mode 100644 index 000000000..f34c8fc63 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/net_capital_gains/capped_element.yaml @@ -0,0 +1,22 @@ +description: New Mexico allows filers to deduct this amount of their net capital gains, depending on filing status, or a percentage of it, whichever is greater. +brackets: + - threshold: + 2019-01-01: 0 + rate: + 2019-01-01: 1 + - threshold: + 2019-01-01: 1_000 + rate: + 2019-01-01: 0 +metadata: + label: New Mexico net capital gain deduction capped element + period: year + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + reference: + - title: 2022 New Mexico personal income tax form packet ADJ-6 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=29 + - title: New Mexico Statutes, 7-2-34. Deduction; net capital gain income. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503882/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcwgEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/net_capital_gains/uncapped_element_percent.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/net_capital_gains/uncapped_element_percent.yaml new file mode 100644 index 000000000..272d0d874 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/deductions/net_capital_gains/uncapped_element_percent.yaml @@ -0,0 +1,11 @@ +description: New Mexico allows filers to deduct this percentage of their net capital gains, or an amount of it, whichever is greater. +values: + 2019-01-01: 0.4 +metadata: + unit: /1 + label: New Mexico net capital gain deduction uncapped element percent + reference: + - title: 2022 New Mexico personal income tax form packet ADJ-6 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=29 + - title: New Mexico Statutes, 7-2-34. Deduction; net capital gain income. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503882/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcwgEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/age_threshold.yaml new file mode 100644 index 000000000..177c77f82 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/age_threshold.yaml @@ -0,0 +1,14 @@ +description: New Mexico provides the aged or blind exemption for filers at or above this age threshold. +values: + 1987-01-01: 65 +metadata: + label: New Mexico aged and blind exemption age threshold + period: year + unit: year + reference: + - title: 7-2-5.2. EXEMPTION--INCOME OF PERSONS SIXTY-FIVE AND OLDER OR BLIND + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=34 + - title: Tax Form Instructions Page ADJ-5 TABLE 1. Exemptions for Persons 65 or Older or Blind + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=50 + - title: 7-2-5.2. Exemption; income of persons sixty-five and older or blind + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503666/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/head_of_household.yaml new file mode 100644 index 000000000..4feddaf07 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/head_of_household.yaml @@ -0,0 +1,50 @@ +description: New Mexico provides this blind & aged exemption amount for head of household filers, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: New Mexico blind and aged exemption amount for head of household filers + reference: + - title: 7-2-5.2. EXEMPTION--INCOME OF PERSONS SIXTY-FIVE AND OLDER OR BLIND + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=34 + - title: Tax Form Instructions Page ADJ-5 TABLE 1. Exemptions for Persons 65 or Older or Blind + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=50 + - title: 7-2-5.2. Exemption; income of persons sixty-five and older or blind + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503666/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 1987-01-01: 0 + amount: + 1987-01-01: 8_000 + - threshold: + 1987-01-01: 30_000 + amount: + 1987-01-01: 7_000 + - threshold: + 1987-01-01: 33_000 + amount: + 1987-01-01: 6_000 + - threshold: + 1987-01-01: 36_000 + amount: + 1987-01-01: 5_000 + - threshold: + 1987-01-01: 39_000 + amount: + 1987-01-01: 4_000 + - threshold: + 1987-01-01: 42_000 + amount: + 1987-01-01: 3_000 + - threshold: + 1987-01-01: 45_000 + amount: + 1987-01-01: 2_000 + - threshold: + 1987-01-01: 48_000 + amount: + 1987-01-01: 1_000 + - threshold: + 1987-01-01: 51_000 + amount: + 1987-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/joint.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/joint.yaml new file mode 100644 index 000000000..e89fae0ef --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/joint.yaml @@ -0,0 +1,50 @@ +description: New Mexico provides this blind & aged exemption amount for joint filers, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: New Mexico blind and aged exemption amount for joint filers + reference: + - title: 7-2-5.2. EXEMPTION--INCOME OF PERSONS SIXTY-FIVE AND OLDER OR BLIND + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=34 + - title: Tax Form Instructions Page ADJ-5 TABLE 1. Exemptions for Persons 65 or Older or Blind + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=50 + - title: 7-2-5.2. Exemption; income of persons sixty-five and older or blind + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503666/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 1987-01-01: 0 + amount: + 1987-01-01: 8_000 + - threshold: + 1987-01-01: 30_000 + amount: + 1987-01-01: 7_000 + - threshold: + 1987-01-01: 33_000 + amount: + 1987-01-01: 6_000 + - threshold: + 1987-01-01: 36_000 + amount: + 1987-01-01: 5_000 + - threshold: + 1987-01-01: 39_000 + amount: + 1987-01-01: 4_000 + - threshold: + 1987-01-01: 42_000 + amount: + 1987-01-01: 3_000 + - threshold: + 1987-01-01: 45_000 + amount: + 1987-01-01: 2_000 + - threshold: + 1987-01-01: 48_000 + amount: + 1987-01-01: 1_000 + - threshold: + 1987-01-01: 51_000 + amount: + 1987-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/separate.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/separate.yaml new file mode 100644 index 000000000..1ca47d9a9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/separate.yaml @@ -0,0 +1,50 @@ +description: New Mexico provides this blind & aged exemption amount for separate filers, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: New Mexico blind and aged exemption amount for separate filers + reference: + - title: 7-2-5.2. EXEMPTION--INCOME OF PERSONS SIXTY-FIVE AND OLDER OR BLIND + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=34 + - title: Tax Form Instructions Page ADJ-5 TABLE 1. Exemptions for Persons 65 or Older or Blind + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=50 + - title: 7-2-5.2. Exemption; income of persons sixty-five and older or blind + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503666/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 1987-01-01: 0 + amount: + 1987-01-01: 8_000 + - threshold: + 1987-01-01: 15_000 + amount: + 1987-01-01: 7_000 + - threshold: + 1987-01-01: 16_500 + amount: + 1987-01-01: 6_000 + - threshold: + 1987-01-01: 18_000 + amount: + 1987-01-01: 5_000 + - threshold: + 1987-01-01: 19_500 + amount: + 1987-01-01: 4_000 + - threshold: + 1987-01-01: 21_000 + amount: + 1987-01-01: 3_000 + - threshold: + 1987-01-01: 22_500 + amount: + 1987-01-01: 2_000 + - threshold: + 1987-01-01: 24_000 + amount: + 1987-01-01: 1_000 + - threshold: + 1987-01-01: 25_500 + amount: + 1987-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/single.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/single.yaml new file mode 100644 index 000000000..bcbef46b2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/single.yaml @@ -0,0 +1,50 @@ +description: New Mexico provides this blind & aged exemption amount for single filers, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: New Mexico blind and aged exemption amount for single filers + reference: + - title: 7-2-5.2. EXEMPTION--INCOME OF PERSONS SIXTY-FIVE AND OLDER OR BLIND + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=34 + - title: Tax Form Instructions Page ADJ-5 TABLE 1. Exemptions for Persons 65 or Older or Blind + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=50 + - title: 7-2-5.2. Exemption; income of persons sixty-five and older or blind + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503666/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 1987-01-01: 0 + amount: + 1987-01-01: 8_000 + - threshold: + 1987-01-01: 18_000 + amount: + 1987-01-01: 7_000 + - threshold: + 1987-01-01: 19_500 + amount: + 1987-01-01: 6_000 + - threshold: + 1987-01-01: 21_000 + amount: + 1987-01-01: 5_000 + - threshold: + 1987-01-01: 22_500 + amount: + 1987-01-01: 4_000 + - threshold: + 1987-01-01: 24_000 + amount: + 1987-01-01: 3_000 + - threshold: + 1987-01-01: 25_500 + amount: + 1987-01-01: 2_000 + - threshold: + 1987-01-01: 27_000 + amount: + 1987-01-01: 1_000 + - threshold: + 1987-01-01: 28_500 + amount: + 1987-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/widow.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/widow.yaml new file mode 100644 index 000000000..8573eb131 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/blind_and_aged/widow.yaml @@ -0,0 +1,50 @@ +description: New Mexico provides this blind & aged exemption amount for widow(er) filers, depending on their adjusted gross income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + label: New Mexico blind and aged exemption amount for widow(er) filers + reference: + - title: 7-2-5.2. EXEMPTION--INCOME OF PERSONS SIXTY-FIVE AND OLDER OR BLIND + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=34 + - title: Tax Form Instructions Page ADJ-5 TABLE 1. Exemptions for Persons 65 or Older or Blind + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=50 + - title: 7-2-5.2. Exemption; income of persons sixty-five and older or blind + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503666/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA +brackets: + - threshold: + 1987-01-01: 0 + amount: + 1987-01-01: 8_000 + - threshold: + 1987-01-01: 30_000 + amount: + 1987-01-01: 7_000 + - threshold: + 1987-01-01: 33_000 + amount: + 1987-01-01: 6_000 + - threshold: + 1987-01-01: 36_000 + amount: + 1987-01-01: 5_000 + - threshold: + 1987-01-01: 39_000 + amount: + 1987-01-01: 4_000 + - threshold: + 1987-01-01: 42_000 + amount: + 1987-01-01: 3_000 + - threshold: + 1987-01-01: 45_000 + amount: + 1987-01-01: 2_000 + - threshold: + 1987-01-01: 48_000 + amount: + 1987-01-01: 1_000 + - threshold: + 1987-01-01: 51_000 + amount: + 1987-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/hundred_year/age_eligibility.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/hundred_year/age_eligibility.yaml new file mode 100644 index 000000000..b1a495586 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/hundred_year/age_eligibility.yaml @@ -0,0 +1,12 @@ +description: New Mexico provides the hundred year exemption for filers at or above this age threshold. +values: + 2002-01-01: 100 +metadata: + label: New Mexico hundred year exemption age threshold + period: year + unit: year + reference: + - title: 7-2-5.7. Exemption; income of individuals one hundred years of age or older. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503675/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsAdj4BKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: Tax Form Instructions PIT-1-9 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=29 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/income_limit.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/income_limit.yaml new file mode 100644 index 000000000..6d60fc325 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/income_limit.yaml @@ -0,0 +1,25 @@ +description: New Mexico provides the low- and middle-income exemption for filers with adjusted gross income below this amount. +metadata: + label: New Mexico low- and middle-income exemption income limit + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: 2022 New Mexico personal income tax form packet PIT-1-25 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=30 + - title: 2021 New Mexico personal income tax form packet PIT-1-25 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=30 + - title: New Mexico Statutes, Chapter 7 - Taxation, Article 2 - Income Tax General Provisions, Section 7-2-5.8 - Exemption for low- and middle-income taxpayers + href: https://law.justia.com/codes/new-mexico/2013/chapter-7/article-2/section-7-2-5.8 + +JOINT: + 2021-01-01: 55_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 55_000 +WIDOW: + 2021-01-01: 55_000 +SINGLE: + 2021-01-01: 36_667 +SEPARATE: + 2021-01-01: 27_500 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/max_amount.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/max_amount.yaml new file mode 100644 index 000000000..4cae27297 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/max_amount.yaml @@ -0,0 +1,13 @@ +description: New Mexico provides this maximum low- and middle-income exemption amount. +values: + 2021-01-01: 2_500 +metadata: + unit: currency-USD + label: New Mexico low- and middle-income exemption maximum amount + reference: + - title: 2022 New Mexico personal income tax form packet PIT-1-25 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=30 + - title: 2021 New Mexico personal income tax form packet PIT-1-25 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=30 + - title: New Mexico Statutes, Chapter 7 - Taxation, Article 2 - Income Tax General Provisions, Section 7-2-5.8 - Exemption for low- and middle-income taxpayers + href: https://law.justia.com/codes/new-mexico/2013/chapter-7/article-2/section-7-2-5.8 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/reduction/income_threshold.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/reduction/income_threshold.yaml new file mode 100644 index 000000000..0f1fe4a7c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/reduction/income_threshold.yaml @@ -0,0 +1,26 @@ +description: New Mexico reduces the low- and middle-income exemption for filers with adjusted gross income above this amount. + +metadata: + label: New Mexico low- and middle-income exemption reduction threshold + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: 2022 New Mexico personal income tax form packet PIT-1-25 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=30 + - title: 2021 New Mexico personal income tax form packet PIT-1-25 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=30 + - title: New Mexico Statutes, Chapter 7 - Taxation, Article 2 - Income Tax General Provisions, Section 7-2-5.8 - Exemption for low- and middle-income taxpayers + href: https://law.justia.com/codes/new-mexico/2013/chapter-7/article-2/section-7-2-5.8 + +JOINT: + 2021-01-01: 30_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 30_000 +WIDOW: + 2021-01-01: 30_000 +SINGLE: + 2021-01-01: 20_000 +SEPARATE: + 2021-01-01: 15_000 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/reduction/rate.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/reduction/rate.yaml new file mode 100644 index 000000000..8c8b8a295 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/low_and_middle_income/reduction/rate.yaml @@ -0,0 +1,25 @@ +description: New Mexico reduces the low- and middle-income exemption at this rate, based on the filing status. +metadata: + label: New Mexico low- and middle-income exemption reduction rate + period: year + unit: /1 + breakdown: + - filing_status + reference: + - title: 2022 New Mexico personal income tax form packet PIT-1-25 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=30 + - title: 2021 New Mexico personal income tax form packet PIT-1-25 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=30 + - title: New Mexico Statutes, Chapter 7 - Taxation, Article 2 - Income Tax General Provisions, Section 7-2-5.8 - Exemption for low- and middle-income taxpayers + href: https://law.justia.com/codes/new-mexico/2013/chapter-7/article-2/section-7-2-5.8 + +JOINT: + 2021-01-01: 0.1 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 0.1 +WIDOW: + 2021-01-01: 0.1 +SINGLE: + 2021-01-01: 0.15 +SEPARATE: + 2021-01-01: 0.2 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/social_security_income/income_limit.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/social_security_income/income_limit.yaml new file mode 100644 index 000000000..c75c97ae4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/social_security_income/income_limit.yaml @@ -0,0 +1,30 @@ +description: New Mexico exempts taxable Social Security benefits for filers with adjusted gross income at or below this amount. +metadata: + label: New Mexico social security income exemption income limit + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: 2022 New Mexico personal income tax form packet ADJ-7 Exemption for social security income. + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=52 + - title: New Mexico Statutes, 7-2-5.14. Exemption; social security income. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503690/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsATh4BKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: 2021 New Mexico personal income tax form packet - absent + href: https://taxsim.nber.org/historical_state_tax_forms/NM/2021/2021pit-1-ins.pdf + +JOINT: + 2021-01-01: 0 + 2022-01-01: 150_000 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 0 + 2022-01-01: 150_000 +WIDOW: + 2021-01-01: 0 + 2022-01-01: 150_000 +SINGLE: + 2021-01-01: 0 + 2022-01-01: 100_000 +SEPARATE: + 2021-01-01: 0 + 2022-01-01: 75_000 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/age_eligibility.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/age_eligibility.yaml new file mode 100644 index 000000000..ed7f19c34 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/age_eligibility.yaml @@ -0,0 +1,12 @@ +description: New Mexico provides the unreimbursed medical care expense exemption for filers at or above this age threshold. +values: + 2005-01-01: 65 +metadata: + label: New Mexico medical care expense exemption age threshold + period: year + unit: year + reference: + - title: 7-2-5.9. 7-2-5.9. Exemption; unreimbursed or uncompensated medical care expenses of individuals sixty-five years of age or older. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503680/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsADh4BKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: Tax Form Instructions Page ADJ-6 LINE 17. Medical care expense exemption for persons age 65 years or older + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=32 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/amount.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/amount.yaml new file mode 100644 index 000000000..5672d31e2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/amount.yaml @@ -0,0 +1,12 @@ +description: New Mexico provides this amount under the unreimbursed medical care expense exemption. +values: + 2005-01-01: 3_000 +metadata: + unit: currency-USD + period: year + label: New Mexico medical care expense exemption amount + reference: + - title: 7-2-5.9. 7-2-5.9. Exemption; unreimbursed or uncompensated medical care expenses of individuals sixty-five years of age or older. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503680/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsADh4BKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: Tax Form Instructions Page ADJ-6 LINE 17. Medical care expense exemption for persons age 65 years or older + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=32 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/min_expenses.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/min_expenses.yaml new file mode 100644 index 000000000..29324243f --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/exemptions/unreimbursed_medical_care_expense/min_expenses.yaml @@ -0,0 +1,12 @@ +description: New Mexico provides the unreimbursed medical care expense exemption for filers with expenses at or above this amount. +values: + 2005-01-01: 28_000 +metadata: + unit: currency-USD + period: year + label: New Mexico medical care expense exemption minimum expenses + reference: + - title: 7-2-5.9. 7-2-5.9. Exemption; unreimbursed or uncompensated medical care expenses of individuals sixty-five years of age or older. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503680/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsADh4BKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: Tax Form Instructions Page ADJ-6 LINE 17. Medical care expense exemption for persons age 65 years or older + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=32 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/main/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/head_of_household.yaml new file mode 100644 index 000000000..133e4666d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/head_of_household.yaml @@ -0,0 +1,35 @@ +description: New Mexico taxes the income of head of household filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico income tax rate head of household filers + reference: + - title: New Mexico Income Tax Act, 7-2-7, B + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=33 + # Tax form depicts the income tax as a tax rate table without specific rates. + - title: 2022 Personal Income Tax Form Packet + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=109 + - title: New Mexico Income Tax, Title 3, Chapter 3, Part 7, 3.3.7.9, A + href: https://www.srca.nm.gov/parts/title03/03.003.0007.html +brackets: + - threshold: + 2008-01-01: 0 + rate: + 2008-01-01: 0.017 + - threshold: + 2008-01-01: 8_000 + rate: + 2008-01-01: 0.032 + - threshold: + 2008-01-01: 16_000 + rate: + 2008-01-01: 0.047 + - threshold: + 2008-01-01: 24_000 + rate: + 2008-01-01: 0.049 + - threshold: + 2008-01-01: 315_000 + rate: + 2008-01-01: 0.059 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/main/joint.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/joint.yaml new file mode 100644 index 000000000..6dafa2844 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/joint.yaml @@ -0,0 +1,35 @@ +description: New Mexico taxes the income of joint filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico income tax rate joint filers + reference: + - title: New Mexico Income Tax Act, 7-2-7, B + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=33 + # Tax form depicts the income tax as a tax rate table without specific rates. + - title: 2022 Personal Income Tax Form Packet + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=109 + - title: New Mexico Income Tax, Title 3, Chapter 3, Part 7, 3.3.7.9, A + href: https://www.srca.nm.gov/parts/title03/03.003.0007.html +brackets: + - threshold: + 2008-01-01: 0 + rate: + 2008-01-01: 0.017 + - threshold: + 2008-01-01: 8_000 + rate: + 2008-01-01: 0.032 + - threshold: + 2008-01-01: 16_000 + rate: + 2008-01-01: 0.047 + - threshold: + 2008-01-01: 24_000 + rate: + 2008-01-01: 0.049 + - threshold: + 2008-01-01: 315_000 + rate: + 2008-01-01: 0.059 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/main/separate.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/separate.yaml new file mode 100644 index 000000000..10cf00219 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/separate.yaml @@ -0,0 +1,35 @@ +description: New Mexico taxes the income of married individuals filing separate returns at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico income tax rate married separate filers + reference: + - title: New Mexico Income Tax Act, 7-2-7, B + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=33 + # Tax form depicts the income tax as a tax rate table without specific rates. + - title: 2022 Personal Income Tax Form Packet + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=109 + - title: New Mexico Income Tax, Title 3, Chapter 3, Part 7, 3.3.7.9, A + href: https://www.srca.nm.gov/parts/title03/03.003.0007.html +brackets: + - threshold: + 2008-01-01: 0 + rate: + 2008-01-01: 0.017 + - threshold: + 2008-01-01: 4_000 + rate: + 2008-01-01: 0.032 + - threshold: + 2008-01-01: 8_000 + rate: + 2008-01-01: 0.047 + - threshold: + 2008-01-01: 12_000 + rate: + 2008-01-01: 0.049 + - threshold: + 2008-01-01: 157_500 + rate: + 2008-01-01: 0.059 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/main/single.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/single.yaml new file mode 100644 index 000000000..ebf11438c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/single.yaml @@ -0,0 +1,35 @@ +description: New Mexico taxes the income of single filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico income tax rate single filers + reference: + - title: New Mexico Income Tax Act, 7-2-7, B + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=33 + # Tax form depicts the income tax as a tax rate table without specific rates. + - title: 2022 Personal Income Tax Form Packet + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=109 + - title: New Mexico Income Tax, Title 3, Chapter 3, Part 7, 3.3.7.9, A + href: https://www.srca.nm.gov/parts/title03/03.003.0007.html +brackets: + - threshold: + 2008-01-01: 0 + rate: + 2008-01-01: 0.017 + - threshold: + 2008-01-01: 5_500 + rate: + 2008-01-01: 0.032 + - threshold: + 2008-01-01: 11_000 + rate: + 2008-01-01: 0.047 + - threshold: + 2008-01-01: 16_000 + rate: + 2008-01-01: 0.049 + - threshold: + 2008-01-01: 210_000 + rate: + 2008-01-01: 0.059 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/main/widow.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/widow.yaml new file mode 100644 index 000000000..269c7d0dc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/main/widow.yaml @@ -0,0 +1,35 @@ +description: New Mexico taxes the income of widow filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: New Mexico income tax rate widow filers + reference: + - title: New Mexico Income Tax Act, 7-2-7, B + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=33 + # Tax form depicts the income tax as a tax rate table without specific rates. + - title: 2022 Personal Income Tax Form Packet + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=109 + - title: New Mexico Income Tax, Title 3, Chapter 3, Part 7, 3.3.7.9, A + href: https://www.srca.nm.gov/parts/title03/03.003.0007.html +brackets: + - threshold: + 2008-01-01: 0 + rate: + 2008-01-01: 0.017 + - threshold: + 2008-01-01: 8_000 + rate: + 2008-01-01: 0.032 + - threshold: + 2008-01-01: 16_000 + rate: + 2008-01-01: 0.047 + - threshold: + 2008-01-01: 24_000 + rate: + 2008-01-01: 0.049 + - threshold: + 2008-01-01: 315_000 + rate: + 2008-01-01: 0.059 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/modified_gross_income.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/modified_gross_income.yaml new file mode 100644 index 000000000..860dd0d56 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/modified_gross_income.yaml @@ -0,0 +1,26 @@ +description: New Mexico includes these income sources in its modified gross income concept. +values: + 2021-01-01: + - tax_unit_social_security + - tax_unit_unemployment_compensation + - capital_gains + - tanf + - ssi + - interest_income + - dividend_income + - alimony_income + - child_support_received + - rental_income + - pension_income + - unemployment_compensation + - employment_income + - self_employment_income + - veterans_benefits + # income such as gambling winnings, insurance settlements, scholarships, + # grants, trust income and inheritance, +metadata: + unit: list + label: New Mexico modified gross income elements + reference: + - title: New Mexico Income Tax Act, Chapter 7 - Taxation, 7-2-2. Definitions, L + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503656/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsfYQEoANMmylCEAIqJCuAJ7QA5BskRCYXAiUr1WnXoMgAynlIAhdQCUAogBknANQCCAOQDCTyVIwACNoUnZxcSA diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/other_deductions_and_exemptions.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/other_deductions_and_exemptions.yaml new file mode 100644 index 000000000..5a97e33e4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/other_deductions_and_exemptions.yaml @@ -0,0 +1,18 @@ +description: New Mexico other deduction and exemptions elements. +values: + 2021-01-01: + - us_govt_interest + - investment_in_529_plan + - military_service_income +metadata: + unit: list + label: New Mexico other deduction and exemption elements + reference: + - title: 2022 Personal Income Tax Form Packet + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=14 + - title: New Mexico Income Tax Act, Chapter 7 - Taxation, 7-2-5.11. Exemption; armed forces salaries. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc141269862/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWDgJgDYAnAA5+vAJQAaZNlKEIARUSFcAT2gByDZIiEwuBEpXqtOvQZABlPKQBC6gEoBRADJOAagEEAcgGEnkqRgAEbQpOzi4kA + - title: New Mexico Income Tax Act, Chapter 7 - Taxation, 3.3.1.12. INCOME FROM OBLIGATIONS OF GOVERNMENTS + href: https://casetext.com/regulation/new-mexico-administrative-code/title-3-taxation/chapter-3-personal-income-taxes/part-1-general-provisions/section-33112-income-from-obligations-of-governments + - title: New Mexico Income Tax Act, Chapter 7 - Taxation, 7-2-32. Deduction; payments into education trust fund. + hef: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc141270056/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWDgJgHYADIICsANgCUAGmTZShCAEVEhXAE9oAck1SIhMLgTLVG7bv2GQAZTykAQhoBKAUQAyzgGoBBAHIBhZylSMAAjaFJ2CQkgA diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/additional/amount.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/additional/amount.yaml new file mode 100644 index 000000000..53e83a4f4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/additional/amount.yaml @@ -0,0 +1,28 @@ +description: New Mexico provides the following additional 2021 income tax rebate amount, based on filing status. +metadata: + unit: currency-USD + period: year + breakdown: + - filing_status + label: New Mexico additional 2021 income tax rebate amount + reference: + - title: New Mexico Statutes, Chapter 7 - Taxation, 7-2-7.7. Additional 2021 income tax rebates. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503710/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsHHgEoANMmylCEAIqJCuAJ7QA5BskRCYXAiUr1WnXoMgAynlIAhdQCUAogBknANQCCAOQDCTyVIwACNoUnZxcSA + - title: New Mexico Session Laws, Laws 2023 - First Session, Fifty-Sixth Legislature, Chapter 211 Section 11 Laws 2023 + href: https://nmonesource.com/nmos/nmsl/en/item/18775/index.do#!fragment/undefined/BQCwhgziBcwMYgK4DsDWsBGB7LqC2YATqgJIAm0cATAIw0R0CUANMlgC4CmEAiop4QCe0AOQjmETkQR8BwsRKmEEAZSyF2AIWEAlAKIAZPQDUAggDkAwnubswGaOyxxGjIA + +JOINT: + 2021-01-01: 1_000 + 2022-01-01: 0 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 1_000 + 2022-01-01: 0 +WIDOW: + 2021-01-01: 1_000 + 2022-01-01: 0 +SINGLE: + 2021-01-01: 500 + 2022-01-01: 0 +SEPARATE: + 2021-01-01: 500 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/main/amount.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/main/amount.yaml new file mode 100644 index 000000000..7eaa9f915 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/main/amount.yaml @@ -0,0 +1,28 @@ +description: New Mexico provides the following main 2021 income tax rebate amount, based on filing status. +metadata: + unit: currency-USD + period: year + breakdown: + - filing_status + label: New Mexico main 2021 income tax rebate amount + reference: + - title: New Mexico Statutes, Chapter 7 - Taxation, 7-2-7.6. 2021 income tax rebate. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503708/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsPABwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: New Mexico Session Laws, Laws 2022, Second Session, Fifty-Fifth Legislature, Chapter 47 Section 4 Laws 2022 + href: https://nmonesource.com/nmos/nmsl/en/item/18453/index.do#!fragment/undefined/BQCwhgziBcwMYgK4DsDWsBGB7LqC2YATqgJIAm0cALAOwRUCUANMlgC4CmEAioh4QE9oAcmFMIHIgl78ho8ZMIIAylkJsAQkIBKAUQAyugGoBBAHIBhXUzZgM0NljgMGQA + +JOINT: + 2021-01-01: 500 + 2022-01-01: 0 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 500 + 2022-01-01: 0 +WIDOW: + 2021-01-01: 500 + 2022-01-01: 0 +SINGLE: + 2021-01-01: 250 + 2022-01-01: 0 +SEPARATE: + 2021-01-01: 250 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/main/income_limit.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/main/income_limit.yaml new file mode 100644 index 000000000..e942b1d58 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/main/income_limit.yaml @@ -0,0 +1,28 @@ +description: New Mexico provides the main 2021 income tax rebate for filers with AGI below this limit, based on filing status. +metadata: + unit: currency-USD + period: year + breakdown: + - filing_status + label: New Mexico main 2021 income tax rebate income limit + reference: + - title: New Mexico Statutes, Chapter 7 - Taxation, 7-2-7.6. 2021 income tax rebate. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503708/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsPABwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: New Mexico Session Laws, Laws 2022, Second Session, Fifty-Fifth Legislature, Chapter 47 Section 4 Laws 2022 + href: https://nmonesource.com/nmos/nmsl/en/item/18453/index.do#!fragment/undefined/BQCwhgziBcwMYgK4DsDWsBGB7LqC2YATqgJIAm0cALAOwRUCUANMlgC4CmEAioh4QE9oAcmFMIHIgl78ho8ZMIIAylkJsAQkIBKAUQAyugGoBBAHIBhXUzZgM0NljgMGQA + +JOINT: + 2021-01-01: 150_000 + 2022-01-01: 0 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 150_000 + 2022-01-01: 0 +WIDOW: + 2021-01-01: 150_000 + 2022-01-01: 0 +SINGLE: + 2021-01-01: 75_000 + 2022-01-01: 0 +SEPARATE: + 2021-01-01: 75_000 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/supplemental/amount.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/supplemental/amount.yaml new file mode 100644 index 000000000..1013fe2f6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/2021_income/supplemental/amount.yaml @@ -0,0 +1,28 @@ +description: New Mexico provides the following supplemental 2021 income tax rebate amount, based on filing status. +metadata: + unit: currency-USD + period: year + breakdown: + - filing_status + label: New Mexico supplemental 2021 income tax rebate amount + reference: + - title: New Mexico Statutes, Chapter 7 - Taxation, 7-2-7.5. Supplemental 2021 income tax rebates. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503706/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsPAGwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA + - title: New Mexico Session Laws, Laws 2022 (3rd S.S.) - 3rd Special Session, Fifty-Fifth Legislature, Chapter 2 Section 1 Laws 2022 (3rd S.S.) + href: https://nmonesource.com/nmos/nmsl/en/item/18454/index.do#!fragment/undefined/BQCwhgziBcwMYgK4DsDWsBGB7LqC2YATqgJIAm0cATBAIwCUANMlgC4CmEAiou4QJ7QA5EMYR2RBDz6CRYiYQQBlLIVYAhQQCUAogBkdANQCCAOQDCOxqzAZorLHHr0gA + +JOINT: + 2021-01-01: 1_000 # two payments of $500 + 2022-01-01: 0 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 1_000 # two payments of $500 + 2022-01-01: 0 +WIDOW: + 2021-01-01: 1_000 # two payments of $500 + 2022-01-01: 0 +SINGLE: + 2021-01-01: 500 # two payments of $250 + 2022-01-01: 0 +SEPARATE: + 2021-01-01: 500 # two payments of $250 + 2022-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/five_exemptions.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/five_exemptions.yaml new file mode 100644 index 000000000..405f5fcae --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/five_exemptions.yaml @@ -0,0 +1,96 @@ +description: New Mexico provides the following low income comprehensive tax rebate for filers with five exemptions. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 455 + - threshold: + 2021-01-01: 1_001 + amount: + 2021-01-01: 570 + - threshold: + 2021-01-01: 7_501 + amount: + 2021-01-01: 575 + - threshold: + 2021-01-01: 9_001 + amount: + 2021-01-01: 510 + - threshold: + 2021-01-01: 10_001 + amount: + 2021-01-01: 445 + - threshold: + 2021-01-01: 11_501 + amount: + 2021-01-01: 365 + - threshold: + 2021-01-01: 13_001 + amount: + 2021-01-01: 315 + - threshold: + 2021-01-01: 14_501 + amount: + 2021-01-01: 285 + - threshold: + 2021-01-01: 16_501 + amount: + 2021-01-01: 250 + - threshold: + 2021-01-01: 18_001 + amount: + 2021-01-01: 220 + - threshold: + 2021-01-01: 19_501 + amount: + 2021-01-01: 185 + - threshold: + 2021-01-01: 23_001 + amount: + 2021-01-01: 170 + - threshold: + 2021-01-01: 24_501 + amount: + 2021-01-01: 155 + - threshold: + 2021-01-01: 26_001 + amount: + 2021-01-01: 140 + - threshold: + 2021-01-01: 27_501 + amount: + 2021-01-01: 130 + - threshold: + 2021-01-01: 29_501 + amount: + 2021-01-01: 115 + - threshold: + 2021-01-01: 31_001 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 32_501 + amount: + 2021-01-01: 80 + - threshold: + 2021-01-01: 34_001 + amount: + 2021-01-01: 65 + - threshold: + 2021-01-01: 36_001 + amount: + 2021-01-01: 0 +metadata: + threshold_unit: currency-USD + amount_unit: currency-USD + type: single_amount + label: New Mexico comprehensive low income tax rebate five exemptions amount + reference: + - title: New Mexico 2022 PIT-RC, page 58, SECTION II LOW INCOME COMPREHENSIVE TAX REBATE + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: New Mexico 2022 PIT-RC, page 70, TABLE 1 - 2022 Low Income Comprehensive Tax Rebate Table + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=70 + - title: New Mexico 2021 PIT-RC, page 60, SECTION II Line 14, TABLE 1 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=60 + - title: N.M. Stat. § 7-2-14(D) + href: https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/four_exemptions.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/four_exemptions.yaml new file mode 100644 index 000000000..fc9aaa75b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/four_exemptions.yaml @@ -0,0 +1,100 @@ +description: New Mexico provides the following low income comprehensive tax rebate for filers with four exemptions. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 390 + - threshold: + 2021-01-01: 1_001 + amount: + 2021-01-01: 505 + - threshold: + 2021-01-01: 7_501 + amount: + 2021-01-01: 495 + - threshold: + 2021-01-01: 8_001 + amount: + 2021-01-01: 480 + - threshold: + 2021-01-01: 9_001 + amount: + 2021-01-01: 425 + - threshold: + 2021-01-01: 10_001 + amount: + 2021-01-01: 360 + - threshold: + 2021-01-01: 11_501 + amount: + 2021-01-01: 295 + - threshold: + 2021-01-01: 13_001 + amount: + 2021-01-01: 275 + - threshold: + 2021-01-01: 14_501 + amount: + 2021-01-01: 235 + - threshold: + 2021-01-01: 16_501 + amount: + 2021-01-01: 210 + - threshold: + 2021-01-01: 18_001 + amount: + 2021-01-01: 180 + - threshold: + 2021-01-01: 19_501 + amount: + 2021-01-01: 165 + - threshold: + 2021-01-01: 23_001 + amount: + 2021-01-01: 145 + - threshold: + 2021-01-01: 24_501 + amount: + 2021-01-01: 140 + - threshold: + 2021-01-01: 26_001 + amount: + 2021-01-01: 130 + - threshold: + 2021-01-01: 27_501 + amount: + 2021-01-01: 115 + - threshold: + 2021-01-01: 29_501 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 31_001 + amount: + 2021-01-01: 80 + - threshold: + 2021-01-01: 32_501 + amount: + 2021-01-01: 65 + - threshold: + 2021-01-01: 34_001 + amount: + 2021-01-01: 55 + - threshold: + 2021-01-01: 36_001 + amount: + 2021-01-01: 0 +metadata: + threshold_unit: currency-USD + amount_unit: currency-USD + type: single_amount + label: New Mexico comprehensive low income tax rebate four exemptions amount + reference: + - title: New Mexico 2022 PIT-RC, page 58, SECTION II LOW INCOME COMPREHENSIVE TAX REBATE + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: New Mexico 2022 PIT-RC, page 70, TABLE 1 - 2022 Low Income Comprehensive Tax Rebate Table + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=70 + - title: New Mexico 2021 PIT-RC, page 60, SECTION II Line 14, TABLE 1 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=60 + - title: N.M. Stat. § 7-2-14(D) + href: https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/one_exemption.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/one_exemption.yaml new file mode 100644 index 000000000..06d581388 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/one_exemption.yaml @@ -0,0 +1,100 @@ +description: New Mexico provides the following low income comprehensive tax rebate for filers with one exemption. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 195 + - threshold: + 2021-01-01: 1_001 + amount: + 2021-01-01: 220 + - threshold: + 2021-01-01: 7_501 + amount: + 2021-01-01: 205 + - threshold: + 2021-01-01: 8_001 + amount: + 2021-01-01: 185 + - threshold: + 2021-01-01: 9_001 + amount: + 2021-01-01: 170 + - threshold: + 2021-01-01: 10_001 + amount: + 2021-01-01: 145 + - threshold: + 2021-01-01: 11_501 + amount: + 2021-01-01: 130 + - threshold: + 2021-01-01: 13_001 + amount: + 2021-01-01: 115 + - threshold: + 2021-01-01: 14_501 + amount: + 2021-01-01: 105 + - threshold: + 2021-01-01: 16_501 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 18_001 + amount: + 2021-01-01: 90 + - threshold: + 2021-01-01: 19_501 + amount: + 2021-01-01: 80 + - threshold: + 2021-01-01: 23_001 + amount: + 2021-01-01: 75 + - threshold: + 2021-01-01: 24_501 + amount: + 2021-01-01: 65 + - threshold: + 2021-01-01: 26_001 + amount: + 2021-01-01: 55 + - threshold: + 2021-01-01: 27_501 + amount: + 2021-01-01: 50 + - threshold: + 2021-01-01: 29_501 + amount: + 2021-01-01: 40 + - threshold: + 2021-01-01: 31_001 + amount: + 2021-01-01: 35 + - threshold: + 2021-01-01: 32_501 + amount: + 2021-01-01: 25 + - threshold: + 2021-01-01: 34_001 + amount: + 2021-01-01: 15 + - threshold: + 2021-01-01: 36_001 + amount: + 2021-01-01: 0 +metadata: + threshold_unit: currency-USD + amount_unit: currency-USD + type: single_amount + label: New Mexico comprehensive low income tax rebate one exemption amount + reference: + - title: New Mexico 2022 PIT-RC, page 58, SECTION II LOW INCOME COMPREHENSIVE TAX REBATE + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: New Mexico 2022 PIT-RC, page 70, TABLE 1 - 2022 Low Income Comprehensive Tax Rebate Table + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=70 + - title: New Mexico 2021 PIT-RC, page 60, SECTION II Line 14, TABLE 1 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=60 + - title: N.M. Stat. § 7-2-14(D) + href: https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/six_exemptions.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/six_exemptions.yaml new file mode 100644 index 000000000..9337b559a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/six_exemptions.yaml @@ -0,0 +1,104 @@ +description: New Mexico provides the following low income comprehensive tax rebate for filers with six or more exemptions. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 520 + - threshold: + 2021-01-01: 1_001 + amount: + 2021-01-01: 675 + - threshold: + 2021-01-01: 1_501 + amount: + 2021-01-01: 705 + - threshold: + 2021-01-01: 2_501 + amount: + 2021-01-01: 730 + - threshold: + 2021-01-01: 8_001 + amount: + 2021-01-01: 700 + - threshold: + 2021-01-01: 9_001 + amount: + 2021-01-01: 665 + - threshold: + 2021-01-01: 10_001 + amount: + 2021-01-01: 600 + - threshold: + 2021-01-01: 11_501 + amount: + 2021-01-01: 480 + - threshold: + 2021-01-01: 13_001 + amount: + 2021-01-01: 390 + - threshold: + 2021-01-01: 14_501 + amount: + 2021-01-01: 335 + - threshold: + 2021-01-01: 16_501 + amount: + 2021-01-01: 300 + - threshold: + 2021-01-01: 18_001 + amount: + 2021-01-01: 260 + - threshold: + 2021-01-01: 19_501 + amount: + 2021-01-01: 230 + - threshold: + 2021-01-01: 23_001 + amount: + 2021-01-01: 195 + - threshold: + 2021-01-01: 24_501 + amount: + 2021-01-01: 180 + - threshold: + 2021-01-01: 26_001 + amount: + 2021-01-01: 170 + - threshold: + 2021-01-01: 27_501 + amount: + 2021-01-01: 155 + - threshold: + 2021-01-01: 29_501 + amount: + 2021-01-01: 130 + - threshold: + 2021-01-01: 31_001 + amount: + 2021-01-01: 105 + - threshold: + 2021-01-01: 32_501 + amount: + 2021-01-01: 90 + - threshold: + 2021-01-01: 34_001 + amount: + 2021-01-01: 75 + - threshold: + 2021-01-01: 36_001 + amount: + 2021-01-01: 0 +metadata: + threshold_unit: currency-USD + amount_unit: currency-USD + type: single_amount + label: New Mexico comprehensive low income tax rebate six exemptions amount + reference: + - title: New Mexico 2022 PIT-RC, page 58, SECTION II LOW INCOME COMPREHENSIVE TAX REBATE + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: New Mexico 2022 PIT-RC, page 70, TABLE 1 - 2022 Low Income Comprehensive Tax Rebate Table + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=70 + - title: New Mexico 2021 PIT-RC, page 60, SECTION II Line 14, TABLE 1 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=60 + - title: N.M. Stat. § 7-2-14(D) + href: https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/three_exemptions.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/three_exemptions.yaml new file mode 100644 index 000000000..13826be28 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/three_exemptions.yaml @@ -0,0 +1,100 @@ +description: New Mexico provides the following low income comprehensive tax rebate for filers with three exemptions. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 325 + - threshold: + 2021-01-01: 1_001 + amount: + 2021-01-01: 405 + - threshold: + 2021-01-01: 7_501 + amount: + 2021-01-01: 390 + - threshold: + 2021-01-01: 8_001 + amount: + 2021-01-01: 375 + - threshold: + 2021-01-01: 9_001 + amount: + 2021-01-01: 340 + - threshold: + 2021-01-01: 10_001 + amount: + 2021-01-01: 275 + - threshold: + 2021-01-01: 11_501 + amount: + 2021-01-01: 235 + - threshold: + 2021-01-01: 13_001 + amount: + 2021-01-01: 220 + - threshold: + 2021-01-01: 14_501 + amount: + 2021-01-01: 185 + - threshold: + 2021-01-01: 16_501 + amount: + 2021-01-01: 165 + - threshold: + 2021-01-01: 18_001 + amount: + 2021-01-01: 145 + - threshold: + 2021-01-01: 19_501 + amount: + 2021-01-01: 140 + - threshold: + 2021-01-01: 23_001 + amount: + 2021-01-01: 120 + - threshold: + 2021-01-01: 24_501 + amount: + 2021-01-01: 115 + - threshold: + 2021-01-01: 26_001 + amount: + 2021-01-01: 105 + - threshold: + 2021-01-01: 27_501 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 29_501 + amount: + 2021-01-01: 80 + - threshold: + 2021-01-01: 31_001 + amount: + 2021-01-01: 65 + - threshold: + 2021-01-01: 32_501 + amount: + 2021-01-01: 50 + - threshold: + 2021-01-01: 34_001 + amount: + 2021-01-01: 40 + - threshold: + 2021-01-01: 36_001 + amount: + 2021-01-01: 0 +metadata: + threshold_unit: currency-USD + amount_unit: currency-USD + type: single_amount + label: New Mexico comprehensive low income tax rebate three exemptions amount + reference: + - title: New Mexico 2022 PIT-RC, page 58, SECTION II LOW INCOME COMPREHENSIVE TAX REBATE + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: New Mexico 2022 PIT-RC, page 70, TABLE 1 - 2022 Low Income Comprehensive Tax Rebate Table + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=70 + - title: New Mexico 2021 PIT-RC, page 60, SECTION II Line 14, TABLE 1 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=60 + - title: N.M. Stat. § 7-2-14(D) + href: https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/two_exemptions.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/two_exemptions.yaml new file mode 100644 index 000000000..02bfab75e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/amount/two_exemptions.yaml @@ -0,0 +1,100 @@ +description: New Mexico provides the following low income comprehensive tax rebate for filers with two exemptions. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 260 + - threshold: + 2021-01-01: 1_001 + amount: + 2021-01-01: 315 + - threshold: + 2021-01-01: 7_501 + amount: + 2021-01-01: 310 + - threshold: + 2021-01-01: 8_001 + amount: + 2021-01-01: 285 + - threshold: + 2021-01-01: 9_001 + amount: + 2021-01-01: 250 + - threshold: + 2021-01-01: 10_001 + amount: + 2021-01-01: 210 + - threshold: + 2021-01-01: 11_501 + amount: + 2021-01-01: 185 + - threshold: + 2021-01-01: 13_001 + amount: + 2021-01-01: 170 + - threshold: + 2021-01-01: 14_501 + amount: + 2021-01-01: 155 + - threshold: + 2021-01-01: 16_501 + amount: + 2021-01-01: 130 + - threshold: + 2021-01-01: 18_001 + amount: + 2021-01-01: 115 + - threshold: + 2021-01-01: 19_501 + amount: + 2021-01-01: 105 + - threshold: + 2021-01-01: 23_001 + amount: + 2021-01-01: 100 + - threshold: + 2021-01-01: 24_501 + amount: + 2021-01-01: 90 + - threshold: + 2021-01-01: 26_001 + amount: + 2021-01-01: 80 + - threshold: + 2021-01-01: 27_501 + amount: + 2021-01-01: 75 + - threshold: + 2021-01-01: 29_501 + amount: + 2021-01-01: 55 + - threshold: + 2021-01-01: 31_001 + amount: + 2021-01-01: 50 + - threshold: + 2021-01-01: 32_501 + amount: + 2021-01-01: 40 + - threshold: + 2021-01-01: 34_001 + amount: + 2021-01-01: 35 + - threshold: + 2021-01-01: 36_001 + amount: + 2021-01-01: 0 +metadata: + threshold_unit: currency-USD + amount_unit: currency-USD + type: single_amount + label: New Mexico comprehensive low income tax rebate two exemptions amount + reference: + - title: New Mexico 2022 PIT-RC, page 58, SECTION II LOW INCOME COMPREHENSIVE TAX REBATE + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: New Mexico 2022 PIT-RC, page 70, TABLE 1 - 2022 Low Income Comprehensive Tax Rebate Table + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=70 + - title: New Mexico 2021 PIT-RC, page 60, SECTION II Line 14, TABLE 1 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=60 + - title: N.M. Stat. § 7-2-14(D) + href: https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/divisor.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/divisor.yaml new file mode 100644 index 000000000..7c75ada29 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/divisor.yaml @@ -0,0 +1,15 @@ +description: New Mexico divides its low income comprehensive tax rebate by this number for married filing separately filers. +values: + 2020-01-01: 2 +metadata: + unit: /1 + label: New Mexico low income rebate divisor for married filing separately + reference: + - title: N.M. Stat. § 7-2-14(A) + href: https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false + - title: New Mexico 2022 PIT-RC, page 58, SECTION II LOW INCOME COMPREHENSIVE TAX REBATE + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: New Mexico 2022 PIT-RC, page 70, TABLE 1 - 2022 Low Income Comprehensive Tax Rebate Table + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=70 + - title: New Mexico 2021 PIT-RC, page 60, SECTION II Line 14, TABLE 1 + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=60 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/exemptions/aged.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/exemptions/aged.yaml new file mode 100644 index 000000000..4a6b398ed --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/exemptions/aged.yaml @@ -0,0 +1,21 @@ +description: New Mexico provides an additional exemption amount under the low income comprehensive tax rebate for people this age or older. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 0 + - threshold: + 2021-01-01: 65 + amount: + 2021-01-01: 2 +metadata: + threshold_unit: year + type: single_amount + label: New Mexico low income rebate aged exemption + reference: + - title: N.M. Stat. § 7-2-14(C) + href: https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false + - title: New Mexico 2022 PIT-RC, page 56, Exemptions - line 2 (e), (f) + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=56 + - title: New Mexico 2021 PIT-RC, page 57, Exemptions - line 2 (e), (f) + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=57 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/exemptions/blind.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/exemptions/blind.yaml new file mode 100644 index 000000000..0670cd76f --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/low_income/exemptions/blind.yaml @@ -0,0 +1,12 @@ +description: New Mexico provides an additional exemption under the low income comprehensive tax rebate for blind filers. +values: + 2021-01-01: 1 +metadata: + label: New Mexico low income rebate blind exemption + reference: + - title: N.M. Stat. § 7-2-14(C) + href: https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false + - title: New Mexico 2022 PIT-RC, page 56, Exemptions - line 2 (c) + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=56 + - title: New Mexico 2021 PIT-RC, page 57, Exemptions - line 2 (c) + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=57 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/age_eligibility.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/age_eligibility.yaml new file mode 100644 index 000000000..02dfe3724 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/age_eligibility.yaml @@ -0,0 +1,14 @@ +description: New Mexico provides the property tax rebate for filers at or above this age threshold. +values: + 2021-01-01: 65 +metadata: + unit: year + period: year + label: New Mexico property tax rebate age threshold + reference: + - title: NM 2022 PIT-RC instructions + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: 2021 PIT-RC NEW MEXICO REBATE AND CREDIT SCHEDULE + href: https://taxsim.nber.org/historical_state_tax_forms/NM/2021/2021pit-rc.pdf#page=2 + - title: N.M. Code R. Chapter 7 - Taxation, 7-2-18, A, Tax rebate of property tax due that exceeds the elderly taxpayer's maximum property tax liability; refund. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503750/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsAgJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/income_threshold.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/income_threshold.yaml new file mode 100644 index 000000000..cdcacd033 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/income_threshold.yaml @@ -0,0 +1,14 @@ +description: New Mexico provides the property tax rebate for filers with income below this threshold. +values: + 2021-01-01: 16_000 +metadata: + unit: currency-USD + period: year + label: New Mexico property tax rebate income threshold + reference: + - title: NM 2022 PIT-RC instructions + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: 2021 PIT-RC NEW MEXICO REBATE AND CREDIT SCHEDULE + href: https://taxsim.nber.org/historical_state_tax_forms/NM/2021/2021pit-rc.pdf#page=2 + - title: N.M. Code R. Chapter 7 - Taxation, 7-2-18, H, Tax rebate of property tax due that exceeds the elderly taxpayer's maximum property tax liability; refund. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503750/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsAgJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/max_amount.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/max_amount.yaml new file mode 100644 index 000000000..63d0dbe9c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/max_amount.yaml @@ -0,0 +1,25 @@ +description: New Mexico provides the following maximum property tax rebate amount depending on filing status. +metadata: + unit: currency-USD + period: year + breakdown: + - filing_status + label: New Mexico property tax rebate max amount + reference: + - title: NM 2022 PIT-RC instructions + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: 2021 PIT-RC NEW MEXICO REBATE AND CREDIT SCHEDULE + href: https://taxsim.nber.org/historical_state_tax_forms/NM/2021/2021pit-rc.pdf#page=2 + - title: N.M. Code R. Chapter 7 - Taxation, 7-2-18, H, Tax rebate of property tax due that exceeds the elderly taxpayer's maximum property tax liability; refund. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503750/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsAgJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA + +JOINT: + 2021-01-01: 250 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 250 +WIDOW: + 2021-01-01: 250 +SINGLE: + 2021-01-01: 250 +SEPARATE: + 2021-01-01: 125 diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/max_property_tax_liability.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/max_property_tax_liability.yaml new file mode 100644 index 000000000..99d1d2cb6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/max_property_tax_liability.yaml @@ -0,0 +1,84 @@ +description: New Mexico provides the following maximum property tax liability for elderly homeowners. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 20 + - threshold: + 2021-01-01: 1_001 + amount: + 2021-01-01: 25 + - threshold: + 2021-01-01: 2_001 + amount: + 2021-01-01: 30 + - threshold: + 2021-01-01: 3_001 + amount: + 2021-01-01: 35 + - threshold: + 2021-01-01: 4_001 + amount: + 2021-01-01: 40 + - threshold: + 2021-01-01: 5_001 + amount: + 2021-01-01: 45 + - threshold: + 2021-01-01: 6_001 + amount: + 2021-01-01: 50 + - threshold: + 2021-01-01: 7_001 + amount: + 2021-01-01: 55 + - threshold: + 2021-01-01: 8_001 + amount: + 2021-01-01: 60 + - threshold: + 2021-01-01: 9_001 + amount: + 2021-01-01: 75 + - threshold: + 2021-01-01: 10_001 + amount: + 2021-01-01: 90 + - threshold: + 2021-01-01: 11_001 + amount: + 2021-01-01: 105 + - threshold: + 2021-01-01: 12_001 + amount: + 2021-01-01: 120 + - threshold: + 2021-01-01: 13_001 + amount: + 2021-01-01: 135 + - threshold: + 2021-01-01: 14_001 + amount: + 2021-01-01: 150 + - threshold: + 2021-01-01: 15_001 + amount: + 2021-01-01: 180 + - threshold: + 2021-01-01: 16_001 + amount: + 2021-01-01: 0 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: currency-USD + period: year + label: New Mexico elderly max property tax liability + reference: + - title: NM 2022 PIT-RC instructions + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=71 + - title: 2021 New Mexico personal income tax form packet + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/608063af-0c4c-4f28-ba42-cf40e04557ca/PITbook2021.pdf#page=61 + - title: N.M. Code R. Chapter 7 - Taxation, 7-2-18, H, Tax rebate of property tax due that exceeds the elderly taxpayer's maximum property tax liability; refund. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503750/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsAgJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA diff --git a/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/rent_rate.yaml b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/rent_rate.yaml new file mode 100644 index 000000000..1b1f7efb6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/nm/tax/income/rebates/property_tax/rent_rate.yaml @@ -0,0 +1,14 @@ +description: New Mexico treats this percentage of rent as property tax for the property tax rebate. +values: + 2021-01-01: 0.06 +metadata: + unit: /1 + period: year + label: New Mexico property tax rebate rent rate + reference: + - title: NM 2022 PIT-RC instructions + href: https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + - title: 2021 PIT-RC NEW MEXICO REBATE AND CREDIT SCHEDULE + href: https://taxsim.nber.org/historical_state_tax_forms/NM/2021/2021pit-rc.pdf#page=2 + - title: N.M. Code R. Chapter 7 - Taxation, 7-2-18, B, Tax rebate of property tax due that exceeds the elderly taxpayer's maximum property tax liability; refund. + href: https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503750/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsAgJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA diff --git a/fiscalsim_us/parameters/gov/states/ny/otda/README.md b/fiscalsim_us/parameters/gov/states/ny/otda/README.md new file mode 100644 index 000000000..e93247b12 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ny/otda/README.md @@ -0,0 +1 @@ +# Office of Temporary and Disability Assistance diff --git a/fiscalsim_us/parameters/gov/states/ny/otda/tanf/README.md b/fiscalsim_us/parameters/gov/states/ny/otda/tanf/README.md new file mode 100644 index 000000000..eb8aeb3f9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ny/otda/tanf/README.md @@ -0,0 +1 @@ +# Temporary Assistance for Needy Families diff --git a/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/cdcc/README.md index ab56c53c0..03da87d0c 100644 --- a/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/cdcc/README.md +++ b/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/cdcc/README.md @@ -1 +1 @@ -# Child and dependent care credit +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/ctc/README.md b/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/ctc/README.md index 0aecfab04..01fccadc1 100644 --- a/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/ctc/README.md +++ b/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/ctc/README.md @@ -1 +1 @@ -# Empire State child credit +# Empire State Child Credit diff --git a/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/eitc/README.md index 154f07eec..4808d739a 100644 --- a/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/eitc/README.md +++ b/fiscalsim_us/parameters/gov/states/ny/tax/income/credits/eitc/README.md @@ -1 +1 @@ -# EITC +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/oh/index.yaml b/fiscalsim_us/parameters/gov/states/oh/index.yaml index a50c592b9..2852e302a 100644 --- a/fiscalsim_us/parameters/gov/states/oh/index.yaml +++ b/fiscalsim_us/parameters/gov/states/oh/index.yaml @@ -1,3 +1,4 @@ metadata: propagate_metadata_to_children: true economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/age_limit.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/age_limit.yaml new file mode 100644 index 000000000..e8434d7e4 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/age_limit.yaml @@ -0,0 +1,16 @@ +description: Ohio provides an adoption credit for children younger than this age. +values: + 2021-01-01: 18 +metadata: + reference: + - title: Ohio 2022 Instructions for Filing Original and Amended - Line 18 – Ohio Adoption Credit + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/it1040-sd100-instruction-booklet.pdf#page=21 + - title: Ohio Income - Individual Credits (Education, Displaced Workers & Adoption) 15. + href: https://tax.ohio.gov/wps/portal/gov/tax/help-center/faqs/income+-+individual+credits/income-individual-credits + # The ohio adoption credit has been repealed in the newest revised code, but can still be found in the previous legal code and 2022 tax form + - title: 2023 Ohio Rev. Code § 5747.37 + href: https://casetext.com/statute/ohio-revised-code/title-57-taxation/chapter-5747-income-tax/section-574737-repealed + - title: 2022 Ohio Revised Code Title 57 | Taxation Chapter 5747 | Income Tax Section 5747.37 | Credit for Legally Adopted Minor Child. (B)-(2) + href: https://law.justia.com/codes/ohio/2022/title-57/chapter-5747/section-5747-37/ + unit: year + label: Ohio adoption credit child age limit diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/amount/max.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/amount/max.yaml new file mode 100644 index 000000000..b165e86c8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/amount/max.yaml @@ -0,0 +1,19 @@ +description: Ohio issues the adoption credit of up to this maximum amount. +values: + 2021-01-01: 10_000 + 2023-01-01: 0 +metadata: + unit: currency-USD + period: year + label: Ohio adoption credit maximum amount + reference: + - title: Ohio 2022 Instructions for Filing Original and Amended - Line 18 – Ohio Adoption Credit + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/it1040-sd100-instruction-booklet.pdf#page=21 + - title: Ohio Income - Individual Credits (Education, Displaced Workers & Adoption) 15. - 20. + href: https://tax.ohio.gov/wps/portal/gov/tax/help-center/faqs/income+-+individual+credits/income-individual-credits + # The ohio adoption credit has been repealed in the newest revised code, but can still be found in the previous legal code and 2022 tax form + - title: 2023 Ohio Rev. Code § 5747.37 + href: https://casetext.com/statute/ohio-revised-code/title-57-taxation/chapter-5747-income-tax/section-574737-repealed + - title: 2022 Ohio Revised Code Title 57 | Taxation Chapter 5747 | Income Tax Section 5747.37 | Credit for Legally Adopted Minor Child. (B)-(2) + href: https://law.justia.com/codes/ohio/2022/title-57/chapter-5747/section-5747-37/ + diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/amount/min.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/amount/min.yaml new file mode 100644 index 000000000..9e0705f1e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/adoption/amount/min.yaml @@ -0,0 +1,18 @@ +description: Ohio issues the adoption credit of this minimum amount. +values: + 2021-01-01: 1_500 + 2023-01-01: 0 +metadata: + unit: currency-USD + period: year + label: Ohio adoption credit minimum amount + reference: + - title: Ohio 2022 Instructions for Filing Original and Amended - Line 18 – Ohio Adoption Credit + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/it1040-sd100-instruction-booklet.pdf#page=21 + - title: Ohio Income - Individual Credits (Education, Displaced Workers & Adoption) 15. - 20. + href: https://tax.ohio.gov/wps/portal/gov/tax/help-center/faqs/income+-+individual+credits/income-individual-credits + # The Ohio adoption credit has been repealed in the newest revised code, but can still be found in the previous legal code and 2022 tax form + - title: 2023 Ohio Rev. Code § 5747.37 + href: https://casetext.com/statute/ohio-revised-code/title-57-taxation/chapter-5747-income-tax/section-574737-repealed + - title: 2022 Ohio Revised Code Title 57 | Taxation Chapter 5747 | Income Tax Section 5747.37 | Credit for Legally Adopted Minor Child. (B)-(1) + href: https://law.justia.com/codes/ohio/2022/title-57/chapter-5747/section-5747-37/ diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/cdcc/match.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/cdcc/match.yaml new file mode 100644 index 000000000..3eb9cfbea --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/cdcc/match.yaml @@ -0,0 +1,25 @@ +description: Ohio provides this Child and Dependent Care credit rate for each AGI level. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 1 + - threshold: + 2021-01-01: 20_000 + amount: + 2021-01-01: 0.25 + - threshold: + 2021-01-01: 40_000 + amount: + 2021-01-01: 0 +metadata: + threshold_unit: currency-USD + amount_unit: /1 + period: year + type: single_amount + label: Ohio Child Care and Dependent Care Credit amount + reference: + - title: Ohio 2021 Instructions for Filing Original and Amended - Line 6 – Child Care and Dependent Care Credit + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=30 + - title: Ohio Section 5747.054, Tax credit based on federal dependent care credit + href: https://codes.ohio.gov/ohio-revised-code/section-5747.054 diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/eitc/rate.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/eitc/rate.yaml new file mode 100644 index 000000000..8ab9cfb25 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/eitc/rate.yaml @@ -0,0 +1,11 @@ +description: Ohio matches the federal earned income tax credit at this rate. +values: + 2020-01-01: 0.3 +metadata: + unit: /1 + label: Ohio earned income credit rate + reference: + - title: Ohio Revised Code §5747.71 | Earned income tax credit + href: https://codes.ohio.gov/ohio-revised-code/section-5747.71 + - title: Ohio 2022 Instructions for Filing Original and Amended - Line 13 + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/it1040-sd100-instruction-booklet.pdf#page=21 diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/non_public_tuition.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/non_public_tuition.yaml new file mode 100644 index 000000000..e4d568013 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/non_public_tuition.yaml @@ -0,0 +1,27 @@ +description: Ohio caps the Nonchartered, Nonpublic, School Tuition Credit at this amount, depending on federal adjusted gross income. +brackets: + - threshold: + 2021-01-01: -.inf + amount: + 2021-01-01: 500 + - threshold: + 2021-01-01: 50_000 + amount: + 2021-01-01: 1_000 + - threshold: + 2021-01-01: 100_000 + amount: + 2021-01-01: 0 +metadata: + threshold_unit: currency-USD + amount_unit: currency-USD + type: single_amount + label: Ohio Non Public School Credit amount + reference: + - title: Ohio Income Tax Form, Line 16 – Nonchartered, Nonpublic School Tuition Credit, R.C. 5747.75 + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=21 + - title: Ohio Income Tax Form 2022, Line 16 + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/it1040-sd100-instruction-booklet.pdf#page=21 + - title: Credit for dependents who attend nonchartered nonpublic school. + href: https://codes.ohio.gov/ohio-revised-code/section-5747.75 + diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..7b89868ee --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/non_refundable.yaml @@ -0,0 +1,23 @@ +description: Ohio provides these non-refundable tax credits. +values: + 2021-01-01: + - oh_adoption_credit + - oh_eitc + - oh_cdcc + - oh_senior_citizen_credit + - oh_retirement_income_credit + - oh_non_public_school_credits + 2023-01-01: + - oh_eitc + - oh_cdcc + - oh_senior_citizen_credit + - oh_retirement_income_credit + - oh_non_public_school_credits +metadata: + unit: list + label: Ohio non-refundable tax credits + reference: + - title: 2021 Ohio Schedule of Credits + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/sch-cre.pdf + - title: 2022 Ohio Schedule of Credits + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/itschedule-credits.pdf diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/retirement_income/amount.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/retirement_income/amount.yaml new file mode 100644 index 000000000..c1ef2ba4a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/retirement_income/amount.yaml @@ -0,0 +1,38 @@ +description: Ohio provides this credit amount under the Retirement Income Credit, depending on retirement income. +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 0 + - threshold: + 2021-01-01: 500 + amount: + 2021-01-01: 25 + - threshold: + 2021-01-01: 1_500 + amount: + 2021-01-01: 50 + - threshold: + 2021-01-01: 3_000 + amount: + 2021-01-01: 80 + - threshold: + 2021-01-01: 5_000 + amount: + 2021-01-01: 130 + - threshold: + 2021-01-01: 8_000 + amount: + 2021-01-01: 200 +metadata: + threshold_unit: currency-USD + amount_unit: currency-USD + type: single_amount + label: Ohio Retirement Income Credit amount + reference: + - title: Ohio Income Tax Form Lump Sum Retirement Credit Worksheet Table 2 + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=29 + - title: Ohio 2022 Instructions for Filing Original and Amended - Line 2 – Retirement Income Credit R.C. 5747.055(B) + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/it1040-sd100-instruction-booklet.pdf#page=20 + - title: Ohio Revised Code, Title 57 Taxation, Chapter 5747 Income Tax, Section 5747.055(B), Tax credit for retirement income + href: https://codes.ohio.gov/ohio-revised-code/section-5747.055 diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/retirement_income/income_threshold.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/retirement_income/income_threshold.yaml new file mode 100644 index 000000000..56e94b4b8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/retirement_income/income_threshold.yaml @@ -0,0 +1,14 @@ +description: Ohio limits its retirement income credit to filers with state adjusted gross income below this amount. +values: + 2021-01-01: 100_000 +metadata: + unit: currency-USD + period: year + label: Ohio retirement credit income threshold + reference: + - title: Ohio 2021 Instructions for Filing Original and Amended - Line 2 – Retirement Credit R.C. 5747.055(B) + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=20 + - title: Ohio Revised Code, Title 57 Taxation, Chapter 5747 Income Tax, Section 5747.055(B), Tax credit for retirement income + href: https://codes.ohio.gov/ohio-revised-code/section-5747.055 + - title: Ohio 2022 Instructions for Filing Original and Amended - Line 2 – Retirement Income Credit R.C. 5747.055(B) + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/it1040-sd100-instruction-booklet.pdf#page=20 diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/senior_citizen/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/senior_citizen/age_threshold.yaml new file mode 100644 index 000000000..9098397ba --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/senior_citizen/age_threshold.yaml @@ -0,0 +1,12 @@ +description: Ohio provides the Senior Citizen Credit to filers at or above this age threshold. +values: + 2021-01-01: 65 +metadata: + unit: year + period: year + label: Ohio Senior Citizen Credit age threshold + reference: + - title: Ohio 2021 Instructions for Filing Original and Amended - Line 4 – Senior Citizen Credit R.C. 5747.055(F) + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=20 + - title: Ohio Section R.C. 5747.055(F), Tax credit for retirement income. + href: https://codes.ohio.gov/ohio-revised-code/section-5747.055 diff --git a/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/senior_citizen/agi_limit.yaml b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/senior_citizen/agi_limit.yaml new file mode 100644 index 000000000..44f29b8d6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/oh/tax/income/credits/senior_citizen/agi_limit.yaml @@ -0,0 +1,21 @@ +description: Ohio Senior Citizen Credit AGI amount +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 50 + - threshold: + 2021-01-01: 100_000 + amount: + 2021-01-01: 0 +metadata: + threshold_unit: currency-USD + amount_unit: currency-USD + period: year + type: single_amount + label: OH Senior Citizen Credit amount + reference: + - title: Ohio 2021 Instructions for Filing Original and Amended - Line 4 – Senior Citizen Credit + href: https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=20 + - title: Ohio Section R.C. 5747.055(F), Tax credit for retirement income. + href: https://codes.ohio.gov/ohio-revised-code/section-5747.055 diff --git a/fiscalsim_us/parameters/gov/states/ok/tax/income/credits/child/README.md b/fiscalsim_us/parameters/gov/states/ok/tax/income/credits/child/README.md new file mode 100644 index 000000000..edbff69df --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ok/tax/income/credits/child/README.md @@ -0,0 +1 @@ +# Child Care / Child Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/ok/tax/income/credits/earned_income/README.md b/fiscalsim_us/parameters/gov/states/ok/tax/income/credits/earned_income/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ok/tax/income/credits/earned_income/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/amount.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/amount.yaml new file mode 100644 index 000000000..99fc6afbb --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/amount.yaml @@ -0,0 +1,10 @@ +description: Oregon provides this maximum Child Tax Credit per qualifying child. +values: + 0000-01-01: 0 + 2023-01-01: 1_000 +metadata: + unit: currency-USD + label: Oregon Child Tax Credit amount + reference: + - title: 2023R1 House Bill 3235 Section 2 (3)(a) + href: https://olis.oregonlegislature.gov/liz/2023R1/Downloads/MeasureDocument/HB3235/Enrolled#page=1 diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/child_limit.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/child_limit.yaml new file mode 100644 index 000000000..28159e43f --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/child_limit.yaml @@ -0,0 +1,9 @@ +description: Oregon caps its Child Tax Credit at this number of children per filer. +values: + 0000-01-01: 5 +metadata: + unit: person + label: Oregon Child Tax Credit child limit + reference: + - title: 2023R1 House Bill 3235 Section 2 (2) + href: https://olis.oregonlegislature.gov/liz/2023R1/Downloads/MeasureDocument/HB3235/Enrolled#page=1 diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/ineligible_age.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/ineligible_age.yaml new file mode 100644 index 000000000..44bd21aa0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/ineligible_age.yaml @@ -0,0 +1,9 @@ +description: Oregon provides this Child Tax Credit to children below this age. +values: + 0000-01-01: 6 +metadata: + unit: year + label: Oregon Child Tax Credit ineligible age + reference: + - title: 2023R1 House Bill 3235 Section 2 (1)(a) + href: https://olis.oregonlegislature.gov/liz/2023R1/Downloads/MeasureDocument/HB3235/Enrolled#page=1 diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/reduction/start.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/reduction/start.yaml new file mode 100644 index 000000000..da62400ec --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/reduction/start.yaml @@ -0,0 +1,9 @@ +description: Oregon reduces its Child Tax Credit for filers with Oregon adjusted gross income exceeding this amount. +values: + 0000-01-01: 25_000 +metadata: + unit: currency-USD + label: Oregon Child Tax Credit phase-out start + reference: + - title: 2023R1 House Bill 3235 Section 2 (3)(a) + href: https://olis.oregonlegislature.gov/liz/2023R1/Downloads/MeasureDocument/HB3235/Enrolled#page=1 diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/reduction/width.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/reduction/width.yaml new file mode 100644 index 000000000..1f700a6bc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/ctc/reduction/width.yaml @@ -0,0 +1,9 @@ +description: Oregon reduces its Child Tax Credit over this income range exceeding the phase-out start. +values: + 0000-01-01: 5_000 +metadata: + unit: currency-USD + label: Oregon Child Tax Credit phase-out width + reference: + - title: 2023R1 House Bill 3235 Section 2 (4) + href: https://olis.oregonlegislature.gov/liz/2023R1/Downloads/MeasureDocument/HB3235/Enrolled#page=2 diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/eitc/README.md index 154f07eec..4808d739a 100644 --- a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/eitc/README.md +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/eitc/README.md @@ -1 +1 @@ -# EITC +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/nonrefundable.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/nonrefundable.yaml index 963ad2159..b61d6c816 100644 --- a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/nonrefundable.yaml +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/nonrefundable.yaml @@ -1,7 +1,8 @@ -description: Oregon nonrefundable tax credits. -values: - 2019-01-01: - - or_exemption_credit -metadata: - unit: list - label: OR nonrefundable tax credits +description: Oregon nonrefundable tax credits. +values: + 2019-01-01: + - or_exemption_credit + - or_retirement_credit +metadata: + unit: list + label: OR nonrefundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/refundable.yaml index 1bcbd4f57..885f8612a 100644 --- a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/refundable.yaml +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/refundable.yaml @@ -1,8 +1,17 @@ -description: Oregon refundable tax credits. -values: - 2019-01-01: - - or_eitc - - or_kicker -metadata: - unit: list - label: OR refundable tax credits +description: Oregon refundable tax credits. +values: + 2019-01-01: + - or_eitc + - or_kicker + 2023-01-01: + - or_eitc + - or_kicker + - or_ctc + # Child Tax Credit legislation ends in 2029. + 2029-01-01: + - or_eitc + - or_kicker +metadata: + unit: list + label: OR refundable tax credits + diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/age_eligibility.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/age_eligibility.yaml new file mode 100644 index 000000000..4b4c0c821 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/age_eligibility.yaml @@ -0,0 +1,15 @@ +description: Oregon qualifies filers for the retirement income credit at or above this age threshold. +values: + 1991-01-01: 58 + 1993-01-01: 59 + 1995-01-01: 60 + 1997-01-01: 61 + 1999-01-01: 62 +metadata: + unit: year + label: Oregon retirement income credit age eligiblity + reference: + - title: Chapter 316 — Personal Income Tax 316.157 - Credit for retirement income (1) (b) + href: https://casetext.com/statute/oregon-revised-statutes/title-29-revenue-and-taxation/chapter-316-personal-income-tax/additional-credits/retirement-income/section-316157-credit-for-retirement-income + - title: 2022 Publication OR-17, Oregon Individual Income Tax Guide, 150-101-431 + href: https://www.oregon.gov/dor/forms/FormsPubs/publication-or-17_101-431_2022.pdf#page=109 diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/base.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/base.yaml new file mode 100644 index 000000000..b4a9f05da --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/base.yaml @@ -0,0 +1,22 @@ +description: Oregon allows for the following retirement income credit base amount, based on filing status. +metadata: + unit: currency-USD + breakdown: + - filing_status + label: Oregon retirement income credit base + reference: + - title: Chapter 316 — Personal Income Tax 316.157 - Credit for retirement income (1) (c) + href: https://casetext.com/statute/oregon-revised-statutes/title-29-revenue-and-taxation/chapter-316-personal-income-tax/additional-credits/retirement-income/section-316157-credit-for-retirement-income + - title: 2022 Publication OR-17, Oregon Individual Income Tax Guide, 150-101-431 + href: https://www.oregon.gov/dor/forms/FormsPubs/publication-or-17_101-431_2022.pdf#page=109 + +JOINT: + 2018-01-01: 15_000 +HEAD_OF_HOUSEHOLD: + 2018-01-01: 7_500 +WIDOW: + 2018-01-01: 7_500 +SINGLE: + 2018-01-01: 7_500 +SEPARATE: + 2018-01-01: 7_500 diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/income_threshold.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/income_threshold.yaml new file mode 100644 index 000000000..5b56fe824 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/income_threshold.yaml @@ -0,0 +1,23 @@ +description: Oregon reduces the retirement income credit for filers with household income above the following threshold, based on filing status. +metadata: + unit: currency-USD + label: Oregon retirement income credit income threshold + breakdown: + - filing_status + reference: + - title: Chapter 316 — Personal Income Tax 316.157 - Credit for retirement income (3) + href: https://casetext.com/statute/oregon-revised-statutes/title-29-revenue-and-taxation/chapter-316-personal-income-tax/additional-credits/retirement-income/section-316157-credit-for-retirement-income + - title: 2022 Publication OR-17, Oregon Individual Income Tax Guide, 150-101-431 + href: https://www.oregon.gov/dor/forms/FormsPubs/publication-or-17_101-431_2022.pdf#page=109 + + +JOINT: + 2018-01-01: 30_000 +HEAD_OF_HOUSEHOLD: + 2018-01-01: 15_000 +WIDOW: + 2018-01-01: 15_000 +SINGLE: + 2018-01-01: 15_000 +SEPARATE: + 2018-01-01: 15_000 diff --git a/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/percentage.yaml b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/percentage.yaml new file mode 100644 index 000000000..1825a76d9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/or/tax/income/credits/retirement_income/percentage.yaml @@ -0,0 +1,11 @@ +description: Oregon multplies the lesser of the retirement income base credit amount or the filers retirement income by the following percentage. +values: + 2018-01-01: 0.09 +metadata: + unit: /1 + label: Oregon retirement income credit percentage + reference: + - title: Chapter 316 — Personal Income Tax 316.157 - Credit for retirement income (2) + href: https://casetext.com/statute/oregon-revised-statutes/title-29-revenue-and-taxation/chapter-316-personal-income-tax/additional-credits/retirement-income/section-316157-credit-for-retirement-income + - title: 2022 Publication OR-17, Oregon Individual Income Tax Guide, 150-101-431 + href: https://www.oregon.gov/dor/forms/FormsPubs/publication-or-17_101-431_2022.pdf#page=110 diff --git a/fiscalsim_us/parameters/gov/states/pa/dhs/README.md b/fiscalsim_us/parameters/gov/states/pa/dhs/README.md new file mode 100644 index 000000000..4f379ec3e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/pa/dhs/README.md @@ -0,0 +1 @@ +# Department of Human Services diff --git a/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/README.md b/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/README.md new file mode 100644 index 000000000..0c15e7334 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/README.md @@ -0,0 +1 @@ +# Temporary Assistance for Needy Families \ No newline at end of file diff --git a/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/cash_assistance/age_limit.yaml b/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/cash_assistance/age_limit.yaml new file mode 100644 index 000000000..201fdb14a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/cash_assistance/age_limit.yaml @@ -0,0 +1,11 @@ +description: Pennsylvania limits TANF eligibility to people below this age, or students exactly this age. +values: + 2023-01-01: 18 +metadata: + unit: year + label: Pennsylvania TANF age eligibility + reference: + - title: Cash Assistance Handbook - Age Eligibility for PA TANF + href: http://services.dpw.state.pa.us/oimpolicymanuals/cash/index.htm#t=121_Age%2F121_1_General_Policy_%E2%80%93_TANF.htm + household: false + economy: false diff --git a/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/pregnancy_eligibility/age_limit.yaml b/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/pregnancy_eligibility/age_limit.yaml new file mode 100644 index 000000000..9ad78d91c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/pregnancy_eligibility/age_limit.yaml @@ -0,0 +1,9 @@ +description: Pennsylvania has limitation for applying TANF to pregnant women above or equal to this age. +values: + 2013-08-16: 18 +metadata: + unit: year + label: Pennsylvania TANF age limitation for pregnant women with child receiving TANF + reference: + - title: Cash Assistance Handbook - 110.211 Pregnant Women + href: http://services.dpw.state.pa.us/oimpolicymanuals/cash/index.htm#t=110_Budget_Groups%2F110_2_TANF_Budget_Groups.htm%23110.211_Pregnant_womenbc-2&rhsearch=countable%20assets&rhsyns=%20&rhtocid=_7_1_1 diff --git a/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/resource_limit.yaml b/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/resource_limit.yaml new file mode 100644 index 000000000..8c5f1b064 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/pa/dhs/tanf/resource_limit.yaml @@ -0,0 +1,13 @@ +description: Pennsylvania limits TANF benefits to households with resources at or below this amount. +values: + 1988-11-01: 1_000 +metadata: + unit: currency-USD + label: Pennsylvania TANF resource limit + reference: + - title: Pennsylvania Cash Assistance Handbook | 140.11 Resource Limits + href: http://services.dpw.state.pa.us/oimpolicymanuals/cash/index.htm#t=140_Resources%2F140_1_General_Policy.htm&rhsearch=1%2C000&rhsyns=%20 + - title: Pennsylvania code - 140.11 Resource Limits + href: https://www.pacodeandbulletin.gov/Display/pacode?file=/secure/pacode/data/055/chapter177/s177.31.html&d=reduce + household: false + economy: false diff --git a/fiscalsim_us/parameters/gov/states/ri/README.md b/fiscalsim_us/parameters/gov/states/ri/README.md new file mode 100644 index 000000000..e525dec45 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/README.md @@ -0,0 +1 @@ +# Rhode Island diff --git a/fiscalsim_us/parameters/gov/states/ri/index.yaml b/fiscalsim_us/parameters/gov/states/ri/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/cdcc/rate.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/cdcc/rate.yaml new file mode 100644 index 000000000..cc7d6b81d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/cdcc/rate.yaml @@ -0,0 +1,13 @@ +description: Rhode Island matches the Federal Credit for child and dependent care expenses by this rate. +values: + 2021-01-01: 0.25 +metadata: + unit: /1 + label: Rhode Island CDCC match percent + reference: + - title: 2022 Form RI-1040 Resident Individual Income Tax Return - page 3 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022_1040WE_w_0.pdf + - title: 2021 Form RI-1040 Resident Individual Income Tax Return - page 3 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021_1040we_w.pdf + - title: R.I. Gen. Laws § 44-30-2.6(F)(I)(g) + href: http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-30/44-30-2.6.HTM diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/eitc/match.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/eitc/match.yaml new file mode 100644 index 000000000..88b2c2ae8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/eitc/match.yaml @@ -0,0 +1,13 @@ +description: Rhode Island matches the federal EITC by this percentage. +values: + 2021-01-01: 0.15 +metadata: + unit: /1 + label: Rhode Island EITC match percent + reference: + - title: 2022 Form RI-1040 Resident Individual Income Tax Return - page 3 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022_1040WE_w_0.pdf + - title: 2021 Form RI-1040 Resident Individual Income Tax Return + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021_1040we_w.pdf + - title: Rhode Island Department of Revenue Division of Taxation - page 16 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2023-02/RI-MA%20NATP%20Jan%205%202023-CA.pdf diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/age_threshold.yaml new file mode 100644 index 000000000..923375268 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/age_threshold.yaml @@ -0,0 +1,15 @@ +description: Rhode Island limits its property tax credit to filers this age or older, or who have a disability. + +values: + 2021-01-01: 65 +metadata: + unit: year + period: year + label: Rhode Island property tax credit age threshold + reference: + - title: Rhode Island General Laws - Section 44-33-3. - Definitions. (1) + href: https://law.justia.com/codes/rhode-island/2022/title-44/chapter-44-33/section-44-33-3/ + - title: 2022 Form RI-1040H Rhode Island Property Tax Relief Claim + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20RI-1040H_v2_w.pdf#page=1 + - title: 2021 Form RI-1040H Rhode Island Property Tax Relief Claim + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021-ri-1040h_w.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/cap.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/cap.yaml new file mode 100644 index 000000000..e5c63af68 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/cap.yaml @@ -0,0 +1,22 @@ +description: Rhode Island caps its property tax credit at this amount. + +values: + 1977-01-01: 55 + 1978-01-01: 150 + 1979-01-01: 175 + 1980-01-01: 200 + 1997-01-01: 250 + 2006-01-01: 300 + 2007-01-01: 500 + 2022-01-01: 600 +metadata: + label: Rhode Island property tax credit cap + period: year + unit: currency-USD + reference: + - title: Property Tax Relief R.I. Gen. Laws § 44-33-9 (2) + href: http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-33/44-33-9.htm + - title: 2022 Form RI-1040H Rhode Island Property Tax Relief Claim Line 12 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20RI-1040H_v2_w.pdf#page=1 + - title: 2021 Form RI-1040H Rhode Island Property Tax Relief Claim Line 12 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021-ri-1040h_w.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/max_amount.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/max_amount.yaml new file mode 100644 index 000000000..9b363ccde --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/max_amount.yaml @@ -0,0 +1,22 @@ +description: Rhode Island provides the following maximum amount under the property tax credit. + +values: + 1977-01-01: 55 + 1978-01-01: 150 + 1979-01-01: 175 + 1980-01-01: 200 + 1997-01-01: 250 + 2006-01-01: 300 + 2007-01-01: 500 + 2022-01-01: 600 +metadata: + label: Rhode Island property tax credit maximum amount + period: year + unit: currency-USD + reference: + - title: Property Tax Relief R.I. Gen. Laws § 44-33-9 (2) + href: http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-33/44-33-9.htm + - title: 2022 Form RI-1040H Rhode Island Property Tax Relief Claim Line 12 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20RI-1040H_v2_w.pdf#page=1 + - title: 2021 Form RI-1040H Rhode Island Property Tax Relief Claim Line 12 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021-ri-1040h_w.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/multiple_people.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/multiple_people.yaml new file mode 100644 index 000000000..cfc6b5d03 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/multiple_people.yaml @@ -0,0 +1,36 @@ +description: Rhode Island provides a property tax credit for property taxes exceeding this fraction of income, for filers in a multiple-people household, depending on income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Rhode Island property tax credit income threshold for multiple-people households + reference: + - title: Property Tax Relief R.I. Gen. Laws § 44-33-9 (1) + href: http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-33/44-33-9.htm + - title: 2021 Form RI-1040H Rhode Island Property Tax Relief Claim + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021-ri-1040h_w.pdf#page=3 + - title: 2022 Form RI-1040H Rhode Island Property Tax Relief Claim + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20RI-1040H_v2_w.pdf#page=3 + +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 0.03 + - threshold: + 2021-01-01: 6_000 + amount: + 2021-01-01: 0.04 + - threshold: + 2021-01-01: 9_000 + amount: + 2021-01-01: 0.05 + - threshold: + 2021-01-01: 15_000 + amount: + 2021-01-01: 0.06 + - threshold: + 2021-01-01: 30_000 + 2022-01-01: 35_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/one_person.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/one_person.yaml new file mode 100644 index 000000000..3b12869d9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/one_person.yaml @@ -0,0 +1,36 @@ +description: Rhode Island provides a property tax credit for property taxes exceeding this fraction of income, for filers in a one-person household, depending on income. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: Rhode Island property tax credit income threshold for one-person households + reference: + - title: Property Tax Relief R.I. Gen. Laws § 44-33-9 (1) + href: http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-33/44-33-9.htm + - title: 2021 Form RI-1040H Rhode Island Property Tax Relief Claim + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021-ri-1040h_w.pdf#page=3 + - title: 2022 Form RI-1040H Rhode Island Property Tax Relief Claim + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20RI-1040H_v2_w.pdf#page=3 + +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 0.03 + - threshold: + 2021-01-01: 6_000 + amount: + 2021-01-01: 0.04 + - threshold: + 2021-01-01: 9_000 + amount: + 2021-01-01: 0.05 + - threshold: + 2021-01-01: 12_000 + amount: + 2021-01-01: 0.06 + - threshold: + 2021-01-01: 30_000 + 2022-01-01: 35_000 + amount: + 2021-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/rent.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/rent.yaml new file mode 100644 index 000000000..41d9a3a9a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/credits/property_tax/rate/rent.yaml @@ -0,0 +1,14 @@ +description: Rhode Island accounts for the following percentage of rent paid under the property tax credit. +values: + 2021-01-01: 0.2 +metadata: + unit: /1 + period: year + label: Rhode Island property tax credit rent rate + reference: + - title: 2022 Rhode Island General Laws - Section 44-33-3. - Definitions. (9) + href: https://law.justia.com/codes/rhode-island/2022/title-44/chapter-44-33/section-44-33-3/ + - title: 2021 Form RI-1040H Rhode Island Property Tax Relief Claim Line 8 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021-ri-1040h_w.pdf#page=1 + - title: 2022 Form RI-1040H Rhode Island Property Tax Relief Claim Line 8 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20RI-1040H_v2_w.pdf#page=1 diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/amount.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/amount.yaml index 07ab90e77..7d78821b7 100644 --- a/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/amount.yaml +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/amount.yaml @@ -7,20 +7,27 @@ metadata: - filing_status reference: - title: Rhode Island Department of Revenue, Division of Taxation, Inflation-adjusted amounts set for tax year 2023. - href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/ADV_2022_40_Inflation_Adjustments.pdf - + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/ADV_2022_40_Inflation_Adjustments.pdf#page=1 + - title: Rhode Island tax rate schedule and worksheets 2021 + href: https://tax.ri.gov/media/18021/download?language=en#page=1 + SINGLE: + 2021-01-01: 9_050 2022-01-01: 9_300 2023-01-01: 10_000 JOINT: + 2021-01-01: 18_100 2022-01-01: 18_600 2023-01-01: 20_050 HEAD_OF_HOUSEHOLD: + 2021-01-01: 13_550 2022-01-01: 13_950 2023-01-01: 15_050 SEPARATE: + 2021-01-01: 9_050 2022-01-01: 9_300 2023-01-01: 10_025 WIDOW: + 2021-01-01: 9_050 2022-01-01: 9_300 2023-01-01: 10_000 diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/increment.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/increment.yaml new file mode 100644 index 000000000..5ab5cf9e7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/increment.yaml @@ -0,0 +1,19 @@ +description: Rhode Island phases the standard deduction out at this increment. +values: + 2021-01-01: 6_000 + 2022-01-01: 6_200 + +metadata: + label: Rhode Island standard deduction phase out increment + period: year + unit: currency-USD + reference: + # Legal code specifies $5,000 starting in 2011. + - title: R.I. Gen. Laws § 44-30-2.6 (B), (III) + href: http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-30/44-30-2.6.HTM + - title: RHODE ISLAND TAX RATE SCHEDULE AND WORKSHEETS 2022 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20Tax%20Rate%20and%20Worksheets.pdf + - title: Rhode Island tax rate schedule and worksheets 2021 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2021-11/2021-tax-rate-and-worksheets.pdf + # Rhode Island tax form does not specify this rate + # According to tax form 2021/2022, this rate can only be found in corresponding tax rate schedule and worksheets diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/percentage.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/percentage.yaml new file mode 100644 index 000000000..5defbd657 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/percentage.yaml @@ -0,0 +1,15 @@ +description: Rhode Island phases out this percentage of its standard deduction for each increment by which their income exceeds the threshold. +metadata: + unit: /1 + label: Rhode Island standard deduction phase out rate + reference: + - title: R.I. Gen. Laws § 44-30-2.6 (c)(3)(B)(III) + href: http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-30/44-30-2.6.HTM + - title: RHODE ISLAND TAX RATE SCHEDULE AND WORKSHEETS 2022 - page 1 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20Tax%20Rate%20and%20Worksheets.pdf + - title: Rhode Island tax rate schedule and worksheets 2021 - page 1 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2021-11/2021-tax-rate-and-worksheets.pdf + # Rhode Island tax form does not specify this rate + # According to tax form 2021/2022, this rate can only be found in corresponding tax rate schedule and worksheets +values: + 2021-01-01: 0.2 diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/start.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/start.yaml new file mode 100644 index 000000000..d7d191e57 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/deductions/standard/phase_out/start.yaml @@ -0,0 +1,17 @@ +description: Rhode Island phases the standard deduction out for filers with income above this threshold. +values: + 2021-01-01: 210_750 + 2022-01-01: 217_050 + +metadata: + label: Rhode Island standard deduction phase out start + period: year + unit: currency-USD + reference: + # Legal code specifies $175,000 starting in 2011. + - title: R.I. Gen. Laws § 44-30-2.6 (c), (3), (B), (III) + href: http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-30/44-30-2.6.HTM + - title: 2022 FORM RI-1040 line 6 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022_1040WE_w_0.pdf + - title: 2021 FORM RI-1040 line 6 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021_1040we_w.pdf diff --git a/fiscalsim_us/parameters/gov/states/ri/tax/income/income_sources.yaml b/fiscalsim_us/parameters/gov/states/ri/tax/income/income_sources.yaml new file mode 100644 index 000000000..65a01fe87 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/ri/tax/income/income_sources.yaml @@ -0,0 +1,31 @@ +description: Rhode Island counts these income sources when calculating its property tax credit. +values: + 2021-01-01: + - employment_income # Line 14 + - self_employment_income # Line 14 + - dividend_income # Line 15 + - interest_income # Line 15 + - salt_refund_income # Line 16 + - alimony_income # Line 17 + - qualified_business_income # Line 18 + - capital_gains # Line 19 + - ira_contributions # Line 20 + - pension_income # Line 20 + - rental_income # Line 21 + - farm_income # Line 22 + - unemployment_compensation # Line 23 + - social_security # Line 24 + - tanf # Line 29 + - workers_compensation # Line 30 + - child_support_expense # Line 30 + +metadata: + unit: list + label: Rhode Island property tax credit household income sources + reference: + - title: 2022 Form RI-1040H Rhode Island Property Tax Relief Claim Line 32 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20RI-1040H_v2_w.pdf#page=2 + - title: 2021 Form RI-1040H Rhode Island Property Tax Relief Claim Line 32 + href: https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-01/2021-ri-1040h_w.pdf#page=2 + - title: 2022 Rhode Island General Laws § 44-33-3. Definitions. (7) + href: https://law.justia.com/codes/rhode-island/2022/title-44/chapter-44-33/section-44-33-3/ diff --git a/fiscalsim_us/parameters/gov/states/sc/index.yaml b/fiscalsim_us/parameters/gov/states/sc/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/README.md b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/max_care_expense_year_offset.yaml b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/max_care_expense_year_offset.yaml new file mode 100644 index 000000000..90dd249e0 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/max_care_expense_year_offset.yaml @@ -0,0 +1,16 @@ +description: Decoupled year offset for maximum CDCC expense cap +values: + 2020-01-01: 0 # use current year federal CDCC maximum expense cap + 2021-01-01: -1 # use 2020 federal CDCC maximum expense cap + 2022-01-01: 0 # use current year federal CDCC maximum expense cap +metadata: + reference: + - title: SC-1040 2021 + href: https://dor.sc.gov/forms-site/Forms/SC1040_2021.pdf + - title: Instructions for Form SC-1040 (line 11) + href: https://dor.sc.gov/forms-site/Forms/IITPacket_2021.pdf#page=22 + - title: South Carolina Legal Code | SECTION 12-6-3380 + href: https://www.scstatehouse.gov/code/t12c006.php + unit: int + period: year + label: Decoupled year offset for maximum CDCC expense cap diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/rate.yaml b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/rate.yaml new file mode 100644 index 000000000..407c1637e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/cdcc/rate.yaml @@ -0,0 +1,15 @@ +description: South Carolina matches this share of the federal Child and Dependent Care Credit. +values: + 2020-01-01: 0.07 + +metadata: + unit: /1 + period: year + label: South Carolina Child and Dependent Care Credit match + reference: + - title: SC-1040 2020 + href: https://dor.sc.gov/forms-site/Forms/SC1040_2020.pdf + - title: Instructions for Form SC-1040 (line 11) + href: https://dor.sc.gov/forms-site/Forms/IITPacket_2020.pdf#page=20 + - title: South Carolina Legal Code | SECTION 12-6-3380 + href: https://www.scstatehouse.gov/code/t12c006.php diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/eitc/README.md b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/eitc/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/eitc/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/eitc/rate.yaml b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/eitc/rate.yaml new file mode 100644 index 000000000..4ed2aceaf --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/eitc/rate.yaml @@ -0,0 +1,19 @@ +description: South Carolina matches the federal EITC at this rate. +values: + 2018-01-01: 0.2083 + 2019-01-01: 0.4167 + 2020-01-01: 0.625 + 2021-01-01: 0.8333 + 2022-01-01: 1.0417 + 2023-01-01: 1.25 +metadata: + unit: /1 + label: South Carolina EITC Rate + reference: + - title: South Carolina Schedule TC-60 2021 (2021) + href: https://dor.sc.gov/forms-site/Forms/TC60_2021.pdf + - title: South Carolina Schedule TC-60 2022 (2022) + href: https://dor.sc.gov/forms-site/Forms/TC60_2022.pdf + - title: South Carolina Code of Laws Section 12-6-3632 + href: https://www.scstatehouse.gov/code/t12c006.php + diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/two_wage_earner/earned_income.yaml b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/two_wage_earner/earned_income.yaml new file mode 100644 index 000000000..117499598 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/two_wage_earner/earned_income.yaml @@ -0,0 +1,23 @@ +description: South Carolina counts these income sources as earned income for the two wage earner credit. +values: + 2021-01-01: + - employment_income + # - commisions + # - sub_pay + - self_employment_income + - qualified_business_income + - partnership_s_corp_income + - farm_income + +metadata: + unit: list + reference: + - title: SC 1040 tax form (2021) + href: https://dor.sc.gov/forms-site/Forms/SC1040_2021.pdf + - title: SC 1040 tax form instructions (2021) + href: https://dor.sc.gov/forms-site/Forms/IITPacket_2021.pdf#page=22 + - title: SC Legal Code | Section 12-6-3330 (C) + href: https://www.scstatehouse.gov/code/t12c006.php + - title: SC 1040 tax form (2022) + href: https://dor.sc.gov/forms-site/Forms/SC1040_2022.pdf + diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/two_wage_earner/rate.yaml b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/two_wage_earner/rate.yaml new file mode 100644 index 000000000..54a2a350b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/credits/two_wage_earner/rate.yaml @@ -0,0 +1,28 @@ +description: South Carolina provides these rates of the filers earned income under the two wage earner credit. +# threshold value is bottom of the tax bracket; thresholds are <= +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.007 + - threshold: + 2021-01-01: 43_333 + 2022-01-01: 46_667 + rate: + 2021-01-01: 0 + +metadata: + reference: + - title: SC 1040 tax form instructions (2021) + href: https://dor.sc.gov/forms-site/Forms/IITPacket_2021.pdf#page=23 + - title: SC 1040 tax form instructions (2022) + href: https://dor.sc.gov/forms-site/Forms/IITPacket_2022.pdf#page=23 + - title: SC Legal Code | Section 12-6-3330 (B) + # Legal code set it to $50,000, then amended it to $30,000 in 2017. + # Now adjusted for inflation. + href: https://www.scstatehouse.gov/code/t12c006.php + label: South Carolina two wage earner credit rate + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + period: year diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/deductions/net_capital_gain/rate.yaml b/fiscalsim_us/parameters/gov/states/sc/tax/income/deductions/net_capital_gain/rate.yaml new file mode 100644 index 000000000..2454e03bb --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/deductions/net_capital_gain/rate.yaml @@ -0,0 +1,17 @@ +description: South Carolina deducts this fraction of net capital gains from taxable income. +values: + 2021-01-01: 0.44 + +metadata: + unit: /1 + period: year + label: South Carolina net capital gain deduction rate + reference: + - title: SC1040 tax form (2021) + href: https://dor.sc.gov/forms-site/Forms/SC1040_2021.pdf#page=2 + - title: Instructions for Form SC-1040 (line 3i) + href: https://dor.sc.gov/forms-site/Forms/IITPacket_2021.pdf#page=15 + - title: South Carolina Code of Laws Section 12-6-1150 (A) + href: https://www.scstatehouse.gov/code/t12c006.php + - title: SC1040 tax form (2022) + href: https://dor.sc.gov/forms-site/Forms/SC1040_2022.pdf#page=2 diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/age_threshold.yaml b/fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/age_threshold.yaml new file mode 100644 index 000000000..86b32f523 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/age_threshold.yaml @@ -0,0 +1,11 @@ +description: South Carolina allows filers above this age to be eligible for the senior exemption. +metadata: + unit: year + label: South Carolina senior exemption age threshold + reference: + - title: South Carolina State SECTION 12-6-1170(B) + href: https://www.scstatehouse.gov/code/t12c006.php + - title: Instructions for Form SC-1040 (line 3q) + href: https://dor.sc.gov/forms-site/Forms/IITPacket_2021.pdf#page=19 +values: + 2021-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/amount.yaml b/fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/amount.yaml new file mode 100644 index 000000000..4dc5bf523 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/amount.yaml @@ -0,0 +1,11 @@ +description: South Carolina provides the following senior exemption amount for self. +metadata: + unit: currency-USD + label: South Carolina senior exemption amount + reference: + - title: South Carolina State SECTION 12-6-1170(B) + href: https://www.scstatehouse.gov/code/t12c006.php + - title: Instructions for Form SC-1040 (line 3q) + href: https://dor.sc.gov/forms-site/Forms/IITPacket_2021.pdf#page=19 +values: + 2021-01-01: 15_000 diff --git a/fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/spouse_amount.yaml b/fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/spouse_amount.yaml new file mode 100644 index 000000000..ddc5ff42d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/sc/tax/income/exemptions/senior/spouse_amount.yaml @@ -0,0 +1,11 @@ +description: South Carolina provides the following senior exemption amount for spouse. +metadata: + unit: currency-USD + label: South Carolina senior exemption spouse amount + reference: + - title: South Carolina State SECTION 12-6-1170(B) + href: https://www.scstatehouse.gov/code/t12c006.php + - title: Instructions for Form SC-1040 (line 3q) + href: https://dor.sc.gov/forms-site/Forms/IITPacket_2021.pdf#page=19 +values: + 2021-01-01: 15_000 diff --git a/fiscalsim_us/parameters/gov/states/tx/index.yaml b/fiscalsim_us/parameters/gov/states/tx/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/tx/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/vt/README.md b/fiscalsim_us/parameters/gov/states/vt/README.md new file mode 100644 index 000000000..5ea6fdcc3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/README.md @@ -0,0 +1 @@ +# Vermont diff --git a/fiscalsim_us/parameters/gov/states/vt/index.yaml b/fiscalsim_us/parameters/gov/states/vt/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/flat/cap.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/flat/cap.yaml new file mode 100644 index 000000000..b208b89a9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/flat/cap.yaml @@ -0,0 +1,15 @@ +description: Vermont caps the flat capital gains exclusion at this amount. +metadata: + label: Vermont flat capital gains exclusion cap + period: year + unit: currency-USD + reference: + - title: 2022 Schedule IN-153Vermont Capital Gains Exclusion Calculation # Line 9 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-153-2022.pdf#page=1 + - title: 2021 Schedule IN-153Vermont Capital Gains Exclusion Calculation # Line 9 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-153-2021.pdf#page=1 + # Legal code specify maximum flat exclusion as $5,000. Date unknown. + - title: Legal code Titl. 32 V.S.A. § 5811(21)(B)(ii) + href: https://legislature.vermont.gov/statutes/section/32/151/05811 +values: + 2021-01-01: 5_000 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/income_share_cap.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/income_share_cap.yaml new file mode 100644 index 000000000..8330464d2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/income_share_cap.yaml @@ -0,0 +1,16 @@ +description: Vermont caps the net capital gains exclusion at this fraction of federal taxable income. + +metadata: + label: Vermont capital gains exclusion cap as fraction of taxable income + period: year + unit: /1 + reference: + - title: 2022 Schedule IN-153Vermont Capital Gains Exclusion Calculation # Line 20 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-153-2022.pdf#page=1 + - title: 2021 Schedule IN-153Vermont Capital Gains Exclusion Calculation # Line 20 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-153-2021.pdf#page=1 + # Legal code specify 40 percent of federal taxable income as the maximum capital gains exclusion. Date unknown. + - title: Legal code Titl. 32 V.S.A. § 5811(21)(B)(ii)(II) + href: https://legislature.vermont.gov/statutes/section/32/151/05811 +values: + 2021-01-01: 0.4 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/percentage/cap.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/percentage/cap.yaml new file mode 100644 index 000000000..2a8e51d4a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/percentage/cap.yaml @@ -0,0 +1,15 @@ +description: Vermont caps the capital gains percentage exclusion at this amount. +metadata: + label: Vermont capital gains percentage exclusion max amount + period: year + unit: currency-USD + reference: + - title: 2022 Schedule IN-153Vermont Capital Gains Exclusion Calculation # Line 18 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-153-2022.pdf#page=1 + - title: 2021 Schedule IN-153Vermont Capital Gains Exclusion Calculation # Line 18 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-153-2021.pdf#page=1 + # Legal code specify the maximum percentage exclusion amount Date unknown. + - title: Legal code Titl. 32 V.S.A. § 5811(21)(B)(ii)(II) + href: https://legislature.vermont.gov/statutes/section/32/151/05811 +values: + 2021-01-01: 350_000 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/percentage/rate.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/percentage/rate.yaml new file mode 100644 index 000000000..237bd9347 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/exclusions/capital_gain/percentage/rate.yaml @@ -0,0 +1,15 @@ +description: Vermont multiplies the adjusted net capital gains by this rate under the capital gains percentage exclusion. +metadata: + label: Vermont capital gains percentage exclusion calculation rate + period: year + unit: /1 + reference: + - title: 2022 Schedule IN-153Vermont Capital Gains Exclusion Calculation # Line 18 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-153-2022.pdf#page=1 + - title: 2021 Schedule IN-153Vermont Capital Gains Exclusion Calculation # Line 18 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-153-2021.pdf#page=1 + # Legal code specify 40 percent of adjusted net capital gain as the capital gains percentage exclusion. Date unknown. + - title: Legal code Titl. 32 V.S.A. § 5811(21)(B)(ii) + href: https://legislature.vermont.gov/statutes/section/32/151/05811 +values: + 2021-01-01: 0.4 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/subtractions.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/subtractions.yaml new file mode 100644 index 000000000..20be92454 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/agi/subtractions.yaml @@ -0,0 +1,17 @@ +description: Vermont subtracts these sources from adjusted gross income. +values: + 2021-01-01: + - us_govt_interest + - vt_medical_expense_deduction + - student_loan_interest + - vt_capital_gains_exclusion +metadata: + unit: list + label: Vermont subtractions + reference: + - title: Instruction for 2022 SCHEDULE IN-112 # PART 1 SUBTRACTIONS TO FEDERAL ADJUSTED GROSS INCOME + href: https://tax.vermont.gov/sites/tax/files/documents/IN-112-2022.pdf#page=1 + - title: Instruction for 2021 SCHEDULE IN-112 # PART 1 SUBTRACTIONS TO FEDERAL ADJUSTED GROSS INCOME + href: https://tax.vermont.gov/sites/tax/files/documents/IN-112-2021.pdf#page=1 + - title: Titl. 32 V.S.A. § 5811(21)(B)(i), (C)(iv), (B)(vi), (B)(ii), (B)(iv) + href: https://legislature.vermont.gov/statutes/section/32/151/05811 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/credits/eitc/match.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/credits/eitc/match.yaml new file mode 100644 index 000000000..c3f4e6572 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/credits/eitc/match.yaml @@ -0,0 +1,14 @@ +description: Vermont matches this fraction of the federal earned income tax credit. +values: + 2021-01-01: 0.36 + 2022-01-01: 0.38 +metadata: + unit: /1 + label: Vermont earned income tax credit match + reference: + - title: 32 V.S.A. § 5828b Earned income tax credit (a) + href: https://legislature.vermont.gov/statutes/section/32/151/05828b + - title: 2022 Schedule IN-112 Vermont Tax Adjustments and Credits + href: https://tax.vermont.gov/sites/tax/files/documents/IN-112-2022.pdf#page=1 + - title: 2021 Schedule IN-112 Vermont Tax Adjustments and Credits + href: https://taxsim.nber.org/historical_state_tax_forms/VT/2021/IN-112-2021.pdf#page=2 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..4e9f5c51b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/credits/refundable.yaml @@ -0,0 +1,8 @@ +description: Vermont refundable tax credits. +values: + 2021-01-01: + - vt_eitc + +metadata: + unit: list + label: Vermont refundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/deductions/standard/additional.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/deductions/standard/additional.yaml new file mode 100644 index 000000000..7fcd4bdf2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/deductions/standard/additional.yaml @@ -0,0 +1,16 @@ +description: Vermont provides this additional standard deduction amount for each aged or blind head or spouse. +metadata: + label: Vermont additional aged or blind, head or spouse, standard deduction amount + period: year + unit: currency-USD + reference: + - title: 2021 VERMONT Income Tax Return Form Instructions-Taxable Income Line 4 + href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2021.pdf + - title: 2022 VERMONT Income Tax Return Form Instructions-Taxable Income Line 4 + href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2022.pdf + # Legal code specifies $1,000 with inflation adjustments. + - title: Legal Code Titl. 32 V.S.A. § 5811(21)(C)(iii) + href: https://legislature.vermont.gov/statutes/section/32/151/05811 + +values: + 2021-01-01: 1_050 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/deductions/standard/base.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/deductions/standard/base.yaml new file mode 100644 index 000000000..a3514df0e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/deductions/standard/base.yaml @@ -0,0 +1,31 @@ +description: Vermont provides this standard deduction based on filing status. +metadata: + label: Vermont standard deduction + period: year + unit: currency-USD + breakdown: + - filing_status + reference: + - title: 2021 VERMONT Income Tax Return Form Instructions-Taxable Income Line 4 + href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2021.pdf + - title: 2022 VERMONT Income Tax Return Form Instructions-Taxable Income Line 4 + href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2022.pdf + # Legal code specifies amount with inflation adjustments.. + - title: Legal Code Titl. 32 V.S.A. § 5811(21)(C)(ii) + href: https://legislature.vermont.gov/statutes/section/32/151/05811 + +JOINT: + 2021-01-01: 12_700 + 2022-01-01: 13_050 +HEAD_OF_HOUSEHOLD: + 2021-01-01: 9_500 + 2022-01-01: 9_800 +WIDOW: + 2021-01-01: 12_700 + 2022-01-01: 13_050 +SINGLE: + 2021-01-01: 6_350 + 2022-01-01: 6_500 +SEPARATE: + 2021-01-01: 6_350 + 2022-01-01: 6_500 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/exemption/personal.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/exemption/personal.yaml new file mode 100644 index 000000000..d4502eee8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/exemption/personal.yaml @@ -0,0 +1,16 @@ +description: Vermont provides the following personal exemption amount. +values: + 2021-01-01: 4_350 + 2022-01-01: 4_500 +metadata: + unit: currency-USD + period: year + label: Vermont personal exemption amount + reference: + # Legal code specifies $4,150. Date unknown. + - title: Legal Code Titl. 32 V.S.A. § 5811(21)(C)(i) + href: http://legislature.vermont.gov/statutes/section/32/151/05811 + - title: 2022 Vermont Income Tax Return Form Line 5 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-111-2022.pdf + - title: 2021 Vermont Income Tax Return Form Line 5 + href: https://tax.vermont.gov/sites/tax/files/documents/IN-111-2021.pdf diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/head_of_household.yaml new file mode 100644 index 000000000..1d409a925 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/head_of_household.yaml @@ -0,0 +1,34 @@ +description: Vermont taxes income of head of household filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Vermont income tax rates head of household filers + reference: + # Law does not specify inflation adjusted thresholds for each year + - title: Vermont §5822. Tax on income of individuals, estates, and trusts + href: https://legislature.vermont.gov/statutes/section/32/151/05822 + - title: Vermont 2021 Income Tax Rate Schedules + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2021.pdf#page=1 + - title: Vermont 2022 Income Tax Return Booklet Forms and Instructions + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2022.pdf#page=1 +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.0335 + - threshold: + 2021-01-01: 54_850 + 2022-01-01: 56_500 + rate: + 2021-01-01: 0.066 + - threshold: + 2021-01-01: 141_700 + 2022-01-01: 145_950 + rate: + 2021-01-01: 0.076 + - threshold: + 2021-01-01: 229_450 + 2022-01-01: 236_350 + rate: + 2021-01-01: 0.0875 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/joint.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/joint.yaml new file mode 100644 index 000000000..7227a2f5c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/joint.yaml @@ -0,0 +1,34 @@ +description: Vermont taxes income of joint filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Vermont State income tax rates for joint filers + reference: + # Law does not specify inflation adjusted thresholds for each year + - title: Vermont §5822. Tax on income of individuals, estates, and trusts + href: https://legislature.vermont.gov/statutes/section/32/151/05822 + - title: Vermont 2021 Income Tax Rate Schedules + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2021.pdf#page=1 + - title: Vermont 2022 Income Tax Return Booklet Forms and Instructions + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2022.pdf#page=1 +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.0335 + - threshold: + 2021-01-01: 68_400 + 2022-01-01: 70_450 + rate: + 2022-01-01: 0.066 + - threshold: + 2021-01-01: 165_350 + 2022-01-01: 170_300 + rate: + 2022-01-01: 0.076 + - threshold: + 2021-01-01: 251_950 + 2022-01-01: 259_500 + rate: + 2022-01-01: 0.0875 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/separate.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/separate.yaml new file mode 100644 index 000000000..19c9f162a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/separate.yaml @@ -0,0 +1,34 @@ +description: Vermont taxes income of separate filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Vermont income tax rates separate filers + reference: + # Law does not specify inflation adjusted thresholds for each year + - title: Vermont §5822. Tax on income of individuals, estates, and trusts + href: https://legislature.vermont.gov/statutes/section/32/151/05822 + - title: Vermont 2021 Income Tax Rate Schedules + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2021.pdf#page=1 + - title: Vermont 2022 Income Tax Return Booklet Forms and Instructions + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2022.pdf#page=1 +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.0335 + - threshold: + 2021-01-01: 34_200 + 2022-01-01: 35_225 + rate: + 2022-01-01: 0.066 + - threshold: + 2021-01-01: 82_675 + 2022-01-01: 85_150 + rate: + 2022-01-01: 0.076 + - threshold: + 2021-01-01: 125_975 + 2022-01-01: 129_750 + rate: + 2022-01-01: 0.0875 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/single.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/single.yaml new file mode 100644 index 000000000..d5d04d0d8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/single.yaml @@ -0,0 +1,34 @@ +description: Vermont taxes income of single filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Vermont income tax rates single filers + reference: + # Law does not specify inflation adjusted thresholds for each year + - title: Vermont §5822. Tax on income of individuals, estates, and trusts + href: https://legislature.vermont.gov/statutes/section/32/151/05822 + - title: Vermont 2021 Income Tax Rate Schedules + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2021.pdf#page=1 + - title: Vermont 2022 Income Tax Return Booklet Forms and Instructions + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2022.pdf#page=1 +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.0335 + - threshold: + 2021-01-01: 40_950 + 2022-01-01: 42_150 + rate: + 2022-01-01: 0.066 + - threshold: + 2021-01-01: 99_200 + 2022-01-01: 102_200 + rate: + 2022-01-01: 0.076 + - threshold: + 2021-01-01: 206_950 + 2022-01-01: 213_150 + rate: + 2022-01-01: 0.0875 diff --git a/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/widow.yaml b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/widow.yaml new file mode 100644 index 000000000..1c9601744 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/vt/tax/income/rates/widow.yaml @@ -0,0 +1,34 @@ +description: Vermont taxes income of widow(er) filers at this rate. +metadata: + type: marginal_rate + threshold_unit: currency-USD + rate_unit: /1 + label: Vermont income tax rates widow(er) filers + reference: + # Law does not specify inflation adjusted thresholds for each year + - title: Vermont §5822. Tax on income of individuals, estates, and trusts + href: https://legislature.vermont.gov/statutes/section/32/151/05822 + - title: Vermont 2021 Income Tax Rate Schedules + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2021.pdf#page=1 + - title: Vermont 2022 Income Tax Return Booklet Forms and Instructions + href: https://tax.vermont.gov/sites/tax/files/documents/RateSched-2022.pdf#page=1 +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.0335 + - threshold: + 2021-01-01: 68_400 + 2022-01-01: 70_450 + rate: + 2022-01-01: 0.066 + - threshold: + 2021-01-01: 165_350 + 2022-01-01: 170_300 + rate: + 2021-01-01: 0.076 + - threshold: + 2021-01-01: 251_950 + 2022-01-01: 259_500 + rate: + 2021-01-01: 0.0875 diff --git a/fiscalsim_us/parameters/gov/states/wa/dshs/index.yaml b/fiscalsim_us/parameters/gov/states/wa/dshs/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wa/dshs/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/wi/README.md b/fiscalsim_us/parameters/gov/states/wi/README.md new file mode 100644 index 000000000..48e3c9567 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/README.md @@ -0,0 +1 @@ +# Wisconsin diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/additions/capital_loss/limit.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/additions/capital_loss/limit.yaml new file mode 100644 index 000000000..839af527d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/additions/capital_loss/limit.yaml @@ -0,0 +1,12 @@ +description: Wisconsin limits capital losses to this amount. +metadata: + unit: currency-USD + label: Wisconsin capital loss limit + period: year + reference: + - title: 2021 Wisconsin Form 1 Schedule WB, Line 28 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleWDf.pdf#page=2 + - title: 2022 Wisconsin Form 1 Schedule WB, Line 28 + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleWDf.pdf#page=2 +values: + 2021-01-01: 500 # maximum loss expressed as a positive number diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/additions/sources.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/additions/sources.yaml new file mode 100644 index 000000000..216a243b7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/additions/sources.yaml @@ -0,0 +1,19 @@ +description: Wisconsin adds these variables to US adjusted gross income when computing its gross income. +values: + 2021-01-01: + - tax_exempt_interest_income + - wi_capital_gain_loss_addition + - form_4972_lumpsum_distributions + +metadata: + unit: variable + label: WI additions to US adjusted gross income + reference: + - title: 2021 WI schedule AD + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleADf.pdf + - title: 2021 WI schedule AD instructions + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleAD-Inst.pdf + - title: 2022 WI schedule AD + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleADf.pdf + - title: 2022 WI schedule AD instructions + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleAD-Inst.pdf diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/childcare_expense/README.md b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/childcare_expense/README.md new file mode 100644 index 000000000..03da87d0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/childcare_expense/README.md @@ -0,0 +1 @@ +# Child and Dependent Care Credit diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/childcare_expense/fraction.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/childcare_expense/fraction.yaml new file mode 100644 index 000000000..c45561389 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/childcare_expense/fraction.yaml @@ -0,0 +1,13 @@ +description: Wisconsin allows this faction of the federal child and dependent care credit as an AGI income subtraction. +metadata: + unit: /1 + label: Wisconsin CDCC fraction of federal CDCC + period: year + reference: + - title: 2022 Form 1 + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=2 + - title: 2022 Form 1 instructions + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=17 +values: + 2021-01-01: 0 # Wisconsin CDCC did not exist, had AGI subtraction instead + 2022-01-01: 0.5 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/README.md b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/README.md new file mode 100644 index 000000000..4808d739a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/README.md @@ -0,0 +1 @@ +# Earned Income Tax Credit diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/fraction.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/fraction.yaml new file mode 100644 index 000000000..77651cd67 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/fraction.yaml @@ -0,0 +1,28 @@ +description: Wisconsin matches this fraction of the federal EITC, depending on the number of EITC-eligible children. +metadata: + type: single_amount + threshold_unit: child + amount_unit: /1 + label: Wisconsin EITC as fraction of federal EITC + reference: + - title: 2021 Wisconsin Form 1 instructions for Line 26 + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf#page=27 + - title: 2022 Wisconsin Form 1 instructions for Line 29 + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=27 +brackets: + - threshold: + 0000-01-01: 0 + amount: + 2021-01-01: 0 + - threshold: + 0000-01-01: 1 + amount: + 2021-01-01: 0.04 + - threshold: + 0000-01-01: 2 + amount: + 2021-01-01: 0.11 + - threshold: + 0000-01-01: 3 + amount: + 2021-01-01: 0.34 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/investment_income_limit.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/investment_income_limit.yaml new file mode 100644 index 000000000..d04cd4982 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/earned_income/investment_income_limit.yaml @@ -0,0 +1,13 @@ +description: Wisconsin limits EITC eligibility to this investment income amount. +metadata: + unit: currency-USD + period: year + label: Wisconsin EITC investment income limit + reference: + - title: 2021 Wisconsin Form 1 instructions for Line 26 + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf#page=27 + - title: 2022 Wisconsin Form 1 instructions for Line 29 + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=27 +values: + 2021-01-01: 3_650 + 2022-01-01: 3_800 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/earnings_sources.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/earnings_sources.yaml new file mode 100644 index 000000000..63f98dcdf --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/earnings_sources.yaml @@ -0,0 +1,13 @@ +description: Wisconsin homestead credits recognizes these earnings sources. +metadata: + unit: variable + label: Wisconsin homestead credit earnings sources + reference: + - title: Homestead Tax Credit, Wisconsin Legislative Fiscal Bureau + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=7 +values: + 2021-01-01: + - employment_income + - self_employment_income + - partnership_s_corp_income + - farm_income diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/max_income.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/max_income.yaml new file mode 100644 index 000000000..9a114d0c5 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/max_income.yaml @@ -0,0 +1,13 @@ +description: Wisconsin homestead credit has this maximum income for eligibility. +metadata: + period: year + unit: currency-USD + reference: + - title: Homestead Tax Credit, Wisconsin Legislative Fiscal Bureau + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=5 + - title: 2021 Wisconsin Form 1 Schedule H instructions, Table A + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH.pdf#page=26 + - title: 2022 Wisconsin Form 1 Schedule H instructions, Table A + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH.pdf#page=25 +values: + 2021-01-01: 24_680 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/min_age.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/min_age.yaml new file mode 100644 index 000000000..28d990260 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/min_age.yaml @@ -0,0 +1,13 @@ +description: Wisconsin homestead credit has this minimum age for eligibility. +metadata: + period: year + unit: year + reference: + - title: Homestead Tax Credit, Wisconsin Legislative Fiscal Bureau + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=7 + - title: 2021 Wisconsin Form 1 Schedule H, Line 1a + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH.pdf + - title: 2022 Wisconsin Form 1 Schedule H, Line 1a + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH.pdf +values: + 2021-01-01: 18 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/min_elderly_age.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/min_elderly_age.yaml new file mode 100644 index 000000000..0cf0291a1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/eligible/min_elderly_age.yaml @@ -0,0 +1,13 @@ +description: Wisconsin homestead credit has this minimum elderly age for eligibility. +metadata: + period: year + unit: year + reference: + - title: Homestead Tax Credit, Wisconsin Legislative Fiscal Bureau + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=7 + - title: 2021 Wisconsin Form 1 Schedule H, Line 1c + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH.pdf + - title: 2022 Wisconsin Form 1 Schedule H, Line 1c + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH.pdf +values: + 2021-01-01: 62 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/income/exemption.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/income/exemption.yaml new file mode 100644 index 000000000..22f3e7e4f --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/income/exemption.yaml @@ -0,0 +1,11 @@ +description: Wisconsin homestead credit has this dependent exemption. +metadata: + period: year + unit: currency-USD + reference: + - title: 2021 Wisconsin Form 1 Schedule H, Line 12b + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH.pdf#page=2 + - title: 2022 Wisconsin Form 1 Schedule H, Line 12b + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH.pdf#page=2 +values: + 2021-01-01: 500 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/income/sources.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/income/sources.yaml new file mode 100644 index 000000000..00973b7dc --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/income/sources.yaml @@ -0,0 +1,19 @@ +description: Wisconsin homestead credit recognizes these income sources. +metadata: + unit: variable + label: Wisconsin homestead credit income sources + reference: + - title: Homestead Tax Credit, Wisconsin Legislative Fiscal Bureau + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=14 +values: + 2021-01-01: + - adjusted_gross_income + # additional homestead income sources: + - tax_exempt_interest_income + - tax_exempt_social_security + - tax_exempt_pension_income + - tax_exempt_unemployment_compensation + # cash transfer income sources: + - ssi + - state_supplement + - tanf diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/phase_out/rate.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/phase_out/rate.yaml new file mode 100644 index 000000000..152c181a8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/phase_out/rate.yaml @@ -0,0 +1,13 @@ +description: Wisconsin homestead credit phases out capped property taxes at this rate. +metadata: + period: year + unit: /1 + reference: + - title: Homestead Tax Credit, WI Legislative Fiscal Bureau + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=5 + - title: 2021 Wisconsin Form 1 Schedule H instructions, Table A + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH-inst.pdf#page=26 + - title: 2022 Wisconsin Form 1 Schedule H instructions, Table A + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH-inst.pdf#page=25 +values: + 2021-01-01: 0.08785 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/phase_out/start.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/phase_out/start.yaml new file mode 100644 index 000000000..165b45615 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/phase_out/start.yaml @@ -0,0 +1,13 @@ +description: Wisconsin homestead credit phases out capped property taxes starting at this income. +metadata: + period: year + unit: currency-USD + reference: + - title: Homestead Tax Credit, Wisconsin Legislative Fiscal Bureau + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=5 + - title: 2021 Wisconsin Form 1 Schedule H instructions, Table A + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH.pdf#page=26 + - title: 2022 Wisconsin Form 1 Schedule H instructions, Table A + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH.pdf#page=25 +values: + 2021-01-01: 8_060 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/property_tax/max.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/property_tax/max.yaml new file mode 100644 index 000000000..a25403cc6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/property_tax/max.yaml @@ -0,0 +1,13 @@ +description: Wisconsin homestead credit caps property taxes at this maximum. +metadata: + period: year + unit: currency-USD + reference: + - title: Homestead Tax Credit, WI Legislative Fiscal Bureau + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=5 + - title: 2021 Wisconsin Form 1 Schedule H, Line 16 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH.pdf#page=2 + - title: 2022 Wisconsin Form 1 Schedule H, Line 16 + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH.pdf#page=2 +values: + 2021-01-01: 1_460 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/property_tax/rent_ratio.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/property_tax/rent_ratio.yaml new file mode 100644 index 000000000..82c3fbdc9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/property_tax/rent_ratio.yaml @@ -0,0 +1,11 @@ +description: Wisconsin homestead credit assumes property taxes are this ratio to rent. +metadata: + period: year + unit: /1 + reference: + - title: 2021 Wisconsin Form 1 Schedule H, Line 14 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH.pdf#page=2 + - title: 2022 Wisconsin Form 1 Schedule H, Line 14 + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH.pdf#page=2 +values: + 2021-01-01: 0.20 # assumes heat included in rent diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/rate.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/rate.yaml new file mode 100644 index 000000000..7bd869153 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/homestead/rate.yaml @@ -0,0 +1,13 @@ +description: Wisconsin homestead credit equals eligible property taxes times this rate. +metadata: + period: year + unit: /1 + reference: + - title: Homestead Tax Credit, WI Legislative Fiscal Bureau + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=5 + - title: 2021 Wisconsin Form 1 Schedule H instructions, Table B + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH-inst.pdf#page=27 + - title: 2022 Wisconsin Form 1 Schedule H instructions, Table B + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH-inst.pdf#page=26 +values: + 2021-01-01: 0.8 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/itemized_deduction/rate.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/itemized_deduction/rate.yaml new file mode 100644 index 000000000..10f1ce180 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/itemized_deduction/rate.yaml @@ -0,0 +1,11 @@ +description: Wisconsin has an itemized deduction credit equal to this rate times the excess of itemized deductions over the standard deduction. +metadata: + period: year + unit: /1 + reference: + - title: 2021 Wisconsin Form 1, Schedule 1 + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=4 + - title: 2022 Wisconsin Form 1, Schedule 1 + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=4 +values: + 2021-01-01: 0.05 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/income_sources.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/income_sources.yaml new file mode 100644 index 000000000..ad5ada0f9 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/income_sources.yaml @@ -0,0 +1,15 @@ +description: Wisconsin married couple credit has these income sources +metadata: + unit: variable + label: Wisconsin married couple credit income sources + reference: + - title: 2021 Wisconsin Form 1, Schedule 2 + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=4 + - title: 2021 Wisconsin Form 1, Schedule 2 + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=4 +values: + 2021-01-01: + - employment_income + - self_employment_income + - partnership_s_corp_income + - farm_income diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/max.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/max.yaml new file mode 100644 index 000000000..242324fdd --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/max.yaml @@ -0,0 +1,11 @@ +description: Wisconsin married couple credit is limited to this maximum. +metadata: + period: year + unit: currency-USD + reference: + - title: 2021 Wisconsin Form 1, Schedule 2 + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=4 + - title: 2021 Wisconsin Form 1, Schedule 2 + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=4 +values: + 2021-01-01: 480 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/rate.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/rate.yaml new file mode 100644 index 000000000..b4d8653e3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/married_couple/rate.yaml @@ -0,0 +1,11 @@ +description: Wisconsin married couple credit is calculated using this rate. +metadata: + period: year + unit: /1 + reference: + - title: 2021 Wisconsin Form 1, Schedule 2 + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=4 + - title: 2022 Wisconsin Form 1, Schedule 2 + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=4 +values: + 2021-01-01: 0.03 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..66a8af4b7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/non_refundable.yaml @@ -0,0 +1,23 @@ +description: Wisconsin income tax has these nonrefundable credits. +metadata: + unit: variable + label: Wisconsin nonrefundable credits + reference: + - title: 2021 Wisconsin Form 1 + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=2 + - title: 2021 Wisconsin Form 1 instructions + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf#page=16 + - title: 2022 Wisconsin Form 1 + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=2 + - title: 2022 Wisconsin Form 1 instructions + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=16 +values: + 2021-01-01: + - wi_itemized_deduction_credit + - wi_property_tax_credit + - wi_married_couple_credit + 2022-01-01: + - wi_itemized_deduction_credit + - wi_childcare_expense_credit # was an income subtraction before 2022 + - wi_property_tax_credit + - wi_married_couple_credit diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/max.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/max.yaml new file mode 100644 index 000000000..894ad5272 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/max.yaml @@ -0,0 +1,11 @@ +description: Wisconsin property tax credit is limited to this maximum. +metadata: + unit: currency-USD + period: year + label: Wisconsin property tax credit limit + reference: + - title: Legislative Fiscal Bureau paper on WI income tax + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf#page=19 + # No tax form citation as the tax instructions only provide a lookup table. +values: + 2000-01-01: 300 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/rate.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/rate.yaml new file mode 100644 index 000000000..7478dfeef --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/rate.yaml @@ -0,0 +1,11 @@ +description: Wisconsin propery tax credit is calculated using this rate. +metadata: + unit: /1 + label: Wisconsin property tax credit rate + period: year + reference: + - title: Legislative Fiscal Bureau paper on WI income tax + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf#page=19 + # No tax form citation as the tax instructions only provide a lookup table. +values: + 2021-01-01: 0.12 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/rent_fraction.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/rent_fraction.yaml new file mode 100644 index 000000000..636fa984d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/property_tax/rent_fraction.yaml @@ -0,0 +1,11 @@ +description: Wisconsin property tax credit considers property taxes to be this fraction of rent. +metadata: + unit: /1 + label: Wisconsin property tax credit fraction of rent considered property tax + period: year + reference: + - title: Legislative Fiscal Bureau paper on WI income tax + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf#page=19 + # No tax form citation as the tax instructions only provide a lookup table. +values: + 2021-01-01: 0.20 # assuming rent includes heat diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..8313f71c3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/credits/refundable.yaml @@ -0,0 +1,17 @@ +description: Wisconsin income tax has these refundable credits. +metadata: + unit: variable + label: Wisconsin refundable credits + reference: + - title: 2021 Wisconsin Form 1 + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=2 + - title: 2021 Wisconsin Form 1 instructions + href: https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf#page=26 + - title: 2022 Wisconsin Form 1 + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=2 + - title: 2022 Wisconsin Form 1 instructions + href: https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=26 +values: + 2021-01-01: + - wi_earned_income_credit + - wi_homestead_credit diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/max.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/max.yaml new file mode 100644 index 000000000..52975c6d1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/max.yaml @@ -0,0 +1,29 @@ +description: Wisconsin provides this standard deduction amount before phase out. +metadata: + breakdown: + - filing_status + period: year + unit: currency-USD + reference: + - title: Wisconsin Tax Brackets, Rates, Forms, and Standard Deductions + href: https://www.efile.com/wisconsin-tax-brackets-rates-and-forms/ +SINGLE: + values: + 2021-01-01: 11_200 + 2022-01-01: 11_790 +JOINT: + values: + 2021-01-01: 20_730 + 2022-01-01: 21_820 +WIDOW: + values: + 2021-01-01: 20_730 + 2022-01-01: 21_820 +SEPARATE: + values: + 2021-01-01: 9_850 + 2022-01-01: 10_370 +HEAD_OF_HOUSEHOLD: + values: + 2021-01-01: 14_470 + 2022-01-01: 15_230 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/head_of_household.yaml new file mode 100644 index 000000000..d5b155010 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/head_of_household.yaml @@ -0,0 +1,24 @@ +description: Wisconsin phases out its standard deduction for head of household filers according to this schedule. +metadata: + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD # Wisconsin AGI + rate_unit: /1 + reference: + - title: Wisconsin Tax Brackets, Rates, Forms, and Standard Deductions + href: https://www.efile.com/wisconsin-tax-brackets-rates-and-forms/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0 + - threshold: + 2021-01-01: 16_150 + 2022-01-01: 16_990 + rate: + 2021-01-01: 0.22515 + - threshold: + 2021-01-01: 47_248 + 2022-01-01: 49_705 + rate: + 2021-01-01: 0.12 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/joint.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/joint.yaml new file mode 100644 index 000000000..9d8fb9d57 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/joint.yaml @@ -0,0 +1,19 @@ +description: Wisconsin phases out its standard deduction for joint filers according to this schedule. +metadata: + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD # Wisconsin AGI + rate_unit: /1 + reference: + - title: Wisconsin Tax Brackets, Rates, Forms, and Standard Deductions + href: https://www.efile.com/wisconsin-tax-brackets-rates-and-forms/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0 + - threshold: + 2021-01-01: 23_300 + 2022-01-01: 24_520 + rate: + 2021-01-01: 0.19778 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/separate.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/separate.yaml new file mode 100644 index 000000000..fe21df818 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/separate.yaml @@ -0,0 +1,19 @@ +description: Wisconsin phases out its standard deduction for separate filers according to this schedule. +metadata: + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD # Wisconsin AGI + rate_unit: /1 + reference: + - title: Wisconsin Tax Brackets, Rates, Forms, and Standard Deductions + href: https://www.efile.com/wisconsin-tax-brackets-rates-and-forms/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0 + - threshold: + 2021-01-01: 11_060 + 2022-01-01: 11_640 + rate: + 2021-01-01: 0.19778 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/single.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/single.yaml new file mode 100644 index 000000000..d2e8b3ab3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/deductions/standard/phase_out/single.yaml @@ -0,0 +1,19 @@ +description: Wisconsin phases out its standard deduction for single filers according to this schedule. +metadata: + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD # Wisconsin AGI + rate_unit: /1 + reference: + - title: Wisconsin Tax Brackets, Rates, Forms, and Standard Deductions + href: https://www.efile.com/wisconsin-tax-brackets-rates-and-forms/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0 + - threshold: + 2021-01-01: 16_150 + 2022-01-01: 16_990 + rate: + 2021-01-01: 0.12 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/base.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/base.yaml new file mode 100644 index 000000000..5cdec127c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/base.yaml @@ -0,0 +1,9 @@ +description: Wisconsin exemption includes this base amount. +metadata: + period: year + unit: currency-USD + reference: + - title: Legislative Fiscal Bureau paper on WI income tax + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf +values: + 2001-01-01: 700 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/extra.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/extra.yaml new file mode 100644 index 000000000..2cddbd37b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/extra.yaml @@ -0,0 +1,9 @@ +description: Wisconsin exemption includes this amount for each elderly taxpayer. +metadata: + period: year + unit: currency-USD + reference: + - title: Legislative Fiscal Bureau paper on Wisconsin income tax + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf#page=17 +values: + 2001-01-01: 250 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/old_age.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/old_age.yaml new file mode 100644 index 000000000..f219f5d93 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/exemption/old_age.yaml @@ -0,0 +1,9 @@ +description: Wisconsin gives an extra exemption to head/spouse this age or more. +metadata: + period: year + unit: year + reference: + - title: Legislative Fiscal Bureau paper on WI income tax + href: https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf +values: + 2001-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/head_of_household.yaml new file mode 100644 index 000000000..d04f699f2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/head_of_household.yaml @@ -0,0 +1,29 @@ +description: Wisconsin uses these income tax brackets for HEAD_OF_HOUSEHOLD filing units. +metadata: + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD # Wisconsin taxable income + rate_unit: /1 + reference: + - title: Wisconsin Tax Brackets, Rates, Forms, and Standard Deductions + href: https://www.efile.com/wisconsin-tax-brackets-rates-and-forms/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.0354 + - threshold: + 2021-01-01: 12_120 + 2022-01-01: 12_760 + rate: + 2021-01-01: 0.0465 + - threshold: + 2021-01-01: 24_250 + 2022-01-01: 25_520 + rate: + 2021-01-01: 0.0530 + - threshold: + 2021-01-01: 266_930 + 2022-01-01: 280_950 + rate: + 2021-01-01: 0.0765 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/joint.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/joint.yaml new file mode 100644 index 000000000..84d1fe5d3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/joint.yaml @@ -0,0 +1,29 @@ +description: Wisconsin uses these income tax brackets for JOINT filing units. +metadata: + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD # Wisconsin taxable income + rate_unit: /1 + reference: + - title: Wisconsin Tax Brackets, Rates, Forms, and Standard Deductions + href: https://www.efile.com/wisconsin-tax-brackets-rates-and-forms/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.0354 + - threshold: + 2021-01-01: 16_160 + 2022-01-01: 17_010 + rate: + 2021-01-01: 0.0465 + - threshold: + 2021-01-01: 32_330 + 2022-01-01: 34_030 + rate: + 2021-01-01: 0.0530 + - threshold: + 2021-01-01: 355_910 + 2022-01-01: 374_600 + rate: + 2021-01-01: 0.0765 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/separate.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/separate.yaml new file mode 100644 index 000000000..e0028355b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/separate.yaml @@ -0,0 +1,29 @@ +description: Wisconsin uses these income tax brackets for SEPARATE filing units. +metadata: + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD # Wisconsin taxable income + rate_unit: /1 + reference: + - title: Wisconsin Tax Brackets, Rates, Forms, and Standard Deductions + href: https://www.efile.com/wisconsin-tax-brackets-rates-and-forms/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.0354 + - threshold: + 2021-01-01: 8_080 + 2022-01-01: 8_510 + rate: + 2021-01-01: 0.0465 + - threshold: + 2021-01-01: 16_160 + 2022-01-01: 17_010 + rate: + 2021-01-01: 0.0530 + - threshold: + 2021-01-01: 177_960 + 2022-01-01: 187_300 + rate: + 2021-01-01: 0.0765 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/single.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/single.yaml new file mode 100644 index 000000000..6eb6ecb0c --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/rates/single.yaml @@ -0,0 +1,29 @@ +description: Wisconsin uses these income tax brackets for SINGLE filing units. +metadata: + type: marginal_rate + threshold_period: year + threshold_unit: currency-USD # Wisconsin taxable income + rate_unit: /1 + reference: + - title: Wisconsin Tax Brackets, Rates, Forms, and Standard Deductions + href: https://www.efile.com/wisconsin-tax-brackets-rates-and-forms/ +brackets: + - threshold: + 2021-01-01: 0 + rate: + 2021-01-01: 0.0354 + - threshold: + 2021-01-01: 12_120 + 2022-01-01: 12_760 + rate: + 2021-01-01: 0.0465 + - threshold: + 2021-01-01: 24_250 + 2022-01-01: 25_520 + rate: + 2021-01-01: 0.0530 + - threshold: + 2021-01-01: 266_930 + 2022-01-01: 280_950 + rate: + 2021-01-01: 0.0765 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/capital_gain/fraction.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/capital_gain/fraction.yaml new file mode 100644 index 000000000..61494a29e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/capital_gain/fraction.yaml @@ -0,0 +1,12 @@ +description: Wisconsin subtracts from AGI this fraction of long-term capital gains. +metadata: + unit: /1 + period: year + label: Wisconsin fraction of capital gains subtracted from AGI + reference: + - title: 2021 Wisconsin Form 1, Schedule WD, Line 25 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleWDf.pdf#page=2 + - title: 2022 Wisconsin Form 1, Schedule WD, Line 25 + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleWDf.pdf#page=2 +values: + 2021-01-01: 0.3 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/childcare_expense/max_amount.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/childcare_expense/max_amount.yaml new file mode 100644 index 000000000..fab0752ee --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/childcare_expense/max_amount.yaml @@ -0,0 +1,11 @@ +description: Wisconsin subtracts from AGI this maximum of child and dependent care expenses per dependent. +metadata: + unit: currency-USD + label: Wisconsin maximum care expenses per dependent for AGI subtraction + period: year + reference: + - title: 2021 Wisconsin Form 1 Schedule SB instructions + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-Inst.pdf#page=7 +values: + 2021-01-01: 3_000 + 2022-01-01: 0 # Wisconsin AGI subtraction replaced by nonrefundable credit diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/childcare_expense/max_dependents.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/childcare_expense/max_dependents.yaml new file mode 100644 index 000000000..dbea8044e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/childcare_expense/max_dependents.yaml @@ -0,0 +1,10 @@ +description: Wisconsin recognizes this maximum number of dependents as eligible for care expense AGI subtraction. +metadata: + unit: person + label: Wisconsin maximum dependents for care expense AGI subtraction + reference: + - title: 2021 Wisconsin Form 1 Schedule SB instructions + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-Inst.pdf#page=7 +values: + 2021-01-01: 2 + 2022-01-01: 0 # Wisconsin AGI subtraction replaced by nonrefundable credit diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/max_agi.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/max_agi.yaml new file mode 100644 index 000000000..d09f1c135 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/max_agi.yaml @@ -0,0 +1,26 @@ +description: Wisconsin limits eligibility for retirement income subtraction to this maximum federal AGI. +metadata: + breakdown: + - filing_status + period: year + unit: currency-USD + reference: + - title: 2021 Wisconsin Form 1 Schedule SB instructions, Line 17 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-Inst.pdf#page=9 + - title: 2022 Wisconsin Form 1 Schedule SB instructions, Line 16 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-Inst.pdf#page=7 +SINGLE: + values: + 2021-01-01: 15_000 +JOINT: + values: + 2021-01-01: 30_000 +WIDOW: + values: + 2021-01-01: 15_000 +SEPARATE: + values: + 2021-01-01: 15_000 +HEAD_OF_HOUSEHOLD: + values: + 2021-01-01: 15_000 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/max_amount.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/max_amount.yaml new file mode 100644 index 000000000..b6449b2e3 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/max_amount.yaml @@ -0,0 +1,12 @@ +description: Wisconsin limits retirement income AGI subtraction to this maximum per person. +metadata: + unit: currency-USD + label: Wisconsin maximum retirement income AGI subtraction per person + period: year + reference: + - title: 2021 Wisconsin Form 1 Schedule SB instructions, Line 17 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-Inst.pdf#page=9 + - title: 2022 Wisconsin Form 1 Schedule SB instructions, Line 16 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-Inst.pdf#page=7 +values: + 2021-01-01: 5_000 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/min_age.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/min_age.yaml new file mode 100644 index 000000000..0a670ad01 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/retirement_income/min_age.yaml @@ -0,0 +1,12 @@ +description: Wisconsin limits its retirement income subtraction to filers this age or older. +metadata: + unit: year + label: Wisconsin minimum age for retirement income subtraction + period: year + reference: + - title: 2021 Wisconsin Form 1 Schedule SB instructions, Line 17 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-Inst.pdf#page=9 + - title: 2022 Wisconsin Form 1 Schedule SB instructions, Line 16 + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-Inst.pdf#page=7 +values: + 2021-01-01: 65 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/sources.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/sources.yaml new file mode 100644 index 000000000..426ba9f27 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/sources.yaml @@ -0,0 +1,26 @@ +description: Wisconsin subtracts these variables from US adjusted gross income when computing its gross income. +values: + 2021-01-01: + - wi_unemployment_compensation_subtraction + - tax_unit_taxable_social_security + - wi_capital_gain_loss_subtraction + - wi_childcare_expense_subtraction + - wi_retirement_income_subtraction + 2022-01-01: + - wi_unemployment_compensation_subtraction + - tax_unit_taxable_social_security + - wi_capital_gain_loss_subtraction + - wi_retirement_income_subtraction + +metadata: + unit: variable + label: WI subtractions from US adjusted gross income + reference: + - title: 2021 WI schedule SB + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSBf.pdf + - title: 2021 WI schedule SB instructions + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-Inst.pdf + - title: 2021 WI schedule SB + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSBf.pdf + - title: 2021 WI schedule SB instructions + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSB-Inst.pdf diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/unemployment_compensation/income_phase_out/base.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/unemployment_compensation/income_phase_out/base.yaml new file mode 100644 index 000000000..ed7616eab --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/unemployment_compensation/income_phase_out/base.yaml @@ -0,0 +1,26 @@ +description: Wisconsin uses this base income in phase-out of unemployment compensation subtraction. +metadata: + breakdown: + - filing_status + period: year + unit: currency-USD + reference: + - title: 2021 Wisconsin Form 1 Schedule SB instructions + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-inst.pdf#page=2 + - title: 2022 Wisconsin Form 1 Schedule SB instructions + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSB-Inst.pdf#page=1 +SINGLE: + values: + 2021-01-01: 12_000 +JOINT: + values: + 2021-01-01: 18_000 +WIDOW: + values: + 2021-01-01: 18_000 +SEPARATE: + values: + 2021-01-01: 12_000 +HEAD_OF_HOUSEHOLD: + values: + 2021-01-01: 12_000 diff --git a/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/unemployment_compensation/income_phase_out/rate.yaml b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/unemployment_compensation/income_phase_out/rate.yaml new file mode 100644 index 000000000..62f72a3e8 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wi/tax/income/subtractions/unemployment_compensation/income_phase_out/rate.yaml @@ -0,0 +1,12 @@ +description: Wisconsin uses this rate to phase-out income in calculation of unemployment compensation subtraction. +metadata: + unit: /1 + period: year + label: Wisconsin income phase-out rate for unemployment compensation subtraction + reference: + - title: 2021 Wisconsin Form 1 Schedule SB instructions + href: https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-inst.pdf#page=2 + - title: 2022 Wisconsin Form 1 Schedule SB instructions + href: https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSB-Inst.pdf#page=1 +values: + 2021-01-01: 0.5 diff --git a/fiscalsim_us/parameters/gov/states/wv/README.md b/fiscalsim_us/parameters/gov/states/wv/README.md new file mode 100644 index 000000000..a885737ae --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/README.md @@ -0,0 +1 @@ +# West Virginia diff --git a/fiscalsim_us/parameters/gov/states/wv/index.yaml b/fiscalsim_us/parameters/gov/states/wv/index.yaml new file mode 100644 index 000000000..2852e302a --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/index.yaml @@ -0,0 +1,4 @@ +metadata: + propagate_metadata_to_children: true + economy: false + household: false diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/head_of_household.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/head_of_household.yaml new file mode 100644 index 000000000..ad6109216 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/head_of_household.yaml @@ -0,0 +1,60 @@ +description: West Virginia allows for this low-income family tax credit amount for head of household filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: West Virginia low-income family tax credit for head of household filers + reference: + - title: Code of West Virginia §11-21-22B (b) + href: https://code.wvlegislature.gov/11-21-22B/ + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=28 + - title: 2022 West Virginia Personal Income Tax Forms And Instructions-2022 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=42 + + +brackets: + - threshold: + 2007-01-01: -.inf + amount: + 2007-01-01: 1 + - threshold: + 2007-01-01: 0 + amount: + 2007-01-01: 0.9 + - threshold: + 2007-01-01: 300 + amount: + 2007-01-01: 0.8 + - threshold: + 2007-01-01: 600 + amount: + 2007-01-01: 0.7 + - threshold: + 2007-01-01: 900 + amount: + 2007-01-01: 0.6 + - threshold: + 2007-01-01: 1_200 + amount: + 2007-01-01: 0.5 + - threshold: + 2007-01-01: 1_500 + amount: + 2007-01-01: 0.4 + - threshold: + 2007-01-01: 1_800 + amount: + 2007-01-01: 0.3 + - threshold: + 2007-01-01: 2_100 + amount: + 2007-01-01: 0.2 + - threshold: + 2007-01-01: 2_400 + amount: + 2007-01-01: 0.1 + - threshold: + 2007-01-01: 2_700 + - amount: + 2007-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/joint.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/joint.yaml new file mode 100644 index 000000000..fd8956668 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/joint.yaml @@ -0,0 +1,59 @@ +description: West Virginia allows for this low-income family tax credit amount for joint filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: West Virginia low-income family tax credit for joint filers + reference: + - title: Code of West Virginia §11-21-22B (b) + href: https://code.wvlegislature.gov/11-21-22B/ + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=28 + - title: 2022 West Virginia Personal Income Tax Forms And Instructions-2022 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=42 + +brackets: + - threshold: + 2007-01-01: -.inf + amount: + 2007-01-01: 1 + - threshold: + 2007-01-01: 0 + amount: + 2007-01-01: 0.9 + - threshold: + 2007-01-01: 300 + amount: + 2007-01-01: 0.8 + - threshold: + 2007-01-01: 600 + amount: + 2007-01-01: 0.7 + - threshold: + 2007-01-01: 900 + amount: + 2007-01-01: 0.6 + - threshold: + 2007-01-01: 1_200 + amount: + 2007-01-01: 0.5 + - threshold: + 2007-01-01: 1_500 + amount: + 2007-01-01: 0.4 + - threshold: + 2007-01-01: 1_800 + amount: + 2007-01-01: 0.3 + - threshold: + 2007-01-01: 2_100 + amount: + 2007-01-01: 0.2 + - threshold: + 2007-01-01: 2_400 + amount: + 2007-01-01: 0.1 + - threshold: + 2007-01-01: 2_700 + - amount: + 2007-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/separate.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/separate.yaml new file mode 100644 index 000000000..ec11c529e --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/separate.yaml @@ -0,0 +1,60 @@ +description: West Virginia allows for this low-income family tax credit amount for married filing separately filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: West Virginia low-income family tax credit for married filing separately filers + reference: + - title: Code of West Virginia §11-21-22B (c) + href: https://code.wvlegislature.gov/11-21-22B/ + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=28 + - title: 2022 West Virginia Personal Income Tax Forms And Instructions-2022 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=42 + + +brackets: + - threshold: + 2007-01-01: -.inf + amount: + 2007-01-01: 1 + - threshold: + 2007-01-01: 0 + amount: + 2007-01-01: 0.9 + - threshold: + 2007-01-01: 150 + amount: + 2007-01-01: 0.8 + - threshold: + 2007-01-01: 300 + amount: + 2007-01-01: 0.7 + - threshold: + 2007-01-01: 450 + amount: + 2007-01-01: 0.6 + - threshold: + 2007-01-01: 600 + amount: + 2007-01-01: 0.5 + - threshold: + 2007-01-01: 750 + amount: + 2007-01-01: 0.4 + - threshold: + 2007-01-01: 900 + amount: + 2007-01-01: 0.3 + - threshold: + 2007-01-01: 1_050 + amount: + 2007-01-01: 0.2 + - threshold: + 2007-01-01: 1_200 + amount: + 2007-01-01: 0.1 + - threshold: + 2007-01-01: 1_350 + - amount: + 2007-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/single.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/single.yaml new file mode 100644 index 000000000..ae66846de --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/single.yaml @@ -0,0 +1,59 @@ +description: West Virginia allows for this low-income family tax credit amount for single filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: West Virginia low-income family tax credit for single filers + reference: + - title: Code of West Virginia §11-21-22B (b) + href: https://code.wvlegislature.gov/11-21-22B/ + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=28 + - title: 2022 West Virginia Personal Income Tax Forms And Instructions-2022 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=42 + +brackets: + - threshold: + 2007-01-01: -.inf + amount: + 2007-01-01: 1 + - threshold: + 2007-01-01: 0 + amount: + 2007-01-01: 0.9 + - threshold: + 2007-01-01: 300 + amount: + 2007-01-01: 0.8 + - threshold: + 2007-01-01: 600 + amount: + 2007-01-01: 0.7 + - threshold: + 2007-01-01: 900 + amount: + 2007-01-01: 0.6 + - threshold: + 2007-01-01: 1_200 + amount: + 2007-01-01: 0.5 + - threshold: + 2007-01-01: 1_500 + amount: + 2007-01-01: 0.4 + - threshold: + 2007-01-01: 1_800 + amount: + 2007-01-01: 0.3 + - threshold: + 2007-01-01: 2_100 + amount: + 2007-01-01: 0.2 + - threshold: + 2007-01-01: 2_400 + amount: + 2007-01-01: 0.1 + - threshold: + 2007-01-01: 2_700 + - amount: + 2007-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/widow.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/widow.yaml new file mode 100644 index 000000000..0ccf6b89d --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/amount/widow.yaml @@ -0,0 +1,59 @@ +description: West Virginia allows for this low-income family tax credit amount for widow(er) filers. +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + label: West Virginia low-income family tax credit for widow(er) filers + reference: + - title: Code of West Virginia §11-21-22B (b) + href: https://code.wvlegislature.gov/11-21-22B/ + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=28 + - title: 2022 West Virginia Personal Income Tax Forms And Instructions-2022 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=42 + +brackets: + - threshold: + 2007-01-01: -.inf + amount: + 2007-01-01: 1 + - threshold: + 2007-01-01: 0 + amount: + 2007-01-01: 0.9 + - threshold: + 2007-01-01: 300 + amount: + 2007-01-01: 0.8 + - threshold: + 2007-01-01: 600 + amount: + 2007-01-01: 0.7 + - threshold: + 2007-01-01: 900 + amount: + 2007-01-01: 0.6 + - threshold: + 2007-01-01: 1_200 + amount: + 2007-01-01: 0.5 + - threshold: + 2007-01-01: 1_500 + amount: + 2007-01-01: 0.4 + - threshold: + 2007-01-01: 1_800 + amount: + 2007-01-01: 0.3 + - threshold: + 2007-01-01: 2_100 + amount: + 2007-01-01: 0.2 + - threshold: + 2007-01-01: 2_400 + amount: + 2007-01-01: 0.1 + - threshold: + 2007-01-01: 2_700 + - amount: + 2007-01-01: 0 diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/fpg_percent.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/fpg_percent.yaml new file mode 100644 index 000000000..0c56d57b6 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/fpg_percent.yaml @@ -0,0 +1,26 @@ +description: West Virginia reduces its low-income family tax credit for filers with modified adjusted gross income exceeding this fraction of the federal poverty guideline. +metadata: + period: year + unit: /1 + label: West Virginia low-income family tax credit MAGI limit + reference: + - title: Code of West Virginia §11-21-22B (b)(1) and (c)(1) + href: https://code.wvlegislature.gov/11-21-22B/ + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=28 + - title: 2022 West Virginia Personal Income Tax Forms And Instructions-2022 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=42 + + breakdown: + - filing_status + +SINGLE: + 2007-01-01: 1 +HEAD_OF_HOUSEHOLD: + 2007-01-01: 1 +JOINT: + 2007-01-01: 1 +WIDOW: + 2007-01-01: 1 +SEPARATE: + 2007-01-01: 0.5 diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/max_family_size.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/max_family_size.yaml new file mode 100644 index 000000000..db2c18be2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/low_income_family_tax_credit/max_family_size.yaml @@ -0,0 +1,18 @@ +description: West Virginia limits the number of eligible tax unit members for the low-income family tax credit to this amount. + +values: + 2007-01-01: 8 + +metadata: + period: year + unit: /1 + label: West Virginia family size of low-income family tax credit max family size + reference: + - title: Code of West Virginia §11-21-22A (b) + href: https://code.wvlegislature.gov/11-21-22A/ + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=28 + - title: 2022 West Virginia Personal Income Tax Forms And Instructions-2022 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=42 + + diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/non_refundable.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/non_refundable.yaml new file mode 100644 index 000000000..5fa768c5b --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/non_refundable.yaml @@ -0,0 +1,7 @@ +description: West Virginia allows these non-refundable tax credits. +values: + 2022-01-01: + - wv_low_income_family_tax_credit +metadata: + unit: program + label: West Virginia non-refundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/refundable.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/refundable.yaml new file mode 100644 index 000000000..e0538a5e2 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/refundable.yaml @@ -0,0 +1,7 @@ +description: West Virginia allows these refundable tax credits. +values: + 2020-01-01: + - wv_sctc +metadata: + unit: program + label: West Virginia refundable tax credits diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/sctc/fpg_percentage.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/sctc/fpg_percentage.yaml new file mode 100644 index 000000000..84c538cbd --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/sctc/fpg_percentage.yaml @@ -0,0 +1,17 @@ +description: West Virginia qualifies filers for the senior citizens tax credit with modified gross income below this percentage of the federal poverty guidelines. + +values: + 2012-01-01: 1.5 + +metadata: + period: year + unit: /1 + label: West Virginia senior citizens tax credit federal poverty guidelines percentage + + reference: + - title: West Virginia Personal Income Tax Forms And Instructions 2022 + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=35 + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=27 + - title: Code of West Virginia §11-21-21(b)(1) + href: https://code.wvlegislature.gov/11-21-21/ diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/sctc/max_amount.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/sctc/max_amount.yaml new file mode 100644 index 000000000..c87eb70a7 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/credits/sctc/max_amount.yaml @@ -0,0 +1,16 @@ +description: West Virginia provides a senior citizens tax credit of up to this maximum amount. + +values: + 2007-01-01: 20_000 + +metadata: + period: year + unit: currency-USD + label: West Virginia senior citizens tax credit max amount + reference: + - title: West Virginia Personal Income Tax Forms And Instructions 2022 + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=35 + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=27 + - title: Code of West Virginia §11-21-21 (a)(1)(2) + href: https://code.wvlegislature.gov/11-21-21/ diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/exemptions/homestead_exemption/max_amount.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/exemptions/homestead_exemption/max_amount.yaml new file mode 100644 index 000000000..921c09b94 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/exemptions/homestead_exemption/max_amount.yaml @@ -0,0 +1,16 @@ +description: West Virginia provides a homestead exemption of up to this maximum amount. + +values: + 2012-01-01: 20_000 + +metadata: + period: year + unit: currency-USD + label: West Virginia homestead exemption max amount + reference: + - title: West Virginia Personal Income Tax Forms And Instructions 2022 + href: https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=35 + - title: 2021 West Virginia Personal Income Tax Forms And Instructions-2021 FAMILY TAX CREDIT TABLES + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=27 + - title: Code of West Virginia §11-21-21 (a)(1)(2) + href: https://code.wvlegislature.gov/11-21-21/ diff --git a/fiscalsim_us/parameters/gov/states/wv/tax/income/subtractions/public_pension/max_amount.yaml b/fiscalsim_us/parameters/gov/states/wv/tax/income/subtractions/public_pension/max_amount.yaml new file mode 100644 index 000000000..1a51562d1 --- /dev/null +++ b/fiscalsim_us/parameters/gov/states/wv/tax/income/subtractions/public_pension/max_amount.yaml @@ -0,0 +1,16 @@ +description: West Virginia provides a pension subtraction of up to this maximum amount. + +values: + 1989-01-01: 2_000 + +metadata: + period: year + unit: currency-USD + label: West Virginia public pension subtraction max amount + reference: + - title: Code of West Virginia §11-21-12 (c)(5) + href: https://code.wvlegislature.gov/11-21-12/ + - title: 2021 West Virginia Personal Income Tax Forms And Instructions Line 31 + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=19 + - title: 2022 West Virginia Personal Income Tax Forms And Instructions Line 31 + href: https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=25 diff --git a/fiscalsim_us/parameters/gov/usda/README.md b/fiscalsim_us/parameters/gov/usda/README.md index 859e7dd1f..e670f9c59 100644 --- a/fiscalsim_us/parameters/gov/usda/README.md +++ b/fiscalsim_us/parameters/gov/usda/README.md @@ -1 +1 @@ -# USDA +# US Department of Agriculture (USDA) diff --git a/fiscalsim_us/parameters/gov/usda/school_meals/income/limit.yaml b/fiscalsim_us/parameters/gov/usda/school_meals/income/limit.yaml index 4b86db584..045eb2eb0 100644 --- a/fiscalsim_us/parameters/gov/usda/school_meals/income/limit.yaml +++ b/fiscalsim_us/parameters/gov/usda/school_meals/income/limit.yaml @@ -5,14 +5,12 @@ FREE: 2011-01-01: 1.3 metadata: label: Free school meal income limit as a percent of the poverty line - name: school_meal_free_fpg_limit unit: /1 REDUCED: values: 2011-01-01: 1.85 metadata: label: Reduced school meal income limit as a percent of the poverty line - name: school_meal_reduced_fpg_limit unit: /1 metadata: diff --git a/fiscalsim_us/parameters/gov/usda/snap/README.md b/fiscalsim_us/parameters/gov/usda/snap/README.md index 867965f52..ce54b4725 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/README.md +++ b/fiscalsim_us/parameters/gov/usda/snap/README.md @@ -1 +1 @@ -# SNAP +# Supplemental Nutrition Assistance Program (SNAP) diff --git a/fiscalsim_us/parameters/gov/usda/snap/asset_test/limit.yaml b/fiscalsim_us/parameters/gov/usda/snap/asset_test/limit.yaml index 76a6df40f..4d8d030f2 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/asset_test/limit.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/asset_test/limit.yaml @@ -17,6 +17,9 @@ standard: reference: - title: SNAP - Fiscal Year 2023 Cost-of-Living Adjustments href: https://fns-prod.azureedge.us/sites/default/files/resource-files/FY23-Maximum-Allotments-Deductions.pdf + - title: SNAP - Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2024 Income Eligibility Standards + href: https://fns-prod.azureedge.us/sites/default/files/resource-files/FY24-SNAP-COLA-Memo.pdf#page=1 + elderly_disabled: description: Maximum value of SNAP-visible assets for households with elderly or disabled members values: @@ -35,6 +38,8 @@ elderly_disabled: reference: - title: SNAP - Fiscal Year 2023 Cost-of-Living Adjustments href: https://fns-prod.azureedge.us/sites/default/files/resource-files/FY23-Maximum-Allotments-Deductions.pdf + - title: SNAP - Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2024 Income Eligibility Standards + href: https://fns-prod.azureedge.us/sites/default/files/resource-files/FY24-SNAP-COLA-Memo.pdfpage=1 metadata: unit: currency-USD label: SNAP asset limit diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/child_support.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/child_support.yaml index 140912932..3fec3fc68 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/child_support.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/child_support.yaml @@ -1,4 +1,4 @@ -description: Whether legally mandated child support payments can be deducted from net income for SNAP. +description: Whether legally mandated child support payments can be deducted from gross income for SNAP. AK: 2010-01-01: false 2021-10-01: true @@ -17,6 +17,13 @@ CA: CO: 2010-01-01: false 2021-10-01: false + # May have changed prior to 2022-11-30. + 2022-11-30: + value: true + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.5(A) (page 111) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: false 2021-10-01: true @@ -160,7 +167,7 @@ WY: 2021-10-01: true metadata: unit: bool - label: SNAP child support deduction + label: SNAP child support gross income deduction breakdown: - state_code reference: diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/earned_income.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/earned_income.yaml index 485b63483..07cc47f27 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/earned_income.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/earned_income.yaml @@ -3,7 +3,6 @@ values: 2005-01-01: 0.2 metadata: unit: /1 - name: snap_earned_income_deduction label: SNAP earned income deduction reference: - title: 7 U.S. Code § 2014(e)(2)(B) diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_medical_expense/disregard.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_medical_expense/disregard.yaml index 35f36fee2..ddd87c83b 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_medical_expense/disregard.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_medical_expense/disregard.yaml @@ -8,4 +8,3 @@ metadata: unit: currency-USD period: month label: Medical expense disregard for SNAP excess medical expense deduction - name: snap_medical_expense_disregard diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_medical_expense/standard.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_medical_expense/standard.yaml index d23624ea3..cdaa10fe8 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_medical_expense/standard.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_medical_expense/standard.yaml @@ -16,7 +16,12 @@ CA: 2021-10-01: 120 CO: 2010-01-01: 0 - 2021-10-01: 165 + 2016-10-01: + value: 165 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.61(A) (page 113) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: 0 2021-10-01: 0 diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/cap.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/cap.yaml index 566ecad25..19ea5bf9b 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/cap.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/cap.yaml @@ -10,6 +10,7 @@ CONTIGUOUS_US: 2020-10-01: 586 2021-10-01: 597 2022-10-01: 624 + 2023-10-01: 672 AK_URBAN: 1996-08-22: 429 1997-01-01: 434 @@ -20,6 +21,7 @@ AK_URBAN: 2020-01-01: 936 2021-10-01: 954 2022-10-01: 996 + 2023-10-01: 1_073 AK_RURAL_1: 1996-08-22: 429 1997-01-01: 434 @@ -30,6 +32,7 @@ AK_RURAL_1: 2020-10-01: 936 2021-10-01: 954 2022-10-01: 996 + 2023-10-01: 1_073 AK_RURAL_2: 1996-08-22: 429 1997-01-01: 434 @@ -40,6 +43,7 @@ AK_RURAL_2: 2020-10-01: 936 2021-10-01: 954 2022-10-01: 996 + 2023-10-01: 1_073 GU: 1996-08-22: 300 1997-01-01: 304 @@ -50,6 +54,7 @@ GU: 2020-10-01: 688 2021-10-01: 701 2022-10-01: 732 + 2023-10-01: 789 HI: 1996-08-22: 353 1997-01-01: 357 @@ -60,6 +65,7 @@ HI: 2020-10-01: 790 2021-10-01: 805 2022-10-01: 840 + 2023-10-01: 905 VI: 1996-08-22: 182 1997-01-01: 184 @@ -70,11 +76,11 @@ VI: 2020-10-01: 462 2021-10-01: 471 2022-10-01: 492 + 2023-10-01: 529 metadata: unit: currency-USD period: month - name: snap_maximum_shelter_deduction label: SNAP maximum shelter deduction reference: - title: 7 U.S. Code § 2014(e)(6)(B) # Values from 1996-08-22 to 2000-10-01. @@ -86,5 +92,7 @@ metadata: # This page links to other PDFs. - title: USDA Cost of Living Adjustments href: https://www.fns.usda.gov/snap/allotment/COLA + - title: Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2024 Income Eligibility Standards + href: https://fns-prod.azureedge.us/sites/default/files/media/file/FY24-Maximum-Allotments-and-Deductions.pdf breakdown: - snap_region diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/homeless/available.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/homeless/available.yaml index efd505c39..efcb7722a 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/homeless/available.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/homeless/available.yaml @@ -17,6 +17,12 @@ CA: CO: 2010-01-01: false 2021-10-01: true + 2022-11-30: + value: true + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.3(C) (page 107) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: false 2021-10-01: false @@ -160,7 +166,6 @@ WY: 2021-10-01: false metadata: unit: bool - name: snap_homeless_shelter_deduction_available label: SNAP homeless shelter deduction available breakdown: - state_code diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/homeless/deduction.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/homeless/deduction.yaml index e84331aac..82b4e4326 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/homeless/deduction.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/homeless/deduction.yaml @@ -24,10 +24,15 @@ values: reference: - title: Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2023 Income Eligibility Standards href: https://fns-prod.azureedge.us/sites/default/files/resource-files/FY23-Maximum-Allotments-Deductions.pdf + 2023-10-01: + value: 179.66 + metadata: + reference: + - title: Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2024 Income Eligibility Standards + href: https://www.fns.usda.gov/snap/fy-2024-cola#:~:text=The%20shelter%20cap%20value%20will,and%20the%20U.S.%20Virgins%20Islands. metadata: unit: currency-USD period: month label: SNAP homeless shelter deduction - name: snap_homeless_shelter_deduction diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/income_share_disregard.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/income_share_disregard.yaml index d5e55a324..95a4487a9 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/income_share_disregard.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/income_share_disregard.yaml @@ -9,4 +9,3 @@ metadata: - title: 7 U.S. Code § 2014(e)(6)(A) href: https://www.law.cornell.edu/uscode/text/7/2014#e_6_A label: Share of income disregarded for SNAP shelter deduction - name: snap_shelter_deduction_income_share_disregard diff --git a/fiscalsim_us/parameters/gov/states/in/index.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/index.yaml similarity index 78% rename from fiscalsim_us/parameters/gov/states/in/index.yaml rename to fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/index.yaml index a50c592b9..cb39cde8a 100644 --- a/fiscalsim_us/parameters/gov/states/in/index.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/excess_shelter_expense/index.yaml @@ -1,3 +1,4 @@ metadata: propagate_metadata_to_children: true economy: false + household: true diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/standard.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/standard.yaml index eefc50dfe..7676cc9da 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/standard.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/standard.yaml @@ -6,132 +6,163 @@ CONTIGUOUS_US: 2020-10-01: 167 2021-10-01: 177 2022-10-01: 193 + 2023-10-01: 198 2: 2020-10-01: 167 2021-10-01: 177 2022-10-01: 193 + 2023-10-01: 198 3: 2020-10-01: 167 2021-10-01: 177 2022-10-01: 193 + 2023-10-01: 198 4: 2020-10-01: 181 2021-10-01: 184 2022-10-01: 193 + 2023-10-01: 208 5: 2020-10-01: 212 2021-10-01: 215 2022-10-01: 225 + 2023-10-01: 244 6: 2020-10-01: 243 2021-10-01: 246 2022-10-01: 258 + 2023-10-01: 279 AK: 1: 2020-10-01: 286 2021-10-01: 303 2022-10-01: 330 + 2023-10-01: 338 2: 2020-10-01: 286 2021-10-01: 303 2022-10-01: 330 + 2023-10-01: 338 3: 2020-10-01: 286 2021-10-01: 303 2022-10-01: 330 + 2023-10-01: 338 4: 2020-10-01: 286 2021-10-01: 303 2022-10-01: 330 + 2023-10-01: 338 5: 2020-10-01: 286 2021-10-01: 303 2022-10-01: 330 + 2023-10-01: 338 6: 2020-10-01: 304 2021-10-01: 308 2022-10-01: 330 + 2023-10-01: 349 GU: 1: 2020-10-01: 336 2021-10-01: 356 2022-10-01: 387 + 2023-10-01: 397 2: 2020-10-01: 336 2021-10-01: 356 2022-10-01: 387 + 2023-10-01: 397 3: 2020-10-01: 336 2021-10-01: 356 2022-10-01: 387 + 2023-10-01: 397 4: 2020-10-01: 363 2021-10-01: 367 2022-10-01: 387 + 2023-10-01: 416 5: 2020-10-01: 425 2021-10-01: 430 2022-10-01: 450 + 2023-10-01: 487 6: 2020-10-01: 487 2021-10-01: 493 2022-10-01: 515 + 2023-10-01: 558 HI: 1: 2020-10-01: 236 2021-10-01: 250 2022-10-01: 272 + 2023-10-01: 279 2: 2020-10-01: 236 2021-10-01: 250 2022-10-01: 272 + 2023-10-01: 279 3: 2020-10-01: 236 2021-10-01: 250 2022-10-01: 272 + 2023-10-01: 279 4: 2020-10-01: 236 2021-10-01: 250 2022-10-01: 272 + 2023-10-01: 279 5: 2020-10-01: 244 2021-10-01: 250 2022-10-01: 272 + 2023-10-01: 280 6: 2020-10-01: 280 2021-10-01: 283 2022-10-01: 296 + 2023-10-01: 321 VI: 1: 2020-10-01: 147 2021-10-01: 156 2022-10-01: 170 + 2023-10-01: 174 2: 2020-10-01: 147 2021-10-01: 156 2022-10-01: 170 + 2023-10-01: 174 3: 2020-10-01: 150 2021-10-01: 156 2022-10-01: 170 + 2023-10-01: 174 4: 2020-10-01: 181 2021-10-01: 184 2022-10-01: 192 + 2023-10-01: 208 5: 2020-10-01: 212 2021-10-01: 215 2022-10-01: 225 + 2023-10-01: 244 6: 2020-10-01: 243 2021-10-01: 246 2022-10-01: 258 + 2023-10-01: 279 metadata: unit: currency-USD - name: snap_standard_deduction label: SNAP standard deduction reference: + - title: Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2024 Maximum Allotments and Deductions + href: https://fns-prod.azureedge.us/sites/default/files/media/file/FY24-Maximum-Allotments-and-Deductions.pdf#page=2 - title: Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2022 Maximum Allotments and Deductions href: https://fns-prod.azureedge.us/sites/default/files/media/file/FY22-Maximum-Allotments-Deductions.pdf - title: Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2021 Maximum Allotments and Deductions @@ -139,6 +170,8 @@ metadata: # This page links to other PDFs. - title: USDA Cost of Living Adjustments href: https://www.fns.usda.gov/snap/allotment/COLA + - title: Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2024 Income Eligibility Standards + href: https://fns-prod.azureedge.us/sites/default/files/media/file/FY24-Maximum-Allotments-and-Deductions.pdf period: month breakdown: - state_group diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/limited/active.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/limited/active.yaml index 271d6df05..f82e3301f 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/limited/active.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/limited/active.yaml @@ -160,7 +160,6 @@ WY: 2021-10-01: true metadata: unit: bool - name: snap_lua_active label: SNAP Limited Utility Allowance active breakdown: - snap_utility_region diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/limited/allowance.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/limited/allowance.yaml index 8ed54d3b2..fc5749074 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/limited/allowance.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/limited/allowance.yaml @@ -17,6 +17,12 @@ CA: CO: 2010-01-01: 0 2021-10-01: 314 + 2022-10-01: + value: 338 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.31(B)(3) (page 109) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: 0 2021-10-01: 345 @@ -168,4 +174,3 @@ metadata: href: https://www.snapscreener.com/?p=table breakdown: - snap_utility_region - name: snap_lua diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/electricity.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/electricity.yaml index 2da709984..b9e9b0f22 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/electricity.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/electricity.yaml @@ -2,7 +2,6 @@ description: Utility allowance for households whose utility expenses are only el metadata: unit: currency-USD period: month - name: snap_utility_electricity label: SNAP standard utility allowance for electricity expenses breakdown: - snap_utility_region @@ -24,6 +23,12 @@ CA: CO: 2010-01-01: 0 2021-10-01: 59 + 2022-10-01: + value: 64 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.31(C)(3) (page 110) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: 0 2021-10-01: 0 diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/gas_and_fuel.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/gas_and_fuel.yaml index 75c5356c0..53ce5ebb5 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/gas_and_fuel.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/gas_and_fuel.yaml @@ -2,7 +2,6 @@ description: Utility allowance for households whose utility expenses are only ga metadata: unit: currency-USD period: month - name: snap_utility_gas label: SNAP standard utility allowance for gas and fuel expenses breakdown: - snap_utility_region @@ -24,6 +23,12 @@ CA: CO: 2010-01-01: 0 2021-10-01: 59 + 2022-10-01: + value: 64 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.31(C)(3) (page 110) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: 0 2021-10-01: 0 diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/phone.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/phone.yaml index f3af1f0cb..7ff2de9d2 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/phone.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/phone.yaml @@ -2,7 +2,6 @@ description: Utility allowance for households whose utility expenses are only ph metadata: unit: currency-USD period: month - name: snap_utility_expenses label: SNAP standard utility allowance for phone expenses breakdown: - snap_utility_region @@ -24,6 +23,12 @@ CA: CO: 2010-01-01: 0 2021-10-01: 80 + 2022-10-01: + value: 86 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.31(D)(2) (page 110) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: 0 2021-10-01: 29 diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/sewage.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/sewage.yaml index ca52ec301..65197a34f 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/sewage.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/sewage.yaml @@ -2,7 +2,6 @@ description: Utility allowance for households whose utility expenses are only se metadata: unit: currency-USD period: month - name: snap_utility_sewage label: SNAP standard utility allowance for sewage expenses breakdown: - snap_utility_region @@ -24,6 +23,12 @@ CA: CO: 2010-01-01: 0 2021-10-01: 59 + 2022-10-01: + value: 64 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.31(C)(3) (page 110) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: 0 2021-10-01: 0 diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/trash.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/trash.yaml index c76fe3601..02c83b5ee 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/trash.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/trash.yaml @@ -2,7 +2,6 @@ description: Utility allowance for households whose utility expenses are only tr metadata: unit: currency-USD period: month - name: snap_utility_trash label: SNAP standard utility allowance for trash expenses breakdown: - snap_utility_region @@ -24,6 +23,12 @@ CA: CO: 2010-01-01: 0 2021-10-01: 59 + 2022-10-01: + value: 64 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.31(C)(3) (page 110) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: 0 2021-10-01: 0 diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/utility_types.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/utility_types.yaml index 3ddabd13a..262f826b0 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/utility_types.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/utility_types.yaml @@ -9,5 +9,4 @@ values: - trash_expense metadata: unit: list - name: snap_utility_types label: SNAP utility types diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/water.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/water.yaml index e623e3d2e..d554e99a2 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/water.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/single/water.yaml @@ -2,7 +2,6 @@ description: Utility allowance for households whose utility expenses are only wa metadata: unit: currency-USD period: month - name: snap_utility_water label: SNAP standard utility allowance for water expenses breakdown: - snap_utility_region @@ -24,6 +23,12 @@ CA: CO: 2010-01-01: 0 2021-10-01: 59 + 2022-10-01: + value: 64 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.31(C)(3) (page 110) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: 0 2021-10-01: 0 diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/standard.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/standard.yaml index 15ebcf7a3..565c97ca9 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/standard.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/deductions/utility/standard.yaml @@ -17,6 +17,12 @@ CA: CO: 2010-01-01: 0 2021-10-01: 493 + 2022-10-01: + value: 531 + metadata: + reference: + - title: Code of Colorado Regulations | Rule Manual Volume 4, SNAP | 4.407.31(A)(4) (page 109) + href: https://www.sos.state.co.us/CCR/GenerateRulePdf.do?ruleVersionId=10492&fileName=10%20CCR%202506-1 CT: 2010-01-01: 0 2021-10-01: 783 @@ -168,5 +174,4 @@ metadata: href: https://www.snapscreener.com/?p=table breakdown: - state_code - name: snap_utility_region label: SNAP standard utility allowance diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/limit/gross.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/limit/gross.yaml index d635c5690..6ef2bc428 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/limit/gross.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/limit/gross.yaml @@ -4,7 +4,6 @@ values: 2005-01-01: 1.3 metadata: label: SNAP gross income limit - name: snap_gross_income_limit unit: /1 reference: - title: 7 CFR § 273.9 - Income and deductions. diff --git a/fiscalsim_us/parameters/gov/usda/snap/income/limit/net.yaml b/fiscalsim_us/parameters/gov/usda/snap/income/limit/net.yaml index c6bd729fd..bc41c45fc 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/income/limit/net.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/income/limit/net.yaml @@ -4,7 +4,6 @@ values: 2005-01-01: 1 metadata: label: SNAP net income limit - name: snap_net_income_limit unit: /1 reference: - title: 7 CFR § 273.9 - Income and deductions. diff --git a/fiscalsim_us/parameters/gov/usda/snap/max_allotment.yaml b/fiscalsim_us/parameters/gov/usda/snap/max_allotment.yaml index d7d244d48..4613b7998 100644 --- a/fiscalsim_us/parameters/gov/usda/snap/max_allotment.yaml +++ b/fiscalsim_us/parameters/gov/usda/snap/max_allotment.yaml @@ -7,7 +7,6 @@ main: - range(1, 9) unit: currency-USD period: month - name: snap_max_allotment_main label: SNAP max allotment CONTIGUOUS_US: 1: @@ -15,287 +14,343 @@ main: 2021-01-01: 234 2021-10-01: 250 2022-10-01: 281 + 2023-10-01: 291 2: 2020-10-01: 374 2021-01-01: 430 2021-10-01: 459 2022-10-01: 516 + 2023-10-01: 535 3: 2020-10-01: 535 2021-01-01: 616 2021-10-01: 658 2022-10-01: 740 + 2023-10-01: 766 4: 2020-10-01: 680 2021-01-01: 782 2021-10-01: 835 2022-10-01: 939 + 2023-10-01: 973 5: 2020-10-01: 807 2021-01-01: 929 2021-10-01: 992 2022-10-01: 1_116 + 2023-10-01: 1_155 6: 2020-10-01: 969 2021-01-01: 1_114 2021-10-01: 1_190 2022-10-01: 1_339 + 2023-10-01: 1_386 7: 2020-10-01: 1_071 2021-01-01: 1_232 2021-10-01: 1_316 2022-10-01: 1_480 + 2023-10-01: 1_532 8: 2020-10-01: 1_224 2021-01-01: 1_408 2021-10-01: 1_504 2022-10-01: 1_691 + 2023-10-01: 1_751 AK_URBAN: 1: 2020-10-01: 251 2021-01-01: 289 2021-10-01: 322 2022-10-01: 351 + 2023-10-01: 374 2: 2020-10-01: 460 2021-01-01: 530 2021-10-01: 591 2022-10-01: 644 + 2023-10-01: 686 3: 2020-10-01: 659 2021-01-01: 758 2021-10-01: 846 2022-10-01: 923 + 2023-10-01: 983 4: 2020-10-01: 837 2021-01-01: 963 2021-10-01: 1_074 2022-10-01: 1_172 + 2023-10-01: 1_248 5: 2020-10-01: 995 2021-01-01: 1_114 2021-10-01: 1_276 2022-10-01: 1_391 + 2023-10-01: 1_482 6: 2020-10-01: 1_194 2021-01-01: 1_373 2021-10-01: 1_531 2022-10-01: 1_670 + 2023-10-01: 1_778 7: 2020-10-01: 1_319 2021-01-01: 1_517 2021-10-01: 1_692 2022-10-01: 1_846 + 2023-10-01: 1_966 8: 2020-10-01: 1_508 2021-01-01: 1_734 2021-10-01: 1_934 2022-10-01: 2_109 + 2023-10-01: 2_246 AK_RURAL_1: 1: 2020-10-01: 320 2021-01-01: 368 2021-10-01: 411 2022-10-01: 448 + 2023-10-01: 477 2: 2020-10-01: 587 2021-01-01: 675 2021-10-01: 753 2022-10-01: 822 + 2023-10-01: 875 3: 2020-10-01: 841 2021-01-01: 967 2021-10-01: 1_079 2022-10-01: 1_177 + 2023-10-01: 1_253 4: 2020-10-01: 1_068 2021-01-01: 1_228 2021-10-01: 1_370 2022-10-01: 1_494 + 2023-10-01: 1_591 5: 2020-10-01: 1_268 2021-01-01: 1_459 2021-10-01: 1_627 2022-10-01: 1_774 + 2023-10-01: 1_890 6: 2020-10-01: 1_522 2021-01-01: 1_751 2021-10-01: 1_952 2022-10-01: 2_129 + 2023-10-01: 2_268 7: 2020-10-01: 1_682 2021-01-01: 1_935 2021-10-01: 2_158 2022-10-01: 2_354 + 2023-10-01: 2_506 8: 2020-10-01: 1_923 2021-01-01: 2_211 2021-10-01: 2_466 2022-10-01: 2_690 + 2023-10-01: 2_865 AK_RURAL_2: 1: 2020-10-01: 390 2021-01-01: 448 2021-10-01: 500 - 2022-10-01: 545 + 2022-10-01: 545 + 2023-10-01: 581 2: 2020-10-01: 715 2021-01-01: 822 2021-10-01: 917 2022-10-01: 1_000 + 2023-10-01: 1_065 3: 2020-10-01: 1_024 2021-01-01: 1_177 2021-10-01: 1_313 2022-10-01: 1_432 + 2023-10-01: 1_525 4: 2020-10-01: 1_300 2021-01-01: 1_495 2021-10-01: 1_667 2022-10-01: 1_819 + 2023-10-01: 1_937 5: 2020-10-01: 1_544 2021-01-01: 1_776 2021-10-01: 1_980 2022-10-01: 2_160 + 2023-10-01: 2_300 6: 2020-10-01: 1_853 2021-01-01: 2_131 2021-10-01: 2_376 2022-10-01: 2_592 + 2023-10-01: 2_760 7: 2020-10-01: 2_048 2021-01-01: 2_355 2021-10-01: 2_626 2022-10-01: 2_865 + 2023-10-01: 3_051 8: 2020-10-01: 2_340 2021-01-01: 2_692 2021-10-01: 3_002 2022-10-01: 3_274 + 2023-10-01: 3_487 GU: 1: 2020-10-01: 300 2021-01-01: 345 2021-10-01: 369 2022-10-01: 415 + 2023-10-01: 430 2: 2020-10-01: 551 2021-01-01: 634 2021-10-01: 677 2022-10-01: 761 + 2023-10-01: 788 3: 2020-10-01: 789 2021-01-01: 908 2021-10-01: 969 2022-10-01: 1_090 + 2023-10-01: 1_129 4: 2020-10-01: 1_002 2021-01-01: 1_153 2021-10-01: 1_231 2022-10-01: 1_385 + 2023-10-01: 1_434 5: 2020-10-01: 1_190 2021-01-01: 1_369 2021-10-01: 1_462 2022-10-01: 1_644 + 2023-10-01: 1_703 6: 2020-10-01: 1_428 2021-01-01: 1_643 2021-10-01: 1_754 2022-10-01: 1_973 + 2023-10-01: 2_044 7: 2020-10-01: 1_579 2021-01-01: 1_816 2021-10-01: 1_939 2022-10-01: 2_181 + 2023-10-01: 2_259 8: 2020-10-01: 1_804 2021-01-01: 2_075 2021-10-01: 2_216 2022-10-01: 2_493 + 2023-10-01: 2_581 HI: 1: 2020-10-01: 375 2021-01-01: 432 2021-10-01: 472 2022-10-01: 538 + 2023-10-01: 527 2: 2020-10-01: 688 2021-01-01: 792 2021-10-01: 865 2022-10-01: 987 + 2023-10-01: 967 3: 2020-10-01: 986 2021-01-01: 1_134 2021-10-01: 1_239 2022-10-01: 1_413 + 2023-10-01: 1_385 4: 2020-10-01: 1_252 2021-01-01: 1_440 2021-10-01: 1_573 2022-10-01: 1_794 + 2023-10-01: 1_759 5: 2020-10-01: 1_487 2021-01-01: 1_710 2021-10-01: 1_868 2022-10-01: 2_131 + 2023-10-01: 2_088 6: 2020-10-01: 1_784 2021-01-01: 2_052 2021-10-01: 2_242 2022-10-01: 2_557 + 2023-10-01: 2_506 7: 2020-10-01: 1_972 2021-01-01: 2_268 2021-10-01: 2_478 2022-10-01: 2_826 + 2023-10-01: 2_770 8: 2020-10-01: 2_254 2021-01-01: 2_592 2021-10-01: 2_832 2022-10-01: 3_230 + 2023-10-01: 3_166 VI: 1: 2020-10-01: 262 2021-01-01: 301 2021-10-01: 322 2022-10-01: 362 + 2023-10-01: 375 2: 2020-10-01: 481 2021-01-01: 553 2021-10-01: 590 2022-10-01: 664 + 2023-10-01: 688 3: 2020-10-01: 688 2021-01-01: 792 2021-10-01: 845 2022-10-01: 951 + 2023-10-01: 985 4: 2020-10-01: 874 2021-01-01: 1_005 2021-10-01: 1_074 2022-10-01: 1_208 + 2023-10-01: 1_251 5: 2020-10-01: 1_038 2021-01-01: 1_194 2021-10-01: 1_275 2022-10-01: 1_434 + 2023-10-01: 1_485 6: 2020-10-01: 1_246 2021-01-01: 1_433 2021-10-01: 1_530 2022-10-01: 1_721 + 2023-10-01: 1_782 7: 2020-10-01: 1_377 2021-01-01: 1_584 2021-10-01: 1_691 2022-10-01: 1_903 + 2023-10-01: 1_970 8: 2020-10-01: 1_574 2021-01-01: 1_810 2021-10-01: 1_933 2022-10-01: 2_174 + 2023-10-01: 2_252 additional: metadata: breakdown: @@ -305,36 +360,43 @@ additional: 2021-01-01: 176 2021-10-01: 188 2022-10-01: 211 + 2023-10-01: 219 AK_URBAN: 2020-10-01: 189 2021-01-01: 217 2021-10-01: 242 2022-10-01: 264 + 2023-10-01: 281 AK_RURAL_1: 2020-10-01: 240 2021-01-01: 276 2021-10-01: 308 2022-10-01: 336 + 2023-10-01: 358 AK_RURAL_2: 2020-10-01: 293 2021-01-01: 337 2021-10-01: 375 2022-10-01: 409 + 2023-10-01: 436 GU: 2020-10-01: 226 2021-01-01: 259 2021-10-01: 277 2022-10-01: 312 + 2023-10-01: 323 HI: 2020-10-01: 558 2021-01-01: 324 2021-10-01: 354 2022-10-01: 404 + 2023-10-01: 396 VI: 2020-10-01: 197 2021-01-01: 226 2021-10-01: 242 2022-10-01: 272 + 2023-10-01: 282 metadata: unit: currency-USD @@ -356,6 +418,9 @@ metadata: # Effective 2022-10-01. - title: Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2023 Income Eligibility Standards href: https://fns-prod.azureedge.us/sites/default/files/resource-files/FY23-Maximum-Allotments-Deductions.pdf + # Effective 2023-10-01. + - title: Supplemental Nutrition Assistance Program (SNAP) Fiscal Year (FY) 2024 Income Eligibility Standards + href: https://fns-prod.azureedge.us/sites/default/files/media/file/FY24-Maximum-Allotments-and-Deductions.pdf # Links to all the above. - title: USDA Cost of Living Adjustments href: https://www.fns.usda.gov/snap/allotment/COLA diff --git a/fiscalsim_us/parameters/gov/usda/wic/README.md b/fiscalsim_us/parameters/gov/usda/wic/README.md index 874300d71..e5f16549c 100644 --- a/fiscalsim_us/parameters/gov/usda/wic/README.md +++ b/fiscalsim_us/parameters/gov/usda/wic/README.md @@ -1 +1 @@ -# WIC +# Special Supplemental Nutrition Program for Women, Infants, and Children (WIC) diff --git a/fiscalsim_us/parameters/gov/usda/wic/nutritional_risk.yaml b/fiscalsim_us/parameters/gov/usda/wic/nutritional_risk.yaml index 72ac34573..d1bf6c064 100644 --- a/fiscalsim_us/parameters/gov/usda/wic/nutritional_risk.yaml +++ b/fiscalsim_us/parameters/gov/usda/wic/nutritional_risk.yaml @@ -1,7 +1,6 @@ description: Percentage of otherwise-eligible children in WIC applicant families who are simulated to be found at nutritional risk. metadata: unit: /1 - name: wic_nutritional_risk label: WIC nutritional risk breakdown: - wic_category diff --git a/fiscalsim_us/parameters/gov/usda/wic/takeup.yaml b/fiscalsim_us/parameters/gov/usda/wic/takeup.yaml index 6696e4c1f..0b9e1028a 100644 --- a/fiscalsim_us/parameters/gov/usda/wic/takeup.yaml +++ b/fiscalsim_us/parameters/gov/usda/wic/takeup.yaml @@ -3,7 +3,6 @@ metadata: unit: /1 breakdown: - wic_category - name: wic_takeup label: WIC takeup rate reference: - title: WIC Eligibility and Coverage Rates - 2018 diff --git a/fiscalsim_us/parameters/simulation/cliff_delta.yaml b/fiscalsim_us/parameters/simulation/cliff_delta.yaml new file mode 100644 index 000000000..7e948ca8e --- /dev/null +++ b/fiscalsim_us/parameters/simulation/cliff_delta.yaml @@ -0,0 +1,5 @@ +description: Employment income increase used to assess whether a person is on a tax-benefit cliff +values: + 0000-01-01: 2_000 +metadata: + unit: currency-USD diff --git a/fiscalsim_us/parameters/simulation/cliff_threshold.yaml b/fiscalsim_us/parameters/simulation/cliff_threshold.yaml deleted file mode 100644 index c2c9c3393..000000000 --- a/fiscalsim_us/parameters/simulation/cliff_threshold.yaml +++ /dev/null @@ -1,5 +0,0 @@ -description: Threshold to assess whether a household is on a cliff -values: - 0000-01-01: 2_000 -metadata: - unit: currency-USD diff --git a/fiscalsim_us/parameters/simulation/de/branch_to_determine_if_refundable_eitc.yaml b/fiscalsim_us/parameters/simulation/de/branch_to_determine_if_refundable_eitc.yaml new file mode 100644 index 000000000..e369ad80e --- /dev/null +++ b/fiscalsim_us/parameters/simulation/de/branch_to_determine_if_refundable_eitc.yaml @@ -0,0 +1,6 @@ +description: FiscalSim branches to determine whether filers claim the refundable over non-refundable Delaware EITC, as they can choose depending on which minimizes tax liability. +values: + 0000-01-01: false +metadata: + unit: bool + label: Branch to determine delaware refundability diff --git a/fiscalsim_us/parameters/simulation/marginal_tax_rate_delta.yaml b/fiscalsim_us/parameters/simulation/marginal_tax_rate_delta.yaml new file mode 100644 index 000000000..3a67f4cb9 --- /dev/null +++ b/fiscalsim_us/parameters/simulation/marginal_tax_rate_delta.yaml @@ -0,0 +1,5 @@ +description: Amount by which employment_income is increased to calculate marginal tax rate. +values: + 0000-01-01: 1_000 +metadata: + unit: currency-USD diff --git a/fiscalsim_us/reforms/__init__.py b/fiscalsim_us/reforms/__init__.py index 1e0ef4a75..9029d97bd 100644 --- a/fiscalsim_us/reforms/__init__.py +++ b/fiscalsim_us/reforms/__init__.py @@ -1 +1,2 @@ from fiscalsim_us.reforms.taxsim import taxsim +from .reforms import create_structural_reforms_from_parameters diff --git a/fiscalsim_us/reforms/congress/delauro/__init__.py b/fiscalsim_us/reforms/congress/delauro/__init__.py new file mode 100644 index 000000000..c49423af2 --- /dev/null +++ b/fiscalsim_us/reforms/congress/delauro/__init__.py @@ -0,0 +1,3 @@ +from .american_family_act import ( + create_american_family_act_with_baby_bonus_reform, +) diff --git a/fiscalsim_us/reforms/congress/delauro/american_family_act.py b/fiscalsim_us/reforms/congress/delauro/american_family_act.py new file mode 100644 index 000000000..34c71d143 --- /dev/null +++ b/fiscalsim_us/reforms/congress/delauro/american_family_act.py @@ -0,0 +1,51 @@ +from fiscalsim_us.model_api import * + + +def create_american_family_act_with_baby_bonus() -> Reform: + class ctc_child_individual_maximum_arpa(Variable): + value_type = float + entity = Person + label = "CTC maximum amount (child under ARPA)" + unit = USD + documentation = "The CTC entitlement in respect of this person as a child, under the American Rescue Plan Act." + definition_period = YEAR + + def formula(person, period, parameters): + age = person("age", period) + is_dependent = person("is_tax_unit_dependent", period) + amount_pre_baby_bonus = parameters( + period + ).gov.irs.credits.ctc.amount.arpa.calc(age) + # Add the baby bonus. + baby_bonus_amount = parameters( + period + ).gov.contrib.congress.delauro.american_family_act.baby_bonus + is_baby = age == 0 + baby_bonus = baby_bonus_amount * is_baby + amount = amount_pre_baby_bonus + baby_bonus + return is_dependent * amount + + class reform(Reform): + def apply(self): + self.update_variable(ctc_child_individual_maximum_arpa) + + return reform + + +def create_american_family_act_with_baby_bonus_reform( + parameters, period, bypass: bool = False +): + if bypass: + return create_american_family_act_with_baby_bonus() + + p = parameters(period).gov.contrib.congress.delauro.american_family_act + + if p.baby_bonus > 0: + return create_american_family_act_with_baby_bonus() + else: + return None + + +american_family_act = create_american_family_act_with_baby_bonus_reform( + None, None, bypass=True +) diff --git a/fiscalsim_us/reforms/dc_kccatc.py b/fiscalsim_us/reforms/dc_kccatc.py new file mode 100644 index 000000000..bb5b24ea9 --- /dev/null +++ b/fiscalsim_us/reforms/dc_kccatc.py @@ -0,0 +1,96 @@ +from fiscalsim_us.model_api import * + + +def create_dc_kccatc_reform(parameters, period, bypass=False): + class dc_kccatc(Variable): + value_type = float + entity = TaxUnit + label = "DC keep child care affordable tax credit" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=67" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=59" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + reform_parameters = parameters(period).gov.contrib.dc_kccatc + + if reform_parameters.active: + # Eligible expenses + + expenses = tax_unit("tax_unit_childcare_expenses", period) + cdcc = parameters(period).gov.irs.credits.cdcc + # Cap at number of children based on federal CDCC limit. + count_eligible = min_( + cdcc.eligibility.max, + tax_unit("count_cdcc_eligible", period), + ) + + # Maximum covered expenses + max_expenses_per_child = reform_parameters.expenses.max + max_expenses = max_expenses_per_child * count_eligible + eligible_capped_expenses = min_(expenses, max_expenses) + + # Percent covered + + amount_covered = ( + eligible_capped_expenses * reform_parameters.expenses.rate + ) + + # Phase-out + agi = tax_unit("adjusted_gross_income", period) + filing_status = tax_unit("filing_status", period) + threshold = reform_parameters.phase_out.threshold[ + filing_status + ] + income_over_threshold = max_(agi - threshold, 0) + phase_out_rate = reform_parameters.phase_out.rate + phase_out_amount = income_over_threshold * phase_out_rate + + return max_(0, amount_covered - phase_out_amount) + else: + p = parameters(period).gov.states.dc.tax.income.credits + # determine tax unit's income eligibility status + taxinc = tax_unit("dc_taxable_income_joint", period) + filing_status = tax_unit("filing_status", period) + income_eligible = ( + taxinc <= p.kccatc.income_limit[filing_status] + ) + # determine count of KCCATC age eligible children + person = tax_unit.members + is_dependent = person("is_tax_unit_dependent", period) + age = person("age", period) + kccatc_age_eligible = is_dependent & (age <= p.kccatc.max_age) + kccatc_eligible_count = tax_unit.sum(kccatc_age_eligible) + # determine count of federal CDCC age eligible children + cdcc = parameters(period).gov.irs.credits.cdcc.eligibility + cdcc_age_eligible = is_dependent & (age < cdcc.child_age) + cdcc_eligible_count = tax_unit.sum(cdcc_age_eligible) + # calculate KCCATC amount + max_kccatc = kccatc_eligible_count * p.kccatc.max_amount + total_care_expenses = tax_unit( + "tax_unit_childcare_expenses", period + ) + ratio = np.zeros_like(cdcc_eligible_count) + mask = cdcc_eligible_count > 0 + ratio[mask] = ( + kccatc_eligible_count[mask] / cdcc_eligible_count[mask] + ) + kccatc_care_expenses = total_care_expenses * ratio + kccatc = min_(kccatc_care_expenses, max_kccatc) + # return calculated kccatc amount if income eligible + return income_eligible * kccatc + + class reform(Reform): + def apply(self): + self.update_variable(dc_kccatc) + + if bypass or parameters(period).gov.contrib.dc_kccatc.active: + return reform + else: + return None + + +dc_kccatc_reform = create_dc_kccatc_reform(None, None, True) diff --git a/fiscalsim_us/reforms/dc_tax_threshold_joint_ratio.py b/fiscalsim_us/reforms/dc_tax_threshold_joint_ratio.py new file mode 100644 index 000000000..66a29dca2 --- /dev/null +++ b/fiscalsim_us/reforms/dc_tax_threshold_joint_ratio.py @@ -0,0 +1,51 @@ +from fiscalsim_us.model_api import * + + +def create_dc_tax_threshold_joint_ratio_reform( + parameters, period, bypass=False +): + if not bypass: + joint_ratio = parameters( + period + ).gov.contrib.dc_tax_threshold_joint_ratio + else: + joint_ratio = None + + class dc_income_tax_before_credits_joint(Variable): + value_type = float + entity = TaxUnit + label = ( + "DC income tax before credits when married couples file jointly" + ) + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + taxinc = max_(0, tax_unit("dc_taxable_income_joint", period)) + joint_ratio = parameters( + period + ).gov.contrib.dc_tax_threshold_joint_ratio + p = parameters(period).gov.states + return ( + p.dc.tax.income.rates.calc(taxinc / joint_ratio) * joint_ratio + ) + + class reform(Reform): + def apply(self): + print("updating dc_income_tax_before_credits_joint") + self.update_variable(dc_income_tax_before_credits_joint) + + if bypass or joint_ratio != 1: + return reform + else: + return None + + +dc_tax_threshold_joint_ratio_reform = ( + create_dc_tax_threshold_joint_ratio_reform(None, None, True) +) diff --git a/fiscalsim_us/reforms/reforms.py b/fiscalsim_us/reforms/reforms.py new file mode 100644 index 000000000..890d71dee --- /dev/null +++ b/fiscalsim_us/reforms/reforms.py @@ -0,0 +1,34 @@ +from .congress.delauro import create_american_family_act_with_baby_bonus_reform +from .dc_kccatc import create_dc_kccatc_reform +from .winship import create_eitc_winship_reform +from .dc_tax_threshold_joint_ratio import ( + create_dc_tax_threshold_joint_ratio_reform, +) +from policyengine_core.reforms import Reform +import warnings + + +def create_structural_reforms_from_parameters(parameters, period): + afa_reform = create_american_family_act_with_baby_bonus_reform( + parameters, period + ) + winship_reform = create_eitc_winship_reform(parameters, period) + dc_kccatc_reform = create_dc_kccatc_reform(parameters, period) + dc_tax_threshold_joint_ratio_reform = ( + create_dc_tax_threshold_joint_ratio_reform(parameters, period) + ) + + reforms = [ + afa_reform, + winship_reform, + dc_kccatc_reform, + dc_tax_threshold_joint_ratio_reform, + ] + reforms = tuple(filter(lambda x: x is not None, reforms)) + + class combined_reform(Reform): + def apply(self): + for reform in reforms: + reform.apply(self) + + return combined_reform diff --git a/fiscalsim_us/reforms/winship.py b/fiscalsim_us/reforms/winship.py new file mode 100644 index 000000000..d78000d01 --- /dev/null +++ b/fiscalsim_us/reforms/winship.py @@ -0,0 +1,83 @@ +from fiscalsim_us.model_api import * + + +def create_eitc_winship_reform(parameters, period, bypass=False): + if ( + not bypass + and not parameters(period).gov.contrib.individual_eitc.enabled + ): + return None + + # Compute EITC under filer_earned = tax_unit_head_earned + # Then compute EITC under filer_earned = tax_unit_spouse_earned + # Then set EITC = sum of the two + + class original_eitc(Variable): + value_type = float + entity = TaxUnit + definition_period = YEAR + label = "Original EITC" + reference = "https://www.law.cornell.edu/uscode/text/26/32#a" + unit = USD + defined_for = "eitc_eligible" + + def formula(tax_unit, period, parameters): + maximum = tax_unit("eitc_maximum", period) + phased_in = tax_unit("eitc_phased_in", period) + reduction = tax_unit("eitc_reduction", period) + limitation = max_(0, maximum - reduction) + return min_(phased_in, limitation) + + class earned_income_tax_credit(Variable): + value_type = float + entity = TaxUnit + definition_period = YEAR + label = "EITC" + unit = USD + defined_for = "eitc_eligible" + + def formula(tax_unit, period, parameters): + person = tax_unit.members + simulation = tax_unit.simulation + agi = tax_unit("adjusted_gross_income", period) + earned_income = person("earned", period) + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + + filer_earned_head_only = tax_unit.sum(earned_income * is_head) + filer_earned_spouse_only = tax_unit.sum(earned_income * is_spouse) + + head_only_branch = simulation.get_branch("head_only") + head_only_branch.set_input( + "filer_earned", period, filer_earned_head_only + ) + # Phase out with respect to individual earned income, instead of AGI. + head_only_branch.set_input( + "adjusted_gross_income", period, filer_earned_head_only + ) + head_eitc = head_only_branch.calculate("original_eitc", period) + + spouse_only_branch = simulation.get_branch("spouse_only") + spouse_only_branch.set_input( + "filer_earned", period, filer_earned_spouse_only + ) + spouse_only_branch.set_input( + "adjusted_gross_income", period, filer_earned_spouse_only + ) + spouse_eitc = spouse_only_branch.calculate("original_eitc", period) + + agi_limit = parameters( + period + ).gov.contrib.individual_eitc.agi_eitc_limit + + return (agi < agi_limit) * (head_eitc + spouse_eitc) + + class winship_eitc_reform(Reform): + def apply(self): + self.add_variable(original_eitc) + self.update_variable(earned_income_tax_credit) + + return winship_eitc_reform + + +winship_reform = create_eitc_winship_reform(None, None, bypass=True) diff --git a/fiscalsim_us/system.py b/fiscalsim_us/system.py index 95e9daa15..f10cc9118 100644 --- a/fiscalsim_us/system.py +++ b/fiscalsim_us/system.py @@ -1,86 +1,113 @@ -from pathlib import Path -from policyengine_core.taxbenefitsystems import TaxBenefitSystem -from fiscalsim_us.entities import * -from fiscalsim_us.parameters.gov.irs.uprating import ( - set_irs_uprating_parameter, -) -from policyengine_core.simulations import ( - Simulation as CoreSimulation, - Microsimulation as CoreMicrosimulation, - IndividualSim as CoreIndividualSim, -) -from fiscalsim_us.data import DATASETS, CPS_2023 -from fiscalsim_us.tools.taxcalc.generate_taxcalc_variable import ( - add_taxcalc_variable_aliases, -) -from fiscalsim_us.variables.household.demographic.geographic.state.in_state import ( - create_50_state_variables, -) -from fiscalsim_us.tools.parameters import backdate_parameters - -COUNTRY_DIR = Path(__file__).parent - - -class CountryTaxBenefitSystem(TaxBenefitSystem): - parameters_dir = COUNTRY_DIR / "parameters" - variables_dir = COUNTRY_DIR / "variables" - auto_carry_over_input_variables = True - basic_inputs = [ - "state_name", - "employment_income", - "age", - ] - modelled_policies = COUNTRY_DIR / "modelled_policies.yaml" - - def __init__(self): - # We initialize our tax and benefit system with the general constructor - super().__init__(entities) - - self.add_variables(*create_50_state_variables()) - - self.parameters = set_irs_uprating_parameter(self.parameters) - self.parameters = backdate_parameters(self.parameters) - - add_taxcalc_variable_aliases(self) - - -system = CountryTaxBenefitSystem() - - -class Simulation(CoreSimulation): - default_tax_benefit_system = CountryTaxBenefitSystem - default_tax_benefit_system_instance = system - default_role = "member" - default_calculation_period = 2022 - default_input_period = 2022 - datasets = DATASETS - - -class Microsimulation(CoreMicrosimulation): - default_tax_benefit_system = CountryTaxBenefitSystem - default_tax_benefit_system_instance = system - default_dataset = CPS_2023 - default_dataset_year = 2023 - default_role = "member" - default_calculation_period = 2023 - default_input_period = 2023 - datasets = DATASETS - - -class IndividualSim(CoreIndividualSim): # Deprecated - tax_benefit_system = CountryTaxBenefitSystem - entities = {entity.key: entity for entity in entities} - default_dataset = CPS_2023 - - default_roles = dict( - tax_unit="member", - spm_unit="member", - household="member", - family="member", - ) - required_entities = [ - "tax_unit", - "spm_unit", - "household", - "family", - ] +from pathlib import Path +from policyengine_core.taxbenefitsystems import TaxBenefitSystem +from fiscalsim_us.entities import * +from fiscalsim_us.parameters.gov.irs.uprating import ( + set_irs_uprating_parameter, +) +from policyengine_core.simulations import ( + Simulation as CoreSimulation, + Microsimulation as CoreMicrosimulation, + IndividualSim as CoreIndividualSim, +) +from fiscalsim_us.data import DATASETS, CPS_2023, EnhancedCPS_2023 +from fiscalsim_us.tools.taxcalc.generate_taxcalc_variable import ( + add_taxcalc_variable_aliases, +) +from fiscalsim_us.variables.household.demographic.geographic.state.in_state import ( + create_50_state_variables, +) +from fiscalsim_us.tools.parameters import backdate_parameters +from fiscalsim_us.reforms import create_structural_reforms_from_parameters + +from fiscalsim_us.reforms import create_structural_reforms_from_parameters + +COUNTRY_DIR = Path(__file__).parent + + +class CountryTaxBenefitSystem(TaxBenefitSystem): + parameters_dir = COUNTRY_DIR / "parameters" + variables_dir = COUNTRY_DIR / "variables" + auto_carry_over_input_variables = True + basic_inputs = [ + "state_name", + "employment_income", + "age", + ] + modelled_policies = COUNTRY_DIR / "modelled_policies.yaml" + + def __init__(self): + # We initialize our tax and benefit system with the general constructor + super().__init__(entities) + + reform = create_structural_reforms_from_parameters( + self.parameters, "2023-01-01" + ) + if reform is not None: + reform.apply(self) + + self.add_variables(*create_50_state_variables()) + + self.parameters = set_irs_uprating_parameter(self.parameters) + self.parameters = backdate_parameters(self.parameters) + + add_taxcalc_variable_aliases(self) + + +system = CountryTaxBenefitSystem() + + +class Simulation(CoreSimulation): + default_tax_benefit_system = CountryTaxBenefitSystem + default_tax_benefit_system_instance = system + default_role = "member" + default_calculation_period = 2022 + default_input_period = 2022 + datasets = DATASETS + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + reform = create_structural_reforms_from_parameters( + self.tax_benefit_system.parameters, "2023-01-01" + ) + if reform is not None: + self.apply_reform(reform) + + +class Microsimulation(CoreMicrosimulation): + default_tax_benefit_system = CountryTaxBenefitSystem + default_tax_benefit_system_instance = system + default_dataset = CPS_2023 + default_dataset_year = 2023 + default_role = "member" + default_calculation_period = 2023 + default_input_period = 2023 + datasets = DATASETS + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + reform = create_structural_reforms_from_parameters( + self.tax_benefit_system.parameters, "2023-01-01" + ) + if reform is not None: + self.apply_reform(reform) + + +class IndividualSim(CoreIndividualSim): # Deprecated + tax_benefit_system = CountryTaxBenefitSystem + entities = {entity.key: entity for entity in entities} + default_dataset = CPS_2023 + + default_roles = dict( + tax_unit="member", + spm_unit="member", + household="member", + family="member", + ) + required_entities = [ + "tax_unit", + "spm_unit", + "household", + "family", + ] diff --git a/fiscalsim_us/tests/microsimulation/test_microsim.py b/fiscalsim_us/tests/microsimulation/test_microsim.py index 2ec00aa8b..3ce5c857a 100644 --- a/fiscalsim_us/tests/microsimulation/test_microsim.py +++ b/fiscalsim_us/tests/microsimulation/test_microsim.py @@ -1,26 +1,13 @@ -import pytest - -# Temporarily suspending this test because it is failing on GitHub Actions. The -# failure has to do with the following traceback progression. -# 1. test_microsim.py::test_microsim_runs_cps calls the Microsimulation() class -# from fiscalsim_us/system.py -# 2. The Microsimulation() class from fiscalsim_us/system.py takes as an input -# a CoreMicrosimulation object defined in the Simulation() class of -# policyengine_core/simulations/simulation.py -# 3. The error is in line 134 of policyengine_core/simulations/simulation.py, -# which calls the Dataset method from policyengine_core/data/dataset.py -# 4. The error is in line 73 of policyengine_core/data/dataset.py which uses -# the download() method in lines 271 to 327. This code tries to download -# data with a token that we don't have. Although I don't know why it works -# on my machine. My guess is that we could store the correct datasets on a -# server of our choice and download those with a different URL using this -# same method. - - -@pytest.mark.skipif(True, reason="This test temporarily suspended.") def test_microsim_runs_cps(): + import numpy as np from fiscalsim_us import Microsimulation sim = Microsimulation() hnet = sim.calc("household_net_income") assert not hnet.isna().any(), "Some households have NaN net income." + hidecile = sim.calc("household_income_decile") + assert np.all(hidecile >= 1) and np.all(hidecile <= 10) + sidecile = sim.calc("spm_unit_income_decile") + assert np.all(sidecile >= 1) and np.all(sidecile <= 10) + idecile = sim.calc("income_decile") + assert np.all(idecile >= 1) and np.all(idecile <= 10) diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_allowances.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_allowances.yaml new file mode 100644 index 000000000..16dbf49e2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_allowances.yaml @@ -0,0 +1,23 @@ +- name: Positive head available income + period: 2023 + input: + pell_grant_dependent_other_allowances: 0 + pell_grant_head_available_income: 10_000 + output: + pell_grant_dependent_allowances: 7_040 + +- name: Negative head available income + period: 2023 + input: + pell_grant_dependent_other_allowances: 0 + pell_grant_head_available_income: -10_000 + output: + pell_grant_dependent_allowances: 17_040 + +- name: Other allowances + period: 2023 + input: + pell_grant_dependent_other_allowances: 5_000 + pell_grant_head_available_income: 0 + output: + pell_grant_dependent_allowances: 12_040 diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_contribution.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_contribution.yaml new file mode 100644 index 000000000..18c9b0afc --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_contribution.yaml @@ -0,0 +1,49 @@ +- name: Only assets + period: 2023 + input: + pell_grant_dependent_available_income: 0 + pell_grant_dependent_allowances: 0 + pell_grant_countable_assets: 500 + pell_grant_simplified_formula_applies: false + output: + pell_grant_dependent_contribution: 100 + +- name: Only assets, simplified_formula_applies formula + period: 2023 + input: + pell_grant_dependent_available_income: 0 + pell_grant_dependent_allowances: 0 + pell_grant_countable_assets: 500 + pell_grant_simplified_formula_applies: true + output: + pell_grant_dependent_contribution: 0 + +- name: Income and no allowances + period: 2023 + input: + pell_grant_dependent_available_income: 3_000 + pell_grant_dependent_allowances: 0 + pell_grant_countable_assets: 0 + pell_grant_simplified_formula_applies: false + output: + pell_grant_dependent_contribution: 1_500 + +- name: Income and some allowances + period: 2023 + input: + pell_grant_dependent_available_income: 5_000 + pell_grant_dependent_allowances: 3_000 + pell_grant_countable_assets: 0 + pell_grant_simplified_formula_applies: false + output: + pell_grant_dependent_contribution: 1_000 + +- name: Income, allowances, and assets + period: 2023 + input: + pell_grant_dependent_available_income: 7_000 + pell_grant_dependent_allowances: 5_000 + pell_grant_countable_assets: 10_000 + pell_grant_simplified_formula_applies: false + output: + pell_grant_dependent_contribution: 3_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependents_in_college.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependents_in_college.yaml new file mode 100644 index 000000000..d8da58c68 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/dependent/pell_grant_dependents_in_college.yaml @@ -0,0 +1,33 @@ +- name: No dependents + period: 2023 + input: + people: + head: + is_tax_unit_head: true + is_full_time_college_student: true + spouse: + is_tax_unit_spouse: true + is_full_time_college_student: true + output: + pell_grant_dependents_in_college: 0 + +- name: 3 dependents in college, 1 not in college + period: 2023 + input: + people: + head: + is_tax_unit_head: true + is_full_time_college_student: false + spouse: + is_tax_unit_spouse: true + is_full_time_college_student: false + child_1: + is_full_time_college_student: true + child_2: + is_full_time_college_student: true + child_3: + is_full_time_college_student: true + child_4: + is_full_time_college_student: false + output: + pell_grant_dependents_in_college: 3 diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_assets.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_assets.yaml new file mode 100644 index 000000000..ce7c0bd2a --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_assets.yaml @@ -0,0 +1,65 @@ +- name: Only one person in tax_unit + period: 2023 + input: + people: + head: + is_tax_unit_head: true + pell_grant_countable_assets: 1_000 + spouse: + is_tax_unit_spouse: true + pell_grant_countable_assets: 0 + child: + pell_grant_countable_assets: 0 + output: + pell_grant_head_assets: 1_000 + +- name: Head and Spouse + period: 2023 + input: + people: + head: + is_tax_unit_head: true + pell_grant_countable_assets: 500 + spouse: + is_tax_unit_spouse: true + pell_grant_countable_assets: 2_500 + output: + pell_grant_head_assets: 3_000 + +- name: Head, Spouse, and multiple children + period: 2023 + input: + people: + head: + is_tax_unit_head: true + pell_grant_countable_assets: 5_000 + spouse: + is_tax_unit_spouse: true + pell_grant_countable_assets: 100 + child_1: + pell_grant_countable_assets: 1_000 + child_2: + pell_grant_countable_assets: 10_000 + child_3: + pell_grant_countable_assets: 100 + child_4: + pell_grant_countable_assets: 3_000 + child_5: + pell_grant_countable_assets: 1_000 + output: + pell_grant_head_assets: 5_100 + +- name: No assets + period: 2023 + input: + people: + head: + is_tax_unit_head: true + pell_grant_countable_assets: 0 + spouse: + is_tax_unit_spouse: true + pell_grant_countable_assets: 0 + child_1: + pell_grant_countable_assets: 0 + output: + pell_grant_head_assets: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_available_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_available_income.yaml new file mode 100644 index 000000000..2611542d5 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_available_income.yaml @@ -0,0 +1,111 @@ +- name: Only assets + period: 2023 + input: + people: + head: + pell_grant_head_allowances: 0 + pell_grant_formula: A + pell_grant_simplified_formula_applies: false + tax_unit: + pell_grant_primary_income: 0 + pell_grant_head_assets: 500 + output: + pell_grant_head_available_income: 60 + +- name: Only assets, simplified + period: 2023 + input: + people: + head: + pell_grant_head_allowances: 0 + pell_grant_formula: A + pell_grant_simplified_formula_applies: true + tax_unit: + pell_grant_primary_income: 0 + pell_grant_head_assets: 500 + output: + pell_grant_head_available_income: 0 + +- name: Income and no allowances + period: 2023 + input: + people: + head: + pell_grant_head_allowances: 0 + pell_grant_formula: A + pell_grant_simplified_formula_applies: false + tax_unit: + pell_grant_primary_income: 40_000 + pell_grant_head_assets: 0 + output: + pell_grant_head_available_income: 40_000 + +- name: Income and some allowances + period: 2023 + input: + people: + head: + pell_grant_head_allowances: 5_000 + pell_grant_formula: A + pell_grant_simplified_formula_applies: false + tax_unit: + pell_grant_primary_income: 20_000 + pell_grant_head_assets: 0 + output: + pell_grant_head_available_income: 15_000 + +- name: Income, some allowances, and assets + period: 2023 + input: + people: + head: + pell_grant_head_allowances: 10_000 + pell_grant_formula: A + pell_grant_simplified_formula_applies: false + tax_unit: + pell_grant_primary_income: 30_000 + pell_grant_head_assets: 50_000 + output: + pell_grant_head_available_income: 26_000 + +- name: Negative head contribution + period: 2023 + input: + people: + head: + pell_grant_head_allowances: 100_000 + pell_grant_formula: A + pell_grant_simplified_formula_applies: false + tax_unit: + pell_grant_primary_income: 0 + pell_grant_head_assets: 0 + output: + pell_grant_head_available_income: -100_000 + +- name: Only assets, formula B + period: 2023 + input: + people: + head: + pell_grant_head_allowances: 0 + pell_grant_formula: B + pell_grant_simplified_formula_applies: false + tax_unit: + pell_grant_primary_income: 0 + pell_grant_head_assets: 1_000 + output: + pell_grant_head_available_income: 200 + +- name: Only assets, formula C + period: 2023 + input: + people: + head: + pell_grant_head_allowances: 0 + pell_grant_formula: C + pell_grant_simplified_formula_applies: false + tax_unit: + pell_grant_primary_income: 0 + pell_grant_head_assets: 1_000 + output: + pell_grant_head_available_income: 70 diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_contribution.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_contribution.yaml new file mode 100644 index 000000000..ac2318050 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/head/pell_grant_head_contribution.yaml @@ -0,0 +1,44 @@ +- name: Has income + period: 2023 + input: + pell_grant_head_available_income: 40_000 + pell_grant_dependents_in_college: 1 + pell_grant_formula: A + output: + pell_grant_head_contribution: 11_725 + +- name: Has no income + period: 2023 + input: + pell_grant_head_available_income: 0 + pell_grant_dependents_in_college: 1 + pell_grant_formula: A + output: + pell_grant_head_contribution: 0 + +- name: Multiple dependents in college + period: 2023 + input: + pell_grant_head_available_income: 26_000 + pell_grant_dependents_in_college: 2 + pell_grant_formula: A + output: + pell_grant_head_contribution: 3067.5 + +- name: Negative head contribution + period: 2023 + input: + pell_grant_head_available_income: -100_000 + pell_grant_dependents_in_college: 1 + pell_grant_formula: A + output: + pell_grant_head_contribution: -750 + +- name: Has income formula B + period: 2023 + input: + pell_grant_head_available_income: 30_000 + pell_grant_dependents_in_college: 1 + pell_grant_formula: B + output: + pell_grant_head_contribution: 30_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_efc.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_efc.yaml new file mode 100644 index 000000000..90fa0d35c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_efc.yaml @@ -0,0 +1,79 @@ +- name: Automatic 0 EFC + period: 2023 + input: + pell_grant_primary_income: 10_000 + pell_grant_head_contribution: 2_000 + pell_grant_dependent_contribution: 10_000 + pell_grant_formula: A + output: + pell_grant_efc: 0 + +- name: No head contribution + period: 2023 + input: + pell_grant_primary_income: 30_000 + pell_grant_head_contribution: 0 + pell_grant_dependent_contribution: 10_000 + pell_grant_formula: A + output: + pell_grant_efc: 10_000 + +- name: No dependent contribution + period: 2023 + input: + pell_grant_primary_income: 50_000 + pell_grant_head_contribution: 12_000 + pell_grant_dependent_contribution: 0 + pell_grant_formula: A + output: + pell_grant_efc: 12_000 + +- name: Both head and dependent contributions + period: 2023 + input: + pell_grant_primary_income: 70_000 + pell_grant_head_contribution: 20_000 + pell_grant_dependent_contribution: 10_000 + pell_grant_formula: A + output: + pell_grant_efc: 30_000 + +- name: No automatic 0 for formula B + period: 2023 + input: + pell_grant_primary_income: 10_000 + pell_grant_head_contribution: 2_000 + pell_grant_dependent_contribution: 0 + pell_grant_formula: B + output: + pell_grant_efc: 2_000 + +- name: No contribution for formula B + period: 2023 + input: + pell_grant_primary_income: 30_000 + pell_grant_head_contribution: 0 + pell_grant_dependent_contribution: 0 + pell_grant_formula: B + output: + pell_grant_efc: 0 + +- name: Automatic 0 for formula C + period: 2023 + input: + pell_grant_primary_income: 10_000 + pell_grant_head_contribution: 2_000 + pell_grant_dependent_contribution: 0 + pell_grant_formula: C + output: + pell_grant_efc: 0 + +- name: Some contribution for formula C + period: 2023 + input: + pell_grant_primary_income: 30_000 + pell_grant_head_contribution: 1_000 + pell_grant_dependent_contribution: 0 + pell_grant_formula: C + output: + pell_grant_efc: 1_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_formula.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_formula.yaml new file mode 100644 index 000000000..8d193ff4e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_formula.yaml @@ -0,0 +1,35 @@ +- name: Is head no dependents + period: 2023 + input: + people: + person: + is_tax_unit_head: true + is_tax_unit_spouse: false + tax_unit: + tax_unit_dependents: 0 + output: + pell_grant_formula: B + +- name: Is spouse 1 dependent + period: 2023 + input: + people: + person: + is_tax_unit_head: false + is_tax_unit_spouse: true + tax_unit: + tax_unit_dependents: 1 + output: + pell_grant_formula: C + +- name: Is dependent + period: 2023 + input: + people: + person: + is_tax_unit_head: false + is_tax_unit_spouse: false + tax_unit: + tax_unit_dependents: 1 + output: + pell_grant_formula: A diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.yaml new file mode 100644 index 000000000..2d3efffdf --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.yaml @@ -0,0 +1,155 @@ +- name: No benefits + period: 2023 + input: + people: + person: + medicaid: 0 + ssi: 0 + tax_unit: + pell_grant_primary_income: 49_999 + spm_unit: + snap: 0 + school_meal_net_subsidy: 0 + tanf: 0 + spm_unit_wic: 0 + output: + pell_grant_simplified_formula_applies: false + +- name: Has Medicaid + period: 2023 + input: + people: + person: + medicaid: 1 + ssi: 0 + tax_unit: + pell_grant_primary_income: 49_999 + spm_unit: + snap: 0 + school_meal_net_subsidy: 0 + tanf: 0 + spm_unit_wic: 0 + output: + pell_grant_simplified_formula_applies: true + +- name: Has SSI + period: 2023 + input: + people: + person: + medicaid: 0 + ssi: 1 + tax_unit: + pell_grant_primary_income: 49_999 + spm_unit: + snap: 0 + school_meal_net_subsidy: 0 + tanf: 0 + spm_unit_wic: 0 + output: + pell_grant_simplified_formula_applies: true + +- name: Has WIC + period: 2023 + input: + people: + person: + medicaid: 0 + ssi: 0 + tax_unit: + pell_grant_primary_income: 49_999 + spm_unit: + snap: 0 + school_meal_net_subsidy: 0 + tanf: 0 + spm_unit_wic: 1 + output: + pell_grant_simplified_formula_applies: true + +- name: Has SNAP + period: 2023 + input: + people: + person: + medicaid: 0 + ssi: 0 + tax_unit: + pell_grant_primary_income: 49_999 + spm_unit: + snap: 1 + school_meal_net_subsidy: 0 + tanf: 0 + spm_unit_wic: 0 + output: + pell_grant_simplified_formula_applies: true + +- name: Has Free School Lunch + period: 2023 + input: + people: + person: + medicaid: 0 + ssi: 0 + tax_unit: + pell_grant_primary_income: 49_999 + spm_unit: + snap: 0 + school_meal_net_subsidy: 1 + tanf: 0 + spm_unit_wic: 0 + output: + pell_grant_simplified_formula_applies: true + +- name: Has TANF + period: 2023 + input: + people: + person: + medicaid: 0 + ssi: 0 + tax_unit: + pell_grant_primary_income: 49_999 + spm_unit: + snap: 0 + school_meal_net_subsidy: 0 + tanf: 1 + spm_unit_wic: 0 + output: + pell_grant_simplified_formula_applies: true + +- name: Someone else has a benefit + period: 2023 + input: + people: + main: + medicaid: 0 + ssi: 0 + other: + medicaid: 1 + ssi: 0 + tax_unit: + pell_grant_primary_income: 49_999 + spm_unit: + snap: 0 + school_meal_net_subsidy: 0 + tanf: 0 + spm_unit_wic: 0 + output: + pell_grant_simplified_formula_applies: true + +- name: Too much income + period: 2023 + input: + people: + person: + medicaid: 1 + ssi: 1 + tax_unit: + pell_grant_primary_income: 50_000 + spm_unit: + snap: 1 + school_meal_net_subsidy: 0 + tanf: 1 + spm_unit_wic: 1 + output: + pell_grant_simplified_formula_applies: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant.yaml b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant.yaml new file mode 100644 index 000000000..3f4432321 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant.yaml @@ -0,0 +1,26 @@ +- name: Max Pell Grant + period: 2023 + input: + pell_grant_efc: 0 + cost_of_attending_college: 100_000 + pell_grant_months_in_school: 9 + output: + pell_grant: 7_395 + +- name: No Pell Grant + period: 2023 + input: + pell_grant_efc: 3_000 + cost_of_attending_college: 3_700 + pell_grant_months_in_school: 9 + output: + pell_grant: 0 + +- name: 5 months in school + period: 2023 + input: + pell_grant_efc: 2_000 + cost_of_attending_college: 5_000 + pell_grant_months_in_school: 6 + output: + pell_grant: 2000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/fcc/acp/integration.yaml b/fiscalsim_us/tests/policy/baseline/gov/fcc/acp/integration.yaml index efca01433..3c74d68c9 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/fcc/acp/integration.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/fcc/acp/integration.yaml @@ -1,7 +1,7 @@ - name: Previously-enrolled family with a Pell Grant and $100/mo broadband costs gets $50/mo period: 2022 input: - pell_grant: 100 + spm_unit_pell_grant: 100 broadband_cost_after_lifeline: 100 * 12 output: acp: 30 * 12 diff --git a/fiscalsim_us/tests/policy/baseline/gov/fcc/acp/is_acp_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/fcc/acp/is_acp_eligible.yaml index a4b22f027..6e893e3e9 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/fcc/acp/is_acp_eligible.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/fcc/acp/is_acp_eligible.yaml @@ -5,6 +5,7 @@ snap: 0 ebb: 0 medicaid: 0 + pell_grant: 0 fcc_fpg_ratio: 2.01 output: is_acp_eligible: false @@ -15,6 +16,7 @@ lifeline: 0 snap: 0 ebb: 0 + pell_grant: 0 fcc_fpg_ratio: 2 output: is_acp_eligible: true @@ -25,6 +27,7 @@ lifeline: 0 snap: 0 ebb: 0 + pell_grant: 0 fcc_fpg_ratio: 2.1 wic: 1 output: @@ -36,6 +39,7 @@ lifeline: 0 snap: 1 ebb: 0 + pell_grant: 0 fcc_fpg_ratio: 2.1 output: is_acp_eligible: true @@ -46,6 +50,18 @@ lifeline: 1 snap: 0 ebb: 0 + pell_grant: 0 + fcc_fpg_ratio: 2.1 + output: + is_acp_eligible: true + +- name: Family with Pell Grant is eligible if income is above 200% of FPG + period: 2022 + input: + lifeline: 0 + snap: 0 + ebb: 0 + pell_grant: 1 fcc_fpg_ratio: 2.1 output: is_acp_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/fcc/ebb/integration.yaml b/fiscalsim_us/tests/policy/baseline/gov/fcc/ebb/integration.yaml index e20bdffdc..051eadb09 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/fcc/ebb/integration.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/fcc/ebb/integration.yaml @@ -1,7 +1,7 @@ - name: Previously-enrolled family with a Pell Grant and $100/mo broadband costs gets $50/mo period: 2022 input: - pell_grant: 100 + spm_unit_pell_grant: 100 broadband_cost_after_lifeline: 100 * 12 enrolled_in_ebb: true output: @@ -10,7 +10,7 @@ - name: Not-previously-enrolled family with a Pell Grant and $100/mo broadband costs gets $0 period: 2022 input: - pell_grant: 100 + spm_unit_pell_grant: 100 broadband_cost_after_lifeline: 100 * 12 output: ebb: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/credits/cdcc/capped_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/credits/cdcc/capped_cdcc.yaml new file mode 100644 index 000000000..81e9c352a --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/credits/cdcc/capped_cdcc.yaml @@ -0,0 +1,35 @@ +- name: Uncapped CDCC below cap + period: 2018 + input: + cdcc: 500 + income_tax_before_credits: 501 + foreign_tax_credit: 0 + output: + capped_cdcc: 500 + +- name: Capped at the income tax before credits amount + period: 2018 + input: + cdcc: 2_000 + income_tax_before_credits: 501 + foreign_tax_credit: 0 + output: + capped_cdcc: 501 + +- name: Cap reduced by foreign tax credit amount + period: 2018 + input: + cdcc: 1_000 + income_tax_before_credits: 501 + foreign_tax_credit: 502 + output: + capped_cdcc: 0 + +- name: CDCC not capped in 2021 + period: 2021 + input: + cdcc: 1_000 + income_tax_before_credits: 501 + foreign_tax_credit: 0 + output: + capped_cdcc: 1_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_demographic_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_demographic_eligible.yaml new file mode 100644 index 000000000..d684838f9 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_demographic_eligible.yaml @@ -0,0 +1,25 @@ +- name: No children and under 25, not eligible. + period: 2022 + input: + age: 24 + output: + eitc_demographic_eligible: false +- name: No children and over 25, eligible. + period: 2022 + input: + age: 25 + output: + eitc_demographic_eligible: true +- name: Children and under 25, eligible. + period: 2022 + input: + people: + parent: + age: 24 + child: + age: 7 + tax_units: + tax_unit: + members: [parent, child] + output: + eitc_demographic_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_eligible.yaml index 84e0a9262..2f0c36d4e 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_eligible.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_eligible.yaml @@ -1,25 +1,26 @@ -- name: No children and under 25, not eligible. +- name: Investment income ineligible. period: 2022 input: - age: 24 + eitc_investment_income_eligible: false + eitc_demographic_eligible: true + filing_status: JOINT output: eitc_eligible: false -- name: No children and over 25, eligible. + +- name: Demographic ineligible. period: 2022 input: - age: 25 + eitc_investment_income_eligible: true + eitc_demographic_eligible: false + filing_status: JOINT output: - eitc_eligible: true -- name: Children and under 25, eligible. + eitc_eligible: false + +- name: Eligible. period: 2022 input: - people: - parent: - age: 24 - child: - age: 7 - tax_units: - tax_unit: - members: [parent, child] + eitc_investment_income_eligible: true + eitc_demographic_eligible: true + filing_status: JOINT output: eitc_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_investment_income_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_investment_income_eligible.yaml new file mode 100644 index 000000000..8dccbba0b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_investment_income_eligible.yaml @@ -0,0 +1,13 @@ +- name: Investment income ineligible in 2022. + period: 2022 + input: + eitc_relevant_investment_income: 10_301 + output: + eitc_investment_income_eligible: false + +- name: Investment income eligible in 2023. + period: 2023 + input: + eitc_relevant_investment_income: 11_000 + output: + eitc_investment_income_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income_person.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income_person.yaml new file mode 100644 index 000000000..dc8b705e5 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income_person.yaml @@ -0,0 +1,109 @@ +- name: adjusted_gross_income_person unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + employment_income: 200_000 + person2: + is_tax_unit_spouse: true + employment_income: 100_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + output: + adjusted_gross_income: 300_000 + adjusted_gross_income_person: [200_000, 100_000, 0] + +- name: adjusted_gross_income_person unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + employment_income: 200_000 + person2: + is_tax_unit_spouse: true + employment_income: 100_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + puerto_rico_income: 6_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + output: + adjusted_gross_income: 300_000 - 6_000 + adjusted_gross_income_person: [197_000, 97_000, 0] + +- name: adjusted_gross_income_person unit test 3 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + employment_income: 60_000 + self_employment_income: -10_000 + person2: + is_tax_unit_spouse: true + employment_income: 40_000 + self_employment_income: 0 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + output: + adjusted_gross_income: 90_000 + # self-employment loss is shared evenly by the head and spouse + adjusted_gross_income_person: [55_000, 35_000, 0] + +- name: adjusted_gross_income_person unit test 4 + absolute_error_margin: 0.01 + period: 2021 + input: + gov.contrib.ubi_center.basic_income.taxable: true + people: + person1: + is_tax_unit_head: true + employment_income: 200_000 + person2: + is_tax_unit_spouse: true + employment_income: 100_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + basic_income: 800 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + output: + adjusted_gross_income: 300_800 + adjusted_gross_income_person: [200_400, 100_400, 0] diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/integration/capital_gains_losses.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/integration/capital_gains_losses.yaml new file mode 100644 index 000000000..cd68dae1f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/integration/capital_gains_losses.yaml @@ -0,0 +1,55 @@ +- name: integration test 1 + absolute_error_margin: 0.01 + period: 2018 + input: + people: + person1: + is_tax_unit_head: true + age: 40 + employment_income: 100_000 + short_term_capital_gains: -5_000 + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX # no state income tax + output: # from online TAXSIM35 06/29/23 version + capital_gains: -5_000 + capital_losses: 5_000 + limited_capital_loss: 3_000 + adjusted_gross_income: 97_000 + income_tax: 14_689.50 + +- name: integration test 2 + absolute_error_margin: 0.01 + period: 2018 + input: + people: + person1: + is_tax_unit_head: true + age: 40 + employment_income: 100_000 + qualified_dividend_income: 10_000 + short_term_capital_gains: -5_000 + long_term_capital_gains: 1_000 + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX # no state income tax + output: # from online TAXSIM35 06/29/23 version + capital_gains: -4_000 + capital_losses: 4_000 + limited_capital_loss: 3_000 + adjusted_gross_income: 107_000 + income_tax: 16_189.50 diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/irs_gross_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/irs_gross_income.yaml index 3acacb8aa..3c62d803e 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/irs/irs_gross_income.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/irs_gross_income.yaml @@ -14,7 +14,7 @@ input: people: person1: - is_tax_unit_head: 1 + is_tax_unit_head: true is_tax_unit_spouse: 0 is_tax_unit_dependent: 0 age: 70 diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/tax/federal_income/capped_property_taxes.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/tax/federal_income/capped_property_taxes.yaml new file mode 100644 index 000000000..9207514df --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/tax/federal_income/capped_property_taxes.yaml @@ -0,0 +1,15 @@ +- name: capped_property_taxes unit test 1 + period: 2020 + input: + filing_status: JOINT + real_estate_taxes: 4_000 + output: + capped_property_taxes: 4_000 + +- name: capped_property_taxes unit test 2 + period: 2022 + input: + filing_status: JOINT + real_estate_taxes: 14_000 + output: + capped_property_taxes: 10_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/tax/federal_income/itemized_deductions_less_salt.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/tax/federal_income/itemized_deductions_less_salt.yaml new file mode 100644 index 000000000..555c2dede --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/tax/federal_income/itemized_deductions_less_salt.yaml @@ -0,0 +1,10 @@ +- name: itemized_deductions_less_salt unit test 1 + period: 2020 + input: + charitable_deduction: 1 + interest_deduction: 10 + salt_deduction: 100 + medical_expense_deduction: 1_000 + casualty_loss_deduction: 10_000 + output: + itemized_deductions_less_salt: 11_011 diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/tax/no_salt_income_tax.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/tax/no_salt_income_tax.yaml deleted file mode 100644 index cc61fda1b..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/irs/tax/no_salt_income_tax.yaml +++ /dev/null @@ -1,6 +0,0 @@ -- name: Some State tax liability, calculation finishes - period: 2022 - input: - state_income_tax: 1_000 - output: - no_salt_income_tax: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/ssa/ss/never_eligible_for_social_security_benefits.yaml b/fiscalsim_us/tests/policy/baseline/gov/ssa/ss/never_eligible_for_social_security_benefits.yaml new file mode 100644 index 000000000..06d0e7d76 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/ssa/ss/never_eligible_for_social_security_benefits.yaml @@ -0,0 +1,23 @@ +- name: If below 70, can't assume never eligible for social security benefits. + period: 2022 + input: + age: 69 + social_security: 0 + output: + never_eligible_for_social_security_benefits: false + +- name: If has social security income, then already eligible. + period: 2022 + input: + age: 70 + social_security: 1 + output: + never_eligible_for_social_security_benefits: false + +- name: If 70 and no social security income, then assume never eligible. + period: 2022 + input: + age: 70 + social_security: 0 + output: + never_eligible_for_social_security_benefits: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/ar_income_tax_before_non_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/ar_income_tax_before_non_refundable_credits.yaml new file mode 100644 index 000000000..57bbc34b7 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/ar_income_tax_before_non_refundable_credits.yaml @@ -0,0 +1,49 @@ +- name: AR income tax rates - taxable income not exceeding $5100 + period: 2022 + absolute_error_margin: 1 + input: + ar_taxable_income: 5_100 + state_code: AR + output: + #round(5_100 * 0.00) + ar_income_tax_before_non_refundable_credits: 0 + +- name: AR income tax rates - taxable income from $5,101 to $10,300 + period: 2022 + absolute_error_margin: 1 + input: + ar_taxable_income: 10_000 + state_code: AR + output: + # (10_000-5_101) * 0.02 + ar_income_tax_before_non_refundable_credits: 98 + +- name: AR income tax rates - taxable income from $10,301 to $14,700 + period: 2022 + absolute_error_margin: 1 + input: + ar_taxable_income: 11_000 + state_code: AR + output: + # 104 + round((11_000 - 10_301)* 0.03) + ar_income_tax_before_non_refundable_credits: 125 + +- name: AR income tax rates - taxable income from $14,701 to $24,300 + period: 2022 + absolute_error_margin: 1 + input: + ar_taxable_income: 20_000 + state_code: AR + output: + # 236 + round((20_000 - 14_701)* 0.034) + ar_income_tax_before_non_refundable_credits: 416 + +- name: AR income tax rates - taxable income for income over $24,301 + period: 2022 + absolute_error_margin: 1 + input: + ar_taxable_income: 25_000 + state_code: AR + output: + # 562.366 + round((25_000-24_301) * 0.049) = 596 + ar_income_tax_before_non_refundable_credits: 596 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/ar_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/ar_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..1bc37e2bb --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/ar_income_tax_before_refundable_credits.yaml @@ -0,0 +1,17 @@ +- name: Calculation + period: 2022 + input: + state_code: AR + ar_income_tax_before_non_refundable_credits: 2_000 + ar_non_refundable_credits: 500 + output: + ar_income_tax_before_refundable_credits: 1500 + +- name: Capped at 0 + period: 2022 + input: + state_code: AR + ar_income_tax_before_non_refundable_credits: 200 + ar_non_refundable_credits: 500 + output: + ar_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/credits/ar_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/credits/ar_cdcc.yaml new file mode 100644 index 000000000..77093f647 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/credits/ar_cdcc.yaml @@ -0,0 +1,15 @@ +- name: No cdcc + period: 2022 + input: + cdcc: 0 + state_code: AR + output: + ar_cdcc: 0 + +- name: Some cdcc, 20% + period: 2022 + input: + cdcc: 1_000 + state_code: AR + output: + ar_cdcc: 200 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/credits/ar_inflationary_relief_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/credits/ar_inflationary_relief_tax_credit.yaml new file mode 100644 index 000000000..55d4dd2df --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/credits/ar_inflationary_relief_tax_credit.yaml @@ -0,0 +1,44 @@ +- name: Single household with $101,002 taxable income + period: 2022 + input: + state_code: AR + ar_taxable_income: 101_002 + filing_status: SINGLE + output: + ar_inflation_relief_credit: 0 + +- name: Separate household with $100,000 taxable income + period: 2022 + input: + state_code: AR + ar_taxable_income: 100_000 + filing_status: SEPARATE + output: + ar_inflation_relief_credit: 20 + +- name: Head of household with $98,200 taxable income + period: 2022 + input: + state_code: AR + ar_taxable_income: 98_200 + filing_status: HEAD_OF_HOUSEHOLD + output: + ar_inflation_relief_credit: 30 + +- name: Joint household with $175,000 taxable income + period: 2022 + input: + state_code: AR + ar_taxable_income: 175_000 + filing_status: JOINT + output: + ar_inflation_relief_credit: 280 + +- name: Widow household with $80,000 taxable income + period: 2022 + input: + state_code: AR + ar_taxable_income: 80_000 + filing_status: WIDOW + output: + ar_inflation_relief_credit: 150 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/deductions/ar_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/deductions/ar_standard_deduction.yaml new file mode 100644 index 000000000..2ec90ae33 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ar/tax/income/deductions/ar_standard_deduction.yaml @@ -0,0 +1,40 @@ +- name: AR Standard deduction if single filer + period: 2022 + input: + filing_status: SINGLE + state_code: AR + output: + ar_standard_deduction: 2_270 + +- name: AR Standard deduction if married filing jointly + period: 2022 + input: + filing_status: JOINT + state_code: AR + output: + ar_standard_deduction: 4_540 + +- name: AR Standard deduction if surviving spouse + period: 2022 + input: + filing_status: WIDOW + state_code: AR + output: + ar_standard_deduction: 2_270 + +- name: AR Standard deduction if married filing separately + period: 2022 + input: + filing_status: SEPARATE + state_code: AR + output: + ar_standard_deduction: 2_270 + +- name: AR Standard deduction if head of household + period: 2022 + input: + filing_status: HEAD_OF_HOUSEHOLD + state_code: AR + output: + ar_standard_deduction: 2_270 + diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.yaml new file mode 100644 index 000000000..4d225c1b5 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.yaml @@ -0,0 +1,44 @@ +- name: Single filer no income + period: 2023 + input: + state_code: AZ + filing_status: SINGLE + az_taxable_income: 0 + output: + az_income_tax_before_non_refundable_credits: 0 + +- name: Joint calculation + period: 2023 + input: + state_code: AZ + filing_status: JOINT + az_taxable_income: 60_000 + output: + az_income_tax_before_non_refundable_credits: 1541.5885 + +- name: Joint calculation 2019 + period: 2019 + input: + state_code: AZ + filing_status: JOINT + az_taxable_income: 60_000 + output: + az_income_tax_before_non_refundable_credits: 1606.5 + +- name: Separate calculation + period: 2023 + input: + state_code: AZ + filing_status: SEPARATE + az_taxable_income: 30_000 + output: + az_income_tax_before_non_refundable_credits: 770.7921 + +- name: Head of Household calculation + period: 2023 + input: + state_code: AZ + filing_status: HEAD_OF_HOUSEHOLD + az_taxable_income: 70_000 + output: + az_income_tax_before_non_refundable_credits: 1839.5885 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/az_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/az_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..c42f37372 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/az_income_tax_before_refundable_credits.yaml @@ -0,0 +1,17 @@ +- name: Calculation + period: 2023 + input: + state_code: AZ + az_income_tax_before_non_refundable_credits: 2_000 + az_non_refundable_credits: 500 + output: + az_income_tax_before_refundable_credits: 1_500 + +- name: Capped at 0 + period: 2023 + input: + state_code: AZ + az_income_tax_before_non_refundable_credits: 200 + az_non_refundable_credits: 500 + output: + az_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_family_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_family_tax_credit.yaml new file mode 100644 index 000000000..4aae6666e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_family_tax_credit.yaml @@ -0,0 +1,59 @@ +- name: Family tax credits for joint filers with 5 dependents ($30000 income) + period: 2023 + input: + state_code: AZ + filing_status: JOINT + az_family_tax_credit_eligible: true + tax_unit_size: 7 + output: + az_family_tax_credit: 240 + +- name: Family tax credits for single filers without dependents ($9000 income) + period: 2023 + input: + state_code: AZ + filing_status: SINGLE + az_family_tax_credit_eligible: true + tax_unit_size: 1 + output: + az_family_tax_credit: 40 + +- name: Family tax credits for separate couple with 2 dependents ($11000 income) + period: 2023 + input: + state_code: AZ + filing_status: SEPARATE + az_family_tax_credit_eligible: false + tax_unit_size: 4 + output: + az_family_tax_credit: 0 + +- name: Family tax credits for head of household with 5 dependents ($26000 income) + period: 2023 + input: + state_code: AZ + filing_status: HEAD_OF_HOUSEHOLD + az_family_tax_credit_eligible: true + tax_unit_size: 6 + output: + az_family_tax_credit: 240 + +- name: Family tax credits for widow with 3 dependents ($23000 income) + period: 2023 + input: + state_code: AZ + filing_status: WIDOW + az_family_tax_credit_eligible: true + tax_unit_size: 4 + output: + az_family_tax_credit: 160 + +- name: Family tax credits for head of household with 5 dependents (no income) + period: 2023 + input: + state_code: AZ + filing_status: HEAD_OF_HOUSEHOLD + az_family_tax_credit_eligible: true + tax_unit_size: 6 + output: + az_family_tax_credit: 240 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_family_tax_credit_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_family_tax_credit_eligible.yaml new file mode 100644 index 000000000..1d5340ecb --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_family_tax_credit_eligible.yaml @@ -0,0 +1,59 @@ +- name: Family tax credits for joint filers with 5 dependents ($30000 income) + period: 2023 + input: + state_code: AZ + filing_status: JOINT + az_agi: 30_000 + tax_unit_dependents: 5 + output: + az_family_tax_credit_eligible: true + +- name: Family tax credits for single filers without dependents ($9000 income) + period: 2023 + input: + state_code: AZ + filing_status: SINGLE + az_agi: 9_000 + tax_unit_dependents: 0 + output: + az_family_tax_credit_eligible: true + +- name: Family tax credits for separate couple with 2 dependents ($11000 income) + period: 2023 + input: + state_code: AZ + filing_status: SEPARATE + az_agi: 11_000 + tax_unit_dependents: 2 + output: + az_family_tax_credit_eligible: false + +- name: Family tax credits for head of household with 5 dependents ($26000 income) + period: 2023 + input: + state_code: AZ + filing_status: HEAD_OF_HOUSEHOLD + az_agi: 26_000 + tax_unit_dependents: 5 + output: + az_family_tax_credit_eligible: true + +- name: Family tax credits for widow with 3 dependents ($23000 income) + period: 2023 + input: + state_code: AZ + filing_status: WIDOW + az_agi: 23_000 + tax_unit_dependents: 3 + output: + az_family_tax_credit_eligible: true + +- name: Family tax credits for head of household with 5 dependents (no income) + period: 2023 + input: + state_code: AZ + filing_status: HEAD_OF_HOUSEHOLD + az_agi: 0 + tax_unit_dependents: 5 + output: + az_family_tax_credit_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_increased_excise_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_increased_excise_tax_credit.yaml new file mode 100644 index 000000000..e2e936b8e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_increased_excise_tax_credit.yaml @@ -0,0 +1,71 @@ +- name: Eligible 4-person tax unit gets $100 for AZ increased excise credit + period: 2023 + input: + az_increased_excise_tax_credit_eligible: True + tax_unit_size: 4 + output: + az_increased_excise_tax_credit: 100 + +- name: Eligible 3-person tax unit gets $75 for AZ increased excise credit + period: 2023 + input: + az_increased_excise_tax_credit_eligible: True + tax_unit_size: 3 + output: + az_increased_excise_tax_credit: 75 + +- name: Eligible 2-person tax unit gets $50 for AZ increased excise credit + period: 2023 + input: + az_increased_excise_tax_credit_eligible: True + tax_unit_size: 2 + output: + az_increased_excise_tax_credit: 50 + +- name: Eligible 1-person tax unit gets $25 for AZ increased excise credit + period: 2023 + input: + az_increased_excise_tax_credit_eligible: True + tax_unit_size: 1 + output: + az_increased_excise_tax_credit: 25 + +- name: Ineligible 4-person tax unit gets $0 for AZ increased excise credit + period: 2023 + input: + az_increased_excise_tax_credit_eligible: False + tax_unit_size: 4 + output: + az_increased_excise_tax_credit: 0 + +- name: Ineligible 3-person tax unit gets $0 for AZ increased excise credit + period: 2023 + input: + az_increased_excise_tax_credit_eligible: False + tax_unit_size: 3 + output: + az_increased_excise_tax_credit: 0 + +- name: Ineligible 2-person tax unit gets $0 for AZ increased excise credit + period: 2023 + input: + az_increased_excise_tax_credit_eligible: False + tax_unit_size: 2 + output: + az_increased_excise_tax_credit: 0 + +- name: Ineligible 1-person tax unit gets $0 for AZ increased excise credit + period: 2023 + input: + az_increased_excise_tax_credit_eligible: False + tax_unit_size: 1 + output: + az_increased_excise_tax_credit: 0 + +- name: Eligible 5-person tax unit gets $100 for AZ increased excise credit + period: 2023 + input: + az_increased_excise_tax_credit_eligible: True + tax_unit_size: 5 + output: + az_increased_excise_tax_credit: 100 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_increased_excise_tax_credit_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_increased_excise_tax_credit_eligible.yaml new file mode 100644 index 000000000..74cc8ca75 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/az_increased_excise_tax_credit_eligible.yaml @@ -0,0 +1,89 @@ +- name: HEAD OF HOUSEHOLD with $25,000 agi is eligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: HEAD_OF_HOUSEHOLD + adjusted_gross_income: 25_000 + output: + az_increased_excise_tax_credit_eligible: True + +- name: HEAD OF HOUSEHOLD with $25,001 agi is ineligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: HEAD_OF_HOUSEHOLD + adjusted_gross_income: 25_001 + output: + az_increased_excise_tax_credit_eligible: False + +- name: JOINT with $25,001 agi is ineligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: JOINT + adjusted_gross_income: 25_001 + output: + az_increased_excise_tax_credit_eligible: False + +- name: JOINT with $25,000 agi is eligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: JOINT + adjusted_gross_income: 25_000 + output: + az_increased_excise_tax_credit_eligible: True + +- name: SINGLE with $12,500 agi is eligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: SINGLE + adjusted_gross_income: 12_500 + output: + az_increased_excise_tax_credit_eligible: True + +- name: SINGLE with $12,501 agi is ineligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: SINGLE + adjusted_gross_income: 12_501 + output: + az_increased_excise_tax_credit_eligible: False + +- name: SEPARATE with $12,500 agi is eligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: SEPARATE + adjusted_gross_income: 12_500 + output: + az_increased_excise_tax_credit_eligible: True + +- name: SEPARATE with $12,501 agi is ineligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: SEPARATE + adjusted_gross_income: 12_501 + output: + az_increased_excise_tax_credit_eligible: False + +- name: WIDOW with $25,000 agi is eligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: WIDOW + adjusted_gross_income: 25_000 + output: + az_increased_excise_tax_credit_eligible: True + +- name: WIDOW with $25,001 agi is ineligible for AZ increased excise tax credit + period: 2023 + input: + state_code: AZ + filing_status: WIDOW + adjusted_gross_income: 25_001 + output: + az_increased_excise_tax_credit_eligible: False diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_credit.yaml new file mode 100644 index 000000000..19be0eb57 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_credit.yaml @@ -0,0 +1,80 @@ +- name: az_charitable_contributions_credit for qualifying forster (Not SEPARATE, above cap) + period: 2023 + input: + state_code: AZ + filing_status: HEAD_OF_HOUSEHOLD + az_charitable_contributions_to_qualifying_charitable_organizations: 2_000 #800 + az_charitable_contributions_to_qualifying_foster_care_organizations: 1_100 #1000 + output: + az_charitable_contributions_credit: 1_800 + +- name: az_charitable_contributions_credit for qualifying forster (Not SEPARATE, below cap) + period: 2023 + input: + state_code: AZ + filing_status: JOINT + az_charitable_contributions_to_qualifying_charitable_organizations: 200 + az_charitable_contributions_to_qualifying_foster_care_organizations: 300 + output: + az_charitable_contributions_credit: 500 + +- name: az_charitable_contributions_credit for qualifying forster (Not SEPARATE, one below cap, one under cap) + period: 2023 + input: + state_code: AZ + filing_status: JOINT + az_charitable_contributions_to_qualifying_charitable_organizations: 1_000 + az_charitable_contributions_to_qualifying_foster_care_organizations: 500 + output: + az_charitable_contributions_credit: 1_300 + +- name: az_charitable_contributions_credit for qualifying forster (Not SEPARATE, one below cap, one under cap) + period: 2023 + input: + state_code: AZ + filing_status: SINGLE + az_charitable_contributions_to_qualifying_charitable_organizations: 700 + az_charitable_contributions_to_qualifying_foster_care_organizations: 1_100 + output: + az_charitable_contributions_credit: 1_700 + +- name: az_charitable_contributions_credit for qualifying forster (SEPARATE, below cap) + period: 2023 + input: + state_code: AZ + filing_status: SEPARATE + az_charitable_contributions_to_qualifying_charitable_organizations: 200 + az_charitable_contributions_to_qualifying_foster_care_organizations: 300 + output: + az_charitable_contributions_credit: 500 + +- name: az_charitable_contributions_credit for qualifying forster (SEPARATE, above cap) + period: 2023 + input: + state_code: AZ + filing_status: SEPARATE + az_charitable_contributions_to_qualifying_charitable_organizations: 600 + az_charitable_contributions_to_qualifying_foster_care_organizations: 600 + output: + az_charitable_contributions_credit: 900 + + +- name: az_charitable_contributions_credit for qualifying organization (SEPARATE, one above cap, one below cap) + period: 2023 + input: + state_code: AZ + filing_status: SEPARATE + az_charitable_contributions_to_qualifying_charitable_organizations: 300 + az_charitable_contributions_to_qualifying_foster_care_organizations: 600 + output: + az_charitable_contributions_credit: 800 + +- name: az_charitable_contributions_credit for qualifying organization (SEPARATE, one above cap, one below cap) + period: 2023 + input: + state_code: AZ + filing_status: SEPARATE + az_charitable_contributions_to_qualifying_charitable_organizations: 500 + az_charitable_contributions_to_qualifying_foster_care_organizations: 400 + output: + az_charitable_contributions_credit: 800 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/dependent_credit/az_dependent_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/dependent_credit/az_dependent_tax_credit.yaml new file mode 100644 index 000000000..82e20af76 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/credits/dependent_credit/az_dependent_tax_credit.yaml @@ -0,0 +1,170 @@ +- name: Household with no dependents + period: 2023 + input: + people: + person1: + is_tax_unit_dependent: false + age: 25 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 200_000 + filing_status: SINGLE + households: + household: + members: [person1] + state_code: AZ + output: + az_dependent_tax_credit: 0 + +- name: One young dependent without reduction + period: 2023 + input: + people: + person1: + is_tax_unit_dependent: true + age: 16 + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 200_000 + filing_status: SINGLE + households: + household: + members: [person1] + state_code: AZ + output: + az_dependent_tax_credit: 100 + + +- name: One young and one old dependent without reduction + period: 2023 + input: + people: + person1: + is_tax_unit_dependent: true + age: 16 + person2: + is_tax_unit_dependent: true + age: 17 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 200_000 + filing_status: SINGLE + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_dependent_tax_credit: 125 + +- name: One young and one old dependent with maximum reduction + period: 2023 + input: + people: + person1: + is_tax_unit_dependent: true + age: 16 + person2: + is_tax_unit_dependent: true + age: 17 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 220_000 + filing_status: SINGLE + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_dependent_tax_credit: 0 + +- name: One young and one old dependent with maximum reduction, capped at 0 + period: 2023 + input: + people: + person1: + is_tax_unit_dependent: true + age: 16 + person2: + is_tax_unit_dependent: true + age: 17 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 300_000 + filing_status: SINGLE + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_dependent_tax_credit: 0 + +- name: One young and one old dependent without reduction, joint + period: 2023 + input: + people: + person1: + is_tax_unit_dependent: true + age: 16 + person2: + is_tax_unit_dependent: true + age: 17 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 400_000 + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_dependent_tax_credit: 125 + +- name: Two old dependents without reduction, joint + period: 2023 + input: + people: + person1: + is_tax_unit_dependent: true + age: 17 + person2: + is_tax_unit_dependent: true + age: 17 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 202_000 + filing_status: SINGLE + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_dependent_tax_credit: 45 + +- name: Two old dependents without reduction, joint + period: 2023 + input: + people: + person1: + is_tax_unit_dependent: true + age: 17 + person2: + is_tax_unit_dependent: true + age: 17 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 202_000 + filing_status: SINGLE + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_dependent_tax_credit: 45 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/itemized/az_itemized_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/itemized/az_itemized_deductions.yaml new file mode 100644 index 000000000..4c3b88606 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/itemized/az_itemized_deductions.yaml @@ -0,0 +1,91 @@ +- name: when az_charitable_contributions_credit==0 + absolute_error_margin: 0.01 + period: 2022 + input: + state_code: AZ + interest_deduction: 100 + casualty_loss_deduction: 200 + medical_expense: 500 + medical_expense_deduction: 400 + charitable_deduction: 500 + az_charitable_contributions_credit: 0 + real_estate_taxes: 600 + output: + az_itemized_deductions: 1_500 + +- name: when az_charitable_contributions_credit!=0 + absolute_error_margin: 0.01 + period: 2022 + input: + state_code: AZ + interest_deduction: 100 + casualty_loss_deduction: 200 + medical_expense: 700 + medical_expense_deduction: 600 + charitable_deduction: 500 + az_charitable_contributions_credit: 500 + real_estate_taxes: 600 + output: + az_itemized_deductions: 1_000 + +- name: medical_expense > medical_expense_deduction, charitable_deduction < az_charitable_contributions_credit + absolute_error_margin: 0.01 + period: 2022 + input: + state_code: AZ + interest_deduction: 200 + casualty_loss_deduction: 300 + medical_expense: 600 + medical_expense_deduction: 0 + charitable_deduction: 500 + az_charitable_contributions_credit: 600 + real_estate_taxes: 600 + output: + az_itemized_deductions: 1_700 + + +- name: medical_expense > medical_expense_deduction, charitable_deduction > az_charitable_contributions_credit + absolute_error_margin: 0.01 + period: 2022 + input: + state_code: AZ + interest_deduction: 200 + casualty_loss_deduction: 300 + medical_expense: 700 + medical_expense_deduction: 600 + charitable_deduction: 700 + az_charitable_contributions_credit: 600 + real_estate_taxes: 0 + output: + az_itemized_deductions: 700 + + +- name: medical_expense >= medical_expense_deduction, charitable_deduction > az_charitable_contributions_credit + absolute_error_margin: 0.01 + period: 2022 + input: + state_code: AZ + interest_deduction: 200 + casualty_loss_deduction: 300 + medical_expense: 600 + medical_expense_deduction: 600 + charitable_deduction: 700 + az_charitable_contributions_credit: 600 + real_estate_taxes: 0 + output: + az_itemized_deductions: 600 + +- name: medical_expense > medical_expense_deduction, charitable_deduction < az_charitable_contributions_credit + absolute_error_margin: 0.01 + period: 2022 + input: + state_code: AZ + interest_deduction: 200 + casualty_loss_deduction: 300 + medical_expense: 600 + medical_expense_deduction: 600 + charitable_deduction: 700 + az_charitable_contributions_credit: 800 + real_estate_taxes: 0 + output: + az_itemized_deductions: 500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_base_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_base_standard_deduction.yaml new file mode 100644 index 000000000..2e334356c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_base_standard_deduction.yaml @@ -0,0 +1,31 @@ +- name: Single filer 2022 + period: 2022 + input: + state_code: AZ + filing_status: SINGLE + output: + az_base_standard_deduction: 12_950 + +- name: Joint filer 2022 + period: 2022 + input: + state_code: AZ + filing_status: JOINT + output: + az_base_standard_deduction: 25_900 + +- name: Joint filer 2021 + period: 2021 + input: + state_code: AZ + filing_status: JOINT + output: + az_base_standard_deduction: 25_100 + +- name: Widow filer 2021 + period: 2021 + input: + state_code: AZ + filing_status: WIDOW + output: + az_base_standard_deduction: 25_100 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_increased_standard_deduction_for_charitable_contributions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_increased_standard_deduction_for_charitable_contributions.yaml new file mode 100644 index 000000000..d1759c4f1 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_increased_standard_deduction_for_charitable_contributions.yaml @@ -0,0 +1,17 @@ +- name: test for 2021 + period: 2021 + input: + state_code: AZ + charitable_deduction: 2_000 + az_charitable_contributions_credit: 1_000 + output: + az_increased_standard_deduction_for_charitable_contributions: 250 + +- name: test for 2022 + period: 2022 + input: + state_code: AZ + charitable_deduction: 1_000 + az_charitable_contributions_credit: 500 + output: + az_increased_standard_deduction_for_charitable_contributions: 135 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_standard_deduction.yaml deleted file mode 100644 index 642932979..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/deductions/standard/az_standard_deduction.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- name: Single filer - period: 2022 - input: - state_code: AZ - filing_status: SINGLE - output: - az_standard_deduction: 12_950 - -- name: Joint filer - period: 2022 - input: - state_code: AZ - filing_status: JOINT - output: - az_standard_deduction: 25_900 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/subtractions/az_public_pension_exclusion.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/subtractions/az_public_pension_exclusion.yaml new file mode 100644 index 000000000..0af4393b7 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/subtractions/az_public_pension_exclusion.yaml @@ -0,0 +1,98 @@ +- name: AZ pension exclusion amount unit test1 (Joint, below maximum) + period: 2023 + input: + people: + person1: + is_tax_unit_head: true + taxable_public_pension_income: 2_000 + person2: + is_tax_unit_spouse: true + taxable_public_pension_income: 1_500 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_public_pension_exclusion: 3_500 + +- name: AZ pension exclusion amount unit test2 (Joint, one below maximum, one above maximum) + period: 2023 + input: + people: + person1: + is_tax_unit_head: true + taxable_public_pension_income: 2_000 + person2: + is_tax_unit_spouse: true + taxable_public_pension_income: 1_500 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_public_pension_exclusion: 3_500 + +- name: AZ pension exclusion amount unit test3 (Single, below maximum) + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + taxable_public_pension_income: 2_000 + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + households: + household: + members: [person1] + state_code: AZ + output: + az_public_pension_exclusion: 2_000 + +- name: AZ pension exclusion amount unit test4 (SEPARATE, above maximum) + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + taxable_public_pension_income: 3_000 + tax_units: + tax_unit: + members: [person1] + filing_status: SEPARATE + households: + household: + members: [person1] + state_code: AZ + output: + az_public_pension_exclusion: 2_500 + +- name: AZ pension exclusion amount unit test2 (Joint, above maximum) + period: 2023 + input: + people: + person1: + is_tax_unit_head: true + taxable_public_pension_income: 3_000 + person2: + is_tax_unit_spouse: true + taxable_public_pension_income: 3_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: AZ + output: + az_public_pension_exclusion: 5_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/subtractions/capital_gains/az_long_term_capital_gains_subtraction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/subtractions/capital_gains/az_long_term_capital_gains_subtraction.yaml new file mode 100644 index 000000000..46213928b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/az/tax/income/subtractions/capital_gains/az_long_term_capital_gains_subtraction.yaml @@ -0,0 +1,15 @@ +- name: Long term capital gains are $20,000 + period: 2023 + input: + state_code: AZ + long_term_capital_gains: 20_000 + output: + az_long_term_capital_gains_subtraction: 5_000 + +- name: Long term capital gains are zero + period: 2023 + input: + state_code: AZ + long_term_capital_gains: 0 + output: + az_long_term_capital_gains_subtraction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp.yaml new file mode 100644 index 000000000..9142f3ba6 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp.yaml @@ -0,0 +1,125 @@ +- name: No income + period: 2023 + input: + state_code: CO + medicaid_income_level: 0 + ambulance_expense: 100 + er_visit_expense: 100 + imaging_expense: 100 + inpatient_expense: 100 + lab_expense: 100 + outpatient_expense: 100 + physician_services_expense: 100 + prescription_expense: 100 + urgent_care_expense: 100 + is_pregnant: false + output: + co_chp: 896 + +- name: 150% fpl + period: 2023 + input: + state_code: CO + medicaid_income_level: 1.5 + ambulance_expense: 200 + er_visit_expense: 200 + imaging_expense: 200 + inpatient_expense: 200 + lab_expense: 200 + outpatient_expense: 200 + physician_services_expense: 200 + prescription_expense: 200 + urgent_care_expense: 200 + is_pregnant: false + output: + co_chp: 1787 + +- name: 175% fpl + period: 2023 + input: + state_code: CO + medicaid_income_level: 1.75 + ambulance_expense: 300 + er_visit_expense: 300 + imaging_expense: 300 + inpatient_expense: 300 + lab_expense: 300 + outpatient_expense: 300 + physician_services_expense: 300 + prescription_expense: 300 + urgent_care_expense: 300 + is_pregnant: false + output: + co_chp: 2588.5 + +- name: 250% fpl + period: 2023 + input: + state_code: CO + medicaid_income_level: 2.50 + ambulance_expense: 400 + er_visit_expense: 400 + imaging_expense: 400 + inpatient_expense: 400 + lab_expense: 400 + outpatient_expense: 400 + physician_services_expense: 400 + prescription_expense: 400 + urgent_care_expense: 400 + is_pregnant: false + output: + co_chp: 3395 + +- name: Too much income + period: 2023 + input: + state_code: CO + medicaid_income_level: 3 + ambulance_expense: 500 + er_visit_expense: 500 + imaging_expense: 500 + inpatient_expense: 500 + lab_expense: 500 + outpatient_expense: 500 + physician_services_expense: 500 + prescription_expense: 500 + urgent_care_expense: 500 + is_pregnant: false + output: + co_chp: 0 + +- name: No expenses + period: 2023 + input: + state_code: CO + medicaid_income_level: 0 + ambulance_expense: 0 + er_visit_expense: 0 + imaging_expense: 0 + inpatient_expense: 0 + lab_expense: 0 + outpatient_expense: 0 + physician_services_expense: 0 + prescription_expense: 0 + urgent_care_expense: 0 + is_pregnant: false + output: + co_chp: 0 + +- name: No co-pay if pregnant + period: 2023 + input: + state_code: CO + medicaid_income_level: 2.5 + ambulance_expense: 100 + er_visit_expense: 100 + imaging_expense: 100 + inpatient_expense: 100 + lab_expense: 100 + outpatient_expense: 100 + physician_services_expense: 100 + prescription_expense: 100 + urgent_care_expense: 100 + is_pregnant: true + output: + co_chp: 900 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp_eligible.yaml new file mode 100644 index 000000000..724ad6df8 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp_eligible.yaml @@ -0,0 +1,54 @@ +- name: Not Medicaid eligible + period: 2023 + input: + state_code: CO + is_medicaid_eligible: true + medicaid_income_level: 0 + age: 1 + is_pregnant: false + output: + co_chp_eligible: false + +- name: Too much income + period: 2023 + input: + state_code: CO + is_medicaid_eligible: false + medicaid_income_level: 2.7 + age: 1 + is_pregnant: false + output: + co_chp_eligible: false + +- name: Ineligible adult + period: 2023 + input: + state_code: CO + is_medicaid_eligible: false + medicaid_income_level: 0 + age: 19 + is_pregnant: false + output: + co_chp_eligible: false + +- name: Eligible child + period: 2023 + input: + state_code: CO + is_medicaid_eligible: false + medicaid_income_level: 2.6 + age: 18 + is_pregnant: false + output: + co_chp_eligible: true + +- name: Eligible pregnant woman + period: 2023 + input: + state_code: CO + is_medicaid_eligible: false + medicaid_income_level: 2.6 + age: 19 + is_pregnant: true + output: + co_chp_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp_out_of_pocket_maximum.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp_out_of_pocket_maximum.yaml new file mode 100644 index 000000000..0bd5a25cb --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/hcpf/chp/co_chp_out_of_pocket_maximum.yaml @@ -0,0 +1,13 @@ +- name: No income + period: 2023 + input: + medicaid_income: 0 + output: + co_chp_out_of_pocket_maximum: 0 + +- name: Has income + period: 2023 + input: + medicaid_income: 10_000 + output: + co_chp_out_of_pocket_maximum: 500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/federal_deduction/co_federal_deduction_addback.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/federal_deduction/co_federal_deduction_addback.yaml new file mode 100644 index 000000000..8cdbedd2c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/federal_deduction/co_federal_deduction_addback.yaml @@ -0,0 +1,310 @@ +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: SINGLE + itemized_taxable_income_deductions: 40_000 + taxable_income_deductions: 0 + output: + co_federal_deduction_addback: 0 + +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: JOINT + itemized_taxable_income_deductions: 70_000 + taxable_income_deductions: 0 + output: + co_federal_deduction_addback: 0 + +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: WIDOW + itemized_taxable_income_deductions: 40_000 + taxable_income_deductions: 0 + output: + co_federal_deduction_addback: 0 + +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: SEPARATE + itemized_taxable_income_deductions: 40_000 + taxable_income_deductions: 0 + output: + co_federal_deduction_addback: 0 + +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: HEAD_OF_HOUSEHOLD + itemized_taxable_income_deductions: 40_000 + taxable_income_deductions: 0 + output: + co_federal_deduction_addback: 0 + +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: SINGLE + itemized_taxable_income_deductions: 0 + taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: JOINT + itemized_taxable_income_deductions: 0 + taxable_income_deductions: 70_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: WIDOW + itemized_taxable_income_deductions: 0 + taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: SEPARATE + itemized_taxable_income_deductions: 0 + taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2021, no federal deduction addback. + period: 2021 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: HEAD_OF_HOUSEHOLD + itemized_taxable_income_deductions: 0 + taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2022, agi <= 400_000, no federal deduction addback. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: SINGLE + itemized_taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2022, agi <= 400_000, no federal deduction addback. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: JOINT + itemized_taxable_income_deductions: 70_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2022, agi <= 400_000, no federal deduction addback. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: WIDOW + itemized_taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2022, agi <= 400_000, no federal deduction addback. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: SEPARATE + itemized_taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2022, agi <= 400_000, no federal deduction addback. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: HEAD_OF_HOUSEHOLD + itemized_taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2022, single filers, agi > 400_000, itemized deduction = 40_000, deduction addback = 10_000. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: SINGLE + itemized_taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 10_000 + +- name: In 2022, joint filers, agi > 400_000, itemized deduction = 70_000, deduction addback = 10_000. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: JOINT + itemized_taxable_income_deductions: 70_000 + output: + co_federal_deduction_addback: 10_000 + +- name: In 2022, separate filers, agi > 400_000, itemized deduction = 40_000, deduction addback = 10_000. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: SEPARATE + itemized_taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 10_000 + +- name: In 2022, widow filers, agi > 400_000, itemized deduction = 40_000, deduction addback = 10_000. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: WIDOW + itemized_taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 10_000 + +- name: In 2022, head of household filers, agi > 400_000, itemized deduction = 40_000, deduction addback = 10_000. + period: 2022 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: HEAD_OF_HOUSE_HOLD + itemized_taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 10_000 + +- name: In 2023, agi <= 300_000, no federal deduction addback. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: SINGLE + taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2023, agi <= 300_000, no federal deduction addback. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: JOINT + taxable_income_deductions: 70_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2023, agi <= 300_000, no federal deduction addback. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: WIDOW + taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2023, agi <= 300_000, no federal deduction addback. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: SEPARATE + taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2023, agi <= 300_000, no federal deduction addback. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: false + filing_status: HEAD_OF_HOUSEHOLD + taxable_income_deductions: 40_000 + output: + co_federal_deduction_addback: 0 + +- name: In 2023, single filers, agi > 300_000, taxable_income_deductions = 22_000, deduction addback = 10_000. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: SINGLE + taxable_income_deductions: 22_000 + output: + co_federal_deduction_addback: 10_000 + +- name: In 2023, joint filers, agi > 300_000, taxable_income_deductions = 26_000, deduction addback = 10_000. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: JOINT + taxable_income_deductions: 26_000 + standard_deduction: 0 + output: + co_federal_deduction_addback: 10_000 + +- name: In 2023, separate filers, agi > 300_000, taxable_income_deductions = 22_000, deduction addback = 10_000. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: SEPARATE + taxable_income_deductions: 22_000 + output: + co_federal_deduction_addback: 10_000 + +- name: In 2023, widow filers, agi > 300_000, taxable income deductions = 22_000, deduction addback = 10_000. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: WIDOW + taxable_income_deductions: 22_000 + output: + co_federal_deduction_addback: 10_000 + +- name: In 2023, head of household filers, agi > 300_000, taxable income deductions = 32_000, deduction addback = 20_000. + period: 2023 + input: + state_code: CO + co_federal_deduction_addback_required: true + filing_status: HEAD_OF_HOUSE_HOLD + taxable_income_deductions: 32_000 + output: + co_federal_deduction_addback: 20_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/federal_deduction/co_federal_deduction_addback_required.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/federal_deduction/co_federal_deduction_addback_required.yaml new file mode 100644 index 000000000..1846e76ab --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/federal_deduction/co_federal_deduction_addback_required.yaml @@ -0,0 +1,44 @@ +- name: In 2022, agi <= 400_000, federal deduction addback ineligible. + period: 2022 + input: + state_code: CO + adjusted_gross_income: 300_000 + tax_unit_itemizes: true + output: + co_federal_deduction_addback_required: false + +- name: In 2022, agi > 400_000, federal deduction addback eligible. + period: 2022 + input: + state_code: CO + adjusted_gross_income: 700_000 + tax_unit_itemizes: true + output: + co_federal_deduction_addback_required: true + +- name: In 2023, agi <= 300_000, federal deduction addback ineligible. + period: 2023 + input: + state_code: CO + adjusted_gross_income: 200_000 + tax_unit_itemizes: true + output: + co_federal_deduction_addback_required: false + +- name: In 2023, agi > 300_000, federal deduction addback eligible. + period: 2023 + input: + state_code: CO + adjusted_gross_income: 700_000 + tax_unit_itemizes: true + output: + co_federal_deduction_addback_required: true + +- name: Not itemizing in 2022 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 700_000 + tax_unit_itemizes: false + output: + co_federal_deduction_addback_required: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback_eligible.yaml new file mode 100644 index 000000000..ac8871a66 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback_eligible.yaml @@ -0,0 +1,44 @@ +- name: Single, below AGI limit + period: 2022 + input: + state_code: CO + adjusted_gross_income: 500_000 + filing_status: SINGLE + output: + co_qualified_business_income_deduction_addback_required: false + +- name: Single, above AGI limit + period: 2022 + input: + state_code: CO + adjusted_gross_income: 500_001 + filing_status: SINGLE + output: + co_qualified_business_income_deduction_addback_required: true + +- name: Joint, above AGI limit + period: 2022 + input: + state_code: CO + adjusted_gross_income: 1_000_001 + filing_status: JOINT + output: + co_qualified_business_income_deduction_addback_required: true + +- name: Joint, below AGI limit + period: 2022 + input: + state_code: CO + adjusted_gross_income: 1_000_000 + filing_status: JOINT + output: + co_qualified_business_income_deduction_addback_required: false + +- name: Widow, below AGI limit + period: 2022 + input: + state_code: CO + adjusted_gross_income: 500_000 + filing_status: WIDOW + output: + co_qualified_business_income_deduction_addback_required: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/state_addback/co_state_addback.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/state_addback/co_state_addback.yaml new file mode 100644 index 000000000..830e17997 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/additions/state_addback/co_state_addback.yaml @@ -0,0 +1,50 @@ +- name: co_state_addback unit test 1 + period: 2021 + input: + state_code: CO + tax_unit_itemizes: true + state_income_tax: 6_000 + real_estate_taxes: 2_000 + salt_deduction: 8_000 + standard_deduction: 10_000 + output: + co_state_addback: 0 + +- name: co_state_addback unit test 2 + period: 2021 + input: + state_code: CO + tax_unit_itemizes: true + state_income_tax: 6_000 + real_estate_taxes: 2_000 + salt_deduction: 8_000 + interest_deduction: 12_000 + standard_deduction: 10_000 + output: + co_state_addback: 6_000 + +- name: co_state_addback unit test 3 + period: 2021 + input: + state_code: CO + tax_unit_itemizes: true + state_income_tax: 6_000 + real_estate_taxes: 12_000 + salt_deduction: 10_000 + interest_deduction: 12_000 + standard_deduction: 10_000 + output: + co_state_addback: 0 + +- name: co_state_addback unit test 4 + period: 2021 + input: + state_code: CO + tax_unit_itemizes: false + state_income_tax: 6_000 + real_estate_taxes: 2_000 + salt_deduction: 8_000 + interest_deduction: 12_000 + standard_deduction: 10_000 + output: + co_state_addback: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_income_tax_before_non_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_income_tax_before_non_refundable_credits.yaml new file mode 100644 index 000000000..c011646e4 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_income_tax_before_non_refundable_credits.yaml @@ -0,0 +1,57 @@ +- name: Calculation in 2022 + period: 2022 + input: + state_code: CO + co_taxable_income: 1_000 + output: + co_income_tax_before_non_refundable_credits: 44 + +- name: Calculation in 2021 + period: 2021 + input: + state_code: CO + co_taxable_income: 1_000 + output: + co_income_tax_before_non_refundable_credits: 45 + +- name: Calculation in 2020 + period: 2020 + input: + state_code: CO + co_taxable_income: 1_000 + output: + co_income_tax_before_non_refundable_credits: 45.5 + +- name: Calculation 2019 + absolute_error_margin: 0.01 + period: 2019 + input: + state_code: CO + co_taxable_income: 1_000 + output: + co_income_tax_before_non_refundable_credits: 45 + +- name: Calculation 2018 + absolute_error_margin: 0.01 + period: 2018 + input: + state_code: CO + co_taxable_income: 1_000 + output: + co_income_tax_before_non_refundable_credits: 46.3 + +- name: Calculation 1999 + period: 1999 + input: + state_code: CO + co_taxable_income: 1_000 + output: + co_income_tax_before_non_refundable_credits: 47.5 + +- name: No income + period: 2023 + input: + state_code: CO + co_taxable_income: 0 + output: + co_income_tax_before_non_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..7526d2812 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_income_tax_before_refundable_credits.yaml @@ -0,0 +1,17 @@ +- name: Calculation + period: 2023 + input: + state_code: CO + co_income_tax_before_non_refundable_credits: 2_000 + co_non_refundable_credits: 500 + output: + co_income_tax_before_refundable_credits: 1_500 + +- name: Capped at 0 + period: 2023 + input: + state_code: CO + co_income_tax_before_non_refundable_credits: 200 + co_non_refundable_credits: 500 + output: + co_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_taxable_income.yaml new file mode 100644 index 000000000..9d66d3a1f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/co_taxable_income.yaml @@ -0,0 +1,9 @@ +- name: co_taxable_income unit test 1 + period: 2021 + input: + state_code: CO + taxable_income: 500 + co_additions: 10 + co_subtractions: 600 + output: + co_taxable_income: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_cdcc.yaml new file mode 100644 index 000000000..a9b7459ce --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_cdcc.yaml @@ -0,0 +1,93 @@ +- name: co_cdcc unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 41 + employment_income: 60_001 + person2: + age: 11 + tax_units: + tax_unit: + members: [person1, person2] + capped_cdcc: 1_000 + households: + household: + members: [person1, person2] + state_code: CO + output: + co_cdcc: 0 + +- name: co_cdcc unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 41 + employment_income: 40_000 + person2: + age: 11 + tax_units: + tax_unit: + members: [person1, person2] + capped_cdcc: 1_000 + households: + household: + members: [person1, person2] + state_code: CO + output: + co_cdcc: 500 + +- name: co_cdcc unit test 3 + absolute_error_margin: 0.01 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 41 + employment_income: 20_000 + person2: + age: 11 + person3: + age: 9 + tax_units: + tax_unit: + members: [person1, person2, person3] + capped_cdcc: 0 + tax_unit_childcare_expenses: 8_000 + households: + household: + members: [person1, person2] + state_code: CO + output: + co_cdcc: 0 # co_low_income_cdcc = 1000 + +- name: co_cdcc unit test 4 + absolute_error_margin: 0.01 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 41 + employment_income: 20_000 + person2: + age: 11 + person3: + age: 9 + tax_units: + tax_unit: + members: [person1, person2, person3] + capped_cdcc: 0 + tax_unit_childcare_expenses: 3_000 + households: + household: + members: [person1, person2] + state_code: CO + output: + co_cdcc: 0 # co_low_income_cdcc = 750 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.yaml new file mode 100644 index 000000000..9997ae4b2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.yaml @@ -0,0 +1,137 @@ +- name: co_low_income_cdcc unit test 1 + period: 2022 + absolute_error_margin: 0 + input: + people: + head: + age: 35 + spouse: + age: 43 + child_1: + age: 12 + child_2: + age: 13 + tax_units: + tax_unit: + members: [head, spouse, child_1, child_2] + min_head_spouse_earned: 1_100 + tax_unit_childcare_expenses: 2_000 + co_low_income_cdcc_eligible: true + households: + household: + state_code: CO + members: [head, spouse, child_1, child_2] + output: + co_low_income_cdcc: 275 # = min(500,0.25*min(1100,2000)) + +- name: co_low_income_cdcc unit test 2 + # 2 children, one eligible, head and spouse ineligible + period: 2022 + absolute_error_margin: 0 + input: + people: + head: + age: 35 + spouse: + age: 43 + child_1: + age: 12 + child_2: + age: 13 + tax_units: + tax_unit: + members: [head, spouse, child_1, child_2] + min_head_spouse_earned: 1_100 + tax_unit_childcare_expenses: 2_000 + co_low_income_cdcc_eligible: false + households: + household: + state_code: CO + members: [head, spouse, child_1, child_2] + output: + co_low_income_cdcc: 0 + +- name: co_low_income_cdcc unit test 2 + # 2 children, two eligible, head and spouse eligible, ccdc exceed max amount + period: 2022 + absolute_error_margin: 0 + input: + people: + head: + age: 35 + spouse: + age: 43 + child_1: + age: 12 + child_2: + age: 10 + tax_units: + tax_unit: + members: [head, spouse, child_1, child_2] + min_head_spouse_earned: 5_100 + tax_unit_childcare_expenses: 5_000 + co_low_income_cdcc_eligible: true + households: + household: + state_code: CO + members: [head, spouse, child_1, child_2] + output: + co_low_income_cdcc: 1000 + +- name: co_low_income_cdcc unit test 3 + # 3 children, two eligible, head and spouse eligible, ccdc larger than min_head_spouse_earned + period: 2022 + absolute_error_margin: 0 + input: + people: + head: + age: 35 + spouse: + age: 43 + child_1: + age: 12 + child_2: + age: 10 + child_3: + age: 15 + tax_units: + tax_unit: + members: [head, spouse, child_1, child_2, child_3] + min_head_spouse_earned: 1_000 + tax_unit_childcare_expenses: 9_000 + co_low_income_cdcc_eligible: true + households: + household: + state_code: CO + members: [head, spouse, child_1, child_2, child_3] + output: + co_low_income_cdcc: 250 + +- name: co_low_income_cdcc unit test 4 + # 3 children, one eligible, head and spouse eligible + period: 2022 + absolute_error_margin: 0 + input: + people: + head: + age: 35 + spouse: + age: 43 + child_1: + age: 12 + child_2: + age: 17 + child_3: + age: 15 + tax_units: + tax_unit: + members: [head, spouse, child_1, child_2, child_3] + min_head_spouse_earned: 5_100 + tax_unit_childcare_expenses: 9_000 + co_low_income_cdcc_eligible: true + households: + household: + state_code: CO + members: [head, spouse, child_1, child_2, child_3] + output: + co_low_income_cdcc: 500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc_eligible.yaml new file mode 100644 index 000000000..0388e817c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc_eligible.yaml @@ -0,0 +1,26 @@ +- name: co_low_income_cdcc_eligible unit test 1 + period: 2022 + input: + state_code: CO + capped_cdcc: 0 + adjusted_gross_income: 24_999 + output: + co_low_income_cdcc_eligible: true + +- name: co_low_income_cdcc_eligible unit test 2 + period: 2022 + input: + state_code: CO + capped_cdcc: 300 + adjusted_gross_income: 24_999 + output: + co_low_income_cdcc_eligible: false + +- name: co_low_income_cdcc_eligible unit test 3 + period: 2022 + input: + state_code: CO + capped_cdcc: 0 + adjusted_gross_income: 25_001 + output: + co_low_income_cdcc_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/integration.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/integration.yaml new file mode 100644 index 000000000..521cfd19d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/cdcc/integration.yaml @@ -0,0 +1,23 @@ +- name: Colorado CDCC test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 41 + employment_income: 12_000 + person2: + age: 11 + tax_units: + tax_unit: + members: [person1, person2] + tax_unit_childcare_expenses: 9_000 + households: + household: + members: [person1, person2] + state_code: CO + output: # expected results from hand calculations using 2021 DR-0347 form + adjusted_gross_income: 12_000 + cdcc: 4_000 + co_cdcc: 2_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/co_ctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/co_ctc.yaml new file mode 100644 index 000000000..906065f17 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/co_ctc.yaml @@ -0,0 +1,412 @@ +- name: In 2021, single filer, one child age < 6, agi = 25_000, federal ctc = 1_000, the colorado ctc = 0 + period: 2021 + input: + state_code: CO + adjusted_gross_income: 25_000 + co_federal_ctc: 1_000 + filing_status: SINGLE + age: 5 + output: + co_ctc: 0 + +- name: In 2021, single filer, one child age < 6, agi = 50_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2021 + input: + state_code: CO + adjusted_gross_income: 50_000 + co_federal_ctc: 2_000 + filing_status: SINGLE + age: 4 + output: + co_ctc: 0 + +- name: In 2021, single filer, one child age < 6, agi = 75_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2021 + input: + state_code: CO + adjusted_gross_income: 75_000 + co_federal_ctc: 2_000 + filing_status: SINGLE + age: 4 + output: + co_ctc: 0 + +- name: In 2021, single filer, one child age < 6, agi = 85_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 85_000 + co_federal_ctc: 2_000 + filing_status: SINGLE + age: 4 + output: + co_ctc: 0 + +- name: In 2022, single filer, one child age < 6, agi = 25_000, federal ctc = 1_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 25_000 + co_federal_ctc: 1_000 + filing_status: SINGLE + age: 5 + output: + co_ctc: 600 + +- name: In 2022, single filer, one child age < 6, agi = 50_000, federal ctc = 2_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 50_000 + co_federal_ctc: 2_000 + filing_status: SINGLE + age: 4 + output: + co_ctc: 600 + +- name: In 2022, single filer, one child age < 6, agi = 75_000, federal ctc = 2_000, the colorado ctc = 200 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 75_000 + co_federal_ctc: 2_000 + filing_status: SINGLE + age: 4 + output: + co_ctc: 200 + +- name: In 2022, single filer, one child age < 6, agi = 85_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 85_000 + co_federal_ctc: 2_000 + filing_status: SINGLE + age: 4 + output: + co_ctc: 0 + +- name: In 2021, joint filer, one child age < 6, agi = 35_000, federal ctc = 1_000, the colorado ctc = 0 + period: 2021 + input: + state_code: CO + adjusted_gross_income: 35_000 + co_federal_ctc: 1_000 + filing_status: JOINT + age: 5 + output: + co_ctc: 0 + +- name: In 2021, joint filer, one child age < 6, agi = 60_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2021 + input: + state_code: CO + adjusted_gross_income: 60_000 + co_federal_ctc: 2_000 + filing_status: JOINT + age: 4 + output: + co_ctc: 0 + +- name: In 2021, joint filer, one child age < 6, agi = 85_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2021 + input: + state_code: CO + adjusted_gross_income: 85_000 + co_federal_ctc: 2_000 + filing_status: JOINT + age: 4 + output: + co_ctc: 0 + +- name: In 2021, joint filer, one child age < 6, agi = 95_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 95_000 + co_federal_ctc: 2_000 + filing_status: JOINT + age: 4 + output: + co_ctc: 0 + +- name: In 2022, joint filer, one child age < 6, agi = 35_000, federal ctc = 1_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 35_000 + co_federal_ctc: 1_000 + filing_status: JOINT + age: 5 + output: + co_ctc: 600 + +- name: In 2022, joint filer, one child age < 6, agi = 60_000, federal ctc = 2_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 60_000 + co_federal_ctc: 2_000 + filing_status: JOINT + age: 4 + output: + co_ctc: 600 + +- name: In 2022, joint filer, one child age < 6, agi = 85_000, federal ctc = 2_000, the colorado ctc = 200 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 85_000 + co_federal_ctc: 2_000 + filing_status: JOINT + age: 4 + output: + co_ctc: 200 + +- name: In 2022, joint filer, one child age < 6, agi = 95_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 95_000 + co_federal_ctc: 2_000 + filing_status: JOINT + age: 4 + output: + co_ctc: 0 + +- name: In 2022, separate filer, one child age < 6, agi = 25_000, federal ctc = 1_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 25_000 + co_federal_ctc: 1_000 + filing_status: SEPARATE + age: 5 + output: + co_ctc: 600 + +- name: In 2022, separate filer, one child age < 6, agi = 50_000, federal ctc = 2_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 50_000 + co_federal_ctc: 2_000 + filing_status: SEPARATE + age: 4 + output: + co_ctc: 600 + +- name: In 2022, separate filer, one child age < 6, agi = 75_000, federal ctc = 2_000, the colorado ctc = 200 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 75_000 + co_federal_ctc: 2_000 + filing_status: SEPARATE + age: 4 + output: + co_ctc: 200 + +- name: In 2022, separate filer, one child age < 6, agi = 85_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 85_000 + co_federal_ctc: 2_000 + filing_status: SEPARATE + age: 4 + output: + co_ctc: 0 + +- name: In 2022, widow(er) filer, one child age < 6, agi = 25_000, federal ctc = 1_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 25_000 + co_federal_ctc: 1_000 + filing_status: WIDOW + age: 5 + output: + co_ctc: 600 + +- name: In 2022, widow(er) filer, one child age < 6, agi = 50_000, federal ctc = 2_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 50_000 + co_federal_ctc: 2_000 + filing_status: WIDOW + age: 4 + output: + co_ctc: 600 + +- name: In 2022, widow(er) filer, one child age < 6, agi = 75_000, federal ctc = 2_000, the colorado ctc = 200 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 75_000 + co_federal_ctc: 2_000 + filing_status: WIDOW + age: 4 + output: + co_ctc: 200 + +- name: In 2022, widow(er) filer, one child age < 6, agi = 85_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 85_000 + co_federal_ctc: 2_000 + filing_status: WIDOW + age: 4 + output: + co_ctc: 0 + +- name: In 2022, head of household filer, one child age < 6, agi = 25_000, federal ctc = 1_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 25_000 + co_federal_ctc: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + age: 5 + output: + co_ctc: 600 + +- name: In 2022, head of household filer, one child age < 6, agi = 50_000, federal ctc = 2_000, the colorado ctc = 600 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 50_000 + co_federal_ctc: 2_000 + filing_status: HEAD_OF_HOUSEHOLD + age: 4 + output: + co_ctc: 600 + +- name: In 2022, head of household filer, one child age < 6, agi = 75_000, federal ctc = 2_000, the colorado ctc = 200 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 75_000 + co_federal_ctc: 2_000 + filing_status: HEAD_OF_HOUSEHOLD + age: 4 + output: + co_ctc: 200 + +- name: In 2022, head of household filer, one child age < 6, agi = 85_000, federal ctc = 2_000, the colorado ctc = 0 + period: 2022 + input: + state_code: CO + adjusted_gross_income: 85_000 + co_federal_ctc: 2_000 + filing_status: HEAD_OF_HOUSEHOLD + age: 4 + output: + co_ctc: 0 + +- name: In 2022, single filer, 1_000 ctc + period: 2022 + input: + people: + child1: + age: 4 + child2: + age: 3 + tax_units: + tax_unit: + members: [child1, child2] + adjusted_gross_income: 25_000 + co_federal_ctc: 1_000 + filing_status: SINGLE + households: + household: + members: [child1, child2] + state_code: CO + output: + co_ctc: 600 + +- name: In 2024, single filer, 2 children - flat amount + period: 2024 + input: + people: + child1: + age: 4 + child2: + age: 3 + tax_units: + tax_unit: + members: [child1, child2] + adjusted_gross_income: 25_000 + co_federal_ctc: 1_000 + filing_status: SINGLE + households: + household: + members: [child1, child2] + state_code: CO + output: + co_ctc: 2_400 + +- name: In 2024, joint filer, one child - flat amount + period: 2024 + input: + people: + child1: + age: 4 + child2: + age: 6 + tax_units: + tax_unit: + members: [child1, child2] + adjusted_gross_income: 85_000 + co_federal_ctc: 1_000 + filing_status: JOINT + households: + household: + members: [child1, child2] + state_code: CO + output: + co_ctc: 200 + +- name: In 2024, widow filer, 2 children - flat amount + period: 2024 + input: + people: + child1: + age: 4 + child2: + age: 3 + tax_units: + tax_unit: + members: [child1, child2] + adjusted_gross_income: 0 + co_federal_ctc: 1_000 + filing_status: SINGLE + households: + household: + members: [child1, child2] + state_code: CO + output: + co_ctc: 2_400 + +- name: In 2024, joint filer, one child - flat amount - ineligible + period: 2024 + input: + people: + child1: + age: 4 + child2: + age: 6 + tax_units: + tax_unit: + members: [child1, child2] + adjusted_gross_income: 85_001 + co_federal_ctc: 1_000 + filing_status: JOINT + households: + household: + members: [child1, child2] + state_code: CO + output: + co_ctc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_child_individual_maximum.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_child_individual_maximum.yaml new file mode 100644 index 000000000..6f6dd2b63 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_child_individual_maximum.yaml @@ -0,0 +1,26 @@ +- name: Above age eligbility + period: 2022 + input: + state_code: CO + age: 6 + is_tax_unit_dependent: true + output: + co_federal_ctc_child_individual_maximum: 0 + +- name: Not a dependent + period: 2022 + input: + state_code: CO + age: 5 + is_tax_unit_dependent: false + output: + co_federal_ctc_child_individual_maximum: 0 + +- name: Eligible + period: 2022 + input: + state_code: CO + age: 5 + is_tax_unit_dependent: true + output: + co_federal_ctc_child_individual_maximum: 2_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_non_refundable_ctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_non_refundable_ctc.yaml new file mode 100644 index 000000000..c410b67d7 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_non_refundable_ctc.yaml @@ -0,0 +1,17 @@ +- name: Limiting smaller + period: 2022 + input: + state_code: CO + co_federal_ctc_maximum: 1_000 + ctc_limiting_tax_liability: 999 + output: + co_non_refundable_ctc: 999 + +- name: Maximum smaller + period: 2022 + input: + state_code: CO + co_federal_ctc_maximum: 998 + ctc_limiting_tax_liability: 1_000 + output: + co_non_refundable_ctc: 998 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_refundable_ctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_refundable_ctc.yaml new file mode 100644 index 000000000..0a1069a8b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/ctc/federal_ctc/co_refundable_ctc.yaml @@ -0,0 +1,199 @@ +- name: No inputs + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 0 + co_federal_ctc_maximum: 0 + co_ctc_eligible_children_count: 0 + tax_unit_earned_income: 0 + # SS_ADD_VARIABLES + employee_social_security_tax: 0 + employee_medicare_tax: 0 + unreported_payroll_tax: 0 + self_employment_tax_ald: 0 + additional_medicare_tax: 0 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 0 + eitc: 0 + output: + co_refundable_ctc: 0 + +- name: No excess + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 1_000 + co_federal_ctc_maximum: 2_000 + co_ctc_eligible_children_count: 3 + tax_unit_earned_income: 0 + # SS_ADD_VARIABLES + employee_social_security_tax: 0 + employee_medicare_tax: 0 + unreported_payroll_tax: 0 + self_employment_tax_ald: 0 + additional_medicare_tax: 0 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 0 + eitc: 0 + output: + co_refundable_ctc: 0 + +- name: One child cap at 1,500 + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 4_000 + co_federal_ctc_maximum: 2_000 + co_ctc_eligible_children_count: 1 + tax_unit_earned_income: 100_000 + # SS_ADD_VARIABLES + employee_social_security_tax: 0 + employee_medicare_tax: 0 + unreported_payroll_tax: 0 + self_employment_tax_ald: 0 + additional_medicare_tax: 0 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 0 + eitc: 0 + output: + co_refundable_ctc: 1_500 + +- name: Two children cap at 1,500 each + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 6_000 + co_federal_ctc_maximum: 2_000 + co_ctc_eligible_children_count: 2 + tax_unit_earned_income: 100_000 + # SS_ADD_VARIABLES + employee_social_security_tax: 0 + employee_medicare_tax: 0 + unreported_payroll_tax: 0 + self_employment_tax_ald: 0 + additional_medicare_tax: 0 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 0 + eitc: 0 + output: + co_refundable_ctc: 3_000 + +- name: Two children cap max amount + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 4_000 + co_federal_ctc_maximum: 2_000 + co_ctc_eligible_children_count: 2 + tax_unit_earned_income: 100_000 + # SS_ADD_VARIABLES + employee_social_security_tax: 0 + employee_medicare_tax: 0 + unreported_payroll_tax: 0 + self_employment_tax_ald: 0 + additional_medicare_tax: 0 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 0 + eitc: 0 + output: + co_refundable_ctc: 2_000 + +- name: One child with earned income of 10,000 # (10,000 - 2,500) * 0.15 + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 4_000 + co_federal_ctc_maximum: 2_000 + co_ctc_eligible_children_count: 1 + tax_unit_earned_income: 10_000 + # SS_ADD_VARIABLES + employee_social_security_tax: 0 + employee_medicare_tax: 0 + unreported_payroll_tax: 0 + self_employment_tax_ald: 0 + additional_medicare_tax: 0 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 0 + eitc: 0 + output: + co_refundable_ctc: 1_125 + +- name: Three children, child amount over tax + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 10_000 + co_federal_ctc_maximum: 2_000 + co_ctc_eligible_children_count: 3 + tax_unit_earned_income: 100_000 + # SS_ADD_VARIABLES + employee_social_security_tax: 1_000 + employee_medicare_tax: 2_000 + unreported_payroll_tax: 0 + self_employment_tax_ald: 0 + additional_medicare_tax: 0 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 500 + eitc: 0 + output: + co_refundable_ctc: 4_500 + +- name: Three children, capped at max amount + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 4_000 + co_federal_ctc_maximum: 2_000 + co_ctc_eligible_children_count: 3 + tax_unit_earned_income: 100_000 + # SS_ADD_VARIABLES + employee_social_security_tax: 1_000 + employee_medicare_tax: 2_000 + unreported_payroll_tax: 0 + self_employment_tax_ald: 0 + additional_medicare_tax: 0 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 500 + eitc: 0 + output: + co_refundable_ctc: 2_000 + +- name: Three children, excess child amount under tax + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 10_000 + co_federal_ctc_maximum: 2_000 + co_ctc_eligible_children_count: 3 + tax_unit_earned_income: 10_000 + # SS_ADD_VARIABLES + employee_social_security_tax: 0 + employee_medicare_tax: 0 + unreported_payroll_tax: 1_000 + self_employment_tax_ald: 0 + additional_medicare_tax: 3_000 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 500 + eitc: 0 + output: + co_refundable_ctc: 3_500 + +- name: Seven children, child amount over tax, reduced by eitc + period: 2022 + input: + state_code: CO + co_non_refundable_ctc: 12_000 + co_federal_ctc_maximum: 2_000 + co_ctc_eligible_children_count: 7 + tax_unit_earned_income: 8_000 + # SS_ADD_VARIABLES + employee_social_security_tax: 1_000 + employee_medicare_tax: 10_000 + unreported_payroll_tax: 0 + self_employment_tax_ald: 0 + additional_medicare_tax: 0 + # SS_SUBTRACT_VARIABLES + excess_payroll_tax_withheld: 500 + eitc: 1_000 + output: + co_refundable_ctc: 9_500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml index 38d88255a..5228537a8 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/eitc/co_eitc.yaml @@ -1,26 +1,32 @@ -- name: If ineligible, they get zero. - period: 2023 - input: - eitc_eligible: false - earned_income_tax_credit: 100 - state_code: CO - output: - co_eitc: 0 - -- name: If eligible, they get earned 25% federal EITC. - period: 2023 - input: - eitc_eligible: true - earned_income_tax_credit: 100 - state_code: CO - output: - co_eitc: 25 - -- name: If no federal EITC no Colorado EITC. - period: 2023 - input: - eitc_eligible: true - earned_income_tax_credit: 0 - state_code: CO - output: - co_eitc: 0 +- name: co_eitc unit test 1 + period: 2021 + input: + earned_income_tax_credit: 100 + state_code: CO + output: + co_eitc: 10 + +- name: co_eitc unit test 2 + period: 2022 + input: + earned_income_tax_credit: 100 + state_code: CO + output: + co_eitc: 20 + +- name: co_eitc unit test 3 + period: 2023 + input: + earned_income_tax_credit: 100 + state_code: CO + output: + co_eitc: 25 + +- name: co_eitc unit test 4 + period: 2023 + input: + earned_income_tax_credit: 0 + state_code: CO + output: + co_eitc: 0 + diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing.yaml new file mode 100644 index 000000000..fea8cbe33 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing.yaml @@ -0,0 +1,150 @@ +- name: eligible SINGLE person whose agi=25_499 get 1_000 credit + period: 2022 + input: + state_code: CO + filing_status: SINGLE + adjusted_gross_income: 25_499 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 1_000 + +- name: eligible SINGLE person whose agi=25_500 get 990 credit + period: 2022 + input: + state_code: CO + filing_status: SINGLE + adjusted_gross_income: 25_500 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 990 + +- name: eligible SINGLE person whose agi=25_999 get 990 credit + period: 2022 + input: + state_code: CO + filing_status: SINGLE + adjusted_gross_income: 25_999 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 990 + +- name: eligible SINGLE person whose agi=26_000 get 980 credit + period: 2022 + input: + state_code: CO + filing_status: SINGLE + adjusted_gross_income: 26_000 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 980 + +- name: eligible SINGLE person whose agi=69_500 get 110 credit + period: 2022 + input: + state_code: CO + filing_status: SINGLE + adjusted_gross_income: 69_500 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 110 + +- name: eligible JOINT person whose agi=69_500 get 110 credit + period: 2022 + input: + state_code: CO + filing_status: JOINT + adjusted_gross_income: 69_500 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 110 + +- name: eligible JOINT person whose agi=69_999 get 110 credit + period: 2022 + input: + state_code: CO + filing_status: JOINT + adjusted_gross_income: 69_999 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 110 + +- name: eligible JOINT person whose agi=70_000 get 100 credit + period: 2022 + input: + state_code: CO + filing_status: JOINT + adjusted_gross_income: 70_000 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 100 + +- name: eligible JOINT person whose agi=75_001 get 100 credit + period: 2022 + input: + state_code: CO + filing_status: JOINT + adjusted_gross_income: 75_001 + # co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 0 + +- name: ineligible JOINT person whose agi=70_000 get 100 credit + period: 2022 + input: + state_code: CO + filing_status: JOINT + adjusted_gross_income: 70_000 + co_income_qualified_senior_housing_credit_eligible: False + output: + co_income_qualified_senior_housing_credit: 0 + +- name: eligible WIDOW person whose agi=69_500 get 110 credit + period: 2022 + input: + state_code: CO + filing_status: WIDOW + adjusted_gross_income: 69_500 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 110 + +- name: eligible HEAD_OF_HOUSEHOLD whose agi=69_500 get 110 credit + period: 2022 + input: + state_code: CO + filing_status: HEAD_OF_HOUSEHOLD + adjusted_gross_income: 69_500 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 110 + +- name: eligible SEPARATE whose agi=70_000 get 50 credit + period: 2022 + input: + state_code: CO + filing_status: SEPARATE + adjusted_gross_income: 70_000 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 50 + +- name: eligible SEPARATE whose agi=70_499 get 50 credit + period: 2022 + input: + state_code: CO + filing_status: SEPARATE + adjusted_gross_income: 70_499 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 50 + +- name: eligible SEPARATE whose agi=70_500 get 45 credit + period: 2022 + input: + state_code: CO + filing_status: SEPARATE + adjusted_gross_income: 70_500 + co_income_qualified_senior_housing_credit_eligible: True + output: + co_income_qualified_senior_housing_credit: 45 + diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_eligible.yaml new file mode 100644 index 000000000..23051cfdb --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_eligible.yaml @@ -0,0 +1,103 @@ +- name: SINGLE person aged 65 with 25_000 agi are eligible for the credit + period: 2022 + input: + state_code: CO + filing_status: SINGLE + age_head: 65 + adjusted_gross_income: 25_000 + co_property_tax_exemption: 0 + output: + co_income_qualified_senior_housing_credit_eligible: True + +- name: SINGLE person aged 64 with 25_000 agi are ineligible for the credit + period: 2022 + input: + state_code: CO + filing_status: SINGLE + age_head: 64 + adjusted_gross_income: 25_000 + co_property_tax_exemption: 0 + output: + co_income_qualified_senior_housing_credit_eligible: False + +- name: SINGLE person aged 64 with 75_001 agi are ineligible for the credit + period: 2022 + input: + state_code: CO + filing_status: SINGLE + age_head: 64 + adjusted_gross_income: 75_001 + co_property_tax_exemption: 0 + output: + co_income_qualified_senior_housing_credit_eligible: False + +- name: SINGLE person aged 66 with 75_001 agi are ineligible for the credit + period: 2022 + input: + state_code: CO + filing_status: SINGLE + age_head: 66 + adjusted_gross_income: 75_001 + co_property_tax_exemption: 0 + output: + co_income_qualified_senior_housing_credit_eligible: False + +- name: SEPARATE person aged 60 and spouse age 65 with 75_000 agi are eligible for the credit + period: 2022 + input: + state_code: CO + filing_status: SEPARATE + age_head: 60 + age_spouse: 65 + adjusted_gross_income: 75_000 + co_property_tax_exemption: 0 + output: + co_income_qualified_senior_housing_credit_eligible: True + +- name: SEPARATE person aged 60 and spouse age 65 with 75_001 agi are ineligible for the credit + period: 2022 + input: + state_code: CO + filing_status: SEPARATE + age_head: 60 + age_spouse: 65 + adjusted_gross_income: 75_001 + co_property_tax_exemption: 0 + output: + co_income_qualified_senior_housing_credit_eligible: False + +- name: SEPARATE person aged 60 and spouse age 64 with 75_000 agi are ineligible for the credit + period: 2022 + input: + state_code: CO + filing_status: SEPARATE + age_head: 60 + age_spouse: 64 + adjusted_gross_income: 75_000 + co_property_tax_exemption: 0 + output: + co_income_qualified_senior_housing_credit_eligible: False + +- name: SEPARATE person aged 66 and spouse age 66 with 75_000 agi are ineligible for the credit + period: 2022 + input: + state_code: CO + filing_status: SEPARATE + age_head: 66 + age_spouse: 66 + adjusted_gross_income: 75_000 + co_property_tax_exemption: 0 + output: + co_income_qualified_senior_housing_credit_eligible: True + +- name: SEPARATE person aged 66 and spouse age 66 with 75_000 agi are ineligible for the credit + period: 2022 + input: + state_code: CO + filing_status: SEPARATE + age_head: 66 + age_spouse: 66 + adjusted_gross_income: 75_000 + co_property_tax_exemption: 10 + output: + co_income_qualified_senior_housing_credit_eligible: False diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund.yaml new file mode 100644 index 000000000..56626acc3 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund.yaml @@ -0,0 +1,53 @@ +- name: Ineligible + period: 2022 + input: + co_modified_agi: 44_000 + co_sales_tax_refund_eligible: false + filing_status: SINGLE + output: + co_sales_tax_refund: 0 + +- name: Ineligible + period: 2023 + input: + co_modified_agi: 49_999 + co_sales_tax_refund_eligible: false + filing_status: SINGLE + output: + co_sales_tax_refund: 0 + +- name: Single calculation + period: 2022 + input: + co_modified_agi: 95_000 + co_sales_tax_refund_eligible: true + filing_status: SINGLE + output: + co_sales_tax_refund: 208 + +- name: Flat amount in 2023 + period: 2023 + input: + co_modified_agi: 60_001 + co_sales_tax_refund_eligible: true + filing_status: SINGLE + output: + co_sales_tax_refund: 661 + +- name: Joint calculation + period: 2022 + input: + co_modified_agi: 268_001 + co_sales_tax_refund_eligible: true + filing_status: JOINT + output: + co_sales_tax_refund: 972 + +- name: Separate calculation + period: 2022 + input: + co_modified_agi: 151_000 + co_sales_tax_refund_eligible: true + filing_status: SEPARATE + output: + co_sales_tax_refund: 234 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund_eligible.yaml new file mode 100644 index 000000000..4095f9af0 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund_eligible.yaml @@ -0,0 +1,56 @@ +- name: Ineligible + period: 2022 + input: + state_code: CO + age_head: 17 + age_spouse: 0 + co_income_tax_before_non_refundable_credits: 0 + employment_income: 0 + filing_status: SINGLE + output: + co_sales_tax_refund_eligible: false + +- name: Age eligible + period: 2022 + input: + state_code: CO + age_head: 18 + age_spouse: 0 + co_income_tax_before_non_refundable_credits: 0 + employment_income: 0 + filing_status: SINGLE + output: + co_sales_tax_refund_eligible: true + +- name: Income eligible + period: 2022 + input: + state_code: CO + age_head: 17 + age_spouse: 0 + co_income_tax_before_non_refundable_credits: 1 + employment_income: 0 + output: + co_sales_tax_refund_eligible: true + +- name: Income eligible + period: 2022 + input: + state_code: CO + age_head: 17 + age_spouse: 17 + co_income_tax_before_non_refundable_credits: 1 + employment_income: 0 + output: + co_sales_tax_refund_eligible: true + +- name: Two age eligible + period: 2022 + input: + state_code: CO + age_head: 18 + age_spouse: 18 + co_income_tax_before_non_refundable_credits: 0 + employment_income: 0 + output: + co_sales_tax_refund_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/integration.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/integration.yaml new file mode 100644 index 000000000..435e3fd28 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/integration.yaml @@ -0,0 +1,33 @@ +- name: Tax unit with taxsimid 98679 in f21.its.csv and f21.ots.csv + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 66 + employment_income: 29_010 + taxable_interest_income: 5_505 + taxable_private_pension_income: 3_500 + social_security: 12_000 + person2: + is_tax_unit_spouse: true + age: 66 + employment_income: 26_010 + taxable_interest_income: 5_505 + taxable_private_pension_income: 3_500 + social_security: 12_000 + tax_units: + tax_unit: + members: [person1, person2] + premium_tax_credit: 0 # not in TAXSIM35 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CO + output: # expected results from patched TAXSIM35 2023-08-31 version + co_taxable_income: 38230.00 + co_income_tax: 1608.35 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction.yaml new file mode 100644 index 000000000..db5a2edda --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction.yaml @@ -0,0 +1,32 @@ +- name: Case 1, above threshold + period: 2021 + input: + co_charitable_contribution_subtraction_eligible: true + charitable_cash_donations: 600 + charitable_non_cash_donations: 100 + state_code: CO + output: + co_charitable_contribution_subtraction: 200 + # 700 - 500 = 200 + +- name: Case 2, below threshold + period: 2021 + input: + charitable_cash_donations: 200 + co_charitable_contribution_subtraction_eligible: true + charitable_non_cash_donations: 200 + state_code: CO + output: + co_charitable_contribution_subtraction: 0 + # 0 if below threshold + +- name: Case 3, above threshold + period: 2021 + input: + co_charitable_contribution_subtraction_eligible: false + charitable_cash_donations: 400 + charitable_non_cash_donations: 300 + state_code: CO + output: + co_charitable_contribution_subtraction: 0 + diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction_eligible.yaml new file mode 100644 index 000000000..cd4d35d6a --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction_eligible.yaml @@ -0,0 +1,15 @@ +- name: Eligible + period: 2021 + input: + tax_unit_itemizes: true + state_code: CO + output: + co_charitable_contribution_subtraction_eligible: false + +- name: Ineligible + period: 2021 + input: + tax_unit_itemizes: false + state_code: CO + output: + co_charitable_contribution_subtraction_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/collegeinvest_contribution/co_collegeinvest_contribution.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/collegeinvest_contribution/co_collegeinvest_contribution.yaml new file mode 100644 index 000000000..ef9bdf73d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/collegeinvest_contribution/co_collegeinvest_contribution.yaml @@ -0,0 +1,39 @@ +- name: case 1, File single, invest above capped amount + period: 2022 + input: + investment_in_529_plan: 25_000 + filing_status: SINGLE + state_code: CO + output: + co_collegeinvest_subtraction: 20_000 + # above capped amount + +- name: Case 2, File single, invest below capped amount + period: 2022 + input: + investment_in_529_plan: 15_000 + filing_status: SINGLE + state_code: CO + output: + co_collegeinvest_subtraction: 15_000 + #below capped amount, use co_collegeinvest_contribution + +- name: Case 3, File joint, invest above capped amount + period: 2022 + input: + investment_in_529_plan: 35_000 + filing_status: JOINT + state_code: CO + output: + co_collegeinvest_subtraction: 30_000 + # above capped amount + +- name: Case 4, File joint, invest below capped amount + period: 2022 + input: + investment_in_529_plan: 25_000 + filing_status: JOINT + state_code: CO + output: + co_collegeinvest_subtraction: 25_000 + # below capped amount diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/military_retirement/co_military_retirement_subtraction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/military_retirement/co_military_retirement_subtraction.yaml new file mode 100644 index 000000000..05d11345e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/military_retirement/co_military_retirement_subtraction.yaml @@ -0,0 +1,114 @@ +- name: Age ineligible + period: 2023 + input: + people: + person1: + military_retirement_pay: 1_000 + age: 55 + is_tax_unit_head: true + person2: + military_retirement_pay: 1_000 + age: 55 + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CO + output: + co_military_retirement_subtraction: 0 + +- name: Spouse eligible, uncapped + period: 2023 + input: + people: + person1: + military_retirement_pay: 1_000 + age: 55 + is_tax_unit_head: true + person2: + military_retirement_pay: 1_000 + age: 54 + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CO + output: + co_military_retirement_subtraction: 1_000 + +- name: Both eligible, capped at 15,000 each + period: 2023 + input: + people: + person1: + military_retirement_pay: 15_001 + age: 54 + is_tax_unit_head: true + person2: + military_retirement_pay: 1_000 + age: 54 + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CO + output: + co_military_retirement_subtraction: 16_000 + +- name: Have to be spouse or head + period: 2023 + input: + people: + person1: + military_retirement_pay: 15_001 + age: 54 + is_tax_unit_head: true + person2: + military_retirement_pay: 15_001 + age: 54 + is_tax_unit_spouse: true + person3: + military_retirement_pay: 13_000 + age: 54 + is_tax_unit_spouse: false + is_tax_unit_head: false + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: CO + output: + co_military_retirement_subtraction: 30_000 + +- name: No military retirement pay + period: 2023 + input: + people: + person1: + military_retirement_pay: 0 + age: 54 + is_tax_unit_head: true + person2: + military_retirement_pay: 0 + age: 54 + is_tax_unit_spouse: true + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CO + output: + co_military_retirement_subtraction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv.yaml new file mode 100644 index 000000000..c86081b2d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv.yaml @@ -0,0 +1,116 @@ +- name: Case 1, age above older threshold, social_security >= $24_000. + period: 2022 + input: + age: 65 + co_social_security_subtraction_indv: 24_000 + co_pension_subtraction_income: 23_000 + pension_survivors: 5_000 + co_pension_subtraction_indv_eligible: true + output: + co_pension_subtraction_indv: 0 + # not eligible if social_security >= 24_000 + +- name: Spouse eligible same as head eligible + period: 2022 + input: + age: 65 + co_social_security_subtraction_indv: 15_000 + co_pension_subtraction_income: 20_000 + pension_survivors: 5_000 + co_pension_subtraction_indv_eligible: true + output: + co_pension_subtraction_indv: 9_000 + # min(24_000 - co_social_security, taxable_pension_income) = min(24_000 - 15_000, 20_000) + +- name: Case 2, age above older threshold, social_security < $24_000. + period: 2022 + input: + age: 65 + co_social_security_subtraction_indv: 0 + co_pension_subtraction_income: 25_000 + pension_survivors: 5_000 + co_pension_subtraction_indv_eligible: true + output: + co_pension_subtraction_indv: 24_000 + +- name: Case 3, age between 55 and 65, social_security < $20_000. + period: 2022 + input: + age: 64 + co_social_security_subtraction_indv: 15_000 + co_pension_subtraction_income: 20_000 + pension_survivors: 3_000 + co_pension_subtraction_indv_eligible: true + output: + co_pension_subtraction_indv: 5_000 + # min(20_000 - co_social_security, taxable_pension_income) = min(20_000 - 15_000, 20_000) + +- name: Age between 55 and 65, capped at 20_000 + period: 2022 + input: + age: 64 + co_social_security_subtraction_indv: 0 + co_pension_subtraction_income: 21_000 + pension_survivors: 3_000 + co_pension_subtraction_indv_eligible: true + output: + co_pension_subtraction_indv: 20_000 + +- name: Case 4, age between 55 and 65, social_security >= $20_000. + period: 2022 + input: + age: 55 + co_social_security_subtraction_indv: 21_000 + co_pension_subtraction_income: 20_000 + pension_survivors: 3_000 + co_pension_subtraction_indv_eligible: true + output: + co_pension_subtraction_indv: 0 + # not eligible if social_security >= 20_000 when 55 < age <= 65 + +- name: Case 5, age < 55, social_security >= $20_000. . + period: 2022 + input: + age: 54 + co_social_security_subtraction_indv: 21_000 + co_pension_subtraction_income: 20_000 + pension_survivors: 3_000 + co_pension_subtraction_indv_eligible: true + output: + co_pension_subtraction_indv: 0 + # not eligible if social_security >= 20_000 when age < 55 + +- name: Case 6, age < 55, social_security < $20_000. + period: 2022 + input: + age: 54 + co_social_security_subtraction_indv: 8_000 + co_pension_subtraction_income: 20_000 + pension_survivors: 3_000 + co_pension_subtraction_indv_eligible: true + output: + co_pension_subtraction_indv: 3_000 + # min(20_000 - social_security,pension_survivors) = min(20_000 - 8_000 , 3_000) + +- name: Case 7, age < 55, social_security < $20_000. + period: 2022 + input: + age: 54 + co_social_security_subtraction_indv: 8_000 + co_pension_subtraction_income: 20_000 + pension_survivors: 13_000 + co_pension_subtraction_indv_eligible: true + output: + co_pension_subtraction_indv: 12_000 + # min(20_000 - social_security,pension_survivors) = min(20_000 - 8_000 , 13_000) + +- name: Ineligible + period: 2022 + input: + age: 54 + co_social_security_subtraction_indv: 8_000 + co_pension_subtraction_income: 20_000 + pension_survivors: 13_000 + co_pension_subtraction_indv_eligible: false + output: + co_pension_subtraction_indv: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv_eligible.yaml new file mode 100644 index 000000000..a3bb98937 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv_eligible.yaml @@ -0,0 +1,26 @@ +- name: Eligible head + period: 2022 + input: + is_tax_unit_head: true + is_tax_unit_spouse: false + state_code: CO + output: + co_pension_subtraction_indv_eligible: true + +- name: Eligible spouse + period: 2022 + input: + is_tax_unit_head: false + is_tax_unit_spouse: true + state_code: CO + output: + co_pension_subtraction_indv_eligible: true + +- name: Ineligible + period: 2022 + input: + is_tax_unit_head: false + is_tax_unit_spouse: false + state_code: CO + output: + co_pension_subtraction_indv_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv.yaml new file mode 100644 index 000000000..1e917dfd6 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv.yaml @@ -0,0 +1,63 @@ +- name: Case 1, age above older threshold. + period: 2022 + input: + age: 65 + taxable_social_security: 23_000 + social_security_survivors: 5_000 + co_social_security_subtraction_indv_eligible: true + output: + co_social_security_subtraction_indv: 23_000 + # co_social_security_subtraction_indv = social_security = 23_000 + +- name: Case 2, age between younger and older threshold, exceed cap amount. + period: 2022 + input: + age: 64 + taxable_social_security: 23_000 + social_security_survivors: 5_000 + co_social_security_subtraction_indv_eligible: true + output: + co_social_security_subtraction_indv: 20_000 + # co_social_security_subtraction_indv = min_(23_000, 20_000) = 20_000 + +- name: Case 3, age between younger and older threshold, below cap amount. + period: 2022 + input: + age: 64 + taxable_social_security: 18_000 + social_security_survivors: 5_000 + co_social_security_subtraction_indv_eligible: true + output: + co_social_security_subtraction_indv: 18_000 + # co_social_security_subtraction_indv = min_(18_000, 20_000) = 18_000 + +- name: Case 4, age below younger threshold. + period: 2022 + input: + age: 54 + taxable_social_security: 23_000 + social_security_survivors: 5_000 + co_social_security_subtraction_indv_eligible: true + output: + co_social_security_subtraction_indv: 5_000 + # co_social_security_subtraction_indv = social_security_survivors = 5_000 + +- name: 0 in 2021 + period: 2021 + input: + age: 66 + taxable_social_security: 23_000 + social_security_survivors: 5_000 + co_social_security_subtraction_indv_eligible: true + output: + co_social_security_subtraction_indv: 0 + +- name: Ineligible + period: 2022 + input: + age: 54 + taxable_social_security: 23_000 + social_security_survivors: 5_000 + co_social_security_subtraction_indv_eligible: false + output: + co_social_security_subtraction_indv: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv_eligible.yaml new file mode 100644 index 000000000..39ac29480 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv_eligible.yaml @@ -0,0 +1,26 @@ +- name: Eligible head + period: 2022 + input: + is_tax_unit_head: true + is_tax_unit_spouse: false + state_code: CO + output: + co_social_security_subtraction_indv_eligible: true + +- name: Eligible spouse + period: 2022 + input: + is_tax_unit_head: false + is_tax_unit_spouse: true + state_code: CO + output: + co_social_security_subtraction_indv_eligible: true + +- name: Ineligible + period: 2022 + input: + is_tax_unit_head: false + is_tax_unit_spouse: false + state_code: CO + output: + co_social_security_subtraction_indv_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_higher_tax_recapture.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_higher_tax_recapture.yaml new file mode 100644 index 000000000..285eb6912 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_higher_tax_recapture.yaml @@ -0,0 +1,62 @@ +- name: AGI below start threshold + period: 2023 + input: + state_code: CT + ct_agi: 500_000 + filing_status: SINGLE + output: + ct_income_tax_higher_tax_recapture: 0 + +- name: Amount capped at 900 for joint filers + period: 2023 + input: + state_code: CT + ct_agi: 2_000_000 + filing_status: JOINT + output: + ct_income_tax_higher_tax_recapture: 900 + +- name: Calculation + period: 2023 + input: + state_code: CT + ct_agi: 509_000 + filing_status: SEPARATE + output: + ct_income_tax_higher_tax_recapture: 100 + +- name: Lowest bracket starts at 500_001 + period: 2023 + input: + state_code: CT + ct_agi: 500_001 + filing_status: SEPARATE + output: + ct_income_tax_higher_tax_recapture: 50 + +- name: No negative amounts + period: 2023 + input: + state_code: CT + ct_agi: 1_000 + filing_status: SINGLE + output: + ct_income_tax_higher_tax_recapture: 0 + +- name: No income + period: 2023 + input: + state_code: CT + ct_agi: 0 + filing_status: SINGLE + output: + ct_income_tax_higher_tax_recapture: 0 + +- name: No income + period: 2023 + input: + state_code: CT + ct_agi: 834_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + ct_income_tax_higher_tax_recapture: 400 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_lower_tax_recapture.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_lower_tax_recapture.yaml new file mode 100644 index 000000000..961e5d681 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_lower_tax_recapture.yaml @@ -0,0 +1,53 @@ +- name: AGI below start threshold + period: 2023 + input: + state_code: CT + ct_agi: 199_999 + filing_status: SINGLE + output: + ct_income_tax_lower_tax_recapture: 0 + +- name: Amount capped at 5,400 for joint + period: 2023 + input: + state_code: CT + ct_agi: 1_000_000 + filing_status: JOINT + output: + ct_income_tax_lower_tax_recapture: 5_400 + +- name: Calculation + period: 2023 + input: + state_code: CT + ct_agi: 409_000 + filing_status: JOINT + output: + ct_income_tax_lower_tax_recapture: 180 + +- name: No negative amounts + period: 2023 + input: + state_code: CT + ct_agi: 120_000 + filing_status: SINGLE + output: + ct_income_tax_lower_tax_recapture: 0 + +- name: No income + period: 2023 + input: + state_code: CT + ct_agi: 0 + filing_status: SINGLE + output: + ct_income_tax_lower_tax_recapture: 0 + +- name: No income + period: 2023 + input: + state_code: CT + ct_agi: 404_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + ct_income_tax_lower_tax_recapture: 1_540 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_phase_out_add_back.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_phase_out_add_back.yaml new file mode 100644 index 000000000..1720dd0b2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/add_back/ct_income_tax_phase_out_add_back.yaml @@ -0,0 +1,62 @@ +- name: AGI below start threshold + period: 2023 + input: + state_code: CT + ct_agi: 56_500 + filing_status: SINGLE + output: + ct_income_tax_phase_out_add_back: 0 + +- name: Capped at 400 for widow(er) + period: 2023 + input: + state_code: CT + ct_agi: 155_500 + filing_status: WIDOW + output: + ct_income_tax_phase_out_add_back: 400 + +- name: Lowest bracket starts at 56_001 + period: 2023 + input: + state_code: CT + ct_agi: 56_501 + filing_status: SINGLE + output: + ct_income_tax_phase_out_add_back: 20 + +- name: Calculation + period: 2023 + input: + state_code: CT + ct_agi: 112_500 + filing_status: JOINT + output: + ct_income_tax_phase_out_add_back: 120 + +- name: No negative amounts + period: 2023 + input: + state_code: CT + ct_agi: 40_000 + filing_status: SINGLE + output: + ct_income_tax_phase_out_add_back: 0 + +- name: No income + period: 2023 + input: + state_code: CT + ct_agi: 0 + filing_status: SINGLE + output: + ct_income_tax_phase_out_add_back: 0 + +- name: No income + period: 2023 + input: + state_code: CT + ct_agi: 108_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + ct_income_tax_phase_out_add_back: 256 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/credits/ct_personal_credit_rate.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/credits/ct_personal_credit_rate.yaml new file mode 100644 index 000000000..7e6e12c5c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/credits/ct_personal_credit_rate.yaml @@ -0,0 +1,45 @@ +- name: Single household with $70,900 agi + period: 2016 + input: + state_code: CT + ct_agi: 70_900 + filing_status: SINGLE + output: + ct_personal_credit_rate: 0 + +- name: Separate household with $25,510 income + period: 2016 + input: + state_code: CT + ct_agi: 25_510 + filing_status: SEPARATE + output: + ct_personal_credit_rate: 0.13 + +- name: Head of household with $25,600 income + period: 2016 + input: + state_code: CT + ct_agi: 25_600 + filing_status: HEAD_OF_HOUSEHOLD + output: + ct_personal_credit_rate: 0.55 + + +- name: Joint household with $24,100 income + period: 2016 + input: + state_code: CT + ct_agi: 24_100 + filing_status: JOINT + output: + ct_personal_credit_rate: 0.75 + +- name: Widow household with $31,999 income + period: 2016 + input: + state_code: CT + ct_agi: 31_999 + filing_status: WIDOW + output: + ct_personal_credit_rate: 0.55 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/credits/eitc/ct_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/credits/eitc/ct_eitc.yaml new file mode 100644 index 000000000..b6cb7558e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/credits/eitc/ct_eitc.yaml @@ -0,0 +1,15 @@ +- name: CT EITC, no matched credit and regular filing + period: 2022 + input: + state_code: CT + earned_income_tax_credit: 0 + output: + ct_eitc: 0 + +- name: CT EITC, some matched credit and regular filing + period: 2022 + input: + state_code: CT + earned_income_tax_credit: 2_000 + output: + ct_eitc: 610 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.yaml new file mode 100644 index 000000000..1360378b4 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.yaml @@ -0,0 +1,47 @@ +- name: Single household with $1,000 income and no add back or credits + period: 2022 + input: + state_code: CT + ct_taxable_income: 1_000 + filing_status: SINGLE + ct_income_tax_phase_out_add_back: 0 + ct_income_tax_recapture: 0 + ct_personal_credit_rate: 0 + output: + ct_income_tax_after_personal_credits: 30 + +- name: Separate household with $20,000 income with some add back, no credits + period: 2022 + input: + state_code: CT + ct_taxable_income: 20_000 + filing_status: SEPARATE + ct_income_tax_phase_out_add_back: 100 + ct_income_tax_recapture: 200 + ct_personal_credit_rate: 0 + output: + ct_income_tax_after_personal_credits: 1_100 + +- name: Same as test 2 but credit of 0.2 + period: 2022 + input: + state_code: CT + ct_taxable_income: 20_000 + filing_status: SEPARATE + ct_income_tax_phase_out_add_back: 100 + ct_income_tax_recapture: 200 + ct_personal_credit_rate: 0.2 + output: + ct_income_tax_after_personal_credits: 880 + +- name: Widow household with credit of 1 - maximum credit + period: 2022 + input: + state_code: CT + ct_taxable_income: 40_000 + filing_status: WIDOW + ct_income_tax_phase_out_add_back: 100 + ct_income_tax_recapture: 200 + ct_personal_credit_rate: 1 + output: + ct_income_tax_after_personal_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..18994edc2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_income_tax_before_refundable_credits.yaml @@ -0,0 +1,17 @@ +- name: Calculation + period: 2022 + input: + state_code: CT + ct_income_tax_after_personal_credits: 1_000 + ct_non_refundable_credits: 500 + output: + ct_income_tax_before_refundable_credits: 500 + +- name: Capped at 0 + period: 2022 + input: + state_code: CT + ct_income_tax_after_personal_credits: 500 + ct_non_refundable_credits: 600 + output: + ct_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_taxable_income.yaml new file mode 100644 index 000000000..5d8e50033 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/ct_taxable_income.yaml @@ -0,0 +1,26 @@ +- name: No exemptions + period: 2022 + input: + state_code: CT + ct_agi: 1_000 + ct_personal_exemptions: 0 + output: + ct_taxable_income: 1_000 + +- name: Equal amounts of AGI and exemptions + period: 2022 + input: + state_code: CT + ct_agi: 1_000 + ct_personal_exemptions: 1_000 + output: + ct_taxable_income: 0 + +- name: Capped at 0 + period: 2022 + input: + state_code: CT + ct_agi: 0 + ct_personal_exemptions: 1_000 + output: + ct_taxable_income: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/exemptions/ct_personal_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/exemptions/ct_personal_exemptions.yaml new file mode 100644 index 000000000..71f5ebfa6 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/exemptions/ct_personal_exemptions.yaml @@ -0,0 +1,26 @@ +- name: Single household below reduction threshold + period: 2022 + input: + state_code: CT + ct_agi: 30_000 + filing_status: SINGLE + output: + ct_personal_exemptions: 15_000 + +- name: Joint household above maximum amount + period: 2022 + input: + state_code: CT + ct_agi: 71_001 + filing_status: JOINT + output: + ct_personal_exemptions: 0 + +- name: Widow household reduced amount + period: 2022 + input: + state_code: CT + ct_agi: 54_000 + filing_status: WIDOW + output: + ct_personal_exemptions: 18_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/subtractions/tuition/ct_tuition_subtraction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/subtractions/tuition/ct_tuition_subtraction.yaml new file mode 100644 index 000000000..19a78f6a4 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ct/tax/income/subtractions/tuition/ct_tuition_subtraction.yaml @@ -0,0 +1,89 @@ +- name: Single filing with qualified tuition expenses less than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 1_000 + filing_status: SINGLE + output: + ct_tuition_subtraction: 1_000 + +- name: Single filing with qualified tuition expenses more than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 7_000 + filing_status: SINGLE + output: + ct_tuition_subtraction: 5_000 + +- name: Head of household filing with qualified tuition expenses less than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + ct_tuition_subtraction: 1_000 + +- name: Head of household filing with qualified tuition expenses more than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 7_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + ct_tuition_subtraction: 5_000 + +- name: Widow filing with qualified tuition expenses less than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 1_000 + filing_status: WIDOW + output: + ct_tuition_subtraction: 1_000 + +- name: Widow filing with qualified tuition expenses more than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 7_000 + filing_status: WIDOW + output: + ct_tuition_subtraction: 5_000 + +- name: Separate filing with qualified tuition expenses less than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 1_000 + filing_status: SEPARATE + output: + ct_tuition_subtraction: 1_000 + +- name: Separate filing with qualified tuition expenses more than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 7_000 + filing_status: SEPARATE + output: + ct_tuition_subtraction: 5_000 + +- name: Joint filing with qualified tuition expenses less than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 7_000 + filing_status: JOINT + output: + ct_tuition_subtraction: 7_000 + +- name: Joint filing with qualified tuition expenses more than tuition subtraction max amount + period: 2022 + input: + state_code: CT + qualified_tuition_expenses: 12_000 + filing_status: JOINT + output: + ct_tuition_subtraction: 10_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_grant_standard.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_grant_standard.yaml index 0435dfc93..e85e50cdc 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_grant_standard.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_grant_standard.yaml @@ -1,4 +1,4 @@ -- name: If one person, grand standard is $437 * 12/yr. +- name: If one person, grant standard is $437 * 12/yr. period: 2023 input: state_code: DC @@ -6,7 +6,7 @@ output: dc_tanf_grant_standard: 437 * 12 -- name: If ten person, grand standard is $1750 * 12/yr. +- name: If ten people, grant standard is $1750 * 12/yr. period: 2023 input: state_code: DC diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/dhs/tanf/integration.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/dhs/tanf/integration.yaml new file mode 100644 index 000000000..181991cdf --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/dhs/tanf/integration.yaml @@ -0,0 +1,16 @@ +- name: Single parent of one with no earnings gets maximum benefit. + period: 2023 + input: + people: + parent: {} + child: + age: 10 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: DC + output: + dc_tanf: 545 * 12 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc_without_qualifying_children.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc_without_qualifying_children.yaml deleted file mode 100644 index 5e0a0a3ab..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc_without_qualifying_children.yaml +++ /dev/null @@ -1,40 +0,0 @@ -- name: Max EITC no phase out AGI - period: 2023 - input: - state_code: DC - tax_unit_earned_income: 15_000 - adjusted_gross_income: 20_532 - earned_income_tax_credit: 560 - output: - dc_eitc_without_qualifying_child: 560 - -- name: Max EITC no phase out employment income - period: 2023 - input: - state_code: DC - tax_unit_earned_income: 20_532 - adjusted_gross_income: 15_000 - earned_income_tax_credit: 560 - output: - dc_eitc_without_qualifying_child: 560 - -- name: EITC income within phase out - period: 2023 - absolute_error_margin: 0.01 - input: - state_code: DC - tax_unit_earned_income: 25_000 - adjusted_gross_income: 25_000 - earned_income_tax_credit: 560 - output: - dc_eitc_without_qualifying_child: 181.1136 - -- name: Fully phased out - period: 2023 - input: - state_code: DC - tax_unit_earned_income: 27_136 - adjusted_gross_income: 27_136 - earned_income_tax_credit: 560 - output: - dc_eitc_without_qualifying_child: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_cdcc.yaml new file mode 100644 index 000000000..e48136fb1 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_cdcc.yaml @@ -0,0 +1,15 @@ +- name: DC CDCC unit test 1 + period: 2021 + input: + cdcc: 800 + state_code: DC + output: + dc_cdcc: 256 # = 800 * 0.32 + +- name: DC CDCC unit test 2 + period: 2022 + input: + cdcc: 100 + state_code: DC + output: + dc_cdcc: 32 # = 100 * 0.32 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_deduction_indiv.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_deduction_indiv.yaml new file mode 100644 index 000000000..6169970dd --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_deduction_indiv.yaml @@ -0,0 +1,27 @@ +- name: dc_deduction_indiv unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + dc_agi: 300_000 + person2: + is_tax_unit_spouse: true + dc_agi: 100_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + tax_unit_itemizes: false + dc_deduction_joint: 20_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_deduction_indiv: [15_000, 5_000, 0] diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_deduction_joint.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_deduction_joint.yaml new file mode 100644 index 000000000..85f59e1f1 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_deduction_joint.yaml @@ -0,0 +1,19 @@ +- name: dc_deduction_joint unit test 1 + period: 2021 + input: + tax_unit_itemizes: false + dc_standard_deduction: 20_000 + dc_itemized_deductions: 30_000 + state_code: DC + output: + dc_deduction_joint: 20_000 + +- name: dc_deduction_joint unit test 2 + period: 2022 + input: + tax_unit_itemizes: true + dc_standard_deduction: 20_000 + dc_itemized_deductions: 18_000 + state_code: DC + output: + dc_deduction_joint: 18_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_disabled_exclusion_subtraction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_disabled_exclusion_subtraction.yaml new file mode 100644 index 000000000..18c284d37 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_disabled_exclusion_subtraction.yaml @@ -0,0 +1,93 @@ +- name: dc_disabled_exclusion_subtraction unit test 1 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 66 + is_permanently_and_totally_disabled: true + social_security_disability: 6_000 + person2: + is_tax_unit_spouse: true + age: 65 + person3: + is_tax_unit_dependent: true + age: 17 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + household_market_income: 93_000 + household_benefits: 6_000 + state_code: DC + output: + dc_disabled_exclusion_subtraction: [10_000, 0, 0] + +- name: dc_disabled_exclusion_subtraction unit test 2 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 66 + is_permanently_and_totally_disabled: true + social_security_disability: 6_000 + person2: + is_tax_unit_spouse: true + age: 65 + is_permanently_and_totally_disabled: true + ssi: 6_000 + person3: + is_tax_unit_dependent: true + age: 17 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + household_market_income: 87_000 + household_benefits: 12_000 + state_code: DC + output: + dc_disabled_exclusion_subtraction: [10_000, 10_000, 0] + +- name: dc_disabled_exclusion_subtraction unit test 3 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 66 + is_permanently_and_totally_disabled: true + social_security_disability: 6_000 + person2: + is_tax_unit_spouse: true + age: 65 + is_permanently_and_totally_disabled: true + ssi: 6_000 + person3: + is_tax_unit_dependent: true + age: 17 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + household_market_income: 88_000 + household_benefits: 12_000 + state_code: DC + output: + dc_disabled_exclusion_subtraction: [0, 0, 0] diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc.yaml similarity index 95% rename from fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc.yaml index eb4cea835..97b5d12b2 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc.yaml @@ -1,19 +1,19 @@ -- name: DC EITC without qualifying children - period: 2023 - input: - state_code: DC - eitc_child_count: 0 - dc_eitc_with_qualifying_child: 1 - dc_eitc_without_qualifying_child: 2 - output: - dc_eitc: 2 - -- name: DC EITC with qualifying children - period: 2023 - input: - state_code: DC - eitc_child_count: 2 - dc_eitc_with_qualifying_child: 1 - dc_eitc_without_qualifying_child: 2 - output: - dc_eitc: 1 +- name: DC EITC without qualifying children + period: 2023 + input: + eitc_child_count: 0 + dc_eitc_with_qualifying_child: 1 + dc_eitc_without_qualifying_child: 2 + state_code: DC + output: + dc_eitc: 2 + +- name: DC EITC with qualifying children + period: 2023 + input: + eitc_child_count: 2 + dc_eitc_with_qualifying_child: 1 + dc_eitc_without_qualifying_child: 2 + state_code: DC + output: + dc_eitc: 1 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc_with_qualifying_child.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_with_qualifying_child.yaml similarity index 95% rename from fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc_with_qualifying_child.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_with_qualifying_child.yaml index 30416f6f5..2582ba37b 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/credits/eitc/dc_eitc_with_qualifying_child.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_with_qualifying_child.yaml @@ -1,15 +1,15 @@ -- name: No EITC, no matched credit - period: 2023 - input: - state_code: DC - earned_income_tax_credit: 0 - output: - dc_eitc_with_qualifying_child: 0 - -- name: 70% match - period: 2023 - input: - state_code: DC - earned_income_tax_credit: 100 - output: - dc_eitc_with_qualifying_child: 70 +- name: No EITC, no matched credit + period: 2023 + input: + state_code: DC + earned_income_tax_credit: 0 + output: + dc_eitc_with_qualifying_child: 0 + +- name: 70% match + period: 2023 + input: + state_code: DC + earned_income_tax_credit: 100 + output: + dc_eitc_with_qualifying_child: 70 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_without_qualifying_children.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_without_qualifying_children.yaml new file mode 100644 index 000000000..b93634e87 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_eitc_without_qualifying_children.yaml @@ -0,0 +1,43 @@ +- name: dc_eitc_without_qualified_children unit test 1 + absolute_error_margin: 0.01 + period: 2022 + input: + eitc_phased_in: 560 + tax_unit_earned_income: 15_000 + adjusted_gross_income: 20_532 + state_code: DC + output: + dc_eitc_without_qualifying_child: 560 + +- name: dc_eitc_without_qualified_children unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + eitc_phased_in: 560 + tax_unit_earned_income: 20_532 + adjusted_gross_income: 15_000 + state_code: DC + output: + dc_eitc_without_qualifying_child: 560 + +- name: dc_eitc_without_qualified_children unit test 3 + absolute_error_margin: 0.01 + period: 2022 + input: + eitc_phased_in: 560 + tax_unit_earned_income: 22_532 + adjusted_gross_income: 22_532 + state_code: DC + output: + dc_eitc_without_qualifying_child: 390.40 # 560 - (22532 - 20532) * 0.0848 + +- name: dc_eitc_without_qualified_children unit test 4 + absolute_error_margin: 0.01 + period: 2021 + input: + eitc_phased_in: 1_502 + tax_unit_earned_income: 27_743 + adjusted_gross_income: 27_743 + state_code: DC + output: + dc_eitc_without_qualifying_child: 823.60 # 1502 - (27743 - 19743) * 0.0848 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_files_separately.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_files_separately.yaml new file mode 100644 index 000000000..fac1e8286 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_files_separately.yaml @@ -0,0 +1,27 @@ +- name: dc_files_separately unit test 1 + period: 2021 + input: + dc_income_tax_before_credits_indiv: 400 + dc_income_tax_before_credits_joint: 500 + state_code: DC + output: + dc_files_separately: true + +- name: dc_files_separately unit test 2 + period: 2022 + input: + dc_income_tax_before_credits_indiv: 800 + dc_income_tax_before_credits_joint: 800 + state_code: DC + output: + dc_files_separately: false + +- name: dc_files_separately unit test 3 + period: 2022 + input: + gov.states.dc.tax.income.joint_separately_option: false + dc_income_tax_before_credits_indiv: 400 + dc_income_tax_before_credits_joint: 500 + state_code: DC + output: + dc_files_separately: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits.yaml new file mode 100644 index 000000000..a04f54142 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits.yaml @@ -0,0 +1,17 @@ +- name: dc_income_tax_before_credits unit test 1 + period: 2021 + input: + dc_files_separately: true + dc_income_tax_before_credits_indiv: 900 + state_code: DC + output: + dc_income_tax_before_credits: 900 + +- name: dc_income_tax_before_credits unit test 2 + period: 2022 + input: + dc_files_separately: false + dc_income_tax_before_credits_joint: 900 + state_code: DC + output: + dc_income_tax_before_credits: 900 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits_indiv.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits_indiv.yaml new file mode 100644 index 000000000..1a52b15f9 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits_indiv.yaml @@ -0,0 +1,39 @@ +- name: dc_income_tax_before_credits_indiv unit test 1 + period: 2021 + input: + dc_taxable_income_indiv: -900 + state_code: DC + output: + dc_income_tax_before_credits_indiv: 0 + +- name: dc_income_tax_before_credits_indiv unit test 2 + period: 2021 + input: + dc_taxable_income_indiv: 200_000 + state_code: DC + output: + dc_income_tax_before_credits_indiv: 15_400 + +- name: dc_income_tax_before_credits_indiv unit test 3 + period: 2021 + input: + dc_taxable_income_indiv: 2_000_000 + state_code: DC + output: + dc_income_tax_before_credits_indiv: 174_525 + +- name: dc_income_tax_before_credits_indiv unit test 4 + period: 2022 + input: + dc_taxable_income_indiv: 200_000 + state_code: DC + output: + dc_income_tax_before_credits_indiv: 15_400 + +- name: dc_income_tax_before_credits_indiv unit test 5 + period: 2022 + input: + dc_taxable_income_indiv: 2_000_000 + state_code: DC + output: + dc_income_tax_before_credits_indiv: 199_025 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits_joint.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits_joint.yaml new file mode 100644 index 000000000..44b1abc93 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_credits_joint.yaml @@ -0,0 +1,39 @@ +- name: dc_income_tax_before_credits_joint unit test 1 + period: 2021 + input: + dc_taxable_income_joint: -900 + state_code: DC + output: + dc_income_tax_before_credits_joint: 0 + +- name: dc_income_tax_before_credits_joint unit test 2 + period: 2021 + input: + dc_taxable_income_joint: 200_000 + state_code: DC + output: + dc_income_tax_before_credits_joint: 15_400 + +- name: dc_income_tax_before_credits_joint unit test 3 + period: 2021 + input: + dc_taxable_income_joint: 2_000_000 + state_code: DC + output: + dc_income_tax_before_credits_joint: 174_525 + +- name: dc_income_tax_before_credits_joint unit test 4 + period: 2022 + input: + dc_taxable_income_joint: 200_000 + state_code: DC + output: + dc_income_tax_before_credits_joint: 15_400 + +- name: dc_income_tax_before_credits_joint unit test 5 + period: 2022 + input: + dc_taxable_income_joint: 2_000_000 + state_code: DC + output: + dc_income_tax_before_credits_joint: 199_025 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..6832234fd --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_income_tax_before_refundable_credits.yaml @@ -0,0 +1,17 @@ +- name: dc_income_tax_before_refundable_credits unit test 1 + period: 2021 + input: + dc_income_tax_before_credits: 800 + dc_non_refundable_credits: 900 + state_code: DC + output: + dc_income_tax_before_refundable_credits: 0 + +- name: dc_income_tax_before_refundable_credits unit test 2 + period: 2022 + input: + dc_income_tax_before_credits: 800 + dc_non_refundable_credits: 600 + state_code: DC + output: + dc_income_tax_before_refundable_credits: 200 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_itemized_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_itemized_deductions.yaml new file mode 100644 index 000000000..b4bc41434 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_itemized_deductions.yaml @@ -0,0 +1,55 @@ +- name: dc_itemized_deductions unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + dc_agi: 100_000 + person2: + is_tax_unit_spouse: true + dc_agi: 100_000 + real_estate_taxes: 9_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + casualty_loss_deduction: 1_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_itemized_deductions: 10_000 + +- name: dc_itemized_deductions unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + dc_agi: 100_000 + person2: + is_tax_unit_spouse: true + dc_agi: 200_000 + real_estate_taxes: 12_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + casualty_loss_deduction: 1_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_itemized_deductions: 8_000 # = 1_000 + (12_000 - 100_000 * 0.05) diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_kccatc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_kccatc.yaml new file mode 100644 index 000000000..486339bc3 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_kccatc.yaml @@ -0,0 +1,185 @@ +- name: dc_kccatc unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 30 + employment_income: 80_000 + person2: + is_tax_unit_spouse: true + age: 28 + employment_income: 80_000 + person3: + is_tax_unit_dependent: true + age: 3 + tax_units: + tax_unit: + members: [person1, person2, person3] + tax_unit_childcare_expenses: 2_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_kccatc: 1_020 + +- name: dc_kccatc unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 30 + employment_income: 180_000 + person2: + is_tax_unit_spouse: true + age: 28 + employment_income: 80_000 + person3: + is_tax_unit_dependent: true + age: 3 + tax_units: + tax_unit: + members: [person1, person2, person3] + tax_unit_childcare_expenses: 2_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_kccatc: 0 + +- name: dc_kccatc unit test 3 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 30 + employment_income: 80_000 + person2: + is_tax_unit_spouse: true + age: 28 + employment_income: 80_000 + person3: + is_tax_unit_dependent: true + age: 4 + tax_units: + tax_unit: + members: [person1, person2, person3] + tax_unit_childcare_expenses: 2_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_kccatc: 0 + +- name: dc_kccatc unit test 4 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 30 + employment_income: 80_000 + person2: + is_tax_unit_spouse: true + age: 28 + employment_income: 80_000 + person3: + is_tax_unit_dependent: true + age: 3 + tax_units: + tax_unit: + members: [person1, person2, person3] + tax_unit_childcare_expenses: 800 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_kccatc: 800 + +- name: dc_kccatc unit test 5 + absolute_error_margin: 0.01 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 30 + employment_income: 80_000 + person2: + is_tax_unit_spouse: true + age: 28 + employment_income: 80_000 + person3: + is_tax_unit_dependent: true + age: 3 + person4: + is_tax_unit_dependent: true + age: 1 + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + tax_unit_childcare_expenses: 1_600 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: DC + output: + dc_kccatc: 1_600 + +- name: dc_kccatc unit test 6 + absolute_error_margin: 0.01 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 30 + employment_income: 80_000 + person2: + is_tax_unit_spouse: true + age: 28 + employment_income: 80_000 + person3: + is_tax_unit_dependent: true + age: 3 + person4: + is_tax_unit_dependent: true + age: 7 + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + tax_unit_childcare_expenses: 1_600 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: DC + output: + dc_kccatc: 800 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_ptc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_ptc.yaml new file mode 100644 index 000000000..972193408 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_ptc.yaml @@ -0,0 +1,245 @@ +- name: dc_ptc unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 69 + employment_income: 20_000 + rent: 8_000 + person2: + is_tax_unit_spouse: true + age: 67 + employment_income: 20_000 + rent: 4_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + adjusted_gross_income: 40_000 + dc_ptc: 800 # = 12000 * 20% - 40000 * 4% + +- name: dc_ptc unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 69 + employment_income: 20_000 + rent: 8_000 + person2: + is_tax_unit_spouse: true + age: 70 + employment_income: 20_000 + rent: 4_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + adjusted_gross_income: 40_000 + dc_ptc: 1_200 # = 12000 * 20% - 40000 * 3% + +- name: dc_ptc unit test 3 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 69 + employment_income: 40_000 + rent: 8_000 + person2: + is_tax_unit_spouse: true + age: 67 + employment_income: 20_000 + rent: 4_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + adjusted_gross_income: 60_000 + dc_ptc: 0 + +- name: dc_ptc unit test 4 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 69 + employment_income: 40_000 + rent: 10_000 + person2: + is_tax_unit_spouse: true + age: 67 + employment_income: 16_200 + rent: 10_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + adjusted_gross_income: 56_200 + dc_ptc: 1_190 # = 12000 * 20% - 56_200 * 5% + +- name: dc_ptc unit test 5 (same as test 4 except an extra dollar of income) + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 69 + employment_income: 40_000 + rent: 10_000 + person2: + is_tax_unit_spouse: true + age: 67 + employment_income: 16_201 + rent: 10_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + adjusted_gross_income: 56_201 + dc_ptc: 0 # inelgible for property tax credit + +- name: dc_ptc unit test 6 + absolute_error_margin: 0.01 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 69 + employment_income: 40_000 + rent: 10_000 + person2: + is_tax_unit_spouse: true + age: 67 + employment_income: 17_600 + rent: 10_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + adjusted_gross_income: 57_600 + dc_ptc: 1_120 # = 20000 * 20% - 57_600 * 5% + +- name: dc_ptc unit test 7 (same as test 6 except an extra dollar of income) + absolute_error_margin: 0.01 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 69 + employment_income: 40_000 + rent: 10_000 + person2: + is_tax_unit_spouse: true + age: 67 + employment_income: 17_601 + rent: 10_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + adjusted_gross_income: 57_601 + dc_ptc: 0 # inelgible for property tax credit + +- name: dc_ptc unit test 8 + absolute_error_margin: 0.01 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 69 + rent: 10_000 + person2: + is_tax_unit_spouse: true + age: 67 + rent: 10_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: -3_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_ptc: 1_250 # = min(1250, 20000 * 20% - 0 * 5%) diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_self_employment_loss_addition.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_self_employment_loss_addition.yaml new file mode 100644 index 000000000..86dccda04 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/dc_self_employment_loss_addition.yaml @@ -0,0 +1,43 @@ +- name: dc_self_employment_loss_addition unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + employment_income: 80_000 + self_employment_income: -20_000 + state_code: DC + output: + adjusted_gross_income_person: 60_000 + dc_self_employment_loss_addition: 8_000 + dc_agi: 68_000 + +- name: dc_self_employment_loss_addition unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + employment_income: 60_000 + self_employment_income: -20_000 + person2: + is_tax_unit_spouse: true + employment_income: 50_000 + self_employment_income: -10_000 + person3: + is_tax_unit_dependent: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + adjusted_gross_income: 80_000 + # total IRS self-employment losses are shared evenly by head and spouse + adjusted_gross_income_person: [45_000, 35_000, 0] + dc_self_employment_loss_addition: [12_000, 6_000, 0] + dc_agi: [57_000, 41_000, 0] diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/deductions/standard/dc_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/deductions/standard/dc_standard_deduction.yaml deleted file mode 100644 index 8af0684d5..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/states/dc/tax/income/deductions/standard/dc_standard_deduction.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- name: $12,950 for single. - period: 2022 - input: - state_code: DC - filing_status: SINGLE - output: - dc_standard_deduction: 12_950 - -- name: $25,900 for joint. - period: 2022 - input: - state_code: DC - filing_status: JOINT - output: - dc_standard_deduction: 25_900 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/cdcc/de_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/cdcc/de_cdcc.yaml new file mode 100644 index 000000000..bc4f676a1 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/cdcc/de_cdcc.yaml @@ -0,0 +1,15 @@ +- name: cdcc 100 + period: 2023 + input: + cdcc: 100 + state_code: DE + output: + de_cdcc: 50 + +- name: cdcc 0 + period: 2023 + input: + cdcc: 0 + state_code: DE + output: + de_cdcc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_eitc.yaml new file mode 100644 index 000000000..b21f14edc --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_eitc.yaml @@ -0,0 +1,19 @@ +- name: Claims refundable + period: 2022 + input: + state_code: DE + de_refundable_eitc: 100 + de_non_refundable_eitc: 90 + de_claims_refundable_eitc: true + output: + de_eitc: 100 + +- name: Claims non-refundable + period: 2022 + input: + state_code: DE + de_refundable_eitc: 90 + de_non_refundable_eitc: 100 + de_claims_refundable_eitc: false + output: + de_eitc: 100 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc.yaml new file mode 100644 index 000000000..39ac3e744 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc.yaml @@ -0,0 +1,19 @@ +- name: Not claimed + period: 2022 + input: + state_code: DE + # Claims refundable, not non-refundable. + de_claims_refundable_eitc: true + de_non_refundable_eitc_if_claimed: 100 + output: + de_non_refundable_eitc: 0 + +- name: Claimed + period: 2022 + input: + state_code: DE + # Claims non-refundable. + de_claims_refundable_eitc: false + de_non_refundable_eitc_if_claimed: 100 + output: + de_non_refundable_eitc: 100 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc_if_claimed.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc_if_claimed.yaml new file mode 100644 index 000000000..f860f427e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc_if_claimed.yaml @@ -0,0 +1,15 @@ +- name: No EITC + period: 2022 + input: + state_code: DE + earned_income_tax_credit: 0 + output: + de_non_refundable_eitc_if_claimed: 0 + +- name: Non refundable rate of 20% + period: 2022 + input: + state_code: DE + earned_income_tax_credit: 1_000 + output: + de_non_refundable_eitc_if_claimed: 200 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_refundable_eitc_if_claimed.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_refundable_eitc_if_claimed.yaml new file mode 100644 index 000000000..dc3f013e9 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/de_refundable_eitc_if_claimed.yaml @@ -0,0 +1,15 @@ +- name: Refundable rate at 4.5% + period: 2022 + input: + state_code: DE + earned_income_tax_credit: 1_000 + output: + de_refundable_eitc_if_claimed: 45 + +- name: No EITC + period: 2022 + input: + state_code: DE + earned_income_tax_credit: 0 + output: + de_refundable_eitc_if_claimed: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_claims_refundable_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_claims_refundable_eitc.yaml new file mode 100644 index 000000000..a553116f1 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_claims_refundable_eitc.yaml @@ -0,0 +1,17 @@ +- name: Refundable over non-refundable + period: 2022 + input: + state_code: DE + de_income_tax_if_claiming_refundable_eitc: 1_000 + de_income_tax_if_claiming_non_refundable_eitc: 500 + output: + de_claims_refundable_eitc: false + +- name: Refundable under non-refundable + period: 2022 + input: + state_code: DE + de_income_tax_if_claiming_refundable_eitc: 500 + de_income_tax_if_claiming_non_refundable_eitc: 501 + output: + de_claims_refundable_eitc: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_non_refundable_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_non_refundable_eitc.yaml new file mode 100644 index 000000000..7d2849986 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_non_refundable_eitc.yaml @@ -0,0 +1,23 @@ +- name: One person with zero earnings pays no tax. + period: 2022 + input: + state_code: DE + output: + de_income_tax_if_claiming_non_refundable_eitc: 0 + +- name: One person with zero earnings pays no tax. Giving them some non-refundable EITC doesn't change their tax liability. + period: 2022 + input: + state_code: DE + de_non_refundable_eitc: 100 + output: + de_income_tax_if_claiming_non_refundable_eitc: 0 + +- name: One person with zero earnings pays no tax. + period: 2022 + input: + state_code: DE + de_income_tax_before_non_refundable_credits: 150 + de_non_refundable_eitc: 100 + output: + de_income_tax_if_claiming_non_refundable_eitc: 50 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_refundable_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_refundable_eitc.yaml new file mode 100644 index 000000000..71f4300a1 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_refundable_eitc.yaml @@ -0,0 +1,14 @@ +- name: One person with zero earnings pays no tax. + period: 2022 + input: + state_code: DE + output: + de_income_tax_if_claiming_refundable_eitc: 0 + +- name: One person with zero earnings pays no tax. + period: 2022 + input: + state_code: DE + de_refundable_eitc: 100 + output: + de_income_tax_if_claiming_refundable_eitc: -100 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/personal/de_aged_personal_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/personal/de_aged_personal_credit.yaml new file mode 100644 index 000000000..b1fe9cdda --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/personal/de_aged_personal_credit.yaml @@ -0,0 +1,44 @@ +- name: yourself and spouse are both above 60 in 2021. + period: 2021 + input: + state_code: DE + age_head: 60 + age_spouse: 60 + output: + de_aged_personal_credit: 220 + +- name: yourself and spouse are both above 60 in 2022. + period: 2022 + input: + state_code: DE + age_head: 60 + age_spouse: 60 + output: + de_aged_personal_credit: 220 + +- name: yourself >= age 60 but spouse is not. + period: 2022 + input: + state_code: DE + age_head: 65 + age_spouse: 59 + output: + de_aged_personal_credit: 110 + +- name: yourself < age 60 but spouse >= 60. + period: 2023 + input: + state_code: DE + age_head: 55 + age_spouse: 65 + output: + de_aged_personal_credit: 110 + +- name: both yourself and spouse under 60. + period: 2023 + input: + state_code: DE + age_head: 55 + age_spouse: 58 + output: + de_aged_personal_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/personal/de_personal_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/personal/de_personal_credits.yaml new file mode 100644 index 000000000..63947ff20 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/credits/personal/de_personal_credits.yaml @@ -0,0 +1,31 @@ +- name: Delaware personal credit if single filer + period: 2022 + input: + exemptions: 1 + state_code: DE + output: + de_personal_credit: 110 + +- name: Delaware personal credit if married filing jointly and above max threshold + period: 2022 + input: + exemptions: 2 + state_code: DE + output: + de_personal_credit: 220 + +- name: Delaware personal credit if widower + period: 2022 + input: + exemptions: 5 + state_code: DE + output: + de_personal_credit: 550 + +- name: No exemptions + period: 2022 + input: + exemptions: 0 + state_code: DE + output: + de_personal_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/de_income_tax_before_non_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/de_income_tax_before_non_refundable_credits.yaml new file mode 100644 index 000000000..94ba37b74 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/de_income_tax_before_non_refundable_credits.yaml @@ -0,0 +1,15 @@ +- name: No income + period: 2022 + input: + state_code: DE + de_taxable_income: 0 + output: + de_income_tax_before_non_refundable_credits: 0 + +- name: $4_000 income #((4_000 - 2_000) * 0.022) + period: 2022 + input: + state_code: DE + de_taxable_income: 4_000 + output: + de_income_tax_before_non_refundable_credits: 44 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/de_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/de_income_tax_before_refundable_credits.yaml index e7c37c6f9..cd761eddd 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/de_income_tax_before_refundable_credits.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/de_income_tax_before_refundable_credits.yaml @@ -1,15 +1,17 @@ -- name: No income +- name: Calculation before cap period: 2022 input: state_code: DE - de_taxable_income: 0 + de_income_tax_before_non_refundable_credits: 2_000 + de_non_refundable_credits: 1_000 output: - de_income_tax_before_refundable_credits: 0 + de_income_tax_before_refundable_credits: 1_000 -- name: $4_000 income #((4_000 - 2_000) * 0.022) +- name: Capper at 0 period: 2022 input: state_code: DE - de_taxable_income: 4_000 + de_income_tax_before_non_refundable_credits: 1_000 + de_non_refundable_credits: 2_000 output: - de_income_tax_before_refundable_credits: 44 + de_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/deductions/standard/de_additional_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/deductions/standard/de_additional_standard_deduction.yaml new file mode 100644 index 000000000..cb28ed014 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/deductions/standard/de_additional_standard_deduction.yaml @@ -0,0 +1,54 @@ +- name: yourself and spouse are both above 65 and blind. + period: 2023 + input: + state_code: DE + age_head: 65 + age_spouse: 65 + blind_head: true + blind_spouse: true + output: + de_additional_standard_deduction: 10_000 + +- name: yourself >= age 65 but spouse is not, and both are blind. + period: 2023 + input: + state_code: DE + age_head: 65 + age_spouse: 64 + blind_head: true + blind_spouse: true + output: + de_additional_standard_deduction: 7_500 + +- name: both yourself and spouse < age 65, and both are blind. + period: 2023 + input: + state_code: DE + age_head: 64 + age_spouse: 64 + blind_head: true + blind_spouse: true + output: + de_additional_standard_deduction: 5_000 + +- name: yourself < age 65 and blind, spouse >= age 65 and not blind + period: 2023 + input: + state_code: DE + age_head: 64 + age_spouse: 65 + blind_head: true + blind_spouse: false + output: + de_additional_standard_deduction: 5_000 + +- name: both yourself and spouse under 65, and neither are blind. + period: 2023 + input: + state_code: DE + age_head: 64 + age_spouse: 64 + blind_head: false + blind_spouse: false + output: + de_additional_standard_deduction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/deductions/standard/de_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/deductions/standard/de_standard_deduction.yaml new file mode 100644 index 000000000..c8e3d46ef --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/deductions/standard/de_standard_deduction.yaml @@ -0,0 +1,15 @@ +- name: Delaware Standard deduction if single filer + period: 2022 + input: + filing_status: SINGLE + state_code: DE + output: + de_standard_deduction: 3_250 + +- name: Delaware Standard deduction if married filing jointly and above max threshold + period: 2022 + input: + filing_status: JOINT + state_code: DE + output: + de_standard_deduction: 6_500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/subtractions/de_elderly_or_disabled_income_exclusion.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/subtractions/de_elderly_or_disabled_income_exclusion.yaml new file mode 100644 index 000000000..47ddf11e1 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/subtractions/de_elderly_or_disabled_income_exclusion.yaml @@ -0,0 +1,23 @@ +- name: Single eligible + period: 2023 + input: + filing_status: SINGLE + de_elderly_or_disabled_income_exclusion_eligible: true + output: + de_elderly_or_disabled_income_exclusion: 2_000 + +- name: Single ineligible + period: 2023 + input: + filing_status: SINGLE + de_elderly_or_disabled_income_exclusion_eligible: false + output: + de_elderly_or_disabled_income_exclusion: 0 + +- name: Joint eligible + period: 2023 + input: + filing_status: JOINT + de_elderly_or_disabled_income_exclusion_eligible: true + output: + de_elderly_or_disabled_income_exclusion: 4_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/subtractions/de_elderly_or_disabled_income_exclusion_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/subtractions/de_elderly_or_disabled_income_exclusion_eligible.yaml new file mode 100644 index 000000000..454f195ea --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/de/tax/income/subtractions/de_elderly_or_disabled_income_exclusion_eligible.yaml @@ -0,0 +1,118 @@ +- name: If filing SINGLE, age or disability ineligible. + period: 2023 + input: + tax_unit_earned_income: 2_499 + filing_status: SINGLE + disabled_head: false + age_head: 61 + de_pre_exclusions_agi: 10_000 + state_code: DE + output: + de_elderly_or_disabled_income_exclusion_eligible: true + +- name: If filing SINGLE, eligible. + period: 2023 + input: + tax_unit_earned_income: 2_499 + filing_status: SINGLE + disabled_head: true + age_head: 60 + de_pre_exclusions_agi: 10_000 + state_code: DE + output: + de_elderly_or_disabled_income_exclusion_eligible: true + +- name: If filing SINGLE, earned income ineligible. + period: 2023 + input: + tax_unit_earned_income: 2_500 + filing_status: SINGLE + disabled_head: true + age_head: 61 + de_pre_exclusions_agi: 10_000 + state_code: DE + output: + de_elderly_or_disabled_income_exclusion_eligible: false + +- name: If filing SINGLE, agi ineligible. + period: 2023 + input: + tax_unit_earned_income: 2_499 + filing_status: SINGLE + disabled_head: true + age_head: 60 + de_pre_exclusions_agi: 10_001 + state_code: DE + output: + de_elderly_or_disabled_income_exclusion_eligible: false + +- name: If filing SEPARATE, eligible. + period: 2023 + input: + tax_unit_earned_income: 2_499 + filing_status: SEPARATE + disabled_head: false + disabled_spouse: false + age_head: 61 + age_spouse: 61 + de_pre_exclusions_agi: 10_000 + state_code: DE + output: + de_elderly_or_disabled_income_exclusion_eligible: true + +- name: If filing JOINT, . + period: 2023 + input: + tax_unit_earned_income: 1_999 + filing_status: JOINT + disabled_head: false + disabled_spouse: false + age_head: 61 + age_spouse: 61 + de_pre_exclusions_agi: 20_000 + state_code: DE + output: + de_elderly_or_disabled_income_exclusion_eligible: true + +- name: If filing JOINT, age or disability ineligible. + period: 2023 + input: + tax_unit_earned_income: 1_999 + filing_status: JOINT + disabled_head: false + disabled_spouse: false + age_head: 61 + age_spouse: 60 + de_pre_exclusions_agi: 10_000 + state_code: DE + output: + de_elderly_or_disabled_income_exclusion_eligible: false + +- name: If filing JOINT, earned income ineligible. + period: 2023 + input: + tax_unit_earned_income: 5_000 + filing_status: JOINT + disabled_head: false + disabled_spouse: false + age_head: 61 + age_spouse: 61 + de_pre_exclusions_agi: 20_000 + state_code: DE + output: + de_elderly_or_disabled_income_exclusion_eligible: false + + +- name: If filing JOINT, agi ineligible. + period: 2023 + input: + tax_unit_earned_income: 4_999 + filing_status: JOINT + disabled_head: false + disabled_spouse: false + age_head: 61 + age_spouse: 61 + de_pre_exclusions_agi: 20_001 + state_code: DE + output: + de_elderly_or_disabled_income_exclusion_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/credits/dependent_care_credit/ga_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/credits/dependent_care_credit/ga_cdcc.yaml new file mode 100644 index 000000000..2abdf3866 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/credits/dependent_care_credit/ga_cdcc.yaml @@ -0,0 +1,23 @@ +- name: GA cdcc unit test 1 + period: 2021 + input: + cdcc: 1_000 + state_code: GA + output: + ga_cdcc: 300 # .30 * 1_000 + +- name: GA cdcc unit test 2 + period: 2007 + input: + cdcc: 1_000 + state_code: GA + output: + ga_cdcc: 200 # .20 * 1_000 + +- name: GA cdcc unit test 2 + period: 2007 + input: + cdcc: 0 + state_code: GA + output: + ga_cdcc: 0 # .00 * 1_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/credits/ga_low_income_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/credits/ga_low_income_credit.yaml new file mode 100644 index 000000000..62b9cba50 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/credits/ga_low_income_credit.yaml @@ -0,0 +1,87 @@ +- name: Georgia low income credits higher income bracket + period: 2022 + input: + state_code: GA + adjusted_gross_income: 14_000 + age_head: 67 + age_spouse: 70 + exemptions: 2 + output: + ga_low_income_credit: 32 + +- name: Georgia low income credits one aged + period: 2022 + input: + state_code: GA + adjusted_gross_income: 4_000 + age_head: 67 + age_spouse: 56 + exemptions: 2 + output: + ga_low_income_credit: 78 + +- name: Georgia low income credits both aged - higher income bracket + period: 2022 + input: + state_code: GA + adjusted_gross_income: 15_500 + age_head: 80 + age_spouse: 75 + exemptions: 3 + output: + ga_low_income_credit: 25 + +- name: Georgia low income credits - one aged and no exemptions + period: 2022 + input: + state_code: GA + adjusted_gross_income: 4_000 + age_head: 67 + age_spouse: 56 + exemptions: 0 + output: + ga_low_income_credit: 26 + +- name: Georgia low income credits - lower income bracket + period: 2022 + input: + state_code: GA + adjusted_gross_income: 10_500 + age_head: 67 + age_spouse: 56 + exemptions: 0 + output: + ga_low_income_credit: 8 + +- name: Georgia low income credits - no exemptions + period: 2022 + input: + state_code: GA + adjusted_gross_income: 10_500 + age_head: 56 + age_spouse: 56 + exemptions: 0 + output: + ga_low_income_credit: 0 + +- name: Georgia low income credits - one aged and one exemption + period: 2022 + input: + state_code: GA + adjusted_gross_income: 10_500 + age_head: 65 + age_spouse: 64 + exemptions: 1 + output: + ga_low_income_credit: 16 + +- name: Georgia low income credits - two exemptions + period: 2022 + input: + state_code: GA + adjusted_gross_income: 10_000 + age_head: 64 + age_spouse: 64 + exemptions: 2 + output: + ga_low_income_credit: 16 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/deductions/standard/ga_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/deductions/standard/ga_standard_deduction.yaml new file mode 100644 index 000000000..212ea237c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/deductions/standard/ga_standard_deduction.yaml @@ -0,0 +1,55 @@ +- name: Joint filing - just base deduction amount + period: 2023 + input: + filing_status: JOINT + age_head: 50 + blind_head: false + age_spouse: 30 + blind_spouse: false + state_code: GA + output: + ga_standard_deduction: 7_100 + +- name: Joint filing - one blind spouse + period: 2023 + input: + filing_status: JOINT + age_head: 50 + blind_head: false + age_spouse: 30 + blind_spouse: true + state_code: GA + output: + ga_standard_deduction: 8_400 + +- name: Single filing - aged head + period: 2023 + input: + filing_status: SINGLE + age_head: 65 + blind_head: false + state_code: GA + output: + ga_standard_deduction: 6_700 + +- name: Head of household - one blind and aged head + period: 2023 + input: + filing_status: HEAD_OF_HOUSEHOLD + age_head: 65 + blind_head: true + state_code: GA + output: + ga_standard_deduction: 8_000 + +- name: Joint filing - aged and blind head + aged and blind spouse + period: 2023 + input: + filing_status: JOINT + age_head: 66 + blind_head: true + age_spouse: 65 + blind_spouse: true + state_code: GA + output: + ga_standard_deduction: 12_300 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/exemptions/ga_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/exemptions/ga_exemptions.yaml new file mode 100644 index 000000000..ba6d1b7fd --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/exemptions/ga_exemptions.yaml @@ -0,0 +1,44 @@ +- name: Single filer + period: 2022 + input: + filing_status: SINGLE + tax_unit_dependents: 1 + state_code: GA + output: + ga_exemptions: 5_700 + +- name: Married filing joint + period: 2021 + input: + filing_status: JOINT + tax_unit_dependents: 0 + state_code: GA + output: + ga_exemptions: 7_400 + +- name: Head of household filer + period: 2020 + input: + filing_status: HEAD_OF_HOUSEHOLD + tax_unit_dependents: 2 + state_code: GA + output: + ga_exemptions: 8_700 + +- name: Separate filer + period: 2021 + input: + filing_status: SEPARATE + tax_unit_dependents: 1 + state_code: GA + output: + ga_exemptions: 6_700 + +- name: Widow filer + period: 2021 + input: + filing_status: WIDOW + tax_unit_dependents: 1 + state_code: GA + output: + ga_exemptions: 5_700 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/ga_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/ga_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..ae6fbb38d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/ga_income_tax_before_refundable_credits.yaml @@ -0,0 +1,44 @@ +- name: Single filer #((3_000 - 2_250) * 0.03 + ((2_250 - 750) * 0.02 + 750 * 0.01) = 22.5 + 30 + 7.5 + period: 2022 + input: + ga_taxable_income: 3_000 + filing_status: SINGLE + state_code: GA + output: + ga_income_tax_before_refundable_credits: 60 + +- name: Single filer w/o income + period: 2022 + input: + ga_taxable_income: 0 + filing_status: SINGLE + state_code: GA + output: + ga_income_tax_before_refundable_credits: 0 + +- name: Joint filer + period: 2022 + input: + ga_taxable_income: 1_100 + filing_status: JOINT + state_code: GA + output: + ga_income_tax_before_refundable_credits: 12 + +- name: Separate filer + period: 2022 + input: + ga_taxable_income: 600 + filing_status: SEPARATE + state_code: GA + output: + ga_income_tax_before_refundable_credits: 7 + +- name: Head of household filer + period: 2022 + input: + ga_taxable_income: 1_100 + filing_status: HEAD_OF_HOUSEHOLD + state_code: GA + output: + ga_income_tax_before_refundable_credits: 12 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/ga_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/ga_taxable_income.yaml new file mode 100644 index 000000000..11ac8799d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ga/tax/income/ga_taxable_income.yaml @@ -0,0 +1,9 @@ +- name: ga_taxable_income unit test 1 + period: 2021 + input: + state_code: GA + ga_agi: 800 + ga_deductions: 600 + ga_exemptions: 300 + output: + ga_taxable_income: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit.yaml new file mode 100644 index 000000000..ab5c6ba3c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit.yaml @@ -0,0 +1,232 @@ +- name: SINGLE, dsi=false, under 5_000, 3 exemption, 1 minor child (received more than half), 1 child over 18 + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 19 + is_child: true + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 4_000 + filing_status: SINGLE + exemptions: 3 + dsi: false + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_credit: 330 + +- name: SINGLE, dsi=false, under 5_000, 3 exemption, 1 minor child (not received more than half), 1 child over 18 + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 1_000 + social_security_survivors: 100 + tanf_person: 400 + person2: + age: 39 + is_child: false + person3: + age: 19 + is_child: true + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 4_000 + filing_status: SINGLE + exemptions: 3 + dsi: false + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_credit: 330 + +- name: SINGLE, dsi=true, under 5_000, 2 exemption, 1 minor child (received more than half) + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + spm_units: + spm_unit: + members: [person1, person2] + tanf: 600 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 4_000 + filing_status: SINGLE + exemptions: 2 + dsi: true + households: + household: + members: [person1, person2] + state_code: HI + output: + hi_food_excise_credit: 0 + +- name: SINGLE, dsi=false, over 30_000, 3 exemption, 1 minor child (received more than half), 1 child over 18 + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 19 + is_child: true + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 35_000 + filing_status: SINGLE + exemptions: 3 + dsi: false + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_credit: 110 + +- name: JOINT, dsi=false, over 30_000 under 40_000, 3 exemption, 1 minor child (received more than half), 1 child over 18 + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 19 + is_child: true + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 35_000 + filing_status: JOINT + exemptions: 3 + dsi: false + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_credit: 200 + +- name: JOINT, dsi=false, over 50_000, 3 exemption, 1 minor child (received more than half), 1 child over 18 + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 500 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 19 + is_child: true + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 55_000 + filing_status: JOINT + exemptions: 3 + dsi: false + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_credit: 110 + +- name: JOINT, dsi=false, over 5_000 under 10_000, 2 exemption, 1 minor child (received more than half) + period: 2022 + input: + people: + person1: + age: 30 + is_child: false + person2: + age: 17 + is_child: true + child_support_received: 500 + social_security_survivors: 100 + tanf_person: 401 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 6_000 + filing_status: SINGLE + dsi: false + households: + household: + members: [person1, person2] + state_code: HI + output: + hi_food_excise_credit: 210 + +- name: JOINT, dsi=false, over 5_000 under 10_000, 2 exemption, 1 minor child (not received more than half) + period: 2022 + input: + people: + person1: + age: 30 + is_child: false + person2: + age: 17 + is_child: true + child_support_received: 1_000 + social_security_survivors: 100 + tanf_person: 400 + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 6_000 + filing_status: SINGLE + dsi: false + households: + household: + members: [person1, person2] + state_code: HI + output: + hi_food_excise_credit: 200 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_child_receiving_public_support.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_child_receiving_public_support.yaml new file mode 100644 index 000000000..353c6a6af --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_child_receiving_public_support.yaml @@ -0,0 +1,49 @@ +- name: No child support + period: 2022 + input: + child_support_received: 0 + social_security_survivors: 100 + tanf_person: 100 + state_code: HI + output: + hi_food_excise_credit_child_receiving_public_support: true + +- name: No public support + period: 2022 + input: + child_support_received: 1_000 + social_security_survivors: 0 + tanf_person: 0 + state_code: HI + output: + hi_food_excise_credit_child_receiving_public_support: false + +- name: All child support comes from public support + period: 2022 + input: + child_support_received: 1_000 + social_security_survivors: 100 + tanf_person: 900 + state_code: HI + output: + hi_food_excise_credit_child_receiving_public_support: false + +- name: Exactly half of the child support comes from public support + period: 2022 + input: + child_support_received: 1_000 + social_security_survivors: 100 + tanf_person: 400 + state_code: HI + output: + hi_food_excise_credit_child_receiving_public_support: false + +- name: Over half of the child support comes from public support + period: 2022 + input: + child_support_received: 1_000 + social_security_survivors: 100 + tanf_person: 401 + state_code: HI + output: + hi_food_excise_credit_child_receiving_public_support: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_amount.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_amount.yaml new file mode 100644 index 000000000..ca53a431e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_amount.yaml @@ -0,0 +1,23 @@ +- name: 1 minor child over half support + period: 2022 + input: + hi_food_excise_credit_minor_child_count: 1 + state_code: HI + output: + hi_food_excise_credit_minor_child_amount: 110 + +- name: 2 minor child over half support + period: 2022 + input: + hi_food_excise_credit_minor_child_count: 2 + state_code: HI + output: + hi_food_excise_credit_minor_child_amount: 220 + +- name: no minor child over half support + period: 2022 + input: + hi_food_excise_credit_minor_child_count: 0 + state_code: HI + output: + hi_food_excise_credit_minor_child_amount: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_count.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_count.yaml new file mode 100644 index 000000000..3633faf5d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_count.yaml @@ -0,0 +1,77 @@ +- name: 1 minor child over half support + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 19 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: HI + output: + hi_food_excise_credit_minor_child_count: 1 + +- name: 2 minor child over half support + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 17 + is_child: true + child_support_received: 500 + social_security_survivors: 100 + tanf_person: 401 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: HI + output: + hi_food_excise_credit_minor_child_count: 2 + +- name: 1 minor child over half support + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 17 + is_child: true + child_support_received: 500 + social_security_survivors: 100 + tanf_person: 400 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: HI + output: + hi_food_excise_credit_minor_child_count: 1 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.yaml new file mode 100644 index 000000000..958a2a4f2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.yaml @@ -0,0 +1,187 @@ +- name: SINGLE, under 5_000, 3 exemption, 1 minor child (received more than half) + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 19 + is_child: true + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 4_000 + filing_status: SINGLE + exemptions: 3 + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_exemption_amount: 220 + +- name: SINGLE, under 5_000, 3 exemption, 2 minor child (received more than half) + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 17 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 4_000 + filing_status: SINGLE + exemptions: 3 + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_exemption_amount: 110 + +- name: JOINT, over 30_000, 3 exemption, 2 minor child (received more than half) + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 17 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 35_000 + filing_status: JOINT + exemptions: 3 + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_exemption_amount: 45 + +- name: JOINT, over 50_000, 3 exemption, 1 minor child (received more than half) + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 18 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 55_000 + filing_status: JOINT + exemptions: 3 + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_exemption_amount: 0 + +- name: JOINT, over 30_000, 4 exemption, 2 minor child (received more than half) + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 17 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 35_000 + filing_status: JOINT + exemptions: 4 + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_exemption_amount: 90 + +- name: SEPARATE, over 40_000, 3 exemption, 2 minor child (received more than half) + period: 2022 + input: + people: + person1: + age: 3 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + person2: + age: 39 + is_child: false + person3: + age: 17 + is_child: true + child_support_received: 400 + social_security_survivors: 100 + tanf_person: 401 + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 45_000 + filing_status: SEPARATE + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + hi_food_excise_exemption_amount: 35 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_eitc.yaml new file mode 100644 index 000000000..21eea0b9b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_eitc.yaml @@ -0,0 +1,15 @@ +- name: No EITC + period: 2022 + input: + earned_income_tax_credit: 0 + state_code: HI + output: + hi_eitc: 0 + +- name: 20% match of fed EITC + period: 2022 + input: + earned_income_tax_credit: 1_000 + state_code: HI + output: + hi_eitc: 200 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_lihrtc_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_lihrtc_eligible.yaml new file mode 100644 index 000000000..15a4a27f2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_lihrtc_eligible.yaml @@ -0,0 +1,39 @@ +- name: Eligible household renters + period: 2021 + input: + state_code: HI + dsi: false + adjusted_gross_income: 29_000 + rent: 1_100 + output: + hi_tax_credit_for_low_income_household_renters_eligible: true + +- name: Uneligible household renters (over adjusted gross income threshold) + period: 2021 + input: + state_code: HI + dsi: false + adjusted_gross_income: 31_000 + rent: 1_100 + output: + hi_tax_credit_for_low_income_household_renters_eligible: false + +- name: Uneligible household renters (below rent payment threshold) + period: 2021 + input: + state_code: HI + dsi: false + adjusted_gross_income: 29_000 + rent: 900 + output: + hi_tax_credit_for_low_income_household_renters_eligible: false + +- name: Uneligible household renters (neither condition unsatisfied) + period: 2021 + input: + state_code: HI + dsi: false + adjusted_gross_income: 32_000 + rent: 900 + output: + hi_tax_credit_for_low_income_household_renters_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_low_income_household_renters_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_low_income_household_renters_tax_credit.yaml new file mode 100644 index 000000000..dd40dac9d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_low_income_household_renters_tax_credit.yaml @@ -0,0 +1,39 @@ +- name: Both Aged Exemptions + period: 2021 + input: + age_head: 66 + age_spouse: 66 + exemptions: 1 + hi_tax_credit_for_low_income_household_renters_eligible: true + output: + hi_tax_credit_for_low_income_household_renters: 150 + +- name: Either Aged Exemptions + period: 2021 + input: + age_head: 64 + age_spouse: 66 + exemptions: 1 + hi_tax_credit_for_low_income_household_renters_eligible: true + output: + hi_tax_credit_for_low_income_household_renters: 100 + +- name: Neither Aged Exemptions + period: 2021 + input: + age_head: 63 + age_spouse: 63 + exemptions: 1 + hi_tax_credit_for_low_income_household_renters_eligible: true + output: + hi_tax_credit_for_low_income_household_renters: 50 + +- name: Ineligible + period: 2021 + input: + age_head: 63 + age_spouse: 63 + exemptions: 1 + hi_tax_credit_for_low_income_household_renters_eligible: false + output: + hi_tax_credit_for_low_income_household_renters: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_fedtax_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_fedtax_deduction.yaml index 5c25c224c..8aa633074 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_fedtax_deduction.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_fedtax_deduction.yaml @@ -18,14 +18,15 @@ tax_units: tax_unit: members: [person1, person2, person3] - income_tax_before_refundable_credits: 21_000 additional_medicare_tax: 1_000 + income_tax_before_refundable_credits: 21_200 households: household: members: [person1, person2, person3] state_code: IA output: - ia_fedtax_deduction: [14_800, 5_000, 0] + self_employment_tax: [200, 0, 0] + ia_fedtax_deduction: [15_000, 5_000, 0] - name: IA federal income tax deduction unit test 2 absolute_error_margin: 0.01 @@ -35,8 +36,8 @@ person1: is_tax_unit_head: true age: 40 - ia_net_income: 300_000 - self_employment_tax: 200 + ia_net_income: 400_000 + self_employment_tax: 700 person2: is_tax_unit_spouse: true age: 38 @@ -47,11 +48,11 @@ tax_units: tax_unit: members: [person1, person2, person3] - income_tax_before_refundable_credits: 21_000 - additional_medicare_tax: 1_000 + additional_medicare_tax: 2_000 + income_tax_before_refundable_credits: 22_700 households: household: members: [person1, person2, person3] state_code: IA output: - ia_fedtax_deduction: [14_800, 5_000, 0] + ia_fedtax_deduction: [16_000, 4_000, 0] diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_integration.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_integration.yaml index 5a72284a7..aac852421 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_integration.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_integration.yaml @@ -182,3 +182,163 @@ ia_income_tax_before_credits: 598.81 ia_exemption_credit: 120 ia_income_tax: 478.81 # the incorrect TAXSIM35 result is 430.85 + +- name: Tax unit with taxsimid 4731 in j21.its.csv and j21.ots.csv + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 71 + employment_income: 6_010 + qualified_dividend_income: 505.0 + taxable_interest_income: 5_505.0 + long_term_capital_gains: 1_505.0 + rental_income: 505.0 + taxable_private_pension_income: 1_500.0 + social_security: 4_500.0 + rent: 3_000 + self_employment_income: 93_010 + business_is_qualified: true + business_is_sstb: false + w2_wages_from_qualified_business: 100e6 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + person2: + is_tax_unit_spouse: true + age: 71 + employment_income: 1_010 + qualified_dividend_income: 505.0 + taxable_interest_income: 5_505.0 + long_term_capital_gains: 1_505.0 + rental_income: 505.0 + taxable_private_pension_income: 1_500.0 + social_security: 4_500.0 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + spm_units: + spm_unit: + members: [person1, person2] + snap: 0 # not in TAXSIM35 + tanf: 0 # not in TAXSIM35 + tax_units: + tax_unit: + members: [person1, person2] + premium_tax_credit: 0 # not in TAXSIM35 + local_income_tax: 0 # not in TAXSIM35 + households: + household: + members: [person1, person2] + state_code: IA + output: # expected ia_income_tax from patched TAXSIM35 2023-06-22 version + ia_income_tax: 5_620.59 + +- name: Tax unit with taxsimid 2782 in j21.its.csv and j21.ots.csv + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 67 + qualified_dividend_income: 1_005.0 + taxable_interest_income: 5_505.0 + long_term_capital_gains: 5_005.0 + rental_income: 2_005.0 + taxable_private_pension_income: 1_000.0 + rent: 19_000 + self_employment_income: 46_010 + business_is_qualified: true + business_is_sstb: true + w2_wages_from_qualified_business: 100e6 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + person2: + is_tax_unit_spouse: true + age: 67 + qualified_dividend_income: 1_005.0 + taxable_interest_income: 5_505.0 + long_term_capital_gains: 5_005.0 + rental_income: 2_005.0 + taxable_private_pension_income: 1_000.0 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + person3: + age: 11 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + person4: + age: 11 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + person5: + age: 11 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + snap: 0 # not in TAXSIM35 + tanf: 0 # not in TAXSIM35 + tax_units: + tax_unit: + members: [person1, person2, person3, person4, person5] + premium_tax_credit: 0 # not in TAXSIM35 + local_income_tax: 0 # not in TAXSIM35 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: IA + output: # expected ia_income_tax from patched TAXSIM35 2023-06-22 version + qbid_amount: [8_551.90, 0, 0, 0, 0] + qualified_business_income_deduction: 6_395.90 + ia_qbi_deduction: [3_197.95, 0, 0, 0, 0] + ia_income_tax: 2_648.36 + +- name: Tax unit with taxsimid 64550 in q21.its.csv and q21.ots.csv + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 59 + employment_income: 144_010 + social_security: 4_500 + real_estate_taxes: 24_000 + interest_expense: 4_000 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + person2: + is_tax_unit_spouse: true + age: 59 + employment_income: 157_010 + social_security: 4_500 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + spm_units: + spm_unit: + members: [person1, person2] + snap: 0 # not in TAXSIM35 + tanf: 0 # not in TAXSIM35 + tax_units: + tax_unit: + members: [person1, person2] + premium_tax_credit: 0 # not in TAXSIM35 + local_income_tax: 0 # not in TAXSIM35 + households: + household: + members: [person1, person2] + state_code: IA + output: # expected ia_income_tax from patched TAXSIM35 2023-06-23 version + ia_income_tax: 14_590.43 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_qbi_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_qbi_deduction.yaml index 53522f1a6..f68f36871 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_qbi_deduction.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_qbi_deduction.yaml @@ -1,7 +1,8 @@ - name: IA qualified business income (QBI) deduction unit test 1 period: 2021 input: - qbid_amount: 10_000 + qbid_amount: 11_000 + qualified_business_income_deduction: 10_000 state_code: IA output: ia_qbi_deduction: 5_000 @@ -9,7 +10,8 @@ - name: IA qualified business income (QBI) deduction unit test 2 period: 2022 input: - qbid_amount: 10_000 + qbid_amount: 11_000 + qualified_business_income_deduction: 10_000 state_code: IA output: ia_qbi_deduction: 7_500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml new file mode 100644 index 000000000..2ee3d72fc --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/credits/id_ctc.yaml @@ -0,0 +1,23 @@ +- name: One child + period: 2022 + input: + ctc_qualifying_children: 1 + state_code: ID + output: + id_ctc: 205 + +- name: Family with 2 children + period: 2018 + input: + ctc_qualifying_children: 2 + state_code: ID + output: + id_ctc: 410 + +- name: No children + period: 2022 + input: + ctc_qualifying_children: 0 + state_code: ID + output: + id_ctc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_deductions.yaml new file mode 100644 index 000000000..413395f78 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_deductions.yaml @@ -0,0 +1,17 @@ +- name: Itemizes + period: 2023 + input: + itemized_deductions_less_salt: 1_000 + standard_deduction: 500 + state_code: ID + output: + id_deductions: 1_000 + +- name: Does not itemize + period: 2023 + input: + itemized_deductions_less_salt: 500 + standard_deduction: 1_000 + state_code: ID + output: + id_deductions: 1_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.yaml new file mode 100644 index 000000000..e836eb91b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.yaml @@ -0,0 +1,56 @@ +- name: Joint filers # ((10_000 - 9_974) * 0.045 + ((9_974 - 3_324) * 0.03) + (3_324 * 0.01) + period: 2023 + input: + state_code: ID + id_taxable_income: 10_000 + filing_status: JOINT + output: + id_income_tax_before_refundable_credits: 233.91 + +- name: Joint filers w/ no income + period: 2023 + input: + state_code: ID + id_taxable_income: 0 + filing_status: JOINT + output: + id_income_tax_before_refundable_credits: 0 + +- name: Single filers # ((3_000 - 1_662) * 0.03 + 1_662 * 0.01) + period: 2023 + input: + state_code: ID + id_taxable_income: 3_000 + filing_status: SINGLE + output: + id_income_tax_before_refundable_credits: 56.76 + +- name: Widow filers # ((10_000 - 9_974) * 0.045 + ((9_974 - 3_324) * 0.03) + (3_324 * 0.01) + period: 2023 + input: + state_code: ID + id_taxable_income: 10_000 + filing_status: WIDOW + output: + id_income_tax_before_refundable_credits: 233.91 + +- name: Head_of_Household filers # ((10_000 - 9_974) * 0.045 + ((9_974 - 3_324) * 0.03) + (3_324 * 0.01) + period: 2023 + input: + state_code: ID + id_taxable_income: 10_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + id_income_tax_before_refundable_credits: 233.91 + + +- name: Separate filers # ((3_000 - 1_662) * 0.03 + 1_662 * 0.01) + period: 2023 + input: + state_code: ID + id_taxable_income: 3_000 + filing_status: SEPARATE + output: + id_income_tax_before_refundable_credits: 56.76 + + diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..6cb57afb8 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_income_tax_before_refundable_credits.yaml @@ -0,0 +1,17 @@ +- name: Calculation + period: 2023 + input: + state_code: ID + id_income_tax_before_non_refundable_credits: 2_000 + id_non_refundable_credits: 500 + output: + id_income_tax_before_refundable_credits: 1_500 + +- name: Capped at 0 + period: 2023 + input: + state_code: NM + id_income_tax_before_non_refundable_credits: 200 + id_non_refundable_credits: 500 + output: + id_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml new file mode 100644 index 000000000..cf81b5a0b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/id/tax/income/id_taxable_income.yaml @@ -0,0 +1,17 @@ +- name: Idaho Deductions less than AGI + period: 2021 + input: + id_agi: 1_000 + id_deductions: 500 + state_code: ID + output: + id_taxable_income: 500 + +- name: Idaho Deductions exceeding AGI + period: 2022 + input: + id_agi: 500 + id_deductions: 1_000 + state_code: ID + output: + id_taxable_income: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_additional_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_additional_exemptions.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_additional_exemptions.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_additional_exemptions.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_aged_blind_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_aged_blind_exemptions.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_aged_blind_exemptions.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_aged_blind_exemptions.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_aged_low_agi_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_aged_low_agi_exemptions.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_aged_low_agi_exemptions.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_aged_low_agi_exemptions.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/taxes/in_agi_tax.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_agi_tax.yaml similarity index 68% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/taxes/in_agi_tax.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_agi_tax.yaml index 617d92bfb..5c911eda3 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/taxes/in_agi_tax.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_agi_tax.yaml @@ -13,3 +13,11 @@ in_agi: 10_000 output: in_agi_tax: 10_000 * 0.0323 + +- name: negative AGI + period: 2022 + input: + state_code: IN + in_agi: -900 + output: + in_agi_tax: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_base_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_base_exemptions.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_base_exemptions.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_base_exemptions.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml new file mode 100644 index 000000000..89d056395 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc.yaml @@ -0,0 +1,34 @@ +- name: in_eitc unit test 1 + absolute_error_margin: 0.01 + period: 2022 + input: + gov.states.in.tax.income.credits.earned_income.decoupled: false + state_code: IN + earned_income_tax_credit: 100 + in_eitc_eligible: true + output: + in_eitc: 10 + +- name: in_eitc unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + gov.states.in.tax.income.credits.earned_income.decoupled: true + state_code: IN + in_eitc_eligible: true + eitc_child_count: 0 + employment_income: 8_000 + output: + in_eitc: 0.09 * 545 + +- name: in_eitc unit test 3 + absolute_error_margin: 0.01 + period: 2021 + input: + gov.states.in.tax.income.credits.earned_income.decoupled: true + state_code: IN + in_eitc_eligible: true + eitc_child_count: 3 + employment_income: 19_500 + output: + in_eitc: 0.09 * 5_980 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc_eligible.yaml new file mode 100644 index 000000000..2469c6f2e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_eitc_eligible.yaml @@ -0,0 +1,77 @@ +- name: in_eitc_eligible unit test 1 + period: 2021 + input: + gov.states.in.tax.income.credits.earned_income.decoupled: true + state_code: IN + earned_income_tax_credit: 999 + filing_status: SINGLE + eitc_child_count: 0 + age_head: 64 + dividend_income: 3_600 + output: + in_eitc_eligible: true + +- name: in_eitc_eligible unit test 2 + period: 2021 + input: + gov.states.in.tax.income.credits.earned_income.decoupled: true + state_code: IN + earned_income_tax_credit: 999 + filing_status: SEPARATE + eitc_child_count: 0 + age_head: 64 + dividend_income: 3_800 + output: + in_eitc_eligible: false + +- name: in_eitc_eligible unit test 3 + period: 2021 + input: + gov.states.in.tax.income.credits.earned_income.decoupled: true + state_code: IN + earned_income_tax_credit: 999 + filing_status: SINGLE + eitc_child_count: 0 + age_head: 65 + dividend_income: 3_800 + output: + in_eitc_eligible: false + +- name: in_eitc_eligible unit test 4 + period: 2021 + input: + gov.states.in.tax.income.credits.earned_income.decoupled: true + state_code: IN + earned_income_tax_credit: 999 + filing_status: SINGLE + eitc_child_count: 0 + age_head: 64 + dividend_income: 3_801 + output: + in_eitc_eligible: false + +- name: in_eitc_eligible unit test 5 + period: 2021 + input: + gov.states.in.tax.income.credits.earned_income.decoupled: true + state_code: IN + earned_income_tax_credit: 0 + filing_status: SINGLE + eitc_child_count: 0 + age_head: 64 + dividend_income: 3_800 + output: + in_eitc_eligible: false + +- name: in_eitc_eligible unit test 6 + period: 2021 + input: + gov.states.in.tax.income.credits.earned_income.decoupled: false + state_code: IN + earned_income_tax_credit: 999 + filing_status: SEPARATE + eitc_child_count: 0 + age_head: 65 + dividend_income: 3_801 + output: + in_eitc_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_exemptions.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_exemptions.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_exemptions.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_homeowners_property.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_homeowners_property_tax_deduction.yaml similarity index 83% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_homeowners_property.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_homeowners_property_tax_deduction.yaml index 50802b120..f21d05ec2 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_homeowners_property.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_homeowners_property_tax_deduction.yaml @@ -3,7 +3,7 @@ input: state_code: IN filing_status: JOINT - in_homeowners_property_tax: 2_000 + real_estate_taxes: 2_000 output: in_homeowners_property_tax_deduction: 2_000 @@ -12,6 +12,6 @@ input: state_code: IN filing_status: SEPARATE - in_homeowners_property_tax: 2_000 + real_estate_taxes: 2_000 output: in_homeowners_property_tax_deduction: 1_250 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_is_qualifying_dependent_child.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_is_qualifying_dependent_child.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_military_service.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_military_service_deduction.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_military_service.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_military_service_deduction.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_nonpublic_school_deduction.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_nonpublic_school_deduction.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_refundable_credits.yaml new file mode 100644 index 000000000..1c53bff36 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_refundable_credits.yaml @@ -0,0 +1,8 @@ +- name: in_refundable_credits unit test 1 + period: 2022 + input: + state_code: IN + in_eitc: 300 + in_unified_elderly_tax_credit: 200 + output: + in_refundable_credits: 500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_renters.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_renters_deduction.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_renters.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_renters_deduction.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_unemployment_compensation.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_unemployment_compensation_deduction.yaml similarity index 100% rename from fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/deductions/in_unemployment_compensation.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_unemployment_compensation_deduction.yaml diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_unified_elderly_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_unified_elderly_tax_credit.yaml new file mode 100644 index 000000000..4f1b64264 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/in/tax/income/in_unified_elderly_tax_credit.yaml @@ -0,0 +1,123 @@ +- name: in_unified_elderly_credit unit test 1 + period: 2022 + input: + adjusted_gross_income: 900 + age_head: 64 + age_spouse: 64 + state_code: IN + output: + in_unified_elderly_tax_credit: 0 + +- name: in_unified_elderly_credit unit test 2 + period: 2022 + input: + adjusted_gross_income: 900 + age_head: 65 + age_spouse: 64 + state_code: IN + output: + in_unified_elderly_tax_credit: 100 + +- name: in_unified_elderly_credit unit test 3 + period: 2022 + input: + adjusted_gross_income: 900 + age_head: 65 + age_spouse: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 140 + +- name: in_unified_elderly_credit unit test 4 + period: 2022 + input: + adjusted_gross_income: 2_900 + age_head: 65 + age_spouse: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 90 + +- name: in_unified_elderly_credit unit test 5 + period: 2022 + input: + adjusted_gross_income: 9_900 + age_head: 65 + age_spouse: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 80 + +- name: in_unified_elderly_credit unit test 6 + period: 2021 + input: + adjusted_gross_income: 900 + age_head: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 100 + +- name: in_unified_elderly_credit unit test 7 + period: 2021 + input: + adjusted_gross_income: 2_900 + age_head: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 50 + +- name: in_unified_elderly_credit unit test 8 + period: 2021 + input: + adjusted_gross_income: 9_900 + age_head: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 40 + +- name: in_unified_elderly_credit unit test 4 + period: 2022 + input: + adjusted_gross_income: 2_900 + age_head: 65 + age_spouse: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 90 + +- name: in_unified_elderly_credit unit test 5 + period: 2022 + input: + adjusted_gross_income: 9_900 + age_head: 65 + age_spouse: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 80 + +- name: in_unified_elderly_credit unit test 6 + period: 2021 + input: + adjusted_gross_income: 900 + age_head: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 100 + +- name: in_unified_elderly_credit unit test 7 + period: 2021 + input: + adjusted_gross_income: 2_900 + age_head: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 50 + +- name: in_unified_elderly_credit unit test 8 + period: 2021 + input: + adjusted_gross_income: 9_900 + age_head: 65 + state_code: IN + output: + in_unified_elderly_tax_credit: 40 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/dependent_care_credit/ky_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/dependent_care_credit/ky_cdcc.yaml new file mode 100644 index 000000000..32bc0bb78 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/dependent_care_credit/ky_cdcc.yaml @@ -0,0 +1,15 @@ +- name: Single filer with 10k of income + period: 2023 + input: + state_code: KY + cdcc: 10_000 + output: + ky_cdcc: 2_000 + +- name: No income + period: 2021 + input: + state_code: KY + cdcc: 0 + output: + ky_cdcc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_family_size_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_family_size_tax_credit.yaml new file mode 100644 index 000000000..650f0609a --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_family_size_tax_credit.yaml @@ -0,0 +1,17 @@ +- name: 20% rate + period: 2023 + input: + state_code: KY + ky_family_size_tax_credit_rate: 0.2 + ky_income_tax_before_non_refundable_credits: 1_000 + output: + ky_family_size_tax_credit: 200 + +- name: 0% rate + period: 2023 + input: + state_code: KY + ky_family_size_tax_credit_rate: 0 + ky_income_tax_before_non_refundable_credits: 1_000 + output: + ky_family_size_tax_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_family_size_tax_credit_rate.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_family_size_tax_credit_rate.yaml new file mode 100644 index 000000000..f1c631fd9 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_family_size_tax_credit_rate.yaml @@ -0,0 +1,39 @@ +- name: No income + period: 2023 + input: + state_code: KY + ky_modified_agi: 0 + state_group: CONTIGUOUS_US + tax_unit_size: 1 + output: + ky_family_size_tax_credit_rate: 1 + +- name: One person with income at fpg + period: 2022 + input: + state_code: KY + ky_modified_agi: 13_590 + state_group: CONTIGUOUS_US + tax_unit_size: 1 + output: + ky_family_size_tax_credit_rate: 1 + +- name: Seven person, capped at 4 # fpg = 13_590 + 3 * 4_720 = 27_750, 119% + period: 2022 + input: + state_code: KY + ky_modified_agi: 33_000 + state_group: CONTIGUOUS_US + tax_unit_size: 7 + output: + ky_family_size_tax_credit_rate: 0.5 + +- name: Three people with income over fpg + period: 2022 + input: + state_code: KY + ky_modified_agi: 50_000 + state_group: CONTIGUOUS_US + tax_unit_size: 3 + output: + ky_family_size_tax_credit_rate: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_modified_agi.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_modified_agi.yaml new file mode 100644 index 000000000..4026e93f8 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/credits/family_size_tax_credit/ky_modified_agi.yaml @@ -0,0 +1,19 @@ +- name: State AGI over federal AGI + period: 2023 + input: + state_code: KY + adjusted_gross_income: 900 + form_4972_lumpsum_distributions: 10 + ky_agi: 1_000 + output: + ky_modified_agi: 1_010 + +- name: State AGI under federal AGI + period: 2023 + input: + state_code: KY + adjusted_gross_income: 2_000 + form_4972_lumpsum_distributions: 10 + ky_agi: 1_000 + output: + ky_modified_agi: 2_010 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/deductions/ky_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/deductions/ky_standard_deduction.yaml new file mode 100644 index 000000000..8522f8e53 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/deductions/ky_standard_deduction.yaml @@ -0,0 +1,13 @@ +- name: 2022 deduction + period: 2022 + input: + state_code: KY + output: + ky_standard_deduction: 2_770 + +- name: 2021 deduction + period: 2021 + input: + state_code: KY + output: + ky_standard_deduction: 2_690 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/ky_income_tax_before_non_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/ky_income_tax_before_non_refundable_credits.yaml new file mode 100644 index 000000000..9cb9a9eb9 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/ky_income_tax_before_non_refundable_credits.yaml @@ -0,0 +1,31 @@ +- name: No income + period: 2023 + input: + ky_taxable_income: 0 + state_code: KY + output: + ky_income_tax_before_non_refundable_credits: 0 + +- name: 2023 tax rate + period: 2023 + input: + ky_taxable_income: 1_000 + state_code: KY + output: + ky_income_tax_before_non_refundable_credits: 45 + +- name: 2022 tax rate + period: 2022 + input: + ky_taxable_income: 1_000 + state_code: KY + output: + ky_income_tax_before_non_refundable_credits: 50 + +- name: 2021 tax rate + period: 2021 + input: + ky_taxable_income: 1_000 + state_code: KY + output: + ky_income_tax_before_non_refundable_credits: 50 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/ky_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/ky_income_tax_before_refundable_credits.yaml index 8bc4f7554..ef02ef52c 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/ky_income_tax_before_refundable_credits.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ky/tax/income/ky_income_tax_before_refundable_credits.yaml @@ -1,23 +1,18 @@ -- name: No income +- name: Subtractions period: 2023 input: - ky_taxable_income: 0 + ky_income_tax_before_non_refundable_credits: 1_100 state_code: KY + ky_non_refundable_credits: 1_000 output: - ky_income_tax_before_refundable_credits: 0 + ky_income_tax_before_refundable_credits: 100 -- name: 2023 tax rate +- name: Capped at 0 period: 2023 input: - ky_taxable_income: 1_000 + ky_income_tax_before_non_refundable_credits: 1_000 state_code: KY + ky_non_refundable_credits: 1_100 output: - ky_income_tax_before_refundable_credits: 45 + ky_income_tax_before_refundable_credits: 0 -- name: 2022 tax rate - period: 2022 - input: - ky_taxable_income: 1_000 - state_code: KY - output: - ky_income_tax_before_refundable_credits: 50 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/la/tax/income/la_agi_subtractions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/la/tax/income/la_agi_subtractions.yaml deleted file mode 100644 index b3ef8033c..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/states/la/tax/income/la_agi_subtractions.yaml +++ /dev/null @@ -1,16 +0,0 @@ -- name: LA subtractions from income - period: 2021 - absolute_error_margin: 0 - input: - filing_status: SINGLE - adjusted_gross_income: 100_000 - us_govt_interest: 1_000 - tax_unit_taxable_social_security: 1_000 - la_state_employee_retirement_benefits: 1_000 - la_state_teacher_retirement_benefits: 1_000 - la_federal_retirement_benefits: 1_000 - la_other_subtractions: 1_000 - la_exemptions: 0 - state_code: LA - output: - la_taxable_income: 94_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc.yaml new file mode 100644 index 000000000..82dae1085 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc.yaml @@ -0,0 +1,171 @@ +- name: 2023 one eligible child and one disbaled eligible child + period: 2023 + input: + people: + head: {} + child_1: + age: 5 + is_tax_unit_dependent: true + is_disabled: false + child_2: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + tax_units: + tax_unit: + members: [head, child_1, child_2] + adjusted_gross_income: 200 + households: + household: + members: [head, child_1, child_2] + state_code: MD + output: + md_ctc: 1_000 + +- name: 2023 one eligible child and one disbaled eligible child + period: 2023 + input: + people: + head: {} + child_1: + age: 5 + is_tax_unit_dependent: true + is_disabled: false + child_2: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + tax_units: + tax_unit: + members: [head, child_1, child_2] + adjusted_gross_income: 200 + ctc: 200 + households: + household: + members: [head, child_1, child_2] + state_code: MD + output: + md_ctc: 1_000 + +- name: 2023 no eligible children + period: 2023 + input: + people: + head: {} + child_1: + age: 6 + is_tax_unit_dependent: true + is_disabled: false + child_2: + age: 17 + is_tax_unit_dependent: true + is_disabled: true + tax_units: + tax_unit: + members: [head, child_1, child_2] + adjusted_gross_income: 200 + households: + household: + members: [head, child_1, child_2] + state_code: MD + output: + md_ctc: 0 + +- name: 2023 AGI ineligible + period: 2023 + input: + people: + head: {} + child_1: + age: 5 + is_tax_unit_dependent: true + is_disabled: false + child_2: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + tax_units: + tax_unit: + members: [head, child_1, child_2] + adjusted_gross_income: 15_001 + households: + household: + members: [head, child_1, child_2] + state_code: MD + output: + md_ctc: 0 + +- name: 2021 one eligible child and no ctc + period: 2021 + input: + people: + head: {} + child_1: + age: 5 + is_tax_unit_dependent: true + is_disabled: false + child_2: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + tax_units: + tax_unit: + members: [head, child_1, child_2] + adjusted_gross_income: 200 + ctc: 0 + households: + household: + members: [head, child_1, child_2] + state_code: MD + output: + md_ctc: 500 + +- name: 2021 one eligible child and full ctc + period: 2021 + input: + people: + head: {} + child_1: + age: 5 + is_tax_unit_dependent: true + is_disabled: false + child_2: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + tax_units: + tax_unit: + members: [head, child_1, child_2] + adjusted_gross_income: 200 + ctc: 510 + households: + household: + members: [head, child_1, child_2] + state_code: MD + output: + md_ctc: 0 + +- name: 2021 two eligible children and some ctc + period: 2021 + input: + people: + head: {} + child_1: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + child_2: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + tax_units: + tax_unit: + members: [head, child_1, child_2] + adjusted_gross_income: 200 + ctc: 510 + households: + household: + members: [head, child_1, child_2] + state_code: MD + output: + md_ctc: 490 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.yaml new file mode 100644 index 000000000..ac766e74d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.yaml @@ -0,0 +1,31 @@ +- name: 2021 ineligible + period: 2021 + input: + adjusted_gross_income: 6_001 + state_code: MD + output: + md_ctc_eligible: false + +- name: 2021 eligible + period: 2021 + input: + adjusted_gross_income: 6_000 + state_code: MD + output: + md_ctc_eligible: true + +- name: 2023 ineligible + period: 2023 + input: + adjusted_gross_income: 15_001 + state_code: MD + output: + md_ctc_eligible: false + +- name: 2023 eligible + period: 2023 + input: + adjusted_gross_income: 15_000 + state_code: MD + output: + md_ctc_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/md_ctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/md_ctc.yaml deleted file mode 100644 index 5398ce0e1..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/md_ctc.yaml +++ /dev/null @@ -1,23 +0,0 @@ -- name: Two eligible children. - period: 2021 - input: - people: - head: {} - child_1: - age: 10 - is_tax_unit_dependent: true - is_disabled: 1 - child_2: - age: 5 - is_tax_unit_dependent: true - is_disabled: 1 - tax_units: - tax_unit: - members: [head, child_1, child_2] - adjusted_gross_income: 200 - households: - household: - members: [head, child_1, child_2] - state_code: MD - output: - md_ctc: 1_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.yaml new file mode 100644 index 000000000..4d0a92820 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.yaml @@ -0,0 +1,107 @@ +- name: Single ineligible by income. + period: 2023 + input: + filing_status: SINGLE + adjusted_gross_income: 100_000 + state_code: MD + age_head: 65 + output: + md_senior_tax_credit: 0 + +- name: Single ineligible by age. + period: 2023 + input: + filing_status: SINGLE + adjusted_gross_income: 99_999 + age_head: 64 + state_code: MD + output: + md_senior_tax_credit: 0 + +- name: Joint ineligible by income. + period: 2023 + input: + filing_status: JOINT + adjusted_gross_income: 150_000 + state_code: MD + age_head: 65 + age_spouse: 65 + output: + md_senior_tax_credit: 0 + +- name: Joint ineligible by age. + period: 2023 + input: + filing_status: JOINT + adjusted_gross_income: 149_999 + state_code: MD + age_head: 64 + age_spouse: 64 + output: + md_senior_tax_credit: 0 + +- name: Joint one aged eligible. + period: 2023 + input: + filing_status: JOINT + adjusted_gross_income: 149_999 + state_code: MD + age_head: 65 + age_spouse: 64 + output: + md_senior_tax_credit: 1_000 + + +- name: Joint two aged eligible. + period: 2023 + input: + filing_status: JOINT + adjusted_gross_income: 149_999 + state_code: MD + age_head: 65 + age_spouse: 65 + output: + md_senior_tax_credit: 1_750 + +- name: Widow eligible. + period: 2023 + input: + filing_status: WIDOW + adjusted_gross_income: 149_999 + state_code: MD + age_head: 65 + output: + md_senior_tax_credit: 1_750 + +- name: Head of household no spouse eligible. + period: 2023 + input: + filing_status: WIDOW + adjusted_gross_income: 149_999 + state_code: MD + age_head: 65 + output: + md_senior_tax_credit: 1_750 + +- name: Head of household with spouse both aged eligible. + period: 2023 + input: + filing_status: WIDOW + adjusted_gross_income: 149_999 + state_code: MD + age_head: 65 + age_spouse: 65 + output: + md_senior_tax_credit: 1_750 + +- name: Head of household with spouse one aged eligible. + period: 2023 + input: + filing_status: WIDOW + adjusted_gross_income: 149_999 + state_code: MD + age_head: 65 + age_spouse: 64 + output: + md_senior_tax_credit: 1_750 + diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit_eligible.yaml new file mode 100644 index 000000000..c86331293 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit_eligible.yaml @@ -0,0 +1,35 @@ +- name: Single ineligible by income. + period: 2023 + input: + filing_status: SINGLE + adjusted_gross_income: 100_000 + state_code: MD + output: + md_senior_tax_credit_eligible: false + +- name: Head of hosuehold eligible by income. + period: 2023 + input: + filing_status: HEAD_OF_HOUSEHOLD + adjusted_gross_income: 149_999 + state_code: MD + output: + md_senior_tax_credit_eligible: true + +- name: Joint ineligible by income. + period: 2023 + input: + filing_status: JOINT + adjusted_gross_income: 150_000 + state_code: MD + output: + md_senior_tax_credit_eligible: false + +- name: Joint ineligible by age. + period: 2023 + input: + filing_status: JOINT + adjusted_gross_income: 149_999 + state_code: MD + output: + md_senior_tax_credit_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_deduction.yaml deleted file mode 100644 index e7fe1c79e..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_deduction.yaml +++ /dev/null @@ -1,45 +0,0 @@ -- name: Maine deduction given Single status, income of $80k means deduction won't be limited - period: 2022 - absolute_error_margin: 0 - input: - me_agi: 80_000 - state_code: ME - filing_status: SINGLE - output: - me_itemized_deductions: 0 - me_standard_deduction: 12_950 - me_deduction: 12_950 - -- name: Outside Maine, no Maine deductions - period: 2022 - absolute_error_margin: 0 - input: - state_code: NY - filing_status: SINGLE - output: - me_deduction: 0 - -- name: Maine deduction given Head of Household status, income of $300k means deduction will be fully phased out - period: 2022 - absolute_error_margin: 0 - input: - me_agi: 300_000 - state_code: ME - filing_status: HEAD_OF_HOUSEHOLD - output: - me_itemized_deductions: 0 - me_standard_deduction: 19_400 - me_deduction: 0 - -- name: Maine deduction given Head of Widow status, income of $200k means deduction will be partially phased out - period: 2022 - absolute_error_margin: 0.01 - input: - me_agi: 200_000 - state_code: ME - filing_status: WIDOW - output: - me_itemized_deductions: 0 - me_standard_deduction: 25_900 - me_deduction: 21_013.53 - diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_standard_deduction.yaml deleted file mode 100644 index 57c4fac77..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_standard_deduction.yaml +++ /dev/null @@ -1,39 +0,0 @@ -- name: Maine standard deduction given Single status - period: 2022 - absolute_error_margin: 0 - input: - me_agi: 80_000 - state_code: ME - filing_status: SINGLE - output: - me_standard_deduction: 12_950 - -- name: Outside Maine, no Maine deductions - period: 2022 - absolute_error_margin: 0 - input: - state_code: NY - filing_status: SINGLE - output: - me_deduction: 0 - -- name: Maine deduction given Head of Household status - period: 2022 - absolute_error_margin: 0 - input: - me_agi: 300_000 - state_code: ME - filing_status: HEAD_OF_HOUSEHOLD - output: - me_standard_deduction: 19_400 - -- name: Maine deduction given Head of Widow status - period: 2022 - absolute_error_margin: 0.01 - input: - me_agi: 200_000 - state_code: ME - filing_status: WIDOW - output: - me_standard_deduction: 25_900 - diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..ef7a6e51a --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_income_tax_before_refundable_credits.yaml @@ -0,0 +1,29 @@ +- name: Outside Maine, Maine income tax should be zero + period: 2022 + absolute_error_margin: 0 + input: + state_code: NY + me_income_tax_before_credits: 1_000 + me_non_refundable_credits: 500 + output: + me_income_tax_before_refundable_credits: 0 + +- name: Tax before credits minus credits. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_income_tax_before_credits: 1_000 + me_non_refundable_credits: 500 + output: + me_income_tax_before_refundable_credits: 500 + +- name: Tax is nonnegative. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_income_tax_before_credits: 500 + me_non_refundable_credits: 1_000 + output: + me_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_non_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_non_refundable_credits.yaml new file mode 100644 index 000000000..f78d78f25 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_non_refundable_credits.yaml @@ -0,0 +1,9 @@ +- name: + period: 2022 + absolute_error_margin: 0 + input: + me_dependent_exemption: 1 + me_non_refundable_child_care_credit: 2 + state_code: ME + output: + me_non_refundable_credits: 3 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_refundable_credits.yaml new file mode 100644 index 000000000..d6508c038 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/me_refundable_credits.yaml @@ -0,0 +1,9 @@ +- name: + period: 2022 + absolute_error_margin: 0 + input: + me_refundable_child_care_credit: 1 + me_eitc: 2 + state_code: ME + output: + me_refundable_credits: 3 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_deduction_phaseout_percentage.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_deduction_phaseout_percentage.yaml new file mode 100644 index 000000000..9bcaabeaa --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_deduction_phaseout_percentage.yaml @@ -0,0 +1,159 @@ +- name: Phaseout percent is zero outside of Maine. + period: 2022 + absolute_error_margin: 0 + input: + state_code: NY + me_agi: 100_000 + filing_status: SINGLE + output: + me_deduction_phaseout_percentage: 0 + +- name: Phaseout percent is zero for single filer with income before phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 85_849 + filing_status: SINGLE + output: + me_deduction_phaseout_percentage: 0 + +- name: Phaseout percent is zero for separate filer with income before phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 85_849 + filing_status: SEPARATE + output: + me_deduction_phaseout_percentage: 0 + +- name: Phaseout percent is zero for head of household filer with income before phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 128_749 + filing_status: HEAD_OF_HOUSEHOLD + output: + me_deduction_phaseout_percentage: 0 + +- name: Phaseout percent is zero for joint filer with income before phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 171_699 + filing_status: JOINT + output: + me_deduction_phaseout_percentage: 0 + +- name: Phaseout percent is zero for widow filer with income before phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 171_699 + filing_status: WIDOW + output: + me_deduction_phaseout_percentage: 0 + +- name: Phaseout percent is (income - phaseout_start) / phaseout_width for single filer with income above phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 100_850 + filing_status: SINGLE + output: + me_deduction_phaseout_percentage: 0.2 # (100,850-85,850)/75,000 + +- name: Phaseout percent is (income - phaseout_start) / phaseout_width for separate filer with income above phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 100_850 + filing_status: SEPARATE + output: + me_deduction_phaseout_percentage: 0.2 # (100,850-85,850)/75,000 + +- name: Phaseout percent is (income - phaseout_start) / phaseout_width for head of household filer with income above phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 146_750 + filing_status: HEAD_OF_HOUSEHOLD + output: + me_deduction_phaseout_percentage: 0.16 # (146,750-128,750)/112,500 + +- name: Phaseout percent is (income - phaseout_start) / phaseout_width for joint filer with income above phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 195_700 + filing_status: JOINT + output: + me_deduction_phaseout_percentage: 0.16 # (195,700-171,700)/150,000 + +- name: Phaseout percent is (income - phaseout_start) / phaseout_width for widow filer with income above phaseout start. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 195_700 + filing_status: WIDOW + output: + me_deduction_phaseout_percentage: 0.16 # (195,700-171,700)/150,000 + +- name: Phaseout percent is capped at 1. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 160_851 + filing_status: SINGLE + output: + me_deduction_phaseout_percentage: 1 + +- name: Phaseout percent is capped at 1. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 160_851 + filing_status: SEPARATE + output: + me_deduction_phaseout_percentage: 1 + +- name: Phaseout percent is capped at 1. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 241_251 + filing_status: HEAD_OF_HOUSEHOLD + output: + me_deduction_phaseout_percentage: 1 + +- name: Phaseout percent is capped at 1. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 321_701 + filing_status: JOINT + output: + me_deduction_phaseout_percentage: 1 + +- name: Phaseout percent is capped at 1. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 321_701 + filing_status: WIDOW + output: + me_deduction_phaseout_percentage: 1 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_deductions.yaml new file mode 100644 index 000000000..8a45e703c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_deductions.yaml @@ -0,0 +1,32 @@ +- name: Maine deduction is $0 outside of Maine. + period: 2022 + absolute_error_margin: 0 + input: + state_code: NY + me_deduction_phaseout_percentage: 0.40 + standard_deduction: 20_000 + me_itemized_deductions_pre_phaseout: 25_000 + output: + me_deductions: 0 + +- name: Maine deduction is itemized deductions minus phaseout. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_deduction_phaseout_percentage: 0.40 + standard_deduction: 20_000 + me_itemized_deductions_pre_phaseout: 25_000 + output: + me_deductions: 15_000 + +- name: Maine deduction is standard deduction minus phaseout. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_deduction_phaseout_percentage: 0.90 + standard_deduction: 25_000 + me_itemized_deductions_pre_phaseout: 20_000 + output: + me_deductions: 2_500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_dependent_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_dependent_exemption.yaml similarity index 95% rename from fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_dependent_exemption.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_dependent_exemption.yaml index e937cab27..55dd9baf2 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_dependent_exemption.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_dependent_exemption.yaml @@ -1,59 +1,59 @@ -- name: Married filing jointly with two dependents, earning $450K gets $225 exemption. - period: 2022 - input: - state_code: ME - me_agi: 450_000 - filing_status: JOINT - tax_unit_dependents: 2 - output: - me_dependent_exemption: 225 - -- name: Married filing jointly with two dependents, earning $449.50K gets $225 exemption. - period: 2022 - input: - state_code: ME - me_agi: 449_500 - filing_status: JOINT - tax_unit_dependents: 2 - output: - me_dependent_exemption: 225 - -- name: Single filer with one dependent, earning $450K gets $0 exemption. - period: 2022 - input: - state_code: ME - me_agi: 450_000 - filing_status: SINGLE - tax_unit_dependents: 1 - output: - me_dependent_exemption: 0 - -- name: Joint filer with no dependent gets $0 exemption. - period: 2022 - input: - state_code: ME - me_agi: 450_000 - filing_status: JOINT - tax_unit_dependents: 0 - output: - me_dependent_exemption: 0 - -- name: Single filer with two dependents, earning $190K gets $600 exemption. - period: 2022 - input: - state_code: ME - me_agi: 190_000 - filing_status: SINGLE - tax_unit_dependents: 2 - output: - me_dependent_exemption: 600 - -- name: Single filer with two dependents, earning $220k gets $450 exemption. - period: 2022 - input: - state_code: ME - me_agi: 220_000 - filing_status: SINGLE - tax_unit_dependents: 2 - output: - me_dependent_exemption: 450 +- name: Married filing jointly with two dependents, earning $450K gets $225 exemption. + period: 2022 + input: + state_code: ME + me_agi: 450_000 + filing_status: JOINT + tax_unit_dependents: 2 + output: + me_dependent_exemption: 225 + +- name: Married filing jointly with two dependents, earning $449.50K gets $225 exemption. + period: 2022 + input: + state_code: ME + me_agi: 449_500 + filing_status: JOINT + tax_unit_dependents: 2 + output: + me_dependent_exemption: 225 + +- name: Single filer with one dependent, earning $450K gets $0 exemption. + period: 2022 + input: + state_code: ME + me_agi: 450_000 + filing_status: SINGLE + tax_unit_dependents: 1 + output: + me_dependent_exemption: 0 + +- name: Joint filer with no dependent gets $0 exemption. + period: 2022 + input: + state_code: ME + me_agi: 450_000 + filing_status: JOINT + tax_unit_dependents: 0 + output: + me_dependent_exemption: 0 + +- name: Single filer with two dependents, earning $190K gets $600 exemption. + period: 2022 + input: + state_code: ME + me_agi: 190_000 + filing_status: SINGLE + tax_unit_dependents: 2 + output: + me_dependent_exemption: 600 + +- name: Single filer with two dependents, earning $220k gets $450 exemption. + period: 2022 + input: + state_code: ME + me_agi: 220_000 + filing_status: SINGLE + tax_unit_dependents: 2 + output: + me_dependent_exemption: 450 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions_pre_phaseout.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions_pre_phaseout.yaml new file mode 100644 index 000000000..8ba73914e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions_pre_phaseout.yaml @@ -0,0 +1,101 @@ +- name: Maine deduction is $0 outside of Maine. + period: 2022 + absolute_error_margin: 0 + input: + people: + person1: + real_estate_taxes: 1_000 + tax_units: + tax_unit: + members: [person1] + tax_unit_itemizes: true + medical_expense_deduction: 500 + charitable_deduction: 10_000 + salt_deduction: 1_000 + households: + household: + members: [person1] + state_code: NY + output: + me_itemized_deductions_pre_phaseout: 0 + +- name: Maine itemized deduction is federal itemized deduction plus real estate taxes, minus SALT. + period: 2022 + absolute_error_margin: 0 + input: + people: + person1: + real_estate_taxes: 1_000 + tax_units: + tax_unit: + members: [person1] + tax_unit_itemizes: true + medical_expense_deduction: 500 # part of federal itemized deduction + charitable_deduction: 10_000 # part of federal itemized deduction + salt_deduction: 10 + households: + household: + members: [person1] + state_code: ME + output: + me_itemized_deductions_pre_phaseout: 11_500 + +- name: Maine itemized deduction is $0 if tax unit does not itemize on federal return. + period: 2022 + absolute_error_margin: 0 + input: + people: + person1: + real_estate_taxes: 1_000 + tax_units: + tax_unit: + members: [person1] + tax_unit_itemizes: false + medical_expense_deduction: 500 + charitable_deduction: 10_000 + households: + household: + members: [person1] + state_code: ME + output: + me_itemized_deductions_pre_phaseout: 0 + +- name: Maine itemized deduction is capped. + period: 2022 + absolute_error_margin: 0 + input: + people: + person1: + real_estate_taxes: 0 + tax_units: + tax_unit: + members: [person1] + tax_unit_itemizes: true + medical_expense_deduction: 0 + charitable_deduction: 31_151 # part of federal itemized deduction + households: + household: + members: [person1] + state_code: ME + output: + me_itemized_deductions_pre_phaseout: 31_150 + +- name: Maine itemized deduction is capped at $31,150 before medical expenses. + period: 2022 + absolute_error_margin: 0 + input: + people: + person1: + real_estate_taxes: 1_000 + tax_units: + tax_unit: + members: [person1] + tax_unit_itemizes: true + medical_expense_deduction: 5_000 + charitable_deduction: 40_000 + households: + household: + members: [person1] + state_code: ME + output: + me_itemized_deductions_pre_phaseout: 36_150 # cap of $31,150 + $5,000 medical expenses diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_personal_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_personal_exemption.yaml similarity index 96% rename from fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_personal_exemption.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_personal_exemption.yaml index fa7f47d50..73b3bfb8d 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/deductions/me_personal_exemption.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/deductions/me_personal_exemption.yaml @@ -1,49 +1,49 @@ -- name: Outside Maine, no personal exemption. - period: 2022 - absolute_error_margin: 0 - input: - state_code: NY - filing_status: SINGLE - output: - me_personal_exemption_deduction: 0 - -- name: If $0 income, personal exemption is $4,450 in 2022. - period: 2022 - absolute_error_margin: 0 - input: - state_code: ME - me_agi: 0 - filing_status: SINGLE - output: - me_personal_exemption_deduction: 4_450 - -- name: If you have an income below the phaseout start, you get the full personal exemption. - period: 2022 - absolute_error_margin: 0 - input: - state_code: ME - filing_status: SINGLE - me_agi: 279_500 - output: - me_personal_exemption_deduction: 4_450 - -- name: If you have an income between the phaseout start and end, you get a partial credit. - period: 2022 - absolute_error_margin: 0 - input: - state_code: ME - filing_status: SINGLE - me_agi: 400_000 - output: - # Excess = $120,500 / $125,000 = 0.964 - me_personal_exemption_deduction: 160.2 # $4,450 - $4,289.8 - -- name: High income filers get no personal exemption. - period: 2022 - absolute_error_margin: 0 - input: - state_code: ME - filing_status: SINGLE - me_agi: 404_500 # $279,500 + $125,000 = $404,500 - output: - me_personal_exemption_deduction: 0 +- name: Outside Maine, no personal exemption. + period: 2022 + absolute_error_margin: 0 + input: + state_code: NY + filing_status: SINGLE + output: + me_personal_exemption_deduction: 0 + +- name: If $0 income, personal exemption is $4,450 in 2022. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 0 + filing_status: SINGLE + output: + me_personal_exemption_deduction: 4_450 + +- name: If you have an income below the phaseout start, you get the full personal exemption. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + filing_status: SINGLE + me_agi: 279_500 + output: + me_personal_exemption_deduction: 4_450 + +- name: If you have an income between the phaseout start and end, you get a partial credit. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + filing_status: SINGLE + me_agi: 400_000 + output: + # Excess = $120,500 / $125,000 = 0.964 + me_personal_exemption_deduction: 160.2 # $4,450 - $4,289.8 + +- name: High income filers get no personal exemption. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + filing_status: SINGLE + me_agi: 404_500 # $279,500 + $125,000 = $404,500 + output: + me_personal_exemption_deduction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/me_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/me_taxable_income.yaml index f650ad507..1e8ffb4e5 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/me_taxable_income.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/me/tax/income/taxable_income/me_taxable_income.yaml @@ -1,8 +1,32 @@ -- name: Maine taxable income under the standard deduction. - period: 2022 - absolute_error_margin: 0 - input: - employment_income: 1_000 - state_code: ME - output: - me_taxable_income: 0 +- name: Maine taxable income is $0 outside of Maine. + period: 2022 + absolute_error_margin: 0 + input: + state_code: NY + me_agi: 50_000 + me_deductions: 15_000 + me_exemptions: 5_000 + output: + me_taxable_income: 0 + +- name: Maine taxable income is Maine AGI minus deductions and exemptions. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 50_000 + me_deductions: 15_000 + me_exemptions: 5_000 + output: + me_taxable_income: 30_000 + +- name: Maine taxable income should be capped from below at $0. + period: 2022 + absolute_error_margin: 0 + input: + state_code: ME + me_agi: 50_000 + me_deductions: 52_000 + me_exemptions: 5_000 + output: + me_taxable_income: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mi/tax/income/credits/mi_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mi/tax/income/credits/mi_eitc.yaml new file mode 100644 index 000000000..597b2a72f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mi/tax/income/credits/mi_eitc.yaml @@ -0,0 +1,23 @@ +- name: $1_000 EITC in 2022 # 6% + 22% rate + period: 2022 + input: + state_code: MI + earned_income_tax_credit: 1_000 + output: + mi_eitc: 300 + +- name: $1_000 EITC in 2023 + period: 2023 + input: + state_code: MI + earned_income_tax_credit: 1_000 + output: + mi_eitc: 300 + +- name: No EITC + period: 2023 + input: + state_code: MI + earned_income_tax_credit: 0 + output: + mi_eitc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mi/tax/income/exemptions/mi_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mi/tax/income/exemptions/mi_exemptions.yaml new file mode 100644 index 000000000..4ae73154f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mi/tax/income/exemptions/mi_exemptions.yaml @@ -0,0 +1,107 @@ +- name: no dependents, is not stillborn parent, not disabled, is not a dependent + period: 2022 + input: + tax_unit_size: 1 + state_code: MI + output: + mi_exemptions: 5_000 + +- name: 2 dependents, no stillborn parent, no disabled, is not a dependent + period: 2022 + input: + tax_unit_size: 3 + state_code: MI + output: # 5_000 * 3 + mi_exemptions: 15_000 + +- name: no dependents, is stillborn parent, not disabled, is not a dependent + period: 2022 + input: + tax_unit_size: 1 + tax_unit_stillborn_children: 1 + state_code: MI + output: # 5_000 + 5_000 + mi_exemptions: 10_000 + +- name: no dependents, is not stillborn parent, is disabled, is not a dependent + period: 2022 + input: + people: + person1: + is_disabled: true + tax_units: + tax_unit: + tax_unit_size: 1 + members: [person1] + household: + members: [person1] + state_code: MI + output: # 5_000 + 2_900 + mi_exemptions: 7_900 + +- name: no dependents, is not stillborn parent, is disabled, is disabled veteran, is not a dependent + period: 2022 + input: + people: + person1: + is_fully_disabled_service_connected_veteran: true + is_disabled: true + tax_units: + tax_unit: + tax_unit_size: 1 + members: [person1] + household: + members: [person1] + state_code: MI + output: # 5_000 + 2_900 + 400 + mi_exemptions: 8_300 + +- name: 1 dependent, no stillborn parent, 2 disabled, 1 disabled veteran, is not a dependent + period: 2022 + input: + people: + person1: + is_fully_disabled_service_connected_veteran: false + is_disabled: true + person2: + is_fully_disabled_service_connected_veteran: true + is_disabled: true + tax_units: + tax_unit: + tax_unit_size: 2 + members: [person1, person2] + household: + members: [person1, person2] + state_code: MI + output: # 5_000 * 2 + 2_900 * 2 + 400 + mi_exemptions: 16_200 + +- name: no dependents, is not stillborn parent, not disabled, is a dependent, single + period: 2021 + input: + tax_unit_size: 1 + dsi: true + filing_status: SINGLE + state_code: MI + output: + mi_exemptions: 1_500 + +- name: no dependents, is not stillborn parent, not disabled, is a dependent, married + period: 2021 + input: + tax_unit_size: 1 + dsi: true + filing_status: JOINT + state_code: MI + output: + mi_exemptions: 3_000 + +- name: no dependents, is not stillborn parent, not disabled, is a dependent, single + period: 2022 + input: + tax_unit_size: 1 + dsi: true + filing_status: SINGLE + state_code: MI + output: + mi_exemptions: 1_500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction/mo_pension_and_ss_or_ssd_deduction_section_b.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction/mo_pension_and_ss_or_ssd_deduction_section_b.yaml index 9adc44742..62e2ec980 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction/mo_pension_and_ss_or_ssd_deduction_section_b.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction/mo_pension_and_ss_or_ssd_deduction_section_b.yaml @@ -1,107 +1,107 @@ -- name: No Values - period: 2021 - absolute_error_margin: 0 - input: - mo_adjusted_gross_income: 0 - tax_unit_taxable_social_security: 0 - filing_status: 0 - taxable_private_pension_income: 0 - state_code: MO - output: - mo_pension_and_ss_or_ssd_deduction_section_b: 0.0 - -- name: AGI below threshold, private pension income, taxable social security income, single - period: 2021 - absolute_error_margin: 0 - input: - mo_adjusted_gross_income: 20_000 - tax_unit_taxable_social_security: 2_000 - filing_status: SINGLE - taxable_private_pension_income: 5_000 - state_code: MO - output: - mo_pension_and_ss_or_ssd_deduction_section_b: 5_000 - -- name: AGI below threshold, private pension income, no taxable social security income, single - period: 2021 - absolute_error_margin: 0 - input: - mo_adjusted_gross_income: 20_000 - tax_unit_taxable_social_security: 0 - filing_status: SINGLE - taxable_private_pension_income: 5_000 - state_code: MO - output: - mo_pension_and_ss_or_ssd_deduction_section_b: 5_000 - -- name: AGI below threshold, private pension income, taxable social security income, joint - period: 2021 - absolute_error_margin: 0 - input: - mo_adjusted_gross_income: 30_000 - tax_unit_taxable_social_security: 5_000 - filing_status: JOINT - taxable_private_pension_income: 10_000 - state_code: MO - output: - mo_pension_and_ss_or_ssd_deduction_section_b: 6_000 - -- name: AGI below threshold, private pension income, no taxable social security income, joint - period: 2021 - absolute_error_margin: 0 - input: - mo_adjusted_gross_income: 30_000 - tax_unit_taxable_social_security: 0 - filing_status: JOINT - taxable_private_pension_income: 10_000 - state_code: MO - output: - mo_pension_and_ss_or_ssd_deduction_section_b: 6_000 - -- name: AGI above threshold, private pension income, taxable social security income, single - period: 2021 - absolute_error_margin: 0 - input: - mo_adjusted_gross_income: 40_000 - tax_unit_taxable_social_security: 5_000 - filing_status: SINGLE - taxable_private_pension_income: 10_000 - state_code: MO - output: - mo_pension_and_ss_or_ssd_deduction_section_b: 0.0 - -- name: AGI above threshold, private pension income, no taxable social security income, single - period: 2021 - absolute_error_margin: 0 - input: - mo_adjusted_gross_income: 40_000 - tax_unit_taxable_social_security: 0 - filing_status: SINGLE - taxable_private_pension_income: 10_000 - state_code: MO - output: - mo_pension_and_ss_or_ssd_deduction_section_b: 0.0 - -- name: AGI above threshold, private pension income, taxable social security income, joint - period: 2021 - absolute_error_margin: 0 - input: - mo_adjusted_gross_income: 40_000 - tax_unit_taxable_social_security: 5_000 - filing_status: JOINT - taxable_private_pension_income: 10_000 - state_code: MO - output: - mo_pension_and_ss_or_ssd_deduction_section_b: 0 - -- name: AGI above threshold, private pension income, no taxable social security income, joint - period: 2021 - absolute_error_margin: 0 - input: - mo_adjusted_gross_income: 40_000 - tax_unit_taxable_social_security: 0 - filing_status: JOINT - taxable_private_pension_income: 10_000 - state_code: MO - output: - mo_pension_and_ss_or_ssd_deduction_section_b: 0.0 +- name: No Values + period: 2021 + absolute_error_margin: 0 + input: + mo_adjusted_gross_income: 0 + tax_unit_taxable_social_security: 0 + filing_status: 0 + taxable_private_pension_income: 0 + state_code: MO + output: + mo_pension_and_ss_or_ssd_deduction_section_b: 0.0 + +- name: AGI below threshold, private pension income, taxable social security income, single + period: 2021 + absolute_error_margin: 0 + input: + mo_adjusted_gross_income: 20_000 + tax_unit_taxable_social_security: 2_000 + filing_status: SINGLE + taxable_private_pension_income: 5_000 + state_code: MO + output: + mo_pension_and_ss_or_ssd_deduction_section_b: 5_000 + +- name: AGI below threshold, private pension income, no taxable social security income, single + period: 2021 + absolute_error_margin: 0 + input: + mo_adjusted_gross_income: 20_000 + tax_unit_taxable_social_security: 0 + filing_status: SINGLE + taxable_private_pension_income: 5_000 + state_code: MO + output: + mo_pension_and_ss_or_ssd_deduction_section_b: 5_000 + +- name: AGI below threshold, private pension income, taxable social security income, joint + period: 2021 + absolute_error_margin: 0 + input: + mo_adjusted_gross_income: 30_000 + tax_unit_taxable_social_security: 5_000 + filing_status: JOINT + taxable_private_pension_income: 10_000 + state_code: MO + output: + mo_pension_and_ss_or_ssd_deduction_section_b: 6_000 + +- name: AGI below threshold, private pension income, no taxable social security income, joint + period: 2021 + absolute_error_margin: 0 + input: + mo_adjusted_gross_income: 30_000 + tax_unit_taxable_social_security: 0 + filing_status: JOINT + taxable_private_pension_income: 10_000 + state_code: MO + output: + mo_pension_and_ss_or_ssd_deduction_section_b: 6_000 + +- name: AGI above threshold, private pension income, taxable social security income, single + period: 2021 + absolute_error_margin: 0 + input: + mo_adjusted_gross_income: 40_000 + tax_unit_taxable_social_security: 5_000 + filing_status: SINGLE + taxable_private_pension_income: 10_000 + state_code: MO + output: + mo_pension_and_ss_or_ssd_deduction_section_b: 0.0 + +- name: AGI above threshold, private pension income, no taxable social security income, single + period: 2021 + absolute_error_margin: 0 + input: + mo_adjusted_gross_income: 40_000 + tax_unit_taxable_social_security: 0 + filing_status: SINGLE + taxable_private_pension_income: 10_000 + state_code: MO + output: + mo_pension_and_ss_or_ssd_deduction_section_b: 0.0 + +- name: AGI above threshold, private pension income, taxable social security income, joint + period: 2021 + absolute_error_margin: 0 + input: + mo_adjusted_gross_income: 40_000 + tax_unit_taxable_social_security: 5_000 + filing_status: JOINT + taxable_private_pension_income: 10_000 + state_code: MO + output: + mo_pension_and_ss_or_ssd_deduction_section_b: 3_000 + +- name: AGI above threshold, private pension income, no taxable social security income, joint + period: 2021 + absolute_error_margin: 0 + input: + mo_adjusted_gross_income: 40_000 + tax_unit_taxable_social_security: 0 + filing_status: JOINT + taxable_private_pension_income: 10_000 + state_code: MO + output: + mo_pension_and_ss_or_ssd_deduction_section_b: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.yaml index 7644103d6..e8707e5d5 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.yaml @@ -3,30 +3,39 @@ absolute_error_margin: 0 input: filing_status: SINGLE - state_and_local_sales_or_income_tax: 0 state_income_tax: 0 state_code: MO output: mo_net_state_income_taxes: 0.0 -- name: $13,000 state/local income/sales tax, 2,000 local earnings tax +- name: $23,000 state/local income/sales tax period: 2021 absolute_error_margin: 0.01 input: filing_status: SINGLE - state_and_local_sales_or_income_tax: 13_000 - state_income_tax: 11_000 + state_income_tax: 23_000 state_code: MO output: - mo_net_state_income_taxes: 8_461.538462 + mo_net_state_income_taxes: 10_000 -- name: $23,000 state/local income/sales tax, 0 local earnings tax +- name: property taxes without SALT cap period: 2021 absolute_error_margin: 0.01 input: filing_status: SINGLE - state_and_local_sales_or_income_tax: 23_000 - state_income_tax: 23_000 + real_estate_taxes: 4_000 + state_income_tax: 3_000 state_code: MO output: - mo_net_state_income_taxes: 10_000 + mo_net_state_income_taxes: 3_000 + +- name: property taxes with SALT cap + period: 2021 + absolute_error_margin: 0.01 + input: + filing_status: JOINT + real_estate_taxes: 4_000 + state_income_tax: 8_000 + state_code: MO + output: + mo_net_state_income_taxes: 6_666.67 # = 10_000 * 2/3 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/adjustments/ms_national_guard_or_reserve_pay_adjustment.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/adjustments/ms_national_guard_or_reserve_pay_adjustment.yaml new file mode 100644 index 000000000..8902fde59 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/adjustments/ms_national_guard_or_reserve_pay_adjustment.yaml @@ -0,0 +1,15 @@ +- name: Capped at 15_000 + period: 2021 + input: + state_code: MS + military_service_income: 20_000 + output: + ms_national_guard_or_reserve_pay_adjustment: 15_000 + +- name: Uncapped + period: 2021 + input: + state_code: MS + military_service_income: 10_000 + output: + ms_national_guard_or_reserve_pay_adjustment: 10_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/adjustments/ms_self_employment_adjustment.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/adjustments/ms_self_employment_adjustment.yaml new file mode 100644 index 000000000..063501151 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/adjustments/ms_self_employment_adjustment.yaml @@ -0,0 +1,15 @@ +- name: Calculation with self-employment taxes + period: 2021 + input: + state_code: MS + self_employment_tax: 20_000 + output: + ms_self_employment_adjustment: 10_000 + +- name: Calculation without self-employment taxes + period: 2021 + input: + state_code: MS + self_employment_tax: 0 + output: + ms_self_employment_adjustment: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/deductions/ms_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/deductions/ms_deductions.yaml new file mode 100644 index 000000000..182f0e445 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/deductions/ms_deductions.yaml @@ -0,0 +1,17 @@ +- name: MS deductions return the max of itemized or standard deduction + period: 2020 + input: + state_code: MS + ms_itemized_deductions: 2_000 + ms_standard_deduction: 3_000 + output: + ms_deductions: 3_000 + +- name: MS deductions return the max of itemized or standard deduction + period: 2020 + input: + state_code: MS + ms_itemized_deductions: 1_000 + ms_standard_deduction: 500 + output: + ms_deductions: 1_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/deductions/standard/ms_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/deductions/standard/ms_standard_deduction.yaml new file mode 100644 index 000000000..92493e845 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/deductions/standard/ms_standard_deduction.yaml @@ -0,0 +1,39 @@ +- name: MS Standard deduction if single filer + period: 2020 + input: + filing_status: SINGLE + state_code: MS + output: + ms_standard_deduction: 2_300 + +- name: MS Standard deduction if head of household filer + period: 2020 + input: + filing_status: HEAD_OF_HOUSEHOLD + state_code: MS + output: + ms_standard_deduction: 3_400 + +- name: MS Standard deduction if married filing jointly + period: 2020 + input: + filing_status: JOINT + state_code: MS + output: + ms_standard_deduction: 4_600 + +- name: MS Standard deduction if widow filter + period: 2020 + input: + filing_status: WIDOW + state_code: MS + output: + ms_standard_deduction: 4_600 + +- name: MS Standard deduction if married filing separately + period: 2020 + input: + filing_status: SEPARATE + state_code: MS + output: + ms_standard_deduction: 2_300 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/exemptions/ms_aged_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/exemptions/ms_aged_exemption.yaml new file mode 100644 index 000000000..f73674be8 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/exemptions/ms_aged_exemption.yaml @@ -0,0 +1,85 @@ +- name: If filing jointly, head and spouse are both above 65, exemption is $3k. + period: 2022 + absolute_error_margin: 0 + input: + state_code: MS + filing_status: JOINT + age_head: 65 + age_spouse: 65 + output: + ms_aged_exemption: 3_000 + +- name: If filing jointly, head >= age 65 but spouse is not, exemption is $1.5k. + period: 2022 + absolute_error_margin: 0 + input: + state_code: MS + filing_status: JOINT + age_head: 65 + age_spouse: 64 + output: + ms_aged_exemption: 1_500 + +- name: If filing jointly, head < age 65 but spouse >= 65, exemption is $1.5k. + period: 2022 + absolute_error_margin: 0 + input: + state_code: MS + filing_status: JOINT + age_head: 64 + age_spouse: 65 + output: + ms_aged_exemption: 1_500 + +- name: If filing jointly, head and spouse are under age 65, exemption is $0. + period: 2022 + absolute_error_margin: 0 + input: + state_code: MS + filing_status: JOINT + age_head: 64 + age_spouse: 64 + output: + ms_aged_exemption: 0 + +- name: If filing separately, head and spouse are both above 65, exemption is $1.5k. + period: 2022 + absolute_error_margin: 0 + input: + state_code: MS + filing_status: SEPARATE + age_head: 65 + age_spouse: 65 + output: + ms_aged_exemption: 1_500 + +- name: If filing separately, head and spouse are both under 65, exemption is $0. + period: 2022 + absolute_error_margin: 0 + input: + state_code: MS + filing_status: SEPARATE + age_head: 64 + age_spouse: 64 + output: + ms_aged_exemption: 0 + +- name: If filing single and age >= 65, exemption is $1.5k. + period: 2022 + absolute_error_margin: 0 + input: + state_code: MS + filing_status: SINGLE + age_head: 65 + output: + ms_aged_exemption: 1_500 + +- name: If filing single and age < 65, exemption is $0. + period: 2022 + absolute_error_margin: 0 + input: + state_code: MS + filing_status: SINGLE + age_head: 64 + output: + ms_aged_exemption: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/exemptions/ms_blind_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/exemptions/ms_blind_exemption.yaml new file mode 100644 index 000000000..77e2b573e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/exemptions/ms_blind_exemption.yaml @@ -0,0 +1,77 @@ +- name: If filing single and not blind, exemption is $0. + period: 2022 + input: + state_code: MS + filing_status: SINGLE + blind_head: false + output: + ms_blind_exemption: 0 + +- name: If filing single and blind, exemption is $1.5k. + period: 2022 + input: + state_code: MS + filing_status: SINGLE + blind_head: true + output: + ms_blind_exemption: 1_500 + +- name: If filing jointly, head is blind but spouse is not blind, exemption is $1.5k. + period: 2022 + input: + state_code: MS + filing_status: JOINT + blind_head: true + blind_spouse: false + output: + ms_blind_exemption: 1_500 + +- name: If filing jointly, head and spouse are both blind, exemption is $3k. + period: 2022 + input: + state_code: MS + filing_status: JOINT + blind_head: true + blind_spouse: true + output: + ms_blind_exemption: 3_000 + +- name: If filing jointly, head and spouse are both not blind, exemption is $0k. + period: 2022 + input: + state_code: MS + filing_status: JOINT + blind_head: false + blind_spouse: false + output: + ms_blind_exemption: 0 + +- name: If filing jointly, head is not blind but spouse is blind, exemption is $1.5k. + period: 2022 + input: + state_code: MS + filing_status: JOINT + blind_head: false + blind_spouse: true + output: + ms_blind_exemption: 1_500 + +- name: If filing seperately, head and spouse are both blind, exemption is $1.5k. + period: 2022 + input: + state_code: MS + filing_status: SEPARATE + blind_head: true + blind_spouse: true + output: + ms_blind_exemption: 1_500 + +- name: If filing separately, head and spouse are both not blind, exemption is $0k. + period: 2022 + input: + state_code: MS + filing_status: SEPARATE + blind_head: false + blind_spouse: false + output: + ms_blind_exemption: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_income_tax.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_income_tax.yaml new file mode 100644 index 000000000..fae653074 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_income_tax.yaml @@ -0,0 +1,17 @@ +- name: Calculation + period: 2023 + input: + state_code: MS + ms_income_tax_before_credits: 2_000 + ms_non_refundable_credits: 200 + output: + ms_income_tax: 1_800 + +- name: Capped at 0 + period: 2023 + input: + state_code: MS + ms_income_tax_before_credits: 300 + ms_non_refundable_credits: 500 + output: + ms_income_tax: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_income_tax_before_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_income_tax_before_credits.yaml new file mode 100644 index 000000000..c91db80dd --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_income_tax_before_credits.yaml @@ -0,0 +1,71 @@ +- name: Calculation 2023 # 3% + period: 2023 + input: + state_code: MS + ms_taxable_income: 1_000 + output: + ms_income_tax_before_credits: 0 + +- name: Calculation 2022 # 3% + 4% + period: 2022 + input: + state_code: MS + ms_taxable_income: 6_000 + output: + ms_income_tax_before_credits: 40 #5000*0+1000*0.04 + +- name: Calculation 2021 # 3% + 4% + 5% + period: 2021 + input: + state_code: MS + ms_taxable_income: 10_000 + output: + ms_income_tax_before_credits: 230 #4000*0+1000*0.03+5000*0.04 + +- name: No income + period: 2023 + input: + state_code: MS + ms_taxable_income: 0 + output: + ms_income_tax_before_credits: 0 + +- name: Calculation 2022 # 3% + 4% + period: 2022 + input: + state_code: MS + ms_taxable_income: 12_000 + output: + ms_income_tax_before_credits: 300 #200 + 100 + +- name: Calculation 2017 + period: 2017 + input: + state_code: MS + ms_taxable_income: 12_000 + output: + ms_income_tax_before_credits: 450 #5000*0.03+5000*0.04+2000*0.05 + +- name: Calculation 2018 # 3% + 4% + period: 2018 + input: + state_code: MS + ms_taxable_income: 12_000 + output: + ms_income_tax_before_credits: 420 #1000 * 0 + 4000 * 0.03 + 5000 * 0.04 + 2,000 * 0.05 + +- name: No taxable income in 2018 + period: 2018 + input: + state_code: MS + ms_taxable_income: 1_000 + output: + ms_income_tax_before_credits: 0 + +- name: No taxable income in 2021 + period: 2021 + input: + state_code: MS + ms_taxable_income: 4_000 + output: + ms_income_tax_before_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_taxable_income.yaml new file mode 100644 index 000000000..26ac2de9e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ms/tax/income/ms_taxable_income.yaml @@ -0,0 +1,19 @@ +- name: Calculation + period: 2023 + input: + state_code: MS + ms_agi: 2_000 + ms_deductions: 200 + ms_total_exemptions: 300 + output: + ms_taxable_income: 1_500 + +- name: Capped at 0 + period: 2023 + input: + state_code: MS + ms_agi: 100 + ms_deductions: 200 + ms_total_exemptions: 300 + output: + ms_taxable_income: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/credits/mt_capital_gain_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/credits/mt_capital_gain_credit.yaml new file mode 100644 index 000000000..c7abb7a3b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/credits/mt_capital_gain_credit.yaml @@ -0,0 +1,15 @@ +- name: filer has 2,000 net capital gain + period: 2022 + input: + net_capital_gain: 2_000 + state_code: MT + output: + mt_capital_gain_credit: 40 + +- name: filer has 3,000 net capital gain + period: 2021 + input: + net_capital_gain: 3_000 + state_code: MT + output: + mt_capital_gain_credit: 60 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/deductions/standard/mt_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/deductions/standard/mt_standard_deduction.yaml new file mode 100644 index 000000000..bab3a8acc --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/deductions/standard/mt_standard_deduction.yaml @@ -0,0 +1,44 @@ +- name: $12,950 for single. #0.2*12950=2590 (in the middle) + period: 2021 + input: + state_code: MT + mt_agi: 12_950 + filing_status: SINGLE + output: + mt_standard_deduction: 2_590 + +- name: $8,000 for widow. #0.2*8000=1600 (lower than min) + period: 2021 + input: + state_code: MT + mt_agi: 8_000 + filing_status: WIDOW + output: + mt_standard_deduction: 2_140 + +- name: $30,000 for separate. #0.2*30000=6000 (higher than max) + period: 2021 + input: + state_code: MT + mt_agi: 30_000 + filing_status: SEPARATE + output: + mt_standard_deduction: 4_830 + +- name: $25,180 for head of household. #0.2*25180=5036 (in the middle) + period: 2022 + input: + state_code: MT + mt_agi: 25_180 + filing_status: HEAD_OF_HOUSEHOLD + output: + mt_standard_deduction: 5_036 + +- name: $15,000 for joint. #0.2*15000=3000 (lower than min) + period: 2022 + input: + state_code: MT + mt_agi: 15_000 + filing_status: JOINT + output: + mt_standard_deduction: 4_520 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_aged_exemption_count.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_aged_exemption_count.yaml new file mode 100644 index 000000000..5135740f0 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_aged_exemption_count.yaml @@ -0,0 +1,35 @@ +- name: Eligible head and spouse + period: 2023 + input: + age_head: 65 + age_spouse: 65 + state_code: MT + output: + mt_aged_exemption_count: 2 + +- name: Eligible head + period: 2023 + input: + age_head: 65 + age_spouse: 64 + state_code: MT + output: + mt_aged_exemption_count: 1 + +- name: Eligible spouse + period: 2023 + input: + age_head: 64 + age_spouse: 65 + state_code: MT + output: + mt_aged_exemption_count: 1 + +- name: Head and spouse not eligible + period: 2023 + input: + age_head: 64 + age_spouse: 64 + state_code: MT + output: + mt_aged_exemption_count: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_dependent_exemption_count.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_dependent_exemption_count.yaml new file mode 100644 index 000000000..e36b1fc5f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_dependent_exemption_count.yaml @@ -0,0 +1,79 @@ +- name: Two dependents in 2021 - one eligible + period: 2021 + input: + people: + person3: + is_eitc_qualifying_child: false + is_disabled: false + person4: + is_eitc_qualifying_child: true + is_disabled: false + tax_units: + tax_unit: + members: [person3, person4] + households: + household: + members: [person3, person4] + state_code: MT + output: + mt_dependent_exemption_count: 1 + +- name: Two dependents in 2022 - two eligible + period: 2022 + input: + people: + person3: + is_eitc_qualifying_child: true + is_disabled: false + person4: + is_eitc_qualifying_child: true + is_disabled: false + tax_units: + tax_unit: + members: [person3, person4] + households: + household: + members: [person3, person4] + state_code: MT + output: + mt_dependent_exemption_count: 2 + +- name: Two dependents in 2022 - two eligible, one disabled + period: 2022 + input: + people: + person3: + is_eitc_qualifying_child: true + is_disabled: false + person4: + is_eitc_qualifying_child: true + is_disabled: true + tax_units: + tax_unit: + members: [person3, person4] + households: + household: + members: [person3, person4] + state_code: MT + output: + mt_dependent_exemption_count: 3 + +- name: Two dependents in 2022 - no eligible + period: 2022 + input: + people: + person3: + is_eitc_qualifying_child: false + is_disabled: false + person4: + is_eitc_qualifying_child: false + is_disabled: true + tax_units: + tax_unit: + members: [person3, person4] + households: + household: + members: [person3, person4] + state_code: MT + output: + mt_dependent_exemption_count: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_exemptions.yaml new file mode 100644 index 000000000..adc1b3afb --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/exemptions/mt_exemptions.yaml @@ -0,0 +1,23 @@ +- name: No exemptions + period: 2023 + input: + mt_exemptions_count: 0 + state_code: MT + output: + mt_exemptions: 0 + +- name: Three exemptions + period: 2023 + input: + mt_exemptions_count: 3 + state_code: MT + output: + mt_exemptions: 8_130 + +- name: One exemption + period: 2023 + input: + mt_exemptions_count: 1 + state_code: MT + output: + mt_exemptions: 2_710 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/mt_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/mt_eitc.yaml new file mode 100644 index 000000000..4145e51c9 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mt/tax/income/mt_eitc.yaml @@ -0,0 +1,26 @@ +- name: No EITC from federal (test 1) + period: 2021 + input: + filing_status: SINGLE + earned_income_tax_credit: 0 + state_code: MT + output: + mt_eitc: 0 + +- name: EITC from federal (test 2) + period: 2023 + input: + filing_status: JOINT + earned_income_tax_credit: 1_000 + state_code: MT + output: + mt_eitc: 30 + +- name: EITC from federal but exclude SEPERATE (test 3) + period: 2023 + input: + filing_status: SEPARATE + earned_income_tax_credit: 2_000 + state_code: MT + output: + mt_eitc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/credits/nc_ctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/credits/nc_ctc.yaml new file mode 100644 index 000000000..9a7288732 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/credits/nc_ctc.yaml @@ -0,0 +1,71 @@ +- name: No children + period: 2015 + input: + filing_status: SINGLE + state_code: NC + adjusted_gross_income: 15_000 + ctc_qualifying_children: 0 + output: + nc_ctc: 0 + +- name: 1 child - single + period: 2015 + input: + filing_status: SINGLE + state_code: NC + adjusted_gross_income: 15_000 + ctc_qualifying_children: 1 + output: + nc_ctc: 125 + +- name: 1 child + period: 2015 + input: + filing_status: JOINT + state_code: NC + adjusted_gross_income: 50_000 + ctc_qualifying_children: 1 + output: + nc_ctc: 100 + + +- name: 2 children + period: 2015 + input: + filing_status: HEAD_OF_HOUSEHOLD + state_code: NC + adjusted_gross_income: 30_000 + ctc_qualifying_children: 2 + output: + nc_ctc: 250 + + +- name: Married with three children + period: 2015 + input: + filing_status: JOINT + state_code: NC + adjusted_gross_income: 45_000 + ctc_qualifying_children: 3 + output: + nc_ctc: 300 + +- name: Married with six children + period: 2015 + input: + filing_status: JOINT + state_code: NC + adjusted_gross_income: 145_000 + ctc_qualifying_children: 6 + output: + nc_ctc: 0 + +- name: Head of Household with two children in 2018 + period: 2018 + input: + filing_status: HEAD_OF_HOUSEHOLD + state_code: NC + adjusted_gross_income: 45_000 + ctc_qualifying_children: 2 + output: + nc_ctc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml new file mode 100644 index 000000000..6d195cdb0 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_child_deduction.yaml @@ -0,0 +1,59 @@ +- name: nc_child_deduction unit test 1 + period: 2021 + input: + state_code: NC + filing_status: SINGLE + adjusted_gross_income: 55_000 + ctc_qualifying_children: 4 + output: + nc_child_deduction: 500 * 4 + +- name: nc_child_deduction unit test 2 + period: 2021 + input: + state_code: NC + filing_status: JOINT + adjusted_gross_income: 55_000 + ctc_qualifying_children: 2 + output: + nc_child_deduction: 2_000 * 2 + +- name: nc_child_deduction unit test 3 + period: 2021 + input: + state_code: NC + filing_status: HEAD_OF_HOUSEHOLD + adjusted_gross_income: 55_000 + ctc_qualifying_children: 1 + output: + nc_child_deduction: 1_500 * 1 + +- name: nc_child_deduction unit test 4 + period: 2022 + input: + state_code: NC + filing_status: SINGLE + adjusted_gross_income: 55_000 + ctc_qualifying_children: 4 + output: + nc_child_deduction: 1_000 * 4 + +- name: nc_child_deduction unit test 5 + period: 2022 + input: + state_code: NC + filing_status: JOINT + adjusted_gross_income: 55_000 + ctc_qualifying_children: 2 + output: + nc_child_deduction: 2_500 * 2 + +- name: nc_child_deduction unit test 6 + period: 2022 + input: + state_code: NC + filing_status: HEAD_OF_HOUSEHOLD + adjusted_gross_income: 55_000 + ctc_qualifying_children: 1 + output: + nc_child_deduction: 2_000 * 1 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_itemized_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_itemized_deductions.yaml new file mode 100644 index 000000000..cd8db9398 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_itemized_deductions.yaml @@ -0,0 +1,47 @@ +- name: Real estate taxes capped + period: 2022 + input: + filing_status: JOINT + mortgage_interest: 9_000 + real_estate_taxes: 11_000 + charitable_deduction: 0 + medical_expense_deduction: 0 + state_code: NC + output: + nc_itemized_deductions: 19_000 + +- name: Real estate taxes and mortgage capped + period: 2022 + input: + filing_status: WIDWO + mortgage_interest: 11_000 + real_estate_taxes: 11_000 + charitable_deduction: 0 + medical_expense_deduction: 0 + state_code: NC + output: + nc_itemized_deductions: 20_000 + +- name: Real estate taxes and mortgage capped with medical and charitable + period: 2022 + input: + filing_status: WIDWO + mortgage_interest: 11_000 + real_estate_taxes: 11_000 + charitable_deduction: 1_000 + medical_expense_deduction: 500 + state_code: NC + output: + nc_itemized_deductions: 21_500 + +- name: Real estate taxes capped at 5,000 for separate filers + period: 2022 + input: + filing_status: SEPARATE + mortgage_interest: 9_000 + real_estate_taxes: 11_000 + charitable_deduction: 0 + medical_expense_deduction: 0 + state_code: NC + output: + nc_itemized_deductions: 14_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_standard_deduction.yaml new file mode 100644 index 000000000..d012edec4 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_standard_deduction.yaml @@ -0,0 +1,23 @@ +- name: nc_standard_deduction unit test 1 + period: 2021 + input: + state_code: NC + filing_status: SINGLE + output: + nc_standard_deduction: 10_750 + +- name: nc_standard_deduction unit test 2 + period: 2022 + input: + state_code: NC + filing_status: JOINT + output: + nc_standard_deduction: 25_500 + +- name: nc_standard_deduction unit test 3 + period: 2021 + input: + state_code: NC + filing_status: HEAD_OF_HOUSEHOLD + output: + nc_standard_deduction: 16_125 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_standard_or_itemized_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_standard_or_itemized_deductions.yaml new file mode 100644 index 000000000..b2c4282d6 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_standard_or_itemized_deductions.yaml @@ -0,0 +1,8 @@ +- name: nc_standard_or_itemized_deductions unit test 1 + period: 2021 + input: + state_code: NC + nc_standard_deduction: 200 + nc_itemized_deductions: 220 + output: + nc_standard_or_itemized_deductions: 220 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ne/tax/income/ne_itemized_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ne/tax/income/ne_itemized_deductions.yaml index d2d0ab9a8..c8f96d473 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ne/tax/income/ne_itemized_deductions.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ne/tax/income/ne_itemized_deductions.yaml @@ -1,25 +1,23 @@ -- name: Unit test 1 - period: 2021 - input: - filing_status: JOINT - tax_unit_itemizes: false - charitable_deduction: 2_000 - interest_expense: 24_000 - salt_deduction: 10_000 - real_estate_taxes: 9_000 - state_code: NE - output: - ne_itemized_deductions: 0 # because does not itemize on federal return - -- name: Unit test 2 - period: 2022 - input: - filing_status: JOINT - tax_unit_itemizes: true - charitable_deduction: 3_000 - interest_expense: 7_000 - salt_deduction: 10_000 - real_estate_taxes: 6_000 - state_code: NE - output: - ne_itemized_deductions: 3_000 + 7_000 + 6_000 +- name: Unit test 1 + period: 2021 + input: + filing_status: JOINT + charitable_deduction: 2_000 + interest_expense: 24_000 + salt_deduction: 10_000 + real_estate_taxes: 9_000 + state_code: NE + output: + ne_itemized_deductions: 2_000 + 24_000 + 9_000 + +- name: Unit test 2 + period: 2022 + input: + filing_status: JOINT + charitable_deduction: 3_000 + interest_expense: 7_000 + salt_deduction: 10_000 + real_estate_taxes: 6_000 + state_code: NE + output: + ne_itemized_deductions: 3_000 + 7_000 + 6_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ne/tax/income/ne_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ne/tax/income/ne_taxable_income.yaml index b08836b44..f238e7c92 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ne/tax/income/ne_taxable_income.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ne/tax/income/ne_taxable_income.yaml @@ -1,19 +1,32 @@ -- name: NE taxable income unit test 1 - period: 2021 - input: - ne_agi: 90_000 - ne_standard_deduction: 10_000 - ne_itemized_deductions: 9_000 - state_code: NE - output: - ne_taxable_income: 90_000 - 10_000 - -- name: NE taxable income unit test 2 - period: 2021 - input: - ne_agi: 90_000 - ne_standard_deduction: 10_000 - ne_itemized_deductions: 12_000 - state_code: NE - output: - ne_taxable_income: 90_000 - 12_000 +- name: NE taxable income unit test 1 + period: 2021 + input: + tax_unit_itemizes: false + ne_agi: 90_000 + ne_standard_deduction: 10_000 + ne_itemized_deductions: 12_000 + state_code: NE + output: + ne_taxable_income: 90_000 - 10_000 + +- name: NE taxable income unit test 2 + period: 2021 + input: + tax_unit_itemizes: true + ne_agi: 90_000 + ne_standard_deduction: 13_000 + ne_itemized_deductions: 12_000 + state_code: NE + output: + ne_taxable_income: 90_000 - 13_000 + +- name: NE taxable income unit test 3 + period: 2021 + input: + tax_unit_itemizes: true + ne_agi: 90_000 + ne_standard_deduction: 13_000 + ne_itemized_deductions: 15_000 + state_code: NE + output: + ne_taxable_income: 90_000 - 15_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/credits/nh_education_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/credits/nh_education_tax_credit.yaml new file mode 100644 index 000000000..ebc26fb3c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/credits/nh_education_tax_credit.yaml @@ -0,0 +1,125 @@ +- name: In 2013, charitable cash donations = 600_000, charitable non cash donations = 0, the credit amount is 510_000 + period: 2013 + input: + state_code: NH + charitable_cash_donations: 600_000 + charitable_non_cash_donations: 0 + output: + nh_education_tax_credit: 510_000 + +- name: In 2013, charitable cash donations = 0, charitable non cash donations = 600_000, the credit amount is 510_000 + period: 2013 + input: + state_code: NH + charitable_cash_donations: 0 + charitable_non_cash_donations: 600_000 + output: + nh_education_tax_credit: 510_000 + +- name: In 2013, charitable cash donations = 700_000, charitable non cash donations = 0, the credit amount is 510_000 + period: 2013 + input: + state_code: NH + charitable_cash_donations: 700_000 + charitable_non_cash_donations: 0 + output: + nh_education_tax_credit: 510_000 + +- name: In 2013, charitable cash donations = 0, charitable non cash donations = 700_000, the credit amount is 510_000 + period: 2013 + input: + state_code: NH + charitable_cash_donations: 0 + charitable_non_cash_donations: 700_000 + output: + nh_education_tax_credit: 510_000 + +- name: In 2013, charitable cash donations = 0, charitable non cash donations = 0, the credit amount is 0 + period: 2013 + input: + state_code: NH + charitable_cash_donations: 0 + charitable_non_cash_donations: 0 + output: + nh_education_tax_credit: 0 + +- name: In 2013, charitable cash donations = 300_000, charitable non cash donations = 300_000, the credit amount is 510_000 + period: 2013 + input: + state_code: NH + charitable_cash_donations: 300_000 + charitable_non_cash_donations: 300_000 + output: + nh_education_tax_credit: 510_000 + +- name: In 2013, charitable cash donations = 400_000, charitable non cash donations = 400_000, the credit amount is 510_000 + period: 2013 + input: + state_code: NH + charitable_cash_donations: 400_000 + charitable_non_cash_donations: 400_000 + output: + nh_education_tax_credit: 510_000 + +- name: In 2012, charitable cash donations = 600_000, charitable non cash donations = 0, the credit amount is 0 + period: 2012 + input: + state_code: NH + charitable_cash_donations: 600_000 + charitable_non_cash_donations: 0 + output: + nh_education_tax_credit: 0 + +- name: In 2012, charitable cash donations = 0, charitable non cash donations = 600_000, the credit amount is 0 + period: 2012 + input: + state_code: NH + charitable_cash_donations: 0 + charitable_non_cash_donations: 600_000 + output: + nh_education_tax_credit: 0 + +- name: In 2012, charitable cash donations = 700_000, charitable non cash donations = 0, the credit amount is 0 + period: 2012 + input: + state_code: NH + charitable_cash_donations: 700_000 + charitable_non_cash_donations: 0 + output: + nh_education_tax_credit: 0 + +- name: In 2012, charitable cash donations = 0, charitable non cash donations = 700_000, the credit amount is 0 + period: 2012 + input: + state_code: NH + charitable_cash_donations: 0 + charitable_non_cash_donations: 700_000 + output: + nh_education_tax_credit: 0 + +- name: In 2012, charitable cash donations = 0, charitable non cash donations = 0, the credit amount is 0 + period: 2012 + input: + state_code: NH + charitable_cash_donations: 0 + charitable_non_cash_donations: 0 + output: + nh_education_tax_credit: 0 + +- name: In 2012, charitable cash donations = 300_000, charitable non cash donations = 300_000, the credit amount is 0 + period: 2012 + input: + state_code: NH + charitable_cash_donations: 300_000 + charitable_non_cash_donations: 300_000 + output: + nh_education_tax_credit: 0 + +- name: In 2012, charitable cash donations = 400_000, charitable non cash donations = 400_000, the credit amount is 0 + period: 2012 + input: + state_code: NH + charitable_cash_donations: 400_000 + charitable_non_cash_donations: 400_000 + output: + nh_education_tax_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_base_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_base_exemption.yaml new file mode 100644 index 000000000..d24bdc0f2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_base_exemption.yaml @@ -0,0 +1,39 @@ +- name: Single filing + period: 2022 + input: + state_code: NH + filing_status: SINGLE + output: + nh_base_exemption: 2_400 + +- name: Joint filing + period: 2022 + input: + state_code: NH + filing_status: JOINT + output: + nh_base_exemption: 4_800 + +- name: Separate filing + period: 2022 + input: + state_code: NH + filing_status: SEPARATE + output: + nh_base_exemption: 2_400 + +- name: Head of household filing + period: 2022 + input: + state_code: NH + filing_status: HEAD_OF_HOUSEHOLD + output: + nh_base_exemption: 2_400 + +- name: Widow filing + period: 2022 + input: + state_code: NH + filing_status: WIDOW + output: + nh_base_exemption: 2_400 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_blind_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_blind_exemption.yaml new file mode 100644 index 000000000..2c194f308 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_blind_exemption.yaml @@ -0,0 +1,104 @@ +- name: In 2022, if filing single, not blind, exemption is $0. + period: 2022 + input: + state_code: NH + blind_head: false + output: + nh_blind_exemption: 0 + +- name: In 2027, if filing single, not blind, exemption is $0. + period: 2027 + input: + state_code: NH + blind_head: false + output: + nh_blind_exemption: 0 + +- name: In 2022, if filing single, blind, exemption is $1_200. + period: 2022 + input: + state_code: NH + blind_head: true + output: + nh_blind_exemption: 1_200 + +- name: In 2027, if filing single, blind, exemption is $0. + period: 2027 + input: + state_code: NH + blind_head: true + output: + nh_blind_exemption: 0 + +- name: In 2022, if filing jointly, both head and spouse are not blind, exemption is $0. + period: 2022 + input: + state_code: NH + blind_head: false + blind_spouse: false + output: + nh_blind_exemption: 0 + +- name: In 2027, if filing jointly, both head and spouse are not blind, exemption is $0. + period: 2027 + input: + state_code: NH + blind_head: false + blind_spouse: false + output: + nh_blind_exemption: 0 + +- name: In 2022, if filing jointly, head = blind but spouse is not, exemption is $1_200. + period: 2022 + input: + state_code: NH + blind_head: true + blind_spouse: false + output: + nh_blind_exemption: 1_200 + + +- name: In 2027, if filing jointly, head = blind but spouse is not, exemption is $0. + period: 2027 + input: + state_code: NH + blind_head: true + blind_spouse: false + output: + nh_blind_exemption: 0 + +- name: In 2022, if filing jointly, head is not blind but spouse = blind, exemption is $1_200. + period: 2022 + input: + state_code: NH + blind_head: false + blind_spouse: true + output: + nh_blind_exemption: 1_200 + +- name: In 2027, if filing jointly, head is not blind but spouse = blind, exemption is $0. + period: 2027 + input: + state_code: NH + blind_head: false + blind_spouse: true + output: + nh_blind_exemption: 0 + +- name: In 2022, if filing jointly, head and spouse both = blind, exemption is $2_400. + period: 2022 + input: + state_code: NH + blind_head: true + blind_spouse: true + output: + nh_blind_exemption: 2_400 + +- name: In 2027, if filing jointly, head and spouse both = blind, exemption is $0. + period: 2027 + input: + state_code: NH + blind_head: true + blind_spouse: true + output: + nh_blind_exemption: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_disabled_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_disabled_exemption.yaml new file mode 100644 index 000000000..0bde56af7 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_disabled_exemption.yaml @@ -0,0 +1,196 @@ +- name: If filing jointly, head is disabled at the age below 65 but spouse is not disabled, they will get this exemption. + period: 2022 + input: + state_code: NH + disabled_head: true + age_head: 60 + disabled_spouse: false + output: + nh_disabled_exemption: 1_200 + +- name: If filing jointly, head is disabled at the age of 65 but spouse is not disabled, they will not get this exemption. + period: 2022 + input: + state_code: NH + disabled_head: true + age_head: 65 + disabled_spouse: false + output: + nh_disabled_exemption: 0 + +- name: If filing jointly in or after 2027, head is disabled at the age of 65 but spouse is not disabled, they will not get this exemption. + period: 2027 + input: + state_code: NH + disabled_head: true + age_head: 65 + disabled_spouse: false + output: + nh_disabled_exemption: 0 + +- name: If filing jointly in or after 2027, head is disabled at the age below 65 but spouse is not disabled, they will not get this exemption. + period: 2027 + input: + state_code: NH + disabled_head: true + age_head: 60 + disabled_spouse: false + output: + nh_disabled_exemption: 0 + +- name: If filing jointly, spouse is disabled at the age below 65 but head is not disabled, they will get this exemption. + period: 2022 + input: + state_code: NH + disabled_head: false + age_head: 60 + disabled_spouse: true + output: + nh_disabled_exemption: 1_200 + +- name: If filing jointly, spouse is disabled at the age of 65 but head is not disabled, they will not get this exemption. + period: 2022 + input: + state_code: NH + disabled_head: false + age_spouse: 65 + disabled_spouse: true + output: + nh_disabled_exemption: 0 + +- name: If filing jointly in or after 2027, spouse is disabled at the age of 65 but head is not disabled, they will not get not this exemption. + period: 2027 + input: + state_code: NH + disabled_head: false + age_head: 65 + disabled_spouse: true + output: + nh_disabled_exemption: 0 + +- name: If filing jointly in or after 2027, spouse is disabled at the age below 65 but head is not disabled, they will not get not this exemption. + period: 2027 + input: + state_code: NH + disabled_head: false + age_head: 60 + disabled_spouse: true + output: + nh_disabled_exemption: 0 + +- name: If filing jointly, head is disabled at the age below 65 and spouse is disabled at the age below 65, they will get exemptions. + period: 2022 + input: + state_code: NH + disabled_head: true + age_head: 60 + disabled_spouse: true + age_spouse: 60 + output: + nh_disabled_exemption: 2_400 + +- name: If filing jointly, head is disabled at the age below 65 and spouse is disabled at the age of 65, they will get one exemption. + period: 2022 + input: + state_code: NH + disabled_head: true + age_head: 60 + disabled_spouse: true + age_spouse: 65 + output: + nh_disabled_exemption: 1_200 + +- name: If filing jointly, head is disabled at the age of 65 and spouse is disabled at the age below 65, they will get one exemption. + period: 2022 + input: + state_code: NH + disabled_head: true + age_head: 65 + disabled_spouse: true + age_spouse: 60 + output: + nh_disabled_exemption: 1_200 + +- name: If filing jointly in or after 2027, head is disabled at the age below 65 and spouse is disabled at the age below 65, they will get no exemption. + period: 2027 + input: + state_code: NH + disabled_head: true + age_head: 60 + disabled_spouse: true + age_spouse: 60 + output: + nh_disabled_exemption: 0 + +# for filing seperately, no disabled_spouse input +- name: If filing seperately, the filer is disabled at the age below 65, the filer will get this exemption. + period: 2022 + input: + state_code: NH + disabled_head: true + age_head: 60 + output: + nh_disabled_exemption: 1_200 + +- name: If filing seperately, the filer is not disabled at the age below 65, the filer will not get this exemption. + period: 2022 + input: + state_code: NH + disabled_head: false + age_head: 60 + output: + nh_disabled_exemption: 0 + +- name: If filing seperately, the filer is not disabled at the age of 65, the filer will not get this exemption. + period: 2022 + input: + state_code: NH + disabled_head: false + age_head: 65 + output: + nh_disabled_exemption: 0 + +- name: If filing seperately, the filer is disabled at the age of 65, the filer will not get this exemption. + period: 2022 + input: + state_code: NH + disabled_head: true + age_head: 65 + output: + nh_disabled_exemption: 0 + +- name: If filing seperately in or after 2027, the filer is disabled at the age below 65, the filer will not get this exemption. + period: 2027 + input: + state_code: NH + disabled_head: true + age_head: 60 + output: + nh_disabled_exemption: 0 + +- name: If filing seperately in or after 2027, the filer is disabled at the age of 65, the filer will not get this exemption. + period: 2027 + input: + state_code: NH + disabled_head: true + age_head: 65 + output: + nh_disabled_exemption: 0 + +- name: If filing seperately in or after 2027, the filer is not disabled at the age of 65, the filer will not get this exemption. + period: 2027 + input: + state_code: NH + disabled_head: false + age_head: 65 + output: + nh_disabled_exemption: 0 + +- name: If filing seperately in or after 2027, the filer is not disabled at the age below 65, the filer will not get this exemption. + period: 2027 + input: + state_code: NH + disabled_head: false + age_head: 60 + output: + nh_disabled_exemption: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_old_age_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_old_age_exemption.yaml new file mode 100644 index 000000000..af4ac26b4 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/exemptions/nh_old_age_exemption.yaml @@ -0,0 +1,104 @@ +- name: In 2022, if filing single and age < 65, exemption is $0. + period: 2022 + input: + state_code: NH + age_head: 64 + output: + nh_old_age_exemption: 0 + +- name: In 2027, if filing single and age < 65, exemption is $0. + period: 2027 + input: + state_code: NH + age_head: 64 + output: + nh_old_age_exemption: 0 + +- name: In 2022, if filing single and age >= 65, exemption is $1_200. + period: 2022 + input: + state_code: NH + age_head: 65 + output: + nh_old_age_exemption: 1_200 + +- name: In 2027, if filing single and age >= 65, exemption is $0. + period: 2027 + input: + state_code: NH + age_head: 65 + output: + nh_old_age_exemption: 0 + +- name: In 2022, if filing jointly, both head and spouse are under 65, exemption is $0. + period: 2022 + input: + state_code: NH + age_head: 64 + age_spouse: 64 + output: + nh_old_age_exemption: 0 + +- name: In 2027, if filing jointly, both head and spouse are under 65, exemption is $0. + period: 2027 + input: + state_code: NH + age_head: 64 + age_spouse: 64 + output: + nh_old_age_exemption: 0 + +- name: In 2022, if filing jointly, head age >= 65 but spouse is not, exemption is $1_200. + period: 2022 + input: + state_code: NH + age_head: 65 + age_spouse: 64 + output: + nh_old_age_exemption: 1_200 + + +- name: In 2027, if filing jointly, head age >= 65 but spouse is not, exemption is $0. + period: 2027 + input: + state_code: NH + age_head: 65 + age_spouse: 64 + output: + nh_old_age_exemption: 0 + +- name: In 2022, if filing jointly, head age < 65 but spouse age >= 65, exemption is $1_200. + period: 2022 + input: + state_code: NH + age_head: 64 + age_spouse: 65 + output: + nh_old_age_exemption: 1_200 + +- name: In 2027, if filing jointly, head age < 65 but spouse age >= 65, exemption is $0. + period: 2027 + input: + state_code: NH + age_head: 64 + age_spouse: 65 + output: + nh_old_age_exemption: 0 + +- name: In 2022, if filing jointly, head and spouse both >= 65, exemption is $2_400. + period: 2022 + input: + state_code: NH + age_head: 65 + age_spouse: 65 + output: + nh_old_age_exemption: 2_400 + +- name: In 2027, if filing jointly, head and spouse both >= 65, exemption is $0. + period: 2027 + input: + state_code: NH + age_head: 65 + age_spouse: 65 + output: + nh_old_age_exemption: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/nh_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/nh_income_tax_before_refundable_credits.yaml index 77887fc1b..9aaebc560 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/nh_income_tax_before_refundable_credits.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nh/tax/income/nh_income_tax_before_refundable_credits.yaml @@ -21,3 +21,11 @@ nh_taxable_income: 0 output: nh_income_tax_before_refundable_credits: 0 + +- name: 2023 rate + period: 2023 + input: + state_code: NH + nh_taxable_income: 2_000 + output: + nh_income_tax_before_refundable_credits: 80 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/credits/nj_child_tax_credit/nj_child_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/credits/nj_ctc.yaml similarity index 96% rename from fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/credits/nj_child_tax_credit/nj_child_tax_credit.yaml rename to fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/credits/nj_ctc.yaml index feade360a..98a4d9054 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/credits/nj_child_tax_credit/nj_child_tax_credit.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/credits/nj_ctc.yaml @@ -22,7 +22,7 @@ members: [person1, person2, person3] state_code: NJ output: - nj_child_tax_credit: 1_000 + nj_ctc: 1_000 - name: Filer with 3 dependents under 6 and taxable income between $30,000 and $40,000 gets $1,200 credit when filing jointly period: 2022 @@ -51,7 +51,7 @@ members: [person1, person2, person3, person4] state_code: NJ output: - nj_child_tax_credit: 1_200 + nj_ctc: 1_200 - name: Filer with 3 dependents under 6 and taxable income between $40,000 and $50,000 gets $900 credit when filing jointly period: 2022 @@ -80,7 +80,7 @@ members: [person1, person2, person3, person4] state_code: NJ output: - nj_child_tax_credit: 900 + nj_ctc: 900 - name: Filer with 4 dependents under 6 and taxable income between $50,000 and $60,000 gets $800 credit when filing jointly period: 2022 @@ -112,7 +112,7 @@ members: [person1, person2, person3, person4, person5] state_code: NJ output: - nj_child_tax_credit: 800 + nj_ctc: 800 - name: Filer with 4 dependents under 6 and taxable income between $50,000 and $60,000 gets $800 credit when filing as head of household period: 2022 @@ -144,7 +144,7 @@ members: [person1, person2, person3, person4, person5] state_code: NJ output: - nj_child_tax_credit: 800 + nj_ctc: 800 - name: Filer is not eligible for credit when filing separately period: 2022 @@ -170,4 +170,4 @@ members: [person1, person2, person3] state_code: NJ output: - nj_child_tax_credit: 0 + nj_ctc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_other_retirement_income_exclusion.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_other_retirement_income_exclusion.yaml new file mode 100644 index 000000000..7ffe5075c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_other_retirement_income_exclusion.yaml @@ -0,0 +1,34 @@ +- name: NJ other retirement income exclusion test 1 + # Example from the "Only One Spouse Qualifies for Exclusion" section + # of the "Unclaimed Pension Exclusion" section of the New Jersey + # "Retirement Income: Understanding Income Tax" document: + # https://www.nj.gov/treasury/taxation/pdf/pubs/tgi-ee/git1&2.pdf#page=24 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 58 + employment_income: 500 + taxable_interest_income: 2_000 + taxable_private_pension_income: 18_000 + person2: + is_tax_unit_spouse: true + age: 63 + employment_income: 1_500 + taxable_interest_income: 2_000 + taxable_private_pension_income: 6_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_pension_retirement_exclusion: 6_000 + nj_other_retirement_income_exclusion: 3_500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_other_retirement_special_exclusion.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_other_retirement_special_exclusion.yaml new file mode 100644 index 000000000..5132f4001 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_other_retirement_special_exclusion.yaml @@ -0,0 +1,71 @@ +- name: Joint filing, both spouses not eligible for social security so they get the special exclusion. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + never_eligible_for_social_security_benefits: true + person2: + is_tax_unit_spouse: true + never_eligible_for_social_security_benefits: true + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_other_retirement_special_exclusion: 6_000 + +- name: Single filer 70+ not eligible for social security so they get the special exclusion. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + never_eligible_for_social_security_benefits: true + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + filing_status: SINGLE + households: + household: + members: [person1] + state_code: NJ + output: + nj_other_retirement_special_exclusion: 3_000 + +- name: One spouse is eligible for social security benefits, so household not eligible for special exclusion. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + never_eligible_for_social_security_benefits: true + person2: + is_tax_unit_spouse: true + never_eligible_for_social_security_benefits: false + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_other_retirement_special_exclusion: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_pension_retirement_exclusion.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_pension_retirement_exclusion.yaml new file mode 100644 index 000000000..c77641630 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/exclusions/nj_pension_retirement_exclusion.yaml @@ -0,0 +1,442 @@ +- name: 1 Can count all of head and spouse retirement income. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 1_000 + person2: + is_tax_unit_spouse: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 4_000 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 25_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_pension_retirement_exclusion: 5_000 + +- name: 2 Spouse retirement income can't be counted because they're not age eligible. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 1_000 + person2: + is_tax_unit_spouse: true + age: 61 + is_blind: false + is_disabled: false + taxable_pension_income: 4_000 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 25_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_pension_retirement_exclusion: 1_000 + +- name: 3 Retirement income of third senior in tax unit can't be counted. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 1_000 + person2: + is_tax_unit_spouse: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 2_000 + person3: + is_tax_unit_head: false + is_tax_unit_spouse: false + age: 62 + taxable_pension_income: 4_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + adjusted_gross_income: 25_000 + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + nj_pension_retirement_exclusion: 3_000 + +- name: 4 Can count all head and spouse retirement income because they're blind or disabled. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 61 + is_blind: true + is_disabled: false + taxable_pension_income: 1_000 + person2: + is_tax_unit_spouse: true + age: 61 + is_blind: false + is_disabled: true + taxable_pension_income: 4_000 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 25_000 + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_pension_retirement_exclusion: 5_000 + +- name: 5 Max amount is restrictive - head of household filer. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 100_000 + person2: + is_tax_unit_spouse: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 0 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 100_000 + filing_status: HEAD_OF_HOUSEHOLD + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_pension_retirement_exclusion: 75_000 + +- name: 6 Max amount is restrictive - joint filer. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 100_000 + person2: + is_tax_unit_spouse: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 0 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 100_000 + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_pension_retirement_exclusion: 100_000 + +- name: 7 Max amount is restrictive - single filer. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 100_000 + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 100_000 + filing_status: SINGLE + households: + household: + members: [person1] + state_code: NJ + output: + nj_pension_retirement_exclusion: 75_000 + +- name: 8 Max amount is restrictive - widow filer. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 100_000 + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + adjusted_gross_income: 100_000 + filing_status: WIDOW + households: + household: + members: [person1] + state_code: NJ + output: + nj_pension_retirement_exclusion: 75_000 + +- name: 9 Max amount is restrictive - separate filer. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 100_000 + person2: + is_tax_unit_spouse: true + age: 62 + is_blind: false + is_disabled: false + taxable_pension_income: 0 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 100_000 + filing_status: SEPARATE + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_pension_retirement_exclusion: 50_000 + +- name: 10 Joint filer with $110k income can exclude 50 percent of retirement income. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + employment_income: 0 + taxable_pension_income: 100_000 + person2: + is_tax_unit_spouse: true + age: 62 + is_blind: false + is_disabled: false + employment_income: 10_000 + taxable_pension_income: 0 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_pension_retirement_exclusion: 50_000 + +- name: 11 Joint filer with $150k income can exclude 25 percent of retirement income. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + employment_income: 0 + taxable_pension_income: 100_000 + person2: + is_tax_unit_spouse: true + age: 62 + is_blind: false + is_disabled: false + employment_income: 50_000 + taxable_pension_income: 0 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_pension_retirement_exclusion: 25_000 + +- name: 12 Single filer with $110k income can exclude 37.5 percent of retirement income. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + qualified_dividend_income: 10_000 + taxable_pension_income: 100_000 + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NJ + output: + nj_pension_retirement_exclusion: 37_500 + +- name: 13 Single filer with $150k income can exclude 18.75 percent of retirement income. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + qualified_dividend_income: 50_000 + taxable_pension_income: 100_000 + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NJ + output: + nj_pension_retirement_exclusion: 18_750 + +- name: 14 Separate filer with $110k income can exclude 25 percent of retirement income. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + qualified_dividend_income: 10_000 + taxable_pension_income: 100_000 + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + filing_status: SEPARATE + households: + household: + members: [person1] + state_code: NJ + output: + nj_pension_retirement_exclusion: 25_000 + +- name: 15 Separate filer with $150k income can exclude 12.5 percent of retirement income. + absolute_error_margin: 0 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + is_blind: false + is_disabled: false + qualified_dividend_income: 50_000 + taxable_pension_income: 100_000 + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + filing_status: SEPARATE + households: + household: + members: [person1] + state_code: NJ + output: + nj_pension_retirement_exclusion: 12_500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/nj_integration.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/nj_integration.yaml deleted file mode 100644 index 6da433d61..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/nj_integration.yaml +++ /dev/null @@ -1,24 +0,0 @@ -- name: Single NJ taxpayer with mostly social security income - absolute_error_margin: 0.01 - period: 2021 - input: - people: - person1: - is_tax_unit_head: true - age: 62 - taxable_interest_income: 1_000 - social_security: 60_000 - spm_units: - spm_unit: - members: [person1] - tax_units: - tax_unit: - members: [person1] - households: - household: - members: [person1] - state_code: NJ - output: - taxable_social_security: 3_000 # on federal form - adjusted_gross_income: 1_000 + 3_000 # on federal form - nj_agi: 1_000 # NJ does not include social security in AGI diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_potential_property_tax_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_potential_property_tax_deduction.yaml index af4ddc2bc..801cb27cc 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_potential_property_tax_deduction.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_potential_property_tax_deduction.yaml @@ -1,76 +1,54 @@ -- name: NJ property tax deduction is 18% of rent if still below threshold. +- name: nj_potential_property_tax_deduction test 1 period: 2022 - absolute_error_margin: 0 + absolute_error_margin: 0.01 input: people: person1: rent: 10_000 - person2: - rent: 0 + real_estate_taxes: 8_000 tax_units: tax_unit: - members: [person1, person2] - rents: true - nj_homeowners_property_tax: 0 + members: [person1] nj_property_tax_deduction_eligible: true households: household: - members: [person1, person2] + members: [person1] state_code: NJ output: - nj_potential_property_tax_deduction: 1_800 + nj_potential_property_tax_deduction: 8_000 + 0.18 * 10_000 -- name: NJ property tax deduction is 18% of rent, capped at threshold. - period: 2022 - absolute_error_margin: 0 +- name: nj_potential_property_tax_deduction test 2 + period: 2021 + absolute_error_margin: 0.01 input: people: person1: rent: 100_000 - person2: - rent: 0 tax_units: tax_unit: - members: [person1, person2] - rents: true - nj_homeowners_property_tax: 0 + members: [person1] nj_property_tax_deduction_eligible: true households: household: - members: [person1, person2] + members: [person1] state_code: NJ output: nj_potential_property_tax_deduction: 15_000 -- name: NJ property tax deduction is property taxes paid on main home if below threshold and not renting. - period: 2022 - absolute_error_margin: 0 - input: - rents: false - nj_homeowners_property_tax: 10_000 - state_code: NJ - nj_property_tax_deduction_eligible: true - output: - nj_potential_property_tax_deduction: 10_000 - -- name: NJ property tax deduction cannot exceed $15,000 threshold. +- name: nj_potential_property_tax_deduction test 3 period: 2022 - absolute_error_margin: 0 + absolute_error_margin: 0.01 input: - rents: false - nj_homeowners_property_tax: 20_000 - state_code: NJ - nj_property_tax_deduction_eligible: true - output: - nj_potential_property_tax_deduction: 15_000 - -- name: NJ potential property tax deduction should be $0 if ineligible. - period: 2022 - absolute_error_margin: 0 - input: - rents: false - nj_homeowners_property_tax: 20_000 - state_code: NJ - nj_property_tax_deduction_eligible: false + people: + person1: + real_estate_taxes: 8_000 + tax_units: + tax_unit: + members: [person1] + nj_property_tax_deduction_eligible: false + households: + household: + members: [person1] + state_code: NJ output: nj_potential_property_tax_deduction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_property_tax_credit_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_property_tax_credit_eligible.yaml index f049149a8..c937bdbec 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_property_tax_credit_eligible.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_property_tax_credit_eligible.yaml @@ -1,4 +1,4 @@ -- name: Ineligible for property tax deduction and not 65+ or blind/disabled, so ineligible for credit. +- name: 1 Ineligible for property tax deduction and not 65+ or blind/disabled, so ineligible for credit. period: 2022 absolute_error_margin: 0 input: @@ -13,7 +13,7 @@ output: nj_property_tax_credit_eligible: false -- name: Eligible for property tax deduction, therefore eligible for credit. +- name: 2 Eligible for property tax deduction, therefore eligible for credit. period: 2022 absolute_error_margin: 0 input: @@ -28,12 +28,12 @@ output: nj_property_tax_credit_eligible: true -- name: Ineligible for property tax deduction but above 65 and paid property taxes, therefore eligible for credit. +- name: 3 Ineligible for property tax deduction but above 65 and paid property taxes, therefore eligible for credit. period: 2022 absolute_error_margin: 0 input: nj_property_tax_deduction_eligible: false - nj_homeowners_property_tax: 100 + rent: 900 age_head: 66 age_spouse: 64 blind_head: false @@ -44,12 +44,12 @@ output: nj_property_tax_credit_eligible: true -- name: Ineligible for property tax deduction but spouse is blind and paid property taxes, therefore eligible for credit. +- name: 4 Ineligible for property tax deduction but spouse is blind and paid property taxes, therefore eligible for credit. period: 2022 absolute_error_margin: 0 input: nj_property_tax_deduction_eligible: false - nj_homeowners_property_tax: 100 + rent: 900 age_head: 64 age_spouse: 64 blind_head: false @@ -60,12 +60,12 @@ output: nj_property_tax_credit_eligible: true -- name: Ineligible for property tax deduction but above 65 but did not pay property taxes, therefore ineligible for credit. +- name: 5 Ineligible for property tax deduction but above 65 but did not pay property taxes, therefore ineligible for credit. period: 2022 absolute_error_margin: 0 input: nj_property_tax_deduction_eligible: false - nj_homeowners_property_tax: 0 + rent: 0 age_head: 66 age_spouse: 64 blind_head: false @@ -75,3 +75,49 @@ state_code: NJ output: nj_property_tax_credit_eligible: false + +- name: 6 Tax unit with taxsimid 99650 in g21.its.csv and g21.ots.csv + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 65 + employment_income: 8_010 + taxable_interest_income: 11_010 + taxable_private_pension_income: 1_000 + social_security: 6_000 + rent: 8_000 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + person2: + age: 11 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + person3: + age: 11 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + tax_units: + tax_unit: + members: [person1, person2, person3] + tax_unit_childcare_expenses: 4_000 + premium_tax_credit: 0 # not in TAXSIM35 + local_income_tax: 0 # not in TAXSIM35 + state_sales_tax: 0 # not in TAXSIM35 + spm_units: + spm_unit: + members: [person1, person2, person3] + snap: 0 # not in TAXSIM35 + tanf: 0 # not in TAXSIM35 + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: # expected results from patched TAXSIM35 2023-08-16 version + nj_agi: 19_020 + nj_property_tax_credit_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction_eligible.yaml index 34e2c9e0c..f778ee779 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction_eligible.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction_eligible.yaml @@ -1,46 +1,46 @@ -- name: Ineligible for property tax deduction or credit if income is below filing status-specific threshold. +- name: 1 Ineligible for property tax deduction or credit if income is below filing status-specific threshold. period: 2022 absolute_error_margin: 0 input: filing_status: JOINT nj_agi: 19_999 - nj_homeowners_property_tax: 123 + real_estate_taxes: 123 rents: true state_code: NJ output: nj_property_tax_deduction_eligible: false -- name: Ineligible for property tax deduction or credit if income is below filing status-specific threshold. +- name: 2 Ineligible for property tax deduction or credit if income is below filing status-specific threshold. period: 2022 absolute_error_margin: 0 input: filing_status: SINGLE nj_agi: 9_999 - nj_homeowners_property_tax: 123 + real_estate_taxes: 123 rents: true state_code: NJ output: nj_property_tax_deduction_eligible: false -- name: Income is above filing status-specific threshold and paid homeowner's property tax. +- name: 3 Income is above filing status-specific threshold and paid homeowner's property tax. period: 2022 absolute_error_margin: 0 input: filing_status: JOINT nj_agi: 100_000 - nj_homeowners_property_tax: 100 + real_estate_taxes: 100 rents: false state_code: NJ output: nj_property_tax_deduction_eligible: true -- name: Income is above filing status-specific threshold and paid nonzero rent. +- name: 4 Income is above filing status-specific threshold and paid nonzero rent. period: 2022 absolute_error_margin: 0 input: filing_status: SINGLE nj_agi: 100_000 - nj_homeowners_property_tax: 0 + real_estate_taxes: 0 rents: true state_code: NJ output: diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/taxable_income/nj_agi.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/taxable_income/nj_agi.yaml new file mode 100644 index 000000000..66c079766 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nj/tax/income/taxable_income/nj_agi.yaml @@ -0,0 +1,106 @@ +- name: 1 Test basic formula + period: 2021 + input: + adjusted_gross_income_person: [10_000] + nj_agi_additions: [1_000] + nj_agi_subtractions: [2_000] + state_code: NJ + output: + nj_agi: 9_000 + +- name: 2 Test that NJ AGI cannot be negative + period: 2021 + input: + adjusted_gross_income: 10_000 + nj_agi_additions: 1_000 + nj_agi_subtractions: 20_000 + state_code: NJ + output: + nj_agi: 0 + +- name: 3 NJ taxpayer with taxable pension income + absolute_error_margin: 0 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 62 + taxable_interest_income: 6_000 + taxable_pension_income: 12_000 + taxable_social_security: 1_000 + never_eligible_for_social_security_benefits: false + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NJ + output: + adjusted_gross_income: 19_000 # on federal form, AGI includes taxable SS + nj_agi: 0 # because pension subtraction from federal AGI is missing + # CORRECT nj_agi OUTPUT IS: + # 0 because pension income is excluded and interest/SS income excluded through "other retirement income" + +- name: 4 NJ taxpayer with no taxable pension income + absolute_error_margin: 0 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 70 + taxable_pension_income: 0 + taxable_interest_income: 7_000 + taxable_social_security: 0 + never_eligible_for_social_security_benefits: false + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NJ + output: + adjusted_gross_income: 7_000 # on federal form + nj_agi: 0 + # Interest income is excluded in other retirement income exclusion, + # plus qualifies for special exclusion. + # Note: we can infer qualify for special exclusion for those age 70+ who + # have no social security benefits because beyond age 70 there are + # no more delayed retirement credits under social security. + +- name: 5 NJ taxpayer whose only retirement exclusion is the special exclusion. + absolute_error_margin: 0 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 70 + taxable_pension_income: 0 + taxable_interest_income: 7_000 + taxable_social_security: 0 + employment_income: 3_001 + never_eligible_for_social_security_benefits: true + spm_units: + spm_unit: + members: [person1] + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: NJ + output: + adjusted_gross_income: 10_001 # on federal form + nj_agi: 7_001 # special exclusion reduces AGI by $3k + # earned income > $3k makes other retirement income exclusion unavailable diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc.yaml new file mode 100644 index 000000000..0249c55a7 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc.yaml @@ -0,0 +1,42 @@ +- name: nm_cdcc unit test 1 + period: 2022 + input: + nm_cdcc_max_amount: 800 + state_code: NM + cdcc: 300 + nm_cdcc_eligible: true + income_tax_before_credits: 400 + output: + nm_cdcc: 500 + +- name: nm_cdcc unit test 2 + period: 2022 + input: + nm_cdcc_max_amount: 300 + state_code: NM + cdcc: 200 + nm_cdcc_eligible: true + income_tax_before_credits: 0 + output: + nm_cdcc: 300 + +- name: nm_cdcc unit test 3 + period: 2023 + input: + nm_cdcc_max_amount: 900 + state_code: NM + cdcc: 200 + nm_cdcc_eligible: false + output: + nm_cdcc: 0 + +- name: nm_cdcc unit test 4 + period: 2021 + input: + nm_cdcc_max_amount: 900 + state_code: NM + cdcc: 200 + income_tax_before_credits: 0 + nm_cdcc_eligible: true + output: + nm_cdcc: 700 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible.yaml new file mode 100644 index 000000000..6b2b404f0 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible.yaml @@ -0,0 +1,228 @@ +- name: Is dependent on another return + period: 2022 + input: + dsi: true + state_code: NM + earned_income: 1 + is_disabled: false + is_tax_unit_head: true + is_tax_unit_spouse: true + tanf: 0 + nm_modified_gross_income: 30_159 + output: + nm_cdcc_eligible: false + +- name: No earned income + period: 2022 + input: + dsi: false + state_code: NM + earned_income: 0 + is_disabled: false + is_tax_unit_head: true + is_tax_unit_spouse: true + tanf: 0 + nm_modified_gross_income: 30_159 + output: + nm_cdcc_eligible: false + +- name: No earned income but disabled - eligible + period: 2022 + input: + dsi: false + state_code: NM + earned_income: 0 + is_disabled: true + is_tax_unit_head: true + is_tax_unit_spouse: true + tanf: 0 + nm_modified_gross_income: 30_159 + output: + nm_cdcc_eligible: true + +- name: Over income threshold + period: 2022 + input: + dsi: false + state_code: NM + earned_income: 0 + is_disabled: false + is_tax_unit_head: true + is_tax_unit_spouse: true + tanf: 0 + nm_modified_gross_income: 30_160 + output: + nm_cdcc_eligible: false + +- name: Receives tanf + period: 2022 + input: + dsi: false + state_code: NM + earned_income: 0 + is_disabled: false + is_tax_unit_head: true + is_tax_unit_spouse: true + tanf: 1 + nm_modified_gross_income: 30_159 + output: + nm_cdcc_eligible: false + +- name: Eligible + period: 2022 + input: + dsi: false + state_code: NM + earned_income: 1 + is_disabled: false + is_tax_unit_head: true + is_tax_unit_spouse: true + tanf: 0 + nm_modified_gross_income: 30_159 + output: + nm_cdcc_eligible: true + +- name: Joint filing, spouse no income - ineligible + period: 2022 + input: + people: + head: + is_tax_unit_head: true + is_disabled: false + earned_income: 1 + spouse: + is_tax_unit_spouse: true + is_disabled: false + earned_income: 0 + spm_units: + spm_unit: + members: [head, spouse] + tanf: 0 + tax_units: + tax_unit: + members: [head, spouse] + dsi: false + filing_status: JOINT + nm_modified_gross_income: 30_159 + households: + household: + members: [head, spouse] + state_code: NM + output: + nm_cdcc_eligible: false + +- name: Joint filing, head no income - ineligible + period: 2022 + input: + people: + head: + is_tax_unit_head: true + is_disabled: false + earned_income: 0 + spouse: + is_tax_unit_spouse: true + is_disabled: false + earned_income: 1 + spm_units: + spm_unit: + members: [head, spouse] + tanf: 0 + tax_units: + tax_unit: + members: [head, spouse] + dsi: false + filing_status: JOINT + nm_modified_gross_income: 30_159 + households: + household: + members: [head, spouse] + state_code: NM + output: + nm_cdcc_eligible: false + +- name: Joint filing, spouse disabled - eligible + period: 2022 + input: + people: + head: + is_tax_unit_head: true + is_disabled: false + earned_income: 1 + spouse: + is_tax_unit_spouse: true + is_disabled: true + earned_income: 0 + spm_units: + spm_unit: + members: [head, spouse] + tanf: 0 + tax_units: + tax_unit: + members: [head, spouse] + dsi: false + filing_status: JOINT + nm_modified_gross_income: 30_159 + households: + household: + members: [head, spouse] + state_code: NM + output: + nm_cdcc_eligible: true + +- name: Joint filing, head disabled- eligible + period: 2022 + input: + people: + head: + is_tax_unit_head: true + is_disabled: true + earned_income: 1 + spouse: + is_tax_unit_spouse: true + is_disabled: false + earned_income: 0 + spm_units: + spm_unit: + members: [head, spouse] + tanf: 0 + tax_units: + tax_unit: + members: [head, spouse] + dsi: false + filing_status: JOINT + nm_modified_gross_income: 30_159 + households: + household: + members: [head, spouse] + state_code: NM + output: + nm_cdcc_eligible: true + +- name: Joint filing both earn income + period: 2022 + input: + people: + head: + is_tax_unit_head: true + is_disabled: false + earned_income: 1 + spouse: + is_tax_unit_spouse: true + is_disabled: false + earned_income: 1 + spm_units: + spm_unit: + members: [head, spouse] + tanf: 0 + tax_units: + tax_unit: + members: [head, spouse] + dsi: false + filing_status: JOINT + nm_modified_gross_income: 30_159 + households: + household: + members: [head, spouse] + state_code: NM + output: + nm_cdcc_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible_child.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible_child.yaml new file mode 100644 index 000000000..107b50cc0 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible_child.yaml @@ -0,0 +1,26 @@ +- name: Over age eligibility + period: 2022 + input: + age: 15 + state_code: NM + is_tax_unit_dependent: true + output: + nm_cdcc_eligible_child: false + +- name: Not dependent + period: 2022 + input: + age: 14 + state_code: NM + is_tax_unit_dependent: false + output: + nm_cdcc_eligible_child: false + +- name: Eligible + period: 2022 + input: + age: 14 + state_code: NM + is_tax_unit_dependent: true + output: + nm_cdcc_eligible_child: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_max_amount.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_max_amount.yaml new file mode 100644 index 000000000..2748dead6 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_max_amount.yaml @@ -0,0 +1,172 @@ +- name: One eligible child with full childcare expenses (capped at 480) + period: 2023 + input: + people: + head: + age: 30 + nm_cdcc_eligible_child: false + child1: + age: 18 + nm_cdcc_eligible_child: false + # daily_childcare_expenses: 10 + # childcare_days_per_year: 365 + child2: + age: 8 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 10 + # childcare_days_per_year: 365 + tax_units: + tax_unit: + members: [head, child1, child2] + nm_cdcc_eligible: true + tax_unit_childcare_expenses: 7_300 + households: + household: + state_code: NM + output: + nm_cdcc_max_amount: 480 + +- name: Four eligible children with full childcare expenses (capped at 480) + period: 2023 + input: + people: + head: + age: 30 + nm_cdcc_eligible_child: false + child1: + age: 10 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 10 + # childcare_days_per_year: 365 + child2: + age: 8 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 10 + # childcare_days_per_year: 365 + child3: + age: 11 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 10 + # childcare_days_per_year: 365 + child4: + age: 10 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 10 + # childcare_days_per_year: 365 + tax_units: + tax_unit: + members: [head, child1, child2, child3, child4] + nm_cdcc_eligible: true + tax_unit_childcare_expenses: 14_600 + households: + household: + state_code: NM + output: + nm_cdcc_max_amount: 1_200 + +- name: Two eligible children with full childcare expenses (capped at 480 each) + period: 2023 + input: + people: + head: + age: 30 + nm_cdcc_eligible_child: false + child1: + age: 10 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 10 + # childcare_days_per_year: 365 + child2: + age: 8 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 10 + # childcare_days_per_year: 365 + tax_units: + tax_unit: + members: [head, child1, child2] + nm_cdcc_eligible: true + tax_unit_childcare_expenses: 7_300 + households: + household: + state_code: NM + output: + nm_cdcc_max_amount: 960 + +- name: One eligible child with childcare expenses # (6 * 20) * 0.4 = 48 + period: 2023 + input: + people: + head: + age: 30 + nm_cdcc_eligible_child: false + child1: + age: 8 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 6 + # childcare_days_per_year: 20 + tax_units: + tax_unit: + members: [head, child1] + nm_cdcc_eligible: true + tax_unit_childcare_expenses: 20 * 6 * 1 + households: + household: + state_code: NM + output: + nm_cdcc_max_amount: 48 + +- name: One eligible child with childcare expenses # (6 * 20) * 0.4 + (5 * 30) * 0.4= 108 + period: 2023 + input: + people: + head: + age: 30 + nm_cdcc_eligible_child: false + child1: + age: 8 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 6 + # childcare_days_per_year: 20 + child2: + age: 12 + nm_cdcc_eligible_child: true + # daily_childcare_expenses: 5 + # childcare_days_per_year: 30 + tax_units: + tax_unit: + members: [head, child1, child2] + nm_cdcc_eligible: true + tax_unit_childcare_expenses: 20 * 6 + 30 * 5 + households: + household: + state_code: NM + output: + nm_cdcc_max_amount: 108 + +- name: Another nm_cdcc_max_amount unit test + period: 2021 + input: + people: + head: + age: 32 + child1: + age: 12 + nm_cdcc_eligible_child: true + child2: + age: 10 + nm_cdcc_eligible_child: true + child3: + age: 8 + nm_cdcc_eligible_child: true + tax_units: + tax_unit: + members: [head, child1, child2, child3] + nm_cdcc_eligible: true + cdcc: 505 + tax_unit_childcare_expenses: 2_000 + households: + household: + members: [head, child1, child2, child3] + state_code: NM + output: + nm_cdcc_max_amount: 800 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc.yaml new file mode 100644 index 000000000..5496ac4e9 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc.yaml @@ -0,0 +1,32 @@ +- name: Not eligible + period: 2023 + input: + nm_eitc_eligible: false + eitc_maximum: 1_000 + eitc_phased_in: 1_000 + eitc_reduction: 200 + state_code: NM + output: + nm_eitc: 0 + +- name: $1,000 EITC with no reduction in 2023 + period: 2023 + input: + eitc_maximum: 1_000 + nm_eitc_eligible: true + eitc_phased_in: 1_000 + eitc_reduction: 0 + state_code: NM + output: + nm_eitc: 250 + +- name: $700 EITC in 2022 + period: 2022 + input: + eitc_maximum: 1_000 + nm_eitc_eligible: true + eitc_phased_in: 1_000 + eitc_reduction: 300 + state_code: NM + output: + nm_eitc: 140 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc_demographic_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc_demographic_eligible.yaml new file mode 100644 index 000000000..4b6d82715 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc_demographic_eligible.yaml @@ -0,0 +1,50 @@ +- name: No children and under 18, not eligible. + period: 2022 + input: + age: 17 + state_code: NM + tax_unit_children: 0 + output: + nm_eitc_demographic_eligible: false + +- name: No children and over 18, eligible. + period: 2022 + input: + age: 18 + state_code: NM + output: + nm_eitc_demographic_eligible: true + +- name: No children and over 65, eligible in 2021. + period: 2021 + input: + age: 66 + state_code: NM + output: + nm_eitc_demographic_eligible: true + +- name: No children and over 65, ineligible in 2022. + period: 2022 + input: + age: 66 + state_code: NM + output: + nm_eitc_demographic_eligible: false + +- name: Children and under 18, eligible. + period: 2022 + input: + people: + parent: + age: 17 + child: + age: 7 + tax_units: + tax_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: NM + output: + nm_eitc_demographic_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc_eligible.yaml new file mode 100644 index 000000000..9a87d51a5 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/eitc/nm_eitc_eligible.yaml @@ -0,0 +1,29 @@ +- name: Investment income ineligible. + period: 2021 + input: + eitc_investment_income_eligible: false + state_code: NM + nm_eitc_demographic_eligible: true + filing_status: JOINT + output: + nm_eitc_eligible: false + +- name: Demographic ineligible. + period: 2021 + input: + eitc_investment_income_eligible: true + state_code: NM + nm_eitc_demographic_eligible: false + filing_status: JOINT + output: + nm_eitc_eligible: false + +- name: Eligible. + period: 2021 + input: + eitc_investment_income_eligible: true + state_code: NM + nm_eitc_demographic_eligible: true + filing_status: JOINT + output: + nm_eitc_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/nm_ctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/nm_ctc.yaml new file mode 100644 index 000000000..afe322b81 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/nm_ctc.yaml @@ -0,0 +1,39 @@ +- name: No children + period: 2023 + input: + state_code: NM + eitc_child_count: 0 + adjusted_gross_income: 10_000 + filing_status: JOINT + output: + nm_ctc: 0 + +- name: Two children with $50,000 of income - joint + period: 2023 + input: + state_code: NM + eitc_child_count: 2 + adjusted_gross_income: 50_000 + filing_status: JOINT + output: + nm_ctc: 800 + +- name: Two children with $50,000 of income - separate + period: 2023 + input: + state_code: NM + eitc_child_count: 2 + adjusted_gross_income: 50_000 + filing_status: SEPARATE + output: + nm_ctc: 400 + +- name: Three children with $350,001 of income - single + period: 2023 + input: + state_code: NM + eitc_child_count: 3 + adjusted_gross_income: 350_001 + filing_status: SINGLE + output: + nm_ctc: 75 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/nm_medical_expense_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/nm_medical_expense_credit.yaml new file mode 100644 index 000000000..843468b92 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/credits/nm_medical_expense_credit.yaml @@ -0,0 +1,64 @@ +- name: Below age eligibility + period: 2023 + input: + state_code: NM + age: 64 + medical_expense: 30_000 + dsi: false + output: + nm_medical_expense_credit: 0 + +- name: Below expense eligibility + period: 2023 + input: + state_code: NM + age: 65 + medical_expense: 27_999 + filing_status: JOINT + dsi: false + output: + nm_medical_expense_credit: 0 + +- name: Eligible + period: 2023 + input: + state_code: NM + age: 65 + medical_expense: 28_000 + filing_status: JOINT + dsi: false + output: + nm_medical_expense_credit: 2_800 + +- name: Eligible - halved for separate filers + period: 2023 + input: + state_code: NM + age: 65 + medical_expense: 28_000 + filing_status: SEPARATE + dsi: false + output: + nm_medical_expense_credit: 1_400 + +- name: Output always $2,800 + period: 2023 + input: + state_code: NM + age: 65 + medical_expense: 40_000 + filing_status: SINGLE + dsi: false + output: + nm_medical_expense_credit: 2_800 + +- name: Ineligible if dependent on another return + period: 2023 + input: + state_code: NM + age: 65 + medical_expense: 40_000 + filing_status: SINGLE + dsi: true + output: + nm_medical_expense_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents.yaml new file mode 100644 index 000000000..c819101fe --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents.yaml @@ -0,0 +1,53 @@ +- name: No dependents + period: 2021 + input: + filing_status: HEAD_OF_HOUSEHOLD + tax_unit_dependents: 0 + nm_deduction_for_certain_dependents_eligible: true + output: + nm_deduction_for_certain_dependents: 0 + +- name: One child - ineligible + period: 2021 + input: + filing_status: HEAD_OF_HOUSEHOLD + tax_unit_dependents: 1 + nm_deduction_for_certain_dependents_eligible: true + output: + nm_deduction_for_certain_dependents: 0 + +- name: Single - ineligible + period: 2021 + input: + filing_status: SINGLE + nm_deduction_for_certain_dependents_eligible: true + tax_unit_dependents: 3 + output: + nm_deduction_for_certain_dependents: 0 + +- name: Ineligible + period: 2021 + input: + filing_status: HEAD_OF_HOUSEHOLD + tax_unit_dependents: 3 + nm_deduction_for_certain_dependents_eligible: false + output: + nm_deduction_for_certain_dependents: 0 + +- name: Two dependents + period: 2021 + input: + filing_status: JOINT + tax_unit_dependents: 2 + nm_deduction_for_certain_dependents_eligible: true + output: + nm_deduction_for_certain_dependents: 4_000 + +- name: Five dependents + period: 2021 + input: + filing_status: HEAD_OF_HOUSEHOLD + tax_unit_dependents: 5 + nm_deduction_for_certain_dependents_eligible: true + output: + nm_deduction_for_certain_dependents: 16_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents_eligible.yaml new file mode 100644 index 000000000..9e30e3a50 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents_eligible.yaml @@ -0,0 +1,27 @@ +- name: No exemptions claimed, not claimed as dependent on another return. + period: 2021 + input: + c04600: 0 + state_code: NM + dsi: false + output: + nm_deduction_for_certain_dependents_eligible: true + +- name: Ineligible due to federal exemptions. + period: 2021 + input: + c04600: 1 + state_code: NM + dsi: false + output: + nm_deduction_for_certain_dependents_eligible: false + + +- name: Ineligible if dependent on another return + period: 2021 + input: + c04600: 0 + state_code: NM + dsi: true + output: + nm_deduction_for_certain_dependents_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_deductions.yaml new file mode 100644 index 000000000..a35f0863f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_deductions.yaml @@ -0,0 +1,36 @@ +- name: New Mexico deductions - itemized + period: 2021 + input: + tax_unit_itemizes: true + nm_itemized_deductions: 1_000 + standard_deduction: 2_500 + nm_medical_care_expense_deduction: 500 + nm_net_capital_gains_deduction: 300 + nm_deduction_for_certain_dependents: 1_000 + state_code: NM + output: + nm_deductions: 2_800 + +- name: New Mexico deductions - standard + period: 2021 + input: + tax_unit_itemizes: false + nm_itemized_deductions: 1_000 + standard_deduction: 2_500 + nm_medical_care_expense_deduction: 500 + nm_net_capital_gains_deduction: 300 + state_code: NM + output: + nm_deductions: 3_300 + +- name: New Mexico deductions - itemized without any additions + period: 2021 + input: + tax_unit_itemizes: true + nm_itemized_deductions: 1_000 + standard_deduction: 2_500 + nm_medical_care_expense_deduction: 0 + nm_net_capital_gains_deduction: 0 + state_code: NM + output: + nm_deductions: 1_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_itemized_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_itemized_deductions.yaml new file mode 100644 index 000000000..32a6c88d0 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_itemized_deductions.yaml @@ -0,0 +1,64 @@ +- name: NM itemized deduction unit test 1 + absolute_error_margin: 1 + period: 2021 + input: + filing_status: SINGLE + tax_unit_itemizes: True + state_and_local_sales_or_income_tax: 5_000 + real_estate_taxes: 7_500 + standard_deduction: 5_000 + state_code: NM + output: + nm_itemized_deductions: 4_000 + +- name: NM itemized deduction unit test 2 + absolute_error_margin: 1 + period: 2021 + input: + filing_status: SINGLE + tax_unit_itemizes: True + state_and_local_sales_or_income_tax: 5_000 + real_estate_taxes: 0 + standard_deduction: 2_000 + state_code: NM + output: + nm_itemized_deductions: 3_000 + +- name: NM itemized deduction unit test 3 + absolute_error_margin: 1 + period: 2021 + input: + filing_status: SEPARATE + tax_unit_itemizes: True + state_and_local_sales_or_income_tax: 7_500 + real_estate_taxes: 0 + standard_deduction: 2_000 + state_code: NM + output: + nm_itemized_deductions: 3_000 + +- name: NM itemized deduction unit test 4 + absolute_error_margin: 1 + period: 2021 + input: + filing_status: SINGLE + tax_unit_itemizes: True + state_and_local_sales_or_income_tax: 0 + real_estate_taxes: 0 + standard_deduction: 2_000 + state_code: NM + output: + nm_itemized_deductions: 0 + +- name: NM itemized deduction unit test 5 + absolute_error_margin: 1 + period: 2021 + input: + filing_status: SINGLE + tax_unit_itemizes: False + state_and_local_sales_or_income_tax: 7_500 + real_estate_taxes: 0 + standard_deduction: 2_000 + state_code: NM + output: + nm_itemized_deductions: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.yaml new file mode 100644 index 000000000..19e5a23aa --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.yaml @@ -0,0 +1,399 @@ +- name: 2015 single filer adjusted gross income = 10_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 10_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SINGLE + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 single filer adjusted gross income = 15_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 15_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SINGLE + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 single filer adjusted gross income = 20_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 20_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SINGLE + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 single filer adjusted gross income = 35_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 35_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SINGLE + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 single filer adjusted gross income = 45_000 and medical out of pocket expense = 1_000, the deduction amount is 100 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 45_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SINGLE + output: + nm_medical_care_expense_deduction: 100 + +- name: 2015 separate filer adjusted gross income = 10_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 10_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SEPARATE + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 separate filer adjusted gross income = 15_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 15_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SEPARATE + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 separate filer adjusted gross income = 20_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 20_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SEPARATE + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 separate filer adjusted gross income = 35_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 35_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SEPARATE + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 separate filer adjusted gross income = 45_000 and medical out of pocket expense = 1_000, the deduction amount is 100 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 45_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SEPARATE + output: + nm_medical_care_expense_deduction: 100 + +- name: 2015 joint filer adjusted gross income = 10_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 10_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: JOINT + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 joint filer adjusted gross income = 30_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 30_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: JOINT + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 joint filer adjusted gross income = 50_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 50_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: JOINT + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 joint filer adjusted gross income = 70_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 70_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: JOINT + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 joint filer adjusted gross income = 80_000 and medical out of pocket expense = 1_000, the deduction amount is 100 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 80_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: JOINT + output: + nm_medical_care_expense_deduction: 100 + +- name: 2015 widow filer adjusted gross income = 10_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 10_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: WIDOW + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 widow filer adjusted gross income = 30_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 30_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: WIDOW + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 widow filer adjusted gross income = 50_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 50_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: WIDOW + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 widow filer adjusted gross income = 70_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 70_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: WIDOW + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 widow filer adjusted gross income = 80_000 and medical out of pocket expense = 1_000, the deduction amount is 100 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 80_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: WIDOW + output: + nm_medical_care_expense_deduction: 100 + +- name: 2015 head of household filer adjusted gross income = 10_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 10_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 head of household filer adjusted gross income = 20_000 and medical out of pocket expense = 1_000, the deduction amount is 250 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 20_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + nm_medical_care_expense_deduction: 250 + +- name: 2015 head of household filer adjusted gross income = 40_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 40_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 head of household filer adjusted gross income = 50_000 and medical out of pocket expense = 1_000, the deduction amount is 150 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 50_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + nm_medical_care_expense_deduction: 150 + +- name: 2015 head of household filer adjusted gross income = 60_000 and medical out of pocket expense = 1_000, the deduction amount is 100 + period: 2015 + input: + state_code: NM + adjusted_gross_income: 60_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + nm_medical_care_expense_deduction: 100 + +- name: 2025 single filer adjusted gross income = 15_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 15_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SINGLE + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 single filer adjusted gross income = 35_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 35_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SINGLE + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 single filer adjusted gross income = 45_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 45_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SINGLE + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 separate filer adjusted gross income = 15_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 15_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SEPARATE + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 separate filer adjusted gross income = 35_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 35_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SEPARATE + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 separate filer adjusted gross income = 45_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 45_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: SEPARATE + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 joint filer adjusted gross income = 30_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 30_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: JOINT + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 joint filer adjusted gross income = 70_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 70_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: JOINT + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 joint filer adjusted gross income = 80_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 80_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: JOINT + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 widow filer adjusted gross income = 30_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 30_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: WIDOW + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 widow filer adjusted gross income = 70_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 70_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: WIDOW + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 widow filer adjusted gross income = 80_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 80_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: WIDOW + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 head of household filer adjusted gross income = 20_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 20_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 head of household filer adjusted gross income = 50_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 50_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + nm_medical_care_expense_deduction: 0 + +- name: 2025 head of household filer adjusted gross income = 60_000 and medical out of pocket expense = 1_000, the deduction amount is 0 + period: 2025 + input: + state_code: NM + adjusted_gross_income: 60_000 + medical_out_of_pocket_expenses: 1_000 + filing_status: HEAD_OF_HOUSEHOLD + output: + nm_medical_care_expense_deduction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_net_capital_gains_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_net_capital_gains_deduction.yaml new file mode 100644 index 000000000..84ddef7d3 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_net_capital_gains_deduction.yaml @@ -0,0 +1,35 @@ +- name: No capital gains + period: 2021 + input: + filing_status: SINGLE + capital_gains: 0 + state_code: NM + output: + nm_net_capital_gains_deduction: 0 + +- name: 40% if capital gains if larger than $1,000 - separate filing + period: 2021 + input: + filing_status: SEPARATE + capital_gains: 10_000 + state_code: NM + output: + nm_net_capital_gains_deduction: 2_000 + +- name: Allows for a $1,000 max amount if 40% of capital gains is less than $1,000 - joint + period: 2021 + input: + filing_status: JOINT + capital_gains: 2_000 + state_code: NM + output: + nm_net_capital_gains_deduction: 1_000 + +- name: Allows for a $500 max amount if 40% of capital gains is less than $500 - separate + period: 2021 + input: + filing_status: SEPARATE + capital_gains: 1_000 + state_code: NM + output: + nm_net_capital_gains_deduction: 500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.yaml new file mode 100644 index 000000000..57f4fc3fc --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.yaml @@ -0,0 +1,211 @@ +- name: 2023 single filer, not blind, age < 65, adjusted gross income = 18_000, the exemption amount is 0 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 18_000 + blind_head: false + age_head: 60 + filing_status: SINGLE + output: + nm_aged_blind_exemption: 0 + +- name: 2023 single filer, blind, age < 65, adjusted gross income = 18_000, the exemption amount is 8_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 18_000 + blind_head: true + age_head: 60 + filing_status: SINGLE + output: + nm_aged_blind_exemption: 8_000 + +- name: 2023 single filer, not blind, age > 65, adjusted gross income = 18_000, the exemption amount is 8_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 18_000 + blind_head: false + age_head: 67 + filing_status: SINGLE + output: + nm_aged_blind_exemption: 8_000 + +- name: 2023 single filer, blind, age > 65, adjusted gross income = 18_000, the exemption amount is 8_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 18_000 + blind_head: true + age_head: 67 + filing_status: SINGLE + output: + nm_aged_blind_exemption: 8_000 + +- name: 2023 single filer, blind, age < 65, adjusted gross income = 19_500, the exemption amount is 7_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 19_500 + blind_head: true + age_head: 60 + filing_status: SINGLE + output: + nm_aged_blind_exemption: 7_000 + +- name: 2023 single filer, blind, age > 65, adjusted gross income = 21_000, the exemption amount is 6_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 21_000 + blind_head: true + age_head: 67 + filing_status: SINGLE + output: + nm_aged_blind_exemption: 6_000 + +- name: 2023 joint filer, both blind, both age > 65, adjusted gross income = 30_000, the exemption amount is 16_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 30_000 + blind_head: true + blind_spouse: true + age_head: 67 + age_spouse: 67 + filing_status: JOINT + output: + nm_aged_blind_exemption: 16_000 + +- name: 2023 joint filer, both blind, both age < 65, adjusted gross income = 30_000, the exemption amount is 16_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 30_000 + blind_head: true + blind_spouse: true + age_head: 60 + age_spouse: 60 + filing_status: JOINT + output: + nm_aged_blind_exemption: 16_000 + +- name: 2023 joint filer, both not blind, both age < 65, adjusted gross income = 30_000, the exemption amount is 0 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 30_000 + blind_head: false + blind_spouse: false + age_head: 60 + age_spouse: 60 + filing_status: JOINT + output: + nm_aged_blind_exemption: 0 + +- name: 2023 joint filer, both not blind, both age > 65, adjusted gross income = 30_000, the exemption amount is 16_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 30_000 + blind_head: false + blind_spouse: false + age_head: 67 + age_spouse: 67 + filing_status: JOINT + output: + nm_aged_blind_exemption: 16_000 + +- name: 2023 separate filer, not blind, age < 65, adjusted gross income = 18_000, the exemption amount is 0 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 18_000 + blind_head: false + age_head: 60 + filing_status: SEPARATE + output: + nm_aged_blind_exemption: 0 + +- name: 2023 single filer, blind, age < 65, adjusted gross income = 18_000, the exemption amount is 6_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 18_000 + blind_head: true + age_head: 60 + filing_status: SEPARATE + output: + nm_aged_blind_exemption: 6_000 + +- name: 2023 single filer, blind, age > 65, adjusted gross income = 18_000, the exemption amount is 6_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 18_000 + blind_head: true + age_head: 67 + filing_status: SEPARATE + output: + nm_aged_blind_exemption: 6_000 + +- name: 2023 widow(er) filer, blind, age < 65, adjusted gross income = 42_000, the exemption amount is 4_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 42_000 + blind_head: true + age_head: 60 + filing_status: WIDOW + output: + nm_aged_blind_exemption: 4_000 + +- name: 2023 head of household filer, blind, age > 65, adjusted gross income = 39_000, the exemption amount is 5_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 39_000 + blind_head: true + age_head: 60 + filing_status: HEAD_OF_HOUSEHOLD + output: + nm_aged_blind_exemption: 5_000 + +- name: 2023 joint filer, both not blind, both age > 65, adjusted gross income = 35_000, the exemption amount is 13_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 35_000 + blind_head: false + blind_spouse: false + age_head: 67 + age_spouse: 67 + filing_status: JOINT + output: + nm_aged_blind_exemption: 12_000 + +- name: 2023 joint filer, both blind, both age > 65, adjusted gross income = 35_000, the exemption amount is 13_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 35_000 + blind_head: true + blind_spouse: true + age_head: 67 + age_spouse: 67 + filing_status: JOINT + output: + nm_aged_blind_exemption: 12_000 + +- name: 2023 joint filer, head not blind and age = 65, spouse blind and age = 45, adjusted gross income = 28_000, the exemption amount is 16_000 + period: 2023 + input: + state_code: NM + adjusted_gross_income: 28_000 + blind_head: false + blind_spouse: true + age_head: 65 + age_spouse: 45 + filing_status: JOINT + output: + nm_aged_blind_exemption: 16_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_hundred_year_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_hundred_year_exemption.yaml new file mode 100644 index 000000000..9ed4d3071 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_hundred_year_exemption.yaml @@ -0,0 +1,53 @@ +- name: Ineligible + period: 2023 + input: + state_code: NM + age_head: 99 + age_spouse: 99 + adjusted_gross_income: 10_000 + filing_status: JOINT + output: + nm_hundred_year_exemption: 0 + +- name: Head eligible - half exemption + period: 2023 + input: + state_code: NM + age_head: 100 + age_spouse: 99 + adjusted_gross_income: 10_000 + filing_status: JOINT + output: + nm_hundred_year_exemption: 5_000 + +- name: Spouse eligible - half exemption + period: 2023 + input: + state_code: NM + age_head: 99 + age_spouse: 100 + adjusted_gross_income: 10_000 + filing_status: JOINT + output: + nm_hundred_year_exemption: 5_000 + +- name: Both eligible - full exemption + period: 2023 + input: + state_code: NM + age_head: 100 + age_spouse: 100 + adjusted_gross_income: 10_000 + filing_status: JOINT + output: + nm_hundred_year_exemption: 10_000 + +- name: Single person eligible - full exemption + period: 2023 + input: + state_code: NM + age_head: 100 + adjusted_gross_income: 10_000 + filing_status: SINGLE + output: + nm_hundred_year_exemption: 10_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_low_and_middle_income_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_low_and_middle_income_exemption.yaml new file mode 100644 index 000000000..83cb7666a --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_low_and_middle_income_exemption.yaml @@ -0,0 +1,29 @@ +- name: Ineligible SINGLE + period: 2023 + input: + state_code: NM + filing_status: SINGLE + adjusted_gross_income: 36_668 + exemptions: 1 + output: + nm_low_and_middle_income_exemption: 0 + +- name: Joint with 2 exemptions and no reduction + period: 2023 + input: + state_code: NM + filing_status: JOINT + adjusted_gross_income: 30_000 + exemptions: 2 + output: + nm_low_and_middle_income_exemption: 5_000 + +- name: Widow with 3 exemptions + reduction # 2_500 - ((40_000 - 30_000) * 0.1) = 1_500 * 3 + period: 2023 + input: + state_code: NM + filing_status: WIDOW + adjusted_gross_income: 40_000 + exemptions: 3 + output: + nm_low_and_middle_income_exemption: 4_500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_medical_expense_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_medical_expense_exemption.yaml new file mode 100644 index 000000000..249f83ac8 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_medical_expense_exemption.yaml @@ -0,0 +1,49 @@ +- name: Below age eligibility + period: 2023 + input: + state_code: NM + age: 64 + medical_expense: 30_000 + filing_status: JOINT + output: + nm_medical_expense_exemption: 0 + +- name: Below expense eligibility + period: 2023 + input: + state_code: NM + age: 65 + medical_expense: 27_999 + filing_status: JOINT + output: + nm_medical_expense_exemption: 0 + +- name: Eligible + period: 2023 + input: + state_code: NM + age: 65 + medical_expense: 28_000 + filing_status: JOINT + output: + nm_medical_expense_exemption: 3_000 + +- name: Eligible - halved for separate filers + period: 2023 + input: + state_code: NM + age: 65 + medical_expense: 28_000 + filing_status: SEPARATE + output: + nm_medical_expense_exemption: 1_500 + +- name: Output always $3,000 + period: 2023 + input: + state_code: NM + age: 65 + medical_expense: 40_000 + filing_status: WIDOW + output: + nm_medical_expense_exemption: 3_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_social_security_income_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_social_security_income_exemption.yaml new file mode 100644 index 000000000..cf69d1649 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/exemptions/nm_social_security_income_exemption.yaml @@ -0,0 +1,39 @@ +- name: No agi + period: 2023 + input: + state_code: NM + filing_status: SINGLE + tax_unit_taxable_social_security: 0 + adjusted_gross_income: 0 + output: + nm_social_security_income_exemption: 0 + +- name: AGI above limit - single + period: 2023 + input: + state_code: NM + filing_status: SINGLE + tax_unit_taxable_social_security: 70_000 + adjusted_gross_income: 100_001 + output: + nm_social_security_income_exemption: 0 + +- name: AGI below limit - single + period: 2023 + input: + state_code: NM + filing_status: SINGLE + tax_unit_taxable_social_security: 80_000 + adjusted_gross_income: 100_000 + output: + nm_social_security_income_exemption: 80_000 + +- name: AGI below limit - joint + period: 2023 + input: + state_code: NM + filing_status: JOINT + tax_unit_taxable_social_security: 149_000 + adjusted_gross_income: 150_000 + output: + nm_social_security_income_exemption: 149_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.yaml new file mode 100644 index 000000000..8f3b65687 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.yaml @@ -0,0 +1,26 @@ +- name: Single family with no income + period: 2023 + input: + state_code: NM + nm_taxable_income: 0 + filing_status: SINGLE + output: + nm_income_tax_before_non_refundable_credits: 0 + +- name: Joint family with 10,000 of income #((10,000 - 8,000) * 0.032 + 8,000 * 0.017) + period: 2023 + input: + state_code: NM + nm_taxable_income: 10_000 + filing_status: JOINT + output: + nm_income_tax_before_non_refundable_credits: 200 + +- name: Widow filer with 10,000 of income + period: 2023 + input: + state_code: NM + nm_taxable_income: 6_000 + filing_status: WIDOW + output: + nm_income_tax_before_non_refundable_credits: 102 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..4cbdc70b8 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_income_tax_before_refundable_credits.yaml @@ -0,0 +1,17 @@ +- name: Calculation + period: 2023 + input: + state_code: NM + nm_income_tax_before_non_refundable_credits: 2_000 + nm_non_refundable_credits: 500 + output: + nm_income_tax_before_refundable_credits: 1_500 + +- name: Capped at 0 + period: 2023 + input: + state_code: NM + nm_income_tax_before_non_refundable_credits: 200 + nm_non_refundable_credits: 500 + output: + nm_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_taxable_income.yaml new file mode 100644 index 000000000..be892c06d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/nm_taxable_income.yaml @@ -0,0 +1,23 @@ +- name: Capped at 0 + period: 2023 + input: + adjusted_gross_income: 100 + nm_additions: 100 + nm_deductions: 200 + nm_exemptions: 300 + nm_other_deductions_and_exemptions: 400 + state_code: NM + output: + nm_taxable_income: 0 + +- name: Calculation + period: 2023 + input: + adjusted_gross_income: 1_500 + nm_additions: 100 + nm_deductions: 200 + nm_exemptions: 300 + nm_other_deductions_and_exemptions: 400 + state_code: NM + output: + nm_taxable_income: 700 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_2021_income_rebate.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_2021_income_rebate.yaml new file mode 100644 index 000000000..e6e349fdd --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_2021_income_rebate.yaml @@ -0,0 +1,49 @@ +- name: Income eligible - single + period: 2021 + input: + state_code: NM + adjusted_gross_income: 74_999 + filing_status: SINGLE + dsi: false + output: + nm_2021_income_rebate: 250 + +- name: Income ineligible - separate + period: 2021 + input: + state_code: NM + adjusted_gross_income: 75_000 + filing_status: SEPARATE + dsi: false + output: + nm_2021_income_rebate: 0 + +- name: Income eligible - joint + period: 2021 + input: + state_code: NM + adjusted_gross_income: 149_999 + filing_status: JOINT + dsi: false + output: + nm_2021_income_rebate: 500 + +- name: Income ineligible - widow + period: 2021 + input: + state_code: NM + adjusted_gross_income: 150_000 + filing_status: WIDOW + dsi: false + output: + nm_2021_income_rebate: 0 + +- name: Ineligible if depedent on another return + period: 2021 + input: + state_code: NM + adjusted_gross_income: 149_999 + filing_status: JOINT + dsi: true + output: + nm_2021_income_rebate: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_additional_2021_income_rebate.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_additional_2021_income_rebate.yaml new file mode 100644 index 000000000..0763f3a90 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_additional_2021_income_rebate.yaml @@ -0,0 +1,62 @@ +- name: Joint + period: 2021 + input: + state_code: NM + filing_status: JOINT + dsi: false + output: + nm_additional_2021_income_rebate: 1_000 + +- name: Single + period: 2021 + input: + state_code: NM + filing_status: SINGLE + dsi: false + output: + nm_additional_2021_income_rebate: 500 + +- name: Separate + period: 2021 + input: + state_code: NM + filing_status: SEPARATE + dsi: false + output: + nm_additional_2021_income_rebate: 500 + +- name: Widow + period: 2021 + input: + state_code: NM + filing_status: WIDOW + dsi: false + output: + nm_additional_2021_income_rebate: 1_000 + +- name: Head of Household + period: 2021 + input: + state_code: NM + filing_status: HEAD_OF_HOUSEHOLD + dsi: false + output: + nm_additional_2021_income_rebate: 1_000 + +- name: Only available in 2021 + period: 2022 + input: + state_code: NM + filing_status: SEPARATE + dsi: false + output: + nm_additional_2021_income_rebate: 0 + +- name: Ineligible if depedent on another return + period: 2021 + input: + state_code: NM + filing_status: SEPARATE + dsi: true + output: + nm_additional_2021_income_rebate: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_supplemental_2021_income_rebate.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_supplemental_2021_income_rebate.yaml new file mode 100644 index 000000000..dc7c0bcba --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/2021_income/nm_supplemental_2021_income_rebate.yaml @@ -0,0 +1,62 @@ +- name: Joint + period: 2021 + input: + state_code: NM + filing_status: JOINT + dsi: false + output: + nm_supplemental_2021_income_rebate: 1_000 + +- name: Single + period: 2021 + input: + state_code: NM + filing_status: SINGLE + dsi: false + output: + nm_supplemental_2021_income_rebate: 500 + +- name: Only available in 2021 + period: 2022 + input: + state_code: NM + filing_status: SEPARATE + dsi: false + output: + nm_supplemental_2021_income_rebate: 0 + +- name: Separate + period: 2021 + input: + state_code: NM + filing_status: SEPARATE + dsi: false + output: + nm_supplemental_2021_income_rebate: 500 + +- name: Widow + period: 2021 + input: + state_code: NM + filing_status: WIDOW + dsi: false + output: + nm_supplemental_2021_income_rebate: 1_000 + +- name: Head of Household + period: 2021 + input: + state_code: NM + filing_status: HEAD_OF_HOUSEHOLD + dsi: false + output: + nm_supplemental_2021_income_rebate: 1_000 + +- name: Ineligible if depedent on another return + period: 2021 + input: + state_code: NM + filing_status: HEAD_OF_HOUSEHOLD + dsi: true + output: + nm_supplemental_2021_income_rebate: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/integration.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/integration.yaml new file mode 100644 index 000000000..0ce1462c3 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/integration.yaml @@ -0,0 +1,31 @@ +- name: Case from https://github.com/PolicyEngine/fiscalsim-us/issues/2729#issue-1826321302. Tax unit with taxsimid 86990 in p21.its.csv and p21.ots.csv. + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 66 + employment_income: 1_010 + ssi: 0 + state_supplement: 0 + person2: + is_tax_unit_spouse: true + age: 66 + employment_income: 8_010 + ssi: 0 + state_supplement: 0 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + tanf: 0 + households: + household: + members: [person1, person2] + state_code: NM + output: + nm_low_income_comprehensive_tax_rebate_exemptions: 6 + nm_low_income_comprehensive_tax_rebate: 665 # TAXSIM says 699. diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate.yaml new file mode 100644 index 000000000..5c56cc22f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate.yaml @@ -0,0 +1,221 @@ +- name: separate filing, agi in any tax bracket, 0 exemption + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 10_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 0 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 0 + +- name: separate filing, agi in 1st tax bracket, 1 exemption + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 1 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 97.5 + +- name: single filing, agi in 1st tax bracket, 1 exemption + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 1 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 195 + +- name: separate filing, agi in 2nd tax bracket, 1 exemption + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 2_501 + nm_low_income_comprehensive_tax_rebate_exemptions: 1 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 110 + +- name: single filing, agi in 2nd tax bracket, 1 exemption + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 2_501 + nm_low_income_comprehensive_tax_rebate_exemptions: 1 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 220 + +- name: separate filing, agi above 36_000, 1 exemption + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 36_001 + nm_low_income_comprehensive_tax_rebate_exemptions: 1 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 0 + +- name: single filing, agi above 36_000, 1 exemption + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 36_001 + nm_low_income_comprehensive_tax_rebate_exemptions: 1 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 0 + +- name: separate filing, agi in 1st tax bracket, 2 exemptions + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 2 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 130 + +- name: single filing, agi in 1st tax bracket, 2 exemptions + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 2 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 260 + +- name: separate filing, agi equals 36_000, 2 exemptions + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 36_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 2 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 17.5 + +- name: single filing, agi equals 36_000, 2 exemptions + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 36_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 2 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 35 + +- name: separate filing, agi in 1st tax bracket, 3 exemptions + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 3 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 162.5 + +- name: single filing, agi in 1st tax bracket, 3 exemptions + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 3 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 325 + +- name: separate filing, agi in 1st tax bracket, 4 exemptions + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 4 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 195 + +- name: single filing, agi in 1st tax bracket, 4 exemptions + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 4 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 390 + +- name: separate filing, agi in 1st tax bracket, 5 exemptions + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 5 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 227.5 + +- name: single filing, agi in 1st tax bracket, 5 exemptions + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 5 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 455 + +- name: separate filing, agi in 1st tax bracket, 6 exemptions + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 6 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 260 + +- name: single filing, agi in 1st tax bracket, 6 exemptions + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 6 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 520 + +- name: separate filing, agi in 1st tax bracket, 7 exemptions + period: 2022 + absolute_error_margin: 0.001 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 7 + filing_status: SEPARATE + output: + nm_low_income_comprehensive_tax_rebate: 260 + +- name: single filing, agi in 1st tax bracket, 7 exemptions + period: 2022 + input: + state_code: NM + nm_modified_gross_income: 1_000 + nm_low_income_comprehensive_tax_rebate_exemptions: 7 + filing_status: SINGLE + output: + nm_low_income_comprehensive_tax_rebate: 520 + diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate_exemptions.yaml new file mode 100644 index 000000000..aad22dfc2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate_exemptions.yaml @@ -0,0 +1,26 @@ +- name: Only normal exemptions. + period: 2022 + input: + state_code: NM + exemptions: 2 + output: + nm_low_income_comprehensive_tax_rebate_exemptions: 2 + +- name: Exemptions plus aged head and spouse get 2 + 2 = 2. + period: 2022 + input: + state_code: NM + exemptions: 2 + age_head: 65 + age_spouse: 65 + output: + nm_low_income_comprehensive_tax_rebate_exemptions: 6 + +- name: Single person who is blind. + period: 2022 + input: + state_code: NM + exemptions: 1 + blind_head: true + output: + nm_low_income_comprehensive_tax_rebate_exemptions: 2 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/nm_property_tax_rebate.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/nm_property_tax_rebate.yaml new file mode 100644 index 000000000..08fc949b3 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/nm_property_tax_rebate.yaml @@ -0,0 +1,71 @@ +- name: Ineligible + period: 2023 + input: + state_code: NM + nm_modified_gross_income: 3_000 + nm_property_tax_rebate_eligible: false + real_estate_taxes: 1_000 + rent: 200 + filing_status: SINGLE + output: + nm_property_tax_rebate: 0 + +- name: No rent or taxes + period: 2023 + input: + state_code: NM + nm_modified_gross_income: 16_000 + nm_property_tax_rebate_eligible: true + real_estate_taxes: 0 + rent: 0 + filing_status: SINGLE + output: + nm_property_tax_rebate: 0 + +- name: Rebate capped at 250 for joint filers + period: 2023 + input: + state_code: NM + nm_modified_gross_income: 16_000 + nm_property_tax_rebate_eligible: true + real_estate_taxes: 1_000 + rent: 0 + filing_status: JOINT + output: + nm_property_tax_rebate: 250 + +- name: Max tax liability of $180 for agi of 16,000 - should be 0 rebate + period: 2023 + input: + state_code: NM + nm_modified_gross_income: 16_000 + nm_property_tax_rebate_eligible: true + real_estate_taxes: 180 + rent: 0 + filing_status: JOINT + output: + nm_property_tax_rebate: 0 + +- name: Rebate capped at 250 for separate filers + period: 2023 + input: + state_code: NM + nm_modified_gross_income: 16_000 + nm_property_tax_rebate_eligible: true + real_estate_taxes: 1_000 + rent: 0 + filing_status: SEPARATE + output: + nm_property_tax_rebate: 125 + +- name: Calculation of 6% of rent # 5,000 * 0.06 - 180 = 120 + period: 2023 + input: + state_code: NM + nm_modified_gross_income: 16_000 + nm_property_tax_rebate_eligible: true + real_estate_taxes: 0 + rent: 5_000 + filing_status: JOINT + output: + nm_property_tax_rebate: 120 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/nm_property_tax_rebate_eligibility.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/nm_property_tax_rebate_eligibility.yaml new file mode 100644 index 000000000..d673a251d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/rebates/nm_property_tax_rebate_eligibility.yaml @@ -0,0 +1,49 @@ +- name: Both filers ineligible + period: 2023 + input: + state_code: NM + age_head: 64 + age_spouse: 64 + nm_modified_gross_income: 16_000 + output: + nm_property_tax_rebate_eligible: false + +- name: Head eligible + period: 2023 + input: + state_code: NM + age_head: 65 + age_spouse: 64 + nm_modified_gross_income: 16_000 + output: + nm_property_tax_rebate_eligible: true + +- name: Spouse eligible + period: 2023 + input: + state_code: NM + age_head: 64 + age_spouse: 65 + nm_modified_gross_income: 16_000 + output: + nm_property_tax_rebate_eligible: true + +- name: Income ineligible + period: 2023 + input: + state_code: NM + age_head: 64 + age_spouse: 65 + nm_modified_gross_income: 16_001 + output: + nm_property_tax_rebate_eligible: false + +- name: Both eligible + period: 2023 + input: + state_code: NM + age_head: 65 + age_spouse: 65 + nm_modified_gross_income: 16_000 + output: + nm_property_tax_rebate_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_adoption_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_adoption_credit.yaml new file mode 100644 index 000000000..b70fa4088 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_adoption_credit.yaml @@ -0,0 +1,187 @@ +- name: In 2023, taxpayer adopted 1 children, age < 18, the eligible adoption-related expenses were 1_000 , the ohio adoption credit was 0 + period: 2023 + input: + qualified_adoption_assistance_expense: 1_000 + age: 10 + state_code: OH + output: + oh_adoption_credit: 0 + +- name: In 2021, taxpayer adopted 1 children, age >= 18, the eligible adoption-related expenses were 1_000 , the ohio adoption credit was 0 + period: 2021 + input: + qualified_adoption_assistance_expense: 1_000 + age: 18 + state_code: OH + output: + oh_adoption_credit: 0 + +- name: In 2021, taxpayer adopted 1 children, age < 18, the eligible adoption-related expenses were 1_000 , the ohio adoption credit was 1_500 + period: 2021 + input: + qualified_adoption_assistance_expense: 1_000 + age: 10 + state_code: OH + output: + oh_adoption_credit: 1_500 + +- name: In 2021, taxpayer adopted 1 children, age < 18, the eligible adoption-related expenses were 1_500 , the ohio adoption credit was 1_500 + period: 2021 + input: + qualified_adoption_assistance_expense: 1_500 + age: 10 + state_code: OH + output: + oh_adoption_credit: 1_500 + +- name: In 2021, taxpayer adopted 1 children, age < 18, the eligible adoption-related expenses were 3_000 , the ohio adoption credit was 3_000 + period: 2021 + input: + qualified_adoption_assistance_expense: 3_000 + age: 10 + state_code: OH + output: + oh_adoption_credit: 3_000 + +- name: In 2021, taxpayer adopted 1 children, age < 18, the eligible adoption-related expenses were 10_000 , the ohio adoption credit was 10_000 + period: 2021 + input: + qualified_adoption_assistance_expense: 10_000 + age: 10 + state_code: OH + output: + oh_adoption_credit: 10_000 + +- name: In 2021, taxpayer adopted 1 children, age < 18, the eligible adoption-related expenses were 15_000 , the ohio adoption credit was 10_000 + period: 2021 + input: + qualified_adoption_assistance_expense: 15_000 + age: 10 + state_code: OH + output: + oh_adoption_credit: 10_000 + +- name: In 2021, taxpayer adopted 2 children, age < 18, the eligible adoption-related expenses were 1_000 and 1_200 separately, the ohio adoption credit was 3_000 + period: 2021 + input: + people: + child1: + qualified_adoption_assistance_expense: 1_000 + age: 10 + child2: + qualified_adoption_assistance_expense: 1_200 + age: 5 + households: + household: + members: [child1, child2] + state_code: OH + output: + oh_adoption_credit: 3_000 + +- name: In 2021, taxpayer adopted 2 children, age < 18, the eligible adoption-related expenses were 1_000 and 5_000 separately, the ohio adoption credit was 6_500 + period: 2021 + input: + people: + child1: + qualified_adoption_assistance_expense: 1_000 + age: 10 + child2: + qualified_adoption_assistance_expense: 5_000 + age: 2 + households: + household: + members: [child1, child2] + state_code: OH + output: + oh_adoption_credit: 6_500 + +- name: In 2021, taxpayer adopted 2 children, age < 18, the eligible adoption-related expenses were 8_000 and 5_000 separately, the ohio adoption credit was 13_000 + period: 2021 + input: + people: + child1: + qualified_adoption_assistance_expense: 8_000 + age: 10 + child2: + qualified_adoption_assistance_expense: 5_000 + age: 6 + households: + household: + members: [child1, child2] + state_code: OH + output: + oh_adoption_credit: 13_000 + +- name: In 2021, taxpayer adopted 2 children, age < 18, the eligible adoption-related expenses were 8_000 and 10_000 separately, the ohio adoption credit was 18_000 + period: 2021 + input: + people: + child1: + qualified_adoption_assistance_expense: 8_000 + age: 7 + child2: + qualified_adoption_assistance_expense: 15_000 + age: 4 + households: + household: + members: [child1, child2] + state_code: OH + output: + oh_adoption_credit: 18_000 + +- name: In 2021, taxpayer adopted 2 children, age < 18, the eligible adoption-related expenses were 15_000 and 10_000 separately, the ohio adoption credit was 20_000 + period: 2021 + input: + people: + child1: + qualified_adoption_assistance_expense: 15_000 + age: 10 + child2: + qualified_adoption_assistance_expense: 20_000 + age: 8 + households: + household: + members: [child1, child2] + state_code: OH + output: + oh_adoption_credit: 20_000 + +- name: In 2021, taxpayer adopted 2 children, one age < 18, the other age >= 18, the eligible adoption-related expenses were 15_000 and 10_000 separately, the ohio adoption credit was 10_000 + period: 2021 + input: + people: + child1: + qualified_adoption_assistance_expense: 15_000 + age: 10 + child2: + qualified_adoption_assistance_expense: 20_000 + age: 18 + households: + household: + members: [child1, child2] + state_code: OH + output: + oh_adoption_credit: 10_000 + +- name: In 2021, taxpayer adopted 4 children, age < 18, the eligible adoption-related expenses were 1_000, 1_500, 10_000 and 15_000 separately, the ohio adoption credit was 23_000 + period: 2021 + input: + people: + child1: + qualified_adoption_assistance_expense: 1_000 + age: 10 + child2: + qualified_adoption_assistance_expense: 1_500 + age: 15 + child3: + qualified_adoption_assistance_expense: 10_000 + age: 7 + child4: + qualified_adoption_assistance_expense: 15_000 + age: 2 + households: + household: + members: [child1, child2, child3, child4] + state_code: OH + output: + oh_adoption_credit: 23_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_cdcc.yaml new file mode 100644 index 000000000..2d8827180 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_cdcc.yaml @@ -0,0 +1,35 @@ +- name: child and dependent care credit low AGI (full eligibility) + period: 2021 + input: + state_code: OH + oh_agi: 19_999 + cdcc: 2_000 + output: + oh_cdcc: 2_000 + +- name: child and dependent care credit test, just above lower threshold AGI (.25 * federal CDCC) + period: 2021 + input: + state_code: OH + oh_agi: 20_000 + cdcc: 2_000 + output: + oh_cdcc: 500 + +- name: child and dependent care credit test, solidly above lower threshold AGI (.25 * federal CDCC) + period: 2021 + input: + state_code: OH + oh_agi: 39_999 + cdcc: 2_000 + output: + oh_cdcc: 500 + +- name: child and dependent care credit test above upper threshold (ineligible) + period: 2021 + input: + state_code: OH + oh_agi: 40_000 + cdcc: 2_000 + output: + oh_cdcc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_eitc.yaml new file mode 100644 index 000000000..349dc3713 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_eitc.yaml @@ -0,0 +1,24 @@ +- name: No matched credit + period: 2021 + input: + state_code: OH + earned_income_tax_credit: 0 + output: + oh_eitc: 0 + +- name: match + period: 2021 + absolute_error_margin: 0.001 + input: + state_code: OH + earned_income_tax_credit: 100 + output: + oh_eitc: 30 + +- name: Outside OH is ineligible + period: 2021 + input: + state_code: MA + earned_income_tax_credit: 100 + output: + oh_eitc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_non_public_school_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_non_public_school_credits.yaml new file mode 100644 index 000000000..b93e60e3b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_non_public_school_credits.yaml @@ -0,0 +1,92 @@ +- name: AGI Not eligible + period: 2021 + input: + adjusted_gross_income: 100_000 + non_public_school_tuition: 1_000 + state_code: OH + output: + oh_non_public_school_credits: 0 + +- name: Non public tuition less than cap + period: 2021 + input: + adjusted_gross_income: 49_999 + non_public_school_tuition: 400 + state_code: OH + output: + oh_non_public_school_credits: 400 + +- name: AGI less than $50,000 + period: 2021 + input: + adjusted_gross_income: 49_999 + non_public_school_tuition: 1_000 + state_code: OH + output: + oh_non_public_school_credits: 500 + +- name: AGI greater that $50,000 capped + period: 2021 + input: + adjusted_gross_income: 50_000 + non_public_school_tuition: 1_500 + state_code: OH + output: + oh_non_public_school_credits: 1_000 + +- name: AGI greater that $50,000 not capped + period: 2021 + input: + adjusted_gross_income: 80_000 + non_public_school_tuition: 1_000 + state_code: OH + output: + oh_non_public_school_credits: 1_000 + +- name: AGI greater that $50,000 case 3 + period: 2021 + input: + adjusted_gross_income: 99_999 + non_public_school_tuition: 250 + state_code: OH + output: + oh_non_public_school_credits: 250 + + +- name: Not capped at tuition expenses + period: 2021 + input: + people: + person1: + non_public_school_tuition: 200 + person2: + non_public_school_tuition: 400 + households: + household: + members: [person1, person2] + state_code: OH + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 49_999 + output: + oh_non_public_school_credits: 500 + +- name: Credit is capped at tuition expenses + period: 2021 + input: + people: + person1: + non_public_school_tuition: 200 + person2: + non_public_school_tuition: 200 + households: + household: + members: [person1, person2] + state_code: OH + tax_units: + tax_unit: + members: [person1, person2] + adjusted_gross_income: 49_999 + output: + oh_non_public_school_credits: 400 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_senior_citizen_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_senior_citizen_credit.yaml new file mode 100644 index 000000000..284cf37de --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_senior_citizen_credit.yaml @@ -0,0 +1,39 @@ +- name: senior citizen test eligible + period: 2021 + input: + state_code: OH + age: 65 + oh_has_not_taken_oh_lump_sum_credits: True + oh_agi: 99_999 + output: + oh_senior_citizen_credit: 50 + +- name: senior citizen test ineligible, too young + period: 2021 + input: + state_code: OH + age: 64 + oh_has_not_taken_oh_lump_sum_credits: True + oh_agi: 90_000 + output: + oh_senior_citizen_credit: 0 + +- name: senior citizen test, ineligible OH lump sum status + period: 2021 + input: + state_code: OH + age: 66 + oh_has_not_taken_oh_lump_sum_credits: False + oh_agi: 90_000 + output: + oh_senior_citizen_credit: 0 + +- name: senior citizen test, ineligible AGI + period: 2021 + input: + state_code: OH + age: 66 + oh_has_not_taken_oh_lump_sum_credits: True + oh_agi: 100_000 + output: + oh_senior_citizen_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit.yaml new file mode 100644 index 000000000..1fd6a35c1 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit.yaml @@ -0,0 +1,127 @@ +- name: Retirement income credit pension eligible + period: 2021 + input: + people: + person1: + is_tax_unit_spouse: true + pension_income: 800 + oh_has_not_taken_oh_lump_sum_credits: true + person2: + is_tax_unit_head: true + pension_income: 300 + oh_has_not_taken_oh_lump_sum_credits: true + person3: + pension_income: 500 + oh_has_not_taken_oh_lump_sum_credits: true + households: + household: + members: [person1, person2, person3] + state_code: OH + tax_units: + tax_unit: + members: [person1, person2, person3] + oh_agi: 10_000 + output: + oh_retirement_income_credit: 25 + +- name: Retirement income credit pension, not eligible + period: 2021 + input: + people: + person1: + is_tax_unit_spouse: True + pension_income: 800 + oh_has_not_taken_oh_lump_sum_credits: false + person2: + is_tax_unit_head: true + pension_income: 300 + oh_has_not_taken_oh_lump_sum_credits: true + person3: + pension_income: 500 + oh_has_not_taken_oh_lump_sum_credits: true + households: + household: + members: [person1, person2, person3] + state_code: OH + tax_units: + tax_unit: + members: [person1, person2, person3] + oh_agi: 99_999 + output: + oh_retirement_income_credit: 0 + +- name: Retirement income credit pension eligible + period: 2021 + input: + people: + person1: + is_tax_unit_spouse: True + pension_income: 100 + oh_has_not_taken_oh_lump_sum_credits: true + person2: + is_tax_unit_head: true + pension_income: 300 + oh_has_not_taken_oh_lump_sum_credits: true + person3: + pension_income: 100 + oh_has_not_taken_oh_lump_sum_credits: true + households: + household: + members: [person1, person2, person3] + state_code: OH + tax_units: + tax_unit: + members: [person1, person2, person3] + oh_agi: 10_000 + output: + oh_retirement_income_credit: 0 + +- name: Retirement income credit pension AGI not eligible + period: 2021 + input: + people: + person1: + is_tax_unit_spouse: true + pension_income: 800 + oh_has_not_taken_oh_lump_sum_credits: true + person2: + is_tax_unit_head: true + pension_income: 300 + oh_has_not_taken_oh_lump_sum_credits: true + person3: + pension_income: 500 + oh_has_not_taken_oh_lump_sum_credits: true + households: + household: + members: [person1, person2, person3] + state_code: OH + tax_units: + tax_unit: + members: [person1, person2, person3] + oh_agi: 100_000 + output: + oh_retirement_income_credit: 0 + +- name: Retirement income credit pension eligible + period: 2021 + input: + people: + person1: + pension_income: 2_800 + is_tax_unit_head: false + is_tax_unit_spouse: false + oh_has_not_taken_oh_lump_sum_credits: true + person2: + is_tax_unit_head: true + pension_income: 501 + oh_has_not_taken_oh_lump_sum_credits: true + households: + household: + members: [person1, person2] + state_code: OH + tax_units: + tax_unit: + members: [person1, person2] + oh_agi: 10_000 + output: + oh_retirement_income_credit: 25 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit_eligible.yaml new file mode 100644 index 000000000..69fdd2a0e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit_eligible.yaml @@ -0,0 +1,15 @@ +- name: Retirement income credit AGI eligible + period: 2021 + input: + oh_agi: 99_999 + state_code: OH + output: + oh_retirement_income_credit_eligible: true + +- name: Retirement income credit AGI not eligible + period: 2021 + input: + oh_agi: 100_000 + state_code: OH + output: + oh_retirement_income_credit_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/oh_agi.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/oh_agi.yaml index 9ede421e6..b432aad5a 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/oh_agi.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/oh/tax/income/oh_agi.yaml @@ -1,18 +1,18 @@ -- name: $100 federal agi, $10 add backs, $10 deductions, $10 exemptions - period: 2021 - input: - state_code: OH - adjusted_gross_income: 10_000 - oh_bonus_depreciation_add_back: 100 - oh_other_add_backs: 100 - oh_section_179_expense_add_back: 100 - qualified_business_income_deduction: 100 - tax_unit_taxable_social_security: 100 - dividend_income: 100 - oh_uniformed_services_retirement_income_deduction: 100 - investment_in_529_plan: 100 - pell_grant: 100 - educator_expense: 100 - disability_benefits: 100 - output: - oh_agi: 9_300 +- name: $100 federal agi, $10 add backs, $10 deductions, $10 exemptions + period: 2021 + input: + state_code: OH + adjusted_gross_income: 10_000 + oh_bonus_depreciation_add_back: 100 + oh_other_add_backs: 100 + oh_section_179_expense_add_back: 100 + qualified_business_income_deduction: 100 + tax_unit_taxable_social_security: 100 + dividend_income: 100 + oh_uniformed_services_retirement_income_deduction: 100 + investment_in_529_plan: 100 + spm_unit_pell_grant: 100 + educator_expense: 100 + disability_benefits: 100 + output: + oh_agi: 9_300 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ok/tax/income/ok_itemized_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ok/tax/income/ok_itemized_deductions.yaml index d3625a111..55774b05d 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ok/tax/income/ok_itemized_deductions.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ok/tax/income/ok_itemized_deductions.yaml @@ -1,38 +1,23 @@ -- name: Unit test 1 - period: 2021 - input: - filing_status: JOINT - tax_unit_itemizes: true - charitable_deduction: 2_000 - interest_expense: 24_000 - salt_deduction: 10_000 - real_estate_taxes: 9_000 - state_code: OK - output: - ok_itemized_deductions: 2_000 + 17_000 # limited - -- name: Unit test 2 - period: 2022 - input: - filing_status: JOINT - tax_unit_itemizes: true - charitable_deduction: 3_000 - interest_expense: 7_000 - salt_deduction: 10_000 - real_estate_taxes: 6_000 - state_code: OK - output: - ok_itemized_deductions: 3_000 + 7_000 + 6_000 # unlimited - -- name: Unit test 3 - period: 2022 - input: - filing_status: JOINT - tax_unit_itemizes: false - charitable_deduction: 3_000 - interest_expense: 7_000 - salt_deduction: 10_000 - real_estate_taxes: 6_000 - state_code: OK - output: - ok_itemized_deductions: 0 # no federal itemization +- name: Unit test 1 + period: 2021 + input: + filing_status: JOINT + charitable_deduction: 2_000 + interest_expense: 24_000 + salt_deduction: 10_000 + real_estate_taxes: 9_000 + state_code: OK + output: + ok_itemized_deductions: 2_000 + 17_000 # limited + +- name: Unit test 2 + period: 2022 + input: + filing_status: JOINT + charitable_deduction: 3_000 + interest_expense: 7_000 + salt_deduction: 10_000 + real_estate_taxes: 6_000 + state_code: OK + output: + ok_itemized_deductions: 3_000 + 7_000 + 6_000 # unlimited diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ok/tax/income/ok_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ok/tax/income/ok_taxable_income.yaml index 00c9b9110..ce23bf07f 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ok/tax/income/ok_taxable_income.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ok/tax/income/ok_taxable_income.yaml @@ -1,32 +1,71 @@ -- name: OK taxable income unit test 1 - period: 2021 - input: - ok_agi: 90_000 - ok_standard_deduction: 10_000 - ok_itemized_deductions: 9_000 - ok_exemptions: 4_000 - state_code: OK - output: - ok_taxable_income: 90_000 - 10_000 - 4_000 - -- name: OK taxable income unit test 2 - period: 2021 - input: - ok_agi: 90_000 - ok_standard_deduction: 10_000 - ok_itemized_deductions: 12_000 - ok_exemptions: 4_000 - state_code: OK - output: - ok_taxable_income: 90_000 - 12_000 - 4_000 - -- name: OK taxable income unit test 3 - period: 2022 - input: - ok_agi: 13_000 - ok_standard_deduction: 10_000 - ok_itemized_deductions: 9_000 - ok_exemptions: 4_000 - state_code: OK - output: - ok_taxable_income: 0 +- name: OK taxable income unit test 1 + period: 2021 + input: + tax_unit_itemizes: false + ok_agi: 90_000 + ok_standard_deduction: 10_000 + ok_itemized_deductions: 11_000 + ok_exemptions: 4_000 + state_code: OK + output: + ok_taxable_income: 90_000 - 10_000 - 4_000 + +- name: OK taxable income unit test 2 + period: 2021 + input: + tax_unit_itemizes: true + ok_agi: 90_000 + ok_standard_deduction: 12_000 + ok_itemized_deductions: 11_000 + ok_exemptions: 4_000 + state_code: OK + output: + ok_taxable_income: 90_000 - 11_000 - 4_000 + +- name: OK taxable income unit test 3 + period: 2022 + input: + tax_unit_itemizes: false + ok_agi: 13_000 + ok_standard_deduction: 10_000 + ok_itemized_deductions: 9_000 + ok_exemptions: 4_000 + state_code: OK + output: + ok_taxable_income: 0 + +- name: Tax unit with taxsimid 93088 in q21.its.csv and q21.ots.csv + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 51 + employment_income: 145_010 + social_security: 15_000 + interest_expense: 6_000 + ssi: 0 # not in TAXSIM35 + state_supplement: 0 # not in TAXSIM35 + wic: 0 # not in TAXSIM35 + tax_units: + tax_unit: + members: [person1] + premium_tax_credit: 0 # not in TAXSIM35 + local_income_tax: 0 # not in TAXSIM35 + state_sales_tax: 0 # not in TAXSIM35 + ok_use_tax: 0 # not in TAXSIM35 + tax_unit_itemizes: True # on federal return + spm_units: + spm_unit: + members: [person1] + snap: 0 # not in TAXSIM35 + tanf: 0 # not in TAXSIM35 + households: + household: + members: [person1] + state_code: OK + output: # expected results from patched TAXSIM35 2023-08-05 version + ok_agi: 145_010 # social security benefits not in OK AGI + ok_exemptions: 1_000 + ok_taxable_income: 145_010 - 1_000 - 6_000 # must use OK itemized deds diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_ctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_ctc.yaml new file mode 100644 index 000000000..d4b22c427 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/or_ctc.yaml @@ -0,0 +1,97 @@ +- name: Was not in effect in 2022. + period: 2022 + input: + state_code: OR + age: 5 + or_income_after_subtractions: 0 + output: + or_ctc: 0 + +- name: $1,000 maximum in 2023. + period: 2023 + input: + state_code: OR + age: 5 + is_tax_unit_dependent: true + or_income_after_subtractions: 0 + output: + or_ctc: 1_000 + +- name: Only in Oregon. + period: 2023 + input: + state_code: CA + age: 5 + is_tax_unit_dependent: true + or_income_after_subtractions: 0 + output: + or_ctc: 0 + +- name: Age six is disqualified. + period: 2023 + input: + state_code: OR + age: 6 + is_tax_unit_dependent: true + or_income_after_subtractions: 0 + output: + or_ctc: 0 + +- name: Fully phases out at $30,000. + period: 2023 + input: + state_code: OR + age: 5 + is_tax_unit_dependent: true + or_income_after_subtractions: 30_000 + output: + or_ctc: 0 + +- name: Check we're not creating a negative value. + period: 2023 + input: + state_code: OR + age: 5 + is_tax_unit_dependent: true + or_income_after_subtractions: 100_000 + output: + or_ctc: 0 + +- name: Halfway phased out at $27,500. + period: 2023 + input: + state_code: OR + age: 5 + is_tax_unit_dependent: true + or_income_after_subtractions: 27_500 + output: + or_ctc: 500 + +- name: Maximum of five qualifying children. + period: 2023 + input: + people: + parent: + age: 30 + child1: + age: 5 + child2: + age: 5 + child3: + age: 5 + child4: + age: 5 + child5: + age: 5 + child6: + age: 5 + households: + household: + members: [parent, child1, child2, child3, child4, child5, child6] + state_code: OR + tax_units: + tax_unit: + members: [parent, child1, child2, child3, child4, child5, child6] + or_income_after_subtractions: 25_000 + output: + or_ctc: 5_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/retirement_income/or_retirement_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/retirement_income/or_retirement_credit.yaml new file mode 100644 index 000000000..26eae7a22 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/retirement_income/or_retirement_credit.yaml @@ -0,0 +1,199 @@ +- name: No eligible people + period: 2022 + input: + people: + person1: + or_retirement_credit_eligible: false + taxable_pension_income: 1_000 + social_security: 0 + person2: + or_retirement_credit_eligible: false + taxable_pension_income: 1_000 + social_security: 0 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: SEPARATE + or_retirement_credit_household_income: 1_000 + or_federal_pension_subtraction: 0 + households: + household: + members: [person1, person2] + state_code: OR + output: + or_retirement_credit: 0 + +- name: Pension subtraction over pension income + period: 2022 + input: + people: + person1: + or_retirement_credit_eligible: true + taxable_pension_income: 1_000 + social_security: 0 + person2: + or_retirement_credit_eligible: true + taxable_pension_income: 900 + social_security: 0 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: WIDOW + or_retirement_credit_household_income: 1_000 + or_federal_pension_subtraction: 2_000 + households: + household: + members: [person1, person2] + state_code: OR + output: + or_retirement_credit: 0 + +- name: Pension income reduced by the pension subtraction + period: 2022 + input: + people: + person1: + or_retirement_credit_eligible: true + taxable_pension_income: 2_000 + social_security: 0 + person2: + or_retirement_credit_eligible: true + taxable_pension_income: 3_000 + social_security: 0 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: SINGLE + or_retirement_credit_household_income: 1_000 + or_federal_pension_subtraction: 4_000 + households: + household: + members: [person1, person2] + state_code: OR + output: + or_retirement_credit: 90 # 5,000 - 4,000 * 0.09 + +- name: Calculation of unreduced base amount + period: 2022 + input: + people: + person1: + or_retirement_credit_eligible: true + taxable_pension_income: 9_000 + social_security: 0 + person2: + or_retirement_credit_eligible: true + taxable_pension_income: 6_001 + social_security: 0 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + or_retirement_credit_household_income: 30_000 + or_federal_pension_subtraction: 0 + households: + household: + members: [person1, person2] + state_code: OR + output: + or_retirement_credit: 1_350 + +- name: Base amount reduced by excess household income + period: 2022 + input: + people: + person1: + or_retirement_credit_eligible: true + taxable_pension_income: 9_000 + social_security: 0 + person2: + or_retirement_credit_eligible: true + taxable_pension_income: 6_001 + social_security: 0 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + or_retirement_credit_household_income: 40_000 + or_federal_pension_subtraction: 0 + households: + household: + members: [person1, person2] + state_code: OR + output: + or_retirement_credit: 450 + +- name: Base amount reduced by social secuirty benefits + period: 2022 + input: + people: + person1: + or_retirement_credit_eligible: true + taxable_pension_income: 9_000 + social_security: 500 + person2: + or_retirement_credit_eligible: true + taxable_pension_income: 6_001 + social_security: 1_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + or_retirement_credit_household_income: 30_000 + or_federal_pension_subtraction: 0 + households: + household: + members: [person1, person2] + state_code: OR + output: + or_retirement_credit: 1_215 + +- name: Base amount fully reduced by social secuirty benefits + period: 2022 + input: + people: + person1: + or_retirement_credit_eligible: true + taxable_pension_income: 1_000 + social_security: 12_000 + person2: + or_retirement_credit_eligible: true + taxable_pension_income: 0 + social_security: 5_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + or_retirement_credit_household_income: 30_000 + or_federal_pension_subtraction: 0 + households: + household: + members: [person1, person2] + state_code: OR + output: + or_retirement_credit: 0 + +- name: Base amount fully reduced by excess household income + period: 2022 + input: + people: + person1: + or_retirement_credit_eligible: true + taxable_pension_income: 1_000 + social_security: 0 + person2: + or_retirement_credit_eligible: true + taxable_pension_income: 0 + social_security: 0 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + or_retirement_credit_household_income: 90_000 + or_federal_pension_subtraction: 0 + households: + household: + members: [person1, person2] + state_code: OR + output: + or_retirement_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/retirement_income/or_retirement_credit_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/retirement_income/or_retirement_credit_eligible.yaml new file mode 100644 index 000000000..6867a89ea --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/credits/retirement_income/or_retirement_credit_eligible.yaml @@ -0,0 +1,49 @@ +- name: Not head or spouse + period: 2022 + input: + state_code: OR + age: 62 + is_tax_unit_head: false + is_tax_unit_spouse: false + output: + or_retirement_credit_eligible: false + +- name: Head ineligible + period: 2022 + input: + state_code: OR + age: 61 + is_tax_unit_head: true + is_tax_unit_spouse: false + output: + or_retirement_credit_eligible: false + +- name: Spouse ineligible + period: 2022 + input: + state_code: OR + age: 61 + is_tax_unit_head: false + is_tax_unit_spouse: true + output: + or_retirement_credit_eligible: false + +- name: Spouse eligible + period: 2022 + input: + state_code: OR + age: 62 + is_tax_unit_head: false + is_tax_unit_spouse: true + output: + or_retirement_credit_eligible: true + +- name: Head eligible + period: 2022 + input: + state_code: OR + age: 62 + is_tax_unit_head: true + is_tax_unit_spouse: false + output: + or_retirement_credit_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/integration.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/integration.yaml index 4865c1043..757b4a7d1 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/integration.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/integration.yaml @@ -5,3 +5,34 @@ state_code: OR output: or_income_tax: 0 + +- name: Elderly OR couple with modest pension, social security, and bond income + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + age: 67 + taxable_interest_income: 9000.0 + taxable_pension_income: 5000.0 + social_security: 1000.0 + person2: + is_tax_unit_spouse: true + age: 67 + taxable_interest_income: 9000.0 + taxable_pension_income: 5000.0 + social_security: 1000.0 + tax_units: + tax_unit: + members: [person1, person2] + premium_tax_credit: 0 + households: + household: + members: [person1, person2] + state_code: OR + output: + or_income_tax_before_credits: 1349.75 + or_exemption_credit: 426.00 + or_retirement_credit: 900.00 + or_income_tax: 23.75 # = 1349.75 - 426.00 - 900.00 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.yaml index 179870909..8cf2b212a 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.yaml @@ -1,76 +1,76 @@ -- name: 2021 single filer, capped. +- name: 1 2021 single filer, capped. period: 2021 input: state_code: OR filing_status: SINGLE adjusted_gross_income: 80_000 - no_salt_income_tax: 10_000 - eitc: 0 + income_tax: 10_000 + earned_income_tax_credit: 0 output: or_federal_tax_liability_subtraction: 7_050 -- name: 2021 single filer, not affected by the cap. +- name: 2 2021 single filer, not affected by the cap. period: 2021 input: state_code: OR filing_status: SINGLE adjusted_gross_income: 80_000 - no_salt_income_tax: 6_000 - eitc: 1_000 + income_tax: 6_000 + earned_income_tax_credit: 1_000 output: or_federal_tax_liability_subtraction: 7_000 -- name: 2021 single filer +- name: 3 2021 single filer period: 2021 input: state_code: OR filing_status: SINGLE adjusted_gross_income: 145_000 - no_salt_income_tax: 10_000 - eitc: 0 + income_tax: 10_000 + earned_income_tax_credit: 0 output: or_federal_tax_liability_subtraction: 0 -- name: 2021 married filing separately filer +- name: 4 2021 married filing separately filer period: 2021 input: state_code: OR filing_status: SEPARATE adjusted_gross_income: 80_000 - no_salt_income_tax: 10_000 - eitc: 0 + income_tax: 10_000 + earned_income_tax_credit: 0 output: or_federal_tax_liability_subtraction: 3_525 -- name: 2021 married filing separately filer +- name: 5 2021 married filing separately filer period: 2021 input: state_code: OR filing_status: SEPARATE adjusted_gross_income: 145_000 - no_salt_income_tax: 10_000 - eitc: 0 + income_tax: 10_000 + earned_income_tax_credit: 0 output: or_federal_tax_liability_subtraction: 0 -- name: 2021 joint filer +- name: 6 2021 joint filer period: 2021 input: state_code: OR filing_status: JOINT adjusted_gross_income: 80_000 - no_salt_income_tax: 10_000 - eitc: 0 + income_tax: 10_000 + earned_income_tax_credit: 0 output: or_federal_tax_liability_subtraction: 7_050 -- name: 2021 joint filer +- name: 7 2021 joint filer period: 2021 input: state_code: OR filing_status: JOINT adjusted_gross_income: 290_000 - no_salt_income_tax: 10_000 - eitc: 0 + income_tax: 10_000 + earned_income_tax_credit: 0 output: or_federal_tax_liability_subtraction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/pa/tanf/cash_assistance/pa_tanf_age_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/pa/tanf/cash_assistance/pa_tanf_age_eligible.yaml new file mode 100644 index 000000000..941dbfad2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/pa/tanf/cash_assistance/pa_tanf_age_eligible.yaml @@ -0,0 +1,44 @@ +- name: Under age 18 & is full time student + period: 2023 + input: + state_code: PA + age: 17 + is_full_time_student: true + output: + pa_tanf_age_eligible: true + +- name: Under age 18 & not full time student + period: 2023 + input: + state_code: PA + age: 16 + is_full_time_student: false + output: + pa_tanf_age_eligible: true + +- name: Age 18 & not full time student + period: 2023 + input: + state_code: PA + age: 18 + is_full_time_student: false + output: + pa_tanf_age_eligible: false + +- name: Age 18 & is full time student + period: 2023 + input: + state_code: PA + age: 18 + is_full_time_student: true + output: + pa_tanf_age_eligible: true + +- name: Age 19 & is full time student + period: 2023 + input: + state_code: PA + age: 19 + is_full_time_student: true + output: + pa_tanf_age_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/pa/tanf/pregnancy_eligibility/pa_tanf_pregnancy_eligibility.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/pa/tanf/pregnancy_eligibility/pa_tanf_pregnancy_eligibility.yaml new file mode 100644 index 000000000..6908a5397 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/pa/tanf/pregnancy_eligibility/pa_tanf_pregnancy_eligibility.yaml @@ -0,0 +1,59 @@ +- name: woman not pregnant, with age 19 and no children receiving tanf + period: 2023 + input: + state_code: PA + age: 19 + is_pregnant: false + pa_tanf_age_eligible: false + output: + pa_tanf_age_eligible_on_pregnant_women_limitation: false + +- name: woman not pregnant, with age 17 and no children receiving tanf + period: 2023 + input: + state_code: PA + age: 17 + is_pregnant: false + pa_tanf_age_eligible: false + output: + pa_tanf_age_eligible_on_pregnant_women_limitation: false + +- name: pregnant woman, with age under 18 and no children receiving tanf + period: 2023 + input: + state_code: PA + age: 17 + is_pregnant: true + pa_tanf_age_eligible: false + output: + pa_tanf_age_eligible_on_pregnant_women_limitation: true + +- name: pregnant woman, with age under 18, has at least 1 child receiving tanf + period: 2023 + input: + state_code: PA + age: 17 + is_pregnant: true + pa_tanf_age_eligible: true + output: + pa_tanf_age_eligible_on_pregnant_women_limitation: true + +- name: pregnant woman, age above or equals to 18, no children receiving tanf + period: 2023 + input: + state_code: PA + age: 19 + is_pregnant: true + pa_tanf_age_eligible: false + output: + pa_tanf_age_eligible_on_pregnant_women_limitation: true + +- name: pregnant woman, age above or equals to 18, has at least 1 child receiving tanf + period: 2023 + input: + state_code: PA + age: 20 + is_pregnant: true + pa_tanf_age_eligible: true + output: + pa_tanf_age_eligible_on_pregnant_women_limitation: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/pa/tax/income/dhs/tanf/eligibility/pa_tanf_resources_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/pa/tax/income/dhs/tanf/eligibility/pa_tanf_resources_eligible.yaml new file mode 100644 index 000000000..8f122bd3c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/pa/tax/income/dhs/tanf/eligibility/pa_tanf_resources_eligible.yaml @@ -0,0 +1,24 @@ +- name: No assets + period: 2021 + input: + state_code: PA + pa_tanf_countable_resources: 0 + output: + pa_tanf_resources_eligible: true + +- name: Eligible + period: 2021 + input: + state_code: PA + pa_tanf_countable_resources: 500 + output: + pa_tanf_resources_eligible: true + + +- name: Ineligible + period: 2021 + input: + state_code: PA + pa_tanf_countable_resources: 1_001 + output: + pa_tanf_resources_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/cdcc/ri_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/cdcc/ri_cdcc.yaml new file mode 100644 index 000000000..29d3a786b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/cdcc/ri_cdcc.yaml @@ -0,0 +1,15 @@ +- name: No Federal CDCC + period: 2021 + input: + state_code: RI + cdcc: 0 + output: + ri_cdcc: 0 + +- name: Calculation # Federal CDCC * 25% + period: 2021 + input: + state_code: RI + cdcc: 1_000 + output: + ri_cdcc: 250 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/eitc/ri_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/eitc/ri_eitc.yaml new file mode 100644 index 000000000..b30061075 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/eitc/ri_eitc.yaml @@ -0,0 +1,23 @@ +- name: No Federal EITC + period: 2022 + input: + state_code: RI + earned_income_tax_credit: 0 + output: + ri_eitc: 0 + +- name: Calculation # Federal EITC * 15% + period: 2022 + input: + state_code: RI + earned_income_tax_credit: 10_000 + output: + ri_eitc: 1_500 + +- name: Calculation # Federal EITC * 15% + period: 2021 + input: + state_code: RI + earned_income_tax_credit: 20_000 + output: + ri_eitc: 3_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit.yaml new file mode 100644 index 000000000..7b46edebe --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit.yaml @@ -0,0 +1,46 @@ +- name: Low Income, household size of 1 # 3000*3%=90>50 + period: 2022 + input: + ri_property_tax_household_income: 3_000 + tax_unit_size: 1 + real_estate_taxes: 50 + rent: 0 + ri_property_tax_credit_eligible: true + output: + ri_property_tax_credit: 0 + +- name: High Income, household size of 1 # 20000*6%=1200, 1000+5000*0.2-1200=800>600 + period: 2022 + input: + state_code: RI + ri_property_tax_household_income: 20_000 + tax_unit_size: 1 + real_estate_taxes: 1_000 + rent: 5_000 + ri_property_tax_credit_eligible: true + output: + ri_property_tax_credit: 600 + +- name: Low Income, household of 2 or more #3000*3%=90, 150-90=60 + period: 2022 + input: + state_code: RI + ri_property_tax_household_income: 3_000 + tax_unit_size: 2 + real_estate_taxes: 150 + rent: 0 + ri_property_tax_credit_eligible: true + output: + ri_property_tax_credit: 60 + +- name: High Income, household of 2 or more # 13000*5%=650, 3500*0.2-650=50 + period: 2022 + input: + state_code: RI + ri_property_tax_household_income: 13_000 + tax_unit_size: 2 + real_estate_taxes: 0 + rent: 3_500 + ri_property_tax_credit_eligible: true + output: + ri_property_tax_credit: 50 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.yaml new file mode 100644 index 000000000..fa5bbf019 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.yaml @@ -0,0 +1,65 @@ +- name: Head above minimum age, and disabled + period: 2022 + input: + state_code: RI + age_head: 65 + age_spouse: 64 + head_is_disabled: true + spouse_is_disabled: false + output: + ri_property_tax_credit_eligible: true + +- name: Head above minimum age, not diabled + period: 2022 + input: + state_code: RI + age_head: 65 + age_spouse: 64 + head_is_disabled: false + spouse_is_disabled: false + output: + ri_property_tax_credit_eligible: true + +- name: Head disabled, not above minimum age + period: 2022 + input: + state_code: RI + age_head: 64 + age_spouse: 64 + head_is_disabled: true + spouse_is_disabled: false + output: + ri_property_tax_credit_eligible: true + +- name: Spouse above minimum age, not disabled + period: 2021 + input: + state_code: RI + age_head: 64 + age_spouse: 65 + head_is_disabled: false + spouse_is_disabled: false + output: + ri_property_tax_credit_eligible: true + +- name: Not above minimum age, not disabled + period: 2021 + input: + state_code: RI + age_head: 64 + age_spouse: 64 + head_is_disabled: false + spouse_is_disabled: false + output: + ri_property_tax_credit_eligible: false + +- name: Spouse disabled + period: 2021 + input: + state_code: RI + age_head: 64 + age_spouse: 64 + head_is_disabled: false + spouse_is_disabled: true + output: + ri_property_tax_credit_eligible: true diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction.yaml index 4dd7cb2b2..27d38bf80 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction.yaml @@ -30,3 +30,74 @@ output: ri_standard_deduction: 10_025 +- name: Single filer + period: 2022 + input: + state_code: RI + filing_status: SINGLE + ri_standard_deduction_applicable_percentage: 0.2 + output: + ri_standard_deduction: 1_860 + +- name: Married filing separately + period: 2023 + input: + state_code: RI + filing_status: SEPARATE + ri_standard_deduction_applicable_percentage: 0.4 + output: + ri_standard_deduction: 4_010 + +- name: Married filing jointly + period: 2022 + input: + state_code: RI + filing_status: JOINT + ri_standard_deduction_applicable_percentage: 0.6 + output: + ri_standard_deduction: 11_160 + +- name: Head of household filer + period: 2023 + input: + state_code: RI + filing_status: HEAD_OF_HOUSEHOLD + ri_standard_deduction_applicable_percentage: 0.8 + output: + ri_standard_deduction: 12_040 + +- name: Single filer + period: 2021 + input: + state_code: RI + filing_status: SINGLE + ri_standard_deduction_applicable_percentage: 0.2 + output: + ri_standard_deduction: 1_810 + +- name: Married filing separately + period: 2021 + input: + state_code: RI + filing_status: SEPARATE + ri_standard_deduction_applicable_percentage: 0.4 + output: + ri_standard_deduction: 3_620 + +- name: Single filer with full phase_out in 2021 + period: 2021 + input: + state_code: RI + filing_status: SINGLE + ri_standard_deduction_applicable_percentage: 0 + output: + ri_standard_deduction: 0 + +- name: Single filer with no phase_out in 2021 + period: 2021 + input: + state_code: RI + filing_status: SINGLE + ri_standard_deduction_applicable_percentage: 1 + output: + ri_standard_deduction: 9_050 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction_applicable_percentage.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction_applicable_percentage.yaml new file mode 100644 index 000000000..89b2f5554 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction_applicable_percentage.yaml @@ -0,0 +1,47 @@ +- name: Filer claims full amount of standard deductions in 2022 + period: 2022 + input: + state_code: RI + ri_agi: 200_000 + output: + ri_standard_deduction_applicable_percentage: 1 + +- name: Filer claims limited standard deductions in 2022 + period: 2022 + input: + state_code: RI + ri_agi: 217_100 + output: + ri_standard_deduction_applicable_percentage: 0.8 + +- name: Filer claims zero standard deductions in 2022 + period: 2022 + input: + state_code: RI + ri_agi: 400_000 + output: + ri_standard_deduction_applicable_percentage: 0 + +- name: Filer claims full amount of standard deductions in 2021 + period: 2021 + input: + state_code: RI + ri_agi: 200_000 + output: + ri_standard_deduction_applicable_percentage: 1 + +- name: Filer claims limited standard deductions in 2021 + period: 2021 + input: + state_code: RI + ri_agi: 211_000 + output: + ri_standard_deduction_applicable_percentage: 0.8 + +- name: Filer claims zero standard deductions in 2021 + period: 2021 + input: + state_code: RI + ri_agi: 400_000 + output: + ri_standard_deduction_applicable_percentage: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/eitc/sc_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/eitc/sc_eitc.yaml new file mode 100644 index 000000000..fb25073fe --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/eitc/sc_eitc.yaml @@ -0,0 +1,47 @@ +- name: No EITC from federal in 2021 + period: 2021 + input: + earned_income_tax_credit: 0 + state_code: SC + output: + sc_eitc: 0 + +- name: In 2018, with $1,000 EITC + period: 2018 + input: + earned_income_tax_credit: 1_000 + state_code: SC + output: + sc_eitc: 208.3 + +- name: In 2019, with $1,000 EITC + period: 2019 + input: + earned_income_tax_credit: 1_000 + state_code: SC + output: + sc_eitc: 416.7 + +- name: In 2020, with $1,000 EITC + period: 2020 + input: + earned_income_tax_credit: 1_000 + state_code: SC + output: + sc_eitc: 625 + +- name: In 2021, with $1,000 EITC + period: 2021 + input: + earned_income_tax_credit: 1_000 + state_code: SC + output: + sc_eitc: 833.3 + +- name: In 2022, with $1,000 EITC + period: 2022 + input: + earned_income_tax_credit: 1_000 + state_code: SC + output: + sc_eitc: 1041.7 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/sc_cdcc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/sc_cdcc.yaml new file mode 100644 index 000000000..627de9d81 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/sc_cdcc.yaml @@ -0,0 +1,87 @@ +- name: One cdcc eligible person, with $1000 spending on federal child care expense + period: 2022 + input: + state_code: SC + tax_unit_childcare_expenses: 1_000 + count_cdcc_eligible: 1 + output: + sc_cdcc: 70 + # 1,000*0.07 = 70 + +- name: One cdcc eligible person, with $4000 spending on federal child care expense + period: 2021 + input: + state_code: SC + tax_unit_childcare_expenses: 4_000 + count_cdcc_eligible: 1 + output: + sc_cdcc: 210 + # 4,000*0.07 = 280 can not be greater than 210 + +- name: Two cdcc eligible people, with $7000 spending on federal child care expense + period: 2022 + input: + state_code: SC + tax_unit_childcare_expenses: 7_000 + count_cdcc_eligible: 2 + output: + sc_cdcc: 420 + # 7,000*0.07 = 490 can not be greater than 420 + +- name: Four cdcc eligible people, with $7000 spending on federal child care expense + period: 2022 + input: + state_code: SC + tax_unit_childcare_expenses: 7_000 + count_cdcc_eligible: 4 + output: + sc_cdcc: 420 + # 7,000*0.07 = 490 can not be greater than 420 + +- name: Two cdcc eligible people, with $18_000 spending on federal child care expense + period: 2021 + input: + state_code: SC + tax_unit_childcare_expenses: 18_000 + count_cdcc_eligible: 2 + output: + sc_cdcc: 420 + # 18,000*0.07 = 1260 cannot be greater than 420 + +- name: No cdcc eligible people, with $0 spending on federal child care expense + period: 2022 + input: + state_code: SC + tax_unit_childcare_expenses: 0 + count_cdcc_eligible: 0 + output: + sc_cdcc: 0 + +- name: No cdcc eligible people, with $4000 spending on federal child care expense + period: 2022 + input: + state_code: SC + tax_unit_childcare_expenses: 4_000 + count_cdcc_eligible: 0 + output: + sc_cdcc: 0 + +- name: One cdcc eligible person, with $9000 spending on federal child care expense + period: 2020 + input: + state_code: SC + tax_unit_childcare_expenses: 9_000 + count_cdcc_eligible: 1 + output: + sc_cdcc: 210 + # 1,000*0.07 = 70 + +- name: One cdcc eligible person, with $9000 spending on federal child care expense + period: 2022 + input: + state_code: SC + tax_unit_childcare_expenses: 9_000 + count_cdcc_eligible: 1 + output: + sc_cdcc: 210 + # 9,000*0.07 = 630 can not be greater than 210 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/two_wage_earner/sc_two_wage_earner_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/two_wage_earner/sc_two_wage_earner_credit.yaml new file mode 100644 index 000000000..6ab000b6f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/credits/two_wage_earner/sc_two_wage_earner_credit.yaml @@ -0,0 +1,94 @@ +- name: If filing jointly, head income is $40,000, spouse income is $16,000, the credit is $112 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + sc_gross_earned_income: 40_000 + person2: + is_tax_unit_spouse: true + sc_gross_earned_income: 16_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: SC + output: + sc_two_wage_earner_credit: 112 + # less of (head or spouse income)*0.007 + # 16_000* 0.007 = $112 + +- name: If filing jointly, head income is 18_000 and spouse income is 61_500, credit is 126 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + sc_gross_earned_income: 18_000 + person2: + is_tax_unit_spouse: true + sc_gross_earned_income: 61_500 + person3: + is_tax_unit_spouse: false + is_tax_unit_head: false + sc_gross_earned_income: 30_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + filing_status: JOINT + households: + household: + members: [person1, person2, person3] + state_code: SC + output: + sc_two_wage_earner_credit: 126 + # less of (head or spouse income)*0.007 + # 18_000* 0.007 = $126 + +- name: If filing separately, credit is 0 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + sc_gross_earned_income: 40_000 + person2: + is_tax_unit_spouse: true + sc_gross_earned_income: 16_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: SEPARATE + households: + household: + members: [person1, person2] + state_code: SC + output: + sc_two_wage_earner_credit: 0 + # only filling joint is eligible + +- name: If filing jointly, head income is 18_000, spouse income is 18_000, credit is 126 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + sc_gross_earned_income: 18_000 + person2: + is_tax_unit_spouse: true + sc_gross_earned_income: 18_000 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: SC + output: + sc_two_wage_earner_credit: 126 + # less of (head or spouse income)*0.007 + # 18_000* 0.007 = $126 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/deductions/net_captial_gain/sc_net_capital_gain_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/deductions/net_captial_gain/sc_net_capital_gain_deduction.yaml new file mode 100644 index 000000000..2055cb32f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/deductions/net_captial_gain/sc_net_capital_gain_deduction.yaml @@ -0,0 +1,7 @@ +- name: Case 1, capital_gains is positive + period: 2021 + input: + state_code: SC + net_capital_gain: 1_000 + output: + sc_net_capital_gain_deduction: 440 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/exemptions/sc_senior_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/exemptions/sc_senior_exemption.yaml new file mode 100644 index 000000000..14a717402 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/exemptions/sc_senior_exemption.yaml @@ -0,0 +1,85 @@ +- name: If filing jointly, head and spouse are both above 65 + period: 2022 + absolute_error_margin: 0 + input: + state_code: SC + filing_status: JOINT + age_head: 65 + age_spouse: 65 + sc_retirement_income_deduction_head: 0 + sc_retirement_income_deduction_spouse: 2_000 + sc_military_retirement_income_deduction_head: 0 + sc_military_retirement_income_deduction_spouse: 0 + output: + # (15,000 - 0 - 0) + (15,000 - 2_000 - 0) = 28,000 + sc_senior_exemption: 28_000 + +- name: If filing jointly, only one person is age 65 or above + period: 2022 + absolute_error_margin: 0 + input: + state_code: SC + filing_status: JOINT + age_head: 65 + age_spouse: 64 + sc_retirement_income_deduction_head: 5_000 + sc_retirement_income_deduction_spouse: 2_000 + sc_military_retirement_income_deduction_head: 0 + sc_military_retirement_income_deduction_spouse: 0 + output: + # 1*15,000 - 5,000 = 10,000 + sc_senior_exemption: 10_000 + + +- name: If filing jointly, head and spouse both under age 65, exemption is $0. + period: 2022 + absolute_error_margin: 0 + input: + state_code: SC + filing_status: JOINT + age_head: 64 + age_spouse: 64 + sc_retirement_income_deduction_head: 5_000 + sc_retirement_income_deduction_spouse: 0 + sc_military_retirement_income_deduction_head: 0 + sc_military_retirement_income_deduction_spouse: 0 + output: + sc_senior_exemption: 0 + +- name: If filing seperately, head and spouse are both above 65 + period: 2022 + absolute_error_margin: 0 + input: + state_code: SC + filing_status: SEPARATE + age_head: 65 + age_spouse: 65 + sc_retirement_income_deduction_head: 5_000 + sc_retirement_income_deduction_spouse: 0 + sc_military_retirement_income_deduction_head: 0 + sc_military_retirement_income_deduction_spouse: 0 + output: + # 15,000 - 5,000 - 0 = 10,000 + sc_senior_exemption: 10_000 + +- name: If filing seperately, head and spouse are both above 65, but the retirement income ducion plus military retrement income deduction is greater than $15,000 + period: 2022 + absolute_error_margin: 0 + input: + state_code: SC + filing_status: SEPARATE + age_head: 65 + age_spouse: 65 + sc_retirement_income_deduction_head: 8_000 + sc_retirement_income_deduction_spouse: 2_000 + sc_military_retirement_income_deduction_head: 7_500 + sc_military_retirement_income_deduction_spouse: 0 + output: + # 15,000 - 8,000 - 7,500 < 0 + sc_senior_exemption: 0 + + + + + + diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/sc_state_tax_addback.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/sc_state_tax_addback.yaml new file mode 100644 index 000000000..92fcbb446 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/sc_state_tax_addback.yaml @@ -0,0 +1,94 @@ +- name: Test case 1 #salt has a cap of 5000 for seperate + period: 2021 + input: + filing_status: SEPARATE + tax_unit_itemizes: true + charitable_deduction: 1_000 + interest_deduction: 1_000 + medical_expense_deduction: 0 + casualty_loss_deduction: 0 + standard_deduction: 4_000 + real_estate_taxes: 3_000 + state_and_local_sales_or_income_tax: 1_000 + state_code: SC + output: + sc_state_tax_addback: 1_000 + # line 3 = 2000 - 0 = 2000 + # line 4 = 1000 + # line 5 = 5000 - 3000 = 2000 + +- name: Test case 2 #salt has a cap of 10000 for JOINT + period: 2021 + input: + filing_status: JOINT + tax_unit_itemizes: true + charitable_deduction: 1_000 + interest_deduction: 1_000 + medical_expense_deduction: 0 + casualty_loss_deduction: 0 + standard_deduction: 4_000 + real_estate_taxes: 3_000 + state_and_local_sales_or_income_tax: 1_000 + state_code: SC + output: + sc_state_tax_addback: 0 + # line 3 = 2000 - 4000 = 0 + # line 4 = 1000 + # line 5 = 10000 - 3000 = 7000 + +- name: Test case 3 #salt has a cap of 10000 for JOINT + period: 2021 + input: + filing_status: JOINT + tax_unit_itemizes: true + charitable_deduction: 3_000 + interest_deduction: 1_000 + medical_expense_deduction: 0 + casualty_loss_deduction: 0 + standard_deduction: 1_000 + real_estate_taxes: 8_000 + state_and_local_sales_or_income_tax: 6_000 + state_code: SC + output: + sc_state_tax_addback: 2_000 + # line 3 = 4000 - 1000 = 3000 + # line 4 = 6000 + # line 5 = 10000 - 8000 = 2000 + +- name: Test case 4 #salt has a cap of 10000 for JOINT + period: 2021 + input: + filing_status: JOINT + tax_unit_itemizes: true + charitable_deduction: 1_000 + interest_deduction: 1_000 + medical_expense_deduction: 0 + casualty_loss_deduction: 0 + standard_deduction: 4_000 + real_estate_taxes: 3_000 + state_and_local_sales_or_income_tax: 1_000 + state_code: SC + output: + sc_state_tax_addback: 0 + # line 3 = 2000 - 4000 = 0 + # line 4 = 1000 + # line 5 = 10000 - 3000 = 7000 + +- name: Test case 5 #salt has a cap of 10000 for JOINT + period: 2021 + input: + filing_status: JOINT + tax_unit_itemizes: false + charitable_deduction: 3_000 + interest_deduction: 1_000 + medical_expense_deduction: 0 + casualty_loss_deduction: 0 + standard_deduction: 1_000 + real_estate_taxes: 8_000 + state_and_local_sales_or_income_tax: 6_000 + state_code: SC + output: + sc_state_tax_addback: 0 + # line 3 = 0 - 1000 = 0 tax_unit_itemizes false + # line 4 = 6000 + # line 5 = 10000 - 8000 = 2000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/subtractions/vt_medical_expense_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/subtractions/vt_medical_expense_deductions.yaml new file mode 100644 index 000000000..4eee36ac2 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/subtractions/vt_medical_expense_deductions.yaml @@ -0,0 +1,39 @@ +- name: VT medical expense deduction amount unit test 1 + period: 2022 + input: + state_code: ME # Test state definition + medical_expense_deduction: 5_000 + vt_standard_deduction: 1_000 + vt_personal_exemptions: 1_000 + output: + vt_medical_expense_deduction: 0 + +- name: VT medical expense deduction amount unit test 2 + period: 2022 + input: + state_code: VT + medical_expense_deduction: 5_000 + vt_standard_deduction: 1_000 + vt_personal_exemptions: 1_000 + output: + vt_medical_expense_deduction: 3_000 # max(0,5000-2000) = 3000 + +- name: VT medical expense deduction amount unit test 3 + period: 2022 + input: + state_code: VT + medical_expense_deduction: 1_000 + vt_standard_deduction: 1_000 + vt_personal_exemptions: 1_000 + output: + vt_medical_expense_deduction: 0 # max(0,1000-2000) = 0 + +- name: VT medical expense deduction amount unit test 4 + period: 2022 + input: + state_code: VT + medical_expense_deduction: 2_000 + vt_standard_deduction: 1_000 + vt_personal_exemptions: 1_000 + output: + vt_medical_expense_deduction: 0 # max(0,2000-2000) = 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/vt_capital_gains_exclusion.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/vt_capital_gains_exclusion.yaml new file mode 100644 index 000000000..cfb9d7b85 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/vt_capital_gains_exclusion.yaml @@ -0,0 +1,49 @@ +- name: VT capital gain exclusion amount unit test 1 + period: 2022 + input: + state_code: ME # Test state definition other than VT + adjusted_net_capital_gain: 1_000 + taxable_income: 1_000 + vt_percentage_capital_gains_exclusion: 1_000 + output: + vt_capital_gains_exclusion: 0 + +- name: VT capital gain exclusion amount unit test 2 + period: 2022 + input: + state_code: VT + adjusted_net_capital_gain: 6_000 + taxable_income: 1_000 + vt_percentage_capital_gains_exclusion: 1_000 + output: + vt_capital_gains_exclusion: 400 # # min(5000,1000*0.4) = 400 + +- name: VT capital gain exclusion amount unit test 3 + period: 2022 + input: + state_code: VT + adjusted_net_capital_gain: 6_000 + taxable_income: 12_600 + vt_percentage_capital_gains_exclusion: 1_000 + output: + vt_capital_gains_exclusion: 5_000 # min(5000,12600*0.4) = 4000 + +- name: VT capital gain exclusion amount unit test 4 + period: 2022 + input: + state_code: VT + adjusted_net_capital_gain: 12_600 + taxable_income: 12_700 + vt_percentage_capital_gains_exclusion: 5_040 + output: + vt_capital_gains_exclusion: 5_040 # min(5040,5080) = 5040 + +- name: VT capital gain exclusion amount unit test 5 + period: 2022 + input: + state_code: VT + adjusted_net_capital_gain: 12_600 + taxable_income: 12_500 + vt_percentage_capital_gains_exclusion: 5_040 + output: + vt_capital_gains_exclusion: 5_000 # min(5040,5000) = 5000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/vt_percentage_capital_gains_exclusion.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/vt_percentage_capital_gains_exclusion.yaml new file mode 100644 index 000000000..d8a6d1340 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/vt/agi/vt_percentage_capital_gains_exclusion.yaml @@ -0,0 +1,31 @@ +- name: VT percentage capital gain exclusion amount unit test 1 + period: 2022 + input: + state_code: ME # Test state definition other than VT + adjusted_net_capital_gain: 1_000 + output: + vt_percentage_capital_gains_exclusion: 0 + +- name: VT percentage capital gain exclusion amount unit test 2 + period: 2022 + input: + state_code: VT + adjusted_net_capital_gain: 0 + output: + vt_percentage_capital_gains_exclusion: 0 + +- name: VT percentage capital gain exclusion amount unit test 3 + period: 2022 + input: + state_code: VT + adjusted_net_capital_gain: 1_000 + output: + vt_percentage_capital_gains_exclusion: 400 + +- name: VT percentage capital gain exclusion amount unit test 4 + period: 2022 + input: + state_code: VT + adjusted_net_capital_gain: 900_000 + output: + vt_percentage_capital_gains_exclusion: 350_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/deductions/vt_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/deductions/vt_standard_deduction.yaml new file mode 100644 index 000000000..c87f325b8 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/deductions/vt_standard_deduction.yaml @@ -0,0 +1,72 @@ +- name: 2021, Single filer, with zero additional deductions + period: 2021 + input: + filing_status: SINGLE + aged_blind_count: 0 + state_code: VT + output: + vt_standard_deduction: 6_350 #6350+0 + +- name: 2022, Single filer, with two additional deductions + period: 2022 + input: + filing_status: SINGLE + aged_blind_count: 2 + state_code: VT + output: + vt_standard_deduction: 8_600 #6500+2*1050 + +- name: 2021, Joint filer, with three additional deductions + + period: 2021 + input: + filing_status: JOINT + aged_blind_count: 3 + state_code: VT + output: + vt_standard_deduction: 15_850 #12700+3*1050 + +- name: 2022, Joint filer, with three additional deductions + period: 2022 + input: + filing_status: JOINT + aged_blind_count: 3 + state_code: VT + output: + vt_standard_deduction: 16_200 #13050+3*1050 + +- name: 2022, HOH filer, with zero additional deductions + period: 2022 + input: + filing_status: HEAD_OF_HOUSEHOLD + aged_blind_count: 0 + state_code: VT + output: + vt_standard_deduction: 9_800 #9800+0*1050 + +- name: 2022, Widow(ed) filer, with three additional deductions + period: 2022 + input: + filing_status: WIDOW + aged_blind_count: 3 + state_code: VT + output: + vt_standard_deduction: 16_200 #13050+3*1050 + +- name: 2022, Separate filer, with zero additional deductions + period: 2022 + input: + filing_status: SEPARATE + aged_blind_count: 0 + state_code: VT + output: + vt_standard_deduction: 6_500 #6500+0*1050 + +- name: Non Vermont filer + period: 2021 + input: + filing_status: SEPARATE + aged_blind_count: 0 + state_code: NY + output: + vt_standard_deduction: 0 #0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/exemptions/vt_personal_exemptions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/exemptions/vt_personal_exemptions.yaml new file mode 100644 index 000000000..1daf93067 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/exemptions/vt_personal_exemptions.yaml @@ -0,0 +1,145 @@ +- name: "Joint household, both claimable elsewhere, with no dependents" + period: 2022 + input: + filing_status: JOINT + tax_unit_dependent_elsewhere: true + tax_unit_spouse_dependent_elsewhere: true + tax_unit_count_dependents: 0 + state_code: VT + output: + vt_personal_exemptions: 0 # 0*4500 + +- name: "Joint household, both claimable elsewhere, with two dependents" + period: 2022 + input: + filing_status: JOINT + tax_unit_dependent_elsewhere: true + tax_unit_spouse_dependent_elsewhere: true + tax_unit_count_dependents: 2 + state_code: VT + output: + vt_personal_exemptions: 9_000 # 2*4500 + +- name: "Joint household, one claimable elsewhere, with no dependents" + period: 2022 + input: + filing_status: JOINT + tax_unit_dependent_elsewhere: true + tax_unit_spouse_dependent_elsewhere: false + tax_unit_count_dependents: 0 + state_code: VT + output: + vt_personal_exemptions: 4_500 # 1*4500 + +- name: "Joint household, one claimable elsewhere, with two dependents" + period: 2022 + input: + filing_status: JOINT + tax_unit_dependent_elsewhere: true + tax_unit_spouse_dependent_elsewhere: false + tax_unit_count_dependents: 2 + state_code: VT + output: + vt_personal_exemptions: 13_500 # 3*4500 + +- name: "Joint household, neither claimable elsewhere, with no dependents" + period: 2022 + input: + filing_status: JOINT + tax_unit_dependent_elsewhere: false + tax_unit_spouse_dependent_elsewhere: false + tax_unit_count_dependents: 0 + state_code: VT + output: + vt_personal_exemptions: 9_000 # 2*4500 + +- name: "Joint household, neither claimable elsewhere, with two dependents" + period: 2022 + input: + filing_status: JOINT + tax_unit_dependent_elsewhere: false + tax_unit_spouse_dependent_elsewhere: false + tax_unit_count_dependents: 2 + state_code: VT + output: + vt_personal_exemptions: 18_000 # 4*4500 + +- name: "Single household, claimable elsewhere, with no dependents" + period: 2022 + input: + filing_status: SINGLE + tax_unit_dependent_elsewhere: true + tax_unit_count_dependents: 0 + state_code: VT + output: + vt_personal_exemptions: 0 # 0*4500 + +- name: "Single household, claimable elsewhere, with two dependents" + period: 2022 + input: + filing_status: SINGLE + tax_unit_dependent_elsewhere: true + tax_unit_count_dependents: 2 + state_code: VT + output: + vt_personal_exemptions: 9_000 # 2*4500 + +- name: "Single household, not claimable elsewhere, with no dependents" + period: 2022 + input: + filing_status: SINGLE + tax_unit_dependent_elsewhere: false + tax_unit_count_dependents: 0 + state_code: VT + output: + vt_personal_exemptions: 4_500 # 1*4500 + +- name: "Single household, not claimable elsewhere, with two dependents" + period: 2022 + input: + filing_status: SINGLE + tax_unit_dependent_elsewhere: false + tax_unit_count_dependents: 2 + state_code: VT + output: + vt_personal_exemptions: 13_500 # 3*4500 + +- name: "Non vermont tax filer" + period: 2022 + input: + filing_status: SINGLE + tax_unit_dependent_elsewhere: false + tax_unit_count_dependents: 0 + state_code: NY + output: + vt_personal_exemptions: 0 + +- name: "Head of household, not claimable elsewhere, with two dependents" + period: 2022 + input: + filing_status: HEAD_OF_HOUSEHOLD + tax_unit_dependent_elsewhere: false + tax_unit_count_dependents: 2 + state_code: VT + output: + vt_personal_exemptions: 13_500 # 3*4500 + +- name: "Head of household, not claimable elsewhere, with two dependents" + period: 2021 + input: + filing_status: HEAD_OF_HOUSEHOLD + tax_unit_dependent_elsewhere: false + tax_unit_count_dependents: 2 + state_code: VT + output: + vt_personal_exemptions: 13_050 # 3*4350 + +- name: "Widow, not claimable elsewhere, with two dependents" + period: 2021 + input: + filing_status: HEAD_OF_HOUSEHOLD + tax_unit_dependent_elsewhere: false + tax_unit_count_dependents: 2 + state_code: VT + output: + vt_personal_exemptions: 13_050 # 3*4350 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_eitc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_eitc.yaml new file mode 100644 index 000000000..dc843abab --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_eitc.yaml @@ -0,0 +1,23 @@ +- name: $0 federal EITC + period: 2021 + input: + earned_income_tax_credit: 0 + state_code: VT + output: + vt_eitc: 0 + +- name: $1000 federal EITC + period: 2022 + input: + earned_income_tax_credit: 1_000 + state_code: VT + output: + vt_eitc: 380 + +- name: $2000 federal EITC + period: 2021 + input: + earned_income_tax_credit: 2_000 + state_code: VT + output: + vt_eitc: 720 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_income_tax_before_non_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_income_tax_before_non_refundable_credits.yaml new file mode 100644 index 000000000..3b2c9808e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_income_tax_before_non_refundable_credits.yaml @@ -0,0 +1,131 @@ +- name: 1 Single filer, taxable income is $250K in 2021. + period: 2021 + input: + vt_taxable_income: 250_000 + filing_status: SINGLE + state_code: VT + output: + # .0335*40950 + .066*(99200-40950) + .076*(206950-99200) + .0875*(250000-206950) = 17172.20 + vt_income_tax_before_non_refundable_credits: 17_172.20 + +- name: 2 Joint filer, taxable income is $300K in 2021. + period: 2021 + input: + vt_taxable_income: 300_000 + filing_status: JOINT + state_code: VT + output: + # .0335*68400 + .066*(165350-68400) + .076*(251950-165350) + .0875*(300000-251950) = 19476.074 + vt_income_tax_before_non_refundable_credits: 19_476.074 + +- name: 3 Head of household filer, taxable income is $250K in 2021. + period: 2021 + input: + vt_taxable_income: 250_000 + filing_status: HEAD_OF_HOUSEHOLD + state_code: VT + output: + # .0335*54850 + .066*(141700-54850) + .076*(229450-141700) + .0875*(250000-229450) = 16036.7 + vt_income_tax_before_non_refundable_credits: 16_036.70 + +- name: 4 Widow filer, taxable income is $300K in 2021. + period: 2021 + input: + vt_taxable_income: 300_000 + filing_status: WIDOW + state_code: VT + output: + # .0335*68400 + .066*(165350-68400) + .076*(251950-165350) + .0875*(300000-251950) = 19476.074 + vt_income_tax_before_non_refundable_credits: 19_476.074 + +- name: 5 Separate filer, taxable income is $150K in 2021. + period: 2021 + absolute_error_margin: 1 + input: + vt_taxable_income: 150_000 + filing_status: SEPARATE + state_code: VT + output: + # .0335*34200 + .066*(82675-34200) + .076*(125975-82675) + .0875*(150000-125975) = 9738.037 + vt_income_tax_before_non_refundable_credits: 9_738.037 + +- name: 6 Single filer, taxable income is $20K in 2022. + period: 2022 + input: + vt_taxable_income: 20_000 + filing_status: SINGLE + state_code: VT + output: + # .0335*20000 = 670 + vt_income_tax_before_non_refundable_credits: 670 + +- name: 7 Single filer, taxable income is $50K in 2022. + period: 2022 + input: + vt_taxable_income: 50_000 + filing_status: SINGLE + state_code: VT + output: + # .0335*42150 + .066*(50000-42150) = 1930.125 + vt_income_tax_before_non_refundable_credits: 1_930.125 + +- name: 8 Single filer, taxable income is $150K in 2022. + period: 2022 + input: + vt_taxable_income: 150_000 + filing_status: SINGLE + state_code: VT + output: + # .0335*42150 + .066*(102200-42150) + .076*(150000-102200) = 9008.125 + vt_income_tax_before_non_refundable_credits: 9_008.125 + +- name: 9 Single filer, taxable income is $250K in 2022. + period: 2022 + input: + vt_taxable_income: 250_000 + filing_status: SINGLE + state_code: VT + output: + # .0335*42150 + .066*(102200-42150) + .076*(213150-102200) + .0875*(250000-213150) = 17031.9 + vt_income_tax_before_non_refundable_credits: 17_031.9 + +- name: 10 Joint filer, taxable income is $300K in 2022. + period: 2022 + input: + vt_taxable_income: 300_000 + filing_status: JOINT + state_code: VT + output: + # .0335*70450 + .066*(170300-70450) + .076*(259500-170300) + .0875*(300000-259500) = 19273.125 + vt_income_tax_before_non_refundable_credits: 19_273.125 + +- name: 11 Head of household filer, taxable income is $250K in 2022. + period: 2022 + input: + vt_taxable_income: 250_000 + filing_status: HEAD_OF_HOUSEHOLD + state_code: VT + output: + # .0335*56500 + .066*(145950-56500) + .076*(236350-145950) + .0875*(250000-236350) = 15861.225 + vt_income_tax_before_non_refundable_credits: 15_861.225 + +- name: 12 Widow filer, taxable income is $300K in 2022. + period: 2022 + input: + vt_taxable_income: 300_000 + filing_status: WIDOW + state_code: VT + output: + # .0335*70450 + .066*(170300-70450) + .076*(259500-170300) + .0875*(300000-259500) = 19273.125 + vt_income_tax_before_non_refundable_credits: 19_273.125 + +- name: 13 Separate filer, taxable income is $150K in 2022. + period: 2022 + absolute_error_margin: 1 + input: + vt_taxable_income: 150_000 + filing_status: SEPARATE + state_code: VT + output: + # .0335*35255 + .066*(85150-35255) + .076*(129750-85150) + .0875*(150000-129750) = 9636.5625 + vt_income_tax_before_non_refundable_credits: 9_636.5625 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..78254891b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_income_tax_before_refundable_credits.yaml @@ -0,0 +1,18 @@ +- name: Calculation + period: 2022 + input: + vt_income_tax_before_non_refundable_credits: 1_000 + vt_non_refundable_credits: 800 + state_code: VT + output: + # 1,000 - 800 = 200 + vt_income_tax_before_refundable_credits: 200 + +- name: Capped at 0 + period: 2022 + input: + vt_income_tax_before_non_refundable_credits: 800 + vt_non_refundable_credits: 1_000 + state_code: VT + output: + vt_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_taxable_income.yaml new file mode 100644 index 000000000..548e36c98 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/vt/tax/income/vt_taxable_income.yaml @@ -0,0 +1,36 @@ +- name: Vermont taxable income unit test 1. + period: 2022 + input: + vt_agi: 2_000 + vt_standard_deduction: 1_000 + vt_personal_exemptions: 1_000 + state_code: VT + output: + vt_taxable_income: 0 + +- name: Vermont taxable income unit test 2. + period: 2022 + input: + state_code: NY + output: + vt_taxable_income: 0 + +- name: Vermont taxable income unit test 3. + period: 2022 + input: + vt_agi: 4_000 + vt_standard_deduction: 1_000 + vt_personal_exemptions: 1_000 + state_code: VT + output: + vt_taxable_income: 2_000 + +- name: Vermont taxable income unit test 4. + period: 2022 + input: + vt_agi: 1_000 + vt_standard_deduction: 1_000 + vt_personal_exemptions: 1_000 + state_code: VT + output: + vt_taxable_income: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/vt/vt_agi.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/vt/vt_agi.yaml deleted file mode 100644 index e80acbd35..000000000 --- a/fiscalsim_us/tests/policy/baseline/gov/states/vt/vt_agi.yaml +++ /dev/null @@ -1,32 +0,0 @@ -- name: Outside Maine, no Vermont AGI - period: 2022 - absolute_error_margin: 0 - input: - state_code: NY - filing_status: SINGLE - output: - vt_agi: 0 - -- name: If $0 income and $0 mods, Vermont agi is $0. - period: 2022 - absolute_error_margin: 0 - input: - state_code: VT - filing_status: SINGLE - adjusted_gross_income: 0 - vt_agi_additions: 0 - vt_agi_subtractions: 0 - output: - vt_agi: 0 - -- name: If $100_000 income and $10_000 add mods and $20_000 sub mods, Vermont AGI is $90_000. - period: 2022 - absolute_error_margin: 0 - input: - state_code: VT - filing_status: JOINT - adjusted_gross_income: 100_000 - vt_agi_additions: 10_000 - vt_agi_subtractions: 20_000 - output: - vt_agi: 90_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_gain_loss_addition.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_gain_loss_addition.yaml new file mode 100644 index 000000000..8caefda65 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_gain_loss_addition.yaml @@ -0,0 +1,35 @@ +- name: WI capital_gain_loss_addition unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + short_term_capital_gains: -5_000 + state_code: WI + output: + wi_capital_gain_loss_addition: 2_500 # = 3_000 - 500 + +- name: WI capital_gain_loss_addition unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + short_term_capital_gains: -2_000 + state_code: WI + output: + wi_capital_gain_loss_addition: 1_500 # = 2_000 - 500 + +- name: WI capital_gain_loss_addition unit test 3 + absolute_error_margin: 0.01 + period: 2022 + input: + long_term_capital_gains: -200 + state_code: WI + output: + wi_capital_gain_loss_addition: 0 + +- name: WI capital_gain_loss_addition unit test 4 + absolute_error_margin: 0.01 + period: 2022 + input: + long_term_capital_gains: 800 + state_code: WI + output: + wi_capital_gain_loss_addition: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_gain_loss_subtration.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_gain_loss_subtration.yaml new file mode 100644 index 000000000..11635a639 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_gain_loss_subtration.yaml @@ -0,0 +1,29 @@ +- name: wi_capital_gain_loss_subtraction unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + short_term_capital_gains: 0 + long_term_capital_gains: 900 + state_code: WI + output: + wi_capital_gain_loss_subtraction: 270 # = 900 * 0.30 + +- name: wi_capital_gain_loss_subtraction unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + short_term_capital_gains: -100 + long_term_capital_gains: 900 + state_code: WI + output: + wi_capital_gain_loss_subtraction: 240 # = (900 - 100) * 0.30 + +- name: wi_capital_gain_loss_subtraction unit test 3 + absolute_error_margin: 0.01 + period: 2021 + input: + short_term_capital_gains: -100 + long_term_capital_gains: 0 + state_code: WI + output: + wi_capital_gain_loss_subtraction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_loss.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_loss.yaml new file mode 100644 index 000000000..b7e2d4180 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_capital_loss.yaml @@ -0,0 +1,19 @@ +- name: wi_capital_loss unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + short_term_capital_gains: -100 + long_term_capital_gains: -200 + state_code: WI + output: + wi_capital_loss: 300 + +- name: wi_capital_loss unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + short_term_capital_gains: 0 + long_term_capital_gains: -900 + state_code: WI + output: + wi_capital_loss: 500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_childcare_expense_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_childcare_expense_credit.yaml new file mode 100644 index 000000000..1606ee43f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_childcare_expense_credit.yaml @@ -0,0 +1,17 @@ +- name: WI childcare_expense_credit unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + cdcc: 800 + state_code: WI + output: + wi_childcare_expense_credit: 0 + +- name: WI childcare_expense_credit unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + cdcc: 800 + state_code: WI + output: + wi_childcare_expense_credit: 400 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_childcare_expense_subtraction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_childcare_expense_subtraction.yaml new file mode 100644 index 000000000..0df96677b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_childcare_expense_subtraction.yaml @@ -0,0 +1,43 @@ +- name: WI childcare_expense_subtraction unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + tax_unit_childcare_expenses: 10_000 + count_cdcc_eligible: 3 + min_head_spouse_earned: 30_000 + state_code: WI + output: + wi_childcare_expense_subtraction: 6_000 + +- name: WI childcare_expense_subtraction unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + tax_unit_childcare_expenses: 10_000 + count_cdcc_eligible: 3 + min_head_spouse_earned: 2_000 + state_code: WI + output: + wi_childcare_expense_subtraction: 2_000 + +- name: WI childcare_expense_subtraction unit test 3 + absolute_error_margin: 0.01 + period: 2021 + input: + tax_unit_childcare_expenses: 2_000 + count_cdcc_eligible: 1 + min_head_spouse_earned: 3_000 + state_code: WI + output: + wi_childcare_expense_subtraction: 2_000 + +- name: WI childcare_expense_subtraction unit test 4 + absolute_error_margin: 0.01 + period: 2022 + input: + tax_unit_childcare_expenses: 10_000 + count_cdcc_eligible: 3 + min_head_spouse_earned: 30_000 + state_code: WI + output: + wi_childcare_expense_subtraction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_earned_income_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_earned_income_credit.yaml new file mode 100644 index 000000000..476e45cd9 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_earned_income_credit.yaml @@ -0,0 +1,21 @@ +- name: WI earned_income_credit unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + earned_income_tax_credit: 900 + eitc_relevant_investment_income: 0 + eitc_child_count: 2 + state_code: WI + output: + wi_earned_income_credit: 99 + +- name: WI earned_income_credit unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + earned_income_tax_credit: 900 + eitc_relevant_investment_income: 4_000 + eitc_child_count: 2 + state_code: WI + output: + wi_earned_income_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_exemption.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_exemption.yaml new file mode 100644 index 000000000..4b1f6c6e8 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_exemption.yaml @@ -0,0 +1,16 @@ +- name: WI exemption unit test 1 + period: 2021 + input: + xtot: 5 + state_code: WI + output: + wi_exemption: 5 * 700 + +- name: WI exemption unit test 2 + period: 2022 + input: + xtot: 5 + age_head: 65 + state_code: WI + output: + wi_exemption: 5 * 700 + 250 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_credit.yaml new file mode 100644 index 000000000..92fc3545c --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_credit.yaml @@ -0,0 +1,43 @@ +- name: wi_homestead_credit unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + wi_homestead_eligible: true + wi_homestead_income: 8_000 + wi_homestead_property_tax: 1_000 + state_code: WI + output: + wi_homestead_credit: 800 # = 1_000 * 0.80 + +- name: wi_homestead_credit unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + wi_homestead_eligible: true + wi_homestead_income: 8_060 + 10_000 + wi_homestead_property_tax: 1_000 + state_code: WI + output: + wi_homestead_credit: 97.2 # = (1_000 - 878.50) * 0.80 + +- name: wi_homestead_credit unit test 3 + absolute_error_margin: 0.01 + period: 2022 + input: + wi_homestead_eligible: true + wi_homestead_income: 8_000 + wi_homestead_property_tax: 1_500 + state_code: WI + output: + wi_homestead_credit: 1_168 # = min(1_460,1_500) * 0.80 + +- name: wi_homestead_credit unit test 4 + absolute_error_margin: 0.01 + period: 2021 + input: + wi_homestead_eligible: false + wi_homestead_income: 8_000 + wi_homestead_property_tax: 1_500 + state_code: WI + output: + wi_homestead_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_eligible.yaml new file mode 100644 index 000000000..4802db871 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_eligible.yaml @@ -0,0 +1,97 @@ +- name: wi_homestead_eligible unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + age_head: 18 + age_spouse: 17 + employment_income: 8_000 + head_is_disabled: false + spouse_is_disabled: false + wi_homestead_income: 9_000 + state_code: WI + output: + wi_homestead_eligible: true + +- name: wi_homestead_eligible unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + age_head: 17 + age_spouse: 17 + employment_income: 8_000 + head_is_disabled: false + spouse_is_disabled: false + wi_homestead_income: 9_000 + state_code: WI + output: + wi_homestead_eligible: false + +- name: wi_homestead_eligible unit test 3 + absolute_error_margin: 0.01 + period: 2021 + input: + age_head: 18 + age_spouse: 17 + employment_income: 0 + head_is_disabled: false + spouse_is_disabled: false + wi_homestead_income: 9_000 + state_code: WI + output: + wi_homestead_eligible: false + +- name: wi_homestead_eligible unit test 4 + absolute_error_margin: 0.01 + period: 2021 + input: + age_head: 62 + age_spouse: 60 + employment_income: 0 + head_is_disabled: false + spouse_is_disabled: false + wi_homestead_income: 9_000 + state_code: WI + output: + wi_homestead_eligible: true + +- name: wi_homestead_eligible unit test 5 + absolute_error_margin: 0.01 + period: 2022 + input: + age_head: 61 + age_spouse: 60 + employment_income: 0 + head_is_disabled: false + spouse_is_disabled: false + wi_homestead_income: 9_000 + state_code: WI + output: + wi_homestead_eligible: false + +- name: wi_homestead_eligible unit test 6 + absolute_error_margin: 0.01 + period: 2022 + input: + age_head: 61 + age_spouse: 60 + employment_income: 0 + head_is_disabled: false + spouse_is_disabled: true + wi_homestead_income: 9_000 + state_code: WI + output: + wi_homestead_eligible: true + +- name: wi_homestead_eligible unit test 7 + absolute_error_margin: 0.01 + period: 2021 + input: + age_head: 18 + age_spouse: 17 + employment_income: 8_000 + head_is_disabled: false + spouse_is_disabled: false + wi_homestead_income: 25_000 + state_code: WI + output: + wi_homestead_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_income.yaml new file mode 100644 index 000000000..c88d31491 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_income.yaml @@ -0,0 +1,19 @@ +- name: wi_homestead_income unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + adjusted_gross_income: 900 + tax_unit_dependents: 0 + state_code: WI + output: + wi_homestead_income: 900 + +- name: wi_homestead_income unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + adjusted_gross_income: 900 + tax_unit_dependents: 1 + state_code: WI + output: + wi_homestead_income: 400 # = 900 - 500 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_property_tax.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_property_tax.yaml new file mode 100644 index 000000000..b2c684b1e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_homestead_property_tax.yaml @@ -0,0 +1,9 @@ +- name: wi_homestead_propery_tax unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + real_estate_taxes: 200 + rent: 800 + state_code: WI + output: + wi_homestead_property_tax: 360 # = 200 + 800 * 0.20 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_income_tax_before_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_income_tax_before_credits.yaml new file mode 100644 index 000000000..ed1060697 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_income_tax_before_credits.yaml @@ -0,0 +1,29 @@ +- name: WI income tax before credits unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + filing_status: JOINT + wi_taxable_income: 455_910 + state_code: WI + output: + wi_income_tax_before_credits: 26_123.71 # = 18_473.71 + 0.0765 * 100_000 + +- name: WI income tax before credits unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + filing_status: SINGLE + wi_taxable_income: 380_950 + state_code: WI + output: + wi_income_tax_before_credits: 22_232.83 # = 14_582.83 + 0.0765 * 100_000 + +- name: WI income tax before credits unit test 3 + absolute_error_margin: 0.01 + period: 2022 + input: + filing_status: HEAD_OF_HOUSEHOLD + wi_taxable_income: 380_950 + state_code: WI + output: + wi_income_tax_before_credits: 22_232.83 # same as for SINGLE filing unit diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_income_tax_before_refundable_credits.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_income_tax_before_refundable_credits.yaml new file mode 100644 index 000000000..1af1bdfdc --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_income_tax_before_refundable_credits.yaml @@ -0,0 +1,19 @@ +- name: WI income tax before refundable credits unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + wi_income_tax_before_credits: 800 + wi_nonrefundable_credits: 600 + state_code: WI + output: + wi_income_tax_before_refundable_credits: 200 + +- name: WI income tax before refundable credits unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + wi_income_tax_before_credits: 800 + wi_nonrefundable_credits: 900 + state_code: WI + output: + wi_income_tax_before_refundable_credits: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_itemized_deduction_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_itemized_deduction_credit.yaml new file mode 100644 index 000000000..46378181f --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_itemized_deduction_credit.yaml @@ -0,0 +1,27 @@ +- name: WI itemized deduction credit unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + wi_standard_deduction: 10_000 + charitable_deduction: 3_000 + interest_deduction: 12_000 + salt_deduction: 8_000 + medical_expense_deduction: 1_000 + casualty_loss_deduction: 2_000 + state_code: WI + output: + wi_itemized_deduction_credit: 400 # = (3K + 12K + 1K + 2K - 10K) * 5% + +- name: WI itemized deduction credit unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + wi_standard_deduction: 20_000 + charitable_deduction: 3_000 + interest_deduction: 12_000 + salt_deduction: 8_000 + medical_expense_deduction: 1_000 + casualty_loss_deduction: 2_000 + state_code: WI + output: + wi_itemized_deduction_credit: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_married_couple_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_married_couple_credit.yaml new file mode 100644 index 000000000..86bf36fa5 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_married_couple_credit.yaml @@ -0,0 +1,47 @@ +- name: WI married couple credit unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + people: + person1: + is_tax_unit_head: true + employment_income: 90_000 + person2: + is_tax_unit_spouse: true + self_employment_income: 10_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WI + output: + wi_married_couple_credit: 300 # = 0.03 * 10_000 + +- name: WI married couple credit unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + people: + person1: + is_tax_unit_head: true + employment_income: 90_000 + person2: + is_tax_unit_spouse: true + self_employment_income: 20_000 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: WI + output: + wi_married_couple_credit: 480 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_property_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_property_tax_credit.yaml new file mode 100644 index 000000000..b2d3b9108 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_property_tax_credit.yaml @@ -0,0 +1,29 @@ +- name: WI property tax credit unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + rent: 0 + real_estate_taxes: 800 + state_code: WI + output: + wi_property_tax_credit: 96 + +- name: WI property tax credit unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + rent: 4_000 + real_estate_taxes: 0 + state_code: WI + output: + wi_property_tax_credit: 96 + +- name: WI property tax credit unit test 3 + absolute_error_margin: 0.01 + period: 2022 + input: + rent: 5_000 + real_estate_taxes: 2_000 + state_code: WI + output: + wi_property_tax_credit: 300 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_retirement_income_subtraction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_retirement_income_subtraction.yaml new file mode 100644 index 000000000..ff909b48e --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_retirement_income_subtraction.yaml @@ -0,0 +1,38 @@ +- name: WI retirement_income_subtraction unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + age: 66 + taxable_pension_income: 4_000 + is_tax_unit_dependent: false + filing_status: SINGLE + adjusted_gross_income: 12_000 + state_code: WI + output: + wi_retirement_income_subtraction: 4_000 + +- name: WI retirement_income_subtraction unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + age: 66 + taxable_pension_income: 4_000 + is_tax_unit_dependent: false + filing_status: SINGLE + adjusted_gross_income: 18_000 + state_code: WI + output: + wi_retirement_income_subtraction: 0 + +- name: WI retirement_income_subtraction unit test 3 + absolute_error_margin: 0.01 + period: 2022 + input: + age: 64 + taxable_pension_income: 4_000 + is_tax_unit_dependent: false + filing_status: SINGLE + adjusted_gross_income: 12_000 + state_code: WI + output: + wi_retirement_income_subtraction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_retirement_income_subtraction_agi_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_retirement_income_subtraction_agi_eligible.yaml new file mode 100644 index 000000000..28815fea7 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_retirement_income_subtraction_agi_eligible.yaml @@ -0,0 +1,19 @@ +- name: WI retirement_income_subtraction_eligible unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + filing_status: SINGLE + adjusted_gross_income: 12_000 + state_code: WI + output: + wi_retirement_income_subtraction_agi_eligible: true + +- name: WI retirement_income_subtraction_eligible unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + filing_status: SINGLE + adjusted_gross_income: 20_000 + state_code: WI + output: + wi_retirement_income_subtraction_agi_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_standard_deduction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_standard_deduction.yaml new file mode 100644 index 000000000..252219d1b --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_standard_deduction.yaml @@ -0,0 +1,39 @@ +- name: WI standard deduction unit test 1 + absolute_error_margin: 0.01 + period: 2022 + input: + filing_status: JOINT + wi_agi: 75_000 + state_code: WI + output: + wi_standard_deduction: 11_836.06 + +- name: WI standard deduction unit test 2 + absolute_error_margin: 0.01 + period: 2022 + input: + filing_status: SINGLE + wi_agi: 49_705 + state_code: WI + output: + wi_standard_deduction: 7_864.20 + +- name: WI standard deduction unit test 3 + absolute_error_margin: 0.01 + period: 2022 + input: + filing_status: HEAD_OF_HOUSEHOLD + wi_agi: 49_705 + state_code: WI + output: + wi_standard_deduction: 7_864.22 + +- name: WI standard deduction unit test 4 + absolute_error_margin: 0.01 + period: 2022 + input: + filing_status: HEAD_OF_HOUSEHOLD + wi_agi: 49_705 + 10_000 + state_code: WI + output: + wi_standard_deduction: 7_864.22 - 0.12 * 10_000 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_taxable_income.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_taxable_income.yaml new file mode 100644 index 000000000..e1f0d4b0d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_taxable_income.yaml @@ -0,0 +1,19 @@ +- name: WI taxable income unit test 1 + period: 2021 + input: + wi_agi: 40_000 + wi_standard_deduction: 10_000 + wi_exemption: 4 * 750 + state_code: WI + output: + wi_taxable_income: 40_000 - 10_000 - 4 * 750 + +- name: WI taxable income unit test 2 + period: 2022 + input: + wi_agi: 900 + wi_standard_deduction: 200 + wi_exemption: 750 + state_code: WI + output: + wi_taxable_income: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_unemployment_compensation_subtraction.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_unemployment_compensation_subtraction.yaml new file mode 100644 index 000000000..ff13ab35a --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wi/tax/income/wi_unemployment_compensation_subtraction.yaml @@ -0,0 +1,41 @@ +- name: wi_unemployment_compensation_subtraction unit test 1 + absolute_error_margin: 0.01 + period: 2021 + input: + taxable_unemployment_compensation: 0 + state_code: WI + output: + wi_unemployment_compensation_subtraction: 0 + +- name: wi_unemployment_compensation_subtraction unit test 2 + absolute_error_margin: 0.01 + period: 2021 + input: + taxable_unemployment_compensation: 600 + adjusted_gross_income: 12_000 + filing_status: SINGLE + state_code: WI + output: + wi_unemployment_compensation_subtraction: 600 + +- name: wi_unemployment_compensation_subtraction unit test 3 + absolute_error_margin: 0.01 + period: 2022 + input: + taxable_unemployment_compensation: 600 + adjusted_gross_income: 13_000 + filing_status: SINGLE + state_code: WI + output: + wi_unemployment_compensation_subtraction: 100 + +- name: wi_unemployment_compensation_subtraction unit test 4 + absolute_error_margin: 0.01 + period: 2022 + input: + taxable_unemployment_compensation: 600 + adjusted_gross_income: 14_000 + filing_status: SINGLE + state_code: WI + output: + wi_unemployment_compensation_subtraction: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/sctc/wv_sctc.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/sctc/wv_sctc.yaml new file mode 100644 index 000000000..89e4d6eea --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/sctc/wv_sctc.yaml @@ -0,0 +1,31 @@ +- name: Filers who is eligible with taxable property value of $40,000 can get the senior citizens tax credit of $20,000. + period: 2022 + input: + wv_taxable_property_value: 40_000 + wv_sctc_eligible: true + output: + wv_sctc: 20_000 + +- name: Filers who is ineligible with taxable property value of $20,000 can get the senior citizens tax credit of 0. + period: 2022 + input: + wv_taxable_property_value: 20_000 + wv_sctc_eligible: false + output: + wv_sctc: 0 + +- name: Filers who is eligible with taxable property value of $7,000 can get the senior citizens tax credit of $10,000. + period: 2022 + input: + wv_taxable_property_value: 7_000 + wv_sctc_eligible: true + output: + wv_sctc: 7_000 + +- name: Filers who is ineligible with taxable property value of $7,000 can get the senior citizens tax credit of 0. + period: 2022 + input: + wv_taxable_property_value: 7_000 + wv_sctc_eligible: false + output: + wv_sctc: 0 diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/sctc/wv_sctc_eligible.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/sctc/wv_sctc_eligible.yaml new file mode 100644 index 000000000..cb1cc3b2d --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/sctc/wv_sctc_eligible.yaml @@ -0,0 +1,43 @@ +- name: 1 person Household, adjusted gross income of $20,000, homestead exemption of $20,000 is eligible for the senior citizens tax credit. + period: 2022 + input: + adjusted_gross_income: 20_000 + tax_unit_size: 1 + # 20,385 + wv_homestead_exemption: 20_000 + state_code: WV + output: + wv_sctc_eligible: true + +- name: 2 person Household, adjusted gross income of $30,000, homestead exemption of $20,000 is ineligible for the senior citizens tax credit. + period: 2022 + input: + adjusted_gross_income: 30_000 + tax_unit_size: 2 + # 27,465 + wv_homestead_exemption: 20_000 + state_code: WV + output: + wv_sctc_eligible: false + +- name: 3 person Household, adjusted gross income of $30,000, homestead exemption of $10,000 is eligible for the senior citizens tax credit. + period: 2022 + input: + adjusted_gross_income: 30_000 + tax_unit_size: 3 + # 34,545 + wv_homestead_exemption: 10_000 + state_code: WV + output: + wv_sctc_eligible: false + +- name: 4 person Household, adjusted gross income of $50,000, homestead exemption of $20,000 is ineligible for the senior citizens tax credit. + period: 2022 + input: + adjusted_gross_income: 50_000 + tax_unit_size: 4 + # 41,625 + wv_homestead_exemption: 30_000 + state_code: WV + output: + wv_sctc_eligible: false diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit.yaml new file mode 100644 index 000000000..e9ad68793 --- /dev/null +++ b/fiscalsim_us/tests/policy/baseline/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit.yaml @@ -0,0 +1,57 @@ +- name: Single filers get 0 low-income family tax credit whose family size 4, the federal poverty guidelines based on 4 members $30,000, modified federal adjusted gross income $40,000. + period: 2022 + input: + wv_agi: 40_000 + wv_low_income_family_tax_credit_fpg: 27_750 + # tax_unit_fpg: 27_750 + state_code: WV + filing_status: SINGLE + wv_income_tax_before_non_refundable_credits: 0 + state_group: CONTIGUOUS_US + output: + wv_low_income_family_tax_credit: 0 + +- name: Head of household filers get 40% x the amount of tax owed low-income family tax credit whose family size 2, the federal poverty guidelines based on 2 members $19,720, modified federal adjusted gross income $20,000. + period: 2022 + input: + wv_agi: 20_000 + wv_low_income_family_tax_credit_fpg: 18_310 + # tax_unit_fpg: 18_310 + state_code: WV + filing_status: HEAD_OF_HOUSEHOLD + wv_income_tax_before_non_refundable_credits: 2_000 + state_group: CONTIGUOUS_US + output: + # 1500 < wv_modified_agi-tax_unit_fpg = 20_000-18_310 = 1690 < 1800 40% x the amount of tax owed + # 2_000 * 0.4 + wv_low_income_family_tax_credit: 800 + +- name: Husband and wife who file separate returns get 0 low-income family tax credit whose family size 3, the federal poverty guidelines based on 3 members $24,860, modified federal adjusted gross income $20,000. + period: 2022 + input: + wv_agi: 20_000 + wv_low_income_family_tax_credit_fpg: 23_030 + # tax_unit_fpg: 23_030 + state_code: AR + filing_status: SEPARATE + wv_income_tax_before_non_refundable_credits: 1_000 + state_group: CONTIGUOUS_US + output: + wv_low_income_family_tax_credit: 0 + +- name: Husband and wife who file separate returns get 100% x the amount of tax owed low-income family tax credit whose family size 3, the federal poverty guidelines based on 3 members $24,860, modified federal adjusted gross income $12,000. + period: 2022 + input: + wv_agi: 12_000 + wv_low_income_family_tax_credit_fpg: 23_030 + # tax_unit_fpg: 23_030 + state_code: WV + filing_status: SEPARATE + wv_income_tax_before_non_refundable_credits: 1_000 + state_group: CONTIGUOUS_US + output: + # 450 Formula: - def formula(entity, period, parameters): - of_variable = add(entity, period, [of]) - over_variable = add(entity, period, [over]) - return max_(of_variable - over_variable, 0) - - return formula - - def get_next_threshold(values: ArrayLike, thresholds: ArrayLike) -> ArrayLike: """ Return the next threshold in the sequence of thresholds. diff --git a/fiscalsim_us/tools/taxcalc/calcfunctions.py b/fiscalsim_us/tools/taxcalc/calcfunctions.py deleted file mode 100644 index c7f7699e3..000000000 --- a/fiscalsim_us/tools/taxcalc/calcfunctions.py +++ /dev/null @@ -1,4620 +0,0 @@ -""" -Tax-Calculator functions that calculate payroll and individual income taxes. - -These functions are imported into the Calculator class. - -Note: the parameter_indexing_CPI_offset policy parameter is the only -policy parameter that does not appear here; it is used in the policy.py -file to possibly adjust the price inflation rate used to index policy -parameters (as would be done in a reform that introduces chained-CPI -indexing). -""" -# CODING-STYLE CHECKS: -# pycodestyle calcfunctions.py -# pylint --disable=locally-disabled calcfunctions.py -# -# pylint: disable=too-many-lines -# pylint: disable=invalid-name -# pylint: disable=too-many-arguments -# pylint: disable=too-many-locals - -import math -import copy -import numpy as np -from taxcalc.decorators import iterate_jit, JIT - - -def BenefitPrograms(calc): - """ - Calculate total government cost and consumption value of benefits - delivered by non-repealed benefit programs. - - Parameters - ---------- - calc: Calculator object - calc represents the reform while self represents the baseline - - Returns - ------- - None: - The function modifies calc - """ - # zero out benefits delivered by repealed programs - zero = np.zeros(calc.array_len) - if calc.policy_param("BEN_housing_repeal"): - calc.array("housing_ben", zero) - if calc.policy_param("BEN_ssi_repeal"): - calc.array("ssi_ben", zero) - if calc.policy_param("BEN_snap_repeal"): - calc.array("snap_ben", zero) - if calc.policy_param("BEN_tanf_repeal"): - calc.array("tanf_ben", zero) - if calc.policy_param("BEN_vet_repeal"): - calc.array("vet_ben", zero) - if calc.policy_param("BEN_wic_repeal"): - calc.array("wic_ben", zero) - if calc.policy_param("BEN_mcare_repeal"): - calc.array("mcare_ben", zero) - if calc.policy_param("BEN_mcaid_repeal"): - calc.array("mcaid_ben", zero) - if calc.policy_param("BEN_oasdi_repeal"): - calc.array("e02400", zero) - if calc.policy_param("BEN_ui_repeal"): - calc.array("e02300", zero) - if calc.policy_param("BEN_other_repeal"): - calc.array("other_ben", zero) - # calculate government cost of all benefits - cost = np.array( - calc.array("housing_ben") - + calc.array("ssi_ben") - + calc.array("snap_ben") - + calc.array("tanf_ben") - + calc.array("vet_ben") - + calc.array("wic_ben") - + calc.array("mcare_ben") - + calc.array("mcaid_ben") - + calc.array("e02400") - + calc.array("e02300") - + calc.array("ubi") - + calc.array("other_ben") - ) - calc.array("benefit_cost_total", cost) - # calculate consumption value of all benefits - # (assuming that cash benefits have full value) - value = np.array( - calc.array("housing_ben") * calc.consump_param("BEN_housing_value") - + calc.array("ssi_ben") - + calc.array("snap_ben") * calc.consump_param("BEN_snap_value") - + calc.array("tanf_ben") * calc.consump_param("BEN_tanf_value") - + calc.array("vet_ben") * calc.consump_param("BEN_vet_value") - + calc.array("wic_ben") * calc.consump_param("BEN_wic_value") - + calc.array("mcare_ben") * calc.consump_param("BEN_mcare_value") - + calc.array("mcaid_ben") * calc.consump_param("BEN_mcaid_value") - + calc.array("e02400") - + calc.array("e02300") - + calc.array("ubi") - + calc.array("other_ben") * calc.consump_param("BEN_other_value") - ) - calc.array("benefit_value_total", value) - - -def EI_PayrollTax( - SS_Earnings_c, - e00200p, - e00200s, - pencon_p, - pencon_s, - FICA_ss_trt, - FICA_mc_trt, - ALD_SelfEmploymentTax_hc, - SS_Earnings_thd, - e00900p, - e00900s, - e02100p, - e02100s, - k1bx14p, - k1bx14s, - payrolltax, - ptax_was, - setax, - c03260, - ptax_oasdi, - sey, - earned, - earned_p, - earned_s, - was_plus_sey_p, - was_plus_sey_s, -): - """ - Compute part of total OASDI+HI payroll taxes and earned income variables. - - Parameters - ---------- - SS_Earnings_c: float - Maximum taxable earnings for Social Security. - Individual earnings below this amount are subjected to OASDI payroll tax. - This parameter is indexed by rate of growth in average wages not by the price inflation rate. - e00200p: float - Wages, salaries, and tips for taxpayer net of pension contributions - e00200s: float - Wages, salaries, and tips for spouse net of pension contributions - pencon_p: float - Contributions to defined-contribution pension plans for taxpayer - pencon_s: float - Contributions to defined-contribution pension plans for spouse - FICA_ss_trt: float - Social security payroll tax rate, including both employer and employee - FICA_mc_trt: float - Medicare payroll tax rate, including both employer and employee - ALD_SelfEmploymentTax_hc: float - Adjustment for self-employment tax haircut - If greater than zero, reduces the employer equivalent portion of self-employment adjustment - Final adjustment amount = (1-Haircut)*SelfEmploymentTaxAdjustment - SS_Earnings_thd: float - Additional taxable earnings threshold for Social Security - Individual earnings above this threshold are subjected to OASDI payroll tax, in addtion to - earnings below the maximum taxable earnings threshold. - e00900p: float - Schedule C business net profit/loss for taxpayer - e00900s: float - Schedule C business net profit/loss for spouse - e02100p: float - Farm net income/loss for taxpayer - e02100s: float - Farm net income/loss for spouse - k1bx14p: float - Partner self-employment earnings/loss for taxpayer (included in e26270 total) - k1bx14s: float - Partner self-employment earnings/loss for spouse (included in e26270 total) - payrolltax: float - Total (employee and employer) payroll tax liability - payrolltax = ptax_was + setax + ptax_amc - ptax_was: float - Employee and employer OASDI plus HI FICA tax - setax: float - Self-employment tax - c03260: float - Deductible part of self-employment tax - c03260 = (1 - ALD_SelfEmploymentTax_hc) * 0.5 * setax - ptax_oasdi: float - Employee and employer OASDI FICA tax plus self employment tax - Excludes HI FICA so positive ptax_oasdi is less than ptax_was + setax - sey: float - Total self-employment income for filing unit - earned: float - Earned income for filing unit - earned_p: float - Earned income for taxpayer - earned_s: float - Earned income for spouse - was_plus_sey_p: float - Wage and salary income plus taxable self employment income for taxpayer - was_plus_sey_s: float - Wage and salary income plus taxable self employment income for spouse - - Returns - ------- - sey: float - Total self-employment income for filing unit - payrolltax: float - Total (employee and employer) payroll tax liability - payrolltax = ptax_was + setax + ptax_amc - ptax_was: float - Employee and employer OASDI plus HI FICA tax - setax: float - Self-employment tax - c03260: float - Deductible part of self-employment tax - c03260 = (1 - ALD_SelfEmploymentTax_hc) * 0.5 * setax - ptax_oasdi: float - Employee and employer OASDI FICA tax plus self employment tax - Excludes HI FICA so positive ptax_oasdi is less than ptax_was + setax - earned: float - Earned income for filing unit - earned_p: float - Earned income for taxpayer - earned_s: float - Earned income for spouse - was_plus_sey_p: float - Wage and salary income plus taxable self employment income for taxpayer - was_plus_sey_s: float - Wage and salary income plus taxable self employment income for spouse - """ - # compute sey and its individual components - sey_p = e00900p + e02100p + k1bx14p - sey_s = e00900s + e02100s + k1bx14s - sey = sey_p + sey_s # total self-employment income for filing unit - - # compute gross wage and salary income ('was' denotes 'wage and salary') - gross_was_p = e00200p + pencon_p - gross_was_s = e00200s + pencon_s - - # compute taxable gross earnings for OASDI FICA - txearn_was_p = min(SS_Earnings_c, gross_was_p) - txearn_was_s = min(SS_Earnings_c, gross_was_s) - - # compute OASDI and HI payroll taxes on wage-and-salary income, FICA - ptax_ss_was_p = FICA_ss_trt * txearn_was_p - ptax_ss_was_s = FICA_ss_trt * txearn_was_s - ptax_mc_was_p = FICA_mc_trt * gross_was_p - ptax_mc_was_s = FICA_mc_trt * gross_was_s - ptax_was = ptax_ss_was_p + ptax_ss_was_s + ptax_mc_was_p + ptax_mc_was_s - - # compute taxable self-employment income for OASDI SECA - sey_frac = 1.0 - 0.5 * (FICA_ss_trt + FICA_mc_trt) - txearn_sey_p = min( - max(0.0, sey_p * sey_frac), SS_Earnings_c - txearn_was_p - ) - txearn_sey_s = min( - max(0.0, sey_s * sey_frac), SS_Earnings_c - txearn_was_s - ) - - # compute self-employment tax on taxable self-employment income, SECA - setax_ss_p = FICA_ss_trt * txearn_sey_p - setax_ss_s = FICA_ss_trt * txearn_sey_s - setax_mc_p = FICA_mc_trt * max(0.0, sey_p * sey_frac) - setax_mc_s = FICA_mc_trt * max(0.0, sey_s * sey_frac) - setax_p = setax_ss_p + setax_mc_p - setax_s = setax_ss_s + setax_mc_s - setax = setax_p + setax_s - - # compute extra OASDI payroll taxes on the portion of the sum - # of wage-and-salary income and taxable self employment income - # that exceeds SS_Earnings_thd - sey_frac = 1.0 - 0.5 * FICA_ss_trt - was_plus_sey_p = gross_was_p + max(0.0, sey_p * sey_frac) - was_plus_sey_s = gross_was_s + max(0.0, sey_s * sey_frac) - extra_ss_income_p = max(0.0, was_plus_sey_p - SS_Earnings_thd) - extra_ss_income_s = max(0.0, was_plus_sey_s - SS_Earnings_thd) - extra_payrolltax = ( - extra_ss_income_p * FICA_ss_trt + extra_ss_income_s * FICA_ss_trt - ) - - # compute part of total payroll taxes for filing unit - # (the ptax_amc part of total payroll taxes for the filing unit is - # computed in the AdditionalMedicareTax function below) - payrolltax = ptax_was + setax + extra_payrolltax - - # compute OASDI part of payroll taxes - ptax_oasdi = ( - ptax_ss_was_p - + ptax_ss_was_s - + setax_ss_p - + setax_ss_s - + extra_payrolltax - ) - - # compute earned* variables and AGI deduction for - # "employer share" of self-employment tax, c03260 - # Note: c03260 is the amount on 2015 Form 1040, line 27 - c03260 = (1.0 - ALD_SelfEmploymentTax_hc) * 0.5 * setax - earned = max(0.0, e00200p + e00200s + sey - c03260) - earned_p = max( - 0.0, - (e00200p + sey_p - (1.0 - ALD_SelfEmploymentTax_hc) * 0.5 * setax_p), - ) - earned_s = max( - 0.0, - (e00200s + sey_s - (1.0 - ALD_SelfEmploymentTax_hc) * 0.5 * setax_s), - ) - return ( - sey, - payrolltax, - ptax_was, - setax, - c03260, - ptax_oasdi, - earned, - earned_p, - earned_s, - was_plus_sey_p, - was_plus_sey_s, - ) - - -def DependentCare( - nu13, - elderly_dependents, - earned, - MARS, - ALD_Dependents_thd, - ALD_Dependents_hc, - ALD_Dependents_Child_c, - ALD_Dependents_Elder_c, - care_deduction, -): - """ - Computes dependent-care above-the-line deduction. - - Parameters - ---------- - nu13: int - Number of dependents under 13 years old - elderly_dependents: int - Number of elderly dependents age 65+ in filing unit excluding taxpayer and spouse - earned: float - Earned income for filing unit - MARS: int - Filing marital status (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - ALD_Dependents_thd: list - Maximum income to qualify for dependent care deduction - ALD_Dependents_hc: float - Deduction for childcare costs haircut - ALD_Dependents_Child_c: float - National weighted average cost of childcare, ceiling for available childcare deduction - ALD_Dependents_Elder_c: float - Eldercare deduction ceiling - - Returns - ------- - care_deduction: float - Total above the line deductions for dependent care. - """ - - if earned <= ALD_Dependents_thd[MARS - 1]: - care_deduction = ( - (1.0 - ALD_Dependents_hc) * nu13 * ALD_Dependents_Child_c - ) + ( - (1.0 - ALD_Dependents_hc) - * elderly_dependents - * ALD_Dependents_Elder_c - ) - else: - care_deduction = 0.0 - return care_deduction - - -def Adj( - e03150, - e03210, - c03260, - e03270, - e03300, - e03400, - e03500, - e00800, - e03220, - e03230, - e03240, - e03290, - care_deduction, - ALD_StudentLoan_hc, - ALD_SelfEmp_HealthIns_hc, - ALD_KEOGH_SEP_hc, - ALD_EarlyWithdraw_hc, - ALD_AlimonyPaid_hc, - ALD_AlimonyReceived_hc, - ALD_EducatorExpenses_hc, - ALD_HSADeduction_hc, - ALD_IRAContributions_hc, - ALD_DomesticProduction_hc, - ALD_Tuition_hc, - c02900, -): - """ - Adj calculates Form 1040 AGI adjustments (i.e., Above-the-Line Deductions). - - Parameters - ----- - e03210: float - Student loan interest paid - e03220: float - Educator expenses - e03150: float - Total deductible IRA plan contributions - e03230: float - Tuition and fees (Form 8917) - e03240: float - Domestic production activity deduction (Form 8903) - c03260: float - Self-employment tax deduction (after haircut) - e03270: float - Self-employed health insurance premiums - e03290: float - HSA deduction (Form 8889) - e03300: float - Total deductible KEOGH/SEP/SIMPLE/etc. plan contributions - e03400: float - Penalty on early withdrawal of savings deduction - e03500: float - Alimony paid - e00800: float - Alimony received - care_deduction: float - Dependent care expense deduction - ALD_StudentLoan_hc: float - Student loan interest deduction haircut - ALD_SelfEmp_HealthIns_hc: float - Self-employed h.i. deduction haircut - ALD_KEOGH_SEP_hc: float - KEOGH/etc. plan contribution deduction haircut - ALD_EarlyWithdraw_hc: float - Penalty on early withdrawal deduction haricut - ALD_AlimonyPaid_hc: float - Alimony paid deduction haircut - ALD_AlimonyReceived_hc: float - Alimony received deduction haircut - ALD_EducatorExpenses_hc: float - Eductor expenses haircut - ALD_HSADeduction_hc: float - HSA Deduction haircut - ALD_IRAContributions_hc: float - IRA Contribution haircut - ALD_DomesticProduction_hc: float - Domestic production haircut - ALD_Tuition_hc: float - Tuition and fees haircut - - Returns - ------- - c02900: float - Total of all "above the line" income adjustments to get AGI - """ - # Form 2555 foreign earned income exclusion is assumed to be zero - # Form 1040 adjustments that are included in expanded income: - c02900 = ( - (1.0 - ALD_StudentLoan_hc) * e03210 - + c03260 - + (1.0 - ALD_EarlyWithdraw_hc) * e03400 - + (1.0 - ALD_AlimonyPaid_hc) * e03500 - + (1.0 - ALD_AlimonyReceived_hc) * e00800 - + (1.0 - ALD_EducatorExpenses_hc) * e03220 - + (1.0 - ALD_Tuition_hc) * e03230 - + (1.0 - ALD_DomesticProduction_hc) * e03240 - + (1.0 - ALD_HSADeduction_hc) * e03290 - + (1.0 - ALD_SelfEmp_HealthIns_hc) * e03270 - + (1.0 - ALD_IRAContributions_hc) * e03150 - + (1.0 - ALD_KEOGH_SEP_hc) * e03300 - + care_deduction - ) - return c02900 - - -def ALD_InvInc_ec_base( - p22250, p23250, sep, e00300, e00600, e01100, e01200, invinc_ec_base -): - """ - Computes invinc_ec_base. - - Parameters - ---------- - p22250: float - Net short-term capital gails/losses (Schedule D) - p23250: float - Net long-term capital gains/losses (Schedule D) - sep: int - 2 when MARS is 3 (married filing separately); otherwise 1 - e00300: float - Taxable interest income - e00600: float - Ordinary dividends included in AGI - e01100: float - Capital gains distributions not reported on Schedule D - e01200: float - Other net gain/loss from Form 4797 - invinc_ec_base: float - Exclusion of investment income from AGI - - Returns - ------- - invinc_ec_base: float - Exclusion of investment income from AGI - """ - # limitation on net short-term and long-term capital losses - cgain = max((-3000.0 / sep), p22250 + p23250) - # compute exclusion of investment income from AGI - invinc_ec_base = e00300 + e00600 + cgain + e01100 + e01200 - return invinc_ec_base - - -def CapGains( - p23250, - p22250, - sep, - ALD_StudentLoan_hc, - ALD_InvInc_ec_rt, - invinc_ec_base, - e00200, - e00300, - e00600, - e00650, - e00700, - e00800, - CG_nodiff, - CG_ec, - CG_reinvest_ec_rt, - ALD_BusinessLosses_c, - MARS, - e00900, - e01100, - e01200, - e01400, - e01700, - e02000, - e02100, - e02300, - e00400, - e02400, - c02900, - e03210, - e03230, - e03240, - c01000, - c23650, - ymod, - ymod1, - invinc_agi_ec, -): - """ - CapGains function: ... - - Parameters - ---------- - p23250: float - Net long-term capital gains/losses (Schedule D) - p22250: float - Net short-term capital gails/losses (Schedule D) - sep: int - 2 when MARS is 3 (married filing separately); otherwise 1 - ALD_StudentLoan_hc: float - Student loan interest deduction haircut - ALD_InvInc_ec_rt: float - Investment income exclusion rate haircut - invinc_ec_base: float - Exclusion of investment income from AGI - e00200: float - Wages, salaries, tips for filing unit net of pension contributions - e00300: float - Taxable interest income - e00600: float - Ordinary dividends included in AGI - e00650: float - Qualified dividends included in ordinary dividends - e00700: float - Taxable refunds of state and local income taxes - e00800: float - Alimony received - CG_nodiff: bool - Long term capital gains and qualified dividends taxed no differently than regular taxable income - CG_ec: float - Dollar amount of all capital gains and qualified dividends that are excluded from AGI - CG_reinvest_ec_rt: float - Fraction of all capital gains and qualified dividends in excess of the dollar exclusion that are excluded from AGI - ALD_BusinessLosses_c: list - Maximm amount of business losses deductible - MARS: int - Filing marital status (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - e00900: float - Schedule C business net profit/loss for filing unit - e01100: float - Capital gain distributions not reported on Schedule D - e01200: float - Other net gain/loss from Form 4797 - e01400: float - Taxable IRA distributions - e01700: float - Taxable pensions and annunities - e02000: float - Schedule E total rental, royalty, partnership, S-corporation, etc, income/loss (includes e26270 and e27200) - e02100: float - Farm net income/loss for filing unit from Schedule F - e02300: float - Unemployment insurance benefits - e00400: float - Tax-exempt interest income - e02400: float - Total social security (OASDI) benefits - c02900: float - Total of all "above the line" income adjustments to get AGI - e03210: float - Student loan interest - e03230: float - Tuition and fees from Form 8917 - e03240: float - Domestic production activities from Form 8903 - c01000: float - Limitation on capital losses - c23650: float - Net capital gains (long and short term) before exclusion - ymod: float - Variable that is used in OASDI benefit taxation logic - ymod1: float - Variable that is included in AGI - invinc_agi_ec: float - Exclusion of investment income from AGI - - Returns - ------- - c01000: float - Limitation on capital losses - c23650: float - Net capital gains (long and short term) before exclusion - ymod: float - Variable that is used in OASDI benefit taxation logic - ymod1: float - Variable that is included in AGI - invinc_agi_ec: float - Exclusion of investment income from AGI - """ - # net capital gain (long term + short term) before exclusion - c23650 = p23250 + p22250 - # limitation on capital losses - c01000 = max((-3000.0 / sep), c23650) - # compute total investment income - invinc = e00300 + e00600 + c01000 + e01100 + e01200 - # compute exclusion of investment income from AGI - invinc_agi_ec = ALD_InvInc_ec_rt * max(0.0, invinc_ec_base) - # compute ymod1 variable that is included in AGI - ymod1 = ( - e00200 - + e00700 - + e00800 - + e01400 - + e01700 - + invinc - - invinc_agi_ec - + e02100 - + e02300 - + max(e00900 + e02000, -ALD_BusinessLosses_c[MARS - 1]) - ) - if CG_nodiff: - # apply QDIV+CG exclusion if QDIV+LTCG receive no special tax treatment - qdcg_pos = max(0.0, e00650 + c01000) - qdcg_exclusion = min(CG_ec, qdcg_pos) + CG_reinvest_ec_rt * max( - 0.0, qdcg_pos - CG_ec - ) - ymod1 = max(0.0, ymod1 - qdcg_exclusion) - invinc_agi_ec += qdcg_exclusion - # compute ymod variable that is used in OASDI benefit taxation logic - ymod2 = e00400 + (0.50 * e02400) - c02900 - ymod3 = (1.0 - ALD_StudentLoan_hc) * e03210 + e03230 + e03240 - ymod = ymod1 + ymod2 + ymod3 - return (c01000, c23650, ymod, ymod1, invinc_agi_ec) - - -def SSBenefits( - MARS, - ymod, - e02400, - SS_thd50, - SS_thd85, - SS_percentage1, - SS_percentage2, - c02500, -): - """ - Calculates OASDI benefits included in AGI, c02500. - - Parameters - ---------- - MARS: int - Filing marital status (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - ymod: float - Variable that is used in OASDI benefit taxation logic - e02400: float - Total social security (OASDI) benefits - SS_thd50: list - Threshold for social security benefit taxability (1) - SS_thd85: list - Threshold for social security benefit taxability (2) - SS_percentage1: float - Social security taxable income decimal fraction (1) - SS_percentage2: float - Social security taxable income decimal fraction (2) - c02500: float - Social security (OASDI) benefits included in AGI - - Returns - ------- - c02500: float - Social security (OASDI) benefits included in AGI - """ - if ymod < SS_thd50[MARS - 1]: - c02500 = 0.0 - elif ymod < SS_thd85[MARS - 1]: - c02500 = SS_percentage1 * min(ymod - SS_thd50[MARS - 1], e02400) - else: - c02500 = min( - SS_percentage2 * (ymod - SS_thd85[MARS - 1]) - + SS_percentage1 - * min(e02400, SS_thd85[MARS - 1] - SS_thd50[MARS - 1]), - SS_percentage2 * e02400, - ) - return c02500 - - -def UBI( - nu18, - n1820, - n21, - UBI_u18, - UBI_1820, - UBI_21, - UBI_ecrt, - ubi, - taxable_ubi, - nontaxable_ubi, -): - """ - Calculates total and taxable Universal Basic Income (UBI) amount. - - Parameters - ---------- - nu18: int - Number of people in the tax unit under 18 - n1820: int - Number of people in the tax unit age 18-20 - n21: int - Number of people in the tax unit age 21+ - UBI_u18: float - UBI benefit for those under 18 - UBI_1820: float - UBI benefit for those between 18 to 20 - UBI_21: float - UBI benefit for those 21 or more - UBI_ecrt: float - Fraction of UBI benefits that are not included in AGI - ubi: float - Total UBI received by the tax unit (is included in expanded_income) - taxable_ubi: float - Amount of UBI that is taxable (is added to AGI) - nontaxable_ubi: float - Amount of UBI that is nontaxable - - Returns - ------- - ubi: float - Total UBI received by the tax unit (is included in expanded_income) - taxable_ubi: float - Amount of UBI that is taxable (is added to AGI) - nontaxable_ubi: float - Amount of UBI that is nontaxable - """ - ubi = nu18 * UBI_u18 + n1820 * UBI_1820 + n21 * UBI_21 - taxable_ubi = ubi * (1.0 - UBI_ecrt) - nontaxable_ubi = ubi - taxable_ubi - return ubi, taxable_ubi, nontaxable_ubi - - -def AGI( - ymod1, - c02500, - c02900, - XTOT, - MARS, - sep, - DSI, - exact, - nu18, - taxable_ubi, - II_em, - II_em_ps, - II_prt, - II_no_em_nu18, - c00100, - pre_c04600, - c04600, -): - """ - Computes Adjusted Gross Income (AGI), c00100, and - compute personal exemption amount, c04600. - - Parameters - ---------- - ymod1: float - Variable that is included in AGI - c02500: float - Social security (OASDI) benefits included in AGI - c02900: float - Total of all "above the line" income adjustments to get AGI - XTOT: int - Total number of exemptions for filing unit - MARS: int - Filing marital status (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - sep: int - 2 when MARS is 3 (married filing separately); otherwise 1 - DSI: int - 1 if claimed as dependent on another return; otherwise 0 - exact: int - Whether or not to do rounding of phaseout fraction - nu18: int - Number of people in the tax unit under 18 - taxable_ubi: float - Amount of UBI that is taxable (is added to AGI) - II_em: float - Personal and dependent exemption amount - II_em_ps: list - Personal exemption phaseout starting income - II_prt: float - Personal exemption phaseout rate - II_no_em_nu18: float - Repeal personal exemptions for dependents under age 18 - c00100: float - Adjusted Gross Income (AGI) - pre_c04600: float - Personal exemption before phase-out - c04600: float - Personal exemptions after phase-out - Returns - ------- - c00100: float - Adjusted Gross Income (AGI) - pre_c04600: float - Personal exemption before phase-out - c04600: float - Personal exemptions after phase-out - """ - # calculate AGI assuming no foreign earned income exclusion - c00100 = ymod1 + c02500 - c02900 + taxable_ubi - # calculate personal exemption amount - if II_no_em_nu18: # repeal of personal exemptions for deps. under 18 - pre_c04600 = max(0, XTOT - nu18) * II_em - else: - pre_c04600 = XTOT * II_em - if DSI: - pre_c04600 = 0.0 - # phase-out personal exemption amount - if exact == 1: # exact calculation as on tax forms - line5 = max(0.0, c00100 - II_em_ps[MARS - 1]) - line6 = math.ceil(line5 / (2500.0 / sep)) - line7 = II_prt * line6 - c04600 = max(0.0, pre_c04600 * (1.0 - line7)) - else: # smoothed calculation needed for sensible mtr calculation - dispc_numer = II_prt * (c00100 - II_em_ps[MARS - 1]) - dispc_denom = 2500.0 / sep - dispc = min(1.0, max(0.0, dispc_numer / dispc_denom)) - c04600 = pre_c04600 * (1.0 - dispc) - return (c00100, pre_c04600, c04600) - - -def ItemDedCap( - e17500, - e18400, - e18500, - e19200, - e19800, - e20100, - e20400, - g20500, - c00100, - ID_AmountCap_rt, - ID_AmountCap_Switch, - e17500_capped, - e18400_capped, - e18500_capped, - e19200_capped, - e19800_capped, - e20100_capped, - e20400_capped, - g20500_capped, -): - """ - Applies a cap to gross itemized deductions. - - Parameters - ---------- - e17500: float - Itemizable medical and dental expenses - e18400: float - Itemizable state and local income/sales taxes - e18500: float - Itemizable real-estate taxes paid - e19200: float - Itemizable interest paid - e19800: float - Itemizable charitable giving: cash/check contributions - e20100: float - Itemizable charitalb giving: other than cash/check contributions - e20400: float - Itemizable gross (before 10% AGI disregard) casualty or theft loss - g20500: float - Itemizable gross (before 10% AGI disregard) casualty or theft loss - c00100: float - Adjusted gross income (AGI) - ID_AmountCap_rt: float - Ceiling on the gross amount of itemized deductions allowed; decimal fraction of AGI - ID_AmountCap_Switch: list - Deductions subject to the cap on itemized deduction benefits - e17500_capped: float - Schedule A: medical expenses, capped by ItemDedCap as a decimal fraction of AGI - e18400_capped: float - Schedule A: state and local income taxes deductlbe, capped by ItemDedCap as a decimal fraction of AGI - e18500_capped: float - Schedule A: state and local real estate taxes deductible, capped by ItemDedCap as a decimal fraction of AGI - e19200_capped: float - Schedule A: interest deduction deductible, capped by ItemDedCap as decimal fraction of AGI - e19800_capped: float - Schedule A: charity cash contributions deductible, capped by ItemDedCap as a decimal fraction of AGI - e20100_capped: float - Schedule A: charity noncash contributions deductible, capped aby ItemDedCap s a decimal fraction of AGI - e20400_capped: float - Schedule A: gross miscellaneous deductions deductible, capped by ItemDedCap as a decimal fraction of AGI - g20500_capped: float - Schedule A: gross casualty or theft loss deductible, capped aby ItemDedCap s a decimal fraction of AGI - - Returns - ------- - e17500_capped: float - Schedule A: medical expenses, capped by ItemDedCap as a decimal fraction of AGI - e18400_capped: float - Schedule A: state and local income taxes deductlbe, capped by ItemDedCap as a decimal fraction of AGI - e18500_capped: float - Schedule A: state and local real estate taxes deductible, capped by ItemDedCap as a decimal fraction of AGI - e19200_capped: float - Schedule A: interest deduction deductible, capped by ItemDedCap as decimal fraction of AGI - e19800_capped: float - Schedule A: charity cash contributions deductible, capped by ItemDedCap as a decimal fraction of AGI - e20100_capped: float - Schedule A: charity noncash contributions deductible, capped by ItemDedCap as a decimal fraction of AGI - e20400_capped: float - Schedule A: gross miscellaneous deductions deductible, capped by ItemDedCap as a decimal fraction of AGI - g20500_capped: float - Schedule A: gross casualty or theft loss deductible, capped by ItemDedCap as a decimal fraction of AGI - """ - # pylint: disable=too-many-branches - - cap = max(0.0, ID_AmountCap_rt * c00100) - - gross_ded_amt = 0 - if ID_AmountCap_Switch[0]: # medical - gross_ded_amt += e17500 - if ID_AmountCap_Switch[1]: # statelocal - gross_ded_amt += e18400 - if ID_AmountCap_Switch[2]: # realestate - gross_ded_amt += e18500 - if ID_AmountCap_Switch[3]: # casualty - gross_ded_amt += g20500 - if ID_AmountCap_Switch[4]: # misc - gross_ded_amt += e20400 - if ID_AmountCap_Switch[5]: # interest - gross_ded_amt += e19200 - if ID_AmountCap_Switch[6]: # charity - gross_ded_amt += e19800 + e20100 - - overage = max(0.0, gross_ded_amt - cap) - - e17500_capped = e17500 - e18400_capped = e18400 - e18500_capped = e18500 - g20500_capped = g20500 - e20400_capped = e20400 - e19200_capped = e19200 - e19800_capped = e19800 - e20100_capped = e20100 - - if overage > 0.0 and c00100 > 0.0: - if ID_AmountCap_Switch[0]: # medical - e17500_capped -= (e17500 / gross_ded_amt) * overage - if ID_AmountCap_Switch[1]: # statelocal - e18400_capped -= e18400 / (gross_ded_amt) * overage - if ID_AmountCap_Switch[2]: # realestate - e18500_capped -= (e18500 / gross_ded_amt) * overage - if ID_AmountCap_Switch[3]: # casualty - g20500_capped -= (g20500 / gross_ded_amt) * overage - if ID_AmountCap_Switch[4]: # misc - e20400_capped -= (e20400 / gross_ded_amt) * overage - if ID_AmountCap_Switch[5]: # interest - e19200_capped -= (e19200 / gross_ded_amt) * overage - if ID_AmountCap_Switch[6]: # charity - e19800_capped -= (e19800 / gross_ded_amt) * overage - e20100_capped -= (e20100 / gross_ded_amt) * overage - - return ( - e17500_capped, - e18400_capped, - e18500_capped, - g20500_capped, - e20400_capped, - e19200_capped, - e19800_capped, - e20100_capped, - ) - - -def ItemDed( - e17500_capped, - e18400_capped, - e18500_capped, - e19200_capped, - e19800_capped, - e20100_capped, - e20400_capped, - g20500_capped, - MARS, - age_head, - age_spouse, - c00100, - c04470, - c21040, - c21060, - c17000, - c18300, - c19200, - c19700, - c20500, - c20800, - ID_ps, - ID_Medical_frt, - ID_Medical_frt_add4aged, - ID_Medical_hc, - ID_Casualty_frt, - ID_Casualty_hc, - ID_Miscellaneous_frt, - ID_Miscellaneous_hc, - ID_Charity_crt_all, - ID_Charity_crt_noncash, - ID_prt, - ID_crt, - ID_c, - ID_StateLocalTax_hc, - ID_Charity_frt, - ID_Charity_hc, - ID_InterestPaid_hc, - ID_RealEstate_hc, - ID_Medical_c, - ID_StateLocalTax_c, - ID_RealEstate_c, - ID_InterestPaid_c, - ID_Charity_c, - ID_Casualty_c, - ID_Miscellaneous_c, - ID_AllTaxes_c, - ID_AllTaxes_hc, - ID_StateLocalTax_crt, - ID_RealEstate_crt, - ID_Charity_f, -): - """ - Calculates itemized deductions, Form 1040, Schedule A. - - Parameters - ---------- - e17500_capped: float - Schedule A: medical expenses, capped by ItemDedCap as a decimal fraction of AGI - e18400_capped: float - Schedule A: state and local income taxes deductlbe, capped by ItemDedCap as a decimal fraction of AGI - e18500_capped: float - Schedule A: state and local real estate taxes deductible, capped by ItemDedCap as a decimal fraction of AGI - e19200_capped: float - Schedule A: interest deduction deductible, capped by ItemDedCap as decimal fraction of AGI - e19800_capped: float - Schedule A: charity cash contributions deductible, capped by ItemDedCap as a decimal fraction of AGI - e20100_capped: float - Schedule A: charity noncash contributions deductible, capped by ItemDedCap as a decimal fraction of AGI - e20400_capped: float - Schedule A: gross miscellaneous deductions deductible, capped by ItemDedCap as a decimal fraction of AGI - g20500_capped: float - Schedule A: gross casualty or theft loss deductible, capped by ItemDedCap as a decimal fraction of AGI - MARS: int - Filing marital status (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - age_head: int - Age in years of taxpayer - age_spouse: int - Age in years of spouse - c00100: float - Adjusted gross income (AGI) - c04470: float - Itemized deductions after phase out (0 for non itemizers) - c21040: float - Itemized deductions that are phased out - c21060: float - Itemized deductions before phase out (0 for non itemizers) - c17000: float - Schedule A: medical expenses deducted - c18300: float - Schedule A: state and local taxes plus real estate taxes deducted - c19200: float - Schedule A: interest deducted - c19700: float - Schedule A: charity contributions deducted - c20500: float - Schedule A: net casualty or theft loss deducted - c20800: float - Schedule A: net limited miscellaneous deductions deducted - ID_ps: list - Itemized deduction phaseout AGI start (Pease) - ID_Medical_frt: float - Floor (as decimal fraction of AGI) for deductible medical expenses - ID_Medical_frt_add4aged: float - Add on floor (as decimal fraction of AGI) for deductible medical expenses for elderly filing units - ID_Medical_hc: float - Medical expense deduction haircut - ID_Casualty_frt: float - Floor (as decimal fraction of AGI) for deductible casualty loss - ID_Casualty_hc: float - Casualty expense deduction haircut - ID_Miscellaneous_frt: float - Floor (as decimal fraction of AGI) for deductible miscellaneous expenses - ID_Miscellaneous_hc: float - Miscellaneous expense deduction haircut - ID_Charity_crt_all: float - Ceiling (as decimal fraction of AGI) for all charitable contribution deductions - ID_Charity_crt_noncash: float - Ceiling (as decimal fraction of AGI) for noncash charitable contribution deductions - ID_prt: float - Itemized deduction phaseout rate (Pease) - ID_crt: float - Itemized deduction maximum phaseout as a decimal fraction of total itemized deductions (Pease) - ID_c: list - Ceiling on the amount of itemized deductions allowed (dollars) - ID_StateLocalTax_hc: float - State and local income and sales taxes deduction haircut - ID_Charity_frt: float - Floor (as decimal fraction of AGI) for deductible charitable contributions - ID_Charity_hc: float - Charity expense deduction haircut - ID_InterestPaid_hc: float - Interest paid deduction haircut - ID_RealEstate_hc: float - State, local, and foreign real estate taxes deductions haircut - ID_Medical_c: list - Ceiling on the amount of medical expense deduction allowed (dollars) - ID_StateLocalTax_c: list - Ceiling on the amount of state and local income and sales taxes deduction allowed (dollars) - ID_RealEstate_c: list - Ceiling on the amount of state, local, and foreign real estate taxes deduction allowed (dollars) - ID_InterestPaid_c: list - Ceiling on the amount of interest paid deduction allowed (dollars) - ID_Charity_c: list - Ceiling on the amount of charity expense deduction allowed (dollars) - ID_Casualty_c: list - Ceiling on the amount of casualty expense deduction allowed (dollars) - ID_Miscellaneous_c: list - Ceiling on the amount of miscellaneous expense deduction allowed (dollars) - ID_AllTaxes_c: list - Ceiling on the amount of state and local income, stales, and real estate deductions allowed (dollars) - ID_AllTaxes_hc: float - State and local income, sales, and real estate tax deduciton haircut - ID_StateLocalTax_crt: float - Ceiling (as decimal fraction of AGI) for the combination of all state and local income and sales tax deductions - ID_RealEstate_crt: float - Ceiling (as decimal fraction of AGI) for the combination of all state, local, and foreign real estate tax deductions - ID_Charity_f: list - Floor on the amount of charity expense deduction allowed (dollars) - - Returns - ------- - c17000: float - Schedule A: medical expenses deducted - c18300: float - Schedule A: state and local taxes plus real estate taxes deducted - c19200: float - Schedule A: interest deducted - c19700: float - Schedule A: charity contributions deducted - c20500: float - Schedule A: net casualty or theft loss deducted - c20800: float - Schedule A: net limited miscellaneous deductions deducted - c21040: float - Itemized deductions that are phased out - c21060: float - Itemized deductions before phase out (0 for non itemizers) - c04470: float - Itemized deductions after phase out (0 for non itemizers) - """ - posagi = max(c00100, 0.0) - # Medical - medical_frt = ID_Medical_frt - if age_head >= 65 or (MARS == 2 and age_spouse >= 65): - medical_frt += ID_Medical_frt_add4aged - c17750 = medical_frt * posagi - c17000 = max(0.0, e17500_capped - c17750) * (1.0 - ID_Medical_hc) - c17000 = min(c17000, ID_Medical_c[MARS - 1]) - # State and local taxes - c18400 = min( - (1.0 - ID_StateLocalTax_hc) * max(e18400_capped, 0.0), - ID_StateLocalTax_c[MARS - 1], - ) - c18500 = min( - (1.0 - ID_RealEstate_hc) * e18500_capped, ID_RealEstate_c[MARS - 1] - ) - # following two statements implement a cap on c18400 and c18500 in a way - # that those with negative AGI, c00100, are not capped under current law, - # hence the 0.0001 rather than zero - c18400 = min(c18400, ID_StateLocalTax_crt * max(c00100, 0.0001)) - c18500 = min(c18500, ID_RealEstate_crt * max(c00100, 0.0001)) - c18300 = (c18400 + c18500) * (1.0 - ID_AllTaxes_hc) - c18300 = min(c18300, ID_AllTaxes_c[MARS - 1]) - # Interest paid - c19200 = e19200_capped * (1.0 - ID_InterestPaid_hc) - c19200 = min(c19200, ID_InterestPaid_c[MARS - 1]) - # Charity - lim30 = min(ID_Charity_crt_noncash * posagi, e20100_capped) - c19700 = min(ID_Charity_crt_all * posagi, lim30 + e19800_capped) - # charity floor is zero in present law - charity_floor = max(ID_Charity_frt * posagi, ID_Charity_f[MARS - 1]) - c19700 = max(0.0, c19700 - charity_floor) * (1.0 - ID_Charity_hc) - c19700 = min(c19700, ID_Charity_c[MARS - 1]) - # Casualty - c20500 = max(0.0, g20500_capped - ID_Casualty_frt * posagi) * ( - 1.0 - ID_Casualty_hc - ) - c20500 = min(c20500, ID_Casualty_c[MARS - 1]) - # Miscellaneous - c20400 = e20400_capped - c20750 = ID_Miscellaneous_frt * posagi - c20800 = max(0.0, c20400 - c20750) * (1.0 - ID_Miscellaneous_hc) - c20800 = min(c20800, ID_Miscellaneous_c[MARS - 1]) - # Gross total itemized deductions - c21060 = c17000 + c18300 + c19200 + c19700 + c20500 + c20800 - # Limitations on total itemized deductions - # (no attempt to adjust c04470 components for limitations) - nonlimited = c17000 + c20500 - limitstart = ID_ps[MARS - 1] - if c21060 > nonlimited and c00100 > limitstart: - dedmin = ID_crt * (c21060 - nonlimited) - dedpho = ID_prt * max(0.0, posagi - limitstart) - c21040 = min(dedmin, dedpho) - c04470 = c21060 - c21040 - else: - c21040 = 0.0 - c04470 = c21060 - c04470 = min(c04470, ID_c[MARS - 1]) - # Return total itemized deduction amounts and components - return ( - c17000, - c18300, - c19200, - c19700, - c20500, - c20800, - c21040, - c21060, - c04470, - ) - - -def AdditionalMedicareTax( - e00200, - MARS, - AMEDT_ec, - sey, - AMEDT_rt, - FICA_mc_trt, - FICA_ss_trt, - ptax_amc, - payrolltax, -): - """ - Computes Additional Medicare Tax (Form 8959) included in payroll taxes. - - Parameters - ----- - MARS: int - Filing marital status (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - AMEDT_ec: list - Additional Medicare Tax earnings exclusion - AMEDT_rt: float - Additional Medicare Tax rate - FICA_ss_trt: float - FICA Social Security tax rate - FICA_mc_trt: float - FICA Medicare tax rate - e00200: float - Wages and salaries - sey: float - Self-employment income - ptax_amc: float - Additional Medicare Tax - payrolltax: float - payroll tax augmented by Additional Medicare Tax - - Returns - ------- - ptax_amc: float - Additional Medicare Tax - payrolltax: float - payroll tax augmented by Additional Medicare Tax - """ - line8 = max(0.0, sey) * (1.0 - 0.5 * (FICA_mc_trt + FICA_ss_trt)) - line11 = max(0.0, AMEDT_ec[MARS - 1] - e00200) - ptax_amc = AMEDT_rt * ( - max(0.0, e00200 - AMEDT_ec[MARS - 1]) + max(0.0, line8 - line11) - ) - payrolltax += ptax_amc - return (ptax_amc, payrolltax) - - -def StdDed( - DSI, - earned, - STD, - age_head, - age_spouse, - STD_Aged, - STD_Dep, - MARS, - MIDR, - blind_head, - blind_spouse, - standard, - c19700, - STD_allow_charity_ded_nonitemizers, - STD_charity_ded_nonitemizers_max, -): - """ - Calculates standard deduction, including standard deduction for - dependents, aged and bind. - - Parameters - ----- - DSI: int - 1 if claimed as dependent on another return; otherwise 0 - earned: float - Earned income for filing unit - STD: list - Standard deduction amount - age_head: int - Age in years of taxpayer - age_spouse: int - Age in years of spouse - STD_Aged: list - Additional standard deduction for blind and aged - STD_Dep: float - Standard deduction for dependents - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - MIDR: int - 1 if separately filing spouse itemizes, 0 otherwise - blind_head: int - 1 if taxpayer is blind, 0 otherwise - blind_spouse: int - 1 if spouse is blind, 0 otherwise - standard: float - Standard deduction (zero for itemizers) - c19700: float - Schedule A: charity contributions deducted - STD_allow_charity_ded_nonitemizers: bool - Allow standard deduction filers to take the charitable contributions deduction - STD_charity_ded_nonitemizers_max: float - Ceiling amount (in dollars) for charitable deductions for non-itemizers - - Returns - ------- - standard: float - Standard deduction (zero for itemizers) - """ - # calculate deduction for dependents - if DSI == 1: - c15100 = max(350.0 + earned, STD_Dep) - basic_stded = min(STD[MARS - 1], c15100) - else: - c15100 = 0.0 - if MIDR == 1: - basic_stded = 0.0 - else: - basic_stded = STD[MARS - 1] - # calculate extra standard deduction for aged and blind - num_extra_stded = blind_head + blind_spouse - if age_head >= 65: - num_extra_stded += 1 - if MARS == 2 and age_spouse >= 65: - num_extra_stded += 1 - extra_stded = num_extra_stded * STD_Aged[MARS - 1] - # calculate the total standard deduction - standard = basic_stded + extra_stded - if MARS == 3 and MIDR == 1: - standard = 0.0 - if STD_allow_charity_ded_nonitemizers: - standard += min(c19700, STD_charity_ded_nonitemizers_max) - return standard - - -def TaxInc( - c00100, - standard, - c04470, - c04600, - MARS, - e00900, - e26270, - e02100, - e27200, - e00650, - c01000, - e02300, - PT_SSTB_income, - PT_binc_w2_wages, - PT_ubia_property, - PT_qbid_rt, - PT_qbid_taxinc_thd, - PT_qbid_taxinc_gap, - PT_qbid_w2_wages_rt, - PT_qbid_alt_w2_wages_rt, - PT_qbid_alt_property_rt, - c04800, - PT_qbid_ps, - PT_qbid_prt, - qbided, - PT_qbid_limit_switch, - UI_em, - UI_thd, -): - """ - Calculates taxable income, c04800, and - qualified business income deduction, qbided. - - Parameters - ---------- - c00100: float - Adjusted Gross Income (AGI) - standard: float - Standard deduction (zero for itemizers) - c04470: float - Itemized deductions after phase-out (zero for non-itemizers) - c04600: float - Personal exemptions after phase-out - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - e00900: float - Schedule C business net profit/loss for filing unit - e26270: float - Schedule E: combined partnership and S-corporation net income/loss - e02100: float - Farm net income/loss for filing unit from Schedule F - e27200: float - Schedule E: farm rent net income or loss - e00650: float - Qualified dividends included in ordinary dividends - c01000: float - Limitation on capital losses - PT_SSTB_income: int - Value of one implies business income is from a specified service trade or business (SSTB) - Value of zero implies business income is from a qualified trade or business - PT_binc_w2_wages: float - Filing unit's share of total W-2 wages paid by the pass-through business - PT_ubia_property: float - Filing unit's share of total business property owned by the pass-through business - PT_qbid_rt: float - Pass-through qualified business income deduction rate - PT_qbid_taxinc_thd: list - Lower threshold of pre-QBID taxable income - PT_qbid_taxinc_gap: list - Dollar gap between upper and lower threshold of pre-QBID taxable income - PT_qbid_w2_wages_rt: float - QBID cap rate on pass-through business W-2 wages paid - PT_qbid_alt_w2_wages_rt: float - Alternative QBID cap rate on pass-through business W-2 wages paid - PT_qbid_alt_property_rt: float - Alternative QBID cap rate on pass-through business property owned - c04800: float - Regular taxable income - PT_qbid_ps: list - QBID phaseout taxable income start - PT_qbid_prt: float - QBID phaseout rate - qbided: float - Qualified Business Income (QBI) deduction - PT_qbid_limit_switch: bool - QBID wage and capital limitations switch - - Returns - ------- - c04800: float - Regular taxable income - qbided: float - Qualified Business Income (QBI) deduction - """ - # calculate UI excluded from taxable income - if (c00100 - e02300) <= UI_thd[MARS - 1]: - ui_excluded = min(e02300, UI_em) - else: - ui_excluded = 0.0 - # calculate taxable income before qualified business income deduction - pre_qbid_taxinc = max( - 0.0, c00100 - max(c04470, standard) - c04600 - ui_excluded - ) - # calculate qualified business income deduction - qbided = 0.0 - qbinc = max(0.0, e00900 + e26270 + e02100 + e27200) - if qbinc > 0.0 and PT_qbid_rt > 0.0: - qbid_before_limits = qbinc * PT_qbid_rt - lower_thd = PT_qbid_taxinc_thd[MARS - 1] - if pre_qbid_taxinc <= lower_thd: - qbided = qbid_before_limits - else: - pre_qbid_taxinc_gap = PT_qbid_taxinc_gap[MARS - 1] - upper_thd = lower_thd + pre_qbid_taxinc_gap - if PT_SSTB_income == 1 and pre_qbid_taxinc >= upper_thd: - qbided = 0.0 - # if PT_qbid_limit_switch is True, apply wage/capital - # limitations. - elif PT_qbid_limit_switch: - wage_cap = PT_binc_w2_wages * PT_qbid_w2_wages_rt - alt_cap = ( - PT_binc_w2_wages * PT_qbid_alt_w2_wages_rt - + PT_ubia_property * PT_qbid_alt_property_rt - ) - full_cap = max(wage_cap, alt_cap) - if PT_SSTB_income == 0 and pre_qbid_taxinc >= upper_thd: - # apply full cap - qbided = min(full_cap, qbid_before_limits) - elif PT_SSTB_income == 0 and pre_qbid_taxinc < upper_thd: - # apply adjusted cap as in Part III of Worksheet 12-A - # in 2018 IRS Publication 535 (Chapter 12) - prt = (pre_qbid_taxinc - lower_thd) / pre_qbid_taxinc_gap - adj = prt * (qbid_before_limits - full_cap) - qbided = qbid_before_limits - adj - else: # PT_SSTB_income == 1 and pre_qbid_taxinc < upper_thd - prti = (upper_thd - pre_qbid_taxinc) / pre_qbid_taxinc_gap - qbid_adjusted = prti * qbid_before_limits - cap_adjusted = prti * full_cap - prt = (pre_qbid_taxinc - lower_thd) / pre_qbid_taxinc_gap - adj = prt * (qbid_adjusted - cap_adjusted) - qbided = qbid_adjusted - adj - # if PT_qbid_limit_switch is False, assume all taxpayers - # have sufficient wage expenses and capital income to avoid - # QBID limitations. - else: - qbided = qbid_before_limits - # apply taxinc cap (assuning cap rate is equal to PT_qbid_rt) - net_cg = e00650 + c01000 # per line 34 in 2018 Pub 535 Worksheet 12-A - taxinc_cap = PT_qbid_rt * max(0.0, pre_qbid_taxinc - net_cg) - qbided = min(qbided, taxinc_cap) - - # apply qbid phaseout - if qbided > 0.0 and pre_qbid_taxinc > PT_qbid_ps[MARS - 1]: - excess = pre_qbid_taxinc - PT_qbid_ps[MARS - 1] - qbided = max(0.0, qbided - PT_qbid_prt * excess) - - # calculate taxable income after qualified business income deduction - c04800 = max(0.0, pre_qbid_taxinc - qbided) - return (c04800, qbided) - - -@JIT(nopython=True) -def SchXYZ( - taxable_income, - MARS, - e00900, - e26270, - e02000, - e00200, - PT_rt1, - PT_rt2, - PT_rt3, - PT_rt4, - PT_rt5, - PT_rt6, - PT_rt7, - PT_rt8, - PT_brk1, - PT_brk2, - PT_brk3, - PT_brk4, - PT_brk5, - PT_brk6, - PT_brk7, - II_rt1, - II_rt2, - II_rt3, - II_rt4, - II_rt5, - II_rt6, - II_rt7, - II_rt8, - II_brk1, - II_brk2, - II_brk3, - II_brk4, - II_brk5, - II_brk6, - II_brk7, - PT_EligibleRate_active, - PT_EligibleRate_passive, - PT_wages_active_income, - PT_top_stacking, -): - """ - Returns Schedule X, Y, Z tax amount for specified taxable_income. - - Parameters - ---------- - taxable_income: float - Taxable income - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - e00900: float - Schedule C business net profit/loss for filing unit - e26270: float - Schedule E: combined partnership and S-corporation net income/loss - e02000: float - Schedule E total rental, royalty, parternship, S-corporation, etc, income/loss - e00200: float - Wages, salaries, and tips for filing unit net of pension contributions - PT_rt1: float - Pass through income tax rate 1 - PT_rt2: float - Pass through income tax rate 2 - PT_rt3: float - Pass through income tax rate 3 - PT_rt4: float - Pass through income tax rate 4 - PT_rt5: float - Pass through income tax rate 5 - PT_rt6: float - Pass through income tax rate 6 - PT_rt7: float - Pass through income tax rate 7 - PT_rt8: float - Pass through income tax rate 8 - PT_brk1: list - Pass through income tax bracket (upper threshold) 1 - PT_brk2: list - Pass through income tax bracket (upper threshold) 2 - PT_brk3: list - Pass through income tax bracket (upper threshold) 3 - PT_brk4: list - Pass through income tax bracket (upper threshold) 4 - PT_brk5: list - Pass through income tax bracket (upper threshold) 5 - PT_brk6: list - Pass through income tax bracket (upper threshold) 6 - PT_brk7: list - Pass through income tax bracket (upper threshold) 7 - II_rt1: float - Personal income (regular/non-AMT/non-pass-through) tax rate 1 - II_rt2: float - Personal income (regular/non-AMT/non-pass-through) tax rate 2 - II_rt3: float - Personal income (regular/non-AMT/non-pass-through) tax rate 3 - II_rt4: float - Personal income (regular/non-AMT/non-pass-through) tax rate 4 - II_rt5: float - Personal income (regular/non-AMT/non-pass-through) tax rate 5 - II_rt6: float - Personal income (regular/non-AMT/non-pass-through) tax rate 6 - II_rt7: float - Personal income (regular/non-AMT/non-pass-through) tax rate 7 - II_rt8: float - Personal income (regular/non-AMT/non-pass-through) tax rate 8 - II_brk1: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 1 - II_brk2: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 2 - II_brk3: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 3 - II_brk4: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 4 - II_brk5: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 5 - II_brk6: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 6 - II_brk7: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 7 - PT_EligibleRate_active: float - Share of active business income eligible for PT rate schedule - PT_EligibleRate_passive: float - Share of passive business income eligible for PT rate schedule - PT_wages_active_income: bool - Wages included in (positive) active business eligible for PT rates - PT_top_stacking: bool - PT taxable income stacked on top of regular taxable income - - Returns - ------- - reg_tax: float - Individual income tax liability on non-pass-through income - pt_tax: float - Individual income tax liability from pass-through income - """ - # separate non-negative taxable income into two non-negative components, - # doing this in a way so that the components add up to taxable income - # define pass-through income eligible for PT schedule - pt_passive = PT_EligibleRate_passive * (e02000 - e26270) - pt_active_gross = e00900 + e26270 - if (pt_active_gross > 0) and PT_wages_active_income: - pt_active_gross = pt_active_gross + e00200 - pt_active = PT_EligibleRate_active * pt_active_gross - pt_active = min(pt_active, e00900 + e26270) - pt_taxinc = max(0.0, pt_passive + pt_active) - if pt_taxinc >= taxable_income: - pt_taxinc = taxable_income - reg_taxinc = 0.0 - else: - # pt_taxinc is unchanged - reg_taxinc = taxable_income - pt_taxinc - # determine stacking order - if PT_top_stacking: - reg_tbase = 0.0 - pt_tbase = reg_taxinc - else: - reg_tbase = pt_taxinc - pt_tbase = 0.0 - # compute Schedule X,Y,Z tax using the two components of taxable income - if reg_taxinc > 0.0: - reg_tax = Taxes( - reg_taxinc, - MARS, - reg_tbase, - II_rt1, - II_rt2, - II_rt3, - II_rt4, - II_rt5, - II_rt6, - II_rt7, - II_rt8, - II_brk1, - II_brk2, - II_brk3, - II_brk4, - II_brk5, - II_brk6, - II_brk7, - ) - else: - reg_tax = 0.0 - if pt_taxinc > 0.0: - pt_tax = Taxes( - pt_taxinc, - MARS, - pt_tbase, - PT_rt1, - PT_rt2, - PT_rt3, - PT_rt4, - PT_rt5, - PT_rt6, - PT_rt7, - PT_rt8, - PT_brk1, - PT_brk2, - PT_brk3, - PT_brk4, - PT_brk5, - PT_brk6, - PT_brk7, - ) - else: - pt_tax = 0.0 - return reg_tax + pt_tax - - -def SchXYZTax( - c04800, - MARS, - e00900, - e26270, - e02000, - e00200, - PT_rt1, - PT_rt2, - PT_rt3, - PT_rt4, - PT_rt5, - PT_rt6, - PT_rt7, - PT_rt8, - PT_brk1, - PT_brk2, - PT_brk3, - PT_brk4, - PT_brk5, - PT_brk6, - PT_brk7, - II_rt1, - II_rt2, - II_rt3, - II_rt4, - II_rt5, - II_rt6, - II_rt7, - II_rt8, - II_brk1, - II_brk2, - II_brk3, - II_brk4, - II_brk5, - II_brk6, - II_brk7, - PT_EligibleRate_active, - PT_EligibleRate_passive, - PT_wages_active_income, - PT_top_stacking, - c05200, -): - """ - SchXYZTax calls SchXYZ function and sets c05200 to returned amount. - - Parameters - ---------- - c04800: float - Regular taxable income - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - e00900: float - Schedule C business net profit/loss for filing unit - e26270: float - Schedule E: combined partnership and S-corporation net income/loss - e02000: float - Farm net income/loss for filing unit from Schedule F - e00200: float - Farm net income/loss for filing unit from Schedule F - PT_rt1: float - Pass through income tax rate 1 - PT_rt2: float - Pass through income tax rate 2 - PT_rt3: float - Pass through income tax rate 3 - PT_rt4: float - Pass through income tax rate 4 - PT_rt5: float - Pass through income tax rate 5 - PT_rt6: float - Pass through income tax rate 6 - PT_rt7: float - Pass through income tax rate 7 - PT_rt8: float - Pass through income tax rate 8 - PT_brk1: list - Pass through income tax bracket (upper threshold) 1 - PT_brk2: list - Pass through income tax bracket (upper threshold) 2 - PT_brk3: list - Pass through income tax bracket (upper threshold) 3 - PT_brk4: list - Pass through income tax bracket (upper threshold) 4 - PT_brk5: list - Pass through income tax bracket (upper threshold) 5 - PT_brk6: list - Pass through income tax bracket (upper threshold) 6 - PT_brk7: list - Pass through income tax bracket (upper threshold) 7 - II_rt1: float - Personal income (regular/non-AMT/non-pass-through) tax rate 1 - II_rt2: float - Personal income (regular/non-AMT/non-pass-through) tax rate 2 - II_rt3: float - Personal income (regular/non-AMT/non-pass-through) tax rate 3 - II_rt4: float - Personal income (regular/non-AMT/non-pass-through) tax rate 4 - II_rt5: float - Personal income (regular/non-AMT/non-pass-through) tax rate 5 - II_rt6: float - Personal income (regular/non-AMT/non-pass-through) tax rate 6 - II_rt7: float - Personal income (regular/non-AMT/non-pass-through) tax rate 7 - II_rt8: float - Personal income (regular/non-AMT/non-pass-through) tax rate 8 - II_brk1: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 1 - II_brk2: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 2 - II_brk3: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 3 - II_brk4: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 4 - II_brk5: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 5 - II_brk6: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 6 - II_brk7: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 7 - PT_EligibleRate_active: float - Share of active business income eligible for PT rate schedule - PT_EligibleRate_passive: float - Share of passive business income eligible for PT rate schedule - PT_wages_active_income: bool - Wages included in (positive) active business eligible for PT rates - PT_top_stacking: bool - PT taxable income stacked on top of regular taxable income - c05200: float - Tax amount from Schedule X,Y,Z tables - - Returns - ------- - c05200: float - Tax aount from Schedule X, Y, Z tables - """ - c05200 = SchXYZ( - c04800, - MARS, - e00900, - e26270, - e02000, - e00200, - PT_rt1, - PT_rt2, - PT_rt3, - PT_rt4, - PT_rt5, - PT_rt6, - PT_rt7, - PT_rt8, - PT_brk1, - PT_brk2, - PT_brk3, - PT_brk4, - PT_brk5, - PT_brk6, - PT_brk7, - II_rt1, - II_rt2, - II_rt3, - II_rt4, - II_rt5, - II_rt6, - II_rt7, - II_rt8, - II_brk1, - II_brk2, - II_brk3, - II_brk4, - II_brk5, - II_brk6, - II_brk7, - PT_EligibleRate_active, - PT_EligibleRate_passive, - PT_wages_active_income, - PT_top_stacking, - ) - return c05200 - - -def GainsTax( - e00650, - c01000, - c23650, - p23250, - e01100, - e58990, - e00200, - e24515, - e24518, - MARS, - c04800, - c05200, - e00900, - e26270, - e02000, - II_rt1, - II_rt2, - II_rt3, - II_rt4, - II_rt5, - II_rt6, - II_rt7, - II_rt8, - II_brk1, - II_brk2, - II_brk3, - II_brk4, - II_brk5, - II_brk6, - II_brk7, - PT_rt1, - PT_rt2, - PT_rt3, - PT_rt4, - PT_rt5, - PT_rt6, - PT_rt7, - PT_rt8, - PT_brk1, - PT_brk2, - PT_brk3, - PT_brk4, - PT_brk5, - PT_brk6, - PT_brk7, - CG_nodiff, - PT_EligibleRate_active, - PT_EligibleRate_passive, - PT_wages_active_income, - PT_top_stacking, - CG_rt1, - CG_rt2, - CG_rt3, - CG_rt4, - CG_brk1, - CG_brk2, - CG_brk3, - dwks10, - dwks13, - dwks14, - dwks19, - c05700, - taxbc, -): - """ - GainsTax function implements (2015) Schedule D Tax Worksheet logic for - the special taxation of long-term capital gains and qualified dividends - if CG_nodiff is false. - - Parameters - ---------- - e00650: float - Qualified dividends included in ordinary dividends - c01000: float - Limitation on capital losses - c23650: float - Net capital gain (long term + short term) before exclusion - p23250: float - Schedule D: net long-term capital gains/losses - e01100: float - Capital gains distributions not reported on Schedule D - e58990: float - Investment income elected amount from Form 4952 - e00200: float - Wages, salaries, and tips for filing unit net of pension contributions - e24515: float - Schedule D: un-recaptured section 1250 Gain - e24518: float - Schedule D: 28% rate gain or loss - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - c04800: float - Regular taxable income - c05200: float - Tax amount from Schedule X,Y,Z tables - e00900: float - Schedule C business net profit/loss for filing unit - e26270: float - Schedule E: combined partnership and S-corporation net income/loss - e02000: float - Schedule E total rental, royalty, partnership, S-corporation, etc, income/loss - II_rt1: float - Personal income (regular/non-AMT/non-pass-through) tax rate 1 - II_rt2: float - Personal income (regular/non-AMT/non-pass-through) tax rate 2 - II_rt3: float - Personal income (regular/non-AMT/non-pass-through) tax rate 3 - II_rt4: float - Personal income (regular/non-AMT/non-pass-through) tax rate 4 - II_rt5: float - Personal income (regular/non-AMT/non-pass-through) tax rate 5 - II_rt6: float - Personal income (regular/non-AMT/non-pass-through) tax rate 6 - II_rt7: float - Personal income (regular/non-AMT/non-pass-through) tax rate 7 - II_rt8: float - Personal income (regular/non-AMT/non-pass-through) tax rate 8 - II_brk1: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 1 - II_brk2: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 2 - II_brk3: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 3 - II_brk4: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 4 - II_brk5: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 5 - II_brk6: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 6 - II_brk7: list - Personal income (regular/non-AMT/non-pass/through) tax bracket (upper threshold) 7 - PT_rt1: float - Pass through income tax rate 1 - PT_rt2: float - Pass through income tax rate 2 - PT_rt3: float - Pass through income tax rate 3 - PT_rt4: float - Pass through income tax rate 4 - PT_rt5: float - Pass through income tax rate 5 - PT_rt6: float - Pass through income tax rate 6 - PT_rt7: float - Pass through income tax rate 7 - PT_rt8: float - Pass through income tax rate 8 - PT_brk1: list - Pass through income tax bracket (upper threshold) 1 - PT_brk2: list - Pass through income tax bracket (upper threshold) 2 - PT_brk3: list - Pass through income tax bracket (upper threshold) 3 - PT_brk4: list - Pass through income tax bracket (upper threshold) 4 - PT_brk5: list - Pass through income tax bracket (upper threshold) 5 - PT_brk6: list - Pass through income tax bracket (upper threshold) 6 - PT_brk7: list - Pass through income tax bracket (upper threshold) 7 - CG_nodiff: bool - Long term capital gains and qualified dividends taxed no differently than regular taxable income - PT_EligibleRate_active: float - Share of active business income eligible for PT rate schedule - PT_EligibleRate_passive: float - Share of passive business income eligible for PT rate schedule - PT_wages_active_income: bool - Wages included in (positive) active business eligible for PT rates - PT_top_stacking: bool - PT taxable income stacked on top of regular taxable income - CG_rt1: float - Long term capital gain and qualified dividends (regular/non-AMT) rate 1 - CG_rt2: float - Long term capital gain and qualified dividends (regular/non-AMT) rate 2 - CG_rt3: float - Long term capital gain and qualified dividends (regular/non-AMT) rate 3 - CG_rt4: float - Long term capital gain and qualified dividends (regular/non-AMT) rate 4 - CG_brk1: list - Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 1 - CG_brk2: list - Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 2 - CG_brk3: list - Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 3 - dwks10: float - Sum of dwks6 + dwks9 - dwks13: float - Difference of dwks10 - dwks12 - dwks14: float - Maximum of 0 and dwks1 - dwks13 - dwks19: float - Maximum of dwks17 and dwks16 - c05700: float - Lump sum distributions - taxbc: float - Regular tax on regular taxable income before credits - - Returns - ------- - dwks10: float - Sum of dwks6 + dwks9 - dwks13: float - Difference of dwks10 - dwks12 - dwks14: float - Maximum of 0 and dwks1 - dwks13 - dwks19: float - Maximum of dwks17 and dwks16 - c05700: float - Lump sum distributions - taxbc: float - Regular tax on regular taxable income before credits - """ - # pylint: disable=too-many-statements - if ( - c01000 > 0.0 - or c23650 > 0.0 - or p23250 > 0.0 - or e01100 > 0.0 - or e00650 > 0.0 - ): - hasqdivltcg = 1 # has qualified dividends or long-term capital gains - else: - hasqdivltcg = 0 # no qualified dividends or long-term capital gains - - if CG_nodiff: - hasqdivltcg = 0 # no special taxation of qual divids and l-t cap gains - - if hasqdivltcg == 1: - dwks1 = c04800 - dwks2 = e00650 - dwks3 = e58990 - dwks4 = 0.0 # always assumed to be zero - dwks5 = max(0.0, dwks3 - dwks4) - dwks6 = max(0.0, dwks2 - dwks5) - dwks7 = min(p23250, c23650) # SchD lines 15 and 16, respectively - # dwks8 = min(dwks3, dwks4) - # dwks9 = max(0., dwks7 - dwks8) - # BELOW TWO STATEMENTS ARE UNCLEAR IN LIGHT OF dwks9=... COMMENT - if e01100 > 0.0: - c24510 = e01100 - else: - c24510 = max(0.0, dwks7) + e01100 - dwks9 = max(0.0, c24510 - min(0.0, e58990)) - # ABOVE TWO STATEMENTS ARE UNCLEAR IN LIGHT OF dwks9=... COMMENT - dwks10 = dwks6 + dwks9 - dwks11 = e24515 + e24518 # SchD lines 18 and 19, respectively - dwks12 = min(dwks9, dwks11) - dwks13 = dwks10 - dwks12 - dwks14 = max(0.0, dwks1 - dwks13) - dwks16 = min(CG_brk1[MARS - 1], dwks1) - dwks17 = min(dwks14, dwks16) - dwks18 = max(0.0, dwks1 - dwks10) - dwks19 = max(dwks17, dwks18) - dwks20 = dwks16 - dwks17 - lowest_rate_tax = CG_rt1 * dwks20 - # break in worksheet lines - dwks21 = min(dwks1, dwks13) - dwks22 = dwks20 - dwks23 = max(0.0, dwks21 - dwks22) - dwks25 = min(CG_brk2[MARS - 1], dwks1) - dwks26 = dwks19 + dwks20 - dwks27 = max(0.0, dwks25 - dwks26) - dwks28 = min(dwks23, dwks27) - dwks29 = CG_rt2 * dwks28 - dwks30 = dwks22 + dwks28 - dwks31 = dwks21 - dwks30 - dwks32 = CG_rt3 * dwks31 - # compute total taxable CG for additional top bracket - cg_all = dwks20 + dwks28 + dwks31 - hi_base = max(0.0, cg_all - CG_brk3[MARS - 1]) - hi_incremental_rate = CG_rt4 - CG_rt3 - highest_rate_incremental_tax = hi_incremental_rate * hi_base - # break in worksheet lines - dwks33 = min(dwks9, e24515) - dwks34 = dwks10 + dwks19 - dwks36 = max(0.0, dwks34 - dwks1) - dwks37 = max(0.0, dwks33 - dwks36) - dwks38 = 0.25 * dwks37 - # break in worksheet lines - dwks39 = dwks19 + dwks20 + dwks28 + dwks31 + dwks37 - dwks40 = dwks1 - dwks39 - dwks41 = 0.28 * dwks40 - dwks42 = SchXYZ( - dwks19, - MARS, - e00900, - e26270, - e02000, - e00200, - PT_rt1, - PT_rt2, - PT_rt3, - PT_rt4, - PT_rt5, - PT_rt6, - PT_rt7, - PT_rt8, - PT_brk1, - PT_brk2, - PT_brk3, - PT_brk4, - PT_brk5, - PT_brk6, - PT_brk7, - II_rt1, - II_rt2, - II_rt3, - II_rt4, - II_rt5, - II_rt6, - II_rt7, - II_rt8, - II_brk1, - II_brk2, - II_brk3, - II_brk4, - II_brk5, - II_brk6, - II_brk7, - PT_EligibleRate_active, - PT_EligibleRate_passive, - PT_wages_active_income, - PT_top_stacking, - ) - dwks43 = ( - dwks29 - + dwks32 - + dwks38 - + dwks41 - + dwks42 - + lowest_rate_tax - + highest_rate_incremental_tax - ) - dwks44 = c05200 - dwks45 = min(dwks43, dwks44) - c24580 = dwks45 - - else: # if hasqdivltcg is zero - c24580 = c05200 - dwks10 = max(0.0, min(p23250, c23650)) + e01100 - dwks13 = 0.0 - dwks14 = 0.0 - dwks19 = 0.0 - - # final calculations done no matter what the value of hasqdivltcg - c05100 = c24580 # because foreign earned income exclusion is assumed zero - c05700 = 0.0 # no Form 4972, Lump Sum Distributions - taxbc = c05700 + c05100 - return (dwks10, dwks13, dwks14, dwks19, c05700, taxbc) - - -def AGIsurtax(c00100, MARS, AGI_surtax_trt, AGI_surtax_thd, taxbc, surtax): - """ - Computes surtax on AGI above some threshold. - - Parameters - ---------- - c00100: float - Adjusted Gross Income (AGI) - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - AGI_surtax_trt: float - New AGI surtax rate - AGI_surtax_thd: list - Threshold for the new AGI surtax - taxbc: float - Regular tax on regular taxable income before credits - surtax: float - Surtax on AGI above some threshold - - Returns - ------- - taxbc: float - Regular tax on regular taxable income before credits - surtax: float - Surtax on AGI above some threshold - """ - if AGI_surtax_trt > 0.0: - hiAGItax = AGI_surtax_trt * max(c00100 - AGI_surtax_thd[MARS - 1], 0.0) - taxbc += hiAGItax - surtax += hiAGItax - return (taxbc, surtax) - - -def AMT( - e07300, - dwks13, - standard, - f6251, - c00100, - c18300, - taxbc, - c04470, - c17000, - c20800, - c21040, - e24515, - MARS, - sep, - dwks19, - dwks14, - c05700, - e62900, - e00700, - dwks10, - age_head, - age_spouse, - earned, - cmbtp, - AMT_child_em_c_age, - AMT_brk1, - AMT_em, - AMT_prt, - AMT_rt1, - AMT_rt2, - AMT_child_em, - AMT_em_ps, - AMT_em_pe, - AMT_CG_brk1, - AMT_CG_brk2, - AMT_CG_brk3, - AMT_CG_rt1, - AMT_CG_rt2, - AMT_CG_rt3, - AMT_CG_rt4, - c05800, - c09600, - c62100, -): - """ - Computes Alternative Minimum Tax (AMT) taxable income and liability, where - c62100 is AMT taxable income, - c09600 is AMT tax liability, and - c05800 is total (regular + AMT) income tax liability before credits. - - Note that line-number variable names refer to 2015 Form 6251. - - Parameters - ----------- - e07300: float - Foreign tax credit from Form 1116 - dwks13: float - Difference of dwks10 - dwks12 - standard: float - Standard deduction (zero for itemizers) - f6251: int - 1 if Form 6251 (AMT) attached to return, otherwise 0 - c00100: float - Adjusted Gross Income (AGI) - c18300: float - Schedule A: state and local taxes plus real estate taxes deducted - taxbc: float - Regular tax on regular taxable income before credits - c04470: float - Itemized deductions after phase-out (zero for non itemizers) - c17000: float - Schedule A: Medical expenses deducted - c20800: float - Schedule A: net limited miscellaneous deductions deducted - c21040: float - Itemized deductiosn that are phased out - e24515: float - Schedule D: Un-Recaptured Section 1250 Gain - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - sep: int - 2 when MARS is 3 (married filing separately), otherwise 1 - dwks19: float - Maximum of 0 and dwks1 - dwks13 - dwks14: float - Maximum of 0 and dwks1 - dwks13 - c05700: float - Lump sum distributions - e62900: float - Alternative Minimum Tax foreign tax credit from Form 6251 - e00700: float - Schedule C business net profit/loss for filing unit - dwks10: float - Sum of dwks6 + dwks9 - age_head: int - Age in years of taxpayer (i.e. primary adult) - age_spouse: int - Age in years of spouse (i.e. secondary adult if present) - earned: float - Earned income for filing unit - cmbtp: float - Estimate of income on (AMT) Form 6251 but not in AGI - AMT_child_em_c_age: float - Age ceiling for special AMT exemption - AMT_brk1: float - AMT bracket 1 (upper threshold) - AMT_em: list - AMT exemption amount - AMT_prt: float - AMT exemption phaseout rate - AMT_rt1: float - AMT rate 1 - AMT_rt2: float - Additional AMT rate for AMT taxable income about AMT bracket 1 - AMT_child_em: float - Child AMT exemption additional income base - AMT_em_ps: list - AMT exemption phaseout start - AMT_em_pe: float - AMT exemption phaseout ending AMT taxable income for Married Filing Separately - AMT_CG_brk1: list - Top of long-term capital gains and qualified dividends (AMT) tax bracket 1 - AMT_CG_brk2: list - Top of long-term capital gains and qualified dividends (AMT) tax bracket 2 - AMT_CG_brk3: list - Top of long-term capital gains and qualified dividends (AMT) tax bracket 3 - AMT_CG_rt1: float - Long term capital gain and qualified dividends (AMT) rate 1 - AMT_CG_rt2: float - Long term capital gain and qualified dividends (AMT) rate 2 - AMT_CG_rt3: float - Long term capital gain and qualified dividends (AMT) rate 3 - AMT_CG_rt4: float - Long term capital gain and qualified dividends (AMT) rate 4 - c05800: float - Total (regular + AMT) income tax liability before credits - c09600: float - Alternative Minimum Tax (AMT) liability - c62100: float - Alternative Minimum Tax (AMT) - - Returns - ------- - c62100: float - Alternative Minimum Tax (AMT) - c09600: float - Alternative Minimum Tax (AMT) liability - c05800: float - Total (regular + AMT) income tax liability before credits - """ - # pylint: disable=too-many-statements,too-many-branches - # Form 6251, Part I - if standard == 0.0: - c62100 = ( - c00100 - - e00700 - - c04470 - + max(0.0, min(c17000, 0.025 * c00100)) - + c18300 - + c20800 - - c21040 - ) - if standard > 0.0: - c62100 = c00100 - e00700 - c62100 += cmbtp # add income not in AGI but considered income for AMT - if MARS == 3: - amtsepadd = max( - 0.0, min(AMT_em[MARS - 1], AMT_prt * (c62100 - AMT_em_pe)) - ) - else: - amtsepadd = 0.0 - c62100 = c62100 + amtsepadd # AMT taxable income, which is line28 - # Form 6251, Part II top - line29 = max( - 0.0, - AMT_em[MARS - 1] - AMT_prt * max(0.0, c62100 - AMT_em_ps[MARS - 1]), - ) - young_head = age_head != 0 and age_head < AMT_child_em_c_age - no_or_young_spouse = age_spouse < AMT_child_em_c_age - if young_head and no_or_young_spouse: - line29 = min(line29, earned + AMT_child_em) - line30 = max(0.0, c62100 - line29) - line3163 = AMT_rt1 * line30 + AMT_rt2 * max( - 0.0, (line30 - (AMT_brk1 / sep)) - ) - if ( - dwks10 > 0.0 - or dwks13 > 0.0 - or dwks14 > 0.0 - or dwks19 > 0.0 - or e24515 > 0.0 - ): - # complete Form 6251, Part III (line36 is equal to line30) - line37 = dwks13 - line38 = e24515 - line39 = min(line37 + line38, dwks10) - line40 = min(line30, line39) - line41 = max(0.0, line30 - line40) - line42 = AMT_rt1 * line41 + AMT_rt2 * max( - 0.0, (line41 - (AMT_brk1 / sep)) - ) - line44 = dwks14 - line45 = max(0.0, AMT_CG_brk1[MARS - 1] - line44) - line46 = min(line30, line37) - line47 = min(line45, line46) # line47 is amount taxed at AMT_CG_rt1 - cgtax1 = line47 * AMT_CG_rt1 - line48 = line46 - line47 - line51 = dwks19 - line52 = line45 + line51 - line53 = max(0.0, AMT_CG_brk2[MARS - 1] - line52) - line54 = min(line48, line53) # line54 is amount taxed at AMT_CG_rt2 - cgtax2 = line54 * AMT_CG_rt2 - line56 = line47 + line54 # total amount in lower two brackets - if line41 == line56: - line57 = 0.0 # line57 is amount taxed at AMT_CG_rt3 - linex2 = 0.0 # linex2 is amount taxed at AMT_CG_rt4 - else: - line57 = line46 - line56 - linex1 = min( - line48, max(0.0, AMT_CG_brk3[MARS - 1] - line44 - line45) - ) - linex2 = max(0.0, line54 - linex1) - cgtax3 = line57 * AMT_CG_rt3 - cgtax4 = linex2 * AMT_CG_rt4 - if line38 == 0.0: - line61 = 0.0 - else: - line61 = 0.25 * max( - 0.0, line30 - line41 - line56 - line57 - linex2 - ) - line62 = line42 + cgtax1 + cgtax2 + cgtax3 + cgtax4 + line61 - line64 = min(line3163, line62) - line31 = line64 - else: # if not completing Form 6251, Part III - line31 = line3163 - # Form 6251, Part II bottom - if f6251 == 1: - line32 = e62900 - else: - line32 = e07300 - line33 = line31 - line32 - c09600 = max(0.0, line33 - max(0.0, taxbc - e07300 - c05700)) - c05800 = taxbc + c09600 - return (c62100, c09600, c05800) - - -def NetInvIncTax( - e00300, - e00600, - e02000, - e26270, - c01000, - c00100, - NIIT_thd, - MARS, - NIIT_PT_taxed, - NIIT_rt, - niit, -): - """ - Computes Net Investment Income Tax (NIIT) amount assuming that - all annuity income is excluded from net investment income. - - Parameters - ---------- - e00300: float - Tax-exempt interest income - e00600: float - Ordinary dividends included in AGI - e02000: float - Schedule E total rental, royalty, parternship, S-corporation, etc, income/loss - e26270: float - Schedule E: combined partnership and S-corporation net income/loss - c01000: float - Limitation on capital losses - c00100: float - Adjusted Gross Income (AGI) - NIIT_thd: list - Net Investment Income Tax modified AGI threshold - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - NIIT_PT_taxed: bool - Whether or not partnership and S-corp income is NIIT based - NIIT_rt: float - Net Investment Income Tax rate - niit: float - Net investment income tax from Form 8960 - - Returns - ------- - niit: float - Net investment income tax from Form 8960 - """ - modAGI = c00100 # no foreign earned income exclusion to add - if not NIIT_PT_taxed: - NII = max(0.0, e00300 + e00600 + c01000 + e02000 - e26270) - else: # do not subtract e26270 from e02000 - NII = max(0.0, e00300 + e00600 + c01000 + e02000) - niit = NIIT_rt * min(NII, max(0.0, modAGI - NIIT_thd[MARS - 1])) - return niit - - -def F2441( - MARS, - earned_p, - earned_s, - f2441, - CDCC_c, - e32800, - exact, - c00100, - CDCC_ps, - CDCC_ps2, - CDCC_crt, - CDCC_frt, - CDCC_prt, - CDCC_refundable, - c05800, - e07300, - c07180, - CDCC_refund, -): - """ - Calculates Form 2441 child and dependent care expense credit, c07180. - - Parameters - ---------- - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - earned_p: float - Earned income for taxpayer - earned_s: float - Earned income for spouse - f2441: int - Number of child/dependent care qualifying persons - CDCC_c: float - Maximum child/dependent care credit per dependent - e32800: float - Child/dependent care expenses for qualifying persons from Form 2441 - exact: int - Whether or not to do rounding of phaseout fraction - c00100: float - Adjusted Gross Income (AGI) - CDCC_ps: float - Child/dependent care credit phaseout start - CDCC_crt: float - Child/dependent care credit phaseout percentage rate ceiling - c05800: float - Total (regular + AMT) income tax liability before credits - e07300: float - Foreign tax credit from Form 1116 - c07180: float - Credit for child and dependent care expenses from Form 2441 - - Returns - ------- - c07180: float - Credit for child and dependent care expenses from Form 2441 - """ - # credit for at most two cared-for individuals and for actual expenses - max_credit = min(f2441, 2) * CDCC_c - c32800 = max(0.0, min(e32800, max_credit)) - # credit is limited to minimum of individuals' earned income - c32880 = earned_p # earned income of taxpayer - if MARS == 2: - c32890 = earned_s # earned income of spouse when present - else: - c32890 = earned_p - c33000 = max(0.0, min(c32800, min(c32880, c32890))) - # credit is limited by AGI-related fraction - if exact == 1: # exact calculation as on tax forms - # first phase-down from 35 to 20 percent - tratio1 = math.ceil(max(((c00100 - CDCC_ps) * CDCC_prt), 0.0)) - crate = max(CDCC_frt, CDCC_crt - min(CDCC_crt - CDCC_frt, tratio1)) - # second phase-down from 20 percent to zero - if c00100 > CDCC_ps2: - tratio2 = math.ceil(max(((c00100 - CDCC_ps2) * CDCC_prt), 0.0)) - crate = max(0.0, CDCC_frt - min(CDCC_frt, tratio2)) - else: - crate = max( - CDCC_frt, CDCC_crt - max(((c00100 - CDCC_ps) * CDCC_prt), 0.0) - ) - if c00100 > CDCC_ps2: - crate = max( - 0.0, CDCC_frt - max(((c00100 - CDCC_ps2) * CDCC_prt), 0.0) - ) - c33200 = c33000 * 0.01 * crate - # credit is limited by tax liability if not refundable - if CDCC_refundable: - c07180 = 0.0 - CDCC_refund = c33200 - else: - c07180 = min(max(0.0, c05800 - e07300), c33200) - CDCC_refund = 0.0 - return (c07180, CDCC_refund) - - -@JIT(nopython=True) -def EITCamount( - basic_frac, - phasein_rate, - earnings, - max_amount, - phaseout_start, - agi, - phaseout_rate, -): - """ - Returns EITC amount given specified parameters. - English parameter names are used in this function because the - EITC formula is not available on IRS forms or in IRS instructions; - the extensive IRS EITC look-up table does not reveal the formula. - - Parameters - ---------- - basic_frac: list - Fraction of maximum earned income credit paid at zero earnings - phasein_rate: list - Earned income credit phasein rate - earnings: float - Earned income for filing unit - max_amount: list - Maximum earned income credit - phaseout_start: list - Earned income credit phaseout start AGI - agi: float - Adjusted Gross Income (AGI) - phaseout_rate: list - Earned income credit phaseout rate - - Returns - ------- - eitc: float - Earned Income Credit - """ - eitc = min( - ( - basic_frac * max_amount - + (1.0 - basic_frac) * phasein_rate * earnings - ), - max_amount, - ) - if earnings > phaseout_start or agi > phaseout_start: - eitcx = max( - 0.0, - ( - max_amount - - phaseout_rate * max(0.0, max(earnings, agi) - phaseout_start) - ), - ) - eitc = min(eitc, eitcx) - return eitc - - -def EITC( - MARS, - DSI, - EIC, - c00100, - e00300, - e00400, - e00600, - c01000, - e02000, - e26270, - age_head, - age_spouse, - earned, - earned_p, - earned_s, - EITC_ps, - EITC_MinEligAge, - EITC_MaxEligAge, - EITC_ps_MarriedJ, - EITC_rt, - EITC_c, - EITC_prt, - EITC_basic_frac, - EITC_InvestIncome_c, - EITC_excess_InvestIncome_rt, - EITC_indiv, - EITC_sep_filers_elig, - c59660, -): - """ - Computes EITC amount, c59660. - - Parameters - ---------- - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - DSI: int - 1 if claimed as dependent on another return, otherwise 0 - EIC: int - Number of EIC qualifying children - c00100: float - Adjusted Gross Income (AGI) - e00300: float - Taxable interest income - e00400: float - Tax exempt interest income - e00600: float - Ordinary dividends included in AGI - c01000: float - Limitation on capital losses - e02000: float - Schedule E total rental, royalty, partnership, S-corporation, etc, income/loss - e26270: float - Schedule E combined partnership and S-corporation net income/loss - age_head: int - Age in years of taxpayer (primary adult) - age_spouse: int - Age in years of spouse (secondary adult, if present) - earned: float - Earned income for filing unit - earned_p: float - Earned income for taxpayer - earned_s: float - Earned income for spouse - EITC_ps: list - Earned income credit phaseout start AGI - EITC_MinEligAge: int - Minimum age for childless EITC eligibility - EITC_MaxEligAge: int - Maximum age for childless EITC eligibility - EITC_ps_MarriedJ: list - Extra earned income credit phaseout start AGI for married filling jointly - EITC_rt: list - Earned income credit phasein rate - EITC_c: list - Maximum earned income credit - EITC_prt: list - Earned income credit phaseout rate - EITC_basic_frac: float - Fraction of maximum earned income credit paid at zero earnings - EITC_InvestIncome_c: float - Maximum investment income before EITC reduction - EITC_excess_InvestIncome_rt: float - Rate of EITC reduction when investemtn income exceeds ceiling - EITC_indiv: bool - EITC is computed for each spouse based in individual earnings - EITC_sep_filers_elig: bool - Separate filers are eligible for the EITC - c59660: float - EITC amount - - Returns - ------- - c59660: float - EITC amount - """ - # pylint: disable=too-many-branches - if MARS != 2: - eitc = EITCamount( - EITC_basic_frac, - EITC_rt[EIC], - earned, - EITC_c[EIC], - EITC_ps[EIC], - c00100, - EITC_prt[EIC], - ) - if EIC == 0: - # enforce age eligibility rule for those with no EITC-eligible - # kids assuming that an unknown age_* value implies EITC age - # eligibility - h_age_elig = EITC_MinEligAge <= age_head <= EITC_MaxEligAge - if age_head == 0 or h_age_elig: - c59660 = eitc - else: - c59660 = 0.0 - else: # if EIC != 0 - c59660 = eitc - - if MARS == 2: - po_start = EITC_ps[EIC] + EITC_ps_MarriedJ[EIC] - if not EITC_indiv: - # filing unit EITC rather than individual EITC - eitc = EITCamount( - EITC_basic_frac, - EITC_rt[EIC], - earned, - EITC_c[EIC], - po_start, - c00100, - EITC_prt[EIC], - ) - if EITC_indiv: - # individual EITC rather than a filing-unit EITC - eitc_p = EITCamount( - EITC_basic_frac, - EITC_rt[EIC], - earned_p, - EITC_c[EIC], - po_start, - earned_p, - EITC_prt[EIC], - ) - eitc_s = EITCamount( - EITC_basic_frac, - EITC_rt[EIC], - earned_s, - EITC_c[EIC], - po_start, - earned_s, - EITC_prt[EIC], - ) - eitc = eitc_p + eitc_s - - if EIC == 0: - h_age_elig = EITC_MinEligAge <= age_head <= EITC_MaxEligAge - s_age_elig = EITC_MinEligAge <= age_spouse <= EITC_MaxEligAge - if age_head == 0 or age_spouse == 0 or h_age_elig or s_age_elig: - c59660 = eitc - else: - c59660 = 0.0 - else: - c59660 = eitc - - if (MARS == 3 and not EITC_sep_filers_elig) or DSI == 1: - c59660 = 0.0 - - # reduce positive EITC if investment income exceeds ceiling - if c59660 > 0.0: - invinc = ( - e00400 - + e00300 - + e00600 - + max(0.0, c01000) - + max(0.0, (e02000 - e26270)) - ) - if invinc > EITC_InvestIncome_c: - eitc = c59660 - EITC_excess_InvestIncome_rt * ( - invinc - EITC_InvestIncome_c - ) - c59660 = max(0.0, eitc) - return c59660 - - -def RefundablePayrollTaxCredit( - was_plus_sey_p, was_plus_sey_s, RPTC_c, RPTC_rt, rptc_p, rptc_s, rptc -): - """ - Computes refundable payroll tax credit amounts. - - Parameters - ---------- - was_plus_sey_p: float - Wage and salary income plus taxable self employment income for taxpayer - was_plus_sey_s: float - Wage and salary income plus taxable self employment income for spouse - RPTC_c: float - Maximum refundable payroll tax credit - RPTC_rt: float - Refundable payroll tax credit phasein rate - rptc_p: float - Refundable Payroll Tax Credit for taxpayer - rptc_s: float - Refundable Payroll Tax Credit for spouse - rptc: float - Refundable Payroll Tax Credit for filing unit - - Returns - ------- - rptc_p: float - Refundable Payroll Tax Credit for taxpayer - rptc_s: float - Refundable Payroll Tax Credit for spouse - rptc: float - Refundable Payroll Tax Credit for filing unit - """ - rptc_p = min(was_plus_sey_p * RPTC_rt, RPTC_c) - rptc_s = min(was_plus_sey_s * RPTC_rt, RPTC_c) - rptc = rptc_p + rptc_s - return (rptc_p, rptc_s, rptc) - - -def ChildDepTaxCredit( - n24, - MARS, - c00100, - XTOT, - num, - c05800, - e07260, - CR_ResidentialEnergy_hc, - e07300, - CR_ForeignTax_hc, - c07180, - c07230, - e07240, - CR_RetirementSavings_hc, - c07200, - CTC_c, - CTC_ps, - CTC_prt, - exact, - ODC_c, - CTC_c_under6_bonus, - nu06, - CTC_refundable, - CTC_include17, - n21, - n1820, - c07220, - odc, - codtc_limited, -): - """ - Computes amounts on "Child Tax Credit and Credit for Other Dependents - Worksheet" in 2018 Publication 972, which pertain to these two - nonrefundable tax credits. - - Parameters - ---------- - n24: int - Number of children who are Child-Tax-Credit eligible, one condition for which is being under age 17 - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - c00100: float - Adjusted Gross Income (AGI) - XTOT: int - Total number of exemptions for filing unit - num: int - 2 when MARS is 2 (married filing jointly), otherwise 1 - c05800: float - Total (regular + AMT) income tax liability before credits - e07260: float - Residential energy credit from Form 5695 - CR_ResidentialEnergy_hc: float - Credit for residential energy haircut - e07300: float - Foreign tax credit from Form 1116 - CR_ForeignTax_hc: float - Credit for foreign tax credit - c07180: float - Credit for child and dependent care expenses from Form 2441 - c07230: float - Education tax credits non-refundable amount from Form 8863 - e07240: float - Retirement savings contributions credit from Form 8880 - CR_RetirementSavings_hc: float - Credit for retirement savings haircut - c07200: float - Schedule R credit for the elderly and the disabled - CTC_c: float - Maximum nonrefundable child tax credit per child - CTC_ps: list - Child tax credit phaseout MAGI start - CTC_prt: float - Child and dependent tax credit phaseout rate - exact: int - Whether or not to do rounding of phaseout fraction - ODC_c: float - Maximum nonrefundable other-dependent credit - CTC_c_under6_bonus: float - Bonus child tax credit maximum for qualifying children under six - nu06: int - Number of dependents under 6 years old - c07220: float - Child tax credit (adjusted) from Form 8812 - odc: float - Other Dependent Credit - codtc_limited: float - Maximum of 0 and line 10 minus line 16 - - Returns - ------- - c07220: float - Child tax credit (adjusted) from Form 8812 - odc: float - Other Dependent Credit - codtc_limited: float - Maximum of 0 and line 10 minus line 16 - """ - # Worksheet Part 1 - if CTC_include17: - childnum = n24 + max(0, XTOT - n21 - n1820 - n24 - num) - else: - childnum = n24 - line1 = CTC_c * childnum + CTC_c_under6_bonus * nu06 - line2 = ODC_c * max(0, XTOT - childnum - num) - line3 = line1 + line2 - modAGI = c00100 # no foreign earned income exclusion to add to AGI (line6) - if line3 > 0.0 and modAGI > CTC_ps[MARS - 1]: - excess = modAGI - CTC_ps[MARS - 1] - if exact == 1: # exact calculation as on tax forms - excess = 1000.0 * math.ceil(excess / 1000.0) - line10 = max(0.0, line3 - CTC_prt * excess) - else: - line10 = line3 - if line10 > 0.0: - # Worksheet Part 2 - line11 = c05800 - line12 = ( - e07260 * (1.0 - CR_ResidentialEnergy_hc) - + e07300 * (1.0 - CR_ForeignTax_hc) - + c07180 # child & dependent care expense credit - + c07230 # education credit - + e07240 * (1.0 - CR_RetirementSavings_hc) - + c07200 - ) # Schedule R credit - line13 = line11 - line12 - line14 = 0.0 - line15 = max(0.0, line13 - line14) - if CTC_refundable: - c07220 = line10 * line1 / line3 - odc = min(max(0.0, line10 - c07220), line15) - codtc_limited = max(0.0, line10 - c07220 - odc) - else: - line16 = min(line10, line15) # credit is capped by tax liability - # separate the CTC and ODTC amounts - c07220 = line16 * line1 / line3 - odc = max(0.0, line16 - c07220) - # compute codtc_limited for use in AdditionalCTC function - codtc_limited = max(0.0, line10 - line16) - else: - line16 = 0.0 - c07220 = 0.0 - odc = 0.0 - codtc_limited = 0.0 - return (c07220, odc, codtc_limited) - - -def PersonalTaxCredit( - MARS, - c00100, - XTOT, - nu18, - II_credit, - II_credit_ps, - II_credit_prt, - II_credit_nr, - II_credit_nr_ps, - II_credit_nr_prt, - RRC_c, - RRC_ps, - RRC_pe, - RRC_prt, - RRC_c_kids, - RRC_c_unit, - personal_refundable_credit, - personal_nonrefundable_credit, - recovery_rebate_credit, -): - """ - Computes personal_refundable_credit and personal_nonrefundable_credit, - neither of which are part of current-law policy. - - Parameters - ---------- - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - c00100: float - Adjusted Gross Income (AGI) - XTOT: int - Total number of exemptions for filing unit - nu18: int - Number of people under 18 years old in the filing unit - II_credit: list - Personal refundable credit maximum amount - II_credit_ps: list - Personal refundable credit phaseout start - II_credit_prt: float - Personal refundable credit phaseout rate - II_credit_nr: list - Personal nonrefundable credit maximum amount - II_credit_nr_ps: list - Personal nonrefundable credit phaseout start - II_credit_nr_prt: float - Personal nonrefundable credit phaseout rate - RRC_c: float - Maximum amount of Recovery Rebate Credit - RRC_ps: list - Recovery Rebate Credit phase out start - RRC_pe: list - Recovery Rebate Credit phase out end - RRC_prt: float - Recovery Rebate Credit phase out rate - RRC_c_kids: float - Credit amount per child as part of the Recovery Rebate Credit - RRC_c_unit: list - Maximum credit for filing unit as part of the Recovery Rebate Credit - personal_refundable_credit: float - Personal refundable credit - personal_nonrefundable_credit: float - Personal nonrefundable credit - - Returns - ------- - personal_refundable_credit: float - Personal refundable credit - personal_nonrefundable_credit: float - Personal nonrefundable credit - personal_rebate_credit: float - Personal rebate credit - """ - # calculate personal refundable credit amount with phase-out - personal_refundable_credit = II_credit[MARS - 1] - if II_credit_prt > 0.0 and c00100 > II_credit_ps[MARS - 1]: - pout = II_credit_prt * (c00100 - II_credit_ps[MARS - 1]) - fully_phasedout = personal_refundable_credit - pout - personal_refundable_credit = max(0.0, fully_phasedout) - # calculate personal nonrefundable credit amount with phase-out - personal_nonrefundable_credit = II_credit_nr[MARS - 1] - if II_credit_nr_prt > 0.0 and c00100 > II_credit_nr_ps[MARS - 1]: - pout = II_credit_nr_prt * (c00100 - II_credit_nr_ps[MARS - 1]) - fully_phasedout = personal_nonrefundable_credit - pout - personal_nonrefundable_credit = max(0.0, fully_phasedout) - # calculate Recovery Rebate Credit from CARES Act 2020 and/or ARPA 2021 - if c00100 < RRC_ps[MARS - 1]: - recovery_rebate_credit = RRC_c * XTOT - recovery_rebate_credit += RRC_c_unit[MARS - 1] + RRC_c_kids * nu18 - elif c00100 < RRC_pe[MARS - 1] and c00100 > 0: - prt = (c00100 - RRC_ps[MARS - 1]) / ( - RRC_pe[MARS - 1] - RRC_ps[MARS - 1] - ) - recovery_rebate_credit = RRC_c * XTOT * (1 - prt) - else: - recovery_rebate_credit = max( - 0, - RRC_c_unit[MARS - 1] - + RRC_c_kids * nu18 - - RRC_prt * (c00100 - RRC_ps[MARS - 1]), - ) - return ( - personal_refundable_credit, - personal_nonrefundable_credit, - recovery_rebate_credit, - ) - - -def AmOppCreditParts( - exact, - e87521, - num, - c00100, - CR_AmOppRefundable_hc, - CR_AmOppNonRefundable_hc, - c10960, - c87668, -): - """ - Applies a phaseout to the Form 8863, line 1, American Opportunity Credit - amount, e87521, and then applies the 0.4 refundable rate. - Logic corresponds to Form 8863, Part I. - - Parameters - ---------- - exact: int - Whether or not to do rounding of phaseout fraction - e87521: float - Total tentative AmOppCredit amount for all students. From Form 8863, line 1. - num: int - 2 when MARS is 2 (married filing jointly), otherwise 1 - c00100: float - Adjusted Gross Income (AGI) - CR_AmOppRefundable_hc: float - Refundable portion of the American Opportunity Credit haircut - CR_AmOppNonRefundable_hc: float - Nonrefundable portion of the American Opportunity Credit haircut - c10960: float - American Opportunity Credit refundable amount from Form 8863 - c87668: float - American Opportunity Credit non-refundable amount from Form 8863 - - Returns - ------- - c10960: float - American Opportunity Credit refundable amount from Form 8863 - c87668: float - American Opportunity Credit non-refundable amount from Form 8863 - - Notes - ----- - Tax Law Paramters that are not parameterized: - 90000: American Opportunity phaseout income base - 10000: American Opportunity Credit phaseout income range length - 1/1000: American Opportunity Credit phaseout rate - 0.3: American Opportunity Credit refundable rate - """ - if e87521 > 0.0: - c87658 = max(0.0, 90000.0 * num - c00100) - c87660 = 10000.0 * num - if exact == 1: # exact calculation as on tax forms - c87662 = 1000.0 * min(1.0, round(c87658 / c87660, 3)) - else: - c87662 = 1000.0 * min(1.0, c87658 / c87660) - c87664 = c87662 * e87521 / 1000.0 - c10960 = 0.4 * c87664 * (1.0 - CR_AmOppRefundable_hc) - c87668 = c87664 - c10960 * (1.0 - CR_AmOppNonRefundable_hc) - else: - c10960 = 0.0 - c87668 = 0.0 - return (c10960, c87668) - - -def SchR( - age_head, - age_spouse, - MARS, - c00100, - c05800, - e07300, - c07180, - e02400, - c02500, - e01500, - e01700, - CR_SchR_hc, - c07200, -): - """ - Calculates Schedule R credit for the elderly and the disabled, c07200. - - Note that no Schedule R policy parameters are inflation indexed. - - Note that all Schedule R policy parameters are hard-coded, and therefore, - are not able to be changed using Policy class parameters. - - Note that the CR_SchR_hc policy parameter allows the user to eliminate - or reduce total Schedule R credits. - - Parameters - ---------- - age_head: int - Age in years of taxpayer (primary adult) - age_spouse: int - Age in years of spouse (secondary adult, if present) - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - c00100: float - Adjusted Gross Income (AGI) - c05800: float - Total (regular + AMT) income tax liability before credit - e07300: float - Foreign tax credit from Form 1116 - c07180: float - Credit for child and dependent care expenses from Form 2441 - e02400: float - Total social security (OASDI) benefits - c02500: float - Social security (OASDI) benefits included in AGI - e01500: float - Total pensions and annuities - e01700: float - Taxable pensions and annuities - CR_SchR_hc: float - Schedule R credit haircut - c07200: float - Schedule R credit for the elderly and the disabled - - Returns - ------- - c07200: float - Schedule R credit for the elderly and the disabled - """ - if age_head >= 65 or (MARS == 2 and age_spouse >= 65): - # calculate credit assuming nobody is disabled (so line12 = line10) - if MARS == 2: - if age_head >= 65 and age_spouse >= 65: - schr12 = 7500.0 - else: - schr12 = 5000.0 - schr15 = 10000.0 - elif MARS == 3: - schr12 = 3750.0 - schr15 = 5000.0 - elif MARS in (1, 4): - schr12 = 5000.0 - schr15 = 7500.0 - else: - schr12 = 0.0 - schr15 = 0.0 - # nontaxable portion of OASDI benefits, line 13a - schr13a = max(0.0, e02400 - c02500) - # nontaxable portion of pension benefits, line 13b - # NOTE: the following approximation (required because of inadequate IRS - # data) will be accurate if all pensions are partially taxable - # or if all pensions are fully taxable. But if a filing unit - # receives at least one partially taxable pension and at least - # one fully taxable pension, then the approximation in the - # following line is not exactly correct. - schr13b = max(0.0, e01500 - e01700) - schr13c = schr13a + schr13b - schr16 = max(0.0, c00100 - schr15) - schr17 = 0.5 * schr16 - schr18 = schr13c + schr17 - schr19 = max(0.0, schr12 - schr18) - schr20 = 0.15 * schr19 - schr21 = max(0.0, (c05800 - e07300 - c07180)) - c07200 = min(schr20, schr21) * (1.0 - CR_SchR_hc) - else: # if not calculating Schedule R credit - c07200 = 0.0 - return c07200 - - -def EducationTaxCredit( - exact, - e87530, - MARS, - c00100, - num, - c05800, - e07300, - c07180, - c07200, - c87668, - LLC_Expense_c, - ETC_pe_Single, - ETC_pe_Married, - CR_Education_hc, - c07230, -): - """ - Computes Education Tax Credits (Form 8863) nonrefundable amount, c07230. - Logic corresponds to Form 8863, Part II. - - Parameters - ---------- - exact: int - Whether or not to do rounding of phaseout fraction - e87530: float - Adjusted qualified lifetime learning expenses for all students - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - c00100: float - Adjusted Gross Income (AGI) - num: int - 2 when MARS is 2 (married filing jointly), otherwise 1 - c05800: float - Total (regular + AMT) income tax liability before credits - e07300: float - Foreign tax credit from Form 1116 - c07180: float - Credit for child and dependent care expenses from Form 2441 - c07200: float - Schedule R credit for the elderly and the disabled - c87668: float - American Opportunity Credit non-refundalbe amount from Form 8863 - LLC_Expense_c: float - Lifetime learning credit expense limit - ETC_pe_Single: float - Education tax credit phaseout ends (single) - ETC_pe_Married: float - Education tax credit phaseout ends (married) - CR_Education_hc: float - Education Credits haircut - c07230: float - Education tax credits non-refundable amount from Form 8863 - - Returns - ------- - c07230: float - Education tax credits non-refundable amount from Form 8863 - - Notes - ----- - Tax Law Parameters that are not parameterized: - 0.2: Lifetime Learning Credit ratio against expense - """ - c87560 = 0.2 * min(e87530, LLC_Expense_c) - if MARS == 2: - c87570 = ETC_pe_Married * 1000.0 - else: - c87570 = ETC_pe_Single * 1000.0 - c87590 = max(0.0, c87570 - c00100) - c87600 = 10000.0 * num - if exact == 1: # exact calculation as on tax forms - c87610 = min(1.0, round(c87590 / c87600, 3)) - else: - c87610 = min(1.0, c87590 / c87600) - c87620 = c87560 * c87610 - xline4 = max(0.0, c05800 - (e07300 + c07180 + c07200)) - xline5 = min(c87620, xline4) - xline9 = max(0.0, c05800 - (e07300 + c07180 + c07200 + xline5)) - xline10 = min(c87668, xline9) - c87680 = xline5 + xline10 - c07230 = c87680 * (1.0 - CR_Education_hc) - return c07230 - - -def CharityCredit( - e19800, - e20100, - c00100, - CR_Charity_rt, - CR_Charity_f, - CR_Charity_frt, - MARS, - charity_credit, -): - """ - Computes nonrefundable charity credit, charity_credit. - This credit is not part of current-law policy. - - Parameters - ---------- - e19800: float - Itemizable charitable giving for cash and check contributions - e20100: float - Itemizable charitable giving other than cash and check contributions - c00100: float - Adjusted Gross Income (AGI) - CR_Charity_rt: float - Charity credit rate - CR_Charity_f: list - Charity credit floor - CR_Charity_frt: float - Charity credit floor rate - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - charity_credit: float - Credit for charitable giving - - Returns - ------- - charity_credit: float - Credit for charitable giving - """ - total_charity = e19800 + e20100 - floor = max(CR_Charity_frt * c00100, CR_Charity_f[MARS - 1]) - charity_cr_floored = max(total_charity - floor, 0) - charity_credit = CR_Charity_rt * (charity_cr_floored) - return charity_credit - - -def NonrefundableCredits( - c05800, - e07240, - e07260, - e07300, - e07400, - e07600, - p08000, - odc, - personal_nonrefundable_credit, - CTC_refundable, - CR_RetirementSavings_hc, - CR_ForeignTax_hc, - CR_ResidentialEnergy_hc, - CR_GeneralBusiness_hc, - CR_MinimumTax_hc, - CR_OtherCredits_hc, - charity_credit, - c07180, - c07200, - c07220, - c07230, - c07240, - c07260, - c07300, - c07400, - c07600, - c08000, -): - """ - NonRefundableCredits function sequentially limits credits to tax liability. - - Parameters - ---------- - c05800: float - Total (regular + AMT) income tax liability before credits - e07240: float - Retirement savings contributions credit from Form 8880 - e07260: float - Residential energy credit from Form 5695 - e07300: float - Foreign tax credit from Form 1116 - e07400: float - General business credit from Form 3800 - e07600: float - Prior year minimum tax credit from Form 8801 - p08000: float - Other tax credits - odc: float - Other Dependent Credit - personal_nonrefundable_credit: float - Personal nonrefundable credit - CTC_refundable: bool - Whether the child tax credit is fully refundable - CR_RetirementSavings_hc: float - Credit for retirement savings haircut - CR_ForeignTax_hc: float - Credit for foreign tax credit - CR_ResidentialEnergy_hc: float - Credit for residential energy haircut - CR_GeneralBusiness_hc: float - Credit for general business haircut - CR_MinimumTax_hc: float - Credit for previous year minimum tax credit haircut - CR_OtherCredits_hc: float - Other Credit haircut - charity_credit: float - Credit for charitable giving - c07180: float - Credit for child and dependent care expenses from Form 2441 - c07200: float - Schedule R credit for the elderly and the disabled - c07220: float - Child tax credit (adjusted) from From 8812 - c07230: float - Education tax credits non-refundable amount from Form 8863 - c07240: float - Retirement savings credit - Form 8880 - c07260: float - Residential energy credit - Form 5695 - c07300: float - Foreign tax credit - Form 1116 - c07400: float - General business credit - Form 3800 - c07600: float - Prior year minimum tax credit - Form 8801 - c08000: float - Other credits - Returns - ------- - c07180: float - Credit for child and dependent care expenses from Form 2441 - c07200: float - Schedule R credit for the elderly and the disabled - c07220: float - Child tax credit (adjusted) from From 8812 - c07230: float - Education tax credits non-refundable amount from Form 8863 - c07240: float - Retirement savings credit - Form 8880 - odc: float - Other Dependent Credit - c07260: float - Residential energy credit - Form 5695 - c07300: float - Foreign tax credit - Form 1116 - c07400: float - General business credit - Form 3800 - c07600: float - Prior year minimum tax credit - Form 8801 - c08000: float - Other credits - charity_credit: float - Credit for charitable giving - personal_nonrefundable_credit: float - Personal nonrefundable credit - """ - # limit tax credits to tax liability in order they are on 2015 1040 form - avail = c05800 - # Foreign tax credit - Form 1116 - c07300 = min(e07300 * (1.0 - CR_ForeignTax_hc), avail) - avail = avail - c07300 - # Child & dependent care expense credit - c07180 = min(c07180, avail) - avail = avail - c07180 - # Education tax credit - c07230 = min(c07230, avail) - avail = avail - c07230 - # Retirement savings credit - Form 8880 - c07240 = min(e07240 * (1.0 - CR_RetirementSavings_hc), avail) - avail = avail - c07240 - # Child tax credit - if not CTC_refundable: - c07220 = min(c07220, avail) - avail = avail - c07220 - # Other dependent credit - odc = min(odc, avail) - avail = avail - odc - # Residential energy credit - Form 5695 - c07260 = min(e07260 * (1.0 - CR_ResidentialEnergy_hc), avail) - avail = avail - c07260 - # General business credit - Form 3800 - c07400 = min(e07400 * (1.0 - CR_GeneralBusiness_hc), avail) - avail = avail - c07400 - # Prior year minimum tax credit - Form 8801 - c07600 = min(e07600 * (1.0 - CR_MinimumTax_hc), avail) - avail = avail - c07600 - # Schedule R credit - c07200 = min(c07200, avail) - avail = avail - c07200 - # Other credits - c08000 = min(p08000 * (1.0 - CR_OtherCredits_hc), avail) - avail = avail - c08000 - charity_credit = min(charity_credit, avail) - avail = avail - charity_credit - # Personal nonrefundable credit - personal_nonrefundable_credit = min(personal_nonrefundable_credit, avail) - avail = avail - personal_nonrefundable_credit - return ( - c07180, - c07200, - c07220, - c07230, - c07240, - odc, - c07260, - c07300, - c07400, - c07600, - c08000, - charity_credit, - personal_nonrefundable_credit, - ) - - -def AdditionalCTC( - codtc_limited, - ACTC_c, - n24, - earned, - ACTC_Income_thd, - ACTC_rt, - nu06, - ACTC_rt_bonus_under6family, - ACTC_ChildNum, - CTC_refundable, - CTC_include17, - XTOT, - n21, - n1820, - num, - ptax_was, - c03260, - e09800, - c59660, - e11200, - c11070, -): - """ - Calculates refundable Additional Child Tax Credit (ACTC), c11070, - following 2018 Form 8812 logic. - - Parameters - ---------- - codtc_limited: float - Maximum of 0 and line 10 minus line 16 - ACTC_c: float - Maximum refundable additional child tax credit - n24: int - Number of children who are Child-Tax-Credit eligible, one condition for which is being under age 17 - earned: float - Earned income for filing unit - ACTC_Income_thd: float - Additional Child Tax Credit income threshold - ACTC_rt: float - Additional Child Tax Credit rate - nu06: int - Number of dependents under 6 years old - ACTC_rt_bonus_under6family: float - Bonus additional child tax credit rate for families with qualifying children under 6 - ACTC_ChildNum: float - Additional Child Tax Credit minimum number of qualified children for different formula - ptax_was: float - Employee and employer OASDI plus HI FICA tax - c03260: float - Self-employment tax deduction (after haircut) - e09800: float - Unreported payroll taxes from Form 4137 or 8919 - c59660: float - EITC amount - e11200: float - Excess payroll (FICA/RRTA) tax withheld - c11070: float - Child tax credit (refunded) from Form 8812 - - Returns - ------- - c11070: float - Child tax credit (refunded) from Form 8812 - """ - # Part I - line3 = codtc_limited - - if CTC_refundable: - line4 = 0.0 - else: - if CTC_include17: - childnum = n24 + max(0, XTOT - n21 - n1820 - n24 - num) - else: - childnum = n24 - line4 = ACTC_c * childnum - c11070 = 0.0 # line15 - if line3 > 0.0 and line4 > 0.0: - line5 = min(line3, line4) - line7 = max(0.0, earned - ACTC_Income_thd) - # accommodate ACTC rate bonus for families with children under 5 - if nu06 == 0: - ACTC_rate = ACTC_rt - else: - ACTC_rate = ACTC_rt + ACTC_rt_bonus_under6family - line8 = ACTC_rate * line7 - if childnum < ACTC_ChildNum: - if line8 > 0.0: - c11070 = min(line5, line8) - else: # if childnum >= ACTC_ChildNum - if line8 >= line5: - c11070 = line5 - else: # complete Part II - line9 = 0.5 * ptax_was - line10 = c03260 + e09800 - line11 = line9 + line10 - line12 = c59660 + e11200 - line13 = max(0.0, line11 - line12) - line14 = max(line8, line13) - c11070 = min(line5, line14) - return c11070 - - -def C1040( - c05800, - c07180, - c07200, - c07220, - c07230, - c07240, - c07260, - c07300, - c07400, - c07600, - c08000, - e09700, - e09800, - e09900, - niit, - othertaxes, - c07100, - c09200, - odc, - charity_credit, - personal_nonrefundable_credit, - CTC_refundable, -): - """ - Computes total used nonrefundable credits, c07100, othertaxes, and - income tax before refundable credits, c09200. - - Parameters - ---------- - c05800: float - Total (regular + AMT) income tax liability before credits - c07180: float - Credit for child and dependent care expenses from Form 2441 - c07200: float - Schedule R credit for the elderly and the disabled - c07220: float - Child tax credit (adjusted) from Form 8812 - c07230: float - Education tax credit non-refundable amount from Form 8863 - c07240: float - Retirement savings credit - Form 8880 - c07260: float - Residential energy credit - Form 5695 - c07300: float - Foreign tax credit - Form 1116 - c07400: float - General business credit - Form 3800 - c07600: float - Prior year minimum tax credit - Form 8801 - c08000: float - Other credits - e09700: float - Recapture of Investment Credit - e09800: float - Unreported payroll taxes from Form 4137 or 8919 - e09900: float - Penalty tax on qualified retirement plans - niit: float - Net Investment Income Tax from Form 8960 - othertaxes: float - Sum of niit, e09700, e09800, and e09900 - c07100: float - Total non-refundable credits used to reduce positive tax liability - c09200: float - Income tax liabilities (including othertaxes) after non-refundable credits are used, but before refundable credits are applied - odc: float - Other Dependent Credit - charity_credit: float - Credit for charitable giving - personal_nonrefundable_credit: float - Personal nonrefundable credit - - Returns - ------- - c07100: float - Total non-refundable credits used to reduce positive tax liability - othertaxes: float - Sum of niit, e09700, e09800, and e09900 - c09200: float - Income tax liabilities (including othertaxes) after non-refundable credits are used, but before refundable credits are applied - """ - # total used nonrefundable credits (as computed in NonrefundableCredits) - c07100 = ( - c07180 - + c07200 - + c07600 - + c07300 - + c07400 - + c07220 * (1.0 - CTC_refundable) - + c08000 - + c07230 - + c07240 - + c07260 - + odc - + charity_credit - + personal_nonrefundable_credit - ) - # tax after credits (2016 Form 1040, line 56) - tax_net_nonrefundable_credits = max(0.0, c05800 - c07100) - # tax (including othertaxes) before refundable credits - othertaxes = e09700 + e09800 + e09900 + niit - c09200 = othertaxes + tax_net_nonrefundable_credits - return (c07100, othertaxes, c09200) - - -def CTC_new( - CTC_new_c, - CTC_new_rt, - CTC_new_c_under6_bonus, - CTC_new_ps, - CTC_new_prt, - CTC_new_for_all, - CTC_include17, - CTC_new_refund_limited, - CTC_new_refund_limit_payroll_rt, - CTC_new_refund_limited_all_payroll, - payrolltax, - n24, - nu06, - XTOT, - n21, - n1820, - num, - c00100, - MARS, - ptax_oasdi, - c09200, - ctc_new, -): - """ - Computes new refundable child tax credit using specified parameters. - - Parameters - ---------- - CTC_new_c: float - New refundable child tax credit maximum amount per child - CTC_new_rt: float - New refundalbe child tax credit amount phasein rate - CTC_new_c_under6_bonus: float - Bonus new refundable child tax credit maximum for qualifying children under six - CTC_new_ps: list - New refundable child tax credit phaseout starting AGI - CTC_new_prt: float - New refundable child tax credit amount phaseout rate - CTC_new_for_all: bool - Whether or not maximum amount of the new refundable child tax credit is available to all - CTC_new_refund_limited: bool - New child tax credit refund limited to a decimal fraction of payroll taxes - CTC_new_refund_limit_payroll_rt: float - New child tax credit refund limit rate (decimal fraction of payroll taxes) - CTC_new_refund_limited_all_payroll: bool - New child tax credit refund limit applies to all FICA taxes, not just OASDI - payrolltax: float - Total (employee + employer) payroll tax liability - n24: int - Number of children who are Child-Tax-Credit eligible, one condition for which is being under age 17 - nu06: int - Number of dependents under 6 years old - c00100: float - Adjusted Gross Income (AGI) - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - ptax_oasdi: float - Employee and employer OASDI FICA tax plus self employment tax - Excludes HI FICA so positive ptax_oasdi is less than ptax_was + setax - c09200: float - Income tax liabilities (including othertaxes) after non-refundable credits are used, but before refundable credits are applied - ctc_new: float - New refundable child tax credit - - Returns - ------- - ctc_new: float - New refundable child tax credit - """ - if CTC_include17: - childnum = n24 + max(0, XTOT - n21 - n1820 - n24 - num) - else: - childnum = n24 - if childnum > 0: - posagi = max(c00100, 0.0) - ctc_new = CTC_new_c * childnum + CTC_new_c_under6_bonus * nu06 - if not CTC_new_for_all: - ctc_new = min(CTC_new_rt * posagi, ctc_new) - ymax = CTC_new_ps[MARS - 1] - if posagi > ymax: - ctc_new_reduced = max(0.0, ctc_new - CTC_new_prt * (posagi - ymax)) - ctc_new = min(ctc_new, ctc_new_reduced) - if ctc_new > 0.0 and CTC_new_refund_limited: - refund_new = max(0.0, ctc_new - c09200) - if not CTC_new_refund_limited_all_payroll: - limit_new = CTC_new_refund_limit_payroll_rt * ptax_oasdi - if CTC_new_refund_limited_all_payroll: - limit_new = CTC_new_refund_limit_payroll_rt * payrolltax - limited_new = max(0.0, refund_new - limit_new) - ctc_new = max(0.0, ctc_new - limited_new) - else: - ctc_new = 0.0 - return ctc_new - - -def IITAX( - c59660, - c11070, - c10960, - personal_refundable_credit, - ctc_new, - rptc, - c09200, - payrolltax, - CDCC_refund, - recovery_rebate_credit, - eitc, - c07220, - CTC_refundable, - refund, - iitax, - combined, -): - """ - Computes final taxes. - - Parameters - ---------- - c59660: float - EITC amount - c11070: float - Child tax credit (refunded) from Form 8812 - c10960: float - American Opportunity Credit refundable amount from Form 8863 - personal_refundable_credit: float - Personal refundable credit - ctc_new: float - New refundable child tax credit - rptc: float - Refundable Payroll Tax Credit for filing unit - c09200: float - Income tax liabilities (including othertaxes) after non-refundable - credits are used, but before refundable credits are applied - payrolltax: float - Total (employee + employer) payroll tax liability - eitc: float - Earned Income Credit - refund: float - Total refundable income tax credits - iitax: float - Total federal individual income tax liability - combined: float - Sum of iitax and payrolltax and lumpsum_tax - - Returns - ------- - eitc: float - Earned Income Credit - refund: float - Total refundable income tax credits - iitax: float - Total federal individual income tax liability - combined: float - Sum of iitax and payrolltax and lumpsum_tax - """ - eitc = c59660 - if CTC_refundable: - ctc_refund = c07220 - else: - ctc_refund = 0.0 - refund = ( - eitc - + c11070 - + c10960 - + CDCC_refund - + recovery_rebate_credit - + personal_refundable_credit - + ctc_new - + rptc - + ctc_refund - ) - iitax = c09200 - refund - combined = iitax + payrolltax - return (eitc, refund, iitax, combined) - - -@JIT(nopython=True) -def Taxes( - income, - MARS, - tbrk_base, - rate1, - rate2, - rate3, - rate4, - rate5, - rate6, - rate7, - rate8, - tbrk1, - tbrk2, - tbrk3, - tbrk4, - tbrk5, - tbrk6, - tbrk7, -): - """ - Taxes function returns tax amount given the progressive tax rate - schedule specified by the rate* and (upper) tbrk* parameters and - given income, filing status (MARS), and tax bracket base (tbrk_base). - - Parameters - ---------- - income: float - Taxable income - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - tbrk_base: float - Amount of income used to determine the braket the filer is in - rate1: list - Income tax rate 1 - rate2: list - Income tax rate 2 - rate3: list - Income tax rate 3 - rate4: list - Income tax rate 4 - rate5: list - Income tax rate 5 - rate6: list - Income tax rate 6 - rate7: list - Income tax rate 7 - rate8: list - Income tax rate 8 - tbrk1: list - Income tax bracket (upper threshold) 1 - tbrk2: list - Income tax bracket (upper threshold) 2 - tbrk3: list - Income tax bracket (upper threshold) 3 - tbrk4: list - Income tax bracket (upper threshold) 4 - tbrk5: list - Income tax bracket (upper threshold) 5 - tbrk6: list - Income tax bracket (upper threshold) 6 - tbrk7: list - Income tax bracket (upper threshold) 7 - - Returns - ------- - None - """ - if tbrk_base > 0.0: - brk1 = max(tbrk1[MARS - 1] - tbrk_base, 0.0) - brk2 = max(tbrk2[MARS - 1] - tbrk_base, 0.0) - brk3 = max(tbrk3[MARS - 1] - tbrk_base, 0.0) - brk4 = max(tbrk4[MARS - 1] - tbrk_base, 0.0) - brk5 = max(tbrk5[MARS - 1] - tbrk_base, 0.0) - brk6 = max(tbrk6[MARS - 1] - tbrk_base, 0.0) - brk7 = max(tbrk7[MARS - 1] - tbrk_base, 0.0) - else: - brk1 = tbrk1[MARS - 1] - brk2 = tbrk2[MARS - 1] - brk3 = tbrk3[MARS - 1] - brk4 = tbrk4[MARS - 1] - brk5 = tbrk5[MARS - 1] - brk6 = tbrk6[MARS - 1] - brk7 = tbrk7[MARS - 1] - return ( - rate1 * min(income, brk1) - + rate2 * min(brk2 - brk1, max(0.0, income - brk1)) - + rate3 * min(brk3 - brk2, max(0.0, income - brk2)) - + rate4 * min(brk4 - brk3, max(0.0, income - brk3)) - + rate5 * min(brk5 - brk4, max(0.0, income - brk4)) - + rate6 * min(brk6 - brk5, max(0.0, income - brk5)) - + rate7 * min(brk7 - brk6, max(0.0, income - brk6)) - + rate8 * max(0.0, income - brk7) - ) - - -def ComputeBenefit(calc, ID_switch): - """ - Calculates the value of the benefits accrued from itemizing. - - Parameters - ---------- - calc: Calculator object - calc represents the reform while self represents the baseline - ID_switch: list - Deductions subject to the surtax on itemized deduction benefits - - Returns - ------- - benefit: float - Imputed benefits from itemizing deductions - """ - # compute income tax liability with no itemized deductions allowed for - # the types of itemized deductions covered under the BenefitSurtax - no_ID_calc = copy.deepcopy(calc) - if ID_switch[0]: - no_ID_calc.policy_param("ID_Medical_hc", [1.0]) - if ID_switch[1]: - no_ID_calc.policy_param("ID_StateLocalTax_hc", [1.0]) - if ID_switch[2]: - no_ID_calc.policy_param("ID_RealEstate_hc", [1.0]) - if ID_switch[3]: - no_ID_calc.policy_param("ID_Casualty_hc", [1.0]) - if ID_switch[4]: - no_ID_calc.policy_param("ID_Miscellaneous_hc", [1.0]) - if ID_switch[5]: - no_ID_calc.policy_param("ID_InterestPaid_hc", [1.0]) - if ID_switch[6]: - no_ID_calc.policy_param("ID_Charity_hc", [1.0]) - no_ID_calc._calc_one_year() # pylint: disable=protected-access - diff_iitax = no_ID_calc.array("iitax") - calc.array("iitax") - benefit = np.where(diff_iitax > 0.0, diff_iitax, 0.0) - return benefit - - -def BenefitSurtax(calc): - """ - Computes itemized-deduction-benefit surtax and adds the surtax amount - to income tax, combined tax, and surtax liabilities. - - Parameters - ---------- - calc: Calculator object - calc represents the reform while self represents the baseline - - Returns - ------- - None: - The function modifies calc - """ - if calc.policy_param("ID_BenefitSurtax_crt") != 1.0: - ben = ComputeBenefit( - calc, calc.policy_param("ID_BenefitSurtax_Switch") - ) - agi = calc.array("c00100") - ben_deduct = calc.policy_param("ID_BenefitSurtax_crt") * agi - ben_exempt_array = calc.policy_param("ID_BenefitSurtax_em") - ben_exempt = ben_exempt_array[calc.array("MARS") - 1] - ben_dedem = ben_deduct + ben_exempt - ben_surtax = calc.policy_param("ID_BenefitSurtax_trt") * np.where( - ben > ben_dedem, ben - ben_dedem, 0.0 - ) - # add ben_surtax to income & combined taxes and to surtax subtotal - calc.incarray("iitax", ben_surtax) - calc.incarray("combined", ben_surtax) - calc.incarray("surtax", ben_surtax) - - -def BenefitLimitation(calc): - """ - Limits the benefits of select itemized deductions to a fraction of - deductible expenses. - - Parameters - ---------- - calc: Calculator object - calc represents the reform while self represents the baseline - - Returns - ------- - None: - The function modifies calc - """ - if calc.policy_param("ID_BenefitCap_rt") != 1.0: - benefit = ComputeBenefit( - calc, calc.policy_param("ID_BenefitCap_Switch") - ) - # Calculate total deductible expenses under the cap - deduct_exps = 0.0 - if calc.policy_param("ID_BenefitCap_Switch")[0]: # medical - deduct_exps += calc.array("c17000") - if calc.policy_param("ID_BenefitCap_Switch")[1]: # statelocal - one_minus_hc = 1.0 - calc.policy_param("ID_StateLocalTax_hc") - deduct_exps += one_minus_hc * np.maximum( - calc.array("e18400_capped"), 0.0 - ) - if calc.policy_param("ID_BenefitCap_Switch")[2]: # realestate - one_minus_hc = 1.0 - calc.policy_param("ID_RealEstate_hc") - deduct_exps += one_minus_hc * calc.array("e18500_capped") - if calc.policy_param("ID_BenefitCap_Switch")[3]: # casualty - deduct_exps += calc.array("c20500") - if calc.policy_param("ID_BenefitCap_Switch")[4]: # misc - deduct_exps += calc.array("c20800") - if calc.policy_param("ID_BenefitCap_Switch")[5]: # interest - deduct_exps += calc.array("c19200") - if calc.policy_param("ID_BenefitCap_Switch")[6]: # charity - deduct_exps += calc.array("c19700") - # Calculate cap value for itemized deductions - benefit_limit = deduct_exps * calc.policy_param("ID_BenefitCap_rt") - # Add the difference between the actual benefit and capped benefit - # to income tax and combined tax liabilities. - excess_benefit = np.maximum(benefit - benefit_limit, 0) - calc.incarray("iitax", excess_benefit) - calc.incarray("surtax", excess_benefit) - calc.incarray("combined", excess_benefit) - - -def FairShareTax( - c00100, - MARS, - ptax_was, - setax, - ptax_amc, - FST_AGI_trt, - FST_AGI_thd_lo, - FST_AGI_thd_hi, - fstax, - iitax, - combined, - surtax, -): - """ - Computes Fair Share Tax, or "Buffet Rule", types of reforms. - - Parameters - ---------- - c00100: float - Adjusted Gross Income (AGI) - MARS: int - Filing (marital) status. (1=single, 2=joint, 3=separate, 4=household-head, 5=widow(er)) - ptax_was: float - Employee and employer OASDI plus HI FICA tax - setax: float - Self-employment tax - ptax_amc: float - Additional Medicare Tax - FST_AGI_trt: float - New minimum tax; rate as a decimal fraction of AGI - FST_AGI_thd_lo: list - Minimum AGI needed to be subject to the new minimum tax - FST_AGI_thd_hi: list - AGI level at which the New Minimum Tax is fully phased in - fstax: float - Fair Share Tax amount - iitax: float - Total federal individual income tax liability - combined: float - Sum of iitax and payrolltax and lumpsum_tax - surtax: float - Individual income tax subtotal augmented by fstax - - Returns - ------- - fstax: float - Fair Share Tax amount - iitax: float - Total federal individual income tax liability - combined: float - Sum of iitax and payrolltax and lumpsum_tax - surtax: float - Individual income tax subtotal augmented by fstax - """ - if FST_AGI_trt > 0.0 and c00100 >= FST_AGI_thd_lo[MARS - 1]: - employee_share = 0.5 * ptax_was + 0.5 * setax + ptax_amc - fstax = max(c00100 * FST_AGI_trt - iitax - employee_share, 0.0) - thd_gap = max(FST_AGI_thd_hi[MARS - 1] - FST_AGI_thd_lo[MARS - 1], 0.0) - if thd_gap > 0.0 and c00100 < FST_AGI_thd_hi[MARS - 1]: - fstax *= (c00100 - FST_AGI_thd_lo[MARS - 1]) / thd_gap - iitax += fstax - combined += fstax - surtax += fstax - else: - fstax = 0.0 - return (fstax, iitax, combined, surtax) - - -def LumpSumTax(DSI, num, XTOT, LST, lumpsum_tax, combined): - """ - Computes lump-sum tax and add it to combined taxes. - - Parameters - ---------- - DSI: int - 1 if claimed as dependent on another return, otherwise 0 - num: int - 2 when MARS is 2 (married filing jointly); otherwise 1 - XTOT: int - Total number of exemptions for filing unit - LST: float - Dollar amount of lump-sum tax - lumpsum_tax: float - Lumpsum (or head) tax - combined: float - Sum of iitax and payrolltax and lumpsum_tax - - Returns - ------- - lumpsum_tax: float - Lumpsum (or head) tax - combined: float - Sum of iitax and payrolltax and lumpsum_tax - """ - if LST == 0.0 or DSI == 1: - lumpsum_tax = 0.0 - else: - lumpsum_tax = LST * max(num, XTOT) - combined += lumpsum_tax - return (lumpsum_tax, combined) - - -def ExpandIncome( - e00200, - pencon_p, - pencon_s, - e00300, - e00400, - e00600, - e00700, - e00800, - e00900, - e01100, - e01200, - e01400, - e01500, - e02000, - e02100, - p22250, - p23250, - cmbtp, - ptax_was, - benefit_value_total, - expanded_income, -): - """ - Calculates expanded_income from component income types. - - Parameters - ---------- - e00200: float - Wages, salaries, and tips for filing unit net of pension contributions - pencon_p: float - Contributions to defined-contribution pension plans for taxpayer - pencon_s: float - Contributions to defined-contribution pension plans for spouse - e00300: float - Taxable interest income - e00400: float - Tax-exempt interest income - e00600: float - Ordinary dividends included in AGI - e00700: float - Taxable refunds of state and local income taxes - e00800: float - Alimony received - e00900: float - Schedule C business net profit/loss for filing unit - e01100: float - Capital gain distributions not reported on Schedule D - e01200: float - Other net gain/loss from Form 4797 - e01400: float - Taxable IRA distributions - e01500: float - Total pensions and annuities - e02000: float - Schedule E total rental, royalty, partnership, S-corporation, etc, income/loss - e02100: float - Farm net income/loss for filing unit from Schedule F - p22250: float - Schedule D net short term capital gains/losses - p23250:float - Schedule D net long term capital gains/losses - cmbtp: float - Estimate of inome on (AMT) Form 6251 but not in AGI - ptax_was: float - Employee and employer OASDI and HI FICA tax - benefit_value_total: float - Consumption value of all benefits received by tax unit, which is included in expanded income - expanded_income: float - Broad income measure that includes benefit_value_total - - Returns - ------- - expanded_income: float - Broad income measure that includes benefit_value_total - """ - expanded_income = ( - e00200 # wage and salary income net of DC pension contributions - + pencon_p # tax-advantaged DC pension contributions for taxpayer - + pencon_s # tax-advantaged DC pension contributions for spouse - + e00300 # taxable interest income - + e00400 # non-taxable interest income - + e00600 # dividends - + e00700 # state and local income tax refunds - + e00800 # alimony received - + e00900 # Sch C business net income/loss - + e01100 # capital gain distributions not reported on Sch D - + e01200 # Form 4797 other net gain/loss - + e01400 # taxable IRA distributions - + e01500 # total pension & annuity income (including DB-plan benefits) - + e02000 # Sch E total rental, ..., partnership, S-corp income/loss - + e02100 # Sch F farm net income/loss - + p22250 # Sch D: net short-term capital gain/loss - + p23250 # Sch D: net long-term capital gain/loss - + cmbtp # other AMT taxable income items from Form 6251 - + 0.5 * ptax_was # employer share of FICA taxes on wages/salaries - + benefit_value_total # consumption value of all benefits received; - # see the BenefitPrograms function in this file for details on - # exactly how the benefit_value_total variable is computed - ) - return expanded_income - - -def AfterTaxIncome(combined, expanded_income, aftertax_income): - """ - Calculates after-tax expanded income. - - Parameters - ---------- - combined: float - Sum of iitax and payrolltax and lumpsum_tax - expanded_income: float - Broad income measure that includes benefit_value_total - aftertax_income: float - After tax income is equal to expanded_income minus combined - - Returns - ------- - aftertax_income: float - After tax income is equal to expanded_income minus combined - """ - aftertax_income = expanded_income - combined - return aftertax_income - - -CALCFUNCTIONS_LIST = ( - TaxInc, - SchXYZTax, - GainsTax, - AGIsurtax, - NetInvIncTax, - AMT, - EI_PayrollTax, - Adj, - DependentCare, - ALD_InvInc_ec_base, - CapGains, - SSBenefits, - UBI, - AGI, - ItemDedCap, - ItemDed, - StdDed, - AdditionalMedicareTax, - F2441, - EITC, - RefundablePayrollTaxCredit, - ChildDepTaxCredit, - AdditionalCTC, - CTC_new, - PersonalTaxCredit, - SchR, - AmOppCreditParts, - EducationTaxCredit, - CharityCredit, - NonrefundableCredits, - C1040, - IITAX, - BenefitSurtax, - BenefitLimitation, - FairShareTax, - LumpSumTax, - BenefitPrograms, - ExpandIncome, - AfterTaxIncome, -) - -CALCFUNCTIONS = {fn.__name__: fn for fn in CALCFUNCTIONS_LIST} diff --git a/fiscalsim_us/variables/gov/doe/residential_efficiency_electrification_rebate/residential_efficiency_electrification_rebate.py b/fiscalsim_us/variables/gov/doe/residential_efficiency_electrification_rebate/residential_efficiency_electrification_rebate.py index 99b29ab5c..0022c4ea3 100644 --- a/fiscalsim_us/variables/gov/doe/residential_efficiency_electrification_rebate/residential_efficiency_electrification_rebate.py +++ b/fiscalsim_us/variables/gov/doe/residential_efficiency_electrification_rebate/residential_efficiency_electrification_rebate.py @@ -21,21 +21,28 @@ def formula(tax_unit, period, parameters): period, ) current_kwh = tax_unit.household("current_home_energy_use", period) - savings_pct = savings_kwh / current_kwh + # avoid array divide-by-zero warnings by not using where() function + savings_pct = np.zeros_like(current_kwh) + mask = current_kwh > 0 + savings_pct[mask] = savings_kwh[mask] / current_kwh[mask] income_ami = tax_unit.household("household_income_ami_ratio", period) high_cap = p.cap.high.calc(income_ami) medium_cap = p.cap.medium.calc(income_ami) - # Low cap is a dollar amount per given percentage reduction of energy use - # per dwelling unit for the average home in the state. + # Low cap is a dollar amount per given percentage reduction of energy + # use per dwelling unit for the average home in the state average_home_energy_use_in_state = tax_unit.household( "average_home_energy_use_in_state", period ) low_cap_per_percent = p.cap.low.calc(income_ami) - low_cap_per_kwh_reduction = 100 * ( - low_cap_per_percent / average_home_energy_use_in_state + # avoid array divide-by-zero warnings by not using where() function + reduction = np.zeros_like(average_home_energy_use_in_state) + mask = average_home_energy_use_in_state > 0 + reduction[mask] = ( + low_cap_per_percent[mask] / average_home_energy_use_in_state[mask] ) + low_cap_per_kwh_reduction = 100 * reduction low_cap = low_cap_per_kwh_reduction * savings_kwh - # Uncapped amount is a percent of project costs. + # Uncapped amount is a percent of project costs percent = p.percent.calc(income_ami) uncapped = percent * expenditures cap = select( diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_allowances.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_allowances.py new file mode 100644 index 000000000..c8eb77ce6 --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_allowances.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_dependent_allowances(Variable): + value_type = float + entity = Person + label = "Pell Grant dependent allowances" + definition_period = YEAR + + def formula(person, period, parameters): + other_allowances = person( + "pell_grant_dependent_other_allowances", period + ) + ipa = parameters(period).gov.ed.pell_grant.efc.dependent.ipa + head_available_income = person( + "pell_grant_head_available_income", period + ) + allowances_from_head = -min_(head_available_income, 0) + return ipa + allowances_from_head + other_allowances diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_available_income.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_available_income.py new file mode 100644 index 000000000..2a82b75a6 --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_available_income.py @@ -0,0 +1,8 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_dependent_available_income(Variable): + value_type = float + entity = Person + label = "Pell Grant dependent available income" + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_contribution.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_contribution.py new file mode 100644 index 000000000..6ae2ae7fb --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_contribution.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_dependent_contribution(Variable): + value_type = float + entity = Person + label = "Pell Grant dependent contribution" + definition_period = YEAR + + def formula(person, period, parameters): + assets = person("pell_grant_countable_assets", period) + simplified = person("pell_grant_simplified_formula_applies", period) + income = person("pell_grant_dependent_available_income", period) + allowances = person("pell_grant_dependent_allowances", period) + p = parameters(period).gov.ed.pell_grant.efc.dependent + adjusted_income = (income - allowances) * p.income_assessment_rate + adjusted_assets = assets * p.asset_assessment_rate * ~simplified + return adjusted_income + adjusted_assets diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_other_allowances.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_other_allowances.py new file mode 100644 index 000000000..a664e911a --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/dependent/pell_grant_dependent_other_allowances.py @@ -0,0 +1,8 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_dependent_other_allowances(Variable): + value_type = float + entity = Person + label = "Pell Grant dependent other allowances" + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_allowances.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_allowances.py new file mode 100644 index 000000000..7c8aa2f71 --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_allowances.py @@ -0,0 +1,8 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_head_allowances(Variable): + value_type = float + entity = Person + label = "Pell Grant head allowances" + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_assets.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_assets.py new file mode 100644 index 000000000..a217f73cb --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_assets.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_head_assets(Variable): + value_type = float + entity = TaxUnit + label = "Pell Grant head assets" + definition_period = YEAR + + def formula(tax_unit, period, parameters): + person = tax_unit.members + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + assets = person("pell_grant_countable_assets", period) + is_parent = is_head | is_spouse + return tax_unit.sum(is_parent * assets) diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_available_income.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_available_income.py new file mode 100644 index 000000000..364577f20 --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_available_income.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_head_available_income(Variable): + value_type = float + entity = Person + label = "Pell Grant head available income" + definition_period = YEAR + + def formula(person, period, parameters): + assets = person.tax_unit("pell_grant_head_assets", period) + simplified = person("pell_grant_simplified_formula_applies", period) + allowances = person("pell_grant_head_allowances", period) + income = person.tax_unit("pell_grant_primary_income", period) + formula = person("pell_grant_formula", period) + p = parameters(period).gov.ed.pell_grant.efc.head + adjusted_assets = ( + assets * p.asset_assessment_rate[formula] * ~simplified + ) + adjusted_income = (income - allowances) * p.income_assessment_rate[ + formula + ] + return adjusted_income + adjusted_assets diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_contribution.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_contribution.py new file mode 100644 index 000000000..cb82e5e7f --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_contribution.py @@ -0,0 +1,33 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_head_contribution(Variable): + value_type = float + entity = Person + label = "Pell Grant head contribution" + definition_period = YEAR + + def formula(person, period, parameters): + available_income = person("pell_grant_head_available_income", period) + dependents = person.tax_unit( + "pell_grant_dependents_in_college", period + ) + formula = person("pell_grant_formula", period).decode_to_str() + p = parameters(period).gov.ed.pell_grant.efc.head + positive_head_contribution = p.marginal_rate.calc(available_income) + negative_head_contribution = max_( + available_income * p.negative_rate, p.min_contribution + ) + total_head_contribution = where( + available_income >= 0, + positive_head_contribution, + negative_head_contribution, + ) + total = where( + formula == "B", available_income, total_head_contribution + ) + # Return amount per dependent, using a mask to avoid division by zero. + amount_per_dependent = np.zeros_like(total) + mask = dependents > 0 + amount_per_dependent[mask] = total[mask] / dependents[mask] + return amount_per_dependent diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_income.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_income.py new file mode 100644 index 000000000..b6aec1d53 --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/head/pell_grant_head_income.py @@ -0,0 +1,8 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_primary_income(Variable): + value_type = float + entity = TaxUnit + label = "Pell Grant head income" + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_countable_assets.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_countable_assets.py new file mode 100644 index 000000000..b258e8eef --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_countable_assets.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_countable_assets(Variable): + value_type = float + entity = Person + label = "Pell Grant countable assets" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_dependents_in_college.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_dependents_in_college.py new file mode 100644 index 000000000..a4d8cc9a9 --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_dependents_in_college.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_dependents_in_college(Variable): + value_type = int + entity = TaxUnit + label = "Pell Grant dependents in college" + definition_period = YEAR + + def formula(tax_unit, period, parameters): + person = tax_unit.members + college_student = person("is_full_time_college_student", period) + is_dependent = person("is_tax_unit_dependent", period) + return tax_unit.sum(is_dependent * college_student) diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_efc.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_efc.py new file mode 100644 index 000000000..818bde96f --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_efc.py @@ -0,0 +1,30 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_efc(Variable): + value_type = float + entity = Person + label = "Pell Grant expected family contribution" + definition_period = YEAR + + def formula(person, period, parameters): + head_contribution = person("pell_grant_head_contribution", period) + dependent_contribution = person( + "pell_grant_dependent_contribution", period + ) + head_income = person.tax_unit("pell_grant_primary_income", period) + formula = person("pell_grant_formula", period).decode_to_str() + zero_efc_max = parameters(period).gov.ed.pell_grant.efc.automatic_zero + automatic_zero = head_income <= zero_efc_max + return select( + [formula == "A", formula == "B", formula == "C"], + [ + where( + automatic_zero, + 0, + head_contribution + dependent_contribution, + ), + head_contribution, + where(automatic_zero, 0, head_contribution), + ], + ) diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_formula.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_formula.py new file mode 100644 index 000000000..06143a793 --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_formula.py @@ -0,0 +1,33 @@ +from fiscalsim_us.model_api import * + + +class PellGrantFormula(Enum): + A = "A" + B = "B" + C = "C" + + +class pell_grant_formula(Variable): + value_type = Enum + possible_values = PellGrantFormula + default_value = PellGrantFormula.A + entity = Person + label = "Pell Grant formula" + definition_period = YEAR + + def formula(person, period, parameters): + has_dependents = person.tax_unit("tax_unit_dependents", period) > 0 + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + head_or_spouse = is_head | is_spouse + return select( + [ + has_dependents & ~head_or_spouse, + ~has_dependents & head_or_spouse, + ], + [PellGrantFormula.A, PellGrantFormula.B], + # C formula applies for `has_dependents & head_or_spouse`. + # Technically this also catches `~has_dependents & ~head_or_spouse` + # but that's not a valid combination. + default=PellGrantFormula.C, + ) diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.py b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.py new file mode 100644 index 000000000..c3e87103c --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_simplified_formula_applies(Variable): + value_type = bool + entity = Person + label = "Use Pell Grant simplified formula" + definition_period = YEAR + + def formula(person, period, parameters): + tax_unit = person.tax_unit + head_income = tax_unit("pell_grant_primary_income", period) + p = parameters(period).gov.ed.pell_grant.efc.simplified + income_eligible = head_income < p.income_limit + total_benefits = add(tax_unit, period, p.benefits) + has_benefits = np.any(total_benefits > 0) + return income_eligible & has_benefits diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant.py b/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant.py index 9ada60094..9f76682e5 100644 --- a/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant.py +++ b/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant.py @@ -3,8 +3,17 @@ class pell_grant(Variable): value_type = float - entity = SPMUnit - label = "Pell Grant amount" - documentation = "SPM unit's Pell Grant educational subsidy" + entity = Person + label = "Pell Grant" definition_period = YEAR unit = USD + + def formula(person, period, parameters): + coa = person("cost_of_attending_college", period) + months_in_school = person("pell_grant_months_in_school", period) + efc = person("pell_grant_efc", period) + p = parameters(period).gov.ed.pell_grant + unbounded = coa - efc + capped = min_(unbounded, p.amount.max) + amount = where(capped < p.amount.min, 0, capped) + return amount * (months_in_school / p.months_in_school_year) diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant_cost_of_attending_college.py b/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant_cost_of_attending_college.py new file mode 100644 index 000000000..6730adcb7 --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant_cost_of_attending_college.py @@ -0,0 +1,8 @@ +from fiscalsim_us.model_api import * + + +class cost_of_attending_college(Variable): + value_type = float + entity = Person + label = "Pell Grant cost of attendance" + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant_months_in_school.py b/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant_months_in_school.py new file mode 100644 index 000000000..f9470da29 --- /dev/null +++ b/fiscalsim_us/variables/gov/ed/pell_grant/pell_grant_months_in_school.py @@ -0,0 +1,8 @@ +from fiscalsim_us.model_api import * + + +class pell_grant_months_in_school(Variable): + value_type = float + entity = Person + label = "Pell Grant months of year student is in school" + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/hhs/medicaid/income/medicaid_income.py b/fiscalsim_us/variables/gov/hhs/medicaid/income/medicaid_income.py index 438334e6c..c2afdf5c1 100644 --- a/fiscalsim_us/variables/gov/hhs/medicaid/income/medicaid_income.py +++ b/fiscalsim_us/variables/gov/hhs/medicaid/income/medicaid_income.py @@ -4,7 +4,7 @@ class medicaid_income(Variable): value_type = float entity = TaxUnit - label = "Mdicaid-related MAGI" + label = "Medicaid-related MAGI" unit = USD documentation = "Income definition for Medicaid for this tax unit." definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/hhs/tanf/cash/eligibility/is_person_demographic_tanf_eligible.py b/fiscalsim_us/variables/gov/hhs/tanf/cash/eligibility/is_person_demographic_tanf_eligible.py index 2b692ef39..759b015e8 100644 --- a/fiscalsim_us/variables/gov/hhs/tanf/cash/eligibility/is_person_demographic_tanf_eligible.py +++ b/fiscalsim_us/variables/gov/hhs/tanf/cash/eligibility/is_person_demographic_tanf_eligible.py @@ -6,7 +6,6 @@ class is_person_demographic_tanf_eligible(Variable): entity = Person definition_period = YEAR label = "Person-level eligiblity for TANF based on age, pregnancy, etc." - documentation = "Whether a person in a family applying for the Temporary Assistance for Needy Families program meets demographic requirements." def formula(person, period, parameters): child_0_17 = person("is_child", period) diff --git a/fiscalsim_us/variables/gov/hud/hud_income_level.py b/fiscalsim_us/variables/gov/hud/hud_income_level.py index f4002aa38..7c692c861 100644 --- a/fiscalsim_us/variables/gov/hud/hud_income_level.py +++ b/fiscalsim_us/variables/gov/hud/hud_income_level.py @@ -25,7 +25,12 @@ def formula(spm_unit, period, parameters): size = spm_unit("spm_unit_size", period) # Get area median income. ami = spm_unit("ami", period) - income_ami_ratio = annual_income / ami + # avoid array divide-by-zero warning by not using where() function + # see following GitHub issue for more details: + # https://github.com/PolicyEngine/fiscalsim-us/issues/2496 + income_ami_ratio = np.zeros_like(ami) + mask = ami != 0 + income_ami_ratio[mask] = annual_income[mask] / ami[mask] # Look up thresholds for each income level. p = parameters(period).gov.hud.ami_limit size_limit = p.family_size diff --git a/fiscalsim_us/variables/gov/irs/credits/cdcc/capped_cdcc.py b/fiscalsim_us/variables/gov/irs/credits/cdcc/capped_cdcc.py new file mode 100644 index 000000000..7d2e13b4b --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/credits/cdcc/capped_cdcc.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class capped_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "Capped child/dependent care credit" + unit = USD + definition_period = YEAR + reference = ( + "https://www.irs.gov/pub/irs-prior/i2441--2021.pdf#page=1", + "https://www.irs.gov/instructions/i2441#en_US_2022_publink1000106356", + "https://www.law.cornell.edu/uscode/text/26/30D#c_2", + ) + + def formula(tax_unit, period, parameters): + cdcc = tax_unit("cdcc", period) + p = parameters(period).gov.irs.credits + if "cdcc" in p.refundable: + return cdcc + # follow Credit Limit Worksheet in 2022 Form 2441 instructions: + itaxbc = tax_unit("income_tax_before_credits", period) # WS Line1 + # Excess Advance PTC Repayment (Form 8962) assumed zero in above line + offset = tax_unit("foreign_tax_credit", period) + # Partner Additional Reporting Year Tax (Form 8978) assumed zero above + cap = max_(itaxbc - offset, 0) # WS Line 2 + return min_(cdcc, cap) # WS Line 3 diff --git a/fiscalsim_us/variables/gov/irs/credits/clean_vehicle/new/new_clean_vehicle_credit.py b/fiscalsim_us/variables/gov/irs/credits/clean_vehicle/new/new_clean_vehicle_credit.py index fbc5ba686..a3b664468 100644 --- a/fiscalsim_us/variables/gov/irs/credits/clean_vehicle/new/new_clean_vehicle_credit.py +++ b/fiscalsim_us/variables/gov/irs/credits/clean_vehicle/new/new_clean_vehicle_credit.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class new_clean_vehicle_credit(Variable): diff --git a/fiscalsim_us/variables/gov/irs/credits/earned_income/eitc_eligible.py b/fiscalsim_us/variables/gov/irs/credits/earned_income/eitc_eligible.py deleted file mode 100644 index d6b36eb01..000000000 --- a/fiscalsim_us/variables/gov/irs/credits/earned_income/eitc_eligible.py +++ /dev/null @@ -1,47 +0,0 @@ -from fiscalsim_us.model_api import * - - -class eitc_eligible(Variable): - value_type = bool - entity = TaxUnit - label = "Eligible for EITC" - definition_period = YEAR - reference = "https://www.law.cornell.edu/uscode/text/26/32#c_1_A" - - def formula(tax_unit, period, parameters): - person = tax_unit.members - has_child = tax_unit("tax_unit_children", period) > 0 - age = person("age", period) - # Relative parameter reference break branching in some states that - # modify EITC age limits. - eitc = parameters.gov.irs.credits.eitc(period) - min_age = parameters.gov.irs.credits.eitc.eligibility.age.min(period) - max_age = parameters.gov.irs.credits.eitc.eligibility.age.max(period) - meets_age_requirements = (age >= min_age) & (age <= max_age) - no_loss_capital_gains = max_( - 0, - add(tax_unit, period, ["capital_gains"]), - ) - eitc_investment_income = ( - add( - tax_unit, - period, - ["net_investment_income", "tax_exempt_interest_income"], - ) - # Replace limited-loss capital gains with no-loss capital gains. - - tax_unit("c01000", period) # Limited-loss capital gains. - + no_loss_capital_gains - ) - inv_income_disqualified = ( - eitc_investment_income > eitc.phase_out.max_investment_income - ) - demographic_eligible = has_child | tax_unit.any(meets_age_requirements) - # Define eligibility before considering separate filer limitation. - eligible = demographic_eligible & ~inv_income_disqualified - # This parameter is true if separate filers are eligible. - if eitc.eligibility.separate_filer: - return eligible - # If separate filers are not eligible, check if the filer is separate. - filing_status = tax_unit("filing_status", period) - separate = filing_status == filing_status.possible_values.SEPARATE - return eligible & ~separate diff --git a/fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_demographic_eligible.py b/fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_demographic_eligible.py new file mode 100644 index 000000000..e01105246 --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_demographic_eligible.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class eitc_demographic_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Meets demographic eligibility for EITC" + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/32#c_1_A" + + def formula(tax_unit, period, parameters): + person = tax_unit.members + has_child = tax_unit("tax_unit_children", period) > 0 + age = person("age", period) + # Relative parameter reference break branching in some states that + # modify EITC age limits. + min_age = parameters.gov.irs.credits.eitc.eligibility.age.min(period) + max_age = parameters.gov.irs.credits.eitc.eligibility.age.max(period) + meets_age_requirements = (age >= min_age) & (age <= max_age) + return has_child | tax_unit.any(meets_age_requirements) diff --git a/fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_eligible.py b/fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_eligible.py new file mode 100644 index 000000000..bca00a8da --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_eligible.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class eitc_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for EITC" + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/32#c_1_A" + + def formula(tax_unit, period, parameters): + eitc = parameters.gov.irs.credits.eitc(period) + investment_income_eligible = tax_unit( + "eitc_investment_income_eligible", period + ) + demographic_eligible = tax_unit("eitc_demographic_eligible", period) + # Define eligibility before considering separate filer limitation. + eligible = demographic_eligible & investment_income_eligible + # This parameter is true if separate filers are eligible. + if eitc.eligibility.separate_filer: + return eligible + # If separate filers are not eligible, check if the filer is separate. + filing_status = tax_unit("filing_status", period) + separate = filing_status == filing_status.possible_values.SEPARATE + return eligible & ~separate diff --git a/fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_investment_income_eligible.py b/fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_investment_income_eligible.py new file mode 100644 index 000000000..45b954a0c --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/credits/earned_income/eligibility/eitc_investment_income_eligible.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class eitc_investment_income_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Meets investment income eligibility for EITC" + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/32#i" + + def formula(tax_unit, period, parameters): + eitc = parameters.gov.irs.credits.eitc(period) + invinc = tax_unit("eitc_relevant_investment_income", period) + return invinc <= eitc.phase_out.max_investment_income diff --git a/fiscalsim_us/variables/gov/irs/credits/energy_efficient_home_improvement/property/capped_heat_pump_heat_pump_water_heater_biomass_stove_boiler_credit.py b/fiscalsim_us/variables/gov/irs/credits/energy_efficient_home_improvement/property/capped_heat_pump_heat_pump_water_heater_biomass_stove_boiler_credit.py index 53f125882..3e687d338 100644 --- a/fiscalsim_us/variables/gov/irs/credits/energy_efficient_home_improvement/property/capped_heat_pump_heat_pump_water_heater_biomass_stove_boiler_credit.py +++ b/fiscalsim_us/variables/gov/irs/credits/energy_efficient_home_improvement/property/capped_heat_pump_heat_pump_water_heater_biomass_stove_boiler_credit.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class capped_heat_pump_heat_pump_water_heater_biomass_stove_boiler_credit( diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/maximum_capital_loss.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/limited_capital_loss.py similarity index 55% rename from fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/maximum_capital_loss.py rename to fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/limited_capital_loss.py index 8865cd515..7c1716b40 100644 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/maximum_capital_loss.py +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/limited_capital_loss.py @@ -1,19 +1,17 @@ from fiscalsim_us.model_api import * -class maximum_capital_loss(Variable): +class limited_capital_loss(Variable): value_type = float entity = TaxUnit - label = "Maximum capital loss deduction" + label = "Limited capital loss deduction" unit = USD documentation = "The capital loss deductible from gross income." definition_period = YEAR reference = "https://www.law.cornell.edu/uscode/text/26/1211" def formula(tax_unit, period, parameters): - capital_loss = tax_unit("tax_unit_capital_loss", period) + p = parameters(period).gov.irs filing_status = tax_unit("filing_status", period) - max_loss = parameters(period).gov.irs.ald.loss.capital.max[ - filing_status - ] - return min_(max_loss, capital_loss) + max_loss = p.ald.loss.capital.max[filing_status] + return min_(max_loss, add(tax_unit, period, ["capital_losses"])) diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/loss.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/loss_ald.py similarity index 58% rename from fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/loss.py rename to fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/loss_ald.py index 1963707d3..4f877f38e 100644 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/loss.py +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/loss_ald.py @@ -15,11 +15,8 @@ class loss_ald(Variable): def formula(tax_unit, period, parameters): filing_status = tax_unit("filing_status", period) max_loss = parameters(period).gov.irs.ald.loss.max[filing_status] - personal_self_employment_loss = max_( - -tax_unit.members("self_employment_income", period), 0 - ) - tax_unit_self_employment_losses = tax_unit.sum( - personal_self_employment_loss - ) - capital_loss = max_(tax_unit("maximum_capital_loss", period), 0) - return min_(max_loss, tax_unit_self_employment_losses + capital_loss) + person = tax_unit.members + indiv_se_loss = max_(0, -person("self_employment_income", period)) + self_employment_loss = tax_unit.sum(indiv_se_loss) + limited_capital_loss = tax_unit("limited_capital_loss", period) + return min_(max_loss, self_employment_loss + limited_capital_loss) diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/tax_unit_capital_loss.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/tax_unit_capital_loss.py deleted file mode 100644 index fc8c5efc3..000000000 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/tax_unit_capital_loss.py +++ /dev/null @@ -1,13 +0,0 @@ -from fiscalsim_us.model_api import * - - -class tax_unit_capital_loss(Variable): - value_type = float - entity = TaxUnit - label = "Tax unit capital loss" - unit = USD - documentation = "Total capital losses for the tax unit" - definition_period = YEAR - reference = "https://www.law.cornell.edu/uscode/text/26/1211" - - adds = ["capital_loss"] diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income.py index a17ee40e0..2e8a02b3f 100644 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income.py +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income.py @@ -14,7 +14,7 @@ def formula(tax_unit, period, parameters): above_the_line_deductions = tax_unit( "above_the_line_deductions", period ) - agi = max_(gross_income - above_the_line_deductions, 0) + agi = gross_income - above_the_line_deductions if parameters(period).gov.contrib.ubi_center.basic_income.taxable: agi += add(tax_unit, period, ["basic_income"]) return agi diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income_person.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income_person.py new file mode 100644 index 000000000..30ad7269a --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/adjusted_gross_income_person.py @@ -0,0 +1,38 @@ +from fiscalsim_us.model_api import * + + +class adjusted_gross_income_person(Variable): + value_type = float + entity = Person + label = "Federal adjusted gross income for each person" + unit = USD + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/62" + + def formula(person, period, parameters): + gross_income = person("irs_gross_income", period) + # calculate ald sums by person + PERSON_ALDS = [ + "self_employment_tax_ald", + "self_employed_health_insurance_ald", + "self_employed_pension_contribution_ald", + ] + person_ald_vars = [f"{ald}_person" for ald in PERSON_ALDS] + ald_sum_person = add(person, period, person_ald_vars) + # split other alds evenly between head and spouse + all_alds = parameters(period).gov.irs.ald.deductions + other_alds = list(set(all_alds) - set(PERSON_ALDS)) + ald_sum_taxunit = add(person.tax_unit, period, other_alds) + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + fstatus = person.tax_unit("filing_status", period) + frac = where(fstatus == fstatus.possible_values.JOINT, 0.5, 1.0) + ald_sum_taxunit_shared = (is_head | is_spouse) * ald_sum_taxunit * frac + # calculate AGI by person + agi = gross_income - ald_sum_person - ald_sum_taxunit_shared + if parameters(period).gov.contrib.ubi_center.basic_income.taxable: + basic_income = person.tax_unit("basic_income", period) + # split basic income evenly between head and spouse + basic_income_shared = (is_head | is_spouse) * basic_income * frac + agi += basic_income_shared + return agi diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_social_security.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_social_security.py index 6510f3ecf..27928c6c4 100644 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_social_security.py +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/adjusted_gross_income/irs_gross_income/social_security/taxable_social_security.py @@ -11,16 +11,18 @@ class taxable_social_security(Variable): def formula(person, period, parameters): unit_tss = person.tax_unit("tax_unit_taxable_social_security", period) # allocate unit_tss to head and spouse in proportion to social_security - unit_socsec = person.tax_unit("tax_unit_social_security", period) - unit_has_socsec = unit_socsec > 0 ind_socsec = person("social_security", period) + unit_socsec = person.tax_unit("tax_unit_social_security", period) + # Compute each person's share of tax unit's Social Security benefits. + # Use mask instead of where to avoid divide-by-zero warnings. Default to zero. + person_frac = np.zeros_like(unit_socsec) + mask = unit_socsec > 0 + person_frac[mask] = ind_socsec[mask] / unit_socsec[mask] is_spouse = person("is_tax_unit_spouse", period) - spouse_frac = min_( - 1, where(is_spouse & unit_has_socsec, ind_socsec / unit_socsec, 0) - ) + spouse_frac = min_(1, where(is_spouse, person_frac, 0)) unit_spouse_frac = person.tax_unit.sum(spouse_frac) is_head = person("is_tax_unit_head", period) - head_frac = where(is_head & unit_has_socsec, 1 - unit_spouse_frac, 0) + head_frac = where(is_head, 1 - unit_spouse_frac, 0) unit_head_frac = person.tax_unit.sum(head_frac) return unit_tss * select( [is_head, is_spouse], [unit_head_frac, unit_spouse_frac], default=0 diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/capped_property_taxes.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/capped_property_taxes.py new file mode 100644 index 000000000..c86f07b47 --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/capped_property_taxes.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class capped_property_taxes(Variable): + value_type = float + entity = TaxUnit + label = "Local real estate taxes limited by the federal SALT cap." + unit = USD + documentation = "Local real estate taxes limited by the federal SALT cap." + definition_period = YEAR + + def formula(tax_unit, period, parameters): + property_taxes = add(tax_unit, period, ["real_estate_taxes"]) + p = parameters(period).gov.irs.deductions.itemized + cap = p.salt_and_real_estate.cap[tax_unit("filing_status", period)] + return min_(property_taxes, cap) diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemized_deductions_less_salt.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemized_deductions_less_salt.py new file mode 100644 index 000000000..67260278b --- /dev/null +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemized_deductions_less_salt.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class itemized_deductions_less_salt(Variable): + value_type = float + entity = TaxUnit + label = "Itemized tax deductions other than SALT deduction" + unit = USD + documentation = "Non-SALT itemized deductions total." + definition_period = YEAR + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.irs.deductions + deductions = [ + deduction + for deduction in p.itemized_deductions + if deduction not in ["salt_deduction"] + ] + return add(tax_unit, period, deductions) diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/tax_unit_itemizes.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/tax_unit_itemizes.py index 63a7ce4e7..7b151530b 100644 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/tax_unit_itemizes.py +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/tax_unit_itemizes.py @@ -22,21 +22,6 @@ def formula(tax_unit, period, parameters): else: # determine federal itemization behavior by comparing deductions standard_deduction = tax_unit("standard_deduction", period) - # itemized deductions cannot be accurately calculated because - # the state_income_tax part of the salt_deduction must be - # ignored in order to avoid circular logic errors p = parameters(period).gov.irs.deductions - deductions = [ - deduction - for deduction in p.itemized_deductions - if deduction not in ["salt_deduction"] - ] - partial_itemized_deductions = add(tax_unit, period, deductions) - # add back the possibly capped local real estate taxes, - # which have no circular logic problems - filing_status = tax_unit("filing_status", period) - itemized_deductions = partial_itemized_deductions + min_( - add(tax_unit, period, ["real_estate_taxes"]), - p.itemized.salt_and_real_estate.cap[filing_status], - ) + itemized_deductions = add(tax_unit, period, p.itemized_deductions) return itemized_deductions > standard_deduction diff --git a/fiscalsim_us/variables/gov/irs/tax/federal_income/alternative_minimum_tax.py b/fiscalsim_us/variables/gov/irs/tax/federal_income/alternative_minimum_tax.py index 6e884347a..d68fbc44f 100644 --- a/fiscalsim_us/variables/gov/irs/tax/federal_income/alternative_minimum_tax.py +++ b/fiscalsim_us/variables/gov/irs/tax/federal_income/alternative_minimum_tax.py @@ -20,7 +20,7 @@ def formula(tax_unit, period, parameters): salt_deduction, standard_deduction, ) - amt_income = taxable_income + excluded_deductions + amt_inc = taxable_income + excluded_deductions amt = parameters(period).gov.irs.income.amt filing_status = tax_unit("filing_status", period) separate_addition = max_( @@ -28,16 +28,93 @@ def formula(tax_unit, period, parameters): min_( amt.exemption.amount[filing_status], amt.exemption.phase_out.rate - * max_(0, amt_income - amt.exemption.separate_limit), + * max_(0, amt_inc - amt.exemption.separate_limit), ), ) * (filing_status == filing_status.possible_values.SEPARATE) - return amt_income + separate_addition + return amt_inc + separate_addition -c62100 = variable_alias("c62100", amt_income) +class regular_tax_before_credits(Variable): + value_type = float + entity = TaxUnit + definition_period = YEAR + label = "Regular tax before credits" + documentation = "Regular tax on regular taxable income before credits" + unit = USD + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + dwks1 = tax_unit("taxable_income", period) + + capital_gains = parameters(period).gov.irs.capital_gains.brackets + + dwks16 = min_(capital_gains.thresholds["1"][filing_status], dwks1) + dwks17 = min_(tax_unit("dwks14", period), dwks16) + dwks20 = dwks16 - dwks17 + lowest_rate_tax = capital_gains.rates["1"] * dwks20 + # Break in worksheet lines + dwks13 = tax_unit("dwks13", period) + dwks21 = min_(dwks1, dwks13) + dwks22 = dwks20 + dwks23 = max_(0, dwks21 - dwks22) + dwks25 = min_(capital_gains.thresholds["2"][filing_status], dwks1) + dwks19 = tax_unit("dwks19", period) + dwks26 = min_(dwks19, dwks20) + dwks27 = max_(0, dwks25 - dwks26) + dwks28 = min_(dwks23, dwks27) + dwks29 = capital_gains.rates["2"] * dwks28 + dwks30 = dwks22 + dwks28 + dwks31 = dwks21 - dwks30 + dwks32 = capital_gains.rates["3"] * dwks31 + # Break in worksheet lines + dwks33 = min_( + tax_unit("dwks9", period), + add(tax_unit, period, ["unrecaptured_section_1250_gain"]), + ) + dwks10 = tax_unit("dwks10", period) + dwks34 = dwks10 + dwks19 + dwks36 = max_(0, dwks34 - dwks1) + dwks37 = max_(0, dwks33 - dwks36) + dwks38 = 0.25 * dwks37 + # Break in worksheet lines + dwks39 = dwks19 + dwks20 + dwks28 + dwks31 + dwks37 + dwks40 = dwks1 - dwks39 + dwks41 = 0.28 * dwks40 + + # Compute regular tax using bracket rates and thresholds + reg_taxinc = max_(0, dwks19) + p = parameters(period).gov.irs.income + bracket_tops = p.bracket.thresholds + bracket_rates = p.bracket.rates + reg_tax = 0 + bracket_bottom = 0 + for i in range(1, len(list(bracket_rates.__iter__())) + 1): + b = str(i) + bracket_top = bracket_tops[b][filing_status] + reg_tax += bracket_rates[b] * amount_between( + reg_taxinc, bracket_bottom, bracket_top + ) + bracket_bottom = bracket_top + # Return to worksheet lines + dwks42 = reg_tax + dwks43 = sum( + [ + dwks29, + dwks32, + dwks38, + dwks41, + dwks42, + lowest_rate_tax, + ] + ) + dwks44 = tax_unit("income_tax_main_rates", period) + dwks45 = min_(dwks43, dwks44) + hasqdivltcg = tax_unit("hasqdivltcg", period) + return where(hasqdivltcg, dwks45, dwks44) -class c09600(Variable): + +class alternative_minimum_tax(Variable): value_type = float entity = TaxUnit definition_period = YEAR @@ -46,7 +123,7 @@ class c09600(Variable): documentation = "Alternative Minimum Tax (AMT) liability" def formula(tax_unit, period, parameters): - c62100 = tax_unit("c62100", period) + amt_income = tax_unit("amt_income", period) # Form 6251, Part II top amt = parameters(period).gov.irs.income.amt phase_out = amt.exemption.phase_out @@ -56,7 +133,7 @@ def formula(tax_unit, period, parameters): ( amt.exemption.amount[filing_status] - phase_out.rate - * max_(0, c62100 - phase_out.start[filing_status]) + * max_(0, amt_income - phase_out.start[filing_status]) ), ) age_head = tax_unit("age_head", period) @@ -68,7 +145,7 @@ def formula(tax_unit, period, parameters): min_(line29, tax_unit("filer_earned", period) + child.amount), line29, ) - line30 = max_(0, c62100 - line29) + line30 = max_(0, amt_income - line29) brackets = amt.brackets amount_over_threshold = line30 - brackets.thresholds["1"] / tax_unit( "sep", period @@ -137,14 +214,9 @@ def formula(tax_unit, period, parameters): line62 = line42 + cgtax1 + cgtax2 + cgtax3 + line61 line64 = min_(line3163, line62) line31 = where(form_6251_part_iii_required, line64, line3163) - foreign_tax_credit = tax_unit("foreign_tax_credit", period) # Form 6251, Part II bottom - line32 = where( - tax_unit("amt_form_completed", period), - tax_unit("foreign_tax_credit", period), - foreign_tax_credit, - ) + line32 = tax_unit("foreign_tax_credit", period) line33 = line31 - line32 return max_( 0, @@ -152,12 +224,9 @@ def formula(tax_unit, period, parameters): - max_( 0, ( - tax_unit("taxbc", period) - - foreign_tax_credit - - tax_unit("c05700", period) + tax_unit("regular_tax_before_credits", period) + - line32 + - tax_unit("form_4972_lumpsum_distributions", period) ), ), ) - - -alternative_minimum_tax = variable_alias("alternative_minimum_tax", c09600) diff --git a/fiscalsim_us/variables/gov/irs/tax/federal_income/before_credits/regular_tax_before_credits.py b/fiscalsim_us/variables/gov/irs/tax/federal_income/before_credits/regular_tax_before_credits.py deleted file mode 100644 index 7cadf1131..000000000 --- a/fiscalsim_us/variables/gov/irs/tax/federal_income/before_credits/regular_tax_before_credits.py +++ /dev/null @@ -1,84 +0,0 @@ -from fiscalsim_us.model_api import * - - -class regular_tax_before_credits(Variable): - value_type = float - entity = TaxUnit - definition_period = YEAR - label = "Regular tax before credits" - documentation = "Regular tax on regular taxable income before credits" - unit = USD - - def formula(tax_unit, period, parameters): - filing_status = tax_unit("filing_status", period) - dwks1 = tax_unit("taxable_income", period) - - capital_gains = parameters(period).gov.irs.capital_gains.brackets - - dwks16 = min_(capital_gains.thresholds["1"][filing_status], dwks1) - dwks17 = min_(tax_unit("dwks14", period), dwks16) - dwks20 = dwks16 - dwks17 - lowest_rate_tax = capital_gains.rates["1"] * dwks20 - # Break in worksheet lines - dwks13 = tax_unit("dwks13", period) - dwks21 = min_(dwks1, dwks13) - dwks22 = dwks20 - dwks23 = max_(0, dwks21 - dwks22) - dwks25 = min_(capital_gains.thresholds["2"][filing_status], dwks1) - dwks19 = tax_unit("dwks19", period) - dwks26 = min_(dwks19, dwks20) - dwks27 = max_(0, dwks25 - dwks26) - dwks28 = min_(dwks23, dwks27) - dwks29 = capital_gains.rates["2"] * dwks28 - dwks30 = dwks22 + dwks28 - dwks31 = dwks21 - dwks30 - dwks32 = capital_gains.rates["3"] * dwks31 - # Break in worksheet lines - dwks33 = min_( - tax_unit("dwks9", period), - add(tax_unit, period, ["unrecaptured_section_1250_gain"]), - ) - dwks10 = tax_unit("dwks10", period) - dwks34 = dwks10 + dwks19 - dwks36 = max_(0, dwks34 - dwks1) - dwks37 = max_(0, dwks33 - dwks36) - dwks38 = 0.25 * dwks37 - # Break in worksheet lines - dwks39 = dwks19 + dwks20 + dwks28 + dwks31 + dwks37 - dwks40 = dwks1 - dwks39 - dwks41 = 0.28 * dwks40 - - # Compute regular tax using bracket rates and thresholds - reg_taxinc = max_(0, dwks19) - p = parameters(period).gov.irs.income - bracket_tops = p.bracket.thresholds - bracket_rates = p.bracket.rates - reg_tax = 0 - bracket_bottom = 0 - for i in range(1, len(list(bracket_rates.__iter__())) + 1): - b = str(i) - bracket_top = bracket_tops[b][filing_status] - reg_tax += bracket_rates[b] * amount_between( - reg_taxinc, bracket_bottom, bracket_top - ) - bracket_bottom = bracket_top - - # Return to worksheet lines - dwks42 = reg_tax - dwks43 = sum( - [ - dwks29, - dwks32, - dwks38, - dwks41, - dwks42, - lowest_rate_tax, - ] - ) - dwks44 = tax_unit("income_tax_main_rates", period) - dwks45 = min_(dwks43, dwks44) - hasqdivltcg = tax_unit("hasqdivltcg", period) - return where(hasqdivltcg, dwks45, dwks44) - - -taxbc = variable_alias("taxbc", regular_tax_before_credits) diff --git a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_capital_gain.py b/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_capital_gain.py index 1d0b4473f..e8fac345e 100644 --- a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_capital_gain.py +++ b/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_capital_gain.py @@ -6,7 +6,11 @@ class net_capital_gain(Variable): entity = TaxUnit label = "Net capital gain" unit = USD - documentation = 'The excess of net long-term capital gain over net short-term capital loss, plus qualified dividends (the definition of "net capital gain" which applies to 26 U.S.C. § 1(h) from § 1(h)(11)).' + documentation = ( + "The excess of net long-term capital gain over net short-term capital" + 'loss, plus qualified dividends (the definition of "net capital gain"' + "which applies to 26 U.S.C. § 1(h) from § 1(h)(11))." + ) definition_period = YEAR reference = dict( title="26 U.S. Code § 1222(11)", @@ -14,16 +18,12 @@ class net_capital_gain(Variable): ) def formula(tax_unit, period, parameters): - net_long_term_capital_gain = tax_unit( - "net_long_term_capital_gain", period - ) - net_short_term_capital_loss = tax_unit( - "net_short_term_capital_loss", period - ) - net_capital_gains = max_( - 0, net_long_term_capital_gain - net_short_term_capital_loss + lt_capital_gain = max_( + 0, add(tax_unit, period, ["long_term_capital_gains"]) ) - qualified_dividends = add( - tax_unit, period, ["qualified_dividend_income"] + st_capital_loss = max_( + 0, -add(tax_unit, period, ["short_term_capital_gains"]) ) - return net_capital_gains + qualified_dividends + net_cap_gain = max_(0, lt_capital_gain - st_capital_loss) + qual_div_income = add(tax_unit, period, ["qualified_dividend_income"]) + return net_cap_gain + qual_div_income diff --git a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_long_term_capital_gain.py b/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_long_term_capital_gain.py deleted file mode 100644 index 5bbd48718..000000000 --- a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_long_term_capital_gain.py +++ /dev/null @@ -1,20 +0,0 @@ -from fiscalsim_us.model_api import * - - -class net_long_term_capital_gain(Variable): - value_type = float - entity = TaxUnit - label = "Net long-term capital gain" - unit = USD - documentation = ( - "The excess of long-term capital gains over long-term capital losses." - ) - definition_period = YEAR - reference = dict( - title="26 U.S. Code § 1222(7)", - href="https://www.law.cornell.edu/uscode/text/26/1222#7", - ) - - formula = excess( - of="long_term_capital_gains", over="long_term_capital_losses" - ) diff --git a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_long_term_capital_loss.py b/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_long_term_capital_loss.py deleted file mode 100644 index dddc25a5b..000000000 --- a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_long_term_capital_loss.py +++ /dev/null @@ -1,20 +0,0 @@ -from fiscalsim_us.model_api import * - - -class net_long_term_capital_loss(Variable): - value_type = float - entity = TaxUnit - label = "Net long-term capital loss" - unit = USD - documentation = ( - "The excess of long-term capital losses over long-term capital gains." - ) - definition_period = YEAR - reference = dict( - title="26 U.S. Code § 1222(8)", - href="https://www.law.cornell.edu/uscode/text/26/1222#8", - ) - - formula = excess( - of="long_term_capital_losses", over="long_term_capital_gains" - ) diff --git a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_short_term_capital_gain.py b/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_short_term_capital_gain.py deleted file mode 100644 index c223afe09..000000000 --- a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_short_term_capital_gain.py +++ /dev/null @@ -1,18 +0,0 @@ -from fiscalsim_us.model_api import * - - -class net_short_term_capital_gain(Variable): - value_type = float - entity = TaxUnit - label = "Net short-term capital gain" - unit = USD - documentation = "The excess of short-term capital gains over short-term capital losses." - definition_period = YEAR - reference = dict( - title="26 U.S. Code § 1222(5)", - href="https://www.law.cornell.edu/uscode/text/26/1222#5", - ) - - formula = excess( - of="short_term_capital_gains", over="short_term_capital_losses" - ) diff --git a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_short_term_capital_loss.py b/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_short_term_capital_loss.py deleted file mode 100644 index b35bba0ff..000000000 --- a/fiscalsim_us/variables/gov/irs/tax/federal_income/capital_gains/net_short_term_capital_loss.py +++ /dev/null @@ -1,18 +0,0 @@ -from fiscalsim_us.model_api import * - - -class net_short_term_capital_loss(Variable): - value_type = float - entity = TaxUnit - label = "Net short-term capital loss" - unit = USD - documentation = "The excess of short-term capital losses over short-term capital gains." - definition_period = YEAR - reference = dict( - title="26 U.S. Code § 1222(6)", - href="https://www.law.cornell.edu/uscode/text/26/1222#6", - ) - - formula = excess( - of="short_term_capital_losses", over="short_term_capital_gains" - ) diff --git a/fiscalsim_us/variables/gov/irs/tax/federal_income/no_salt_income_tax.py b/fiscalsim_us/variables/gov/irs/tax/federal_income/no_salt_income_tax.py deleted file mode 100644 index e0e8e0647..000000000 --- a/fiscalsim_us/variables/gov/irs/tax/federal_income/no_salt_income_tax.py +++ /dev/null @@ -1,17 +0,0 @@ -from fiscalsim_us.model_api import * - - -class no_salt_income_tax(Variable): - value_type = float - entity = TaxUnit - label = "Federal income tax if SALT were abolished" - unit = USD - definition_period = YEAR - - def formula(tax_unit, period, parameters): - simulation = tax_unit.simulation - no_salt_branch = simulation.get_branch("no_salt") - no_salt_branch.set_input( - "salt_deduction", period, np.zeros(tax_unit.count) - ) - return no_salt_branch.calculate("income_tax", period) diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/standard/aged_blind_extra_standard_deduction.py b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/standard/aged_blind_extra_standard_deduction.py deleted file mode 100644 index a96f6bc58..000000000 --- a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/standard/aged_blind_extra_standard_deduction.py +++ /dev/null @@ -1,28 +0,0 @@ -from fiscalsim_us.model_api import * - - -class aged_blind_extra_standard_deduction(Variable): - value_type = float - entity = TaxUnit - label = "Aged and blind standard deduction" - definition_period = YEAR - unit = USD - - def formula(tax_unit, period, parameters): - std = parameters(period).gov.irs.deductions.standard - filing_status = tax_unit("filing_status", period) - filing_status_type = filing_status.possible_values - blind_head = tax_unit("blind_head", period) * 1 - blind_spouse = tax_unit("blind_spouse", period) * 1 - aged_head = ( - tax_unit("age_head", period) >= std.aged_or_blind.age_threshold - ) * 1 - aged_spouse = ( - (filing_status == filing_status_type.JOINT) - & ( - tax_unit("age_spouse", period) - >= std.aged_or_blind.age_threshold - ) - ) * 1 - count_extra_stded = blind_head + blind_spouse + aged_head + aged_spouse - return count_extra_stded * std.aged_or_blind.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/standard/standard.py b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/standard/standard.py deleted file mode 100644 index ff3f106e3..000000000 --- a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/standard/standard.py +++ /dev/null @@ -1,29 +0,0 @@ -from fiscalsim_us.model_api import * - - -class standard(Variable): - value_type = float - entity = TaxUnit - label = "Standard deduction (zero for itemizers)" - definition_period = YEAR - unit = USD - - def formula(tax_unit, period, parameters): - # Calculate basic standard deduction - basic_stded = tax_unit("basic_standard_deduction", period) - filing_status = tax_unit("filing_status", period) - separate_filer_itemizes = tax_unit("separate_filer_itemizes", period) - filing_statuses = filing_status.possible_values - - # Calculate extra standard deduction for aged and blind - extra_stded = tax_unit("aged_blind_extra_standard_deduction", period) - - # Calculate the total standard deduction. - initial_standard = basic_stded + extra_stded - # Separate filers get zero if their spouse itemizes. - return where( - (filing_status == filing_statuses.SEPARATE) - & separate_filer_itemizes, - 0, - initial_standard, - ) diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/outputs.py b/fiscalsim_us/variables/gov/irs/taxcalc/outputs.py index 785226c72..e4f7418cb 100644 --- a/fiscalsim_us/variables/gov/irs/taxcalc/outputs.py +++ b/fiscalsim_us/variables/gov/irs/taxcalc/outputs.py @@ -123,16 +123,6 @@ def formula(tax_unit, period, parameters): ) -class c05700(Variable): - value_type = float - entity = TaxUnit - definition_period = YEAR - documentation = ( - "search taxcalc/calcfunctions.py for how calculated and used" - ) - unit = USD - - class c07240(Variable): value_type = float entity = TaxUnit diff --git a/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc.py b/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc.py index ee56ed418..d2df8145b 100644 --- a/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc.py +++ b/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc.py @@ -1,38 +1,37 @@ -from fiscalsim_us.model_api import * -import numpy as np - - -class nyc_cdcc(Variable): - value_type = float - entity = TaxUnit - label = "NYC Child and Dependent Care Credit" - unit = USD - definition_period = YEAR - reference = "https://www.tax.ny.gov/pdf/current_forms/it/it216i.pdf" - defined_for = "nyc_cdcc_eligible" - - def formula(tax_unit, period, parameters): - # The NYC CDCC is a share of the NY State CDCC. - # The share magnitude is determined by the fraction of CDCC - # relevant expenses used for children under 4 and the NYC CDCC rate, - # which depends on income. - - # Get their NY State CDCC (line 14 on Form IT-216). - nys_cdcc = tax_unit("ny_cdcc", period) - - # Get the share of childcare expenses that count towards the NYC CDCC. - share_of_childcare_expenses_for_children_under_four = tax_unit( - "nyc_cdcc_share_qualifying_childcare_expenses", period - ) - - # Take this share of the NY State CDCC. - nyc_qualifying_cdcc_amount = ( - nys_cdcc * share_of_childcare_expenses_for_children_under_four - ) - - # Get the CDCC rate "applicable percentage" portion of the NYS CDCC - applicable_percentage = tax_unit( - "nyc_cdcc_applicable_percentage", period - ) - - return nyc_qualifying_cdcc_amount * applicable_percentage +from fiscalsim_us.model_api import * + + +class nyc_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "NYC Child and Dependent Care Credit" + unit = USD + definition_period = YEAR + reference = "https://www.tax.ny.gov/pdf/current_forms/it/it216i.pdf" + defined_for = "nyc_cdcc_eligible" + + def formula(tax_unit, period, parameters): + # The NYC CDCC is a share of the NY State CDCC. + # The share magnitude is determined by the fraction of CDCC + # relevant expenses used for children under 4 and the NYC CDCC rate, + # which depends on income. + + # Get their NY State CDCC (line 14 on Form IT-216). + nys_cdcc = tax_unit("ny_cdcc", period) + + # Get the share of childcare expenses that count towards the NYC CDCC. + share_of_childcare_expenses_for_children_under_four = tax_unit( + "nyc_cdcc_share_qualifying_childcare_expenses", period + ) + + # Take this share of the NY State CDCC. + nyc_qualifying_cdcc_amount = ( + nys_cdcc * share_of_childcare_expenses_for_children_under_four + ) + + # Get the CDCC rate "applicable percentage" portion of the NYS CDCC + applicable_percentage = tax_unit( + "nyc_cdcc_applicable_percentage", period + ) + + return nyc_qualifying_cdcc_amount * applicable_percentage diff --git a/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc_age_restricted_expenses.py b/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc_age_restricted_expenses.py index 679d7bcbf..413b0869b 100644 --- a/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc_age_restricted_expenses.py +++ b/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc_age_restricted_expenses.py @@ -23,7 +23,10 @@ def formula(tax_unit, period, parameters): tax_unit_childcare_expenses = tax_unit( "tax_unit_childcare_expenses", period ) - qualifying_child_share = where( - children > 0, qualifying_children / children, 0 + # avoid divide-by-zero warnings by not using where() function + qualifying_child_share = np.zeros_like(children) + mask = children > 0 + qualifying_child_share[mask] = ( + qualifying_children[mask] / children[mask] ) return tax_unit_childcare_expenses * qualifying_child_share diff --git a/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc_share_qualifying_childcare_expenses.py b/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc_share_qualifying_childcare_expenses.py index e28f50495..c6ea9fb1a 100644 --- a/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc_share_qualifying_childcare_expenses.py +++ b/fiscalsim_us/variables/gov/local/ny/nyc/tax/income/credits/cdcc/nyc_cdcc_share_qualifying_childcare_expenses.py @@ -16,17 +16,17 @@ def formula(tax_unit, period, parameters): childcare_expenses_for_children_under_four = tax_unit( "nyc_cdcc_age_restricted_expenses", period ) - # Get the total childcare expenses. # Line 3a on Form IT-216. tax_unit_childcare_expenses = tax_unit( "tax_unit_childcare_expenses", period ) - # Return the share of childcare expenses for children under age four - return where( - tax_unit_childcare_expenses == 0, - 0, - childcare_expenses_for_children_under_four - / tax_unit_childcare_expenses, + # avoiding array divide-by-zero warning by not using where() function + share = np.zeros_like(tax_unit_childcare_expenses) + mask = tax_unit_childcare_expenses > 0 + share[mask] = ( + childcare_expenses_for_children_under_four[mask] + / tax_unit_childcare_expenses[mask] ) + return share diff --git a/fiscalsim_us/variables/gov/ssa/ss/never_eligible_for_social_security_benefits.py b/fiscalsim_us/variables/gov/ssa/ss/never_eligible_for_social_security_benefits.py new file mode 100644 index 000000000..1160e0886 --- /dev/null +++ b/fiscalsim_us/variables/gov/ssa/ss/never_eligible_for_social_security_benefits.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class never_eligible_for_social_security_benefits(Variable): + value_type = bool + entity = Person + definition_period = YEAR + label = "Never eligible for Social Security" + unit = USD + + def formula(person, period, parameters): + # Assumption: if person is above age 70 and has no social security benefits, then they are never eligible. + age = person("age", period) + social_security = person("social_security", period) + return (age >= 70) & (social_security == 0) diff --git a/fiscalsim_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_parent/ssi_unearned_income_deemed_from_ineligible_parent.py b/fiscalsim_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_parent/ssi_unearned_income_deemed_from_ineligible_parent.py index 608a04680..b357f9d06 100644 --- a/fiscalsim_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_parent/ssi_unearned_income_deemed_from_ineligible_parent.py +++ b/fiscalsim_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_parent/ssi_unearned_income_deemed_from_ineligible_parent.py @@ -3,12 +3,6 @@ _apply_ssi_exclusions, ) -# Disable divide-by-zero warning for this file -import warnings - -warnings.filterwarnings("ignore", category=RuntimeWarning) -warnings.simplefilter("ignore") - class ssi_unearned_income_deemed_from_ineligible_parent(Variable): value_type = float @@ -61,8 +55,12 @@ def formula(person, period, parameters): ) count_eligible_children = tax_unit.sum(eligible_child) - return where( - count_eligible_children > 0, - net_parental_deemed_income / count_eligible_children, - 0, + # avoid array divide-by-zero warnings by not using where() function + # see the following GitHub issue for more details: + # https://github.com/PolicyEngine/fiscalsim-us/issues/2494 + income = np.zeros_like(count_eligible_children) + mask = count_eligible_children > 0 + income[mask] = ( + net_parental_deemed_income[mask] / count_eligible_children[mask] ) + return income diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/ar_exemptions.py b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_exemptions.py new file mode 100644 index 000000000..4e24ea17a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_exemptions.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class ar_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas exemptions from income tax" + reference = "https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_AR1000F_and_AR1000NR_Instructions.pdf#page=10" + defined_for = StateCode.AR + unit = USD + definition_period = YEAR + adds = "gov.states.ar.tax.income.exemptions" diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax.py b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax.py new file mode 100644 index 000000000..3b5e91155 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class ar_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.AR + + adds = ["ar_income_tax_before_refundable_credits"] + subtracts = ["ar_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax_before_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax_before_non_refundable_credits.py new file mode 100644 index 000000000..c71ff865e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax_before_non_refundable_credits.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class ar_income_tax_before_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas income tax before non refundable credits" + unit = USD + definition_period = YEAR + reference = "https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2023_Final_AR1000ES.pdf" + defined_for = StateCode.AR + + def formula(tax_unit, period, parameters): + rate = parameters(period).gov.states.ar.tax.income.rates.main + taxable_income = tax_unit("ar_taxable_income", period) + + return rate.calc(taxable_income) diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..4c76578f3 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_income_tax_before_refundable_credits.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class ar_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas income tax before refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.AR + + def formula(tax_unit, period, parameters): + before_non_refundable_credits = tax_unit( + "ar_income_tax_before_non_refundable_credits", period + ) + non_refundable_credits = tax_unit("ar_non_refundable_credits", period) + return max_(before_non_refundable_credits - non_refundable_credits, 0) diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/ar_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_non_refundable_credits.py new file mode 100644 index 000000000..8d5f883d9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_non_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class ar_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.AR + + adds = "gov.states.ar.tax.income.credits.non_refundable" diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/ar_refundable_credits.py b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_refundable_credits.py new file mode 100644 index 000000000..eda396c54 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class ar_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.AR + + adds = "gov.states.ar.tax.income.credits.refundable" diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/ar_taxable_income.py b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_taxable_income.py new file mode 100644 index 000000000..2f7436f3d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/ar_taxable_income.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class ar_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas taxable income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/TaxBrackets_2022.pdf" + "https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2023_Final_AR1000ES.pdf" + ) + defined_for = StateCode.AR diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/credits/ar_cdcc.py b/fiscalsim_us/variables/gov/states/ar/tax/income/credits/ar_cdcc.py new file mode 100644 index 000000000..71c6a11d2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/credits/ar_cdcc.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class ar_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas Child and Dependent Care Credit" + unit = USD + documentation = "https://codes.findlaw.com/ar/title-26-taxation/ar-code-sect-26-51-502/" + definition_period = YEAR + defined_for = StateCode.AR + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ar.tax.income.credits.cdcc + cdcc = tax_unit("cdcc", period) + return cdcc * p.match diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/credits/ar_inflationary_relief_tax_credit.py b/fiscalsim_us/variables/gov/states/ar/tax/income/credits/ar_inflationary_relief_tax_credit.py new file mode 100644 index 000000000..bf40abcef --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/credits/ar_inflationary_relief_tax_credit.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class ar_inflation_relief_credit(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas inflation relief income-tax credit" + unit = USD + definition_period = YEAR + defined_for = StateCode.AR + + def formula(tax_unit, period, parameters): + # the Arkansas inflationary relief tax credit is calculated based on net taxable income + # mentioned in individual income tax return form AR1000F line 28 + income = tax_unit("ar_taxable_income", period) + p = parameters( + period + ).gov.states.ar.tax.income.credits.inflationary_relief + filing_status = tax_unit("filing_status", period) + max_amount = p.max_amount[filing_status] + reduction_start = p.reduction.start[filing_status] + increment = p.reduction.increment[filing_status] + reduction_per_increment = p.reduction.amount[filing_status] + excess = max_(income - reduction_start, 0) + increments = np.ceil(excess / increment) + total_reduction_amount = increments * reduction_per_increment + return max_(max_amount - total_reduction_amount, 0) diff --git a/fiscalsim_us/variables/gov/states/ar/tax/income/deductions/standard/ar_standard_deduction.py b/fiscalsim_us/variables/gov/states/ar/tax/income/deductions/standard/ar_standard_deduction.py new file mode 100644 index 000000000..d74172c55 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ar/tax/income/deductions/standard/ar_standard_deduction.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class ar_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Arkansas standard deduction" + unit = USD + definition_period = YEAR + reference = "https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/2022_AR1000F_and_AR1000NR_Instructions.pdf#page=14" + defined_for = StateCode.AR + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ar.tax.income.deductions + filing_status = tax_unit("filing_status", period) + return p.standard[filing_status] diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax.py b/fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax.py new file mode 100644 index 000000000..adbae3ef2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class az_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Arizona income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.AZ + + adds = ["az_income_tax_before_refundable_credits"] + subtracts = ["az_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.py new file mode 100644 index 000000000..a66bcd9ff --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax_before_non_refundable_credits.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class az_income_tax_before_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Arizona income tax before non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + income = tax_unit("az_taxable_income", period) + filing_status = tax_unit("filing_status", period) + p = parameters(period).gov.states.az.tax.income.main + status = filing_status.possible_values + return select( + [ + filing_status == status.SINGLE, + filing_status == status.HEAD_OF_HOUSEHOLD, + filing_status == status.JOINT, + filing_status == status.SEPARATE, + filing_status == status.WIDOW, + ], + [ + p.single.calc(income), + p.head_of_household.calc(income), + p.joint.calc(income), + p.separate.calc(income), + p.widow.calc(income), + ], + ) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..6d02c122d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/az_income_tax_before_refundable_credits.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class az_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Arizona income tax before refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + before_non_refundable_credits = tax_unit( + "az_income_tax_before_non_refundable_credits", period + ) + non_refundable_credits = tax_unit("az_non_refundable_credits", period) + return max_(before_non_refundable_credits - non_refundable_credits, 0) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/az_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/az/tax/income/az_non_refundable_credits.py new file mode 100644 index 000000000..3b8d7791d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/az_non_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class az_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Arizona non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.AZ diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/az_refundable_credits.py b/fiscalsim_us/variables/gov/states/az/tax/income/az_refundable_credits.py new file mode 100644 index 000000000..05a069e7a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/az_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class az_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Arizona refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.AZ diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/az_taxable_income.py b/fiscalsim_us/variables/gov/states/az/tax/income/az_taxable_income.py new file mode 100644 index 000000000..9a16c9882 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/az_taxable_income.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class az_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Arizona taxable income" + unit = USD + definition_period = YEAR + defined_for = StateCode.AZ diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/credits/az_increased_excise_tax_credit.py b/fiscalsim_us/variables/gov/states/az/tax/income/credits/az_increased_excise_tax_credit.py new file mode 100644 index 000000000..d5a7a942f --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/credits/az_increased_excise_tax_credit.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class az_increased_excise_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "Arizona Increased Excise Tax Credit" + unit = USD + definition_period = YEAR + defined_for = "az_increased_excise_tax_credit_eligible" + reference = "https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01072-01.htm" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.az.tax.income.credits.increased_excise + # The increased excise tax credit is allowed for each person that a + # personal or dependent exemption can be claimed for + tax_unit_size = tax_unit("tax_unit_size", period) + uncapped_credit = tax_unit_size * p.amount + return min_(uncapped_credit, p.max_amount) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/credits/az_increased_excise_tax_credit_eligible.py b/fiscalsim_us/variables/gov/states/az/tax/income/credits/az_increased_excise_tax_credit_eligible.py new file mode 100644 index 000000000..a65e34eae --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/credits/az_increased_excise_tax_credit_eligible.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class az_increased_excise_tax_credit_eligible(Variable): + value_type = bool + entity = TaxUnit + definition_period = YEAR + label = "Eligible for Arizona Increased Excise Tax Credit" + reference = "https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01072-01.htm" + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.az.tax.income.credits.increased_excise + agi = tax_unit("adjusted_gross_income", period) + filing_status = tax_unit("filing_status", period) + max_income = p.income_threshold[filing_status] + return agi <= max_income diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_credit.py b/fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_credit.py new file mode 100644 index 000000000..92c41b58a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_credit.py @@ -0,0 +1,36 @@ +from fiscalsim_us.model_api import * + + +class az_charitable_contributions_credit(Variable): + value_type = float + entity = TaxUnit + label = "Arizona charitable contributions credit" + unit = USD + definition_period = YEAR + defined_for = StateCode.AZ + reference = ( + "https://law.justia.com/codes/arizona/2022/title-43/section-43-1088/" + ) + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.az.tax.income.credits.charitable_contribution.ceiling + charitable_contributions = tax_unit( + "az_charitable_contributions_to_qualifying_charitable_organizations", + period, + ) + foster_care_contributions = tax_unit( + "az_charitable_contributions_to_qualifying_foster_care_organizations", + period, + ) + filing_status = tax_unit("filing_status", period) + capped_charitable_contributions = min_( + charitable_contributions, p.qualifying_organization[filing_status] + ) + capped_foster_care_contributions = min_( + foster_care_contributions, p.qualifying_foster[filing_status] + ) + return ( + capped_charitable_contributions + capped_foster_care_contributions + ) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_to_qualifying_charitable_organizations.py b/fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_to_qualifying_charitable_organizations.py new file mode 100644 index 000000000..d3902a15a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_to_qualifying_charitable_organizations.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class az_charitable_contributions_to_qualifying_charitable_organizations( + Variable +): + value_type = float + entity = TaxUnit + label = "Charitable contributions to qualifying charitable organizations in Arizona" + definition_period = YEAR + defined_for = StateCode.AZ + reference = ( + "https://law.justia.com/codes/arizona/2022/title-43/section-43-1088/" + ) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_to_qualifying_foster_care_organizations.py b/fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_to_qualifying_foster_care_organizations.py new file mode 100644 index 000000000..15c9ad444 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/credits/charitable_contribution/az_charitable_contributions_to_qualifying_foster_care_organizations.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class az_charitable_contributions_to_qualifying_foster_care_organizations( + Variable +): + value_type = float + entity = TaxUnit + label = "Charitable contributions to qualifying foster care organizations in Arizona" + definition_period = YEAR + defined_for = StateCode.AZ + reference = ( + "https://law.justia.com/codes/arizona/2022/title-43/section-43-1088/" + ) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/credits/dependent_credit/az_dependent_tax_credit.py b/fiscalsim_us/variables/gov/states/az/tax/income/credits/dependent_credit/az_dependent_tax_credit.py new file mode 100644 index 000000000..3706b9feb --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/credits/dependent_credit/az_dependent_tax_credit.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class az_dependent_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "Arizona dependent tax credit" + unit = USD + documentation = "https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01073-01.htm" + definition_period = YEAR + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + person = tax_unit.members + p = parameters( + period + ).gov.states.az.tax.income.credits.dependent_credit + dependent = person("is_tax_unit_dependent", period) + age = person("age", period) + dependent_amount = p.amount.calc(age) * dependent + amount = tax_unit.sum(dependent_amount) + income = tax_unit("adjusted_gross_income", period) + filing_status = tax_unit("filing_status", period) + reduction_start = p.reduction.start[filing_status] + excess = max_(income - reduction_start, 0) + increments = np.ceil(excess / p.reduction.increment) + reduction_percentage = min_(increments * p.reduction.percentage, 1) + return amount * (1 - reduction_percentage) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_agi.py b/fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_agi.py new file mode 100644 index 000000000..3e33b1640 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_agi.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class az_agi(Variable): + value_type = float + entity = TaxUnit + label = "Arizona adjusted gross income" + unit = USD + definition_period = YEAR + defined_for = StateCode.AZ diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit.py b/fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit.py new file mode 100644 index 000000000..d7d5ff7b5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class az_family_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "Arizona Family Tax Credit" + unit = USD + definition_period = YEAR + defined_for = "az_family_tax_credit_eligible" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.az.tax.income.credits.family_tax_credits.amount + filing_status = tax_unit("filing_status", period) + + amount = p.per_person * tax_unit("tax_unit_size", period) + return min_(amount, p.cap[filing_status]) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit_eligible.py b/fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit_eligible.py new file mode 100644 index 000000000..139c282af --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/credits/family_tax_credit/az_family_tax_credit_eligible.py @@ -0,0 +1,35 @@ +from fiscalsim_us.model_api import * + + +class az_family_tax_credit_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Arizona Family Tax Credit" + definition_period = YEAR + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.az.tax.income.credits.family_tax_credits + income = tax_unit("az_agi", period) + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + dependents = tax_unit("tax_unit_dependents", period) + income_limit = select( + [ + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.HEAD_OF_HOUSEHOLD, + filing_status == status.SEPARATE, + filing_status == status.WIDOW, + ], + [ + p.income_limit.single, + p.income_limit.joint.calc(dependents), + p.income_limit.head_of_household.calc(dependents), + p.income_limit.separate, + p.income_limit.widow.calc(dependents), + ], + ) + return income <= income_limit diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/deductions/itemized/az_itemized_deductions.py b/fiscalsim_us/variables/gov/states/az/tax/income/deductions/itemized/az_itemized_deductions.py new file mode 100644 index 000000000..b60a24e3c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/deductions/itemized/az_itemized_deductions.py @@ -0,0 +1,64 @@ +from fiscalsim_us.model_api import * + + +class az_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Arizona Itemized Deductions" + unit = USD + documentation = "Arizona Form 140 Schedule A" + definition_period = YEAR + defined_for = StateCode.AZ + reference = ( + "https://law.justia.com/codes/arizona/2022/title-43/section-43-1042/", + "https://azdor.gov/forms/individual/itemized-deduction-adjustments-form", + "https://azdor.gov/forms/individual/form-140-resident-personal-income-tax-form-calculating", + ) + definition_period = YEAR + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.irs.deductions + deductions = [ + deduction + for deduction in p.itemized_deductions + if deduction + not in [ + "salt_deduction", + "medical_expense_deduction", + "charitable_deduction", + ] + ] + federal_deductions = add(tax_unit, period, deductions) + # Arizona allows a deduction for medical and dental expenses + # that cannot be deducted from federal income taxes. + medical_expense = add(tax_unit, period, ["medical_expense"]) + medical_expense_deduction = tax_unit( + "medical_expense_deduction", period + ) + + az_medical_expense_deduction = max_( + 0, medical_expense - medical_expense_deduction + ) + + # Adjustments to Charitable Contributions + # Amount of charitable contributions for which you are claiming + # a credit under Arizona law. + charitable_deduction = tax_unit("charitable_deduction", period) + charitable_contributions_credit = tax_unit( + "az_charitable_contributions_credit", period + ) + + charitable_deduction_after_credit = max_( + charitable_deduction - charitable_contributions_credit, 0 + ) + + # Adjustment to State Income Taxes - add back real estate taxes + real_estate_taxes = add(tax_unit, period, ["real_estate_taxes"]) + + return ( + federal_deductions + + az_medical_expense_deduction + + charitable_deduction_after_credit + + real_estate_taxes + ) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_base_standard_deduction.py b/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_base_standard_deduction.py new file mode 100644 index 000000000..1104d282f --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_base_standard_deduction.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class az_base_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Arizona base standard deduction" + unit = USD + documentation = "https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01041.htm" + definition_period = YEAR + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.az.tax.income.deductions.standard + filing_status = tax_unit("filing_status", period) + return p.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_increased_standard_deduction_for_charitable_contributions.py b/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_increased_standard_deduction_for_charitable_contributions.py new file mode 100644 index 000000000..0f500203b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_increased_standard_deduction_for_charitable_contributions.py @@ -0,0 +1,24 @@ +from fiscalsim_us.model_api import * + + +class az_increased_standard_deduction_for_charitable_contributions(Variable): + value_type = float + entity = TaxUnit + label = "Arizona increased standard deduction for charitable contributions" + unit = USD + documentation = "https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01041.htm" + definition_period = YEAR + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.az.tax.income.deductions.standard.increased + charitable_deduction = tax_unit("charitable_deduction", period) + charitable_contributions_credit = tax_unit( + "az_charitable_contributions_credit", period + ) + charitable_deduction_after_credit = max_( + charitable_deduction - charitable_contributions_credit, 0 + ) + return p.rate * charitable_deduction_after_credit diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_standard_deduction.py b/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_standard_deduction.py index 0af46083e..a1f8a3626 100644 --- a/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_standard_deduction.py +++ b/fiscalsim_us/variables/gov/states/az/tax/income/deductions/standard/az_standard_deduction.py @@ -1,16 +1,16 @@ -from fiscalsim_us.model_api import * - - -class az_standard_deduction(Variable): - value_type = float - entity = TaxUnit - label = "Arizona standard deduction" - unit = USD - documentation = "https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01041.htm" - definition_period = YEAR - defined_for = StateCode.AZ - - def formula(tax_unit, period, parameters): - p = parameters(period).gov.states.az.tax.income.deductions.standard - filing_status = tax_unit("filing_status", period) - return p.amount[filing_status] +from fiscalsim_us.model_api import * + + +class az_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Arizona standard deduction" + unit = USD + documentation = "https://www.azleg.gov/viewdocument/?docName=https://www.azleg.gov/ars/43/01041.htm" + definition_period = YEAR + defined_for = StateCode.AZ + + adds = [ + "az_base_standard_deduction", + "az_increased_standard_deduction_for_charitable_contributions", + ] diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/subtractions/az_public_pension_exclusion.py b/fiscalsim_us/variables/gov/states/az/tax/income/subtractions/az_public_pension_exclusion.py new file mode 100644 index 000000000..a91133c0d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/subtractions/az_public_pension_exclusion.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class az_public_pension_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "Arizona Pension Exclusion" + unit = USD + definition_period = YEAR + reference = ( + "https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140BOOKLET.pdf#page=18" + "https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2021_140BOOKLET.pdf#page=23" + "https://www.azleg.gov/ars/43/01022.htm" + ) + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.az.tax.income.subtractions.pension + person = tax_unit.members + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + pension_income = person("taxable_public_pension_income", period) + eligible_pension_income = pension_income * (is_head | is_spouse) + total_allowed_pension_exclusion = min_( + p.public_pension_cap, eligible_pension_income + ) + return tax_unit.sum(total_allowed_pension_exclusion) diff --git a/fiscalsim_us/variables/gov/states/az/tax/income/subtractions/capital_gains/az_long_term_capital_gains_subtraction.py b/fiscalsim_us/variables/gov/states/az/tax/income/subtractions/capital_gains/az_long_term_capital_gains_subtraction.py new file mode 100644 index 000000000..510cc931c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/az/tax/income/subtractions/capital_gains/az_long_term_capital_gains_subtraction.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class az_long_term_capital_gains_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Arizona long-term capital gains subtraction" + unit = USD + documentation = "https://azdor.gov/sites/default/files/2023-03/FORMS_INDIVIDUAL_2022_140i.pdf#page=31" + definition_period = YEAR + defined_for = StateCode.AZ + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.az.tax.income.subtractions.capital_gains + + long_term_capital_gains = add( + tax_unit, period, ["long_term_capital_gains"] + ) + + return long_term_capital_gains * p.rate diff --git a/fiscalsim_us/variables/gov/states/ca/tax/income/deductions/itemized/ca_itemized_deductions.py b/fiscalsim_us/variables/gov/states/ca/tax/income/deductions/itemized/ca_itemized_deductions.py index 24e8fa7c2..2f993f160 100644 --- a/fiscalsim_us/variables/gov/states/ca/tax/income/deductions/itemized/ca_itemized_deductions.py +++ b/fiscalsim_us/variables/gov/states/ca/tax/income/deductions/itemized/ca_itemized_deductions.py @@ -1,42 +1,36 @@ -from fiscalsim_us.model_api import * - - -class ca_itemized_deductions(Variable): - value_type = float - entity = TaxUnit - label = "California itemized deductions" - unit = USD - definition_period = YEAR - reference = ( - "https://www.ftb.ca.gov/forms/2021/2021-540-ca-instructions.html" - "https://www.ftb.ca.gov/forms/2022/2022-540-ca-instructions.html" - ) - defined_for = StateCode.CA - - def formula(tax_unit, period, parameters): - # compute itemized deduction maximum - p = parameters(period).gov.irs.deductions - itm_deds = [ - deduction - for deduction in p.itemized_deductions - if deduction not in ["salt_deduction"] - ] - itm_deds_less_salt = add(tax_unit, period, itm_deds) - uncapped_property_taxes = add(tax_unit, period, ["real_estate_taxes"]) - itm_deds_max = itm_deds_less_salt + uncapped_property_taxes - # compute high-AGI limit on itemized deductions - p = parameters(period).gov.states.ca.tax.income.deductions.itemized - # ... determine part of itemized deductions subject to limit - excluded_itm_deds = add(tax_unit, period, p.limit.excluded_deductions) - included_itm_deds = p.limit.ded_fraction * max_( - 0, itm_deds_max - excluded_itm_deds - ) - # ... determine limit amount - agi = tax_unit("adjusted_gross_income", period) - filing_status = tax_unit("filing_status", period) - agi_limit = p.limit.agi_fraction * max_( - 0, agi - p.limit.agi_threshold[filing_status] - ) - limit_amount = min_(included_itm_deds, agi_limit) - # return limited itemized deductions - return max_(0, itm_deds_max - limit_amount) +from fiscalsim_us.model_api import * + + +class ca_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "California itemized deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://www.ftb.ca.gov/forms/2021/2021-540-ca-instructions.html" + "https://www.ftb.ca.gov/forms/2022/2022-540-ca-instructions.html" + ) + defined_for = StateCode.CA + + def formula(tax_unit, period, parameters): + # compute itemized deduction maximum + itm_deds_less_salt = tax_unit("itemized_deductions_less_salt", period) + uncapped_property_taxes = add(tax_unit, period, ["real_estate_taxes"]) + itm_deds_max = itm_deds_less_salt + uncapped_property_taxes + # compute high-AGI limit on itemized deductions + p = parameters(period).gov.states.ca.tax.income.deductions.itemized + # ... determine part of itemized deductions subject to limit + excluded_itm_deds = add(tax_unit, period, p.limit.excluded_deductions) + included_itm_deds = p.limit.ded_fraction * max_( + 0, itm_deds_max - excluded_itm_deds + ) + # ... determine limit amount + agi = tax_unit("adjusted_gross_income", period) + filing_status = tax_unit("filing_status", period) + agi_limit = p.limit.agi_fraction * max_( + 0, agi - p.limit.agi_threshold[filing_status] + ) + limit_amount = min_(included_itm_deds, agi_limit) + # return limited itemized deductions + return max_(0, itm_deds_max - limit_amount) diff --git a/fiscalsim_us/variables/gov/states/ca/tax/income/exemptions/ca_exemptions.py b/fiscalsim_us/variables/gov/states/ca/tax/income/exemptions/ca_exemptions.py index 8322471cc..1a4096974 100644 --- a/fiscalsim_us/variables/gov/states/ca/tax/income/exemptions/ca_exemptions.py +++ b/fiscalsim_us/variables/gov/states/ca/tax/income/exemptions/ca_exemptions.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class ca_exemptions(Variable): diff --git a/fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp.py b/fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp.py new file mode 100644 index 000000000..293f7855a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class co_chp(Variable): + value_type = float + entity = Person + label = "Colorado Child Health Plan Plus expense savings" + definition_period = YEAR + defined_for = StateCode.CO + + def formula(person, period, parameters): + saving = 0 + income_level = person("medicaid_income_level", period) + is_pregnant = person("is_pregnant", period) + p = parameters(period).gov.states.co.hcpf.chp + elements = p.expenses + for element in elements: + copay = ~is_pregnant * p.copays[element].calc(income_level) + expense = person(element + "_expense", period) + saving += max_(0, expense - copay) + return saving diff --git a/fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp_eligible.py b/fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp_eligible.py new file mode 100644 index 000000000..7f0f888fd --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp_eligible.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class co_chp_eligible(Variable): + value_type = bool + entity = Person + label = "Colorado Child Health Plan Plus eligibility" + definition_period = YEAR + defined_for = StateCode.CO + + def formula(person, period, parameters): + medicaid_eligible = person("is_medicaid_eligible", period) + income_level = person("medicaid_income_level", period) + p = parameters(period).gov.states.co.hcpf.chp + in_income_range = income_level <= p.income_limit + age = person("age", period) + is_child = p.child.calc(age) + is_pregnant = person("is_pregnant", period) + is_age_eligible = is_pregnant | is_child + return ~medicaid_eligible & is_age_eligible & in_income_range diff --git a/fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp_out_of_pocket_maximum.py b/fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp_out_of_pocket_maximum.py new file mode 100644 index 000000000..0f43e626e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/hcpf/chp/co_chp_out_of_pocket_maximum.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class co_chp_out_of_pocket_maximum(Variable): + value_type = float + entity = Person + label = "Colorado Child Health Plan Plus out of pocket maximum" + definition_period = YEAR + + def formula(person, period, parameters): + income = person.tax_unit("medicaid_income", period) + percent = parameters(period).gov.states.co.hcpf.chp.out_of_pocket + return income * percent diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_additions.py b/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_additions.py new file mode 100644 index 000000000..394cbedce --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_additions.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class co_additions(Variable): + value_type = float + entity = TaxUnit + label = "Colorado additions to federal taxable income" + unit = USD + definition_period = YEAR + reference = ( + # C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3) + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-until-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal", + # 2022 Colorado Individual Income Tax Filing Guide - Additions + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5", + # 2021 Colorado Individual Income Tax Filing Guide - Additions + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=5", + # Individual Income Tax Guide - Part 3 Additions to Taxable Income + "https://tax.colorado.gov/individual-income-tax-guide", + ) + defined_for = StateCode.CO + adds = "gov.states.co.tax.income.additions.additions" diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py b/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py new file mode 100644 index 000000000..d4ca2cd45 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class co_state_addback(Variable): + value_type = float + entity = TaxUnit + label = "Colorado state income tax addback" + unit = USD + definition_period = YEAR + reference = ( + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=5" + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5" + ) + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + federal_itemizer = tax_unit("tax_unit_itemizes", period) + state_inctax = max_(0, tax_unit("state_income_tax", period)) + property_taxes = add(tax_unit, period, ["real_estate_taxes"]) + # follow worksheet on page 5 of 2021 Book cited above: + irs_schA_line_5d = state_inctax + property_taxes + irs_schA_line_5e = tax_unit("salt_deduction", period) + ws_line_a = where( + irs_schA_line_5d > irs_schA_line_5e, + max_(0, irs_schA_line_5e - property_taxes), + state_inctax, + ) + p = parameters(period).gov.irs.deductions + ws_line_b = add(tax_unit, period, p.itemized_deductions) + ws_line_c = tax_unit("standard_deduction", period) + ws_line_d = max_(0, ws_line_b - ws_line_c) + return federal_itemizer * min_(ws_line_a, ws_line_d) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/additions/federal_deductions/co_federal_deduction_addback.py b/fiscalsim_us/variables/gov/states/co/tax/income/additions/federal_deductions/co_federal_deduction_addback.py new file mode 100644 index 000000000..40f9326ec --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/additions/federal_deductions/co_federal_deduction_addback.py @@ -0,0 +1,30 @@ +from fiscalsim_us.model_api import * + + +class co_federal_deduction_addback(Variable): + value_type = float + entity = TaxUnit + label = "Colorado federal deductions addback" + unit = USD + definition_period = YEAR + reference = ( + # C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3)(p) + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-upon-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal", + # 2022 Colorado Individual Income Tax Filing Guide - Additions - Line 4 + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5", + # Individual Income Tax Guide - Part 3 Additions to Taxable Income - Federal itemized or standard deductions + "https://tax.colorado.gov/individual-income-tax-guide", + ) + defined_for = "co_federal_deduction_addback_required" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.co.tax.income.additions.federal_deductions + if p.itemized_only: + deductions = tax_unit("itemized_taxable_income_deductions", period) + else: + deductions = tax_unit("taxable_income_deductions", period) + filing_status = tax_unit("filing_status", period) + exemption = p.exemption[filing_status] + return max_(deductions - exemption, 0) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/additions/federal_deductions/co_federal_deduction_addback_required.py b/fiscalsim_us/variables/gov/states/co/tax/income/additions/federal_deductions/co_federal_deduction_addback_required.py new file mode 100644 index 000000000..96b56a159 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/additions/federal_deductions/co_federal_deduction_addback_required.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class co_federal_deduction_addback_required(Variable): + value_type = bool + entity = TaxUnit + label = "Required to add back the Colorado federal deductions" + definition_period = YEAR + reference = ( + # C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3)(p) + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-upon-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal", + # 2022 Colorado Individual Income Tax Filing Guide - Additions - Line 4 + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5", + # Individual Income Tax Guide - Part 3 Additions to Taxable Income - Federal itemized or standard deductions + "https://tax.colorado.gov/individual-income-tax-guide", + ) + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.co.tax.income.additions.federal_deductions + income_test = ( + tax_unit("adjusted_gross_income", period) > p.agi_threshold + ) + if p.itemized_only: + return income_test & tax_unit("tax_unit_itemizes", period) + return income_test diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback.py b/fiscalsim_us/variables/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback.py new file mode 100644 index 000000000..c7a9943fb --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class co_qualified_business_income_deduction_addback(Variable): + value_type = float + entity = TaxUnit + label = "Colorado qualified business income deduction addback" + unit = USD + definition_period = YEAR + reference = ( + # C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3) (o) + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-until-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal", + # 2022 Colorado Individual Income Tax Filing Guide - Additions + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5", + # 2021 Colorado Individual Income Tax Filing Guide - Additions + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=5", + # Individual Income Tax Guide - Part 3 Additions to Taxable Income + "https://tax.colorado.gov/individual-income-tax-guide", + ) + defined_for = "co_qualified_business_income_deduction_addback_required" + + adds = ["qualified_business_income_deduction"] diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback_required.py b/fiscalsim_us/variables/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback_required.py new file mode 100644 index 000000000..adeb0f337 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/additions/qualified_business_income_deduction/co_qualified_business_income_deduction_addback_required.py @@ -0,0 +1,29 @@ +from fiscalsim_us.model_api import * + + +class co_qualified_business_income_deduction_addback_required(Variable): + value_type = bool + entity = TaxUnit + label = ( + "Required to add back the Colorado qualified business income deduction" + ) + definition_period = YEAR + reference = ( + # C.R.S. 39-22-104 . Income tax imposed on individuals, estates, and trusts - section (3) (o) + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-104-effective-until-official-proclamation-by-governor-income-tax-imposed-on-individuals-estates-and-trusts-single-rate-report-legislative-declaration-definitions-repeal", + # 2022 Colorado Individual Income Tax Filing Guide - Additions + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5", + # 2021 Colorado Individual Income Tax Filing Guide - Additions + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=5", + # Individual Income Tax Guide - Part 3 Additions to Taxable Income + "https://tax.colorado.gov/individual-income-tax-guide", + ) + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + agi = tax_unit("adjusted_gross_income", period) + p = parameters( + period + ).gov.states.co.tax.income.additions.qualified_business_income_deduction + return agi > p.agi_threshold[filing_status] diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax.py b/fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax.py new file mode 100644 index 000000000..4a23d1f21 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class co_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Colorado income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.CO + + adds = ["co_income_tax_before_refundable_credits"] + subtracts = ["co_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax_before_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax_before_non_refundable_credits.py new file mode 100644 index 000000000..e97dc67e7 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax_before_non_refundable_credits.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class co_income_tax_before_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Colorado income tax before non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + income = tax_unit("co_taxable_income", period) + rate = parameters(period).gov.states.co.tax.income.rate + return income * rate diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..ce2c28296 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/co_income_tax_before_refundable_credits.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class co_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Colorado income tax before refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + before_non_refundable_credits = tax_unit( + "co_income_tax_before_non_refundable_credits", period + ) + non_refundable_credits = tax_unit("co_non_refundable_credits", period) + return max_(before_non_refundable_credits - non_refundable_credits, 0) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/co_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/co/tax/income/co_non_refundable_credits.py new file mode 100644 index 000000000..6c372fdc0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/co_non_refundable_credits.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class co_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Colorado non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.CO + + +# Colorado non refundable credits currently not modeled in PolicyEngine diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/co_refundable_credits.py b/fiscalsim_us/variables/gov/states/co/tax/income/co_refundable_credits.py new file mode 100644 index 000000000..2437417ae --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/co_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class co_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Colorado refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.CO + + adds = "gov.states.co.tax.income.credits.refundable" diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/co_taxable_income.py b/fiscalsim_us/variables/gov/states/co/tax/income/co_taxable_income.py new file mode 100644 index 000000000..5cf7ae1ef --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/co_taxable_income.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class co_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Colorado taxable income" + unit = USD + definition_period = YEAR + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + fed_taxinc = tax_unit("taxable_income", period) + additions = tax_unit("co_additions", period) + subtractions = tax_unit("co_subtractions", period) + return max_(0, fed_taxinc + additions - subtractions) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_cdcc.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_cdcc.py new file mode 100644 index 000000000..86fedb28a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_cdcc.py @@ -0,0 +1,24 @@ +from fiscalsim_us.model_api import * + + +class co_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "Colorado Child Care Expenses Credit" + unit = USD + documentation = ( + "https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=d14880b7-7410-4295-bcf1-2e099e57d8f3&pdistocdocslideraccess=true&config=014FJAAyNGJkY2Y4Zi1mNjgyLTRkN2YtYmE4OS03NTYzNzYzOTg0OGEKAFBvZENhdGFsb2d592qv2Kywlf8caKqYROP5&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65HV-06G3-CGX8-050B-00008-00&pdcomponentid=234177&pdtocnodeidentifier=ABPAACAACAABAACABA&ecomp=k2vckkk&prid=e2e32763-f8fa-4832-8191-f70124d877f6" + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=46" + ) + definition_period = YEAR + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + # follow 2022 DR 0347 form and its instructions (in Book cited above): + p = parameters(period).gov.states.co.tax.income.credits + fed_agi = tax_unit("adjusted_gross_income", period) # Line 4 + # calculate regular Colorado CDCC in Part III + capped_fed_cdcc = tax_unit("capped_cdcc", period) # Line 8 + match_rate = p.cdcc.match.calc(fed_agi, right=True) + return capped_fed_cdcc * match_rate # Line 9 + # calculate low-income Colorado CDCC in Part IV in co_low_income_cdcc diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.py new file mode 100644 index 000000000..fa3862198 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc.py @@ -0,0 +1,35 @@ +from fiscalsim_us.model_api import * + + +class co_low_income_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "Colorado Low-income Child Care Expenses Credit" + unit = USD + documentation = ( + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-1195-child-care-expenses-tax-credit-legislative-declaration-definitions" + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=46" + ) + definition_period = YEAR + defined_for = "co_low_income_cdcc_eligible" + + def formula(tax_unit, period, parameters): + # follow 2022 DR 0347 form and its instructions (in Book cited above): + p = parameters(period).gov.states.co.tax.income.credits + # estimate care expenses for just children + care_expenses = tax_unit("tax_unit_childcare_expenses", period) + age = tax_unit.members("age", period) + eligible_kid = age < p.cdcc.low_income.child_age_threshold + eligible_kids = tax_unit.sum(eligible_kid) + total_eligibles = tax_unit("count_cdcc_eligible", period) + eligible_kid_ratio = np.zeros_like(total_eligibles) + mask = total_eligibles > 0 + eligible_kid_ratio[mask] = eligible_kids[mask] / total_eligibles[mask] + kid_expenses = care_expenses * eligible_kid_ratio + capped_kid_expenses = min_( # Line 3 + kid_expenses, tax_unit("min_head_spouse_earned", period) + ) + # calculate capped credit amount + credit = p.cdcc.low_income.rate * capped_kid_expenses # Line 11 + cap = p.cdcc.low_income.max_amount.calc(eligible_kids) # Table A + return min_(credit, cap) # Line 12 diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc_eligible.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc_eligible.py new file mode 100644 index 000000000..ad40a9a2a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/cdcc/co_low_income_cdcc_eligible.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class co_low_income_cdcc_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Colorado Low-income Child Care Expenses Credit" + documentation = ( + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-1195-child-care-expenses-tax-credit-legislative-declaration-definitions" + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=46" + ) + definition_period = YEAR + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + no_fed_cdcc = tax_unit("capped_cdcc", period) <= 0 + p = parameters(period).gov.states.co.tax.income.credits + fed_agi = tax_unit("adjusted_gross_income", period) + agi_eligible = fed_agi <= p.cdcc.low_income.federal_agi_threshold + return no_fed_cdcc & agi_eligible diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc.py new file mode 100644 index 000000000..da2d686c5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc.py @@ -0,0 +1,70 @@ +from fiscalsim_us.model_api import * + + +class co_ctc(Variable): + value_type = float + entity = TaxUnit + label = "Colorado child tax credit" + unit = USD + definition_period = YEAR + reference = ( + # C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-129-child-tax-credit-legislative-declaration-definitions-repeal", + # 2022 Colorado Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1", + # Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16", + ) + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.co.tax.income.credits.ctc + filing_status = tax_unit("filing_status", period) + statuses = filing_status.possible_values + person = tax_unit.members + # Depending on the year, Colorado has based its CTC on AGI, the federal CTC, and eligible children. + agi = tax_unit("adjusted_gross_income", period) + if p.ctc_matched_federal_credit: + federal_ctc = tax_unit("co_federal_ctc", period) + rate = select( + [ + filing_status == statuses.SINGLE, + filing_status == statuses.JOINT, + filing_status == statuses.SEPARATE, + filing_status == statuses.WIDOW, + filing_status == statuses.HEAD_OF_HOUSEHOLD, + ], + [ + p.rate.single.calc(agi, right=True), + p.rate.joint.calc(agi, right=True), + p.rate.separate.calc(agi, right=True), + p.rate.widow.calc(agi, right=True), + p.rate.head_of_household.calc(agi, right=True), + ], + ) + return rate * federal_ctc + else: + person = tax_unit.members + child_age_eligible = person("age", period) < p.age_threshold + + eligible_child = ( + person("co_ctc_eligible_child", period) & child_age_eligible + ) + eligible_children = tax_unit.sum(eligible_child) + amount_per_child = select( + [ + filing_status == statuses.SINGLE, + filing_status == statuses.JOINT, + filing_status == statuses.SEPARATE, + filing_status == statuses.WIDOW, + filing_status == statuses.HEAD_OF_HOUSEHOLD, + ], + [ + p.amount.single.calc(agi, right=True), + p.amount.joint.calc(agi, right=True), + p.amount.separate.calc(agi, right=True), + p.amount.widow.calc(agi, right=True), + p.amount.head_of_household.calc(agi, right=True), + ], + ) + return amount_per_child * eligible_children diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_child.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_child.py new file mode 100644 index 000000000..ef9d05509 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_child.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class co_ctc_eligible_child(Variable): + value_type = bool + entity = Person + label = "Colorado child tax credit eligible child" + definition_period = YEAR + reference = ( + "https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=2", + ) + defined_for = StateCode.CO + + adds = "gov.states.co.tax.income.credits.ctc.eligible_child" diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_children_count.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_children_count.py new file mode 100644 index 000000000..b09d4fd63 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/co_ctc_eligible_children_count.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class co_ctc_eligible_children_count(Variable): + value_type = int + entity = TaxUnit + label = "Colorado child tax credit eligible children count" + definition_period = YEAR + reference = ( + "https://leg.colorado.gov/sites/default/files/2023a_1112_signed.pdf#page=2", + ) + defined_for = StateCode.CO + + adds = ["co_ctc_eligible_child"] diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc.py new file mode 100644 index 000000000..935ad38b0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class co_federal_ctc(Variable): + value_type = float + entity = TaxUnit + label = "Child Tax Credit replicated to include the Colorado limitations" + unit = USD + documentation = "Total value of the non-refundable and refundable portion of the Child Tax Credit." + definition_period = YEAR + reference = ( + # C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-129-child-tax-credit-legislative-declaration-definitions-repeal", + # 2022 Colorado Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1", + # Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16", + ) + defined_for = StateCode.CO + + adds = ["co_refundable_ctc", "co_non_refundable_ctc"] diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_child_individual_maximum.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_child_individual_maximum.py new file mode 100644 index 000000000..080188c1b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_child_individual_maximum.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class co_federal_ctc_child_individual_maximum(Variable): + value_type = float + entity = Person + label = "CTC maximum amount (child) replicated to account for the Colorado state CTC child eligibility" + unit = USD + documentation = "The CTC entitlement in respect of this person as a child." + definition_period = YEAR + reference = ( + # C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-129-child-tax-credit-legislative-declaration-definitions-repeal", + # 2022 Colorado Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1", + # Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16", + ) + defined_for = StateCode.CO + + def formula(person, period, parameters): + age = person("age", period) + base_amount = parameters(period).gov.irs.credits.ctc.amount.base + is_dependent = person("is_tax_unit_dependent", period) + p = parameters(period).gov.states.co.tax.income.credits.ctc + eligible = is_dependent & (age < p.age_threshold) + return base_amount.calc(age) * eligible diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_maximum.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_maximum.py new file mode 100644 index 000000000..8b0ab6fd3 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_federal_ctc_maximum.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class co_federal_ctc_maximum(Variable): + value_type = float + entity = TaxUnit + label = "Maximum CTC replicated to include the Colorado limitations" + unit = USD + documentation = "Maximum value of the Child Tax Credit, before phase-out." + definition_period = YEAR + reference = ( + # C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-129-child-tax-credit-legislative-declaration-definitions-repeal", + # 2022 Colorado Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1", + # Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16", + ) + defined_for = StateCode.CO + + adds = ["co_federal_ctc_child_individual_maximum"] diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_non_refundable_ctc.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_non_refundable_ctc.py new file mode 100644 index 000000000..03d660a39 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_non_refundable_ctc.py @@ -0,0 +1,29 @@ +from fiscalsim_us.model_api import * + + +class co_non_refundable_ctc(Variable): + value_type = float + entity = TaxUnit + label = "Non-refundable Child Tax Credit replicated to include the Colorado limitations" + unit = USD + documentation = ( + "Total value of the non-refundable portion of the Child Tax Credit." + ) + definition_period = YEAR + reference = ( + # C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-129-child-tax-credit-legislative-declaration-definitions-repeal", + # 2022 Colorado Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1", + # Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16", + ) + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + # follow 2022 DR 0104CN form and its instructions (in Book cited above): + maximum = tax_unit("co_federal_ctc_maximum", period) # Line 3 + limiting_tax_liability = tax_unit( + "ctc_limiting_tax_liability", period + ) # Line 4 - 6 + return min_(maximum, limiting_tax_liability) # Line 7 diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_refundable_ctc.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_refundable_ctc.py new file mode 100644 index 000000000..e2fb9af5b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/ctc/federal_ctc/co_refundable_ctc.py @@ -0,0 +1,64 @@ +from fiscalsim_us.model_api import * + + +class co_refundable_ctc(Variable): + value_type = float + entity = TaxUnit + label = "Refundable Child Tax Credit replicated to include the Colorado limitations" + unit = USD + documentation = ( + "Total value of the refundable portions of the Child Tax Credit." + ) + definition_period = YEAR + reference = ( + # C.R.S. 39-22-129. Child tax credit - legislative declaration - definitions. + "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/specific-taxes/income-tax/article-22-income-tax/part-1-general/section-39-22-129-child-tax-credit-legislative-declaration-definitions-repeal", + # 2022 Colorado Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_0104CN_2022.pdf#page=1", + # Colorado Individual Income Tax Filing Guide - Instructions for Select Credits from the DR 0104CR - Line 1 Child Tax Credit + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=16", + ) + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + # follow 2022 DR 0104CN form and its instructions (in Book cited above): + adjusted_fed_ctc = tax_unit("co_non_refundable_ctc", period) # Line 7 + max_child_amount = tax_unit("co_federal_ctc_maximum", period) + credit_excess_over_tax = max_( + 0, adjusted_fed_ctc - max_child_amount + ) # Line 8 + p = parameters(period).gov.irs.credits.ctc + statutory_cap = p.refundable.individual_max # Line 9 + children = tax_unit("co_ctc_eligible_children_count", period) + total_statutory_cap = min_( + statutory_cap * children, credit_excess_over_tax + ) # Line 10 + earnings = tax_unit("tax_unit_earned_income", period) # Line 11 + earnings_over_threshold = max_( + 0, earnings - p.refundable.phase_in.threshold + ) # Line 12 + relevant_earnings = ( + earnings_over_threshold * p.refundable.phase_in.rate + ) # Line 13 + SS_ADD_VARIABLES = [ + # Person: + "employee_social_security_tax", + "employee_medicare_tax", + "unreported_payroll_tax", + # Tax unit: + "self_employment_tax_ald", + "additional_medicare_tax", + ] + SS_SUBTRACT_VARIABLES = ["excess_payroll_tax_withheld"] + social_security_tax = add(tax_unit, period, SS_ADD_VARIABLES) - add( + tax_unit, period, SS_SUBTRACT_VARIABLES + ) # Line 14 - 16 + eitc = tax_unit("eitc", period) # Line 17a + social_security_excess = max_(0, social_security_tax - eitc) # Line 18 + tax_increase = where( + children + < p.refundable.phase_in.min_children_for_ss_taxes_minus_eitc, + relevant_earnings, + max_(relevant_earnings, social_security_excess), + ) # Line 19 + return min_(total_statutory_cap, tax_increase) # Line 20 diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/eitc/co_eitc.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/eitc/co_eitc.py index c472a37df..403c8c31e 100644 --- a/fiscalsim_us/variables/gov/states/co/tax/income/credits/eitc/co_eitc.py +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/eitc/co_eitc.py @@ -1,19 +1,16 @@ -from fiscalsim_us.model_api import * - - -class co_eitc(Variable): - value_type = float - entity = TaxUnit - label = "Colorado EITC" - unit = USD - definition_period = YEAR - reference = "https://leg.colorado.gov/sites/default/files/te19_colorado_earned_income_tax_credit.pdf" - defined_for = StateCode.CO - - def formula(tax_unit, period, parameters): - federal_eitc = tax_unit("earned_income_tax_credit", period) - eligible = tax_unit("eitc_eligible", period) - match_percent = parameters( - period - ).gov.states.co.tax.income.credits.eitc.match - return where(eligible, federal_eitc * match_percent, 0) +from fiscalsim_us.model_api import * + + +class co_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Colorado EITC" + unit = USD + definition_period = YEAR + reference = "https://leg.colorado.gov/sites/default/files/te19_colorado_earned_income_tax_credit.pdf" + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + federal_eitc = tax_unit("earned_income_tax_credit", period) + p = parameters(period).gov.states.co.tax.income.credits + return federal_eitc * p.eitc.match diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_credit.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_credit.py new file mode 100644 index 000000000..99573119d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_credit.py @@ -0,0 +1,29 @@ +from fiscalsim_us.model_api import * + + +class co_income_qualified_senior_housing_credit(Variable): + value_type = float + entity = TaxUnit + label = "Colorado Income Qualified Senior Housing Income Tax Credit" + unit = USD + definition_period = YEAR + reference = ( + "https://tax.colorado.gov/income-qualified-senior-housing-income-tax-credit", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=17", + ) + defined_for = "co_income_qualified_senior_housing_credit_eligible" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.co.tax.income.credits.income_qualified_senior_housing + filing_status = tax_unit("filing_status", period) + agi = tax_unit("adjusted_gross_income", period) + max_amount = p.reduction.max_amount[filing_status] + reduction_start = p.reduction.start + increment = p.reduction.increment + reduction_amount = p.reduction.amount[filing_status] + excess = max_(agi - reduction_start, 0) + increments = np.ceil(excess / increment) + total_reduction_amount = increments * reduction_amount + return max_(max_amount - total_reduction_amount, 0) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_eligible.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_eligible.py new file mode 100644 index 000000000..59918b0fc --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/income_qualified_senior_housing/co_income_qualified_senior_housing_eligible.py @@ -0,0 +1,35 @@ +from fiscalsim_us.model_api import * + + +class co_income_qualified_senior_housing_credit_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for Colorado Income Qualified Senior Housing Income Tax Credit" + definition_period = YEAR + reference = ( + "https://tax.colorado.gov/income-qualified-senior-housing-income-tax-credit", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=17", + ) + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.co.tax.income.credits.income_qualified_senior_housing + + age_head = tax_unit("age_head", period) + age_spouse = tax_unit("age_spouse", period) + + head_eligible = age_head >= p.age_limit + spouse_eligible = age_spouse >= p.age_limit + age_eligible = head_eligible | spouse_eligible + + agi = tax_unit("adjusted_gross_income", period) + max_income = p.income_threshold + agi_eligible = agi <= max_income + + property_tax_exemption_claimed = ( + tax_unit("co_property_tax_exemption", period) > 0 + ) + + return age_eligible & agi_eligible & ~property_tax_exemption_claimed diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_modified_agi.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_modified_agi.py new file mode 100644 index 000000000..57cd83e33 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_modified_agi.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class co_modified_agi(Variable): + value_type = float + entity = TaxUnit + label = "Colorado modified adjusted gross income for the sales tax refund" + unit = USD + definition_period = YEAR + reference = "https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=23" + defined_for = StateCode.CO + + adds = "gov.states.co.tax.income.credits.sales_tax_refund.magi_sources" diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund.py new file mode 100644 index 000000000..e098d5c33 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class co_sales_tax_refund(Variable): + value_type = float + entity = TaxUnit + label = "Colorado sales tax refund" + unit = USD + definition_period = YEAR + reference = "https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=23" + defined_for = "co_sales_tax_refund_eligible" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.co.tax.income.credits.sales_tax_refund.amount + filing_status = tax_unit("filing_status", period) + multiplier = p.multiplier[filing_status] + if p.flat_amount_enabled: + amount = p.amount + else: + agi = tax_unit("co_modified_agi", period) + multiplier = p.multiplier[filing_status] + amount = p.scale.calc(agi) + return multiplier * amount diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund_eligible.py b/fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund_eligible.py new file mode 100644 index 000000000..bcdb99bdb --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/credits/sales_tax_refund/co_sales_tax_refund_eligible.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class co_sales_tax_refund_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Colorado sales tax refund" + definition_period = YEAR + reference = "https://tax.colorado.gov/sites/tax/files/documents/DR_0104_Book_2022.pdf#page=23" + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.co.tax.income.credits.sales_tax_refund + age_head = tax_unit("age_head", period) + head_age_eligible = age_head >= p.age_threshold + age_spouse = tax_unit("age_spouse", period) + spouse_age_eligible = age_spouse >= p.age_threshold + # Legal code is ambiguous, but the form points to the line corresponding to + # tax before non-refundable credits. + income_tax_eligible = ( + tax_unit("co_income_tax_before_non_refundable_credits", period) > 0 + ) + # Filers that had Colorado tax withheld are also eligible. + # Use employment income as a proxy. + employment_income_eligible = ( + add(tax_unit, period, ["employment_income"]) > 0 + ) + income_eligible = employment_income_eligible | income_tax_eligible + age_eligible = head_age_eligible | spouse_age_eligible + return age_eligible | income_eligible diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/exemptions/co_property_tax_exemption.py b/fiscalsim_us/variables/gov/states/co/tax/income/exemptions/co_property_tax_exemption.py new file mode 100644 index 000000000..8cecae304 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/exemptions/co_property_tax_exemption.py @@ -0,0 +1,11 @@ +from fiscalsim_us.model_api import * + + +class co_property_tax_exemption(Variable): + value_type = float + entity = TaxUnit + label = "Colorado property tax exemption" + unit = USD + definition_period = YEAR + reference = "https://casetext.com/statute/colorado-revised-statutes/title-39-taxation/property-tax/exemptions/article-3-exemptions/part-2-property-tax-exemption-for-qualifying-seniors-and-disabled-veterans/section-39-3-203-property-tax-exemption-qualifications" + defined_for = StateCode.CO diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction.py new file mode 100644 index 000000000..a5c65e673 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class co_charitable_contribution_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Colorado charitable contribution subtraction" + unit = USD + definition_period = YEAR + reference = ( + "https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12", + "https://casetext.com/regulation/colorado-administrative-code/department-200-department-of-revenue/division-201-taxation-division/rule-1-ccr-201-2-income-tax/rule-39-22-1044m-charitable-contribution-subtraction-for-taxpayers-claiming-the-federal-standard-deduction" + # C.R.S. 39-22-104(4)(m)(1) + ) + defined_for = "co_charitable_contribution_subtraction_eligible" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.co.tax.income.subtractions.charitable_contribution + charitable_contributions = add( + tax_unit, + period, + ["charitable_cash_donations", "charitable_non_cash_donations"], + ) + return max_(charitable_contributions - p.adjustment, 0) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction_eligible.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction_eligible.py new file mode 100644 index 000000000..34e1e6c2f --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/charitable_contribution/co_charitable_contribution_subtraction_eligible.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class co_charitable_contribution_subtraction_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Colorado charitable contribution subtraction" + definition_period = YEAR + reference = ( + "https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12", + "https://casetext.com/regulation/colorado-administrative-code/department-200-department-of-revenue/division-201-taxation-division/rule-1-ccr-201-2-income-tax/rule-39-22-1044m-charitable-contribution-subtraction-for-taxpayers-claiming-the-federal-standard-deduction" + # C.R.S. 39-22-104(4)(m)(1) + ) + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + # Only available to filers who do not itemize on their federal tax return. + # The tax form instructions also limit to filers who do not deduct charitable deductions, + # but this is a redundant criterion. + return ~tax_unit("tax_unit_itemizes", period) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/co_subtractions.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/co_subtractions.py new file mode 100644 index 000000000..9d07b91f4 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/co_subtractions.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class co_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "Colorado subtractions" + unit = USD + definition_period = YEAR + defined_for = StateCode.CO + + adds = "gov.states.co.tax.income.subtractions.subtractions" diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/collegeinvest_contribution/co_collegeinvest_subtraction.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/collegeinvest_contribution/co_collegeinvest_subtraction.py new file mode 100644 index 000000000..56c9346b7 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/collegeinvest_contribution/co_collegeinvest_subtraction.py @@ -0,0 +1,24 @@ +from fiscalsim_us.model_api import * + + +class co_collegeinvest_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Colorado collegeinvest subtraction" + unit = USD + definition_period = YEAR + reference = ( + "https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12", + "https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/" + # C.R.S. 39-22-104(4)(i)(II)(B) + ) + defined_for = StateCode.CO + + def formula(tax_unit, period, parameters): + investment_amount = tax_unit("investment_in_529_plan", period) + p = parameters( + period + ).gov.states.co.tax.income.subtractions.collegeinvest_contribution + cap = p.max_amount[tax_unit("filing_status", period)] + return min_(investment_amount, cap) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/military_retirement/co_military_retirement_subtraction.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/military_retirement/co_military_retirement_subtraction.py new file mode 100644 index 000000000..64575e389 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/military_retirement/co_military_retirement_subtraction.py @@ -0,0 +1,33 @@ +from fiscalsim_us.model_api import * + + +class co_military_retirement_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Colorado military retirement subtraction" + defined_for = StateCode.CO + unit = USD + reference = ( + "https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12", + "https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/" + # C.R.S. 39-22-104(4)(y)(I) + ) + definition_period = YEAR + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.co.tax.income.subtractions.military_retirement + person = tax_unit.members + age = person("age", period) + head = person("is_tax_unit_head", period) + spouse = person("is_tax_unit_spouse", period) + head_or_spouse = head | spouse + age_eligible = age < p.age_threshold + eligible = head_or_spouse * age_eligible + military_retirement_pay = person("military_retirement_pay", period) + capped_military_retirement_pay = min_( + military_retirement_pay * eligible, p.max_amount + ) + return tax_unit.sum(capped_military_retirement_pay) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction.py new file mode 100644 index 000000000..04543b6de --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class co_pension_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Colorado pension and annuity subtraction" + unit = USD + definition_period = YEAR + defined_for = StateCode.CO + + adds = [ + "co_pension_subtraction_indv", + "co_social_security_subtraction_indv", + ] diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_income.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_income.py new file mode 100644 index 000000000..606177282 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_income.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class co_pension_subtraction_income(Variable): + value_type = float + entity = Person + label = "Income for the Colorado pension and annuity subtraction" + unit = USD + definition_period = YEAR + defined_for = StateCode.CO + + adds = "gov.states.co.tax.income.subtractions.pension.income_sources" diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv.py new file mode 100644 index 000000000..591276ee2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv.py @@ -0,0 +1,49 @@ +from fiscalsim_us.model_api import * + + +class co_pension_subtraction_indv(Variable): + value_type = float + entity = Person + label = "Colorado pension and annuity subtraction for eligible individuals" + defined_for = "co_pension_subtraction_indv_eligible" + unit = USD + reference = ( + "https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12", + "https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/" + # C.R.S. 39-22-104(4)(g)(III) + ) + definition_period = YEAR + + def formula(person, period, parameters): + p = parameters(period).gov.states.co.tax.income.subtractions.pension + taxable_pension_income = person( + "co_pension_subtraction_income", period + ) + pension_survivors = person("pension_survivors", period) + co_social_security_subtraction = person( + "co_social_security_subtraction_indv", period + ) + age = person("age", period) + # The maximum subtarction amount is reduced by the social security subtraction amount + reduced_older_cap = max_( + p.cap.older - co_social_security_subtraction, 0 + ) + reduced_younger_cap = max_( + p.cap.younger - co_social_security_subtraction, 0 + ) + + capped_older_amount = min_(reduced_older_cap, taxable_pension_income) + capped_middle_amount = min_( + reduced_younger_cap, taxable_pension_income + ) + capped_younger_amount = min_(reduced_younger_cap, pension_survivors) + + return select( + [ + age >= p.age_threshold.older, + age >= p.age_threshold.younger, + ], + [capped_older_amount, capped_middle_amount], + default=capped_younger_amount, + ) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv_eligible..py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv_eligible..py new file mode 100644 index 000000000..0a5072dc6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_pension_subtraction_indv_eligible..py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class co_pension_subtraction_indv_eligible(Variable): + value_type = bool + entity = Person + label = "Eligible for the Colorado pension and annuity subtraction for eligible individuals" + defined_for = StateCode.CO + reference = ( + "https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12", + "https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/" + # C.R.S. 39-22-104(4)(g)(III) + ) + definition_period = YEAR + + def formula(person, period, parameters): + head = person("is_tax_unit_head", period) + spouse = person("is_tax_unit_spouse", period) + return head | spouse diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv.py new file mode 100644 index 000000000..26e7e45bf --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv.py @@ -0,0 +1,41 @@ +from fiscalsim_us.model_api import * + + +class co_social_security_subtraction_indv(Variable): + value_type = float + entity = Person + label = "Colorado social security subtraction for eligible individuals" + defined_for = "co_social_security_subtraction_indv_eligible" + unit = USD + reference = ( + "https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12", + "https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/" + # C.R.S. 39-22-104(4)(g)(III) + ) + definition_period = YEAR + + def formula(person, period, parameters): + p = parameters(period).gov.states.co.tax.income.subtractions.pension + if not p.social_security_subtraction_available: + return 0 + taxable_social_security = person("taxable_social_security", period) + social_security_survivors = person("social_security_survivors", period) + age = person("age", period) + # Only head and spouse can claim this subtraction + eligible_social_security_survivors = social_security_survivors + eligible_taxable_social_security = taxable_social_security + # If the filer is 65 or older, they can claim full subtarction + # If the filer is between 65 and 55, they can claim a capped amount + cap = p.cap.younger + capped_middle_amount = min_(eligible_taxable_social_security, cap) + # If the filer is under 55, they can claim a capped amount of ss survivors + capped_younger_amount = min_(eligible_social_security_survivors, cap) + return select( + [ + age >= p.age_threshold.older, + age >= p.age_threshold.younger, + ], + [taxable_social_security, capped_middle_amount], + default=capped_younger_amount, + ) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv_eligible.py b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv_eligible.py new file mode 100644 index 000000000..0ace2a33e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/co/tax/income/subtractions/pension/co_social_security_subtraction_indv_eligible.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class co_social_security_subtraction_indv_eligible(Variable): + value_type = float + entity = Person + label = "Eligible for the Colorado social security subtraction for eligible individuals" + defined_for = StateCode.CO + unit = USD + reference = ( + "https://tax.colorado.gov/sites/tax/files/documents/DR0104AD_2022.pdf#page=1", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=12", + "https://law.justia.com/codes/colorado/2022/title-39/article-22/part-1/section-39-22-104/" + # C.R.S. 39-22-104(4)(g)(III) + ) + definition_period = YEAR + + def formula(person, period, parameters): + head = person("is_tax_unit_head", period) + spouse = person("is_tax_unit_spouse", period) + return head | spouse diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_higher_tax_recapture.py b/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_higher_tax_recapture.py new file mode 100644 index 000000000..9ffb0f178 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_higher_tax_recapture.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class ct_income_tax_higher_tax_recapture(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut income tax higher tax recapture" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + income = tax_unit("ct_agi", period) + p = parameters(period).gov.states.ct.tax.income.recapture.higher + filing_status = tax_unit("filing_status", period) + reduction_start = p.start[filing_status] + max_amount = p.max_amount[filing_status] + increment = p.increment[filing_status] + reduction_per_increment = p.amount[filing_status] + excess = max_(income - reduction_start, 0) + increments = np.ceil(excess / increment) + amount = increments * reduction_per_increment + return min_(max_amount, amount) diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_lower_tax_recapture.py b/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_lower_tax_recapture.py new file mode 100644 index 000000000..6302a9136 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_lower_tax_recapture.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class ct_income_tax_lower_tax_recapture(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut income tax lower tax recapture" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + income = tax_unit("ct_agi", period) + p = parameters(period).gov.states.ct.tax.income.recapture.lower + filing_status = tax_unit("filing_status", period) + reduction_start = p.start[filing_status] + max_amount = p.max_amount[filing_status] + increment = p.increment[filing_status] + reduction_per_increment = p.amount[filing_status] + excess = max_(income - reduction_start, 0) + increments = np.ceil(excess / increment) + amount = increments * reduction_per_increment + return min_(max_amount, amount) diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_phase_out_add_back.py b/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_phase_out_add_back.py new file mode 100644 index 000000000..e0571f445 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_phase_out_add_back.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class ct_income_tax_phase_out_add_back(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut income tax phase out add back" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + income = tax_unit("ct_agi", period) + p = parameters(period).gov.states.ct.tax.income.add_back + filing_status = tax_unit("filing_status", period) + start = p.start[filing_status] + max_amount = p.max_amount[filing_status] + increment = p.increment[filing_status] + reduction_per_increment = p.amount[filing_status] + excess = max_(income - start, 0) + increments = np.ceil(excess / increment) + amount = increments * reduction_per_increment + return min_(max_amount, amount) diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_recapture.py b/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_recapture.py new file mode 100644 index 000000000..636895f66 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/add_back/ct_income_tax_recapture.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ct_income_tax_recapture(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut income tax recapture" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + adds = [ + "ct_income_tax_lower_tax_recapture", + "ct_income_tax_higher_tax_recapture", + ] diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/credits/ct_personal_credit_rate.py b/fiscalsim_us/variables/gov/states/ct/tax/income/credits/ct_personal_credit_rate.py new file mode 100644 index 000000000..d9b51cd06 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/credits/ct_personal_credit_rate.py @@ -0,0 +1,33 @@ +from fiscalsim_us.model_api import * + + +class ct_personal_credit_rate(Variable): + value_type = float + entity = TaxUnit + unit = "\1" + label = "Connecticut personal credit rate" + definition_period = YEAR + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + agi = tax_unit("ct_agi", period) + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + p = parameters(period).gov.states.ct.tax.income.credits.agi + + return select( + [ + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.SEPARATE, + filing_status == status.WIDOW, + filing_status == status.HEAD_OF_HOUSEHOLD, + ], + [ + p.single.calc(agi), + p.joint.calc(agi), + p.separate.calc(agi), + p.widow.calc(agi), + p.head_of_household.calc(agi), + ], + ) diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/credits/eitc/ct_eitc.py b/fiscalsim_us/variables/gov/states/ct/tax/income/credits/eitc/ct_eitc.py new file mode 100644 index 000000000..86e25b9b3 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/credits/eitc/ct_eitc.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class ct_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut Earned Income Tax Credit" + unit = USD + definition_period = YEAR + reference = ( + "https://portal.ct.gov/-/media/DRS/Forms/2022/Income/Schedule-CT-EITC_1222.pdf" + "https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-704e" + ) + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + eitc = tax_unit("earned_income_tax_credit", period) + rate = parameters(period).gov.states.ct.tax.income.credits.eitc.match + return eitc * rate diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi.py b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi.py new file mode 100644 index 000000000..c1e42e64a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class ct_agi(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut adjusted gross income" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + adds = ["adjusted_gross_income", "ct_agi_additions"] + subtracts = ["ct_agi_subtractions"] diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi_additions.py b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi_additions.py new file mode 100644 index 000000000..dcb51cd4a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi_additions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class ct_agi_additions(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut additions to federal AGI to get CT AGI" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi_subtractions.py b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi_subtractions.py new file mode 100644 index 000000000..6be70d32d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_agi_subtractions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class ct_agi_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut subtractions from federal AGI to get CT AGI" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax.py b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax.py new file mode 100644 index 000000000..56d2dc986 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class ct_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + adds = ["ct_income_tax_before_refundable_credits"] + subtracts = ["ct_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.py b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.py new file mode 100644 index 000000000..87f062eb8 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax_after_personal_credits.py @@ -0,0 +1,38 @@ +from fiscalsim_us.model_api import * + + +class ct_income_tax_after_personal_credits(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut income tax after personal tax credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + taxable_income = tax_unit("ct_taxable_income", period) + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + p = parameters(period).gov.states.ct.tax.income.rates + itax_before_personal_credits = select( + [ + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.SEPARATE, + filing_status == status.WIDOW, + filing_status == status.HEAD_OF_HOUSEHOLD, + ], + [ + p.single.calc(taxable_income), + p.joint.calc(taxable_income), + p.separate.calc(taxable_income), + p.widow.calc(taxable_income), + p.head_of_household.calc(taxable_income), + ], + ) + add_back = tax_unit("ct_income_tax_phase_out_add_back", period) + tax_recapture = tax_unit("ct_income_tax_recapture", period) + total = itax_before_personal_credits + add_back + tax_recapture + personal_credit_rate = tax_unit("ct_personal_credit_rate", period) + personal_credit_amount = personal_credit_rate * total + return max_(0, total - personal_credit_amount) diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..00fb9ba11 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_income_tax_before_refundable_credits.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class ct_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut income tax before refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + tax_before_non_refundable_credits = tax_unit( + "ct_income_tax_after_personal_credits", period + ) + non_refundable_credits = tax_unit("ct_non_refundable_credits", period) + return max_( + tax_before_non_refundable_credits - non_refundable_credits, 0 + ) diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/ct_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_non_refundable_credits.py new file mode 100644 index 000000000..305f5e1ef --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_non_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class ct_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/ct_refundable_credits.py b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_refundable_credits.py new file mode 100644 index 000000000..d252cf027 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class ct_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/ct_taxable_income.py b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_taxable_income.py new file mode 100644 index 000000000..a54c6d9ae --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/ct_taxable_income.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ct_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut taxable income" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + income = tax_unit("ct_agi", period) + personal_exemptions = tax_unit("ct_personal_exemptions", period) + return max_(income - personal_exemptions, 0) diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/exemptions/ct_personal_exemptions.py b/fiscalsim_us/variables/gov/states/ct/tax/income/exemptions/ct_personal_exemptions.py new file mode 100644 index 000000000..f789dd5d4 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/exemptions/ct_personal_exemptions.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class ct_personal_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut Personal Exemptions" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + income = tax_unit("ct_agi", period) + p = parameters(period).gov.states.ct.tax.income.exemptions.personal + filing_status = tax_unit("filing_status", period) + max_amount = p.max_amount[filing_status] + reduction_start = p.reduction.start[filing_status] + increment = p.reduction.increment + reduction_per_increment = p.reduction.amount + excess = max_(income - reduction_start, 0) + increments = np.ceil(excess / increment) + total_reduction_amount = increments * reduction_per_increment + return max_(max_amount - total_reduction_amount, 0) diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/subtractions/ct_subtractions.py b/fiscalsim_us/variables/gov/states/ct/tax/income/subtractions/ct_subtractions.py new file mode 100644 index 000000000..f3d709f97 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/subtractions/ct_subtractions.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class ct_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut subtractions" + unit = USD + definition_period = YEAR + defined_for = StateCode.CT + + adds = "gov.states.ct.tax.income.subtractions.subtractions" diff --git a/fiscalsim_us/variables/gov/states/ct/tax/income/subtractions/tuition/ct_tuition_subtraction.py b/fiscalsim_us/variables/gov/states/ct/tax/income/subtractions/tuition/ct_tuition_subtraction.py new file mode 100644 index 000000000..80c2ff495 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ct/tax/income/subtractions/tuition/ct_tuition_subtraction.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class ct_tuition_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Connecticut tuition subtraction" + unit = USD + definition_period = YEAR + reference = "https://www.cga.ct.gov/current/pub/chap_229.htm#sec_12-701a" + defined_for = StateCode.CT + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ct.tax.income.subtractions.tuition + filing_status = tax_unit("filing_status", period) + cap = p.cap[filing_status] + # Qualified tuition expenses as defined under Section 529(b) of the Internal Revenue Code + tuition = add(tax_unit, period, ["qualified_tuition_expenses"]) + return min_(tuition, cap) diff --git a/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_earned_income.py b/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_earned_income.py index e20f149f9..5a5183057 100644 --- a/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_earned_income.py +++ b/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_earned_income.py @@ -11,7 +11,7 @@ class dc_tanf_countable_earned_income(Variable): def formula(spm_unit, period, parameters): gross_earnings = spm_unit("dc_tanf_gross_earned_income", period) - p = parameters(period).gov.states.dc.dhs.tanf.income.earned_deduction + p = parameters(period).gov.states.dc.dhs.tanf.income.deductions.earned enrolled = spm_unit("is_tanf_enrolled", period) annual_flat_exclusion = p.flat * MONTHS_IN_YEAR earnings_after_flat_exclusion = max_( diff --git a/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_gross_unearned_income.py b/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_gross_unearned_income.py index ae754c833..56d5ce46c 100644 --- a/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_gross_unearned_income.py +++ b/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_gross_unearned_income.py @@ -12,11 +12,9 @@ class dc_tanf_countable_gross_unearned_income(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states.dc.dhs.tanf.income # Sum unearned sources, plus child support disregard $150 received per month. - gross_unearned = add(spm_unit, period, p.unearned) + gross_unearned = add(spm_unit, period, p.sources.unearned) child_support = add(spm_unit, period, ["child_support_received"]) - monthly_child_support_deduction = ( - p.unearned_deduction.monthly_child_support - ) + monthly_child_support_deduction = p.deductions.child_support child_support_after_deduction = max_( child_support - monthly_child_support_deduction * MONTHS_IN_YEAR, 0 ) diff --git a/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_income.py b/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_income.py index 8bff8f87f..0ab687ae1 100644 --- a/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_income.py +++ b/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_income.py @@ -14,7 +14,7 @@ def formula(spm_unit, period, parameters): gross_unearned_income = spm_unit( "dc_tanf_countable_gross_unearned_income", period ) - p = parameters(period).gov.states.dc.dhs.tanf.income.earned_deduction + p = parameters(period).gov.states.dc.dhs.tanf.income.deductions.earned annual_flat_exclusion = p.flat * MONTHS_IN_YEAR earnings_after_deduction = max_( gross_earnings - annual_flat_exclusion, 0 diff --git a/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_gross_earned_income.py b/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_gross_earned_income.py index d732a02f6..bd3a1a414 100644 --- a/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_gross_earned_income.py +++ b/fiscalsim_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_gross_earned_income.py @@ -9,4 +9,4 @@ class dc_tanf_gross_earned_income(Variable): definition_period = YEAR defined_for = StateCode.DC - adds = "gov.states.dc.dhs.tanf.income.earned" + adds = "gov.states.dc.dhs.tanf.income.sources.earned" diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/additions/dc_income_additions.py b/fiscalsim_us/variables/gov/states/dc/tax/income/additions/dc_income_additions.py new file mode 100644 index 000000000..289ff4ef9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/additions/dc_income_additions.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class dc_income_additions(Variable): + value_type = float + entity = Person + label = "DC additions to federal adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=63" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=55" + ) + defined_for = StateCode.DC + adds = "gov.states.dc.tax.income.additions.sources" diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/additions/dc_self_employment_loss_addition.py b/fiscalsim_us/variables/gov/states/dc/tax/income/additions/dc_self_employment_loss_addition.py new file mode 100644 index 000000000..210c3240a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/additions/dc_self_employment_loss_addition.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class dc_self_employment_loss_addition(Variable): + value_type = float + entity = Person + label = "DC excess self-employment loss addition" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=63" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=55" + ) + defined_for = StateCode.DC + + def formula(person, period, parameters): + loss_person = max_(0, -person("self_employment_income", period)) + loss_taxunit = person.tax_unit.sum(loss_person) + p = parameters(period).gov.states.dc.tax.income.additions + addition_taxunit = max_( + 0, loss_taxunit - p.self_employment_loss.threshold + ) + # allocate taxunit addition in proportion to head and spouse losses + filing_status = person.tax_unit("filing_status", period) + is_joint = filing_status == filing_status.possible_values.JOINT + loss_fraction = np.zeros_like(loss_person) + mask = loss_taxunit > 0 + loss_fraction[mask] = loss_person[mask] / loss_taxunit[mask] + addition_fraction = where(is_joint, loss_fraction, 1) + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + return (is_head | is_spouse) * addition_taxunit * addition_fraction diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_cdcc.py b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_cdcc.py new file mode 100644 index 000000000..3fbe018bc --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_cdcc.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class dc_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "DC child and dependent care credit" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + us_cdcc = tax_unit("cdcc", period) + p_dc = parameters(period).gov.states.dc.tax.income.credits + return us_cdcc * p_dc.cdcc.match diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_kccatc.py b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_kccatc.py new file mode 100644 index 000000000..0b7dc616d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_kccatc.py @@ -0,0 +1,41 @@ +from fiscalsim_us.model_api import * + + +class dc_kccatc(Variable): + value_type = float + entity = TaxUnit + label = "DC keep child care affordable tax credit" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=67" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=59" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.dc.tax.income.credits + # determine tax unit's income eligibility status + taxinc = tax_unit("dc_taxable_income_joint", period) + filing_status = tax_unit("filing_status", period) + income_eligible = taxinc <= p.kccatc.income_limit[filing_status] + # determine count of KCCATC age eligible children + person = tax_unit.members + is_dependent = person("is_tax_unit_dependent", period) + age = person("age", period) + kccatc_age_eligible = is_dependent & (age <= p.kccatc.max_age) + kccatc_eligible_count = tax_unit.sum(kccatc_age_eligible) + # determine count of federal CDCC age eligible children + cdcc = parameters(period).gov.irs.credits.cdcc.eligibility + cdcc_age_eligible = is_dependent & (age < cdcc.child_age) + cdcc_eligible_count = tax_unit.sum(cdcc_age_eligible) + # calculate KCCATC amount + max_kccatc = kccatc_eligible_count * p.kccatc.max_amount + total_care_expenses = tax_unit("tax_unit_childcare_expenses", period) + ratio = np.zeros_like(cdcc_eligible_count) + mask = cdcc_eligible_count > 0 + ratio[mask] = kccatc_eligible_count[mask] / cdcc_eligible_count[mask] + kccatc_care_expenses = total_care_expenses * ratio + kccatc = min_(kccatc_care_expenses, max_kccatc) + # return calculated kccatc amount if income eligible + return income_eligible * kccatc diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_non_refundable_credits.py new file mode 100644 index 000000000..65734b66d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_non_refundable_credits.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class dc_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "DC non-refundable credits" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=63" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=55" + ) + defined_for = StateCode.DC + adds = "gov.states.dc.tax.income.credits.non_refundable" diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_ptc.py b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_ptc.py new file mode 100644 index 000000000..4bae8766b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_ptc.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class dc_ptc(Variable): + value_type = float + entity = TaxUnit + label = "DC property tax credit" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=49" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=47" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + rent = add(tax_unit, period, ["rent"]) + retax = add(tax_unit, period, ["real_estate_taxes"]) + p_dc = parameters(period).gov.states.dc.tax.income.credits + ptax = retax + rent * p_dc.ptc.rent_ratio + elderly_age = p_dc.ptc.min_elderly_age + head_age = tax_unit("age_head", period) + spouse_age = tax_unit("age_spouse", period) + is_elderly = (head_age >= elderly_age) | (spouse_age >= elderly_age) + us_agi = tax_unit("adjusted_gross_income", period) + ptax_offset = us_agi * where( + is_elderly, + p_dc.ptc.fraction_elderly.calc(us_agi, right=True), + p_dc.ptc.fraction_nonelderly.calc(us_agi, right=True), + ) + uncapped_ptc = max_(0, ptax - ptax_offset) + return min_(p_dc.ptc.max, uncapped_ptc) diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_refundable_credits.py b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_refundable_credits.py new file mode 100644 index 000000000..98d22cc2a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/dc_refundable_credits.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class dc_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "DC refundable credits" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=63" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=55" + ) + defined_for = StateCode.DC + adds = "gov.states.dc.tax.income.credits.refundable" diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/credits/eitc/dc_eitc_with_qualifying_child.py b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/eitc/dc_eitc_with_qualifying_child.py index 12c004763..e7b2039e7 100644 --- a/fiscalsim_us/variables/gov/states/dc/tax/income/credits/eitc/dc_eitc_with_qualifying_child.py +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/eitc/dc_eitc_with_qualifying_child.py @@ -1,18 +1,16 @@ -from fiscalsim_us.model_api import * - - -class dc_eitc_with_qualifying_child(Variable): - value_type = float - entity = TaxUnit - label = "DC EITC with qualifying children" - unit = USD - definition_period = YEAR - reference = "https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04" # (f) - defined_for = StateCode.DC - - def formula(tax_unit, period, parameters): - eitc = tax_unit("earned_income_tax_credit", period) - rate = parameters( - period - ).gov.states.dc.tax.income.credits.eitc.with_children.match - return eitc * rate +from fiscalsim_us.model_api import * + + +class dc_eitc_with_qualifying_child(Variable): + value_type = float + entity = TaxUnit + label = "DC EITC with qualifying children" + unit = USD + definition_period = YEAR + reference = "https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04" # (f) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + us_eitc = tax_unit("earned_income_tax_credit", period) + p = parameters(period).gov.states.dc.tax.income.credits + return us_eitc * p.eitc.with_children.match diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/credits/eitc/dc_eitc_without_qualifying_child.py b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/eitc/dc_eitc_without_qualifying_child.py index da1c8e752..0b6fc862d 100644 --- a/fiscalsim_us/variables/gov/states/dc/tax/income/credits/eitc/dc_eitc_without_qualifying_child.py +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/credits/eitc/dc_eitc_without_qualifying_child.py @@ -1,26 +1,24 @@ -from fiscalsim_us.model_api import * - - -class dc_eitc_without_qualifying_child(Variable): - value_type = float - entity = TaxUnit - label = "DC EITC without qualifying children" - unit = USD - definition_period = YEAR - reference = "https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04" # (f) - defined_for = StateCode.DC - - def formula(tax_unit, period, parameters): - # Start by matching the federal EITC. - p = parameters( - period - ).gov.states.dc.tax.income.credits.eitc.without_children - federal_eitc = tax_unit("earned_income_tax_credit", period) - matched_eitc = federal_eitc * p.match - # Then phase out for income above the phase-out threshold. - earnings = tax_unit("tax_unit_earned_income", period) - federal_agi = tax_unit("adjusted_gross_income", period) - greater_of = max_(earnings, federal_agi) - excess = max_(greater_of - p.phase_out.start, 0) - phase_out_amount = excess * p.phase_out.rate - return max_(federal_eitc - phase_out_amount, 0) +from fiscalsim_us.model_api import * + + +class dc_eitc_without_qualifying_child(Variable): + value_type = float + entity = TaxUnit + label = "DC EITC without qualifying children" + unit = USD + definition_period = YEAR + reference = "https://code.dccouncil.gov/us/dc/council/code/sections/47-1806.04" # (f) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + # calculate US EITC amount before phase-out + us_eligible = tax_unit("eitc_eligible", period) + us_eitc = us_eligible * tax_unit("eitc_phased_in", period) + # phase out us_eitc for income above DC phase-out start threshold + earnings = tax_unit("tax_unit_earned_income", period) + us_agi = tax_unit("adjusted_gross_income", period) + greater_of = max_(earnings, us_agi) + dc = parameters(period).gov.states.dc.tax.income.credits + excess = max_(0, greater_of - dc.eitc.without_children.phase_out.start) + dc_phase_out_amount = excess * dc.eitc.without_children.phase_out.rate + return max_(0, us_eitc - dc_phase_out_amount) diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/dc_agi.py b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_agi.py new file mode 100644 index 000000000..9d02e6da5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_agi.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class dc_agi(Variable): + value_type = float + entity = Person + label = "DC AGI (adjusted gross income) for each person in tax unit" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34" + ) + defined_for = StateCode.DC + adds = ["adjusted_gross_income_person", "dc_income_additions"] + subtracts = ["dc_income_subtractions"] diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/dc_files_separately.py b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_files_separately.py new file mode 100644 index 000000000..435cc7d28 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_files_separately.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class dc_files_separately(Variable): + value_type = bool + entity = TaxUnit + label = "Married couple files separately on DC tax return" + definition_period = YEAR + reference = () + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + itax_indiv = tax_unit("dc_income_tax_before_credits_indiv", period) + itax_joint = tax_unit("dc_income_tax_before_credits_joint", period) + if parameters(period).gov.states.dc.tax.income.joint_separately_option: + return itax_indiv < itax_joint + return False diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax.py b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax.py new file mode 100644 index 000000000..64a2431b3 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class dc_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "DC income tax" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=37" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=35" + ) + defined_for = StateCode.DC + adds = ["dc_income_tax_before_refundable_credits"] + subtracts = ["dc_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits.py b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits.py new file mode 100644 index 000000000..5556e9bd2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class dc_income_tax_before_credits(Variable): + value_type = float + entity = TaxUnit + label = "DC income tax before credits" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + return where( + tax_unit("dc_files_separately", period), + tax_unit("dc_income_tax_before_credits_indiv", period), + tax_unit("dc_income_tax_before_credits_joint", period), + ) diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits_indiv.py b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits_indiv.py new file mode 100644 index 000000000..10a279d4b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits_indiv.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class dc_income_tax_before_credits_indiv(Variable): + value_type = float + entity = TaxUnit + label = "DC income tax before credits when married couples file separately" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + person = tax_unit.members + taxinc = max_(0, person("dc_taxable_income_indiv", period)) + p = parameters(period).gov.states + return tax_unit.sum(p.dc.tax.income.rates.calc(taxinc)) diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits_joint.py b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits_joint.py new file mode 100644 index 000000000..2583d07b2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_credits_joint.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class dc_income_tax_before_credits_joint(Variable): + value_type = float + entity = TaxUnit + label = "DC income tax before credits when married couples file jointly" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + taxinc = max_(0, tax_unit("dc_taxable_income_joint", period)) + p = parameters(period).gov.states + return p.dc.tax.income.rates.calc(taxinc) diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..7ccf37f8a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_income_tax_before_refundable_credits.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class dc_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "DC income tax before refundable credits" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + itax_before_credits = tax_unit("dc_income_tax_before_credits", period) + non_refundable_credits = tax_unit("dc_non_refundable_credits", period) + return max_(0, itax_before_credits - non_refundable_credits) diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/dc_taxable_income_indiv.py b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_taxable_income_indiv.py new file mode 100644 index 000000000..c7082a172 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_taxable_income_indiv.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class dc_taxable_income_indiv(Variable): + value_type = float + entity = Person + label = "DC taxable income (can be negative) when married couple files separately" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34" + ) + defined_for = StateCode.DC + adds = ["dc_agi"] + subtracts = ["dc_deduction_indiv"] diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/dc_taxable_income_joint.py b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_taxable_income_joint.py new file mode 100644 index 000000000..4ac506111 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/dc_taxable_income_joint.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class dc_taxable_income_joint(Variable): + value_type = float + entity = TaxUnit + label = ( + "DC taxable income (can be negative) when married couple files jointly" + ) + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=36" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=34" + ) + defined_for = StateCode.DC + adds = ["dc_taxable_income_indiv"] diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_deduction_indiv.py b/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_deduction_indiv.py new file mode 100644 index 000000000..9d0632163 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_deduction_indiv.py @@ -0,0 +1,26 @@ +from fiscalsim_us.model_api import * + + +class dc_deduction_indiv(Variable): + value_type = float + entity = Person + label = "DC deduction for each person in tax unit" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=44" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=44" + ) + defined_for = StateCode.DC + + def formula(person, period, parameters): + tax_unit_deduction = person.tax_unit("dc_deduction_joint", period) + # The above references say the following: + # "You may allocate this [tax-unit deduction] amount as you wish." + # Here we allocate in proportion to head and spouse DC AGI + person_agi = person("dc_agi", period) + tax_unit_agi = person.tax_unit.sum(person_agi) + share = np.zeros_like(tax_unit_agi) + mask = tax_unit_agi > 0 + share[mask] = person_agi[mask] / tax_unit_agi[mask] + return share * tax_unit_deduction diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_deduction_joint.py b/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_deduction_joint.py new file mode 100644 index 000000000..7ef63a6e9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_deduction_joint.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class dc_deduction_joint(Variable): + value_type = float + entity = TaxUnit + label = "DC deduction for each tax unit" + unit = USD + definition_period = YEAR + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + # DC individual income tax FAQs include this: + # Q: If I claimed itemized deductions on my federal return, must I + # also itemize on my DC return? + # A: Yes. If you claim itemized deductions on your federal tax return, + # you must itemize on your DC tax return. You must take the same + # type of deduction (itemized or standard) on your DC return as + # taken on your federal return. + # https://otr.cfo.dc.gov/page/individual-income-tax-special-circumstances-faqs + return where( + tax_unit("tax_unit_itemizes", period), + tax_unit("dc_itemized_deductions", period), + tax_unit("dc_standard_deduction", period), + ) diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_itemized_deductions.py b/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_itemized_deductions.py new file mode 100644 index 000000000..2ef7333a2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_itemized_deductions.py @@ -0,0 +1,37 @@ +from fiscalsim_us.model_api import * + + +class dc_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "DC itemized deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=18" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=17" + ) + defined_for = StateCode.DC + + def formula(tax_unit, period, parameters): + # follows Calculation F in references + # calculate US itemized deductions less state non-property taxes + itm_deds_less_salt = tax_unit("itemized_deductions_less_salt", period) + uncapped_property_taxes = add(tax_unit, period, ["real_estate_taxes"]) + # calculate DC itemized deductions before partial phase-out + dc_itm_deds = itm_deds_less_salt + uncapped_property_taxes + # apply partial phase-out of DC itemized deductions + EXEMPT_ITEMS = [ + "medical_expense_deduction", + "casualty_loss_deduction", + ] + exempt_deds = add(tax_unit, period, EXEMPT_ITEMS) + nonexempt_deds = max_(0, dc_itm_deds - exempt_deds) + dc_agi = add(tax_unit, period, ["dc_agi"]) + filing_status = tax_unit("filing_status", period) + p = parameters(period).gov.states.dc.tax.income.deductions + phase_out_start = p.itemized.phase_out.start[filing_status] + excess_agi = max_(0, dc_agi - phase_out_start) + phase_out_amount = excess_agi * p.itemized.phase_out.rate + limited_nonexempt_deds = max_(0, nonexempt_deds - phase_out_amount) + return exempt_deds + limited_nonexempt_deds diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_standard_deduction.py b/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_standard_deduction.py new file mode 100644 index 000000000..e9e93b3d6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/dc_standard_deduction.py @@ -0,0 +1,11 @@ +from fiscalsim_us.model_api import * + + +class dc_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "DC standard deduction" + unit = USD + definition_period = YEAR + defined_for = StateCode.DC + adds = ["basic_standard_deduction", "additional_standard_deduction"] diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/standard/dc_standard_deduction.py b/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/standard/dc_standard_deduction.py deleted file mode 100644 index c96f0b64a..000000000 --- a/fiscalsim_us/variables/gov/states/dc/tax/income/deductions/standard/dc_standard_deduction.py +++ /dev/null @@ -1,15 +0,0 @@ -from fiscalsim_us.model_api import * - - -class dc_standard_deduction(Variable): - value_type = float - entity = TaxUnit - label = "DC standard deduction" - unit = USD - definition_period = YEAR - defined_for = StateCode.DC - - def formula(tax_unit, period, parameters): - p = parameters(period).gov.states.dc.tax.income.deductions.standard - filing_status = tax_unit("filing_status", period) - return p.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/subtractions/dc_disabled_exclusion_subtraction.py b/fiscalsim_us/variables/gov/states/dc/tax/income/subtractions/dc_disabled_exclusion_subtraction.py new file mode 100644 index 000000000..f87007a74 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/subtractions/dc_disabled_exclusion_subtraction.py @@ -0,0 +1,31 @@ +from fiscalsim_us.model_api import * + + +class dc_disabled_exclusion_subtraction(Variable): + value_type = float + entity = Person + label = "DC disabled exclusion subtraction" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=63" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2021_D-2440.pdf" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=55" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-2440.pdf" + ) + defined_for = StateCode.DC + + def formula(person, period, parameters): + # determine disablity-related eligibility + is_disabled = person("is_permanently_and_totally_disabled", period) + gets_ssi = person("ssi", period) > 0 + gets_ssdi = person("social_security_disability", period) > 0 + disabled_eligible = is_disabled & (gets_ssi | gets_ssdi) + # determine income-related eligibility + INCOME_SOURCES = ["household_market_income", "household_benefits"] + household_income = add(person.household, period, INCOME_SOURCES) + p = parameters(period).gov.states.dc.tax.income.subtractions + income_eligible = household_income < p.disabled_exclusion.income_limit + # return subtraction amount if meet both eligibilty requirements + subtraction_amount = p.disabled_exclusion.amount + return (disabled_eligible & income_eligible) * subtraction_amount diff --git a/fiscalsim_us/variables/gov/states/dc/tax/income/subtractions/dc_income_subtractions.py b/fiscalsim_us/variables/gov/states/dc/tax/income/subtractions/dc_income_subtractions.py new file mode 100644 index 000000000..824660bc0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/dc/tax/income/subtractions/dc_income_subtractions.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class dc_income_subtractions(Variable): + value_type = float + entity = Person + label = "DC subtractions from federal adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/52926_D-40_12.21.21_Final_Rev011122.pdf#page=63" + "https://otr.cfo.dc.gov/sites/default/files/dc/sites/otr/publication/attachments/2022_D-40_Booklet_Final_blk_01_23_23_Ordc.pdf#page=55" + ) + defined_for = StateCode.DC + adds = "gov.states.dc.tax.income.subtractions.sources" diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/additions/de_additions.py b/fiscalsim_us/variables/gov/states/de/tax/income/additions/de_additions.py new file mode 100644 index 000000000..89a8c2713 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/additions/de_additions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class de_additions(Variable): + value_type = float + entity = TaxUnit + label = "Delaware agi additions" + unit = USD + definition_period = YEAR + defined_for = StateCode.DE diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/cdcc/de_cdcc.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/cdcc/de_cdcc.py new file mode 100644 index 000000000..cb64eed40 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/cdcc/de_cdcc.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class de_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "Delaware dependent care credit" + unit = USD + definition_period = YEAR + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + expenses = tax_unit("cdcc", period) + rate = parameters(period).gov.states.de.tax.income.credits.cdcc.match + return expenses * rate diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_eitc.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_eitc.py new file mode 100644 index 000000000..a4f2aa31b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_eitc.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class de_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Delaware EITC" + unit = USD + documentation = "Refundable or non-refundable Delaware EITC" + definition_period = YEAR + reference = "https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf" + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + refundable_eitc = tax_unit("de_refundable_eitc", period) + non_refundable_eitc = tax_unit("de_non_refundable_eitc", period) + claims_refundable = tax_unit("de_claims_refundable_eitc", period) + return where(claims_refundable, refundable_eitc, non_refundable_eitc) diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc.py new file mode 100644 index 000000000..efe8ff4e5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class de_non_refundable_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Delaware non-refundable EITC" + unit = USD + documentation = "Non-refundable EITC credit reducing DE State income tax." + definition_period = YEAR + reference = "https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf" + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + # Either claims refundable or non-refundable, but not both. + claims = ~tax_unit("de_claims_refundable_eitc", period) + amount_if_claimed = tax_unit( + "de_non_refundable_eitc_if_claimed", period + ) + return claims * amount_if_claimed diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc_if_claimed.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc_if_claimed.py new file mode 100644 index 000000000..e0f69b809 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_non_refundable_eitc_if_claimed.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class de_non_refundable_eitc_if_claimed(Variable): + value_type = float + entity = TaxUnit + label = "Delaware non-refundable EITC if claimed" + unit = USD + documentation = "Non-refundable EITC credit reducing DE State income tax." + definition_period = YEAR + reference = "https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf" + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + federal_eitc = tax_unit("earned_income_tax_credit", period) + p = parameters(period).gov.states.de.tax.income.credits.eitc + return p.non_refundable * federal_eitc diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_refundable_eitc.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_refundable_eitc.py new file mode 100644 index 000000000..bb5a51504 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_refundable_eitc.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class de_refundable_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Delaware refundable EITC" + unit = USD + documentation = ( + "Refundable EITC credit reducing DE State income tax page 8." + ) + definition_period = YEAR + reference = "https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf" + defined_for = "de_claims_refundable_eitc" + + adds = ["de_refundable_eitc_if_claimed"] diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_refundable_eitc_if_claimed.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_refundable_eitc_if_claimed.py new file mode 100644 index 000000000..f50fac386 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/de_refundable_eitc_if_claimed.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class de_refundable_eitc_if_claimed(Variable): + value_type = float + entity = TaxUnit + label = "Delaware refundable EITC if claimed" + unit = USD + documentation = ( + "Refundable EITC credit reducing DE State income tax page 8." + ) + definition_period = YEAR + reference = "https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf" + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + federal_eitc = tax_unit("earned_income_tax_credit", period) + p = parameters(period).gov.states.de.tax.income.credits.eitc + return p.refundable * federal_eitc diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_claims_refundable_eitc.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_claims_refundable_eitc.py new file mode 100644 index 000000000..af116464c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_claims_refundable_eitc.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class de_claims_refundable_eitc(Variable): + value_type = bool + entity = TaxUnit + label = "Filer claims refundable Delaware EITC" + unit = USD + documentation = "Whether the filer claims the refundable over the non-refundable Delaware Earned Income Tax Credit." + definition_period = YEAR + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + de_income_tax_if_claiming_refundable_eitc = tax_unit( + "de_income_tax_if_claiming_refundable_eitc", period + ) + de_income_tax_if_claiming_non_refundable_eitc = tax_unit( + "de_income_tax_if_claiming_non_refundable_eitc", period + ) + return ( + de_income_tax_if_claiming_refundable_eitc + < de_income_tax_if_claiming_non_refundable_eitc + ) diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_non_refundable_eitc.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_non_refundable_eitc.py new file mode 100644 index 000000000..83e6e2762 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_non_refundable_eitc.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class de_income_tax_if_claiming_non_refundable_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Delaware tax liability if claiming non-refundable Delaware EITC" + unit = USD + definition_period = YEAR + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + simulation = tax_unit.simulation + non_refundable_branch = simulation.get_branch("de_non_refundable_eitc") + non_refundable_branch.set_input( + "de_claims_refundable_eitc", + period, + np.zeros((tax_unit.count,), dtype=bool), + ) + return non_refundable_branch.calculate("de_income_tax", period) diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_refundable_eitc.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_refundable_eitc.py new file mode 100644 index 000000000..34cf0ded5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/eitc/refundability_calculation/de_income_tax_if_claiming_refundable_eitc.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class de_income_tax_if_claiming_refundable_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Delaware tax liability if claiming refundable Delaware EITC" + unit = USD + definition_period = YEAR + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + simulation = tax_unit.simulation + refundable_branch = simulation.get_branch("de_refundable_eitc") + refundable_branch.set_input( + "de_claims_refundable_eitc", + period, + np.ones((tax_unit.count,), dtype=bool), + ) + return refundable_branch.calculate("de_income_tax", period) diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/personal/de_aged_personal_credit.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/personal/de_aged_personal_credit.py new file mode 100644 index 000000000..a2ddf48e4 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/personal/de_aged_personal_credit.py @@ -0,0 +1,29 @@ +from fiscalsim_us.model_api import * + + +class de_aged_personal_credit(Variable): + value_type = float + entity = TaxUnit + label = "Delaware aged personal credit" + unit = USD + definition_period = YEAR + reference = ( + "https://delcode.delaware.gov/title30/c011/sc02/index.html#1110" + ) + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.de.tax.income.credits.personal_credits + + # Legal code says "An additional $110 in the case of each resident person age 60 or over." + # Tax form limits it to heads and spouses, not elderly dependents. + + age_head = tax_unit("age_head", period) + head_amount = p.aged.calc(age_head) + + age_spouse = tax_unit("age_spouse", period) + spouse_amount = p.aged.calc(age_spouse) + + return head_amount + spouse_amount diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/credits/personal/de_personal_credit.py b/fiscalsim_us/variables/gov/states/de/tax/income/credits/personal/de_personal_credit.py new file mode 100644 index 000000000..37bf3f793 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/credits/personal/de_personal_credit.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class de_personal_credit(Variable): + value_type = float + entity = TaxUnit + label = "Delaware personal credit" + unit = USD + definition_period = YEAR + reference = "https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf" + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.de.tax.income.credits.personal_credits + exemptions = tax_unit("exemptions", period) + return p.personal * exemptions diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/de_agi.py b/fiscalsim_us/variables/gov/states/de/tax/income/de_agi.py new file mode 100644 index 000000000..0fcbd4849 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/de_agi.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class de_agi(Variable): + value_type = float + entity = TaxUnit + label = "Delaware adjusted gross income" + unit = USD + definition_period = YEAR + defined_for = StateCode.DE + + adds = ["de_pre_exclusions_agi"] + subtracts = ["de_elderly_or_disabled_income_exclusion"] diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/de_income_tax_before_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/de/tax/income/de_income_tax_before_non_refundable_credits.py new file mode 100644 index 000000000..ac896e5f5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/de_income_tax_before_non_refundable_credits.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class de_income_tax_before_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Delaware personal income tax before refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + income = tax_unit("de_taxable_income", period) + return parameters(period).gov.states.de.tax.income.rate.calc(income) diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/de_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/de/tax/income/de_income_tax_before_refundable_credits.py index d0036c536..9b616bac7 100644 --- a/fiscalsim_us/variables/gov/states/de/tax/income/de_income_tax_before_refundable_credits.py +++ b/fiscalsim_us/variables/gov/states/de/tax/income/de_income_tax_before_refundable_credits.py @@ -10,5 +10,8 @@ class de_income_tax_before_refundable_credits(Variable): defined_for = StateCode.DE def formula(tax_unit, period, parameters): - income = tax_unit("de_taxable_income", period) - return parameters(period).gov.states.de.tax.income.rate.calc(income) + before_non_refundable_credits = tax_unit( + "de_income_tax_before_non_refundable_credits", period + ) + non_refundable_credits = tax_unit("de_non_refundable_credits", period) + return max_(before_non_refundable_credits - non_refundable_credits, 0) diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/de_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/de/tax/income/de_non_refundable_credits.py new file mode 100644 index 000000000..bbe033db6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/de_non_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class de_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Delaware non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.DE + + adds = "gov.states.de.tax.income.credits.non_refundable" diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/de_pre_exclusions_agi.py b/fiscalsim_us/variables/gov/states/de/tax/income/de_pre_exclusions_agi.py new file mode 100644 index 000000000..a748ac09b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/de_pre_exclusions_agi.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class de_pre_exclusions_agi(Variable): + value_type = float + entity = TaxUnit + label = "Delaware adjusted gross income before exclusions" + unit = USD + definition_period = YEAR + defined_for = StateCode.DE + + adds = ["de_additions", "adjusted_gross_income"] + subtracts = ["de_subtractions"] diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/de_refundable_credits.py b/fiscalsim_us/variables/gov/states/de/tax/income/de_refundable_credits.py index e96276d1a..1713bba7d 100644 --- a/fiscalsim_us/variables/gov/states/de/tax/income/de_refundable_credits.py +++ b/fiscalsim_us/variables/gov/states/de/tax/income/de_refundable_credits.py @@ -8,3 +8,5 @@ class de_refundable_credits(Variable): unit = USD definition_period = YEAR defined_for = StateCode.DE + + adds = "gov.states.de.tax.income.credits.refundable" diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/deductions/itemized/de_itemized_deductions.py b/fiscalsim_us/variables/gov/states/de/tax/income/deductions/itemized/de_itemized_deductions.py new file mode 100644 index 000000000..4f177314c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/deductions/itemized/de_itemized_deductions.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class de_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Delaware itemized deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf#page=7" + "https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-02_Instructions.pdf#page=11" + "https://casetext.com/statute/delaware-code/title-30-state-taxes/part-ii-income-inheritance-and-estate-taxes/chapter-11-personal-income-tax/subchapter-ii-resident-individuals/section-1109-itemized-deductions-for-application-of-this-section-see-66-del-laws-c-86-section-8" + ) + defined_for = StateCode.DE + + adds = ["itemized_deductions_less_salt"] + # Per Law: Self employed filers can deduct the health insurance premiums + # less the amount allowed as a deduction on the federal return + # We omit this because it is not on the tax form. diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/deductions/standard/de_additional_standard_deduction.py b/fiscalsim_us/variables/gov/states/de/tax/income/deductions/standard/de_additional_standard_deduction.py new file mode 100644 index 000000000..01f53c2d3 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/deductions/standard/de_additional_standard_deduction.py @@ -0,0 +1,37 @@ +from fiscalsim_us.model_api import * + + +class de_additional_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Delaware additional standard deduction" + unit = USD + definition_period = YEAR + reference = ( + "https://delcode.delaware.gov/title30/c011/sc02/index.html#1108" + ) + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.de.tax.income.deductions.standard.additional + + age_head = tax_unit("age_head", period) + aged_head_eligible = (age_head >= p.age_threshold).astype(int) + + age_spouse = tax_unit("age_spouse", period) + aged_spouse_eligible = (age_spouse >= p.age_threshold).astype(int) + + blind_head = tax_unit("blind_head", period) + blind_head_eligible = (blind_head).astype(int) + + blind_spouse = tax_unit("blind_spouse", period) + blind_spouse_eligible = (blind_spouse).astype(int) + + return ( + aged_head_eligible + + aged_spouse_eligible + + blind_head_eligible + + blind_spouse_eligible + ) * p.amount diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/deductions/standard/de_standard_deduction.py b/fiscalsim_us/variables/gov/states/de/tax/income/deductions/standard/de_standard_deduction.py new file mode 100644 index 000000000..81dee42ba --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/deductions/standard/de_standard_deduction.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class de_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Delaware standard deduction" + unit = USD + definition_period = YEAR + reference = "https://delcode.delaware.gov/title30/c011/sc02/index.html title 30, chapter 11, subchapter II, section 1108" + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + p = parameters(period).gov.states.de.tax.income.deductions.standard + return p.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/subtractions/de_subtractions.py b/fiscalsim_us/variables/gov/states/de/tax/income/subtractions/de_subtractions.py new file mode 100644 index 000000000..224ae44e4 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/subtractions/de_subtractions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class de_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "Delaware subtractions" + unit = USD + definition_period = YEAR + defined_for = StateCode.DE diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/subtractions/exclusions/de_elderly_or_disabled_income_exclusion.py b/fiscalsim_us/variables/gov/states/de/tax/income/subtractions/exclusions/de_elderly_or_disabled_income_exclusion.py new file mode 100644 index 000000000..678cb5458 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/subtractions/exclusions/de_elderly_or_disabled_income_exclusion.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class de_elderly_or_disabled_income_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "Delaware aged or disabled exclusion" + unit = USD + definition_period = YEAR + reference = "https://revenuefiles.delaware.gov/2022/PIT-RES_TY22_2022-01_PaperInteractive.pdf#page=1" + defined_for = "de_elderly_or_disabled_income_exclusion_eligible" + + def formula(tax_unit, period, parameters): + # First get their filing status. + filing_status = tax_unit("filing_status", period) + p = parameters( + period + ).gov.states.de.tax.income.subtractions.exclusions.elderly_or_disabled + + return p.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/states/de/tax/income/subtractions/exclusions/de_elderly_or_disabled_income_exclusion_eligible.py b/fiscalsim_us/variables/gov/states/de/tax/income/subtractions/exclusions/de_elderly_or_disabled_income_exclusion_eligible.py new file mode 100644 index 000000000..1f270822b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/de/tax/income/subtractions/exclusions/de_elderly_or_disabled_income_exclusion_eligible.py @@ -0,0 +1,52 @@ +from fiscalsim_us.model_api import * + + +class de_elderly_or_disabled_income_exclusion_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Delaware elderly or disabled income exclusion" + definition_period = YEAR + defined_for = StateCode.DE + + def formula(tax_unit, period, parameters): + # First get their filing status. + filing_status = tax_unit("filing_status", period) + p = parameters( + period + ).gov.states.de.tax.income.subtractions.exclusions.elderly_or_disabled + + # Get the individual disabled status. + disabled_head = tax_unit("disabled_head", period) + disabled_spouse = tax_unit("disabled_spouse", period) + + # Get the individual filer's age and eligibility. + age_head = tax_unit("age_head", period) + age_head_eligible = age_head > p.eligibility.age_threshold + + # Get spouse age and eligibility + age_spouse = tax_unit("age_spouse", period) + age_spouse_eligible = age_spouse > p.eligibility.age_threshold + + # Get the tax unit income + earned_income = tax_unit("tax_unit_earned_income", period) + + # Determine if filer income is eligible. + income_threshold = p.eligibility.earned_income_limit[filing_status] + income_eligible = earned_income < income_threshold + + # Check the individual's eligibility. + is_joint = tax_unit("tax_unit_is_joint", period) + head_eligible = disabled_head | age_head_eligible + spouse_eligible = disabled_spouse | age_spouse_eligible + age_or_disability_eligible = where( + is_joint, + head_eligible & spouse_eligible, + head_eligible, + ) + + pre_exclusions_agi = tax_unit("de_pre_exclusions_agi", period) + agi_eligible = ( + pre_exclusions_agi <= p.eligibility.agi_limit[filing_status] + ) + + return age_or_disability_eligible & income_eligible & agi_eligible diff --git a/fiscalsim_us/variables/gov/states/ga/ga_additions.py b/fiscalsim_us/variables/gov/states/ga/ga_additions.py new file mode 100644 index 000000000..23b08fb6e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/ga_additions.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class ga_additions(Variable): + value_type = float + entity = TaxUnit + label = "Georgia additions to federal adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://houpl.org/wp-content/uploads/2023/01/2022-IT-511_Individual_Income_Tax_-Booklet-compressed.pdf#page=14" + "https://www.zillionforms.com/2021/I2122607361.PDF#page14" + ) + defined_for = StateCode.GA + + adds = "gov.states.ga.tax.income.additions.additions" diff --git a/fiscalsim_us/variables/gov/states/ga/ga_agi.py b/fiscalsim_us/variables/gov/states/ga/ga_agi.py new file mode 100644 index 000000000..c75e3949c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/ga_agi.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class ga_agi(Variable): + value_type = float + entity = TaxUnit + label = "Georgia adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://houpl.org/wp-content/uploads/2023/01/2022-IT-511_Individual_Income_Tax_-Booklet-compressed.pdf#page=14", + "https://www.zillionforms.com/2021/I2122607361.PDF#page14", + ) + defined_for = StateCode.GA + adds = ["adjusted_gross_income", "ga_additions"] + subtracts = ["ga_subtractions"] diff --git a/fiscalsim_us/variables/gov/states/ga/ga_subtractions.py b/fiscalsim_us/variables/gov/states/ga/ga_subtractions.py new file mode 100644 index 000000000..cc8c5d641 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/ga_subtractions.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ga_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "Georgia subtractions from federal adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://houpl.org/wp-content/uploads/2023/01/2022-IT-511_Individual_Income_Tax_-Booklet-compressed.pdf#page=14" + "https://www.zillionforms.com/2021/I2122607361.PDF#page14" + ) + defined_for = StateCode.GA + adds = "gov.states.ga.tax.income.subtractions.subtractions" diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/credits/cdcc/ga_cdcc.py b/fiscalsim_us/variables/gov/states/ga/tax/income/credits/cdcc/ga_cdcc.py new file mode 100644 index 000000000..4f1d370d0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/credits/cdcc/ga_cdcc.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ga_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "Georgia non-refundable dependent care credit" + unit = USD + definition_period = YEAR + defined_for = StateCode.GA + + def formula(tax_unit, period, parameters): + federal_cdcc = tax_unit("cdcc", period) + rate = parameters(period).gov.states.ga.tax.income.credits.cdcc.rate + return federal_cdcc * rate diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/credits/ga_low_income_credit.py b/fiscalsim_us/variables/gov/states/ga/tax/income/credits/ga_low_income_credit.py new file mode 100644 index 000000000..cb42092ee --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/credits/ga_low_income_credit.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class ga_low_income_credit(Variable): + value_type = float + entity = TaxUnit + label = "Georgia low income credit" + unit = USD + definition_period = YEAR + reference = "https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet/download" + defined_for = StateCode.GA + + def formula(tax_unit, period, parameters): + # We follow the legal code, which says (in addition to head and spouse): + # "multiplied by the number of dependents which the taxpayer is entitled to claim." + # The tax form excludes adult dependents: + # "Exemptions are self, spouse and natural or legally adopted children" + exemptions = tax_unit("exemptions", period) + p = parameters(period).gov.states.ga.tax.income.credits.low_income + # age threshold + age_threshold = p.supplement_age_eligibility + aged_head = (tax_unit("age_head", period) >= age_threshold).astype( + int + ) # if so, return 1, otherwise return 0 + aged_spouse = (tax_unit("age_spouse", period) >= age_threshold).astype( + int + ) # if so, return 1, otherwise return 0 + aged_count = aged_head + aged_spouse + total_exemptions = aged_count + exemptions + federal_agi = tax_unit("adjusted_gross_income", period) + amount_per_exemption = p.amount.calc(federal_agi) + return total_exemptions * amount_per_exemption diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/deductions/ga_deductions.py b/fiscalsim_us/variables/gov/states/ga/tax/income/deductions/ga_deductions.py new file mode 100644 index 000000000..5230bfb0b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/deductions/ga_deductions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class ga_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Georgia deductions" + unit = USD + definition_period = YEAR + defined_for = StateCode.GA diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/deductions/ga_standard_deduction.py b/fiscalsim_us/variables/gov/states/ga/tax/income/deductions/ga_standard_deduction.py new file mode 100644 index 000000000..bda126231 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/deductions/ga_standard_deduction.py @@ -0,0 +1,43 @@ +from fiscalsim_us.model_api import * + + +class ga_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Georgia standard deduction" + unit = USD + definition_period = YEAR + reference = ( + "https://apps.dor.ga.gov/FillableForms/PDFViewer/Index?form=2022GA500" + "https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=fb5db531-a80f-4790-bddb-eefc8327ef60&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65D2-CDH3-CGX8-044N-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr1&pditab=allpods&ecomp=8s65kkk&earg=sr1&prid=66f02b0a-c5ae-4162-9535-127751546807" + ) + defined_for = StateCode.GA + + def formula(tax_unit, period, parameters): + # person = tax_unit.members + p = parameters(period).gov.states.ga.tax.income.deductions.standard + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + base = p.amount[filing_status] + # Head gets extra standard deduction if aged and/or blind. + age_head = tax_unit("age_head", period) + eligible_aged_head = age_head >= p.aged.age_threshold + blind_head = tax_unit("blind_head", period) + extra_head = ( + blind_head * p.blind.head + eligible_aged_head * p.aged.amount.head + ) + + # Spouse gets extra standard deduction if aged and/or blind and filing jointly. + age_spouse = tax_unit("age_spouse", period) + eligible_aged_spouse = age_spouse >= p.aged.age_threshold + blind_spouse = tax_unit("blind_spouse", period) + extra_spouse = where( + filing_status == status.JOINT, + ( + blind_spouse * p.blind.spouse + + eligible_aged_spouse * p.aged.amount.spouse + ), + 0, + ) + # total extra deduction + return base + extra_head + extra_spouse diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/exemptions/ga_exemptions.py b/fiscalsim_us/variables/gov/states/ga/tax/income/exemptions/ga_exemptions.py new file mode 100644 index 000000000..7941439d6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/exemptions/ga_exemptions.py @@ -0,0 +1,30 @@ +from fiscalsim_us.model_api import * + + +class ga_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "Georgia Exemptions" + defined_for = StateCode.GA + unit = USD + definition_period = YEAR + reference = ( + "https://apps.dor.ga.gov/FillableForms/PDFViewer/Index?form=2022GA500", + "https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=2c053fd5-32c1-4cc1-86b0-36aaade9da5b&pdistocdocslideraccess=true&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A6348-G0H1-DYB7-W3JT-00008-00&pdcomponentid=234187&pdtocnodeidentifier=ABWAALAADAAL&ecomp=k2vckkk&prid=4862391c-e031-443f-ad52-ae86c6bb5ce2", + ) + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ga.tax.income.exemptions + filing_status = tax_unit("filing_status", period) + + # Personal Exemptions + personal_exemptions = p.personal[filing_status] + + # Dependent exemptions + dependents = tax_unit( + "tax_unit_dependents", period + ) # Total the number of dependents + dependent_exemptions = dependents * p.dependent + + # total exemptions + return personal_exemptions + dependent_exemptions diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/ga_income_tax.py b/fiscalsim_us/variables/gov/states/ga/tax/income/ga_income_tax.py new file mode 100644 index 000000000..842e2d4d0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/ga_income_tax.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class ga_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Georgia income tax after refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.GA + adds = ["ga_income_tax_before_refundable_credits"] + subtracts = ["ga_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/ga_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/ga/tax/income/ga_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..3c02b5564 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/ga_income_tax_before_refundable_credits.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class ga_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Georgia income tax before refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.GA + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ga.tax.income.main + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + income = tax_unit("ga_taxable_income", period) + return select( + [ + filing_status == status.SINGLE, + filing_status == status.SEPARATE, + filing_status == status.JOINT, + filing_status == status.HEAD_OF_HOUSEHOLD, + filing_status == status.WIDOW, + ], + [ + p.single.calc(income), + p.separate.calc(income), + p.joint.calc(income), + p.head_of_household.calc(income), + p.widow.calc(income), + ], + ) diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/ga_refundable_credits.py b/fiscalsim_us/variables/gov/states/ga/tax/income/ga_refundable_credits.py new file mode 100644 index 000000000..935a0913b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/ga_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class ga_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Georgia refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.GA diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/ga_taxable_income.py b/fiscalsim_us/variables/gov/states/ga/tax/income/ga_taxable_income.py new file mode 100644 index 000000000..35627af7e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/ga_taxable_income.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class ga_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Georgia taxable income" + unit = USD + definition_period = YEAR + reference = ( + "https://dor.georgia.gov/it-511-individual-income-tax-booklet" + # above reference provides access to booklets for all years + # definition of Georgia taxable income starts on page 12 + ) + defined_for = StateCode.GA + + def formula(tax_unit, period, parameters): + agi = tax_unit("ga_agi", period) + deductions = tax_unit("ga_deductions", period) + exemptions = tax_unit("ga_exemptions", period) + return max_(0, agi - deductions - exemptions) diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_investment_in_529_plan_deduction.py b/fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_investment_in_529_plan_deduction.py new file mode 100644 index 000000000..c04ae191e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_investment_in_529_plan_deduction.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class ga_investment_in_529_plan_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Georgia investment in 529 plan deduction" + unit = USD + definition_period = YEAR + reference = ( + "https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet" + "https://casetext.com/regulation/georgia-administrative-code/department-560-rules-of-department-of-revenue/chapter-560-7-income-tax-division/subject-560-7-4-net-taxable-income-individual/rule-560-7-4-04-procedures-governing-the-georgia-higher-education-savings-plan" + ) + defined_for = StateCode.GA diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_military_retirement_exclusion.py b/fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_military_retirement_exclusion.py new file mode 100644 index 000000000..0c612f173 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_military_retirement_exclusion.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ga_military_retirement_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "Georgia military retirement exclusion" + unit = USD + definition_period = YEAR + reference = ( + "https://dor.georgia.gov/document/booklet/2021-it-511-individual-income-tax-booklet/download#page=16" + "https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet/download#page=16" + "https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=fb5db531-a80f-4790-bddb-eefc8327ef60&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65D2-CDH3-CGX8-044N-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr1&pditab=allpods&ecomp=8s65kkk&earg=sr1&prid=66f02b0a-c5ae-4162-9535-127751546807" + ) + defined_for = StateCode.GA diff --git a/fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_retirement_exclusion.py b/fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_retirement_exclusion.py new file mode 100644 index 000000000..29e707bed --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ga/tax/income/subtractions/ga_retirement_exclusion.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ga_retirement_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "Georgia retirement exclusion" + unit = USD + definition_period = YEAR + reference = ( + "https://dor.georgia.gov/document/booklet/2021-it-511-individual-income-tax-booklet/download#page=15" + "https://dor.georgia.gov/document/document/2022-it-511-individual-income-tax-booklet/download#page=15" + "https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=fb5db531-a80f-4790-bddb-eefc8327ef60&config=00JAA1MDBlYzczZi1lYjFlLTQxMTgtYWE3OS02YTgyOGM2NWJlMDYKAFBvZENhdGFsb2feed0oM9qoQOMCSJFX5qkd&pddocfullpath=%2Fshared%2Fdocument%2Fstatutes-legislation%2Furn%3AcontentItem%3A65D2-CDH3-CGX8-044N-00008-00&pdcontentcomponentid=234186&pdteaserkey=sr1&pditab=allpods&ecomp=8s65kkk&earg=sr1&prid=66f02b0a-c5ae-4162-9535-127751546807" + ) + defined_for = StateCode.GA diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit.py b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit.py new file mode 100644 index 000000000..33a90e048 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class hi_food_excise_credit(Variable): + value_type = float + entity = TaxUnit + label = "Hawaii Food/Excise Tax Credit" + defined_for = StateCode.HI + unit = USD + definition_period = YEAR + reference = "https://files.hawaii.gov/tax/legal/hrs/hrs_235.pdf#page=44" + + def formula(tax_unit, period, parameters): + # Filer can not be a dependent on another return + dependent_on_another_return = tax_unit("dsi", period) + total_amount = add( + tax_unit, + period, + [ + "hi_food_excise_credit_minor_child_amount", + "hi_food_excise_exemption_amount", + ], + ) + + return ~dependent_on_another_return * total_amount diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_child_receiving_public_support.py b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_child_receiving_public_support.py new file mode 100644 index 000000000..017086503 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_child_receiving_public_support.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class hi_food_excise_credit_child_receiving_public_support(Variable): + value_type = bool + entity = Person + label = "Child received support for the hawaii food excise credit" + definition_period = YEAR + defined_for = StateCode.HI + + def formula(person, period, parameters): + p = parameters(period).gov.states.hi.tax.income.credits.food_excise_tax + child_support = person("child_support_received", period) + # Test if the child receive more than half support from public agency + # (tanf or social_security_survivor_benefits) + government_payments = add( + person, period, ["tanf_person", "social_security_survivors"] + ) + total_income = government_payments + child_support + # If zero total income, assign 0% public support. + public_support_percent = np.zeros_like(total_income) + mask = total_income > 0 + public_support_percent[mask] = ( + government_payments[mask] / total_income[mask] + ) + return ( + public_support_percent > p.minor_child.support_proportion_threshold + ) diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_amount.py b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_amount.py new file mode 100644 index 000000000..ca900b490 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_amount.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class hi_food_excise_credit_minor_child_amount(Variable): + value_type = float + entity = TaxUnit + label = "Minor child amount for the Hawaii Food/Excise Tax Credit" + definition_period = YEAR + defined_for = StateCode.HI + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.hi.tax.income.credits.food_excise_tax + + return p.minor_child.amount * tax_unit( + "hi_food_excise_credit_minor_child_count", period + ) diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_count.py b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_count.py new file mode 100644 index 000000000..901974e7c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_credit_minor_child_count.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class hi_food_excise_credit_minor_child_count(Variable): + value_type = float + entity = TaxUnit + label = "Minor child's number for the Hawaii Food/Excise Tax Credit" + definition_period = YEAR + defined_for = StateCode.HI + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.hi.tax.income.credits.food_excise_tax + person = tax_unit.members + public_support_over_half = person( + "hi_food_excise_credit_child_receiving_public_support", period + ) + is_child = person("is_child", period) + minor = person("age", period) < p.minor_child.age_threshold + eligible_minor_child = is_child & minor & public_support_over_half + + return tax_unit.sum(eligible_minor_child) diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.py b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.py new file mode 100644 index 000000000..4ba707b01 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/food_excise/hi_food_excise_exemption_amount.py @@ -0,0 +1,46 @@ +from fiscalsim_us.model_api import * + + +class hi_food_excise_exemption_amount(Variable): + value_type = float + entity = TaxUnit + label = "Exemption amount for Hawaii Food/Excise Tax Credit" + definition_period = YEAR + defined_for = StateCode.HI + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.hi.tax.income.credits.food_excise_tax + + income = tax_unit("adjusted_gross_income", period) + # Count exemptions as number of people. + # The legal code defines exemptions as Hawaii exemptions, + # which normally include additional exemptions for aged and disabled people, + # but excludes those additional exemptions for this program. + exemptions = tax_unit("exemptions", period) + # Reduce number of exemptions by the number of minor children + minor_children = tax_unit( + "hi_food_excise_credit_minor_child_count", period + ) + claimable_exemptions = exemptions - minor_children + # Determine the amount per exemption based on income + # and filing status + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + amount_per_exemption = select( + [ + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.HEAD_OF_HOUSEHOLD, + filing_status == status.SEPARATE, + filing_status == status.WIDOW, + ], + [ + p.amount.single.calc(income), + p.amount.joint.calc(income), + p.amount.head_of_household.calc(income), + p.amount.separate.calc(income), + p.amount.widow.calc(income), + ], + ) + + return claimable_exemptions * amount_per_exemption diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_eitc.py b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_eitc.py new file mode 100644 index 000000000..827b64708 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_eitc.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class hi_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Hawaii earned income tax credit" + defined_for = StateCode.HI + unit = USD + definition_period = YEAR + reference = "https://www.capitol.hawaii.gov/hrscurrent/Vol04_Ch0201-0257/HRS0235/HRS_0235-0055_0075.htm" + + def formula(tax_unit, period, parameters): + federal_eitc = tax_unit("earned_income_tax_credit", period) + rate = parameters(period).gov.states.hi.tax.income.credits.eitc.match + return rate * federal_eitc diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_low_income_household_renters_tax_credit.py b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_low_income_household_renters_tax_credit.py new file mode 100644 index 000000000..7d41e131c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_low_income_household_renters_tax_credit.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class hi_tax_credit_for_low_income_household_renters(Variable): + value_type = float + entity = TaxUnit + label = "Hawaii low income household renters tax credit" + unit = USD + definition_period = YEAR + defined_for = "hi_tax_credit_for_low_income_household_renters_eligible" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.hi.tax.income.credits.lihrtc + + # Aged extra exemptions + aged_head = ( + tax_unit("age_head", period) >= p.aged_age_threshold + ).astype(int) + aged_spouse = ( + tax_unit("age_spouse", period) >= p.aged_age_threshold + ).astype(int) + + aged_exemptions = aged_head + aged_spouse + exemptions = tax_unit("exemptions", period) + + total_exemptions = exemptions + aged_exemptions + return p.amount * total_exemptions diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_tax_credit_for_low_income_household_renters_eligible.py b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_tax_credit_for_low_income_household_renters_eligible.py new file mode 100644 index 000000000..2f1b24de9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/credits/hi_low_income_household_renters/hi_tax_credit_for_low_income_household_renters_eligible.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class hi_tax_credit_for_low_income_household_renters_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Hawaii low income household renters tax credit" + definition_period = YEAR + reference = "https://files.hawaii.gov/tax/legal/har/har_235.pdf#page=105" # §18-235-55.7 (b) + defined_for = StateCode.HI + + def formula(tax_unit, period, parameters): + dependent_on_another_return = tax_unit("dsi", period) + p = parameters(period).gov.states.hi.tax.income.credits.lihrtc + agi = tax_unit("adjusted_gross_income", period) + rent = add(tax_unit, period, ["rent"]) + return ( + (rent > p.eligibility.rent_threshold) + & (agi < p.eligibility.agi_limit) + & ~dependent_on_another_return + ) diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/hi_additions.py b/fiscalsim_us/variables/gov/states/hi/tax/income/hi_additions.py new file mode 100644 index 000000000..57b7a6348 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/hi_additions.py @@ -0,0 +1,11 @@ +from fiscalsim_us.model_api import * + + +class hi_additions(Variable): + value_type = float + entity = TaxUnit + label = "Hawaii additions to federal adjusted gross income" + reference = "https://files.hawaii.gov/tax/forms/2022/n11ins.pdf#page=11" + defined_for = StateCode.HI + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/hi_agi.py b/fiscalsim_us/variables/gov/states/hi/tax/income/hi_agi.py index 492ef6be6..2af3ad0ed 100644 --- a/fiscalsim_us/variables/gov/states/hi/tax/income/hi_agi.py +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/hi_agi.py @@ -10,3 +10,7 @@ class hi_agi(Variable): definition_period = YEAR # Hawaii Instructions for Form N-11 Rev 2022 (p4) reference = " https://files.hawaii.gov/tax/forms/2022/n11ins.pdf" + + adds = ["hi_additions", "adjusted_gross_income"] + subtracts = ["hi_subtractions"] + # According to the tax form, Hawaii AGI can be negative. diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/hi_subtractions.py b/fiscalsim_us/variables/gov/states/hi/tax/income/hi_subtractions.py new file mode 100644 index 000000000..fe6dfc67d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/hi_subtractions.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class hi_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "Hawaii subtractions from federal adjusted gross income" + reference = "https://files.hawaii.gov/tax/forms/2022/n11ins.pdf#page=13" + defined_for = StateCode.HI + unit = USD + definition_period = YEAR + adds = "gov.states.hi.tax.income.subtractions" diff --git a/fiscalsim_us/variables/gov/states/hi/tax/income/subtractions/hi_military_pay_exclusion.py b/fiscalsim_us/variables/gov/states/hi/tax/income/subtractions/hi_military_pay_exclusion.py new file mode 100644 index 000000000..0427fe582 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/hi/tax/income/subtractions/hi_military_pay_exclusion.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class hi_military_pay_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "Hawaii military reserve or national guard duty pay exclusion" + unit = USD + documentation = ( + "https://files.hawaii.gov/tax/forms/2022/n11ins.pdf#page=13" + ) + definition_period = YEAR + defined_for = StateCode.HI diff --git a/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_fedtax_deduction.py b/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_fedtax_deduction.py index bfd0290fb..0a7d9b18e 100644 --- a/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_fedtax_deduction.py +++ b/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_fedtax_deduction.py @@ -27,17 +27,14 @@ def formula(person, period, parameters): us_tax = ustax + person.tax_unit("non_refundable_ctc", period) else: us_tax = ustax + # remove SECA and Additional Medicare taxes + amtax = person.tax_unit("additional_medicare_tax", period) + setax = add(person.tax_unit, period, ["self_employment_tax"]) + agg_tax = max_(0.0, us_tax - amtax - setax) + # project agg_tax to head and spouse in net_tax variable is_head = person("is_tax_unit_head", period) is_spouse = person("is_tax_unit_spouse", period) - additional_hi_tax = person.tax_unit("additional_medicare_tax", period) - aggregate_tax = (is_head | is_spouse) * (us_tax - additional_hi_tax) - # prorate aggregate_tax among head and spouse according to net incomes + net_tax = (is_head | is_spouse) * agg_tax + # prorate net_tax among head and spouse according to net incomes fraction = person("ia_prorate_fraction", period) - prorated_tax = fraction * aggregate_tax - # allocate any dependent self-employment tax to tax unit head - indiv_setax = person("self_employment_tax", period) - is_dependent = person("is_tax_unit_dependent", period) - sum_dep_setax = person.tax_unit.sum(is_dependent * indiv_setax) - setax = ~is_dependent * indiv_setax + is_head * sum_dep_setax - # return prorated_tax less setax - return max_(0, prorated_tax - setax) + return fraction * net_tax diff --git a/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_itemized_deductions_unit.py b/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_itemized_deductions_unit.py index 6ec21bf7d..bdc94fbe0 100644 --- a/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_itemized_deductions_unit.py +++ b/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_itemized_deductions_unit.py @@ -24,12 +24,6 @@ def formula(tax_unit, period, parameters): federal dollar limitation. """ # compute tax unit's itemized deductions - p = parameters(period).gov.irs.deductions - itm_deds = [ - deduction - for deduction in p.itemized_deductions - if deduction not in ["salt_deduction"] - ] - us_itemized_deductions_less_salt = add(tax_unit, period, itm_deds) + itm_deds_less_salt = tax_unit("itemized_deductions_less_salt", period) uncapped_property_taxes = add(tax_unit, period, ["real_estate_taxes"]) - return us_itemized_deductions_less_salt + uncapped_property_taxes + return itm_deds_less_salt + uncapped_property_taxes diff --git a/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_qbi_deduction.py b/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_qbi_deduction.py index a3e712730..5842b3a32 100644 --- a/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_qbi_deduction.py +++ b/fiscalsim_us/variables/gov/states/ia/tax/income/deductions/ia_qbi_deduction.py @@ -16,6 +16,13 @@ class ia_qbi_deduction(Variable): defined_for = StateCode.IA def formula(person, period, parameters): - fed_qbid = person("qbid_amount", period) + fed_indv_qbid = person("qbid_amount", period) + tax_unit = person.tax_unit + fed_unit_qbid = tax_unit("qualified_business_income_deduction", period) + # avoid divide-by-zero warnings by not using where() function + reduction_factor = np.ones_like(fed_indv_qbid) + mask = fed_indv_qbid > 0 + reduction_factor[mask] = fed_unit_qbid[mask] / fed_indv_qbid[mask] + fed_qbid = fed_indv_qbid * reduction_factor p = parameters(period).gov.states.ia.tax.income return fed_qbid * p.deductions.qualified_business_income.fraction diff --git a/fiscalsim_us/variables/gov/states/ia/tax/income/ia_alternate_tax_unit.py b/fiscalsim_us/variables/gov/states/ia/tax/income/ia_alternate_tax_unit.py index 107ec2968..75c274e82 100644 --- a/fiscalsim_us/variables/gov/states/ia/tax/income/ia_alternate_tax_unit.py +++ b/fiscalsim_us/variables/gov/states/ia/tax/income/ia_alternate_tax_unit.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class ia_alternate_tax_unit(Variable): diff --git a/fiscalsim_us/variables/gov/states/ia/tax/income/ia_amt_indiv.py b/fiscalsim_us/variables/gov/states/ia/tax/income/ia_amt_indiv.py index 9947ff65a..e66c08559 100644 --- a/fiscalsim_us/variables/gov/states/ia/tax/income/ia_amt_indiv.py +++ b/fiscalsim_us/variables/gov/states/ia/tax/income/ia_amt_indiv.py @@ -20,9 +20,11 @@ def formula(person, period, parameters): reg_taxinc = person("ia_taxable_income_indiv", period) std_ded = person("ia_standard_deduction_indiv", period) itm_ded = person("ia_itemized_deductions_indiv", period) + prorate_frac = person("ia_prorate_fraction", period) + proptax = add(person.tax_unit, period, ["real_estate_taxes"]) amt_taxinc = where( itm_ded > std_ded, - reg_taxinc + person("real_estate_taxes", period), + reg_taxinc + prorate_frac * proptax, reg_taxinc, ) # compute AMT amount diff --git a/fiscalsim_us/variables/gov/states/ia/tax/income/ia_amt_joint.py b/fiscalsim_us/variables/gov/states/ia/tax/income/ia_amt_joint.py index 61afa110c..a5f5e4efb 100644 --- a/fiscalsim_us/variables/gov/states/ia/tax/income/ia_amt_joint.py +++ b/fiscalsim_us/variables/gov/states/ia/tax/income/ia_amt_joint.py @@ -20,9 +20,11 @@ def formula(person, period, parameters): reg_taxinc = person("ia_taxable_income_joint", period) std_ded = person("ia_standard_deduction_joint", period) itm_ded = person("ia_itemized_deductions_joint", period) + is_head = person("is_tax_unit_head", period) + proptax = add(person.tax_unit, period, ["real_estate_taxes"]) amt_taxinc = where( itm_ded > std_ded, - reg_taxinc + person("real_estate_taxes", period), + reg_taxinc + is_head * proptax, reg_taxinc, ) # compute AMT amount diff --git a/fiscalsim_us/variables/gov/states/ia/tax/income/ia_reduced_tax.py b/fiscalsim_us/variables/gov/states/ia/tax/income/ia_reduced_tax.py index 6d8a786ef..0aa2aa653 100644 --- a/fiscalsim_us/variables/gov/states/ia/tax/income/ia_reduced_tax.py +++ b/fiscalsim_us/variables/gov/states/ia/tax/income/ia_reduced_tax.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class ia_reduced_tax(Variable): diff --git a/fiscalsim_us/variables/gov/states/ia/tax/income/net_income/ia_prorate_fraction.py b/fiscalsim_us/variables/gov/states/ia/tax/income/net_income/ia_prorate_fraction.py index 90b661788..50af63553 100644 --- a/fiscalsim_us/variables/gov/states/ia/tax/income/net_income/ia_prorate_fraction.py +++ b/fiscalsim_us/variables/gov/states/ia/tax/income/net_income/ia_prorate_fraction.py @@ -18,9 +18,13 @@ class ia_prorate_fraction(Variable): def formula(person, period, parameters): net_income = person("ia_net_income", period) total_net_income = person.tax_unit.sum(net_income) - # If no net income, then assign entirely to head. + # avoid divide-by-zero warnings when using where() function + fraction = np.zeros_like(total_net_income) + mask = total_net_income != 0 + fraction[mask] = net_income[mask] / total_net_income[mask] + # if no net income, then assign entirely to head. return where( total_net_income == 0, person("is_tax_unit_head", period), - net_income / total_net_income, + fraction, ) diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/credits/id_ctc.py b/fiscalsim_us/variables/gov/states/id/tax/income/credits/id_ctc.py new file mode 100644 index 000000000..2a2bca9db --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/credits/id_ctc.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class id_ctc(Variable): + value_type = float + entity = TaxUnit + label = "Idaho Child Tax Credit" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + + def formula(tax_unit, period, parameters): + # Get relevant parameter subtree. + p = parameters(period).gov.states.id.tax.income.credits.ctc + # "the term "qualifying child" has the meaning as defined in section 24(c) of the Internal Revenue Code." + # IRC 24(c) defines eligible children under the federal CTC. + eligible_children = tax_unit("ctc_qualifying_children", period) + # Multiply by the amount per child. + return eligible_children * p.amount diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/deductions/id_deductions.py b/fiscalsim_us/variables/gov/states/id/tax/income/deductions/id_deductions.py new file mode 100644 index 000000000..ff88813ff --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/deductions/id_deductions.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class id_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Idaho deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://legislature.idaho.gov/statutesrules/idstat/Title63/T63CH30/SECT63-3022/", # (j) + "https://tax.idaho.gov/wp-content/uploads/forms/EIN00046/EIN00046_03-01-2023.pdf#page=8", + ) + defined_for = StateCode.ID + + def formula(tax_unit, period, parameters): + itm_ded = tax_unit("itemized_deductions_less_salt", period) + std_ded = tax_unit("standard_deduction", period) + # We do not model qualified business income deduction for Idaho + return max_(itm_ded, std_ded) diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/id_additions.py b/fiscalsim_us/variables/gov/states/id/tax/income/id_additions.py new file mode 100644 index 000000000..6c41a27e2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/id_additions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class id_additions(Variable): + value_type = float + entity = TaxUnit + label = "Idaho additions" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/id_agi.py b/fiscalsim_us/variables/gov/states/id/tax/income/id_agi.py new file mode 100644 index 000000000..c2166a080 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/id_agi.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class id_agi(Variable): + value_type = float + entity = TaxUnit + label = "Idaho adjusted gross income" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + + adds = ["id_additions", "adjusted_gross_income"] + subtracts = ["id_subtractions"] diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax.py b/fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax.py new file mode 100644 index 000000000..303de062b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class id_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Idaho income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + adds = ["id_income_tax_before_refundable_credits"] + subtracts = ["id_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.py new file mode 100644 index 000000000..5eee14f6f --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax_before_non_refundable_credits.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class id_income_tax_before_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Idaho income tax before non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + + def formula(tax_unit, period, parameters): + income = tax_unit("id_taxable_income", period) + rates = parameters(period).gov.states.id.tax.income.main + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + return select( + [ + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.SEPARATE, + filing_status == status.WIDOW, + filing_status == status.HEAD_OF_HOUSEHOLD, + ], + [ + rates.single.calc(income), + rates.joint.calc(income), + rates.separate.calc(income), + rates.widow.calc(income), + rates.head_of_household.calc(income), + ], + ) diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..f72e14d8d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/id_income_tax_before_refundable_credits.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class id_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Idaho income tax before refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + + def formula(tax_unit, period, parameters): + before_non_refundable_credits = tax_unit( + "id_income_tax_before_non_refundable_credits", period + ) + non_refundable_credits = tax_unit("id_non_refundable_credits", period) + return max_(before_non_refundable_credits - non_refundable_credits, 0) diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/id_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/id/tax/income/id_non_refundable_credits.py new file mode 100644 index 000000000..d29a259a1 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/id_non_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class id_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Idaho non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/id_refundable_credits.py b/fiscalsim_us/variables/gov/states/id/tax/income/id_refundable_credits.py new file mode 100644 index 000000000..f0c50123e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/id_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class id_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Idaho refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/id_taxable_income.py b/fiscalsim_us/variables/gov/states/id/tax/income/id_taxable_income.py new file mode 100644 index 000000000..00834148d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/id_taxable_income.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class id_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Idaho taxable income" + unit = USD + documentation = "Idaho taxable income" + definition_period = YEAR + reference = "https://tax.idaho.gov/wp-content/uploads/forms/EFO00089/EFO00089_12-30-2022.pdf#page=1" + defined_for = StateCode.ID + + def formula(tax_unit, period, parameters): + agi = tax_unit("id_agi", period) + deductions = tax_unit("id_deductions", period) + return max_(0, agi - deductions) diff --git a/fiscalsim_us/variables/gov/states/id/tax/income/subtractions/id_subtractions.py b/fiscalsim_us/variables/gov/states/id/tax/income/subtractions/id_subtractions.py new file mode 100644 index 000000000..f2f113d13 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/id/tax/income/subtractions/id_subtractions.py @@ -0,0 +1,11 @@ +from fiscalsim_us.model_api import * + + +class id_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "Idaho subtractions" + unit = USD + definition_period = YEAR + defined_for = StateCode.ID + adds = "gov.states.id.tax.income.subtractions.subtractions" diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_add_backs.py b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_add_backs.py index 53d9936af..d3fc52f61 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_add_backs.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_add_backs.py @@ -4,7 +4,7 @@ class in_add_backs(Variable): value_type = float entity = TaxUnit - label = "IN add-backs" + label = "Indiana add-backs" unit = USD definition_period = YEAR reference = ( diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_bonus_depreciation_add_back.py b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_bonus_depreciation_add_back.py index 0e3049101..c96a76869 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_bonus_depreciation_add_back.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_bonus_depreciation_add_back.py @@ -4,7 +4,7 @@ class in_bonus_depreciation_add_back(Variable): value_type = float entity = TaxUnit - label = "IN bonus depreciation add back" + label = "Indiana bonus depreciation add back" definition_period = YEAR documentation = "Income (or loss) included in Federal AGI under Section 168(k)'s bonus depreciation less the amount that would have been included without it." reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(15) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_nol_add_back.py b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_nol_add_back.py index 06346c698..c72ce6b6a 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_nol_add_back.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_nol_add_back.py @@ -4,7 +4,7 @@ class in_nol_add_back(Variable): value_type = float entity = TaxUnit - label = "IN net operating loss add back" + label = "Indiana net operating loss add back" definition_period = YEAR documentation = ( "Add back for net operating losses reported on federal Schedule 1." diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_oos_municipal_obligation_interest_add_back.py b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_oos_municipal_obligation_interest_add_back.py index 324ceb2bd..48a4afcfc 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_oos_municipal_obligation_interest_add_back.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_oos_municipal_obligation_interest_add_back.py @@ -4,7 +4,7 @@ class in_oos_municipal_obligation_interest_add_back(Variable): value_type = float entity = TaxUnit - label = "IN out-of-state municipal obligation interest add back" + label = "Indiana out-of-state municipal obligation interest add back" definition_period = YEAR documentation = "Add back for interest earned from a direct obligation of a state or political subdivision other than Indiana for obligations purchased after Dec. 31, 2011." reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(21) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_other_add_backs.py b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_other_add_backs.py index 56ea84fb3..e98f4f1ec 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_other_add_backs.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_other_add_backs.py @@ -4,7 +4,7 @@ class in_other_add_backs(Variable): value_type = float entity = TaxUnit - label = "IN other add backs" + label = "Indiana other add backs" definition_period = YEAR documentation = "Other add backs including those for Conformity, Employer Student Loan Payment, Meal Deductions, Student Loan Discharges, Excess Federal Interest Deduction Modification, Federal Repatriated Dividend Deductions, Qualified Preferred Stock, and Catch-Up Modifications." reference = ( diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_section_179_expense_add_back.py b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_section_179_expense_add_back.py index 7632b5084..6f87b6b7c 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_section_179_expense_add_back.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_section_179_expense_add_back.py @@ -4,7 +4,7 @@ class in_section_179_expense_add_back(Variable): value_type = float entity = TaxUnit - label = "IN Section 179 Expense Add Back" + label = "Indiana Section 179 Expense Add Back" definition_period = YEAR documentation = "Federal IRC Section 179 expenses less IRC Section 179 expenses if they had been calculated with a $25,000 ceiling." reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(17)(A) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_tax_add_back.py b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_tax_add_back.py index a547e95b1..7895ca549 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_tax_add_back.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/add_backs/in_tax_add_back.py @@ -4,7 +4,7 @@ class in_tax_add_back(Variable): value_type = float entity = TaxUnit - label = "IN tax add back" + label = "Indiana tax add back" definition_period = YEAR documentation = "Add backs for certain taxes deducted from federal Schedules C, C-EZ, E and/or F." reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(2) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc.py b/fiscalsim_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc.py new file mode 100644 index 000000000..3c863a9ab --- /dev/null +++ b/fiscalsim_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc.py @@ -0,0 +1,49 @@ +from fiscalsim_us.model_api import * + + +class in_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Indiana earned income tax credit" + unit = USD + definition_period = YEAR + reference = "https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21" + defined_for = "in_eitc_eligible" + + def formula(tax_unit, period, parameters): + ip = parameters(period).gov.states["in"].tax.income.credits + if not ip.earned_income.decoupled: + federal_eitc = tax_unit("earned_income_tax_credit", period) + return federal_eitc * ip.earned_income.match_rate + # if Indiana EITC is decoupled from federal EITC + fp = parameters(period).gov.irs.credits + # ... cap child count + kid_cap = ip.earned_income.max_children + kids = min_(kid_cap, tax_unit("eitc_child_count", period)) + # ... specify decoupled parameter values + maximum = fp.eitc.max.calc(kids) + pi_rate = fp.eitc.phase_in_rate.calc(kids) + po_start = fp.eitc.phase_out.start.calc(kids) # no JOINT bonus + po_rate = fp.eitc.phase_out.rate.calc(kids) + if str(period) == "2021": + # ... additional decoupling of parameters for childless taxpayers + maximum0 = ip.earned_income.childless.maximum + pi_rate0 = ip.earned_income.childless.phase_in_rate + po_start0 = ip.earned_income.childless.phase_out_start + po_rate0 = ip.earned_income.childless.phase_out_rate + # ... integrate in childless parameters + maximum = where(kids == 0, maximum0, maximum) + pi_rate = where(kids == 0, pi_rate0, pi_rate) + po_start = where(kids == 0, po_start0, po_start) + po_rate = where(kids == 0, po_rate0, po_rate) + # ... calculate eitc phase-in amount + earnings = max_(0, tax_unit("filer_earned", period)) + phase_in_amount = min_(earnings * pi_rate, maximum) + # ... calculate eitc reduction + federal_agi = tax_unit("adjusted_gross_income", period) + higher_income = max_(earnings, federal_agi) + reduction = po_rate * max_(0, higher_income - po_start) + # ... calculate decoupled eitc amount + amount = min_(phase_in_amount, max_(0, maximum - reduction)) + # ... match decoupled eitc amount to get Indiana eitc + return amount * ip.earned_income.match_rate diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc_eligible.py b/fiscalsim_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc_eligible.py new file mode 100644 index 000000000..c87ab136d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/in/tax/income/credits/earned_income_credit/in_eitc_eligible.py @@ -0,0 +1,42 @@ +from fiscalsim_us.model_api import * + + +class in_eitc_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Indiana earned income tax credit eligibility status" + unit = USD + definition_period = YEAR + reference = "https://iga.in.gov/laws/2021/ic/titles/6#6-3.1-21" + defined_for = StateCode.IN + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states["in"].tax.income + # check federal eitc receipt + gets_federal_eitc = tax_unit("earned_income_tax_credit", period) > 0 + if not p.credits.earned_income.decoupled: + return gets_federal_eitc + # if Indiana EITC is decoupled from federal EITC + # ... check separate filing status + filing_status = tax_unit("filing_status", period) + separate = filing_status == filing_status.possible_values.SEPARATE + # ... check age eligibility for childless taxpayers + is_childless = tax_unit("eitc_child_count", period) == 0 + min_age = p.credits.earned_income.childless.min_age + max_age = p.credits.earned_income.childless.max_age + age_head = tax_unit("age_head", period) + age_spouse = tax_unit("age_spouse", period) + head_age_eligible = (age_head >= min_age) & (age_head <= max_age) + spouse_age_eligible = (age_spouse >= min_age) & (age_spouse <= max_age) + married = filing_status.possible_values.JOINT + age_eligible = where( + married, head_age_eligible | spouse_age_eligible, head_age_eligible + ) + childless_age_eligible = where(is_childless, age_eligible, True) + # ... check investment income eligibility + invinc = tax_unit("eitc_relevant_investment_income", period) + invinc_limit = p.credits.earned_income.investment_income_limit + invinc_eligible = invinc <= invinc_limit + # ... determine Indiana EITC eligibility status + in_eligible = ~separate & childless_age_eligible & invinc_eligible + return gets_federal_eitc & in_eligible diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/credits/elderly_tax_credit/in_unified_elderly_tax_credit.py b/fiscalsim_us/variables/gov/states/in/tax/income/credits/elderly_tax_credit/in_unified_elderly_tax_credit.py new file mode 100644 index 000000000..97eb7bfc3 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/in/tax/income/credits/elderly_tax_credit/in_unified_elderly_tax_credit.py @@ -0,0 +1,34 @@ +from fiscalsim_us.model_api import * + + +class in_unified_elderly_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "Indiana unified elderly tax credit" + unit = USD + definition_period = YEAR + reference = ( + "https://iga.in.gov/laws/2021/ic/titles/6#6-3-3-9" + "https://iga.in.gov/laws/2022/ic/titles/6#6-3-3-9" + ) + defined_for = StateCode.IN + + def formula(tax_unit, period, parameters): + federal_agi = tax_unit("adjusted_gross_income", period) + p = parameters(period).gov.states["in"].tax.income.credits + head_age = tax_unit("age_head", period) + aged_head = (head_age >= p.unified_elderly.min_age).astype(int) + spouse_age = tax_unit("age_spouse", period) + aged_spouse = (spouse_age >= p.unified_elderly.min_age).astype(int) + aged_count = aged_head + aged_spouse + return select( + [ + aged_count == 1, + aged_count == 2, + ], + [ + p.unified_elderly.amount.one_aged.calc(federal_agi), + p.unified_elderly.amount.two_aged.calc(federal_agi), + ], + default=0, + ) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/credits/in_refundable_credits.py b/fiscalsim_us/variables/gov/states/in/tax/income/credits/in_refundable_credits.py new file mode 100644 index 000000000..e9c554129 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/in/tax/income/credits/in_refundable_credits.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class in_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Indiana refundable income tax credits" + unit = USD + definition_period = YEAR + reference = "https://iga.in.gov/laws/2021/ic/titles/6#6-3.1" + defined_for = StateCode.IN + # Use this instead of the parameter because the .in breaks the adds. + # Use this instead of a formula so the app displays the breakdown. + adds = ["in_eitc", "in_unified_elderly_tax_credit"] diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_deductions.py b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_deductions.py index adefc060b..136d050df 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_deductions.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_deductions.py @@ -4,7 +4,7 @@ class in_deductions(Variable): value_type = float entity = TaxUnit - label = "IN deductions" + label = "Indiana deductions" unit = USD definition_period = YEAR reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3" diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_homeowners_property_tax.py b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_homeowners_property_tax.py deleted file mode 100644 index e508c4947..000000000 --- a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_homeowners_property_tax.py +++ /dev/null @@ -1,13 +0,0 @@ -from fiscalsim_us.model_api import * - - -class in_homeowners_property_tax(Variable): - value_type = float - entity = TaxUnit - label = "IN rent" - unit = USD - definition_period = YEAR - documentation = "Property taxes paid on a principal place of residence that was subject to Indiana property tax." - reference = ( - "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" - ) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_homeowners_property_tax_deduction.py b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_homeowners_property_tax_deduction.py index 316679f5d..d729a9cc4 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_homeowners_property_tax_deduction.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_homeowners_property_tax_deduction.py @@ -4,16 +4,14 @@ class in_homeowners_property_tax_deduction(Variable): value_type = float entity = TaxUnit - label = "IN homeowner's residential property tax deduction" + label = "Indiana homeowner's residential property tax deduction" unit = USD definition_period = YEAR reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3" def formula(tax_unit, period, parameters): - p = parameters(period).gov.states["in"].tax.income.deductions + p = parameters(period).gov.states["in"].tax.income filing_status = tax_unit("filing_status", period) - max_homeowners_property_tax_deduction = p.homeowners_property_tax.max[ - filing_status - ] - property_tax = tax_unit("in_homeowners_property_tax", period) - return min_(property_tax, max_homeowners_property_tax_deduction) + max_deduction = p.deductions.homeowners_property_tax.max[filing_status] + property_tax = add(tax_unit, period, ["real_estate_taxes"]) + return min_(property_tax, max_deduction) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_military_service_deduction.py b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_military_service_deduction.py index 5b7285bf7..9b392e12f 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_military_service_deduction.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_military_service_deduction.py @@ -4,7 +4,7 @@ class in_military_service_deduction(Variable): value_type = float entity = TaxUnit - label = "IN military service deduction" + label = "Indiana military service deduction" definition_period = YEAR unit = USD reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-4" # (a)(1) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_nol.py b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_nol.py index 105cf2124..7bc393d0b 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_nol.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_nol.py @@ -4,7 +4,7 @@ class in_nol(Variable): value_type = float entity = TaxUnit - label = "IN nol" + label = "Indiana NOL" unit = USD definition_period = YEAR documentation = "Net operating losses allowable for deduction in Indiana." diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.py b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.py index 4b742c9be..081ee2b20 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_nonpublic_school_deduction.py @@ -4,7 +4,7 @@ class in_nonpublic_school_deduction(Variable): value_type = float entity = TaxUnit - label = "Nonpublic school expenditures deduction for IN" + label = "Indiana nonpublic school expenditures deduction" definition_period = YEAR unit = USD reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-22" # (d)(1) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_other_deductions.py b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_other_deductions.py index cbb626758..7430ec6a6 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_other_deductions.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_other_deductions.py @@ -4,7 +4,7 @@ class in_other_deductions(Variable): value_type = float entity = TaxUnit - label = "IN other deductions" + label = "Indiana other deductions" unit = USD definition_period = YEAR documentation = "Other deductions available in Indiana including those for civil service annuities, disability retirement, government or civic group capital contributions, human services for Medicaid recipients, infrastructure fund gifts, indiana lottery winings annuity, Indiana partnership long-term care policy premiums, military retirement income or survivor's benefits, National Guard and reserve component members, Olympic/Paralymic medal winners, qualified patents income eemption, railroad unemployment and sickness benefits, repayment of previously taxed income deductions, COVID-related employee retention credit dissalowed expenses, and Indiana-only tax-exempt bonds." diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_renters_deduction.py b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_renters_deduction.py index c884a849b..2dc14722a 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_renters_deduction.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_renters_deduction.py @@ -4,15 +4,14 @@ class in_renters_deduction(Variable): value_type = float entity = TaxUnit - label = "IN renter's deductions" + label = "Indiana renter's deduction" unit = USD definition_period = YEAR reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-6" def formula(tax_unit, period, parameters): - p = parameters(period).gov.states["in"].tax.income.deductions + p = parameters(period).gov.states["in"].tax.income filing_status = tax_unit("filing_status", period) - max_renters_deduction = p.renters.max[filing_status] - in_rent = add(tax_unit, period, ["rent"]) - # using national rent var to save mem but law specifices only IN rent allowed - return min_(in_rent, max_renters_deduction) + max_deduction = p.deductions.renters.max[filing_status] + rent_paid = add(tax_unit, period, ["rent"]) + return min_(rent_paid, max_deduction) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_unemployment_compensation_deduction.py b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_unemployment_compensation_deduction.py index 619ba5bb0..4dcbdffaf 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_unemployment_compensation_deduction.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/deductions/in_unemployment_compensation_deduction.py @@ -4,7 +4,7 @@ class in_unemployment_compensation_deduction(Variable): value_type = float entity = TaxUnit - label = "IN Unemployment compensation deduction" + label = "Indiana unemployment compensation deduction" unit = USD definition_period = YEAR reference = ( @@ -21,7 +21,7 @@ def formula(tax_unit, period, parameters): agi_reduction = p.unemployment_compensation.agi_reduction[ filing_status ] - reduced_agi = max(0, federal_agi - agi_reduction) + reduced_agi = max_(0, federal_agi - agi_reduction) reduced_agi_haircut = p.unemployment_compensation.reduced_agi_haircut in_taxable_unemployment_compensation = min_( (reduced_agi_haircut * reduced_agi), diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_additional_exemptions.py b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_additional_exemptions.py index 2fc2322dd..90b8e62b8 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_additional_exemptions.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_additional_exemptions.py @@ -4,7 +4,7 @@ class in_additional_exemptions(Variable): value_type = float entity = TaxUnit - label = "IN additional exemptions" + label = "Indiana additional exemptions" unit = USD definition_period = YEAR reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(4)(A) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_aged_blind_exemptions.py b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_aged_blind_exemptions.py index 3e5b3ed7f..ec0a2849a 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_aged_blind_exemptions.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_aged_blind_exemptions.py @@ -4,7 +4,7 @@ class in_aged_blind_exemptions(Variable): value_type = float entity = TaxUnit - label = "IN exemptions for aged and or blind" + label = "Indiana exemptions for aged and or blind" unit = USD definition_period = YEAR reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(4)(B) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_aged_low_agi_exemptions.py b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_aged_low_agi_exemptions.py index abb1a7e94..dc2aa624b 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_aged_low_agi_exemptions.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_aged_low_agi_exemptions.py @@ -4,7 +4,7 @@ class in_aged_low_agi_exemptions(Variable): value_type = float entity = TaxUnit - label = "IN base exemptions" + label = "Indiana aged and low-AGI exemptions" unit = USD definition_period = YEAR reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(5)(C) @@ -18,9 +18,7 @@ def formula(tax_unit, period, parameters): federal_agi = tax_unit("adjusted_gross_income", period) aged_head = tax_unit("aged_head", period).astype(int) aged_spouse = tax_unit("aged_spouse", period).astype(int) - income_eligible = where( - federal_agi < threshold, 1, 0 - ) # The law specifies "Less than". + income_eligible = federal_agi < threshold return ( income_eligible * (aged_head + aged_spouse) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_base_exemptions.py b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_base_exemptions.py index 36abfd88d..e0a8b7a37 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_base_exemptions.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_base_exemptions.py @@ -4,7 +4,7 @@ class in_base_exemptions(Variable): value_type = float entity = TaxUnit - label = "IN base exemptions" + label = "Indiana base exemptions" unit = USD definition_period = YEAR reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(3)-(4) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_exemptions.py b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_exemptions.py index 95d90e97b..dab554e08 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_exemptions.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_exemptions.py @@ -4,7 +4,7 @@ class in_exemptions(Variable): value_type = float entity = TaxUnit - label = "IN exemptions" + label = "Indiana exemptions" unit = USD definition_period = YEAR reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (a)(1)-(5) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.py b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.py index f69f14771..486406bbe 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_is_qualifying_dependent_child.py @@ -4,7 +4,7 @@ class in_is_qualifying_dependent_child(Variable): value_type = bool entity = Person - label = "IN additional exemption qualifying dependent child" + label = "Indiana additional exemption qualifying dependent child" definition_period = YEAR reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-1-3.5" # (5)(B)(i) defined_for = StateCode.IN diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_qualifying_child_count.py b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_qualifying_child_count.py index 823752856..7b064aa68 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_qualifying_child_count.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/exemptions/in_qualifying_child_count.py @@ -4,7 +4,7 @@ class in_qualifying_child_count(Variable): value_type = int entity = TaxUnit - label = "IN qualifying dependent child count" + label = "Indiana qualifying dependent child count" unit = "child" documentation = ( "Number of qualifying children for the IN additional exemption." diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/in_agi.py b/fiscalsim_us/variables/gov/states/in/tax/income/in_agi.py index 9c502b61e..dd34d8edf 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/in_agi.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/in_agi.py @@ -4,7 +4,7 @@ class in_agi(Variable): value_type = float entity = TaxUnit - label = "IN adjusted gross income" + label = "Indiana adjusted gross income" unit = USD definition_period = YEAR reference = ( diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/taxes/in_agi_tax.py b/fiscalsim_us/variables/gov/states/in/tax/income/in_agi_tax.py similarity index 64% rename from fiscalsim_us/variables/gov/states/in/tax/income/taxes/in_agi_tax.py rename to fiscalsim_us/variables/gov/states/in/tax/income/in_agi_tax.py index 216a927cf..987ca46db 100644 --- a/fiscalsim_us/variables/gov/states/in/tax/income/taxes/in_agi_tax.py +++ b/fiscalsim_us/variables/gov/states/in/tax/income/in_agi_tax.py @@ -4,12 +4,13 @@ class in_agi_tax(Variable): value_type = float entity = TaxUnit - label = "IN adjusted gross income tax" + label = "Indiana adjusted gross income tax" definition_period = YEAR unit = USD reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/006#6-3-2-1" # (a)(3) + defined_for = StateCode.IN def formula(tax_unit, period, parameters): - p = parameters(period).gov.states["in"].tax.income.taxes.agi + p = parameters(period).gov.states["in"].tax.income in_agi = tax_unit("in_agi", period) - return in_agi * p.rate + return max_(0, in_agi * p.agi_rate) diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/in_income_tax.py b/fiscalsim_us/variables/gov/states/in/tax/income/in_income_tax.py new file mode 100644 index 000000000..12d598f0e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/in/tax/income/in_income_tax.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class in_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Indiana income tax" + definition_period = YEAR + unit = USD + reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/6" + defined_for = StateCode.IN + + adds = ["in_income_tax_before_refundable_credits"] + subtracts = ["in_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/in_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/in/tax/income/in_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..28bce5a34 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/in/tax/income/in_income_tax_before_refundable_credits.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class in_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Indiana income tax before refundable credits" + definition_period = YEAR + unit = USD + reference = "http://iga.in.gov/legislative/laws/2021/ic/titles/6" + defined_for = StateCode.IN + + adds = ["in_agi_tax", "in_use_tax"] diff --git a/fiscalsim_us/variables/gov/states/in/tax/income/taxes/in_other_taxes.py b/fiscalsim_us/variables/gov/states/in/tax/income/taxes/in_other_taxes.py deleted file mode 100644 index 4ed03ebcf..000000000 --- a/fiscalsim_us/variables/gov/states/in/tax/income/taxes/in_other_taxes.py +++ /dev/null @@ -1,10 +0,0 @@ -from fiscalsim_us.model_api import * - - -class in_other_taxes(Variable): - value_type = float - entity = TaxUnit - label = "IN other taxes" - unit = USD - definition_period = YEAR - documentation = "Includes the use tax on out-of-state purchases, household employment taxes, and recapture of certain Indiana offset credits." diff --git a/fiscalsim_us/variables/gov/states/in/tax/use/in_use_tax.py b/fiscalsim_us/variables/gov/states/in/tax/use/in_use_tax.py new file mode 100644 index 000000000..a0d701853 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/in/tax/use/in_use_tax.py @@ -0,0 +1,11 @@ +from fiscalsim_us.model_api import * + + +class in_use_tax(Variable): + value_type = float + entity = TaxUnit + label = "Indiana use tax" + unit = USD + definition_period = YEAR + reference = "https://iga.in.gov/laws/2021/ic/titles/6#6-2.5-3" + defined_for = StateCode.IN diff --git a/fiscalsim_us/variables/gov/states/ks/tax/income/deductions/ks_itemized_deductions.py b/fiscalsim_us/variables/gov/states/ks/tax/income/deductions/ks_itemized_deductions.py index 3d24de3ba..7bae66c01 100644 --- a/fiscalsim_us/variables/gov/states/ks/tax/income/deductions/ks_itemized_deductions.py +++ b/fiscalsim_us/variables/gov/states/ks/tax/income/deductions/ks_itemized_deductions.py @@ -1,34 +1,28 @@ -from fiscalsim_us.model_api import * - - -class ks_itemized_deductions(Variable): - value_type = float - entity = TaxUnit - label = "Kansas itemized deductions" - unit = USD - definition_period = YEAR - reference = ( - "https://www.ksrevenue.gov/pdf/ip21.pdf" - "https://www.ksrevenue.gov/pdf/ip22.pdf" - ) - defined_for = StateCode.KS - - def formula(tax_unit, period, parameters): - # 2021 Form K-40 instructions say this: - # LINE 4 (Standard deduction or itemized deductions): - # If you did not itemize your deductions on your federal return, - # you may choose to itemize your deductions or claim the - # standard deduction on your Kansas return whichever is to your - # advantage. If you itemized on your federal return, you may - # either itemize or take the standard deduction on your Kansas - # return, whichever is to your advantage. - # compute itemized deduction maximum - p = parameters(period).gov.irs.deductions - itm_deds = [ - deduction - for deduction in p.itemized_deductions - if deduction not in ["salt_deduction"] - ] - federal_itm_deds_less_salt = add(tax_unit, period, itm_deds) - uncapped_property_taxes = add(tax_unit, period, ["real_estate_taxes"]) - return federal_itm_deds_less_salt + uncapped_property_taxes +from fiscalsim_us.model_api import * + + +class ks_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Kansas itemized deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://www.ksrevenue.gov/pdf/ip21.pdf" + "https://www.ksrevenue.gov/pdf/ip22.pdf" + ) + defined_for = StateCode.KS + + def formula(tax_unit, period, parameters): + # 2021 Form K-40 instructions say this: + # LINE 4 (Standard deduction or itemized deductions): + # If you did not itemize your deductions on your federal return, + # you may choose to itemize your deductions or claim the + # standard deduction on your Kansas return whichever is to your + # advantage. If you itemized on your federal return, you may + # either itemize or take the standard deduction on your Kansas + # return, whichever is to your advantage. + # compute itemized deduction maximum + itm_deds_less_salt = tax_unit("itemized_deductions_less_salt", period) + uncapped_property_taxes = add(tax_unit, period, ["real_estate_taxes"]) + return itm_deds_less_salt + uncapped_property_taxes diff --git a/fiscalsim_us/variables/gov/states/ky/tax/income/credits/dependent_care_service/ky_cdcc.py b/fiscalsim_us/variables/gov/states/ky/tax/income/credits/dependent_care_service/ky_cdcc.py new file mode 100644 index 000000000..e6cf58f7e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ky/tax/income/credits/dependent_care_service/ky_cdcc.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class ky_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky household and dependent care service credit" + unit = USD + definition_period = YEAR + reference = ( + "https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=29058" + ) + defined_for = StateCode.KY + + def formula(tax_unit, period, parameters): + dependent_care_credit = tax_unit("cdcc", period) + rate = parameters( + period + ).gov.states.ky.tax.income.credits.dependent_care_service.match + return dependent_care_credit * rate diff --git a/fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_family_size_tax_credit.py b/fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_family_size_tax_credit.py new file mode 100644 index 000000000..f45c0c708 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_family_size_tax_credit.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class ky_family_size_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky family size tax credit" + unit = "/1" + definition_period = YEAR + reference = ( + "https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=49188" + ) + defined_for = StateCode.KY + + def formula(tax_unit, period, parameters): + rate = tax_unit("ky_family_size_tax_credit_rate", period) + income = tax_unit( + "ky_income_tax_before_non_refundable_credits", period + ) + return rate * income diff --git a/fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_family_size_tax_credit_rate.py b/fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_family_size_tax_credit_rate.py new file mode 100644 index 000000000..d29cee1f5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_family_size_tax_credit_rate.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class ky_family_size_tax_credit_rate(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky family size tax credit rate" + unit = "/1" + definition_period = YEAR + reference = ( + "https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=49188" + ) + defined_for = StateCode.KY + + def formula(tax_unit, period, parameters): + income = tax_unit("ky_modified_agi", period) + fpg = parameters(period).gov.hhs.fpg + # This will be CONTIGUOUS_US for Kentucky. + state_group = tax_unit.household("state_group", period) + p1 = fpg.first_person[state_group] + padd = fpg.additional_person[state_group] + family_size = tax_unit("tax_unit_size", period) + # No more than 4 people are accounted for in the credit + p = parameters(period).gov.states.ky.tax.income.credits.family_size + capped_family_size = min_(family_size, p.family_size_cap) + poverty_index = p1 + padd * (capped_family_size - 1) + share = income / poverty_index + return p.rate.calc(share, right=True) diff --git a/fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_modified_agi.py b/fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_modified_agi.py new file mode 100644 index 000000000..167f54023 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ky/tax/income/credits/family_size_credit/ky_modified_agi.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class ky_modified_agi(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky modified adjusted gross income for the family size tax credit" + unit = USD + definition_period = YEAR + reference = "https://revenue.ky.gov/Forms/740%20Packet%20Instructions%205-9-23.pdf#page=22" + defined_for = StateCode.KY + + def formula(tax_unit, period, parameters): + fed_agi = tax_unit("adjusted_gross_income", period) + # Lump sum distributions which are not included in federal AGI are added to the federal AGI + # Tax exempt interest from municipal bonds (non-Kentucky) is also added but excluded in this calculation + tax_exempt_lump_sum = tax_unit( + "form_4972_lumpsum_distributions", period + ) + total_fed_agi = fed_agi + tax_exempt_lump_sum + + ky_agi = tax_unit("ky_agi", period) + # Lump sum distributions which are not included in federal AGI are added to the state AGI + total_ky_agi = ky_agi + tax_exempt_lump_sum + return max_(total_fed_agi, total_ky_agi) diff --git a/fiscalsim_us/variables/gov/states/ky/tax/income/deductions/ky_standard_deduction.py b/fiscalsim_us/variables/gov/states/ky/tax/income/deductions/ky_standard_deduction.py new file mode 100644 index 000000000..6527a15e6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ky/tax/income/deductions/ky_standard_deduction.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class ky_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky standard deduction" + unit = USD + definition_period = YEAR + defined_for = StateCode.KY + + def formula(tax_unit, period, parameters): + return parameters(period).gov.states.ky.tax.income.deductions.standard diff --git a/fiscalsim_us/variables/gov/states/ky/tax/income/ky_agi.py b/fiscalsim_us/variables/gov/states/ky/tax/income/ky_agi.py new file mode 100644 index 000000000..45ebc04e2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ky/tax/income/ky_agi.py @@ -0,0 +1,11 @@ +from fiscalsim_us.model_api import * + + +class ky_agi(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky adjusted gross income" + unit = USD + definition_period = YEAR + reference = "https://revenue.ky.gov/Forms/740%20Packet%20Instructions%205-9-23.pdf#page=11" + defined_for = StateCode.KY diff --git a/fiscalsim_us/variables/gov/states/ky/tax/income/ky_income_tax_before_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/ky/tax/income/ky_income_tax_before_non_refundable_credits.py new file mode 100644 index 000000000..4c445927e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ky/tax/income/ky_income_tax_before_non_refundable_credits.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ky_income_tax_before_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky income tax before non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.KY + + def formula(tax_unit, period, paramters): + income = tax_unit("ky_taxable_income", period) + rate = paramters(period).gov.states.ky.tax.income.rate + return income * rate diff --git a/fiscalsim_us/variables/gov/states/ky/tax/income/ky_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/ky/tax/income/ky_income_tax_before_refundable_credits.py index a69bea92e..d17e6b67a 100644 --- a/fiscalsim_us/variables/gov/states/ky/tax/income/ky_income_tax_before_refundable_credits.py +++ b/fiscalsim_us/variables/gov/states/ky/tax/income/ky_income_tax_before_refundable_credits.py @@ -10,6 +10,8 @@ class ky_income_tax_before_refundable_credits(Variable): defined_for = StateCode.KY def formula(tax_unit, period, paramters): - income = tax_unit("ky_taxable_income", period) - rate = paramters(period).gov.states.ky.tax.income.rate - return income * rate + tax_before_non_refundable = tax_unit( + "ky_income_tax_before_non_refundable_credits", period + ) + non_refundable_credits = tax_unit("ky_non_refundable_credits", period) + return max_(tax_before_non_refundable - non_refundable_credits, 0) diff --git a/fiscalsim_us/variables/gov/states/ky/tax/income/ky_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/ky/tax/income/ky_non_refundable_credits.py new file mode 100644 index 000000000..b9e1442c1 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ky/tax/income/ky_non_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class ky_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Kentucky non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.KY + + adds = "gov.states.ky.tax.income.credits.non_refundable" diff --git a/fiscalsim_us/variables/gov/states/ma/tax/income/credits/ma_limited_income_tax_credit.py b/fiscalsim_us/variables/gov/states/ma/tax/income/credits/ma_limited_income_tax_credit.py index 78404a9e8..83db29d6b 100644 --- a/fiscalsim_us/variables/gov/states/ma/tax/income/credits/ma_limited_income_tax_credit.py +++ b/fiscalsim_us/variables/gov/states/ma/tax/income/credits/ma_limited_income_tax_credit.py @@ -1,8 +1,4 @@ from fiscalsim_us.model_api import * -import warnings - -warnings.filterwarnings("ignore") -warnings.simplefilter("ignore") class ma_limited_income_tax_credit(Variable): @@ -20,12 +16,14 @@ def formula(tax_unit, period, parameters): "ma_income_tax_exemption_threshold", period ) income_over_threshold = max_(0, agi - exemption_threshold) - income_ratio = agi / exemption_threshold - lic = parameters( - period - ).gov.states.ma.tax.income.credits.limited_income_credit - eligible = income_ratio <= lic.income_limit - tax_cap = lic.percent * income_over_threshold + # Compute AGI as a share of the exemption threshold. + # Use a mask rather than where to avoid a divide-by-zero warning. Default to inf. + income_ratio = np.ones_like(agi) * np.inf + mask = exemption_threshold > 0 + income_ratio[mask] = agi[mask] / exemption_threshold[mask] + p = parameters(period).gov.states.ma.tax.income.credits + eligible = income_ratio <= p.limited_income_credit.income_limit + tax_cap = p.limited_income_credit.percent * income_over_threshold income_tax = tax_unit("ma_income_tax_before_credits", period) excess_tax = max_(0, income_tax - tax_cap) return eligible * excess_tax diff --git a/fiscalsim_us/variables/gov/states/md/tax/income/agi/subtractions/md_two_income_subtraction.py b/fiscalsim_us/variables/gov/states/md/tax/income/agi/subtractions/md_two_income_subtraction.py index 964458cfe..284a230f5 100644 --- a/fiscalsim_us/variables/gov/states/md/tax/income/agi/subtractions/md_two_income_subtraction.py +++ b/fiscalsim_us/variables/gov/states/md/tax/income/agi/subtractions/md_two_income_subtraction.py @@ -26,9 +26,11 @@ def formula(tax_unit, period, parameters): couple_gross_income = tax_unit.sum( where(is_head | is_spouse, gross_income, 0) ) - head_frac = where( - couple_gross_income > 0, head_gross_income / couple_gross_income, 1 - ) + # Compute the head's share of the couple's cross income. + # Use a mask rather than where to avoid a divide-by-zero warning. Default to one. + head_frac = np.ones_like(couple_gross_income) + mask = couple_gross_income > 0 + head_frac[mask] = head_gross_income[mask] / couple_gross_income[mask] head_us_agi = head_frac * us_agi spouse_us_agi = (1 - head_frac) * us_agi diff --git a/fiscalsim_us/variables/gov/states/md/tax/income/credits/cdcc/md_cdcc.py b/fiscalsim_us/variables/gov/states/md/tax/income/credits/cdcc/md_cdcc.py index feff60e46..6f7ec8679 100644 --- a/fiscalsim_us/variables/gov/states/md/tax/income/credits/cdcc/md_cdcc.py +++ b/fiscalsim_us/variables/gov/states/md/tax/income/credits/cdcc/md_cdcc.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class md_cdcc(Variable): diff --git a/fiscalsim_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc.py b/fiscalsim_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc.py index c0a5d5b1b..172c55e6e 100644 --- a/fiscalsim_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc.py +++ b/fiscalsim_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc.py @@ -4,22 +4,28 @@ class md_ctc(Variable): value_type = float entity = TaxUnit - label = "MD CTC" + label = "Maryland Child Tax Credit" definition_period = YEAR unit = USD - documentation = "Maryland Child Tax Credit" - reference = "https://casetext.com/statute/code-of-maryland/article-tax-general/title-10-income-tax/subtitle-7-income-tax-credits/section-10-751-effective-until-712026-tax-credit-for-qualified-child" - defined_for = StateCode.MD + reference = ( + "https://casetext.com/statute/code-of-maryland/article-tax-general/title-10-income-tax/subtitle-7-income-tax-credits/section-10-751-effective-until-712026-tax-credit-for-qualified-child" + "https://law.justia.com/codes/maryland/2022/tax-general/title-10/subtitle-7/section-10-751/" + ) + defined_for = "md_ctc_eligible" - def formula(tax_unit, period, parameters): + def formula_2020(tax_unit, period, parameters): p = parameters(period).gov.states.md.tax.income.credits.ctc - income_eligible = ( - tax_unit("adjusted_gross_income", period) <= p.agi_cap - ) person = tax_unit.members dependent = person("is_tax_unit_dependent", period) disabled = person("is_disabled", period) - meets_age_limit = person("age", period) < p.age_limit - eligible_child = dependent & disabled & meets_age_limit - eligible_children = tax_unit.sum(eligible_child) - return income_eligible * eligible_children * p.amount + age_limit = where( + disabled, p.age_threshold.disabled, p.age_threshold.main + ) + meets_age_limit = person("age", period) < age_limit + eligible = dependent & meets_age_limit + eligible_children = tax_unit.sum(eligible) + md_ctc = eligible_children * p.amount + if p.reduced_by_federal_credit: + federal_ctc = tax_unit("ctc", period) + return max_(md_ctc - federal_ctc, 0) + return md_ctc diff --git a/fiscalsim_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.py b/fiscalsim_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.py new file mode 100644 index 000000000..ab9379ecf --- /dev/null +++ b/fiscalsim_us/variables/gov/states/md/tax/income/credits/ctc/md_ctc_eligible.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class md_ctc_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Maryland Child Tax Credit" + definition_period = YEAR + reference = ( + "https://casetext.com/statute/code-of-maryland/article-tax-general/title-10-income-tax/subtitle-7-income-tax-credits/section-10-751-effective-until-712026-tax-credit-for-qualified-child" + "https://law.justia.com/codes/maryland/2022/tax-general/title-10/subtitle-7/section-10-751/" + ) + defined_for = StateCode.MD + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.md.tax.income.credits.ctc + return tax_unit("adjusted_gross_income", period) <= p.agi_cap diff --git a/fiscalsim_us/variables/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.py b/fiscalsim_us/variables/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.py index 474791fb4..307d0c078 100644 --- a/fiscalsim_us/variables/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.py +++ b/fiscalsim_us/variables/gov/states/md/tax/income/credits/eitc/federal_eitc_without_age_minimum.py @@ -20,6 +20,8 @@ def formula(tax_unit, period, parameters): "eitc_agi_limit", "eitc_child_count", "eitc_eligible", + "eitc_demographic_eligible", + "eitc_investment_income_eligible", "eitc_maximum", "eitc_phased_in", "eitc_reduction", diff --git a/fiscalsim_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.py b/fiscalsim_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.py new file mode 100644 index 000000000..af0461a9a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit.py @@ -0,0 +1,41 @@ +from fiscalsim_us.model_api import * + + +class md_senior_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "Maryland Senior Tax Credit" + unit = USD + definition_period = YEAR + reference = "https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=15" + defined_for = "md_senior_tax_credit_eligible" + + def formula_2022(tax_unit, period, parameters): + p = parameters(period).gov.states.md.tax.income.credits.senior_tax + + age_head = tax_unit("age_head", period) + spouse_age = tax_unit("age_spouse", period) + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + + head_eligible = (age_head >= p.age_eligibility).astype(int) + spouse_eligible = (spouse_age >= p.age_eligibility).astype(int) + eligible_count = head_eligible + spouse_eligible + + credit_amount = select( + [ + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.HEAD_OF_HOUSEHOLD, + filing_status == status.WIDOW, + filing_status == status.SEPARATE, + ], + [ + p.amount.single, + p.amount.joint[eligible_count], + p.amount.head_of_household, + p.amount.widow, + p.amount.separate, + ], + ) + return where(eligible_count > 0, credit_amount, 0) diff --git a/fiscalsim_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit_eligible.py b/fiscalsim_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit_eligible.py new file mode 100644 index 000000000..0b4e8edac --- /dev/null +++ b/fiscalsim_us/variables/gov/states/md/tax/income/credits/senior_tax/md_senior_tax_credit_eligible.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class md_senior_tax_credit_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the Maryland Senior Tax Credit" + definition_period = YEAR + reference = "https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=15" + defined_for = StateCode.MD + + def formula_2022(tax_unit, period, parameters): + p = parameters(period).gov.states.md.tax.income.credits.senior_tax + + filing_status = tax_unit("filing_status", period) + agi = tax_unit("adjusted_gross_income", period) + + return agi < p.income_threshold[filing_status] diff --git a/fiscalsim_us/variables/gov/states/md/tax/income/deductions/md_deductions.py b/fiscalsim_us/variables/gov/states/md/tax/income/deductions/md_deductions.py index 02dca5c57..0b87ad119 100644 --- a/fiscalsim_us/variables/gov/states/md/tax/income/deductions/md_deductions.py +++ b/fiscalsim_us/variables/gov/states/md/tax/income/deductions/md_deductions.py @@ -1,32 +1,32 @@ -from fiscalsim_us.model_api import * - - -class md_deductions(Variable): - value_type = float - entity = TaxUnit - label = "MD deductions" - unit = USD - definition_period = YEAR - reference = "https://govt.westlaw.com/mdc/Document/N05479690A64A11DBB5DDAC3692B918BC?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default)" - defined_for = StateCode.MD - - def formula(tax_unit, period, parameters): - p = parameters(period).gov.irs.deductions - itm_deds = [ - deduction - for deduction in p.itemized_deductions - if deduction not in ["salt_deduction"] - ] - itm_deds_less_salt = add(tax_unit, period, itm_deds) - property_taxes = add(tax_unit, period, ["real_estate_taxes"]) - salt = p.itemized.salt_and_real_estate - cap = salt.cap[tax_unit("filing_status", period)] - capped_property_taxes = min_(property_taxes, cap) - md_itm_ded = itm_deds_less_salt + capped_property_taxes - md_std_ded = tax_unit("md_standard_deduction", period) - us_itemizer = tax_unit("tax_unit_itemizes", period) - return where( - us_itemizer, - where(md_itm_ded > md_std_ded, md_itm_ded, md_std_ded), - md_std_ded, - ) +from fiscalsim_us.model_api import * + + +class md_deductions(Variable): + value_type = float + entity = TaxUnit + label = "MD deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://govt.westlaw.com/mdc/Document/N05479690A64A11DBB5DDAC3692B918BC?viewType=FullText&originationContext=documenttoc&transitionType=CategoryPageItem&contextData=(sc.Default)" + "https://www.marylandtaxes.gov/forms/21_forms/Resident_Booklet.pdf#page=5" + "https://www.marylandtaxes.gov/forms/22_forms/Resident_Booklet.pdf#page=5" + ) + defined_for = StateCode.MD + + def formula(tax_unit, period, parameters): + itm_deds_less_salt = tax_unit("itemized_deductions_less_salt", period) + capped_property_taxes = tax_unit("capped_property_taxes", period) + md_itmded = itm_deds_less_salt + capped_property_taxes + md_stdded = tax_unit("md_standard_deduction", period) + # 2021 and 2022 Form 502 instructions on page 5 include this FAQ: + # 3. Itemized deductions. + # Q: Can I claim itemized deductions on my Maryland return if + # I claimed standard deduction on my federal return? + # A: No. You may claim itemized deductions on your Maryland + # return only if you claimed itemized deductions on your + # federal return. If you claimed your itemized deductions + # on your federal return, you may figure your tax using + # both deduction methods to determine which is best for you. + federal_itemizer = tax_unit("tax_unit_itemizes", period) + return where(federal_itemizer, max_(md_stdded, md_itmded), md_stdded) diff --git a/fiscalsim_us/variables/gov/states/md/tax/income/deductions/md_standard_deduction.py b/fiscalsim_us/variables/gov/states/md/tax/income/deductions/md_standard_deduction.py index 2ac389587..237277871 100644 --- a/fiscalsim_us/variables/gov/states/md/tax/income/deductions/md_standard_deduction.py +++ b/fiscalsim_us/variables/gov/states/md/tax/income/deductions/md_standard_deduction.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class md_standard_deduction(Variable): diff --git a/fiscalsim_us/variables/gov/states/me/tax/income/me_income_tax.py b/fiscalsim_us/variables/gov/states/me/tax/income/me_income_tax.py new file mode 100644 index 000000000..f1abd3b61 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/me/tax/income/me_income_tax.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class me_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Maine income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.ME + adds = ["me_income_tax_before_refundable_credits"] + subtracts = ["me_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/me/tax/income/me_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/me/tax/income/me_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..d0400b928 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/me/tax/income/me_income_tax_before_refundable_credits.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class me_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Maine income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.ME + + def formula(tax_unit, period, parameters): + income_tax_before_credits = tax_unit( + "me_income_tax_before_credits", period + ) + non_refundable_credits = tax_unit("me_non_refundable_credits", period) + return max_(income_tax_before_credits - non_refundable_credits, 0) diff --git a/fiscalsim_us/variables/gov/states/me/tax/income/me_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/me/tax/income/me_non_refundable_credits.py new file mode 100644 index 000000000..cba15d347 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/me/tax/income/me_non_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class me_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Maine nonrefundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.ME + + adds = "gov.states.me.tax.income.credits.non_refundable" diff --git a/fiscalsim_us/variables/gov/states/me/tax/income/me_refundable_credits.py b/fiscalsim_us/variables/gov/states/me/tax/income/me_refundable_credits.py new file mode 100644 index 000000000..b85d85af1 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/me/tax/income/me_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class me_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Maine refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.ME + + adds = "gov.states.me.tax.income.credits.refundable" diff --git a/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/me_deduction.py b/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_deduction_phaseout_percentage.py similarity index 53% rename from fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/me_deduction.py rename to fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_deduction_phaseout_percentage.py index bc8884a93..14d631823 100644 --- a/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/me_deduction.py +++ b/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_deduction_phaseout_percentage.py @@ -1,13 +1,16 @@ from fiscalsim_us.model_api import * -class me_deduction(Variable): +class me_deduction_phaseout_percentage(Variable): value_type = float entity = TaxUnit - label = "Maine deduction" + label = "Maine deduction phaseout percentage" unit = USD definition_period = YEAR - reference = "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_item_stand_%20ded_phaseout_wksht.pdf" + reference = ( + "https://www.mainelegislature.org/legis/statutes/36/title36sec5124-C.html", + "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_item_stand_%20ded_phaseout_wksht.pdf", + ) defined_for = StateCode.ME def formula(tax_unit, period, parameters): @@ -25,15 +28,6 @@ def formula(tax_unit, period, parameters): phaseout_start = p.start[filing_status] excess = max_(me_agi - phaseout_start, 0) # Line 3 phaseout_width = p.width[filing_status] # Line 4 - phaseout_percent = min_(1, excess / phaseout_width) # Line 5 - # Get their deduction prior to phaseout. Max of itemized and standard (Line 6) - max_deduction = max_( - tax_unit("me_itemized_deductions", period), - tax_unit("me_standard_deduction", period), - ) - - # Calculate the phaseout amount (Line 7) - phaseout_amount = max_deduction * phaseout_percent - - return max_deduction - phaseout_amount # Line 8 + # Calculate the phaseout percent (Line 5) + return min_(1, excess / phaseout_width) diff --git a/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions.py b/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions.py deleted file mode 100644 index 4873f9738..000000000 --- a/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions.py +++ /dev/null @@ -1,12 +0,0 @@ -from fiscalsim_us.model_api import * - - -class me_itemized_deductions(Variable): - value_type = float - entity = TaxUnit - label = "Maine itemized deductions" - unit = USD - definition_period = YEAR - reference = "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_2_ff.pdf" - reference = "https://www.mainelegislature.org/legis/statutes/36/title36sec5125.html" - defined_for = StateCode.ME diff --git a/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions_pre_phaseout.py b/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions_pre_phaseout.py new file mode 100644 index 000000000..6bc395cca --- /dev/null +++ b/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_itemized_deductions_pre_phaseout.py @@ -0,0 +1,39 @@ +from fiscalsim_us.model_api import * + + +class me_itemized_deductions_pre_phaseout(Variable): + value_type = float + entity = TaxUnit + label = "Maine itemized deductions before phaseout" + unit = USD + definition_period = YEAR + reference = ( + "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_1040me_sched_2_ff.pdf", + "https://www.mainelegislature.org/legis/statutes/36/title36sec5125.html", + ) + defined_for = StateCode.ME + + def formula(tax_unit, period, parameters): + # Whether or not the taxpayer itemized for federal taxes. + us_itemizing = tax_unit("tax_unit_itemizes", period) + + # Get the Maine itemizing deduction parameters. + p = parameters(period).gov.states.me.tax.income.deductions.itemized + + # Get federal itemized deductions minus SALT (Section 3A). + deduction = tax_unit("itemized_deductions_less_salt", period) + + # Get medical (and dental) expenses. + medical_expenses = tax_unit("medical_expense_deduction", period) + + # Get real estate (and property) taxes. + real_estate_taxes = add(tax_unit, period, ["real_estate_taxes"]) + + # Calculate uncapped (potential) itemized deductions. + deduction_no_med = deduction - medical_expenses + real_estate_taxes + + # Calculate capped itemized deductions. + capped_deduction_no_med = min_(deduction_no_med, p.cap) + + # Add back medical and dental expenses (which are not capped). + return us_itemizing * (capped_deduction_no_med + medical_expenses) diff --git a/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_standard_deduction.py b/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_standard_deduction.py deleted file mode 100644 index 0448f273c..000000000 --- a/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/deductions/me_standard_deduction.py +++ /dev/null @@ -1,22 +0,0 @@ -from fiscalsim_us.model_api import * - - -class me_standard_deduction(Variable): - value_type = float - entity = TaxUnit - label = "Maine standard deduction" - unit = USD - definition_period = YEAR - reference = "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_item_stand_%20ded_phaseout_wksht.pdf" - reference = "https://www.mainelegislature.org/legis/statutes/36/title36sec5124-C.html" - defined_for = StateCode.ME - - def formula(tax_unit, period, parameters): - # Get filing status. - filing_status = tax_unit("filing_status", period) - - # Get standard deduction part of parameters tree - p = parameters(period).gov.states.me.tax.income.deductions.standard - - # Get standard deduction for filing status - return p.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/me_deductions.py b/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/me_deductions.py index 0d31d6b58..7e8a3b03d 100644 --- a/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/me_deductions.py +++ b/fiscalsim_us/variables/gov/states/me/tax/income/taxable_income/me_deductions.py @@ -1,11 +1,32 @@ -from fiscalsim_us.model_api import * - - -class me_deductions(Variable): - value_type = float - entity = TaxUnit - label = "Maine income deductions" - unit = USD - definition_period = YEAR - reference = "" - defined_for = StateCode.ME +from fiscalsim_us.model_api import * + + +class me_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Maine income deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://www.mainelegislature.org/legis/statutes/36/title36sec5124-C.html", + "https://www.maine.gov/revenue/sites/maine.gov.revenue/files/inline-files/22_item_stand_%20ded_phaseout_wksht.pdf", + ) + defined_for = StateCode.ME + + def formula(tax_unit, period, parameters): + # Get the phaseout percent (Line 5). + phaseout_percent = tax_unit("me_deduction_phaseout_percentage", period) + + # Get the relevant deduction amount (Line 6). + # Either itemized deduction or federal standard deduction. + max_deduction = max_( + tax_unit("me_itemized_deductions_pre_phaseout", period), + tax_unit("standard_deduction", period), + ) + + # Calculate the phaseout amount (Line 7). + phaseout_amount = max_deduction * phaseout_percent + + # Calculate the deduction after phaseout (Line 8). + # Note this cannot be negative because phaseout_percent is capped at 1. + return max_deduction - phaseout_amount diff --git a/fiscalsim_us/variables/gov/states/mi/tax/income/credits/mi_eitc.py b/fiscalsim_us/variables/gov/states/mi/tax/income/credits/mi_eitc.py new file mode 100644 index 000000000..3d4102aa7 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mi/tax/income/credits/mi_eitc.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class mi_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Michigan Earned Income Tax Credit" + unit = USD + definition_period = YEAR + defined_for = StateCode.MI + + def formula(tax_unit, period, parameters): + eitc = tax_unit("earned_income_tax_credit", period) + p = parameters(period).gov.states.mi.tax.income.credits.eitc + return eitc * p.match diff --git a/fiscalsim_us/variables/gov/states/mi/tax/income/exemptions/mi_exemptions.py b/fiscalsim_us/variables/gov/states/mi/tax/income/exemptions/mi_exemptions.py new file mode 100644 index 000000000..2da0ed722 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mi/tax/income/exemptions/mi_exemptions.py @@ -0,0 +1,52 @@ +from fiscalsim_us.model_api import * + + +class mi_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "Michigan exemptions" + defined_for = StateCode.MI + unit = USD + definition_period = YEAR + reference = ( + "http://legislature.mi.gov/doc.aspx?mcl-206-30", + "https://www.legislature.mi.gov/Publications/TaxpayerGuide.pdf", + ) + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.mi.tax.income.exemptions + + # Personal Exemptions & Stillborn Exemptions + exemptions = add( + tax_unit, period, ["tax_unit_size", "tax_unit_stillborn_children"] + ) + personal_exemption = exemptions * p.personal + + # Disabled exemptions + disabled_people = add(tax_unit, period, ["is_disabled"]) + disabled_exemption = disabled_people * p.disabled + + # Disabled veteran exemptions + disabled_veterans = add( + tax_unit, period, ["is_fully_disabled_service_connected_veteran"] + ) + disabled_veteran_exemption = disabled_veterans * p.disabled_veteran + + # Dependent on other return exemptions + filing_status = tax_unit("filing_status", period) + is_dependent_on_other_return = tax_unit("dsi", period).astype(int) + is_dependent_exemption = ( + is_dependent_on_other_return + * p.dependent_on_other_return[filing_status] + ) + + # Total exemptions + return ( + where( + is_dependent_exemption == 0, + personal_exemption, + is_dependent_exemption, + ) + + disabled_exemption + + disabled_veteran_exemption + ) diff --git a/fiscalsim_us/variables/gov/states/mo/tax/income/credits/property_tax/mo_property_tax_credit.py b/fiscalsim_us/variables/gov/states/mo/tax/income/credits/property_tax/mo_property_tax_credit.py index 096c0e97e..e641a2478 100644 --- a/fiscalsim_us/variables/gov/states/mo/tax/income/credits/property_tax/mo_property_tax_credit.py +++ b/fiscalsim_us/variables/gov/states/mo/tax/income/credits/property_tax/mo_property_tax_credit.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class mo_property_tax_credit(Variable): diff --git a/fiscalsim_us/variables/gov/states/mo/tax/income/credits/property_tax/mo_ptc_gross_income.py b/fiscalsim_us/variables/gov/states/mo/tax/income/credits/property_tax/mo_ptc_gross_income.py index c86e71d7e..ad5c8b686 100644 --- a/fiscalsim_us/variables/gov/states/mo/tax/income/credits/property_tax/mo_ptc_gross_income.py +++ b/fiscalsim_us/variables/gov/states/mo/tax/income/credits/property_tax/mo_ptc_gross_income.py @@ -39,8 +39,7 @@ def formula(tax_unit, period, parameters): add(person, period, pa_sources) # line 6 ) # compute nonbusiness capital losses in PTC gross income (line 7) - losses = ["short_term_capital_losses", "long_term_capital_losses"] - nonbusiness_losses = add(tax_unit, period, losses) + nonbusiness_losses = tax_unit("limited_capital_loss", period) return ( # line 8 core_income + exempt_socsec_benefits diff --git a/fiscalsim_us/variables/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction_section_b.py b/fiscalsim_us/variables/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction_section_b.py index 7a26d8b93..be5f11b63 100644 --- a/fiscalsim_us/variables/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction_section_b.py +++ b/fiscalsim_us/variables/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction_section_b.py @@ -1,45 +1,43 @@ -from fiscalsim_us.model_api import * - - -class mo_pension_and_ss_or_ssd_deduction_section_b(Variable): - value_type = float - entity = Person - label = "MO Pension and Social Security or SS Disability Deduction" - unit = USD - definition_period = YEAR - reference = ( - "https://dor.mo.gov/forms/MO-A_2021.pdf#page=3", - "https://dor.mo.gov/forms/MO-1040%20Fillable%20Calculating_2021.pdf#page=2", - "https://revisor.mo.gov/main/OneSection.aspx?section=143.124", - ) - defined_for = StateCode.MO - - def formula(person, period, parameters): - tax_unit = person.tax_unit - ind_mo_agi = person("mo_adjusted_gross_income", period) - unit_mo_agi = tax_unit.sum(ind_mo_agi) - ind_taxable_oasdi = person("taxable_social_security", period) - unit_taxable_oasdi = tax_unit.sum(ind_taxable_oasdi) - p = parameters(period).gov.states.mo.tax.income.deductions - filing_status = tax_unit("filing_status", period) - excess_agi = max_( # line5 - 0, - ( - unit_mo_agi - - unit_taxable_oasdi - - p.mo_private_pension_deduction_allowance[filing_status] - ), - ) - ind_pvt_pension_amt = person("taxable_private_pension_income", period) - ind_pvt_pension_val = min_( - ind_pvt_pension_amt, - p.mo_max_private_pension, - ) - unit_pvt_pension_val = tax_unit.sum(ind_pvt_pension_val) # line8 - unit_deduction = max_(0, unit_pvt_pension_val - excess_agi) # line9 - ind_share_of_unit_deduction = where( - ind_pvt_pension_val > 0, - ind_pvt_pension_val / unit_pvt_pension_val, - 0, - ) - return ind_share_of_unit_deduction * unit_deduction +from fiscalsim_us.model_api import * + + +class mo_pension_and_ss_or_ssd_deduction_section_b(Variable): + value_type = float + entity = Person + label = "MO Pension and Social Security or SS Disability Deduction" + unit = USD + definition_period = YEAR + reference = ( + "https://dor.mo.gov/forms/MO-A_2021.pdf#page=3", + "https://dor.mo.gov/forms/MO-1040%20Fillable%20Calculating_2021.pdf#page=2", + "https://revisor.mo.gov/main/OneSection.aspx?section=143.124", + ) + defined_for = StateCode.MO + + def formula(person, period, parameters): + tax_unit = person.tax_unit + ind_mo_agi = person("mo_adjusted_gross_income", period) + unit_mo_agi = tax_unit.sum(ind_mo_agi) + ind_taxable_oasdi = person("taxable_social_security", period) + unit_taxable_oasdi = tax_unit.sum(ind_taxable_oasdi) + p = parameters(period).gov.states.mo.tax.income.deductions + filing_status = tax_unit("filing_status", period) + excess_agi = max_( # line5 + 0, + ( + unit_mo_agi + - unit_taxable_oasdi + - p.mo_private_pension_deduction_allowance[filing_status] + ), + ) + ind_pvt_pen_amt = person("taxable_private_pension_income", period) + ind_pvt_pen_val = min_(ind_pvt_pen_amt, p.mo_max_private_pension) + unit_pvt_pen_val = tax_unit.sum(ind_pvt_pen_val) # line8 + unit_deduction = max_(0, unit_pvt_pen_val - excess_agi) # line9 + # Compute the individual's share of the tax unit's taxable private pension income. + # Use a mask rather than where to avoid a divide-by-zero warning. Default to zero. + ind_share = np.zeros_like(ind_pvt_pen_val) + mask = ind_pvt_pen_val > 0 + ind_share[mask] = ind_pvt_pen_val[mask] / unit_pvt_pen_val[mask] + + return ind_share * unit_deduction diff --git a/fiscalsim_us/variables/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction_section_c.py b/fiscalsim_us/variables/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction_section_c.py index df14cc450..61ab2995c 100644 --- a/fiscalsim_us/variables/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction_section_c.py +++ b/fiscalsim_us/variables/gov/states/mo/tax/income/deductions/mo_pension_and_ss_or_ssd_deduction_section_c.py @@ -1,33 +1,33 @@ -from fiscalsim_us.model_api import * - - -class mo_pension_and_ss_or_ssd_deduction_section_c(Variable): - value_type = float - entity = Person - label = "MO Pension and Social Security or SS Disability Deduction" - unit = USD - definition_period = YEAR - reference = ( - "https://dor.mo.gov/forms/MO-A_2021.pdf#page=3", - "https://dor.mo.gov/forms/MO-1040%20Fillable%20Calculating_2021.pdf#page=2", - "https://revisor.mo.gov/main/OneSection.aspx?section=143.124", - ) - defined_for = StateCode.MO - - def formula(person, period, parameters): - tax_unit = person.tax_unit - ind_mo_agi = person("mo_adjusted_gross_income", period) - unit_mo_agi = tax_unit.sum(ind_mo_agi) - filing_status = tax_unit("filing_status", period) - p = parameters(period).gov.states.mo.tax.income.deductions - unit_allowance = p.mo_ss_or_ssd_deduction_allowance[filing_status] - unit_agi_over_allowance = max_(0, unit_mo_agi - unit_allowance) - ind_taxable_ben = person("taxable_social_security", period) - unit_taxable_ben = tax_unit.sum(ind_taxable_ben) - unit_deduction = max_(0, unit_taxable_ben - unit_agi_over_allowance) - ind_frac = where( - ind_taxable_ben > 0, - ind_taxable_ben / unit_taxable_ben, - 0, - ) - return ind_frac * unit_deduction +from fiscalsim_us.model_api import * + + +class mo_pension_and_ss_or_ssd_deduction_section_c(Variable): + value_type = float + entity = Person + label = "MO Pension and Social Security or SS Disability Deduction" + unit = USD + definition_period = YEAR + reference = ( + "https://dor.mo.gov/forms/MO-A_2021.pdf#page=3", + "https://dor.mo.gov/forms/MO-1040%20Fillable%20Calculating_2021.pdf#page=2", + "https://revisor.mo.gov/main/OneSection.aspx?section=143.124", + ) + defined_for = StateCode.MO + + def formula(person, period, parameters): + tax_unit = person.tax_unit + ind_mo_agi = person("mo_adjusted_gross_income", period) + unit_mo_agi = tax_unit.sum(ind_mo_agi) + filing_status = tax_unit("filing_status", period) + p = parameters(period).gov.states.mo.tax.income.deductions + unit_allowance = p.mo_ss_or_ssd_deduction_allowance[filing_status] + unit_agi_over_allowance = max_(0, unit_mo_agi - unit_allowance) + ind_taxable_ben = person("taxable_social_security", period) + unit_taxable_ben = tax_unit.sum(ind_taxable_ben) + unit_deduction = max_(0, unit_taxable_ben - unit_agi_over_allowance) + # Compute the individual's share of the tax unit's taxable benefits. + # Use a mask rather than where to avoid a divide-by-zero warning. Default to zero. + ind_frac = np.zeros_like(ind_taxable_ben) + mask = ind_taxable_ben > 0 + ind_frac[mask] = ind_taxable_ben[mask] / unit_taxable_ben[mask] + return ind_frac * unit_deduction diff --git a/fiscalsim_us/variables/gov/states/mo/tax/income/subtractions/mo_qualified_health_insurance_premiums.py b/fiscalsim_us/variables/gov/states/mo/tax/income/subtractions/mo_qualified_health_insurance_premiums.py index 228866274..31c03ee62 100644 --- a/fiscalsim_us/variables/gov/states/mo/tax/income/subtractions/mo_qualified_health_insurance_premiums.py +++ b/fiscalsim_us/variables/gov/states/mo/tax/income/subtractions/mo_qualified_health_insurance_premiums.py @@ -8,9 +8,9 @@ class mo_qualified_health_insurance_premiums(Variable): unit = USD definition_period = YEAR reference = ( - "https://dor.mo.gov/forms/5695.pdf", # Form MO 5695 - "https://www.irs.gov/pub/irs-pdf/f1040sa.pdf", # Federal Form 1040 Schedule A - "https://www.irs.gov/pub/irs-pdf/f1040.pdf", # Federal Form 1040 + "https://dor.mo.gov/forms/5695.pdf", # MO Form 5695 + "https://www.irs.gov/pub/irs-pdf/f1040sa.pdf", # US Form 1040 Sch A + "https://www.irs.gov/pub/irs-pdf/f1040.pdf", # US Form 1040 ) defined_for = StateCode.MO @@ -18,45 +18,50 @@ def formula(person, period, parameters): # Variable involves person- and tax unit-level variables. tax_unit = person.tax_unit - # total_health_insurance_premiums is also a primary input to the MO side of calculation, MO Form 5695, Line 8 + # total_health_insurance_premiums is also a primary input to + # the MO side of calculation, MO Form 5695, Line 8 # Federal Schedule A, Line 4 med_expense_deduction = add( tax_unit, period, ["medical_expense_deduction"] ) - # the ratio of federal medical expense deduction to total medical expenses (out of pocket + premiums) - # need division because med_dental_out_of_pocket is in federal tax, but no MO tax - # this ratio is then used to scale the health_insurance_premium amount that can be claimed + # the ratio of federal medical expense deduction to + # total medical expenses (out of pocket + premiums) + # need division because med_dental_out_of_pocket is + # in federal tax, but no MO tax + # this ratio is then used to scale the health_insurance_premium + # amount that can be claimed # IRS Schedule A Line 1 tax_unit_health_expenses = add( tax_unit, period, ["medical_out_of_pocket_expenses", "health_insurance_premiums"], ) - # Apply a where statement to avoid division by zero. - med_expense_deducted_ratio = where( - tax_unit_health_expenses > 0, - med_expense_deduction / tax_unit_health_expenses, - 0, + med_expense_ratio = np.zeros_like(tax_unit_health_expenses) + mask = tax_unit_health_expenses > 0 + med_expense_ratio[mask] = ( + med_expense_deduction[mask] / tax_unit_health_expenses[mask] ) person_premiums = person("health_insurance_premiums", period) tax_unit_premiums = tax_unit.sum(person_premiums) - # Line 13 of MO Form 5695, represents the portion of medical expenses already deducted via federal tax itemization - deducted_portion = tax_unit_premiums * med_expense_deducted_ratio + # Line 13 of MO Form 5695, represents the portion of + # medical expenses already deducted via federal tax itemization + deducted_portion = tax_unit_premiums * med_expense_ratio # subtracts the portion of premiums already deducted from federal tax itemized_premiums_amount = tax_unit_premiums - deducted_portion itemizes = tax_unit("tax_unit_itemizes", period) # Cap at federal taxable income. taxable_income = tax_unit("taxable_income", period) # Allocate proportionally across people in the tax unit based on share - # of premiums. Use where statement to avoid dividing by zero. - person_share_of_tax_unit_premiums = where( - tax_unit_premiums > 0, person_premiums / tax_unit_premiums, 0 - ) + # of premiums. + # Use a mask rather than where to avoid a divide-by-zero warning. Default to zero. + person_share = np.zeros_like(tax_unit_premiums) + mask = tax_unit_premiums > 0 + person_share[mask] = person_premiums[mask] / tax_unit_premiums[mask] - return person_share_of_tax_unit_premiums * where( + return person_share * where( itemizes, min_(itemized_premiums_amount, taxable_income), min_(tax_unit_premiums, taxable_income), diff --git a/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py b/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py index 6c72a7558..1bd42e2b5 100644 --- a/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py +++ b/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py @@ -8,38 +8,24 @@ class mo_net_state_income_taxes(Variable): unit = USD definition_period = YEAR reference = ( - "https://dor.mo.gov/forms/MO-A_2021.pdf", + "https://dor.mo.gov/forms/MO-A_2021.pdf#page=2", "https://revisor.mo.gov/main/OneSection.aspx?section=143.141&bid=7212", ) defined_for = StateCode.MO def formula(tax_unit, period, parameters): - filing_status = tax_unit("filing_status", period) - adjustment_base_amount = parameters( - period - ).gov.irs.deductions.itemized.salt_and_real_estate.cap[filing_status] - - # Taxes/income - state_and_local_sales_or_income_tax = tax_unit( - "state_and_local_sales_or_income_tax", period - ) + # follows Form MO-A Part II and Part II worksheet logic: - # Technically, state and local income tax could include the "local_earnings_tax" variable, - # but because the definition of net_state_income_taxes is simply (state_tax + local_tax) - local_tax, - # it is redundant to keep it - # More info about local income tax from the Federal W2 on page 26 here: https://dor.mo.gov/forms/MO-1040%20Instructions_2021.pdf - - net_state_income_taxes = tax_unit("state_income_tax", period) + filing_status = tax_unit("filing_status", period) + p = parameters(period).gov.irs.deductions.itemized + salt_cap = p.salt_and_real_estate.cap[filing_status] - income_tax_to_total_ratio = ( - net_state_income_taxes / state_and_local_sales_or_income_tax - ) + uncapped_itax = max_(0, add(tax_unit, period, ["state_income_tax"])) + uncapped_ptax = add(tax_unit, period, ["real_estate_taxes"]) + uncapped_salt = uncapped_itax + uncapped_ptax - # The threshold is the same as the adjustment_base_amount, i.e. the SALT cap introduced by TCJA - threshold = adjustment_base_amount + ratio = np.zeros_like(uncapped_salt) + mask = uncapped_salt != 0 + ratio[mask] = uncapped_itax[mask] / uncapped_salt[mask] - return where( - state_and_local_sales_or_income_tax > threshold, - adjustment_base_amount * (income_tax_to_total_ratio), - net_state_income_taxes, - ) + return where(uncapped_salt > salt_cap, salt_cap * ratio, uncapped_itax) diff --git a/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_taxable_income.py b/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_taxable_income.py index 35517dba5..31473b0fe 100644 --- a/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_taxable_income.py +++ b/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_taxable_income.py @@ -1,49 +1,56 @@ -from fiscalsim_us.model_api import * - - -class mo_taxable_income(Variable): - value_type = float - entity = Person - label = "Missouri AGI minus deductions" - unit = USD - definition_period = YEAR - reference = ( - "https://dor.mo.gov/forms/MO-A_2021.pdf", - "https://www.revisor.mo.gov/main/OneSection.aspx?section=143.111&bid=7201&hl=", - ) - defined_for = StateCode.MO - - def formula(person, period, parameters): - # calculate tax unit MO AGI - tax_unit = person.tax_unit - mo_agi = person("mo_adjusted_gross_income", period) - unit_mo_agi = tax_unit.sum(mo_agi) - - # calculate sum of all tax unit MO deductions - mo_itemized_or_standard = where( - tax_unit("tax_unit_itemizes", period), # itemizes on federal form - tax_unit("mo_itemized_deductions", period), - tax_unit("standard_deduction", period), # equal to federal stdded - ) - mo_federal_income_tax_deduction = tax_unit( - "mo_federal_income_tax_deduction", period - ) - mo_pension_and_ss_or_ssd_deduction = tax_unit( - "mo_pension_and_ss_or_ssd_deduction", period - ) - unit_mo_deductions = ( - mo_itemized_or_standard - + mo_federal_income_tax_deduction # available to all tax units - + mo_pension_and_ss_or_ssd_deduction # available to all tax units - ) - # Note: There would also be a personal and/or dependent exemptions - # as part of this formula, but they are legally based on eligibility - # for the federal versions of those exemptions, both of which are - # suspended through 2025 federally. - - # calculate taxable income for tax unit - unit_taxinc = max_(0, unit_mo_agi - unit_mo_deductions) - - # allocate unit taxable income by each individual's share of unit AGI - ind_agi_share = where(unit_mo_agi > 0, mo_agi / unit_mo_agi, 0) - return ind_agi_share * unit_taxinc +from fiscalsim_us.model_api import * + + +class mo_taxable_income(Variable): + value_type = float + entity = Person + label = "Missouri AGI minus deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://dor.mo.gov/forms/MO-A_2021.pdf" + "https://dor.mo.gov/forms/MO-1040%20Instructions_2021.pdf#page=8" + "https://dor.mo.gov/forms/MO-1040%20Instructions_2022.pdf#page=8" + "https://www.revisor.mo.gov/main/OneSection.aspx?section=143.111&bid=7201&hl=" + ) + defined_for = StateCode.MO + + def formula(person, period, parameters): + # calculate tax unit MO AGI + tax_unit = person.tax_unit + mo_agi = person("mo_adjusted_gross_income", period) + unit_mo_agi = tax_unit.sum(mo_agi) + + # calculate sum of all tax unit MO deductions + # 2021 and 2022 Form MO-1040 instructions on page 8 say: + # If you claimed the standard deduction on your federal return, + # enter the standard deduction amount for your filing status. + # The amounts are listed on Form MO-1040, Line 14. + # If you itemized on your federal return, you may want to itemize + # on your Missouri return or take the standard deduction, whichever + # results in a higher deduction. + federal_itemizer = tax_unit("tax_unit_itemizes", period) + itmded = tax_unit("mo_itemized_deductions", period) + stdded = tax_unit("standard_deduction", period) # same as federal + mo_deduction = where(federal_itemizer, max_(itmded, stdded), stdded) + unit_mo_deductions = ( + mo_deduction + + tax_unit("mo_federal_income_tax_deduction", period) + + tax_unit("mo_pension_and_ss_or_ssd_deduction", period) + ) + # Note: There would also be a personal and/or dependent exemptions + # as part of this formula, but they are legally based on eligibility + # for the federal versions of those exemptions, both of which are + # suspended through 2025 federally. + + # calculate taxable income for tax unit + unit_taxinc = max_(0, unit_mo_agi - unit_mo_deductions) + + # allocate tax unit taxable income by each individual's share of + # unit AGI (use a mask rather than where to avoid a divide-by-zero + # warning with default share value being zero) + ind_agi_share = np.zeros_like(unit_mo_agi) + mask = unit_mo_agi > 0 + ind_agi_share[mask] = mo_agi[mask] / unit_mo_agi[mask] + + return ind_agi_share * unit_taxinc diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/adjustments/ms_national_guard_or_reserve_pay_adjustment.py b/fiscalsim_us/variables/gov/states/ms/tax/income/adjustments/ms_national_guard_or_reserve_pay_adjustment.py new file mode 100644 index 000000000..89dd447db --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/adjustments/ms_national_guard_or_reserve_pay_adjustment.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class ms_national_guard_or_reserve_pay_adjustment(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi national guard or reserve pay adjustment" + unit = USD + definition_period = YEAR + reference = [ + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=12", + "https://law.justia.com/codes/mississippi/2020/title-27/chapter-7/article-1/section-27-7-18/", # 4(m) + ] + defined_for = StateCode.MS + + def formula(tax_unit, period, parameters): + military_income = add(tax_unit, period, ["military_service_income"]) + p = parameters( + period + ).gov.states.ms.tax.income.adjustments.national_guard_or_reserve_pay + return min_(military_income, p.cap) diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/adjustments/ms_self_employment_adjustment.py b/fiscalsim_us/variables/gov/states/ms/tax/income/adjustments/ms_self_employment_adjustment.py new file mode 100644 index 000000000..ee8ff2632 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/adjustments/ms_self_employment_adjustment.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class ms_self_employment_adjustment(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi self employment adjustment" + unit = USD + definition_period = YEAR + reference = [ + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=13", # Line 61 + "https://law.justia.com/codes/mississippi/2020/title-27/chapter-7/article-1/section-27-7-18/", # 6(c) + ] + defined_for = StateCode.MS + + def formula(tax_unit, period, parameters): + self_employment_tax = add(tax_unit, period, ["self_employment_tax"]) + p = parameters( + period + ).gov.states.ms.tax.income.adjustments.self_employment + return self_employment_tax * p.rate diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/deductions/itemized/ms_itemized_deductions.py b/fiscalsim_us/variables/gov/states/ms/tax/income/deductions/itemized/ms_itemized_deductions.py new file mode 100644 index 000000000..9e7dc199e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/deductions/itemized/ms_itemized_deductions.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class ms_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi itemized deductions" + unit = USD + definition_period = YEAR + + reference = ( + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=15" + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80108228.pdf, # Line 7" + "https://casetext.com/statute/mississippi-code-1972/title-27-taxation-and-finance/chapter-7-income-tax-and-withholding/article-1-income-tax/section-27-7-17-deductions-allowed?__cf_chl_rt_tk=8Kelu8kHpIXTp_FnAJLHvqa7rtrZYE1U.NAeBM8L.Nc-1692990420-0-gaNycGzNEmU" + ) + defined_for = StateCode.MS + + adds = ["itemized_deductions_less_salt", "misc_deduction"] + + # Mississippi allows itemized deductions for gaming establishments and gender transition procedures + # which are currently not modeled diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/deductions/ms_deductions.py b/fiscalsim_us/variables/gov/states/ms/tax/income/deductions/ms_deductions.py new file mode 100644 index 000000000..058e8a36d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/deductions/ms_deductions.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class ms_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80108228.pdf#page=1" + "https://www.law.cornell.edu/regulations/mississippi/35-Miss-Code-R-SS-3-02-11-103" + ) + defined_for = StateCode.MS + + def formula(tax_unit, period, parameters): + itemized = tax_unit("ms_itemized_deductions", period) + standard = tax_unit("ms_standard_deduction", period) + return max_(itemized, standard) diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/deductions/standard/ms_standard_deduction.py b/fiscalsim_us/variables/gov/states/ms/tax/income/deductions/standard/ms_standard_deduction.py new file mode 100644 index 000000000..2806020ff --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/deductions/standard/ms_standard_deduction.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class ms_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi personal standard deduction" + unit = USD + definition_period = YEAR + defined_for = StateCode.MS + + def formula(tax_unit, period, parameters): + # First get their filing status. + filing_status = tax_unit("filing_status", period) + + # Then get the MS Standard Deduction part of the parameter tree. + p = parameters(period).gov.states.ms.tax.income.deductions.standard + + # Get their standard deduction amount based on their filing status. + return p.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_aged_exemption.py b/fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_aged_exemption.py new file mode 100644 index 000000000..150909cd9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_aged_exemption.py @@ -0,0 +1,33 @@ +from fiscalsim_us.model_api import * + + +class ms_aged_exemption(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi aged exemption" + unit = USD + definition_period = YEAR + defined_for = StateCode.MS + + def formula(tax_unit, period, parameters): + # First get their filing status. + filing_status = tax_unit("filing_status", period) + + # Then get the MS aged exemptions part of the parameter tree. + p = parameters(period).gov.states.ms.tax.income.exemptions.aged + + # Get the individual filer's age. + age_head = tax_unit("age_head", period) + + # Determine if head of household (filer) is eligible. + head_eligible = (age_head >= p.age_threshold).astype(int) + + # Get the spouse age, if applicable. + age_spouse = tax_unit("age_spouse", period) + + # Determine whether spouse is eligible (>= age 65). + joint = filing_status == filing_status.possible_values.JOINT + spouse_eligible = ((age_spouse >= p.age_threshold) * joint).astype(int) + + # Calculate total aged exemption. + return (head_eligible + spouse_eligible) * p.amount diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_blind_exemption.py b/fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_blind_exemption.py new file mode 100644 index 000000000..7b6214a6b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_blind_exemption.py @@ -0,0 +1,29 @@ +from fiscalsim_us.model_api import * + + +class ms_blind_exemption(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi blind exemption" + unit = USD + definition_period = YEAR + defined_for = StateCode.MS + + def formula(tax_unit, period, parameters): + # First get their filing status. + filing_status = tax_unit("filing_status", period) + + # Then get the MS blind exemptions part of the parameter tree. + p = parameters(period).gov.states.ms.tax.income.exemptions.blind + + # Determine if head of household (filer) is eligible. + head_eligible = tax_unit("blind_head", period).astype(int) + + # Determine whether spouse is eligible. + joint = filing_status == filing_status.possible_values.JOINT + spouse_eligible = (tax_unit("blind_spouse", period) * joint).astype( + int + ) + + # Calculate total blind exemption. + return (head_eligible + spouse_eligible) * p.amount diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_total_exemptions.py b/fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_total_exemptions.py new file mode 100644 index 000000000..72e445513 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/exemptions/ms_total_exemptions.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class ms_total_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi total exemptions" + unit = USD + definition_period = YEAR + defined_for = StateCode.MS + reference = "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=6" + + adds = [ + "ms_regular_exemption", + "ms_dependents_exemption", + "ms_aged_exemption", + "ms_blind_exemption", + ] diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/ms_agi.py b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_agi.py new file mode 100644 index 000000000..a43955e19 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_agi.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class ms_agi(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=14", + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80105228.pdf", # Line 66 + ) + defined_for = StateCode.MS + + # AGI = Income - Total adjustments from gross income + adds = "gov.states.ms.tax.income.income_sources" + subtracts = ["ms_agi_adjustments"] diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/ms_agi_adjustments.py b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_agi_adjustments.py new file mode 100644 index 000000000..feab6015b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_agi_adjustments.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class ms_agi_adjustments(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi adjustments to federal adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=13", + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80105228.pdf", # Line 50 - 66 + ) + defined_for = StateCode.MS + + adds = "gov.states.ms.tax.income.adjustments.adjustments" diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/ms_income_tax.py b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_income_tax.py new file mode 100644 index 000000000..be6a98015 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_income_tax.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class ms_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.MS + + def formula(tax_unit, period, parameters): + before_non_refundable_credits = tax_unit( + "ms_income_tax_before_credits", period + ) + non_refundable_credits = tax_unit("ms_non_refundable_credits", period) + return max_(before_non_refundable_credits - non_refundable_credits, 0) diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/ms_income_tax_before_credits.py b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_income_tax_before_credits.py new file mode 100644 index 000000000..983b7bc53 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_income_tax_before_credits.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ms_income_tax_before_credits(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi income tax before credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.MS + + def formula(tax_unit, period, parameters): + income = tax_unit("ms_taxable_income", period) + rate = parameters(period).gov.states.ms.tax.income.rate + return rate.calc(income) diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/ms_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_non_refundable_credits.py new file mode 100644 index 000000000..7fb543ce7 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_non_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class ms_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.MS diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/ms_refundable_credits.py b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_refundable_credits.py new file mode 100644 index 000000000..45f68490c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class ms_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.MS diff --git a/fiscalsim_us/variables/gov/states/ms/tax/income/ms_taxable_income.py b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_taxable_income.py new file mode 100644 index 000000000..bb12b3ba0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ms/tax/income/ms_taxable_income.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class ms_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Mississippi taxable income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80100221.pdf#page=13", + "https://www.dor.ms.gov/sites/default/files/Forms/Individual/80105228.pdf", # Line 38 - 49, + ) + defined_for = StateCode.MS + + def formula(tax_unit, period, parameters): + agi = tax_unit("ms_agi", period) + deductions = tax_unit("ms_deductions", period) + exemptions = tax_unit("ms_total_exemptions", period) + return max_(agi - deductions - exemptions, 0) diff --git a/fiscalsim_us/variables/gov/states/mt/tax/income/credits/mt_capital_gain_credit.py b/fiscalsim_us/variables/gov/states/mt/tax/income/credits/mt_capital_gain_credit.py new file mode 100644 index 000000000..c3efc4256 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mt/tax/income/credits/mt_capital_gain_credit.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class mt_capital_gain_credit(Variable): + value_type = float + entity = TaxUnit + label = "Montana capital gain credit" + unit = USD + definition_period = YEAR + reference = "https://rules.mt.gov/gateway/RuleNo.asp?RN=42%2E4%2E502" + defined_for = StateCode.MT + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.mt.tax.income.credits.capital_gain + + net_capital_gain = tax_unit("net_capital_gain", period) + # The net capital gain variable is capped at 0 + return p.percentage * net_capital_gain diff --git a/fiscalsim_us/variables/gov/states/mt/tax/income/deductions/standard/mt_standard_deduction.py b/fiscalsim_us/variables/gov/states/mt/tax/income/deductions/standard/mt_standard_deduction.py new file mode 100644 index 000000000..9998b4220 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mt/tax/income/deductions/standard/mt_standard_deduction.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class mt_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Montana standard deduction" + unit = USD + definition_period = YEAR + defined_for = StateCode.MT + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + p = parameters(period).gov.states.mt.tax.income.deductions.standard + agi = tax_unit("mt_agi", period) + # standard deduction is a percentage of AGI that + # is bounded by a min/max by filing status. + min_amount = p.min[filing_status] + max_amount = p.max[filing_status] + uncapped_amount = p.rate * agi + deduction_amount = min_(uncapped_amount, max_amount) + + return max_(deduction_amount, min_amount) diff --git a/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_aged_exemption_count.py b/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_aged_exemption_count.py new file mode 100644 index 000000000..c22193943 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_aged_exemption_count.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class mt_aged_exemption_count(Variable): + value_type = int + entity = TaxUnit + label = "Number of Montana aged exemptions" + definition_period = YEAR + reference = "https://regulations.justia.com/states/montana/department-42/chapter-42-15/subchapter-42-15-4/rule-42-15-402/" + defined_for = StateCode.MT + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.mt.tax.income.exemptions + aged_head = (tax_unit("age_head", period) >= p.age_threshold).astype( + int + ) + aged_spouse = ( + tax_unit("age_spouse", period) >= p.age_threshold + ).astype(int) + return aged_head + aged_spouse diff --git a/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_dependent_exemption_count.py b/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_dependent_exemption_count.py new file mode 100644 index 000000000..4d1f98ec9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_dependent_exemption_count.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class mt_dependent_exemption_count(Variable): + value_type = float + entity = TaxUnit + label = "Number of Montana dependent exemptions" + unit = USD + definition_period = YEAR + reference = "https://regulations.justia.com/states/montana/department-42/chapter-42-15/subchapter-42-15-4/rule-42-15-403/" + defined_for = StateCode.MT + + def formula(tax_unit, period, parameters): + person = tax_unit.members + # Qualifying child under IRC 152(c), which defines for the EITC + qualifying_child = person("is_eitc_qualifying_child", period) + total_eligible = tax_unit.sum(qualifying_child) + # Disabled dependents get an additional exemption. + disabled = where( + qualifying_child, person("is_disabled", period).astype(int), 0 + ) + total_disabled = tax_unit.sum(disabled) + return total_eligible + total_disabled diff --git a/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_exemptions.py b/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_exemptions.py new file mode 100644 index 000000000..9ecb9d1c4 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_exemptions.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class mt_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "Montana exemptions" + unit = USD + definition_period = YEAR + defined_for = StateCode.MT + + def formula(tax_unit, period, parameters): + exemption_count = tax_unit("mt_exemptions_count", period) + p = parameters(period).gov.states.mt.tax.income.exemptions + return exemption_count * p.amount diff --git a/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_exemptions_count.py b/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_exemptions_count.py new file mode 100644 index 000000000..53864d20a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mt/tax/income/exemptions/mt_exemptions_count.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class mt_exemptions_count(Variable): + value_type = int + entity = TaxUnit + label = "Number of Montana exemptions" + definition_period = YEAR + defined_for = StateCode.MT + + adds = [ + "head_spouse_count", + "blind_head", + "blind_spouse", + "mt_dependent_exemption_count", + "mt_aged_exemption_count", + ] diff --git a/fiscalsim_us/variables/gov/states/mt/tax/income/mt_agi.py b/fiscalsim_us/variables/gov/states/mt/tax/income/mt_agi.py new file mode 100644 index 000000000..5b6ed8601 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mt/tax/income/mt_agi.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class mt_agi(Variable): + value_type = float + entity = TaxUnit + label = "Montana Adjusted Gross Income" + unit = USD + definition_period = YEAR + defined_for = StateCode.MT diff --git a/fiscalsim_us/variables/gov/states/mt/tax/income/mt_eitc.py b/fiscalsim_us/variables/gov/states/mt/tax/income/mt_eitc.py new file mode 100644 index 000000000..3696a3e62 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/mt/tax/income/mt_eitc.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class mt_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Montana EITC" + unit = USD + definition_period = YEAR + reference = "https://leg.mt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0180/0150-0300-0230-0180.html" + + def formula(tax_unit, period, parameters): + eitc = tax_unit("earned_income_tax_credit", period) + filing_status = tax_unit("filing_status", period) + rate = parameters(period).gov.states.mt.tax.income.credits.eitc.rate + return where( + filing_status == filing_status.possible_values.SEPARATE, + 0, + eitc * rate, + ) diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/credits/nc_ctc.py b/fiscalsim_us/variables/gov/states/nc/tax/income/credits/nc_ctc.py new file mode 100644 index 000000000..2b614276e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/credits/nc_ctc.py @@ -0,0 +1,35 @@ +from fiscalsim_us.model_api import * + + +class nc_ctc(Variable): + value_type = float + entity = TaxUnit + label = "North Carolina credit for children" + definition_period = YEAR + unit = USD + reference = "https://www.ncdor.gov/taxes-forms/individual-income-tax/credit-children" + defined_for = StateCode.NC + + def formula(tax_unit, period, parameters): + ctc_qualifying_children = tax_unit("ctc_qualifying_children", period) + income = tax_unit("adjusted_gross_income", period) + filing_status = tax_unit("filing_status", period) + p = parameters(period).gov.states.nc.tax.income.credits.ctc + status = filing_status.possible_values + credit_amount = select( + [ + filing_status == status.SINGLE, + filing_status == status.HEAD_OF_HOUSEHOLD, + filing_status == status.JOINT, + filing_status == status.WIDOW, + filing_status == status.SEPARATE, + ], + [ + p.single.calc(income), + p.head_of_household.calc(income), + p.joint.calc(income), + p.widow.calc(income), + p.separate.calc(income), + ], + ) + return ctc_qualifying_children * credit_amount diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py new file mode 100644 index 000000000..a3221adfc --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_child_deduction.py @@ -0,0 +1,37 @@ +from fiscalsim_us.model_api import * + + +class nc_child_deduction(Variable): + value_type = float + entity = TaxUnit + label = "North Carolina child deduction" + unit = USD + definition_period = YEAR + defined_for = StateCode.NC + + def formula(tax_unit, period, parameters): + # calculate deduction amount per eligible child + federal_agi = tax_unit("adjusted_gross_income", period) + filing_status = tax_unit("filing_status", period) + statuses = filing_status.possible_values + p = parameters(period).gov.states.nc.tax.income.deductions.child + amount = select( + [ + filing_status == statuses.SINGLE, + filing_status == statuses.SEPARATE, + filing_status == statuses.JOINT, + filing_status == statuses.WIDOW, + filing_status == statuses.HEAD_OF_HOUSEHOLD, + ], + [ + p.single.calc(federal_agi, right=True), + p.separate.calc(federal_agi, right=True), + p.joint.calc(federal_agi, right=True), + p.widow.calc(federal_agi, right=True), + p.head_of_household.calc(federal_agi, right=True), + ], + ) + # calculate number of eligible children + children = tax_unit("ctc_qualifying_children", period) + # calculate NC child deduction + return amount * children diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_deductions.py b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_deductions.py new file mode 100644 index 000000000..7769ee1ac --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_deductions.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class nc_deductions(Variable): + value_type = float + entity = TaxUnit + label = "North Carolina deductions" + unit = USD + definition_period = YEAR + reference = "https://www.ncdor.gov/taxes-forms/individual-income-tax/north-carolina-standard-deduction-or-north-carolina-itemized-deductions" + defined_for = StateCode.NC + + adds = "gov.states.nc.tax.income.deductions.deductions" diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_itemized_deductions.py b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_itemized_deductions.py new file mode 100644 index 000000000..7b5a21c35 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_itemized_deductions.py @@ -0,0 +1,40 @@ +from fiscalsim_us.model_api import * + + +class nc_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "North Carolina itemized deductions" + unit = USD + definition_period = YEAR + reference = "https://www.ncdor.gov/taxes-forms/individual-income-tax/north-carolina-standard-deduction-or-north-carolina-itemized-deductions " + defined_for = StateCode.NC + + def formula(tax_unit, period, parameters): + # Qualified Mortgage Interest and Real Estate Property Taxes. + filing_status = tax_unit("filing_status", period) + + mortgage_interest = add(tax_unit, period, ["mortgage_interest"]) + pirs = parameters( + period + ).gov.irs.deductions.itemized.salt_and_real_estate + property_taxes = min_( + add(tax_unit, period, ["real_estate_taxes"]), + pirs.cap[filing_status], + ) + pco = parameters( + period + ).gov.states.nc.tax.income.deductions.itemized.cap + capped_mortage_and_property_taxes = min_( + mortgage_interest + property_taxes, pco.mortgage_and_property_tax + ) + + # North Carolina specifies a state and local tax deduction cap which is currently not modeled in PolicyEngine + + other_deductions = add( + tax_unit, + period, + ["charitable_deduction", "medical_expense_deduction"], + ) + + return capped_mortage_and_property_taxes + other_deductions diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_standard_deduction.py b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_standard_deduction.py new file mode 100644 index 000000000..2dc34925b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_standard_deduction.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class nc_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "North Carolina standard deduction" + unit = USD + definition_period = YEAR + defined_for = StateCode.NC + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + p = parameters(period).gov.states.nc.tax.income + return p.deductions.standard.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_standard_or_itemized_deductions.py b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_standard_or_itemized_deductions.py new file mode 100644 index 000000000..c37a55cbb --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/deductions/nc_standard_or_itemized_deductions.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class nc_standard_or_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "North Carolina standard or itemized deductions amount" + unit = USD + definition_period = YEAR + reference = ( + "https://www.ncdor.gov/2021-d-401-individual-income-tax-instructions/open#page=14" + "https://www.ncdor.gov/2022-d-401-individual-income-tax-instructions/open#page=14" + ) + defined_for = StateCode.NC + + def formula(tax_unit, period, parameters): + # From above instructions for Line 11: + # You may deduct from federal adjusted gross income either + # the N.C. standard deduction or N.C. itemized deductions. + # In most cases, your state income tax will be less if you + # take the larger of your N.C. itemized deductions or your + # N.C. standard deduction. + stded = tax_unit("nc_standard_deduction", period) + itded = tax_unit("nc_itemized_deductions", period) + return max_(stded, itded) diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/nc_additions.py b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_additions.py new file mode 100644 index 000000000..6fc8a61d5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_additions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class nc_additions(Variable): + value_type = float + entity = TaxUnit + label = "North Carolina additions to the adjusted gross income" + unit = USD + definition_period = YEAR + defined_for = StateCode.NC diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/nc_income_tax.py b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_income_tax.py index 11fffd96c..345642987 100644 --- a/fiscalsim_us/variables/gov/states/nc/tax/income/nc_income_tax.py +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_income_tax.py @@ -11,6 +11,6 @@ class nc_income_tax(Variable): def formula(tax_unit, period, parameters): tax_before_credits = tax_unit("nc_income_tax_before_credits", period) - # North Carolina does not allow for any refundable credits + # North Carolina provides no refundable income tax credits credits = tax_unit("nc_non_refundable_credits", period) - return max_((tax_before_credits - credits), 0) + return max_(0, tax_before_credits - credits) diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/nc_income_tax_before_credits.py b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_income_tax_before_credits.py index 53f3141fe..078b1365e 100644 --- a/fiscalsim_us/variables/gov/states/nc/tax/income/nc_income_tax_before_credits.py +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_income_tax_before_credits.py @@ -11,5 +11,5 @@ class nc_income_tax_before_credits(Variable): def formula(tax_unit, period, parameters): income = tax_unit("nc_taxable_income", period) - rate = parameters(period).gov.states.nc.tax.income.rate - return income * rate + p = parameters(period).gov.states.nc.tax.income + return max_(0, income) * p.rate diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/nc_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_non_refundable_credits.py index e3924cebd..8b883441d 100644 --- a/fiscalsim_us/variables/gov/states/nc/tax/income/nc_non_refundable_credits.py +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_non_refundable_credits.py @@ -8,3 +8,5 @@ class nc_non_refundable_credits(Variable): unit = USD definition_period = YEAR defined_for = StateCode.NC + + adds = "gov.states.nc.tax.income.credits.non_refundable" diff --git a/fiscalsim_us/variables/gov/states/nc/tax/income/nc_taxable_income.py b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_taxable_income.py index 21fda9d0b..94867764a 100644 --- a/fiscalsim_us/variables/gov/states/nc/tax/income/nc_taxable_income.py +++ b/fiscalsim_us/variables/gov/states/nc/tax/income/nc_taxable_income.py @@ -8,3 +8,6 @@ class nc_taxable_income(Variable): unit = USD definition_period = YEAR defined_for = StateCode.NC + + adds = ["adjusted_gross_income", "nc_additions"] + subtracts = ["nc_deductions"] diff --git a/fiscalsim_us/variables/gov/states/ne/tax/income/ne_itemized_deductions.py b/fiscalsim_us/variables/gov/states/ne/tax/income/ne_itemized_deductions.py index 70ccda2c8..484a4b97a 100644 --- a/fiscalsim_us/variables/gov/states/ne/tax/income/ne_itemized_deductions.py +++ b/fiscalsim_us/variables/gov/states/ne/tax/income/ne_itemized_deductions.py @@ -1,40 +1,19 @@ -from fiscalsim_us.model_api import * - - -class ne_itemized_deductions(Variable): - value_type = float - entity = TaxUnit - label = "NE itemized deductions" - unit = USD - definition_period = YEAR - reference = ( - "https://revenue.nebraska.gov/files/doc/tax-forms/2021/f_1040n_booklet.pdf" - "https://revenue.nebraska.gov/files/doc/2022_Ne_Individual_Income_Tax_Booklet_8-307-2022_final_5.pdf" - ) - defined_for = StateCode.NE - - def formula(tax_unit, period, parameters): - # 2021 Form 1040N instructions say this: - # If you use the standard deduction on the federal return, - # you must use the Nebraska standard deduction on the - # Nebraska return. All taxpayers that claimed itemized - # deductions on their federal return are allowed the larger - # of the Nebraska standard deduction or federal itemized - # deductions, minus state and local income taxes claimed on - # Federal Schedule A. - us_itemizing = tax_unit("tax_unit_itemizes", period) - # calculate US itemized deductions less state non-property taxes - p = parameters(period).gov.irs.deductions - items = [ - deduction - for deduction in p.itemized_deductions - if deduction not in ["salt_deduction"] - ] - us_itm_deds_less_salt = add(tax_unit, period, items) - filing_status = tax_unit("filing_status", period) - capped_property_taxes = min_( - add(tax_unit, period, ["real_estate_taxes"]), - p.itemized.salt_and_real_estate.cap[filing_status], - ) - ne_itm_deds = us_itm_deds_less_salt + capped_property_taxes - return us_itemizing * ne_itm_deds +from fiscalsim_us.model_api import * + + +class ne_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "NE itemized deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://revenue.nebraska.gov/files/doc/tax-forms/2021/f_1040n_booklet.pdf" + "https://revenue.nebraska.gov/files/doc/2022_Ne_Individual_Income_Tax_Booklet_8-307-2022_final_5.pdf" + ) + defined_for = StateCode.NE + + def formula(tax_unit, period, parameters): + itm_deds_less_salt = tax_unit("itemized_deductions_less_salt", period) + capped_property_taxes = tax_unit("capped_property_taxes", period) + return itm_deds_less_salt + capped_property_taxes diff --git a/fiscalsim_us/variables/gov/states/ne/tax/income/ne_taxable_income.py b/fiscalsim_us/variables/gov/states/ne/tax/income/ne_taxable_income.py index d30bc08d4..38464f2a7 100644 --- a/fiscalsim_us/variables/gov/states/ne/tax/income/ne_taxable_income.py +++ b/fiscalsim_us/variables/gov/states/ne/tax/income/ne_taxable_income.py @@ -1,21 +1,30 @@ -from fiscalsim_us.model_api import * - - -class ne_taxable_income(Variable): - value_type = float - entity = TaxUnit - label = "NE taxable income" - unit = USD - definition_period = YEAR - reference = ( - "https://revenue.nebraska.gov/files/doc/tax-forms/2021/f_1040n_booklet.pdf" - "https://revenue.nebraska.gov/files/doc/2022_Ne_Individual_Income_Tax_Booklet_8-307-2022_final_5.pdf" - ) - defined_for = StateCode.NE - - def formula(tax_unit, period, parameters): - agi = tax_unit("ne_agi", period) - std_ded = tax_unit("ne_standard_deduction", period) - itm_ded = tax_unit("ne_itemized_deductions", period) - deductions = where(itm_ded > std_ded, itm_ded, std_ded) - return max_(0, agi - deductions) +from fiscalsim_us.model_api import * + + +class ne_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "NE taxable income" + unit = USD + definition_period = YEAR + reference = ( + "https://revenue.nebraska.gov/files/doc/tax-forms/2021/f_1040n_booklet.pdf" + "https://revenue.nebraska.gov/files/doc/2022_Ne_Individual_Income_Tax_Booklet_8-307-2022_final_5.pdf" + ) + defined_for = StateCode.NE + + def formula(tax_unit, period, parameters): + agi = tax_unit("ne_agi", period) + # 2021 (2022) Form 1040N instructions on page 7 (page 8) say this: + # If you use the standard deduction on the federal return, + # you must use the Nebraska standard deduction on the + # Nebraska return. All taxpayers that claimed itemized + # deductions on their federal return are allowed the larger + # of the Nebraska standard deduction or federal itemized + # deductions, minus state and local income taxes claimed on + # Federal Schedule A. + federal_itemizer = tax_unit("tax_unit_itemizes", period) + std_ded = tax_unit("ne_standard_deduction", period) + itm_ded = tax_unit("ne_itemized_deductions", period) + deduction = where(federal_itemizer, max_(itm_ded, std_ded), std_ded) + return max_(0, agi - deduction) diff --git a/fiscalsim_us/variables/gov/states/nh/tax/credits/nh_education_tax_credit.py b/fiscalsim_us/variables/gov/states/nh/tax/credits/nh_education_tax_credit.py new file mode 100644 index 000000000..14912f171 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nh/tax/credits/nh_education_tax_credit.py @@ -0,0 +1,24 @@ +from fiscalsim_us.model_api import * + + +class nh_education_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "New Hampshire Education Tax Credit" + unit = USD + definition_period = YEAR + reference = ( + "https://www.gencourt.state.nh.us/rsa/html/NHTOC/NHTOC-V-77-G.htm" + ) + defined_for = StateCode.NH + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.nh.tax.credits.education + + # Get Rate for donation + donation = add( + tax_unit, + period, + ["charitable_cash_donations", "charitable_non_cash_donations"], + ) + return p.rate.calc(donation) diff --git a/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_base_exemption.py b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_base_exemption.py new file mode 100644 index 000000000..7537b7b86 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_base_exemption.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class nh_base_exemption(Variable): + value_type = float + entity = TaxUnit + label = "New Hampshire base exemption" + unit = USD + definition_period = YEAR + defined_for = StateCode.NH + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + base = parameters( + period + ).gov.states.nh.tax.income.exemptions.amount.base + return base[filing_status] diff --git a/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_blind_exemption.py b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_blind_exemption.py new file mode 100644 index 000000000..9e77fbcb0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_blind_exemption.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class nh_blind_exemption(Variable): + value_type = float + entity = TaxUnit + label = "New Hampshire blind exemption" + unit = USD + definition_period = YEAR + defined_for = StateCode.NH + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.nh.tax.income.exemptions.amount + + # Get the individual blind status. + blind_head = tax_unit("blind_head", period).astype(int) + + # Get the individual's spouse blind status. + blind_spouse = tax_unit("blind_spouse", period).astype(int) + + # Calculate total blind exemption. + return (blind_head + blind_spouse) * p.blind_addition diff --git a/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_disabled_exemption.py b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_disabled_exemption.py new file mode 100644 index 000000000..68a8a91f7 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_disabled_exemption.py @@ -0,0 +1,29 @@ +from fiscalsim_us.model_api import * + + +class nh_disabled_exemption(Variable): + value_type = float + entity = TaxUnit + label = "New Hampshire disabled exemption" + unit = USD + definition_period = YEAR + defined_for = StateCode.NH + + def formula(tax_unit, period, parameters): + # Then get the NH disabled exemptions part of the parameter tree. + p = parameters(period).gov.states.nh.tax.income.exemptions + + # Get the individual disabled and age status. + disabled_head = tax_unit("disabled_head", period) + age_head = tax_unit("age_head", period) < p.disability_age_threshold + head_eligible = (disabled_head & age_head).astype(int) + + # Get the individual's spouse disabled and age status. + disabled_spouse = tax_unit("disabled_spouse", period) + age_spouse = ( + tax_unit("age_spouse", period) < p.disability_age_threshold + ) + spouse_eligible = (disabled_spouse & age_spouse).astype(int) + + # Calculate total blind exemption. + return (head_eligible + spouse_eligible) * p.amount.disabled_addition diff --git a/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_old_age_exemption.py b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_old_age_exemption.py new file mode 100644 index 000000000..dde41189a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_old_age_exemption.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class nh_old_age_exemption(Variable): + value_type = float + entity = TaxUnit + label = "New Hampshire old age exemption" + unit = USD + definition_period = YEAR + defined_for = StateCode.NH + + def formula(tax_unit, period, parameters): + # Then get the NH old age exemptions part of the parameter tree. + p = parameters(period).gov.states.nh.tax.income.exemptions + + # Check if the individual's eligiblity. + head_eligible = ( + tax_unit("age_head", period) >= p.old_age_eligibility + ).astype(int) + + # Check if the individual spouse's eligiblity. + spouse_eligible = ( + tax_unit("age_spouse", period) >= p.old_age_eligibility + ).astype(int) + + # Calculate total blind exemption. + return (head_eligible + spouse_eligible) * p.amount.old_age_addition diff --git a/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_total_exemptions.py b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_total_exemptions.py new file mode 100644 index 000000000..a0d64c498 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nh/tax/income/exemptions/nh_total_exemptions.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class nh_total_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "New Hampshire total exemption allowance" + unit = USD + definition_period = YEAR + defined_for = StateCode.NH + + adds = [ + "nh_base_exemption", + "nh_blind_exemption", + "nh_disabled_exemption", + "nh_old_age_exemption", + ] diff --git a/fiscalsim_us/variables/gov/states/nh/tax/income/nh_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/nh/tax/income/nh_income_tax_before_refundable_credits.py index 83e661e7d..2dcb8ee96 100644 --- a/fiscalsim_us/variables/gov/states/nh/tax/income/nh_income_tax_before_refundable_credits.py +++ b/fiscalsim_us/variables/gov/states/nh/tax/income/nh_income_tax_before_refundable_credits.py @@ -10,6 +10,6 @@ class nh_income_tax_before_refundable_credits(Variable): defined_for = StateCode.NH def formula(tax_unit, period, parameters): - income = tax_unit("nh_taxable_income", period) - rate = parameters(period).gov.states.nh.tax.income.main + income = max_(0, tax_unit("nh_taxable_income", period)) + rate = parameters(period).gov.states.nh.tax.income.rate return income * rate diff --git a/fiscalsim_us/variables/gov/states/nh/tax/income/nh_taxable_income.py b/fiscalsim_us/variables/gov/states/nh/tax/income/nh_taxable_income.py index 4ead7b0e2..1fcc7270d 100644 --- a/fiscalsim_us/variables/gov/states/nh/tax/income/nh_taxable_income.py +++ b/fiscalsim_us/variables/gov/states/nh/tax/income/nh_taxable_income.py @@ -7,6 +7,13 @@ class nh_taxable_income(Variable): label = "New Hampshire taxable income" unit = USD definition_period = YEAR - reference = "https://www.gencourt.state.nh.us/rsa/html/V/77/77-4.htm " + reference = ( + "https://www.gencourt.state.nh.us/rsa/html/V/77/77-4.htm", + "https://www.revenue.nh.gov/forms/2023/documents/dp-10-2022-print.pdf", + ) defined_for = StateCode.NH + + # New Hampshire allows for negative taxable income. + # It limits tax to nonnegative values in the tax computation instead. adds = ["dividend_income", "interest_income"] + subtracts = ["nh_total_exemptions"] diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi.py b/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi.py index c144b6d5a..b7d37dcc4 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi.py @@ -1,14 +1,17 @@ -from fiscalsim_us.model_api import * - - -class nj_agi(Variable): - value_type = float - entity = TaxUnit - label = "New Jersey adjusted gross income" - unit = USD - definition_period = YEAR - reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/" - defined_for = StateCode.NJ - - adds = ["adjusted_gross_income", "nj_agi_additions"] - subtracts = ["nj_agi_subtractions"] +from fiscalsim_us.model_api import * + + +class nj_agi(Variable): + value_type = float + entity = TaxUnit + label = "New Jersey adjusted gross income" + unit = USD + definition_period = YEAR + reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/" + defined_for = StateCode.NJ + + def formula(tax_unit, period, parameters): + total_income = add(tax_unit, period, ["nj_total_income"]) + p = parameters(period).gov.states.nj.tax.income + exclusions = add(tax_unit, period, p.all_exclusions) + return max_(0, total_income - exclusions) diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi_additions.py b/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi_additions.py index ff3cb4b7e..c5af60e94 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi_additions.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi_additions.py @@ -1,11 +1,11 @@ -from fiscalsim_us.model_api import * - - -class nj_agi_additions(Variable): - value_type = float - entity = TaxUnit - label = "New Jersey AGI additions" - unit = USD - documentation = "Additions to NJ AGI over federal AGI." - definition_period = YEAR - reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/" +from fiscalsim_us.model_api import * + + +class nj_agi_additions(Variable): + value_type = float + entity = Person + label = "New Jersey additions to federal AGI by person" + unit = USD + documentation = "Additions to federal AGI to get NJ total income." + definition_period = YEAR + reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/" diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi_subtractions.py b/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi_subtractions.py index 585252b4c..65ff3c513 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi_subtractions.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_agi_subtractions.py @@ -3,10 +3,11 @@ class nj_agi_subtractions(Variable): value_type = float - entity = TaxUnit - label = "New Jersey AGI subtractions" + entity = Person + label = "New Jersey subtractions from federal AGI by person" unit = USD - documentation = "Subtractions from NJ AGI over federal AGI." + documentation = "Subtractions from federal AGI to get NJ total income." definition_period = YEAR reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/" - adds = ["taxable_social_security"] + + adds = "gov.states.nj.tax.income.subtractions" diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_total_income.py b/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_total_income.py new file mode 100644 index 000000000..7692e36b6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/adjusted_gross_income/nj_total_income.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class nj_total_income(Variable): + value_type = float + entity = Person + label = "New Jersey total income by person" + unit = USD + definition_period = YEAR + reference = "https://law.justia.com/codes/new-jersey/2022/title-54/section-54-8a-36/" + defined_for = StateCode.NJ + + def formula(person, period, parameters): + agi = person("adjusted_gross_income_person", period) + nj_additions = person("nj_agi_additions", period) + nj_subtractions = person("nj_agi_subtractions", period) + return max_(0, agi + nj_additions - nj_subtractions) diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/credits/cdcc/nj_cdcc.py b/fiscalsim_us/variables/gov/states/nj/tax/income/credits/cdcc/nj_cdcc.py index 44d2b7a21..00479a7a6 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/credits/cdcc/nj_cdcc.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/credits/cdcc/nj_cdcc.py @@ -1,28 +1,28 @@ -from fiscalsim_us.model_api import * - - -class nj_cdcc(Variable): - value_type = float - entity = TaxUnit - label = "New Jersey CDCC" - documentation = "New Jersey Child and Dependent Care Credit" - unit = USD - definition_period = YEAR - reference = "https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=44" - defined_for = StateCode.NJ - - def formula(tax_unit, period, parameters): - # Get New Jersey CDCC rate - p = parameters(period).gov.states.nj.tax.income.credits.cdcc.rate - - # Get NJ taxable income - taxable_income = tax_unit("nj_taxable_income", period) - - # Get federal CDCC - federal_cdcc = tax_unit("cdcc", period) - - # Calculate NJ CDCC - rate = p.calc(taxable_income) - - # Calculate total NJ CDCC - return federal_cdcc * rate +from fiscalsim_us.model_api import * + + +class nj_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "New Jersey CDCC" + documentation = "New Jersey Child and Dependent Care Credit" + unit = USD + definition_period = YEAR + reference = "https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=44" + defined_for = StateCode.NJ + + def formula(tax_unit, period, parameters): + # Get New Jersey CDCC rate + p = parameters(period).gov.states.nj.tax.income.credits.cdcc.rate + + # Get NJ taxable income + taxable_income = tax_unit("nj_taxable_income", period) + + # Get federal CDCC + federal_cdcc = tax_unit("cdcc", period) + + # Calculate NJ CDCC + rate = p.calc(taxable_income, right=True) + + # Calculate total NJ CDCC + return federal_cdcc * rate diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/credits/nj_child_tax_credit/nj_child_tax_credit.py b/fiscalsim_us/variables/gov/states/nj/tax/income/credits/nj_ctc.py similarity index 66% rename from fiscalsim_us/variables/gov/states/nj/tax/income/credits/nj_child_tax_credit/nj_child_tax_credit.py rename to fiscalsim_us/variables/gov/states/nj/tax/income/credits/nj_ctc.py index d1b5f5825..49e3891b3 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/credits/nj_child_tax_credit/nj_child_tax_credit.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/credits/nj_ctc.py @@ -1,31 +1,27 @@ from fiscalsim_us.model_api import * -class nj_child_tax_credit(Variable): +class nj_ctc(Variable): value_type = float entity = TaxUnit label = "New Jersey Child Tax Credit" - documentation = "New Jersey Child Tax Credit" unit = USD definition_period = YEAR reference = "https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=45" defined_for = StateCode.NJ def formula(tax_unit, period, parameters): - p = parameters( - period - ).gov.states.nj.tax.income.credits.nj_child_tax_credit + p = parameters(period).gov.states.nj.tax.income.credits.ctc - # Get Rate for taxable income + # Get amount per qualifying child based on taxable income. taxable_income = tax_unit("nj_taxable_income", period) - rate = p.rate.calc(taxable_income) + amount_per_qualifying_child = p.amount.calc(taxable_income) # Get number of eligible children dependents person = tax_unit.members meets_age_limit = person("age", period) < p.ineligible_age - age_dependent_eligible = meets_age_limit & person( - "is_tax_unit_dependent", period - ) + dependent = person("is_tax_unit_dependent", period) + age_dependent_eligible = meets_age_limit & dependent count_eligible = tax_unit.sum(age_dependent_eligible) # Exclude married filing separately filers. @@ -35,4 +31,4 @@ def formula(tax_unit, period, parameters): ) # Calculate total child tax credit - return count_eligible * rate * filing_eligible + return count_eligible * amount_per_qualifying_child * filing_eligible diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_eligible_pension_income.py b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_eligible_pension_income.py new file mode 100644 index 000000000..7cb9ddddc --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_eligible_pension_income.py @@ -0,0 +1,30 @@ +from fiscalsim_us.model_api import * + + +class nj_eligible_pension_income(Variable): + value_type = float + entity = Person + label = "New Jersey pension income eligible for pension exclusion" + unit = USD + documentation = "New Jersey pension income eligible for pension exclusion" + definition_period = YEAR + reference = ( + "https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21", + "https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-6-10/", + ) + defined_for = StateCode.NJ + + def formula(person, period, parameters): + p = parameters(period).gov.states.nj.tax.income.exclusions.retirement + + is_blind = person("is_blind", period) + is_disabled = person("is_disabled", period) + age_eligible = person("age", period) >= p.age_threshold + demographic_eligible = age_eligible | is_blind | is_disabled + + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + role_eligible = is_head | is_spouse + + eligible = demographic_eligible & role_eligible + return eligible * person("taxable_pension_income", period) diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_other_retirement_income_exclusion.py b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_other_retirement_income_exclusion.py new file mode 100644 index 000000000..dca8e54e0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_other_retirement_income_exclusion.py @@ -0,0 +1,51 @@ +from fiscalsim_us.model_api import * + + +class nj_other_retirement_income_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "New Jersey Other Retirement Income Exclusion" + unit = USD + documentation = "New Jersey other retirement income exclusion" + definition_period = YEAR + reference = ( + "https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21", + "https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-6-15/", + ) + defined_for = StateCode.NJ + + def formula(tax_unit, period, parameters): + # follows Worksheet D + p = parameters(period).gov.states.nj.tax.income.exclusions.retirement + + # determine age eligibility for head and spouse + person = tax_unit.members + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + age_eligible = person("age", period) >= p.age_threshold + age_eligible_unit = tax_unit.sum(age_eligible & (is_head | is_spouse)) + + # calculate age-eligible pension income + pension = person("nj_eligible_pension_income", period) + pension_income = tax_unit.sum(age_eligible * pension) + + fraction = tax_unit("nj_retirement_exclusion_fraction", period) + filing_status = tax_unit("filing_status", period) + exclusion_cap = p.max_amount[filing_status] + + # calculate maximum exclusion + total_income_person = age_eligible * person("nj_total_income", period) + total_income = tax_unit.sum(total_income_person) + maximum_exclusion = min_(fraction * total_income, exclusion_cap) + + # calculate unused pension exclusion + used = min_(pension_income * fraction, exclusion_cap) + unused_exclusion = max_(0, maximum_exclusion - used) + + # calculate earnings eligibility + earnings = add(tax_unit, period, ["earned_income"]) + limit = p.other_retirement_income.earned_income_threshold + earnings_eligible = earnings <= limit + + # return unused exclusion if age and earnings eligible + return age_eligible_unit * earnings_eligible * unused_exclusion diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_other_retirement_special_exclusion.py b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_other_retirement_special_exclusion.py new file mode 100644 index 000000000..de7293739 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_other_retirement_special_exclusion.py @@ -0,0 +1,41 @@ +from fiscalsim_us.model_api import * + + +class nj_other_retirement_special_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "New Jersey Other Retirement Special Exclusion" + unit = USD + documentation = "New Jersey other retirement special exclusion" + definition_period = YEAR + reference = ( + "https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21", + "https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-6-15/", + ) + defined_for = StateCode.NJ + + def formula(tax_unit, period, parameters): + # If filer (and spouse, if joint) are never eligible for social security benefits, they are eligible for special exclusion. + # Get the pension/retirement exclusion portion of the parameter tree. + p = parameters(period).gov.states.nj.tax.income.exclusions.retirement + + person = tax_unit.members + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + joint = filing_status == status.JOINT + never_eligible_ss = person( + "never_eligible_for_social_security_benefits", period + ) + + head_eligible = tax_unit.sum(is_head * never_eligible_ss) + spouse_eligible = tax_unit.sum(is_spouse * never_eligible_ss) + + eligible = where( + joint, + head_eligible * spouse_eligible, + head_eligible, + ) + + return p.special_exclusion.amount[filing_status] * eligible diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_pension_retirement_exclusion.py b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_pension_retirement_exclusion.py new file mode 100644 index 000000000..0c7a5ffc2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_pension_retirement_exclusion.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class nj_pension_retirement_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "New Jersey Pension/Retirement Exclusion" + unit = USD + documentation = "New Jersey pension and retirement excludable amount if eligible (Line 28a)" + definition_period = YEAR + reference = ( + "https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21", + "https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-6-10/", + ) + defined_for = StateCode.NJ + + def formula(tax_unit, period, parameters): + pension_income = add(tax_unit, period, ["nj_eligible_pension_income"]) + fraction = tax_unit("nj_retirement_exclusion_fraction", period) + p = parameters(period).gov.states.nj.tax.income.exclusions.retirement + filing_status = tax_unit("filing_status", period) + return min_(pension_income * fraction, p.max_amount[filing_status]) diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_retirement_exclusion_fraction.py b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_retirement_exclusion_fraction.py new file mode 100644 index 000000000..c4d1fd452 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/exclusions/nj_retirement_exclusion_fraction.py @@ -0,0 +1,36 @@ +from fiscalsim_us.model_api import * + + +class nj_retirement_exclusion_fraction(Variable): + value_type = float + entity = TaxUnit + label = "New Jersey retirement exclusion fraction based on total income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=21", + "https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-6-10/", + ) + defined_for = StateCode.NJ + + def formula(tax_unit, period, parameters): + total_income = add(tax_unit, period, ["nj_total_income"]) + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + p = parameters(period).gov.states.nj.tax.income.exclusions.retirement + return select( + [ + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.HEAD_OF_HOUSEHOLD, + filing_status == status.WIDOW, + filing_status == status.SEPARATE, + ], + [ + p.percentage.single.calc(total_income, right=True), + p.percentage.joint.calc(total_income, right=True), + p.percentage.head_of_household.calc(total_income, right=True), + p.percentage.widow.calc(total_income, right=True), + p.percentage.separate.calc(total_income, right=True), + ], + ) diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/nj_refundable_credits.py b/fiscalsim_us/variables/gov/states/nj/tax/income/nj_refundable_credits.py index b35225674..d9b214402 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/nj_refundable_credits.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/nj_refundable_credits.py @@ -12,5 +12,5 @@ class nj_refundable_credits(Variable): "nj_property_tax_credit", "nj_eitc", "nj_cdcc", - "nj_child_tax_credit", + "nj_ctc", ] diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_homeowners_property_tax.py b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_homeowners_property_tax.py deleted file mode 100644 index c1dd3c4d5..000000000 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_homeowners_property_tax.py +++ /dev/null @@ -1,15 +0,0 @@ -from fiscalsim_us.model_api import * - - -class nj_homeowners_property_tax(Variable): - value_type = float - entity = TaxUnit - label = "NJ Homeowner's Property Taxes" - unit = USD - definition_period = YEAR - documentation = "Property taxes or rent paid on a principal place of residence that was subject to New Jersey property tax." - reference = "https://www.state.nj.us/treasury/taxation/pdf/current/1040i.pdf#page=26" - defined_for = StateCode.NJ - - # By default, use real estate taxes. - adds = ["real_estate_taxes"] diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_potential_property_tax_deduction.py b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_potential_property_tax_deduction.py index aa5ffa707..accc17d8f 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_potential_property_tax_deduction.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_potential_property_tax_deduction.py @@ -7,35 +7,26 @@ class nj_potential_property_tax_deduction(Variable): label = "New Jersey potential property tax deduction" unit = USD definition_period = YEAR - reference = "https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-3a-17/" + reference = ( + "https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-3a-17/" + "https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=25" + ) defined_for = "nj_property_tax_deduction_eligible" def formula(tax_unit, period, parameters): - # Get the NJ property tax deduction portion of the parameter tree. p = parameters(period).gov.states.nj.tax.income.deductions.property_tax - # Determine whether the tax unit is renting or owns a home. - rents = tax_unit("rents", period) + # property_tax amount calculation follows NJ-1040 form Worksheet G + rent = add(tax_unit, period, ["rent"]) + ptax = add(tax_unit, period, ["real_estate_taxes"]) + property_tax = ptax + rent * p.qualifying_rent_fraction - # Get the amount of property tax paid by the tax unit. - # If renting, this will be a fraction of the total rent. - person = tax_unit.members - rent_amounts = person("rent", period) - property_tax = where( - rents, - tax_unit.sum(rent_amounts) * p.qualifying_rent_fraction, - tax_unit("nj_homeowners_property_tax", period), - ) - - # If filing separate but maintain same home, halve property tax. + # if filing separate but maintain same home, halve property_tax amount filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values - separate = filing_status == status.SEPARATE + separate = filing_status == filing_status.possible_values.SEPARATE cohabitating = tax_unit("cohabitating_spouses", period) property_tax = property_tax / (1 + separate * cohabitating) - # Get the amount of paid property taxes under the threshold. - # Threshold is also halved if filing separate but maintain same home. - threshold = p.threshold / (1 + separate * cohabitating) - - return min_(property_tax, threshold) + # limit property_tax amount + limit = p.threshold / (1 + separate * cohabitating) + return min_(property_tax, limit) diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_credit.py b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_credit.py index df2963e3d..74c0a1bbe 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_credit.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_credit.py @@ -11,18 +11,14 @@ class nj_property_tax_credit(Variable): defined_for = "nj_property_tax_credit_eligible" def formula(tax_unit, period, parameters): - # Get the NJ property tax credit portion of the parameter tree. - p = parameters(period).gov.states.nj.tax.income.credits.property_tax - - # Check if the tax unit is taking the property tax deduction. - taking_deduction = tax_unit("nj_taking_property_tax_deduction", period) - - # Return the credit amount, which does not depend on property taxes paid if eligible. - # Halve the credit amount if filing separate but maintain same home. + # calculate credit amount filing_status = tax_unit("filing_status", period) status = filing_status.possible_values separate = filing_status == status.SEPARATE cohabitating = tax_unit("cohabitating_spouses", period) + p = parameters(period).gov.states.nj.tax.income.credits.property_tax credit_amount = p.amount / (1 + separate * cohabitating) + # taking credit if not taking deduction + taking_deduction = tax_unit("nj_taking_property_tax_deduction", period) return credit_amount * ~taking_deduction diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_credit_eligible.py b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_credit_eligible.py index c3740cd30..1a314bce1 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_credit_eligible.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_credit_eligible.py @@ -6,26 +6,26 @@ class nj_property_tax_credit_eligible(Variable): entity = TaxUnit label = "New Jersey property tax credit eligibility" definition_period = YEAR + reference = "https://www.state.nj.us/treasury/taxation/pdf/other_forms/tgi-ee/2021/1040i.pdf#page=25" + defined_for = StateCode.NJ def formula(tax_unit, period, parameters): - # Same as deduction eligibility, but also eligible if 65+ or - # blind/disabled and paid property taxes. - deduction_eligibility = tax_unit( - "nj_property_tax_deduction_eligible", period - ) - - # Get the NJ property tax credit portion of the parameter tree. p = parameters(period).gov.states.nj.tax.income.credits.property_tax - # If filing jointly, only one spouse needs to be 65+ or blind/disabled. + # determine if pays property taxes via home ownership or renting + owner_pays_ptax = add(tax_unit, period, ["real_estate_taxes"]) > 0 + renter_pays_ptax = tax_unit("rents", period) + pays_ptax = owner_pays_ptax | renter_pays_ptax + + # if filing jointly, only one spouse needs to be 65+ or blind/disabled blind_head = tax_unit("blind_head", period) disabled_head = tax_unit("disabled_head", period) blind_spouse = tax_unit("blind_spouse", period) disabled_spouse = tax_unit("disabled_spouse", period) - senior_head = tax_unit("age_head", period) > p.senior_qualifying_age + senior_head = tax_unit("age_head", period) >= p.senior_qualifying_age senior_spouse = ( - tax_unit("age_spouse", period) > p.senior_qualifying_age + tax_unit("age_spouse", period) >= p.senior_qualifying_age ) senior_blind_disabled = ( blind_head @@ -36,12 +36,8 @@ def formula(tax_unit, period, parameters): | senior_spouse ) - # Next check if they paid property taxes (either directly or through - # rent). - direct_property_taxes = tax_unit("nj_homeowners_property_tax", period) - rent = tax_unit("rents", period) - paid_property_taxes = (direct_property_taxes + rent) > 0 - - return deduction_eligibility | ( - senior_blind_disabled & paid_property_taxes + # return eligiblity for property tax credit + deduction_eligibility = tax_unit( + "nj_property_tax_deduction_eligible", period ) + return deduction_eligibility | (pays_ptax & senior_blind_disabled) diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction.py b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction.py index cd6b96ea5..3a44be82e 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction.py @@ -9,15 +9,8 @@ class nj_property_tax_deduction(Variable): definition_period = YEAR reference = "https://law.justia.com/codes/new-jersey/2022/title-54a/section-54a-3a-17/" defined_for = "nj_taking_property_tax_deduction" - default_value = 0 def formula(tax_unit, period, parameters): - # Get the tax unit's potential property tax deduction. - potential_deduction = tax_unit( - "nj_potential_property_tax_deduction", period - ) - - # Get whether household is taking deduction (over credit). + deduction = tax_unit("nj_potential_property_tax_deduction", period) taking_deduction = tax_unit("nj_taking_property_tax_deduction", period) - - return potential_deduction * taking_deduction + return deduction * taking_deduction diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction_eligible.py b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction_eligible.py index d482eeca2..31d3c77c5 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction_eligible.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_property_tax_deduction_eligible.py @@ -9,17 +9,13 @@ class nj_property_tax_deduction_eligible(Variable): defined_for = StateCode.NJ def formula(tax_unit, period, parameters): - # Get the NJ tax portion of the parameter tree. p = parameters(period).gov.states.nj.tax.income - # First check income-eligibliy, defined as NJ AGI > threshold based on filing status. filing_status = tax_unit("filing_status", period) nj_agi = tax_unit("nj_agi", period) income_eligible = nj_agi > p.filing_threshold[filing_status] - # Next check if they paid property taxes (either directly or through rent). - direct_property_taxes = tax_unit("nj_homeowners_property_tax", period) - rent = tax_unit("rents", period) - paid_property_taxes_or_rent = (direct_property_taxes + rent) > 0 + pays_ptax = add(tax_unit, period, ["real_estate_taxes"]) > 0 + pays_rent = tax_unit("rents", period) - return income_eligible & paid_property_taxes_or_rent + return income_eligible & (pays_ptax | pays_rent) diff --git a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_taking_property_tax_deduction.py b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_taking_property_tax_deduction.py index d333723f8..3dfe9df82 100644 --- a/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_taking_property_tax_deduction.py +++ b/fiscalsim_us/variables/gov/states/nj/tax/income/property_tax/nj_taking_property_tax_deduction.py @@ -11,20 +11,17 @@ class nj_taking_property_tax_deduction(Variable): defined_for = "nj_property_tax_deduction_eligible" def formula(tax_unit, period, parameters): - # This follows the logic of the 1040 instructions Worksheet H. + p = parameters(period).gov.states.nj.tax.income.main - # Get the would-be property tax deduction. + # follows NJ-1040 form Worksheet H deduction = tax_unit("nj_potential_property_tax_deduction", period) - # Get NJ taxable income before property tax deduction. + # calculate taxes without deduction + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values taxable_income_before_deduction = tax_unit( "nj_taxable_income_before_property_tax_deduction", period ) - - # Calculate the amount of taxes owed without the deduction. - p = parameters(period).gov.states.nj.tax.income.main - filing_status = tax_unit("filing_status", period) - status = filing_status.possible_values taxes_without_deduction = select( [ filing_status == status.SINGLE, @@ -42,12 +39,10 @@ def formula(tax_unit, period, parameters): ], ) - # Calculate NJ taxable income after property tax deduction. - taxable_income_after_deduction = ( - taxable_income_before_deduction - deduction + # calculate taxes with deduction + taxable_income_after_deduction = max_( + 0, taxable_income_before_deduction - deduction ) - - # Calculate the amount of taxes owed after the deduction. taxes_with_deduction = select( [ filing_status == status.SINGLE, @@ -65,8 +60,7 @@ def formula(tax_unit, period, parameters): ], ) - # Determine whether the difference in tax incidence is greater than the credit amount. - # Credit amount is halved if filing separately but maintaining the same home. + # calculate credit amount credit_amount = parameters( period ).gov.states.nj.tax.income.credits.property_tax.amount @@ -74,4 +68,5 @@ def formula(tax_unit, period, parameters): cohabitating = tax_unit("cohabitating_spouses", period) credit_amount = credit_amount / (1 + separate * cohabitating) + # choose between taxable income deduction and refundable credit return (taxes_without_deduction - taxes_with_deduction) > credit_amount diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc.py b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc.py new file mode 100644 index 000000000..7cb0b93e2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc.py @@ -0,0 +1,26 @@ +from fiscalsim_us.model_api import * + + +class nm_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico dependent child day care credit" + unit = USD + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = "nm_cdcc_eligible" + + def formula(tax_unit, period, parameters): + nm_cdcc_max = tax_unit("nm_cdcc_max_amount", period) + us_cdcc = tax_unit("cdcc", period) + if "cdcc" in parameters(period).gov.irs.credits.non_refundable: + us_taxbc = tax_unit("income_tax_before_credits", period) + used_us_cdcc = min_(us_cdcc, us_taxbc) + else: + used_us_cdcc = us_cdcc + nm_cdcc = max_(0, nm_cdcc_max - used_us_cdcc) + # separate filers can claim only part of nm_cdcc + filing_status = tax_unit("filing_status", period) + separate = filing_status == filing_status.possible_values.SEPARATE + p = parameters(period).gov.states.nm.tax.income.credits.cdcc + return where(separate, nm_cdcc / p.divisor, nm_cdcc) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible.py b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible.py new file mode 100644 index 000000000..a23ba08ba --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible.py @@ -0,0 +1,50 @@ +from fiscalsim_us.model_api import * + + +class nm_cdcc_eligible(Variable): + value_type = bool + entity = TaxUnit + label = ( + "Eligible household for the New Mexico dependent child day care credit" + ) + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + person = tax_unit.members + # Filer can not be a dependent on another tax return + dependent_on_another_return = tax_unit("dsi", period) + p = parameters(period).gov.states.nm.tax.income.credits.cdcc + # Filer has to be be gainfully employed to receive credit + has_earnings = person("earned_income", period) > 0 + # If a joint return is filed, both spouses must be gainfully employed + # unless one person is disabled + filing_status = tax_unit("filing_status", period) + joint = filing_status == filing_status.possible_values.JOINT + head = person("is_tax_unit_head", period) + spouse = person("is_tax_unit_spouse", period) + head_has_earnings = tax_unit.any(head & has_earnings) + spouse_has_earnings = tax_unit.any(spouse & has_earnings) + both_have_earnings = head_has_earnings & spouse_has_earnings + disabled = person("is_disabled", period) + disabled_eligible = tax_unit.any((head | spouse) & disabled) + joint_eligible = both_have_earnings | disabled_eligible + employment_eligible = where(joint, joint_eligible, head_has_earnings) + # Filer can not receive tanf to be eligible + receives_tanf = tax_unit.spm_unit("tanf", period) > 0 + # Filers have to have modified gross income at or below a limit + nm_modified_gross_income = tax_unit("nm_modified_gross_income", period) + income_limit = ( + parameters(period).gov.dol.minimum_wage + * p.income_limit_as_fraction_of_minimum_wage + * WEEKS_IN_YEAR + * p.full_time_hours + ) + income_eligible = nm_modified_gross_income <= income_limit + return ( + ~dependent_on_another_return + & employment_eligible + & ~receives_tanf + & income_eligible + ) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible_child.py b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible_child.py new file mode 100644 index 000000000..1b3284414 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_eligible_child.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class nm_cdcc_eligible_child(Variable): + value_type = bool + entity = Person + label = "Eligible child for the New Mexico dependent child day care credit" + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = StateCode.NM + + def formula(person, period, parameters): + p = parameters(period).gov.states.nm.tax.income.credits.cdcc + age = person("age", period) + age_eligible = age < p.age_eligible + dependent = person("is_tax_unit_dependent", period) + return age_eligible & dependent diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_max_amount.py b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_max_amount.py new file mode 100644 index 000000000..3b1f878b1 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/cdcc/nm_cdcc_max_amount.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class nm_cdcc_max_amount(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico maximum credit for dependent child day care credit" + unit = USD + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503752/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsfAEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = "nm_cdcc_eligible" + + def formula(tax_unit, period, parameters): + # allocate unit's childcare expenses across eligible children + person = tax_unit.members + expenses = person.tax_unit("tax_unit_childcare_expenses", period) + eligible = person("nm_cdcc_eligible_child", period).astype(float) + count_eligible = person.tax_unit.sum(eligible) + expense = np.zeros_like(eligible) + mask = count_eligible > 0 + expense[mask] = eligible[mask] * expenses[mask] / count_eligible[mask] + # cap each eligible child's allowable expense + p = parameters(period).gov.states.nm.tax.income.credits.cdcc + child_expense = min_(p.max_amount.per_child, p.rate * expense) + # cap unit's total allowable expense + total_expense = tax_unit.sum(child_expense) + return min_(p.max_amount.total, total_expense) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc.py b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc.py new file mode 100644 index 000000000..f76421f9d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class nm_eitc(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico EITC" + unit = USD + definition_period = YEAR + reference = "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf" # 7-2-18.15 + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + eligible = tax_unit("nm_eitc_eligible", period) + maximum = tax_unit("eitc_maximum", period) + phased_in = tax_unit("eitc_phased_in", period) + reduction = tax_unit("eitc_reduction", period) + limitation = max_(0, maximum - reduction) + eitc = eligible * min_(phased_in, limitation) + rate = parameters(period).gov.states.nm.tax.income.credits.eitc.match + return eitc * rate diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc_demographic_eligible.py b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc_demographic_eligible.py new file mode 100644 index 000000000..d989e001f --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc_demographic_eligible.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class nm_eitc_demographic_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Meets demographic eligibility for New Mexico EITC" + definition_period = YEAR + + def formula(tax_unit, period, parameters): + # New Mexico applies the same criteria as the federal EITC, but + # changes the minimum age. + person = tax_unit.members + has_child = tax_unit("tax_unit_children", period) > 0 + age = person("age", period) + # Relative parameter reference break branching in some states that + # modify EITC age limits. + min_age = parameters.gov.states.nm.tax.income.credits.eitc.eligibility.age.min( + period + ) + max_age = parameters.gov.irs.credits.eitc.eligibility.age.max(period) + meets_age_requirements = (age >= min_age) & (age <= max_age) + return has_child | tax_unit.any(meets_age_requirements) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc_eligible.py b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc_eligible.py new file mode 100644 index 000000000..4baf1c6d4 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/eitc/nm_eitc_eligible.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class nm_eitc_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for New Mexico EITC" + definition_period = YEAR + reference = "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf" # 7-2-18.15 + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + # Use federal EITC eligibility, but replace demographic eligibility + # with NM version. + eitc = parameters.gov.irs.credits.eitc(period) + investment_income_eligible = tax_unit( + "eitc_investment_income_eligible", period + ) + demographic_eligible = tax_unit("nm_eitc_demographic_eligible", period) + # Define eligibility before considering separate filer limitation. + eligible = demographic_eligible & investment_income_eligible + # This parameter is true if separate filers are eligible. + if eitc.eligibility.separate_filer: + return eligible + # If separate filers are not eligible, check if the filer is separate. + filing_status = tax_unit("filing_status", period) + separate = filing_status == filing_status.possible_values.SEPARATE + return eligible & ~separate diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/credits/nm_ctc.py b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/nm_ctc.py new file mode 100644 index 000000000..c654baee9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/nm_ctc.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class nm_ctc(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico child income tax credit" + definition_period = YEAR + unit = USD + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503818/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcHYQEoANMmylCEAIqJCuAJ7QA5BskRCYXAiUr1WnXoMgAynlIAhdQCUAogBknANQCCAOQDCTyVIwACNoUnZxcSA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + # Legal code refers to "adjusted gross income", + # Tax form does not specify if federal or state AGI + agi = tax_unit("adjusted_gross_income", period) + # The law 7-2-18.34(J)(2) defines qualifying children as those from IRC 152(c). + # IRC 152(c) refers to the EITC qualifying children. + # https://www.law.cornell.edu/uscode/text/26/152#c + children = tax_unit("eitc_child_count", period) + p = parameters(period).gov.states.nm.tax.income.credits.ctc + amount_per_child = p.amount.calc(agi) + amount = amount_per_child * children + # Halve the credit if married filing separately. + filing_status = tax_unit("filing_status", period) + separate = filing_status == filing_status.possible_values.SEPARATE + denominator = where(separate, 2, 1) + return amount / denominator diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/credits/nm_medical_expense_credit.py b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/nm_medical_expense_credit.py new file mode 100644 index 000000000..c5e7d9b01 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/credits/nm_medical_expense_credit.py @@ -0,0 +1,30 @@ +from fiscalsim_us.model_api import * + + +class nm_medical_expense_credit(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico unreimbursed medical expense care credit" + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503776/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDswgGwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + person = tax_unit.members + p = parameters( + period + ).gov.states.nm.tax.income.credits.unreimbursed_medical_care_expense + age = person("age", period) + medical_expense = add(tax_unit, period, ["medical_expense"]) + age_eligible = tax_unit.any(age >= p.age_eligibility) + expense_eligible = medical_expense >= p.min_expenses + dependent_on_another_return = tax_unit("dsi", period) + eligible = ( + age_eligible & expense_eligible & ~dependent_on_another_return + ) + # Exemption is halved for married filing separately + filing_status = tax_unit("filing_status", period) + separate = filing_status == filing_status.possible_values.SEPARATE + denominator = where(separate, 2, 1) + numerator = eligible * p.amount + return numerator / denominator diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents.py b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents.py new file mode 100644 index 000000000..ae6c4e7a1 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class nm_deduction_for_certain_dependents(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico deduction for certain dependents" + unit = USD + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503892/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcATgBMASgA0ybKUIQAiokK4AntADkW6REJhcCFWs069BoyADKeUgCFNAJQCiAGRcA1AIIA5AMIu0qRgAEbQpOySkkA" + defined_for = "nm_deduction_for_certain_dependents_eligible" + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + p = parameters( + period + ).gov.states.nm.tax.income.deductions.certain_dependents + # The law 7-2-39(D) defines dependents as those from IRC 152. + # IRC 152 refers to all dependents. + # https://www.law.cornell.edu/uscode/text/26/152 + dependents = tax_unit("tax_unit_dependents", period) + # New Mexico reduces the number of claimable dependents by one. + countable_dependents = max_(dependents - 1, 0) + amount_per_dependent = p.amount[filing_status] + return amount_per_dependent * countable_dependents diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents_eligible.py b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents_eligible.py new file mode 100644 index 000000000..e60e3b1a2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/certain_dependents/nm_deduction_for_certain_dependents_eligible.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class nm_deduction_for_certain_dependents_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligibility for New Mexico deduction for certain dependents" + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503892/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcATgBMASgA0ybKUIQAiokK4AntADkW6REJhcCFWs069BoyADKeUgCFNAJQCiAGRcA1AIIA5AMIu0qRgAEbQpOySkkA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + dependent_on_another_return = tax_unit("dsi", period) + # The deduction does not apply if an exemption under IRS 151 is claimed + # IRC 151 refers to the personal exemption. + federal_exemption_amount = tax_unit("c04600", period) + return ~dependent_on_another_return & (federal_exemption_amount == 0) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_deductions.py b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_deductions.py new file mode 100644 index 000000000..119207379 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_deductions.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class nm_deductions(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico income deductions" + unit = USD + definition_period = YEAR + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + itemized_on_federal_return = tax_unit("tax_unit_itemizes", period) + itm_ded = tax_unit("nm_itemized_deductions", period) + standard_ded = tax_unit("standard_deduction", period) + # Tax filer is required to itemize deductions if they itemize on their federal return as per: + # https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf + itemized_or_standard = where( + itemized_on_federal_return, itm_ded, standard_ded + ) + OTHER_DEDUCTIONS = [ + "nm_medical_care_expense_deduction", + "nm_deduction_for_certain_dependents", + "nm_net_capital_gains_deduction", + ] + other_deductions = add(tax_unit, period, OTHER_DEDUCTIONS) + return itemized_or_standard + other_deductions diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_itemized_deductions.py b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_itemized_deductions.py new file mode 100644 index 000000000..95d160e45 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_itemized_deductions.py @@ -0,0 +1,50 @@ +from fiscalsim_us.model_api import * + + +class nm_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico itemized deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=28", + "https://casetext.com/regulation/new-mexico-administrative-code/title-3-taxation/chapter-3-personal-income-taxes/part-11-tax-credit-income-allocation-and-apportionment/section-33118-computation-for-non-resident-taxpayers-who-have-new-mexico-royalty-income", + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=28", + ) + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + itemizes = tax_unit("tax_unit_itemizes", period) + filing_status = tax_unit("filing_status", period) + p = parameters(period).gov.irs.deductions + + # tax/income, federal Schedule A, line 5a. 1 + salt_sales_or_income = tax_unit( + "state_and_local_sales_or_income_tax", period + ) + # state_and_local_tax, line 5d. 2 + total_salt = ( + add(tax_unit, period, ["real_estate_taxes"]) + salt_sales_or_income + ) + # ratio = round(salt_sales_or_income[0] / total_salt[0], 4) + # ratio. 3 + salt_ratio = np.zeros_like(total_salt) + mask = total_salt != 0 + salt_ratio[mask] = salt_sales_or_income[mask] / total_salt[mask] + + # line 5e. 4 + salt_cap = p.itemized.salt_and_real_estate.cap[filing_status] + salt_claimed = min_(salt_cap, total_salt) + + # 5 = salt_claimed * salt_ratio + # 6 = min(5, 4) + salt = min_(salt_claimed * salt_ratio, salt_claimed) + + standard_deduction = tax_unit("standard_deduction", period) + itm_deds_less_salt = tax_unit("itemized_deductions_less_salt", period) + us_itemized_deductions = itm_deds_less_salt + salt_claimed + item_deds = max_(us_itemized_deductions - standard_deduction, 0) + + nm_item = min_(salt, item_deds) + return where(itemizes, nm_item, 0) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.py b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.py new file mode 100644 index 000000000..f4176b197 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_medical_care_expense_deduction.py @@ -0,0 +1,50 @@ +from fiscalsim_us.model_api import * + + +class nm_medical_care_expense_deduction(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico medical care expense deduction" + unit = USD + definition_period = YEAR + reference = ( + # 7-2-35. DEDUCTION – UNREIMBURSED OR UNCOMPENSATED MEDICAL CARE EXPENSES + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=249", + # Tax Form Instructions Page PIT-1-26 LINE 16. Medical Care Expense Deduction + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=31", + # 7-2-37. Deduction; unreimbursed or uncompensated medical care expenses. + "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503888/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA", + ) + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.nm.tax.income.deductions.medical_care_expense + # the deduction amount is based on filing status, agi, and eligible expenses. + filing_status = tax_unit("filing_status", period) + statuses = filing_status.possible_values + agi = tax_unit("adjusted_gross_income", period) + expenses = add( + tax_unit, + period, + ["medical_out_of_pocket_expenses"], + ) + # Use `right=True` to reflect "over ... but not over ...". + rate = select( + [ + filing_status == statuses.SINGLE, + filing_status == statuses.JOINT, + filing_status == statuses.HEAD_OF_HOUSEHOLD, + filing_status == statuses.SEPARATE, + filing_status == statuses.WIDOW, + ], + [ + p.single.calc(agi, right=True), + p.joint.calc(agi, right=True), + p.head_of_household.calc(agi, right=True), + p.separate.calc(agi, right=True), + p.widow.calc(agi, right=True), + ], + ) + return expenses * rate diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_net_capital_gains_deduction.py b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_net_capital_gains_deduction.py new file mode 100644 index 000000000..6ea431326 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_net_capital_gains_deduction.py @@ -0,0 +1,26 @@ +from fiscalsim_us.model_api import * + + +class nm_net_capital_gains_deduction(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico net capital gain deduction" + unit = USD + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503882/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgAcwgEwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.nm.tax.income.deductions.net_capital_gains + net_capital_gains = max_(0, add(tax_unit, period, ["capital_gains"])) + # Filers can deduct 100% of CG up to a cap, or 40% uncapped, whichever is greater. + uncapped_element = p.uncapped_element_percent * net_capital_gains + filing_status = tax_unit("filing_status", period) + separate = filing_status == filing_status.possible_values.SEPARATE + # Halve the deduction if filing separately. + denominator = where(separate, 2, 1) + capped_element = p.capped_element.calc(net_capital_gains) + numerator = max_(uncapped_element, capped_element) + return numerator / denominator diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.py b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.py new file mode 100644 index 000000000..88520d3bc --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_blind_and_aged_exemption.py @@ -0,0 +1,65 @@ +from fiscalsim_us.model_api import * + + +class nm_aged_blind_exemption(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico aged and blind exemption" + unit = USD + definition_period = YEAR + reference = ( + # 7-2-5.2. EXEMPTION--INCOME OF PERSONS SIXTY-FIVE AND OLDER OR BLIND Page 22 + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=34", + # Tax Form Instructions Page ADJ-5 TABLE 1. Exemptions for Persons 65 or Older or Blind + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=50", + # 7-2-5.2. Exemption; income of persons sixty-five and older or blind + "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503666/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsogJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA", + ) + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.nm.tax.income.exemptions.blind_and_aged + filing_status = tax_unit("filing_status", period) + statuses = filing_status.possible_values + agi = tax_unit("adjusted_gross_income", period) + age_threshold = p.age_threshold + + # Check if taxpayer is blind or aged. + blind_head = tax_unit("blind_head", period) + aged_head = tax_unit("age_head", period) >= age_threshold + + # Check if taxpayer is eligible. + # New Mexico does not double exemptions if the same individual is both aged and blind. + head_eligible = blind_head | aged_head + + # Check if spouse is blind or aged. + blind_spouse = tax_unit("blind_spouse", period) + aged_spouse = tax_unit("age_spouse", period) >= age_threshold + + # Check if spouse is eligible. + spouse_eligible = blind_spouse | aged_spouse + + eligible_count = head_eligible.astype(int) + spouse_eligible.astype( + int + ) + + # Use `right=True` to reflect "over ... but not over ...". + amount = select( + [ + filing_status == statuses.SINGLE, + filing_status == statuses.JOINT, + filing_status == statuses.HEAD_OF_HOUSEHOLD, + filing_status == statuses.SEPARATE, + filing_status == statuses.WIDOW, + ], + [ + p.single.calc(agi, right=True), + p.joint.calc(agi, right=True), + p.head_of_household.calc(agi, right=True), + p.separate.calc(agi, right=True), + p.widow.calc(agi, right=True), + ], + ) + return eligible_count * amount diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_exemptions.py b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_exemptions.py new file mode 100644 index 000000000..9feae2a8c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_exemptions.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class nm_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico income exemptions" + unit = USD + definition_period = YEAR + defined_for = StateCode.NM + + adds = [ + "nm_aged_blind_exemption", + "nm_hundred_year_exemption", + "nm_low_and_middle_income_exemption", + "nm_medical_expense_exemption", + "nm_social_security_income_exemption", + ] diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_hundred_year_exemption.py b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_hundred_year_exemption.py new file mode 100644 index 000000000..ceb660f0c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_hundred_year_exemption.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class nm_hundred_year_exemption(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico hundred year exemption" + unit = USD + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503677/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsAdlEBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + age_head = tax_unit("age_head", period) + age_spouse = tax_unit("age_spouse", period) + p = parameters(period).gov.states.nm.tax.income.exemptions.hundred_year + head_eligible = age_head >= p.age_eligibility + spouse_eligible = age_spouse >= p.age_eligibility + filing_status = tax_unit("filing_status", period) + joint = filing_status == filing_status.possible_values.JOINT + # Halve the exemption if only one of head and spouse is eligible of a joint filer. + denominator = where(joint, 2, 1) + numerator = head_eligible.astype(int) + spouse_eligible.astype(int) + # Exempt AGI apportioned among eligible spouses. + # That is, assume all income is community property. + return ( + tax_unit("adjusted_gross_income", period) * numerator / denominator + ) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_low_and_middle_income_exemption.py b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_low_and_middle_income_exemption.py new file mode 100644 index 000000000..1bed910b4 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_low_and_middle_income_exemption.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class nm_low_and_middle_income_exemption(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico low- and middle-income exemption" + defined_for = StateCode.NM + unit = USD + definition_period = YEAR + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.nm.tax.income.exemptions.low_and_middle_income + filing_status = tax_unit("filing_status", period) + agi = tax_unit("adjusted_gross_income", period) + + # Calculate the eligibility based on AGI and filing status + eligible = agi <= p.income_limit[filing_status] + + # Calculate the exemption amount based on AGI and filing status + reduction_threshold = p.reduction.income_threshold[filing_status] + excess = max_(agi - reduction_threshold, 0) + reduction_rate = p.reduction.rate[filing_status] + reduction_amount = excess * reduction_rate + exemption_amount = p.max_amount - reduction_amount + + # Multiply the exemption amount by the number of exemptions + exemptions = tax_unit("exemptions", period) + + return eligible * (exemption_amount * exemptions) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_medical_expense_exemption.py b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_medical_expense_exemption.py new file mode 100644 index 000000000..3e902aa24 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_medical_expense_exemption.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class nm_medical_expense_exemption(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico unreimbursed medical expense care exemption" + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503680/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsADh4BKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + person = tax_unit.members + p = parameters( + period + ).gov.states.nm.tax.income.exemptions.unreimbursed_medical_care_expense + age = person("age", period) + medical_expense = add(tax_unit, period, ["medical_expense"]) + age_eligible = tax_unit.any(age >= p.age_eligibility) + expense_eligible = medical_expense >= p.min_expenses + eligible = age_eligible & expense_eligible + # Exemption is halved for married filing separately + filing_status = tax_unit("filing_status", period) + separate = filing_status == filing_status.possible_values.SEPARATE + denominator = where(separate, 2, 1) + numerator = eligible * p.amount + return numerator / denominator diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_social_security_income_exemption.py b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_social_security_income_exemption.py new file mode 100644 index 000000000..ca04b9d74 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/exemptions/nm_social_security_income_exemption.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class nm_social_security_income_exemption(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico social security income exemption" + defined_for = StateCode.NM + unit = USD + definition_period = YEAR + + def formula(tax_unit, period, parameters): + # This is the amount of Social Security included in AGI. + social_security_income = tax_unit( + "tax_unit_taxable_social_security", period + ) + filing_status = tax_unit("filing_status", period) + p = parameters( + period + ).gov.states.nm.tax.income.exemptions.social_security_income + agi = tax_unit("adjusted_gross_income", period) + income_limit = agi <= p.income_limit[filing_status] + return where(income_limit, social_security_income, 0) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/nm_additions.py b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_additions.py new file mode 100644 index 000000000..7703ec1bc --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_additions.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class nm_additions(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico additions to federal AGI" + unit = USD + definition_period = YEAR + reference = ( + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/2f1a6781-9534-4436-b427-1557f9592099/2022pit-adj-ins.pdf", + ) + defined_for = StateCode.NM diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax.py b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax.py new file mode 100644 index 000000000..0baecea99 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class nm_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.NM + + adds = ["nm_income_tax_before_refundable_credits"] + subtracts = ["nm_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.py new file mode 100644 index 000000000..2b0891555 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax_before_non_refundable_credits.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class nm_income_tax_before_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico income tax before non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + income = tax_unit("nm_taxable_income", period) + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + p = parameters(period).gov.states.nm.tax.income.main + return select( + [ + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.SEPARATE, + filing_status == status.WIDOW, + filing_status == status.HEAD_OF_HOUSEHOLD, + ], + [ + p.single.calc(income), + p.joint.calc(income), + p.separate.calc(income), + p.widow.calc(income), + p.head_of_household.calc(income), + ], + ) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..284a18b37 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_income_tax_before_refundable_credits.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class nm_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico income tax before refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + before_non_refundable_credits = tax_unit( + "nm_income_tax_before_non_refundable_credits", period + ) + non_refundable_credits = tax_unit("nm_non_refundable_credits", period) + return max_(before_non_refundable_credits - non_refundable_credits, 0) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/nm_modified_gross_income.py b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_modified_gross_income.py new file mode 100644 index 000000000..1eb0154a3 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_modified_gross_income.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class nm_modified_gross_income(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico modified gross income" + unit = USD + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503656/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgBsfYQEoANMmylCEAIqJCuAJ7QA5BskRCYXAiUr1WnXoMgAynlIAhdQCUAogBknANQCCAOQDCTyVIwACNoUnZxcSA" # L + defined_for = StateCode.NM + + adds = "gov.states.nm.tax.income.modified_gross_income" diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/nm_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_non_refundable_credits.py new file mode 100644 index 000000000..894bae089 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_non_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class nm_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.NM diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/nm_other_deductions_and_exemptions.py b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_other_deductions_and_exemptions.py new file mode 100644 index 000000000..3f7c04084 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_other_deductions_and_exemptions.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class nm_other_deductions_and_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico other income deductions and exemptions" + unit = USD + definition_period = YEAR + defined_for = StateCode.NM + + adds = "gov.states.nm.tax.income.other_deductions_and_exemptions" diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/nm_refundable_credits.py b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_refundable_credits.py new file mode 100644 index 000000000..8ee956b90 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class nm_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.NM + + adds = "gov.states.nm.tax.income.credits.refundable" diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/nm_taxable_income.py b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_taxable_income.py new file mode 100644 index 000000000..326f333cc --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/nm_taxable_income.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class nm_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico taxable income" + unit = USD + definition_period = YEAR + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + federal_agi = tax_unit("adjusted_gross_income", period) + additions = tax_unit("nm_additions", period) + deductions = tax_unit("nm_deductions", period) + exemptions = tax_unit("nm_exemptions", period) + other_deductions_and_exemptions = tax_unit( + "nm_other_deductions_and_exemptions", period + ) + return max_( + 0, + federal_agi + + additions + - deductions + - exemptions + - other_deductions_and_exemptions, + ) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_2021_income_rebate.py b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_2021_income_rebate.py new file mode 100644 index 000000000..c26dcddc7 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_2021_income_rebate.py @@ -0,0 +1,24 @@ +from fiscalsim_us.model_api import * + + +class nm_2021_income_rebate(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico 2021 income tax rebate" + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503708/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsPABwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + dependent_on_another_return = tax_unit("dsi", period) + income = tax_unit("adjusted_gross_income", period) + p = ( + parameters(period) + .gov.states.nm.tax.income.rebates["2021_income"] + .main + ) + filing_status = tax_unit("filing_status", period) + income_eligible = income < p.income_limit[filing_status] + eligible = income_eligible & ~dependent_on_another_return + amount_if_eligible = p.amount[filing_status] + return eligible * amount_if_eligible diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_additional_2021_income_rebate.py b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_additional_2021_income_rebate.py new file mode 100644 index 000000000..f5db867ba --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_additional_2021_income_rebate.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class nm_additional_2021_income_rebate(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico additional 2021 income tax rebate" + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503710/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsHHgEoANMmylCEAIqJCuAJ7QA5BskRCYXAiUr1WnXoMgAynlIAhdQCUAogBknANQCCAOQDCTyVIwACNoUnZxcSA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + dependent_on_another_return = tax_unit("dsi", period) + p = ( + parameters(period) + .gov.states.nm.tax.income.rebates["2021_income"] + .additional + ) + filing_status = tax_unit("filing_status", period) + return ~dependent_on_another_return * p.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_supplemental_2021_income_rebate.py b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_supplemental_2021_income_rebate.py new file mode 100644 index 000000000..32be9decd --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/2021_rebate/nm_supplemental_2021_income_rebate.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class nm_supplemental_2021_income_rebate(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico supplemental 2021 income tax rebate" + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503706/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsPAGwBKADTJspQhACKiQrgCe0AOSapEQmFwJlqjdt37DIAMp5SAIQ0AlAKIAZZwDUAggDkAws5SpGAARtCk7BISQA" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + dependent_on_another_return = tax_unit("dsi", period) + p = ( + parameters(period) + .gov.states.nm.tax.income.rebates["2021_income"] + .supplemental + ) + filing_status = tax_unit("filing_status", period) + return ~dependent_on_another_return * p.amount[filing_status] diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate.py b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate.py new file mode 100644 index 000000000..df2089690 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate.py @@ -0,0 +1,53 @@ +from fiscalsim_us.model_api import * + + +class nm_low_income_comprehensive_tax_rebate(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico low income comprehensive tax rebate" + unit = USD + definition_period = YEAR + reference = ( + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58", + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=70", + "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/856ebf4b-3814-49dd-8631-ebe579d6a42b/Personal%20Income%20Tax.pdf#page=67", + "https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false", + ) + # 7-2-7.6. 2021 INCOME TAX REBATE + # SECTION II: LOW INCOME COMPREHENSIVE TAX REBATE + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.nm.tax.income.rebates.low_income + + agi = tax_unit("nm_modified_gross_income", period) + exemptions = tax_unit( + "nm_low_income_comprehensive_tax_rebate_exemptions", period + ) + + rebate = select( + [ + exemptions == 1, + exemptions == 2, + exemptions == 3, + exemptions == 4, + exemptions == 5, + exemptions >= 6, + ], + [ + p.amount.one_exemption.calc(agi), + p.amount.two_exemptions.calc(agi), + p.amount.three_exemptions.calc(agi), + p.amount.four_exemptions.calc(agi), + p.amount.five_exemptions.calc(agi), + p.amount.six_exemptions.calc(agi), + ], + ) + + filing_status = tax_unit("filing_status", period) + divisor = where( + filing_status == filing_status.possible_values.SEPARATE, + p.divisor, + 1, + ) + return rebate / divisor diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate_exemptions.py b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate_exemptions.py new file mode 100644 index 000000000..3a2af94e6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/low_income_comprehensive/nm_low_income_comprehensive_tax_rebate_exemptions.py @@ -0,0 +1,59 @@ +from fiscalsim_us.model_api import * + + +class nm_low_income_comprehensive_tax_rebate_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico low income comprehensive tax rebate exemptions" + unit = USD + definition_period = YEAR + reference = ( + "https://casetext.com/statute/new-mexico-statutes-1978/chapter-7-taxation/article-2-income-tax-general-provisions/section-7-2-14-low-income-comprehensive-tax-rebate?sort=relevance&type=regulation&tab=keyword&jxs=&resultsNav=false", + ) + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + """ + Quoting from N.M. Stat. § 7-2-14(C): + + For the purposes of this section, the total number of exemptions for which a + tax rebate may be claimed or allowed is determined by adding the number of + federal exemptions allowable for federal income tax purposes for each individual + included in the return who is domiciled in New Mexico... + """ + federal_exemptions = tax_unit("exemptions", period) + """ + ...plus two additional exemptions for each individual domiciled in New Mexico + included in the return who is sixty-five years of age or older... + + NB: The tax form shows that this and the blind exemption only apply to head + and spouse, not dependents. + https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf#page=58 + """ + p = parameters( + period + ).gov.states.nm.tax.income.rebates.low_income.exemptions + aged_exemptions_head = p.aged.calc(tax_unit("age_head", period)) + aged_exemptions_spouse = p.aged.calc(tax_unit("age_spouse", period)) + """ + ...plus one additional exemption for each individual domiciled in New Mexico + included in the return who, for federal income tax purposes, is blind... + """ + blind_head_plus_spouse = add( + tax_unit, period, ["blind_head", "blind_spouse"] + ) + blind_exemptions = p.blind * blind_head_plus_spouse + """ + ...plus one exemption for each minor child or stepchild of the resident who would + be a dependent for federal income tax purposes if the public assistance contributing + to the support of the child or stepchild was considered to have been contributed by + the resident. + + NB: This section is not defined in the tax form, so we skip it. + """ + return ( + federal_exemptions + + aged_exemptions_head + + aged_exemptions_spouse + + blind_exemptions + ) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/property_tax_rebate/nm_property_tax_rebate.py b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/property_tax_rebate/nm_property_tax_rebate.py new file mode 100644 index 000000000..c245ea74b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/property_tax_rebate/nm_property_tax_rebate.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class nm_property_tax_rebate(Variable): + value_type = float + entity = TaxUnit + label = "New Mexico property tax rebate" + unit = USD + definition_period = YEAR + reference = "https://nmonesource.com/nmos/nmsa/en/item/4340/index.do#!fragment/zoupio-_Toc140503750/BQCwhgziBcwMYgK4DsDWszIQewE4BUBTADwBdoAvbRABwEtsBaAfX2zgEYAWABgFYeAZgDsAgJQAaZNlKEIARUSFcAT2gBydRIiEwuBIuVrN23fpABlPKQBCagEoBRADKOAagEEAcgGFHE0jAAI2hSdjExIA" + defined_for = StateCode.NM + defined_for = "nm_property_tax_rebate_eligible" + + def formula(tax_unit, period, parameters): + # Get property tax paid + ptax_owner = add(tax_unit, period, ["real_estate_taxes"]) + # Get rent and multiply by 6% + rent = add(tax_unit, period, ["rent"]) + p = parameters(period).gov.states.nm.tax.income.rebates.property_tax + rent_percent = rent * p.rent_rate + rent_and_ptax = ptax_owner + rent_percent + # Get the maximum property tax liability + agi = tax_unit("nm_modified_gross_income", period) + max_liability = p.max_property_tax_liability.calc(agi) + rebate = max_(0, rent_and_ptax - max_liability) + # Maximum amount is based on filing status + filing_status = tax_unit("filing_status", period) + return min_(rebate, p.max_amount[filing_status]) diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/property_tax_rebate/nm_property_tax_rebate_eligible.py b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/property_tax_rebate/nm_property_tax_rebate_eligible.py new file mode 100644 index 000000000..f64824488 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/rebates/property_tax_rebate/nm_property_tax_rebate_eligible.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class nm_property_tax_rebate_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the New Mexico property tax rebate" + definition_period = YEAR + reference = "https://klvg4oyd4j.execute-api.us-west-2.amazonaws.com/prod/PublicFiles/34821a9573ca43e7b06dfad20f5183fd/1afc56af-ea90-4d48-82e5-1f9aeb43255a/PITbook2022.pdf" + defined_for = StateCode.NM + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.nm.tax.income.rebates.property_tax + # Head or spouse eligible if 65 or over. + age_head = tax_unit("age_head", period) + age_spouse = tax_unit("age_spouse", period) + head_age_eligible = age_head >= p.age_eligibility + spouse_age_eligible = age_spouse >= p.age_eligibility + age_eligible = head_age_eligible | spouse_age_eligible + # Person eligible if income at or below $16,000 + agi = tax_unit("nm_modified_gross_income", period) + agi_eligible = agi <= p.income_threshold + return age_eligible & agi_eligible diff --git a/fiscalsim_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc.py b/fiscalsim_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc.py index 9d78180f8..f5fe353b3 100644 --- a/fiscalsim_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc.py +++ b/fiscalsim_us/variables/gov/states/ny/tax/income/credits/ctc/ny_ctc.py @@ -1,9 +1,5 @@ from fiscalsim_us.model_api import * from policyengine_core.periods import instant -import warnings - -warnings.filterwarnings("ignore") -warnings.simplefilter("ignore") class ny_ctc(Variable): diff --git a/fiscalsim_us/variables/gov/states/ny/tax/income/credits/ny_household_credit.py b/fiscalsim_us/variables/gov/states/ny/tax/income/credits/ny_household_credit.py index ddcfffada..5697a4656 100644 --- a/fiscalsim_us/variables/gov/states/ny/tax/income/credits/ny_household_credit.py +++ b/fiscalsim_us/variables/gov/states/ny/tax/income/credits/ny_household_credit.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class ny_household_credit(Variable): diff --git a/fiscalsim_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_max.py b/fiscalsim_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_max.py index aa5dba8dc..76d0cb874 100644 --- a/fiscalsim_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_max.py +++ b/fiscalsim_us/variables/gov/states/ny/tax/income/taxable_income/deductions/itemized/ny_itemized_deductions_max.py @@ -1,29 +1,21 @@ -from fiscalsim_us.model_api import * - - -class ny_itemized_deductions_max(Variable): - value_type = float - entity = TaxUnit - label = "NY uncapped itemized deductions" - unit = USD - definition_period = YEAR - reference = "https://www.nysenate.gov/legislation/laws/TAX/615" - defined_for = StateCode.NY - - def formula(tax_unit, period, parameters): - gov = parameters(period).gov - itm_deds = [ - deduction - for deduction in gov.irs.deductions.itemized_deductions - if deduction not in ["salt_deduction"] - ] - itm_deds_less_salt = add(tax_unit, period, itm_deds) - property_taxes = add(tax_unit, period, ["real_estate_taxes"]) - salt = gov.irs.deductions.itemized.salt_and_real_estate - cap = salt.cap[tax_unit("filing_status", period)] - capped_property_taxes = min_(property_taxes, cap) - capped_tuition = min_( - gov.states.ny.tax.income.deductions.itemized.college_tuition_max, - add(tax_unit, period, ["qualified_tuition_expenses"]), - ) - return itm_deds_less_salt + capped_property_taxes + capped_tuition +from fiscalsim_us.model_api import * + + +class ny_itemized_deductions_max(Variable): + value_type = float + entity = TaxUnit + label = "NY uncapped itemized deductions" + unit = USD + definition_period = YEAR + reference = "https://www.nysenate.gov/legislation/laws/TAX/615" + defined_for = StateCode.NY + + def formula(tax_unit, period, parameters): + itm_deds_less_salt = tax_unit("itemized_deductions_less_salt", period) + capped_property_taxes = tax_unit("capped_property_taxes", period) + p = parameters(period).gov.states.ny.tax.income + capped_tuition = min_( + p.deductions.itemized.college_tuition_max, + add(tax_unit, period, ["qualified_tuition_expenses"]), + ) + return itm_deds_less_salt + capped_property_taxes + capped_tuition diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/adjusted_gross_income/oh_agi.py b/fiscalsim_us/variables/gov/states/oh/tax/income/adjusted_gross_income/oh_agi.py index b6ba6502f..b8ddf2319 100644 --- a/fiscalsim_us/variables/gov/states/oh/tax/income/adjusted_gross_income/oh_agi.py +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/adjusted_gross_income/oh_agi.py @@ -1,33 +1,33 @@ -from fiscalsim_us.model_api import * - - -class oh_agi(Variable): - value_type = float - entity = TaxUnit - label = "Ohio adjusted gross income" - unit = USD - definition_period = YEAR - reference = ( - "https://codes.ohio.gov/ohio-revised-code/section-5747.055", - "https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=20", - ) - defined_for = StateCode.OH - - adds = [ - "adjusted_gross_income", - "oh_bonus_depreciation_add_back", - "oh_other_add_backs", - ] - - subtracts = [ - "oh_section_179_expense_add_back", - "qualified_business_income_deduction", - "tax_unit_taxable_social_security", - "dividend_income", - # "above_the_line_deductions" #only need line 8z - "oh_uniformed_services_retirement_income_deduction", - "investment_in_529_plan", - "pell_grant", - "educator_expense", - "disability_benefits", - ] +from fiscalsim_us.model_api import * + + +class oh_agi(Variable): + value_type = float + entity = TaxUnit + label = "Ohio adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://codes.ohio.gov/ohio-revised-code/section-5747.055", + "https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=20", + ) + defined_for = StateCode.OH + + adds = [ + "adjusted_gross_income", + "oh_bonus_depreciation_add_back", + "oh_other_add_backs", + ] + + subtracts = [ + "oh_section_179_expense_add_back", + "qualified_business_income_deduction", + "tax_unit_taxable_social_security", + "dividend_income", + # "above_the_line_deductions" #only need line 8z + "oh_uniformed_services_retirement_income_deduction", + "investment_in_529_plan", + "spm_unit_pell_grant", + "educator_expense", + "disability_benefits", + ] diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_adoption_credit.py b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_adoption_credit.py new file mode 100644 index 000000000..9a4df59ea --- /dev/null +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_adoption_credit.py @@ -0,0 +1,35 @@ +from fiscalsim_us.model_api import * + + +class oh_adoption_credit(Variable): + value_type = float + entity = TaxUnit + label = "Ohio adoption credit" + unit = USD + definition_period = YEAR + reference = ( + # Ohio 2022 Instructions for Filing Original and Amended - Line 18 – Ohio Adoption Credit + "https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/it1040-sd100-instruction-booklet.pdf#page=21", + # Ohio Income - Individual Credits (Education, Displaced Workers & Adoption) 15. - 20. + "https://tax.ohio.gov/wps/portal/gov/tax/help-center/faqs/income+-+individual+credits/income-individual-credits", + # The ohio adoption credit has been repealed in the newest revised code, but can still be found in the previous legal code and 2022 tax form + # 2023 Ohio Rev. Code § 5747.37 + "https://casetext.com/statute/ohio-revised-code/title-57-taxation/chapter-5747-income-tax/section-574737-repealed", + # 2022 Ohio Revised Code Title 57 | Taxation Chapter 5747 | Income Tax Section 5747.37 | Credit for Legally Adopted Minor Child. + "https://law.justia.com/codes/ohio/2022/title-57/chapter-5747/section-5747-37/", + ) + defined_for = StateCode.OH + + def formula(tax_unit, period, parameters): + person = tax_unit.members + eligible_adoption_related_expenses = person( + "qualified_adoption_assistance_expense", period + ) + p = parameters(period).gov.states.oh.tax.income.credits.adoption + child_age_eligible = person("age", period) < p.age_limit + credit_if_eligible = min_( + max_(eligible_adoption_related_expenses, p.amount.min), + p.amount.max, + ) + credit = credit_if_eligible * child_age_eligible + return tax_unit.sum(credit) diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_cdcc.py b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_cdcc.py new file mode 100644 index 000000000..db9e54dc7 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_cdcc.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class oh_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "Ohio child and dependent care credit" + unit = USD + definition_period = YEAR + reference = ( + "https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=20", + ) + defined_for = StateCode.OH + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.oh.tax.income.credits.cdcc + + agi = tax_unit("oh_agi", period) + us_cdcc = tax_unit("cdcc", period) + + rate = p.match.calc(agi) + # qualify for full CDCC amount when AGI < 20_000 + # qualify for 25% percent of CDCC when 20000 <= AGI < 40_000 + # not qualify when AGI >= 40_000 + return rate * us_cdcc diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_eitc.py b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_eitc.py new file mode 100644 index 000000000..f7e1c78b3 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_eitc.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +# This credit is Non-refundable +class oh_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Ohio Earned Income Credit" + unit = USD + definition_period = YEAR + reference = ( + "https://codes.ohio.gov/ohio-revised-code/section-5747.71", + "https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/it1040-sd100-instruction-booklet.pdf#page=21", + ) + defined_for = StateCode.OH + + def formula(tax_unit, period, parameters): + federal_eitc = tax_unit("earned_income_tax_credit", period) + rate = parameters(period).gov.states.oh.tax.income.credits.eitc.rate + return federal_eitc * rate diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_non_public_school_credits.py b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_non_public_school_credits.py new file mode 100644 index 000000000..48bf4d3e7 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_non_public_school_credits.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class oh_non_public_school_credits(Variable): + value_type = float + entity = TaxUnit + label = "Ohio Nonchartered, Nonpublic, School Tuition Credit AGI Credit" + unit = USD + definition_period = YEAR + reference = "https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=21" + defined_for = StateCode.OH + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.oh.tax.income.credits + agi = tax_unit("adjusted_gross_income", period) + person = tax_unit.members + tuition = tax_unit.sum(person("non_public_school_tuition", period)) + cap = p.non_public_tuition.calc(agi) + return min_(tuition, cap) diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_senior_citizen_credit.py b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_senior_citizen_credit.py new file mode 100644 index 000000000..c4e31d1f6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/oh_senior_citizen_credit.py @@ -0,0 +1,30 @@ +from fiscalsim_us.model_api import * + + +class oh_senior_citizen_credit(Variable): + value_type = float + entity = TaxUnit + label = "Ohio senior citizen credit" + unit = USD + definition_period = YEAR + reference = ( + "https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/pit-it1040-booklet.pdf#page=20", + "https://codes.ohio.gov/ohio-revised-code/section-5747.055", + ) + defined_for = StateCode.OH + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.oh.tax.income.credits.senior_citizen + person = tax_unit.members + + has_not_taken_lump_sum_distribution = person( + "oh_has_not_taken_oh_lump_sum_credits", period + ) + age = person("age", period) + + any_elderly = tax_unit.any(age >= p.age_threshold) + credit_amount = p.agi_limit.calc(tax_unit("oh_agi", period)) + + return ( + any_elderly * has_not_taken_lump_sum_distribution * credit_amount + ) diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit.py b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit.py new file mode 100644 index 000000000..f737ff24d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit.py @@ -0,0 +1,33 @@ +from fiscalsim_us.model_api import * + + +class oh_retirement_income_credit(Variable): + value_type = float + entity = TaxUnit + label = "Ohio Retirement Income Credit" + unit = USD + definition_period = YEAR + reference = "https://codes.ohio.gov/ohio-revised-code/section-5747.055" + defined_for = "oh_retirement_income_credit_eligible" + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.oh.tax.income.credits.retirement_income + + person = tax_unit.members + is_spouse = person("is_tax_unit_spouse", period) + is_head = person("is_tax_unit_head", period) + pension_income = person("pension_income", period) + has_not_taken_lump_sum_distribution = person( + "oh_has_not_taken_oh_lump_sum_credits", period + ) + head_or_spouse = is_head | is_spouse + eligible_pension = ( + pension_income + * has_not_taken_lump_sum_distribution + * head_or_spouse + ) + total_pension_income = tax_unit.sum(eligible_pension) + + return p.amount.calc(total_pension_income, right=True) diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit_eligible.py b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit_eligible.py new file mode 100644 index 000000000..8a9ffdcc4 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/credits/retirement_income/oh_retirement_income_credit_eligible.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class oh_retirement_income_credit_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Ohio Retirement Income Credit Eligible" + unit = USD + definition_period = YEAR + reference = "https://codes.ohio.gov/ohio-revised-code/section-5747.055" + defined_for = StateCode.OH + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.oh.tax.income.credits.retirement_income + + agi = tax_unit("oh_agi", period) + return agi < p.income_threshold diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/oh_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/oh/tax/income/oh_non_refundable_credits.py new file mode 100644 index 000000000..afe7ac549 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/oh_non_refundable_credits.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class oh_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Ohio non-refundable credits" + reference = ( + # 2021 Ohio Schedule of Credits + "https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/sch-cre.pdf", + # 2022 Ohio Schedule of Credits + "https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/itschedule-credits.pdf", + ) + unit = USD + definition_period = YEAR + defined_for = StateCode.OH + + adds = "gov.states.oh.tax.income.credits.non_refundable" diff --git a/fiscalsim_us/variables/gov/states/oh/tax/income/oh_refundable_credits.py b/fiscalsim_us/variables/gov/states/oh/tax/income/oh_refundable_credits.py new file mode 100644 index 000000000..0660f22dd --- /dev/null +++ b/fiscalsim_us/variables/gov/states/oh/tax/income/oh_refundable_credits.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class oh_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Ohio refundable credits" + reference = ( + # 2021 Ohio Schedule of Credits + "https://tax.ohio.gov/static/forms/ohio_individual/individual/2021/sch-cre.pdf", + # 2022 Ohio Schedule of Credits + "https://tax.ohio.gov/static/forms/ohio_individual/individual/2022/itschedule-credits.pdf", + ) + unit = USD + definition_period = YEAR + defined_for = StateCode.OH diff --git a/fiscalsim_us/variables/gov/states/ok/tax/income/credits/ok_child_care_child_tax_credit.py b/fiscalsim_us/variables/gov/states/ok/tax/income/credits/ok_child_care_child_tax_credit.py index 6b14e94ca..7db824c9d 100644 --- a/fiscalsim_us/variables/gov/states/ok/tax/income/credits/ok_child_care_child_tax_credit.py +++ b/fiscalsim_us/variables/gov/states/ok/tax/income/credits/ok_child_care_child_tax_credit.py @@ -26,6 +26,11 @@ def formula(tax_unit, period, parameters): ok_ctc = us_ctc * p.child.ctc_fraction # determine prorated fraction ok_agi = tax_unit("ok_agi", period) - prorate = min_(1, max_(0, where(us_agi != 0, ok_agi / us_agi, 0))) + # Compute OK AGI as a share of US AGI. + # Use a mask rather than where to avoid a divide-by-zero warning. + agi_ratio = np.zeros_like(us_agi) + mask = us_agi != 0 + agi_ratio[mask] = ok_agi[mask] / us_agi[mask] + prorate = min_(1, max_(0, agi_ratio)) # receive greater of OK cdcc or OK ctc amounts prorated if AGI eligible return agi_eligible * prorate * max_(ok_cdcc, ok_ctc) diff --git a/fiscalsim_us/variables/gov/states/ok/tax/income/credits/ok_eitc.py b/fiscalsim_us/variables/gov/states/ok/tax/income/credits/ok_eitc.py index 5a21fc87d..154073443 100644 --- a/fiscalsim_us/variables/gov/states/ok/tax/income/credits/ok_eitc.py +++ b/fiscalsim_us/variables/gov/states/ok/tax/income/credits/ok_eitc.py @@ -16,7 +16,10 @@ class ok_eitc(Variable): def formula(tax_unit, period, parameters): us_agi = tax_unit("adjusted_gross_income", period) ok_agi = tax_unit("ok_agi", period) - prorate = min_(1, max_(0, where(us_agi != 0, ok_agi / us_agi, 0))) + agi_ratio = np.zeros_like(us_agi) + mask = us_agi != 0 + agi_ratio[mask] = ok_agi[mask] / us_agi[mask] + prorate = min_(1, max_(0, agi_ratio)) us_eitc = tax_unit("earned_income_tax_credit", period) p = parameters(period).gov.states.ok.tax.income.credits.earned_income return prorate * p.eitc_fraction * us_eitc diff --git a/fiscalsim_us/variables/gov/states/ok/tax/income/deductions/ok_itemized_deductions.py b/fiscalsim_us/variables/gov/states/ok/tax/income/deductions/ok_itemized_deductions.py index 3cfc0e46e..b0fc996d1 100644 --- a/fiscalsim_us/variables/gov/states/ok/tax/income/deductions/ok_itemized_deductions.py +++ b/fiscalsim_us/variables/gov/states/ok/tax/income/deductions/ok_itemized_deductions.py @@ -1,42 +1,31 @@ -from fiscalsim_us.model_api import * - - -class ok_itemized_deductions(Variable): - value_type = float - entity = TaxUnit - label = "Oklahoma itemized deductions" - unit = USD - definition_period = YEAR - reference = ( - "https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/past-year/2021/511-Pkt-2021.pdf" - "https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/current/511-Pkt.pdf" - ) - defined_for = StateCode.OK - - def formula(tax_unit, period, parameters): - # follows Schedule 511-D in references - itemizing = tax_unit("tax_unit_itemizes", period) - # calculate US itemized deductions less state non-property taxes - us_p = parameters(period).gov.irs.deductions - items = [ - deduction - for deduction in us_p.itemized_deductions - if deduction not in ["salt_deduction"] - ] - us_itm_deds_less_salt = add(tax_unit, period, items) - filing_status = tax_unit("filing_status", period) - capped_property_taxes = min_( - add(tax_unit, period, ["real_estate_taxes"]), - us_p.itemized.salt_and_real_estate.cap[filing_status], - ) - ok_itm_deds = us_itm_deds_less_salt + capped_property_taxes - # apply partial limit on OK itemized deductions - EXEMPT_ITEMS = [ - "medical_expense_deduction", - "charitable_deduction", - ] - exempt_deds = add(tax_unit, period, EXEMPT_ITEMS) - net_deds = max_(0, ok_itm_deds - exempt_deds) - ok_p = parameters(period).gov.states.ok.tax.income.deductions - limited_net_deds = min_(net_deds, ok_p.itemized.limit) - return itemizing * (exempt_deds + limited_net_deds) +from fiscalsim_us.model_api import * + + +class ok_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "Oklahoma itemized deductions" + unit = USD + definition_period = YEAR + reference = ( + "https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/past-year/2021/511-Pkt-2021.pdf" + "https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/current/511-Pkt.pdf" + ) + defined_for = StateCode.OK + + def formula(tax_unit, period, parameters): + # follows Schedule 511-D in references: + # ... calculate pre-limit OK itemized deductions + itm_deds_less_salt = tax_unit("itemized_deductions_less_salt", period) + capped_property_taxes = tax_unit("capped_property_taxes", period) + ok_itm_deds = itm_deds_less_salt + capped_property_taxes + # ... apply partial limit on OK itemized deductions + EXEMPT_ITEMS = [ + "medical_expense_deduction", + "charitable_deduction", + ] + exempt_deds = add(tax_unit, period, EXEMPT_ITEMS) + net_deds = max_(0, ok_itm_deds - exempt_deds) + p = parameters(period).gov.states.ok.tax.income + limited_net_deds = min_(net_deds, p.deductions.itemized.limit) + return exempt_deds + limited_net_deds diff --git a/fiscalsim_us/variables/gov/states/ok/tax/income/ok_taxable_income.py b/fiscalsim_us/variables/gov/states/ok/tax/income/ok_taxable_income.py index 78bc9dd4a..079cc3fef 100644 --- a/fiscalsim_us/variables/gov/states/ok/tax/income/ok_taxable_income.py +++ b/fiscalsim_us/variables/gov/states/ok/tax/income/ok_taxable_income.py @@ -1,23 +1,29 @@ -from fiscalsim_us.model_api import * - - -class ok_taxable_income(Variable): - value_type = float - entity = TaxUnit - label = "Oklahoma taxable income" - unit = USD - definition_period = YEAR - reference = ( - "https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/past-year/2021/511-Pkt-2021.pdf" - "https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/current/511-Pkt.pdf" - ) - defined_for = StateCode.OK - - def formula(tax_unit, period, parameters): - agi = tax_unit("ok_agi", period) - adjustments = tax_unit("ok_adjustments", period) - std_ded = tax_unit("ok_standard_deduction", period) - itm_ded = tax_unit("ok_itemized_deductions", period) - deductions = where(itm_ded > std_ded, itm_ded, std_ded) - exemptions = tax_unit("ok_exemptions", period) - return max_(0, agi - adjustments - deductions - exemptions) +from fiscalsim_us.model_api import * + + +class ok_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Oklahoma taxable income" + unit = USD + definition_period = YEAR + reference = ( + "https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/past-year/2021/511-Pkt-2021.pdf" + "https://oklahoma.gov/content/dam/ok/en/tax/documents/forms/individuals/current/511-Pkt.pdf" + ) + defined_for = StateCode.OK + + def formula(tax_unit, period, parameters): + agi = tax_unit("ok_agi", period) + adjustments = tax_unit("ok_adjustments", period) + exemptions = tax_unit("ok_exemptions", period) + # From page 10 of the 2021 and 2022 Form 511 Packets: + # "If you claimed the standard deduction on your federal return, + # you must claim the Oklahoma standard deduction. If you claimed + # itemized deductions on your federal return, you must claim + # Oklahoma itemized deductions." + std_ded = tax_unit("ok_standard_deduction", period) + itm_ded = tax_unit("ok_itemized_deductions", period) + federal_itemizer = tax_unit("tax_unit_itemizes", period) + deductions = where(federal_itemizer, itm_ded, std_ded) + return max_(0, agi - adjustments - exemptions - deductions) diff --git a/fiscalsim_us/variables/gov/states/or/tax/income/credits/or_ctc.py b/fiscalsim_us/variables/gov/states/or/tax/income/credits/or_ctc.py new file mode 100644 index 000000000..fd9c326e2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/or/tax/income/credits/or_ctc.py @@ -0,0 +1,33 @@ +from fiscalsim_us.model_api import * + + +class or_ctc(Variable): + value_type = float + entity = TaxUnit + label = "Oregon Child Tax Credit" + unit = USD + definition_period = YEAR + reference = "https://olis.oregonlegislature.gov/liz/2023R1/Downloads/MeasureDocument/HB3235/Enrolled" + defined_for = StateCode.OR + + def formula(tax_unit, period, parameters): + # Get age and dependent status of all people in the tax unit. + person = tax_unit.members + age = person("age", period) + dependent = person("is_tax_unit_dependent", period) + # Get the number of qualifying dependents in the tax unit. + p = parameters(period).gov.states["or"].tax.income.credits.ctc + age_eligible = age < p.ineligible_age + eligible = age_eligible & dependent + count_eligible = tax_unit.sum(eligible) + # Cap the number of qualifying dependents. + capped_count_eligible = min_(count_eligible, p.child_limit) + # Get maximum credit amount. + max_credit = p.amount * capped_count_eligible + # Get Oregon adjusted gross income. + or_agi = tax_unit("or_income_after_subtractions", period) + # Reduce credit amount over the phaseout range. + excess_agi = max_(or_agi - p.reduction.start, 0) + percent_reduction = min_(excess_agi / p.reduction.width, 1) + # Return reduced amount. + return max_credit * (1 - percent_reduction) diff --git a/fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit.py b/fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit.py new file mode 100644 index 000000000..812bd9269 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit.py @@ -0,0 +1,58 @@ +from fiscalsim_us.model_api import * + + +class or_retirement_credit(Variable): + value_type = float + entity = TaxUnit + label = "Oregon Retirement Income Tax Credit" + unit = USD + definition_period = YEAR + reference = "https://www.oregon.gov/dor/forms/FormsPubs/publication-or-17_101-431_2021.pdf#page=108" + defined_for = StateCode.OR + + def formula(tax_unit, period, parameters): + # follows twelve-line worksheet on page 108 of above reference + + # Line 1, retirement income + person = tax_unit.members + eligible = person("or_retirement_credit_eligible", period) + retirement_income = eligible * person("taxable_pension_income", period) + total_retirement_income = tax_unit.sum(retirement_income) + + # Line 2, federal pension subtraction + federal_pension_subtraction = tax_unit( + "or_federal_pension_subtraction", period + ) + + # Line 3, retirement income reduced by federal pension subtraction + or_taxable_pension = max_( + 0, total_retirement_income - federal_pension_subtraction + ) + + # Line 5, total social security + social_security = add(tax_unit, period, ["social_security"]) + + # Line 6, base amount reduced by social security benefits received + p = ( + parameters(period) + .gov.states["or"] + .tax.income.credits.retirement_income + ) + filing_status = tax_unit("filing_status", period) + reduced_base = max_(0, p.base[filing_status] - social_security) + + # Line 7, household income + household_income = tax_unit( + "or_retirement_credit_household_income", period + ) + + # Line 9, household income minus income threshold + excess_household_income = max_( + 0, household_income - p.income_threshold[filing_status] + ) + + # Line 10, reduced base amount is reduced by excess household income + base_amount = max_(0, reduced_base - excess_household_income) + + # Line 11, calculate credit + return min_(or_taxable_pension, base_amount) * p.percentage diff --git a/fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit_eligible.py b/fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit_eligible.py new file mode 100644 index 000000000..008aa46dd --- /dev/null +++ b/fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit_eligible.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class or_retirement_credit_eligible(Variable): + value_type = bool + entity = Person + label = "Eligible for the Oregon Retirement Income Tax Credit" + definition_period = YEAR + reference = "https://secure.sos.state.or.us/oard/viewSingleRule.action?ruleVrsnRsn=238290#:~:text=Eligible%20individuals%20receiving%20retirement%20pay,by%20the%20household%20income%20limitation." + defined_for = StateCode.OR + + def formula(person, period, parameters): + # taxpayer or spouse must be age 62+ for their pension income to count + age = person("age", period) + is_head = person("is_tax_unit_head", period) + is_spouse = person("is_tax_unit_spouse", period) + p = ( + parameters(period) + .gov.states["or"] + .tax.income.credits.retirement_income + ) + return (age >= p.age_eligibility) & (is_head | is_spouse) diff --git a/fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit_household_income.py b/fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit_household_income.py new file mode 100644 index 000000000..2daff3a2c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/or/tax/income/credits/retirement_credit/or_retirement_income_credit_household_income.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class or_retirement_credit_household_income(Variable): + value_type = float + entity = TaxUnit + label = "Household income for the Oregon Retirement Income Tax Credit" + unit = USD + definition_period = YEAR + reference = "https://casetext.com/statute/oregon-revised-statutes/title-29-revenue-and-taxation/chapter-316-personal-income-tax/additional-credits/retirement-income/section-316157-credit-for-retirement-income" + defined_for = StateCode.OR + + adds = ["adjusted_gross_income", "tax_exempt_interest_income"] + subtracts = ["taxable_social_security"] diff --git a/fiscalsim_us/variables/gov/states/or/tax/income/deductions/or_itemized_deductions.py b/fiscalsim_us/variables/gov/states/or/tax/income/deductions/or_itemized_deductions.py index e6fa34dc9..98bc06d2b 100644 --- a/fiscalsim_us/variables/gov/states/or/tax/income/deductions/or_itemized_deductions.py +++ b/fiscalsim_us/variables/gov/states/or/tax/income/deductions/or_itemized_deductions.py @@ -1,25 +1,13 @@ -from fiscalsim_us.model_api import * - - -class or_itemized_deductions(Variable): - value_type = float - entity = TaxUnit - label = "OR itemized deductions" - unit = USD - definition_period = YEAR - reference = "https://www.oregonlegislature.gov/bills_laws/ors/ors316.html" # 316.695 (1)(d) - defined_for = StateCode.OR - - def formula(tax_unit, period, parameters): - p = parameters(period).gov.irs.deductions - itm_deds = [ - deduction - for deduction in p.itemized_deductions - if deduction not in ["salt_deduction"] - ] - or_itemized_deductions_less_salt = add(tax_unit, period, itm_deds) - property_taxes = add(tax_unit, period, ["real_estate_taxes"]) - salt = p.itemized.salt_and_real_estate - cap = salt.cap[tax_unit("filing_status", period)] - capped_property_taxes = min_(property_taxes, cap) - return or_itemized_deductions_less_salt + capped_property_taxes +from fiscalsim_us.model_api import * + + +class or_itemized_deductions(Variable): + value_type = float + entity = TaxUnit + label = "OR itemized deductions" + unit = USD + definition_period = YEAR + reference = "https://www.oregonlegislature.gov/bills_laws/ors/ors316.html" # 316.695 (1)(d) + defined_for = StateCode.OR + + adds = ["itemized_deductions_less_salt", "capped_property_taxes"] diff --git a/fiscalsim_us/variables/gov/states/or/tax/income/subtractions/or_federal_pension_subtraction.py b/fiscalsim_us/variables/gov/states/or/tax/income/subtractions/or_federal_pension_subtraction.py new file mode 100644 index 000000000..2e04619bb --- /dev/null +++ b/fiscalsim_us/variables/gov/states/or/tax/income/subtractions/or_federal_pension_subtraction.py @@ -0,0 +1,11 @@ +from fiscalsim_us.model_api import * + + +class or_federal_pension_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Oregon Federal Pension Subtraction" + unit = USD + definition_period = YEAR + reference = "https://www.oregon.gov/dor/forms/FormsPubs/publication-or-17_101-431_2022.pdf#page=84" + defined_for = StateCode.OR diff --git a/fiscalsim_us/variables/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.py b/fiscalsim_us/variables/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.py index 44c759097..6605f8b1d 100644 --- a/fiscalsim_us/variables/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.py +++ b/fiscalsim_us/variables/gov/states/or/tax/income/subtractions/or_federal_tax_liability_subtraction.py @@ -8,45 +8,40 @@ class or_federal_tax_liability_subtraction(Variable): unit = USD definition_period = YEAR reference = ( - "https://www.oregon.gov/dor/forms/FormsPubs/form-or-40-inst_101-040-1_2021.pdf#page=13", + "https://www.oregon.gov/dor/forms/FormsPubs/publication-or-17_101-431_2021.pdf#page=71", "https://www.oregonlegislature.gov/bills_laws/ors/ors316.html", # Subsection 316.800 ) defined_for = StateCode.OR def formula(tax_unit, period, parameters): + # calculate Oregon concept of federal income tax + federal_income_tax = tax_unit("income_tax", period) + eitc = tax_unit("earned_income_tax_credit", period) + seca = add(tax_unit, period, ["self_employment_tax"]) + or_federal_income_tax = max_(0, federal_income_tax - seca + eitc) + # limit subtraction based on caps scaled to federal AGI filing_status = tax_unit("filing_status", period) - statuses = filing_status.possible_values - income = tax_unit("adjusted_gross_income", period) - # Use no-SALT income tax to avoid circular logic, until we add - # withholding rules. - federal_tax_liability = tax_unit("no_salt_income_tax", period) - # Instructions for line 14: - # "This is your federal income tax liability after refundable credits - # (other than the EITC)." - eitc = tax_unit("eitc", period) - federal_tax_liability_less_eitc = federal_tax_liability + eitc - non_negative_federal_tax_liability = max_( - 0, federal_tax_liability_less_eitc - ) + status = filing_status.possible_values caps = ( parameters(period) .gov.states["or"] .tax.income.subtractions.federal_tax_liability.cap ) + federal_agi = tax_unit("adjusted_gross_income", period) cap = select( [ - filing_status == statuses.SINGLE, - filing_status == statuses.JOINT, - filing_status == statuses.HEAD_OF_HOUSEHOLD, - filing_status == statuses.SEPARATE, - filing_status == statuses.WIDOW, + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.HEAD_OF_HOUSEHOLD, + filing_status == status.SEPARATE, + filing_status == status.WIDOW, ], [ - caps.single.calc(income), - caps.joint.calc(income), - caps.head_of_household.calc(income), - caps.separate.calc(income), - caps.widow.calc(income), + caps.single.calc(federal_agi), + caps.joint.calc(federal_agi), + caps.head_of_household.calc(federal_agi), + caps.separate.calc(federal_agi), + caps.widow.calc(federal_agi), ], ) - return min_(non_negative_federal_tax_liability, cap) + return min_(or_federal_income_tax, cap) diff --git a/fiscalsim_us/variables/gov/states/pa/dhs/tanf/cash_assistance/pa_tanf_age_eligible.py b/fiscalsim_us/variables/gov/states/pa/dhs/tanf/cash_assistance/pa_tanf_age_eligible.py new file mode 100644 index 000000000..576efb6c8 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/pa/dhs/tanf/cash_assistance/pa_tanf_age_eligible.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class pa_tanf_age_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Pennsylvania TANF age eligibility" + definition_period = YEAR + defined_for = StateCode.PA + + def formula(spm_unit, period, parameters): + person = spm_unit.members + p = parameters(period).gov.states.pa.dhs.tanf.cash_assistance + age = person("age", period) + # Get full time students + student_eligible = person("is_full_time_student", period) & ( + age == p.age_limit + ) + + # Get age + is_eligible_age = age < p.age_limit + return spm_unit.any(is_eligible_age | student_eligible) diff --git a/fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pa_tanf_countable_resources.py b/fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pa_tanf_countable_resources.py new file mode 100644 index 000000000..7bd37adfc --- /dev/null +++ b/fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pa_tanf_countable_resources.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class pa_tanf_countable_resources(Variable): + value_type = float + entity = SPMUnit + label = "Pennsylvania TANF countable resources" + defined_for = StateCode.PA + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pa_tanf_resources_eligible.py b/fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pa_tanf_resources_eligible.py new file mode 100644 index 000000000..05635a13c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pa_tanf_resources_eligible.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class pa_tanf_resources_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Meets Pennsylvania TANF resource limit" + unit = USD + definition_period = YEAR + defined_for = StateCode.PA + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.pa.dhs.tanf + resources = spm_unit("pa_tanf_countable_resources", period) + return resources <= p.resource_limit diff --git a/fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pregnancy_eligibility/age_eligibility.py b/fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pregnancy_eligibility/age_eligibility.py new file mode 100644 index 000000000..7ca40ae39 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/pa/dhs/tanf/eligibility/pregnancy_eligibility/age_eligibility.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class pa_tanf_age_eligible_on_pregnant_women_limitation(Variable): + value_type = bool + entity = SPMUnit + label = "Pennsylvania TANF age eligibility on pregnant women requirement" + definition_period = YEAR + defined_for = StateCode.PA + + def formula(spm_unit, period, parameters): + person = spm_unit.members + p = parameters(period).gov.states.pa.dhs.tanf.pregnancy_eligibility + age = person("age", period) + is_eligible_age = age < p.age_limit + is_pregnant = person("is_pregnant", period) + is_children_receiving_tanf = spm_unit("pa_tanf_age_eligible", period) + # Must be pregnant and either of a qualifying age or children not receiving TANF. + eligible = is_pregnant & ( + is_eligible_age | ~is_children_receiving_tanf + ) + return spm_unit.any(eligible) diff --git a/fiscalsim_us/variables/gov/states/pa/tax/income/forgiveness/pa_tax_forgiveness_rate.py b/fiscalsim_us/variables/gov/states/pa/tax/income/forgiveness/pa_tax_forgiveness_rate.py index 13c0b037f..09df36cdc 100644 --- a/fiscalsim_us/variables/gov/states/pa/tax/income/forgiveness/pa_tax_forgiveness_rate.py +++ b/fiscalsim_us/variables/gov/states/pa/tax/income/forgiveness/pa_tax_forgiveness_rate.py @@ -1,5 +1,4 @@ from fiscalsim_us.model_api import * -import numpy as np class pa_tax_forgiveness_rate(Variable): diff --git a/fiscalsim_us/variables/gov/states/ri/tax/income/credits/cdcc/ri_cdcc.py b/fiscalsim_us/variables/gov/states/ri/tax/income/credits/cdcc/ri_cdcc.py new file mode 100644 index 000000000..d1b1c30a2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ri/tax/income/credits/cdcc/ri_cdcc.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ri_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "Rhode Island child and dependent care credit" + defined_for = StateCode.RI + unit = USD + definition_period = YEAR + + def formula(tax_unit, period, parameters): + fed_cdcc = tax_unit("cdcc", period) + rate = parameters(period).gov.states.ri.tax.income.credits.cdcc.rate + return fed_cdcc * rate diff --git a/fiscalsim_us/variables/gov/states/ri/tax/income/credits/eitc/ri_eitc.py b/fiscalsim_us/variables/gov/states/ri/tax/income/credits/eitc/ri_eitc.py new file mode 100644 index 000000000..2229a66e5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ri/tax/income/credits/eitc/ri_eitc.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class ri_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Rhode Island earned income tax credit" + defined_for = StateCode.RI + unit = USD + definition_period = YEAR + + def formula(tax_unit, period, parameters): + fed_eitc = tax_unit("earned_income_tax_credit", period) + rate = parameters(period).gov.states.ri.tax.income.credits.eitc.match + return fed_eitc * rate diff --git a/fiscalsim_us/variables/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit.py b/fiscalsim_us/variables/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit.py new file mode 100644 index 000000000..4bf84144e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit.py @@ -0,0 +1,29 @@ +from fiscalsim_us.model_api import * + + +class ri_property_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "Rhode Island property tax credit" + unit = USD + definition_period = YEAR + reference = ( + "http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-33/44-33-9.htm" + ) + defined_for = "ri_property_tax_credit_eligible" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ri.tax.income.credits.property_tax + household_income = tax_unit("ri_property_tax_household_income", period) + household_income_percent = where( + tax_unit("tax_unit_size", period) == 1, + p.rate.one_person.calc(household_income), + p.rate.multiple_people.calc(household_income), + ) + threshold = household_income_percent * household_income + property_tax = add(tax_unit, period, ["real_estate_taxes"]) + rent = add(tax_unit, period, ["rent"]) + applicable_rent = rent * p.rate.rent + rent_plus_property_tax = property_tax + applicable_rent + uncapped_credit = max_(rent_plus_property_tax - threshold, 0) + return min_(uncapped_credit, p.max_amount) diff --git a/fiscalsim_us/variables/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.py b/fiscalsim_us/variables/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.py new file mode 100644 index 000000000..38cc129fa --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ri/tax/income/credits/property_tax/ri_property_tax_credit_eligible.py @@ -0,0 +1,24 @@ +from fiscalsim_us.model_api import * + + +class ri_property_tax_credit_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Rhode Island property tax credit eligibility status" + definition_period = YEAR + reference = ( + "http://webserver.rilin.state.ri.us/Statutes/TITLE44/44-33/44-33-3.htm" + ) + defined_for = StateCode.RI + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.ri.tax.income.credits.property_tax + # minimum age eligibility + head_age = tax_unit("age_head", period) + spouse_age = tax_unit("age_spouse", period) + age_eligible = max_(head_age, spouse_age) >= p.age_threshold + # disability eligibility + head_is_disabled = tax_unit("head_is_disabled", period) + spouse_is_disabled = tax_unit("spouse_is_disabled", period) + is_disabled = head_is_disabled | spouse_is_disabled + return age_eligible | is_disabled diff --git a/fiscalsim_us/variables/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction.py b/fiscalsim_us/variables/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction.py index 8895ba80d..1b6adb3d6 100644 --- a/fiscalsim_us/variables/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction.py +++ b/fiscalsim_us/variables/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction.py @@ -13,4 +13,7 @@ class ri_standard_deduction(Variable): def formula(tax_unit, period, parameters): p = parameters(period).gov.states.ri.tax.income.deductions.standard filing_status = tax_unit("filing_status", period) - return p.amount[filing_status] + percentage = tax_unit( + "ri_standard_deduction_applicable_percentage", period + ) + return p.amount[filing_status] * percentage diff --git a/fiscalsim_us/variables/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction_applicable_percentage.py b/fiscalsim_us/variables/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction_applicable_percentage.py new file mode 100644 index 000000000..b51c80da0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ri/tax/income/deductions/standard/ri_standard_deduction_applicable_percentage.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class ri_standard_deduction_applicable_percentage(Variable): + value_type = float + entity = TaxUnit + label = "Rhode Island standard deduction applicable percentage" + unit = USD + definition_period = YEAR + reference = ( + "https://tax.ri.gov/sites/g/files/xkgbur541/files/2021-11/2021-tax-rate-and-worksheets.pdf" + "https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20Tax%20Rate%20and%20Worksheets.pdf" + ) + defined_for = StateCode.RI + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.ri.tax.income.deductions.standard.phase_out + + agi = tax_unit("ri_agi", period) + + excess_agi = max_(agi - p.start, 0) + + excess_agi_step = np.ceil(excess_agi / p.increment) + + return max_(1 - p.percentage * excess_agi_step, 0) diff --git a/fiscalsim_us/variables/gov/states/ri/tax/income/ri_agi.py b/fiscalsim_us/variables/gov/states/ri/tax/income/ri_agi.py new file mode 100644 index 000000000..f456d3716 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ri/tax/income/ri_agi.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class ri_agi(Variable): + value_type = float + entity = TaxUnit + label = "Rhode Island adjusted gross income" + defined_for = StateCode.RI + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/states/ri/tax/income/ri_property_tax_household_income.py b/fiscalsim_us/variables/gov/states/ri/tax/income/ri_property_tax_household_income.py new file mode 100644 index 000000000..824fff05d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/ri/tax/income/ri_property_tax_household_income.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class ri_property_tax_household_income(Variable): + value_type = float + entity = TaxUnit + label = "Rhode Island total household income for the property tax credit computation" + reference = "https://tax.ri.gov/sites/g/files/xkgbur541/files/2022-12/2022%20RI-1040H_v2_w.pdf#page=2" + defined_for = StateCode.RI + unit = USD + definition_period = YEAR + adds = "gov.states.ri.tax.income.credits.property_tax.income_sources" + subtracts = ["above_the_line_deductions"] # Form RI-1040H Line 27 diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/credits/cdcc/sc_cdcc.py b/fiscalsim_us/variables/gov/states/sc/tax/income/credits/cdcc/sc_cdcc.py new file mode 100644 index 000000000..4f612dda0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/credits/cdcc/sc_cdcc.py @@ -0,0 +1,42 @@ +from fiscalsim_us.model_api import * + + +class sc_cdcc(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina CDCC" + documentation = "South Carolina Child and Dependent Care Credit" + unit = USD + definition_period = YEAR + reference = ( + "https://dor.sc.gov/forms-site/Forms/IITPacket_2022.pdf#page=22" + ) + defined_for = StateCode.SC + + def formula(tax_unit, period, parameters): + # Get South Carolina CDCC rate. + p_sc = parameters(period).gov.states.sc.tax.income.credits.cdcc + p_us = parameters(period).gov.irs.credits.cdcc + + # Year 2021 is different from federal cdcc + max_decoupled_year_offset = p_sc.max_care_expense_year_offset + period_max = period.offset(max_decoupled_year_offset) + sc_max_care_expense = parameters(period_max).gov.irs.credits.cdcc.max + + # Get child care expenses. + childcare_expenses = tax_unit("tax_unit_childcare_expenses", period) + + # Married filing separate are ineligible. + filing_status = tax_unit("filing_status", period) + eligible = filing_status != filing_status.possible_values.SEPARATE + + # Number of qualifying people + count_cdcc_eligible = min_( + tax_unit("count_cdcc_eligible", period), p_us.eligibility.max + ) + # Maximum value cannot exceed cap + # Calculate total CDCC + capped_expenses = min_( + childcare_expenses, sc_max_care_expense * count_cdcc_eligible + ) + return eligible * capped_expenses * p_sc.rate diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/credits/eitc/sc_eitc.py b/fiscalsim_us/variables/gov/states/sc/tax/income/credits/eitc/sc_eitc.py new file mode 100644 index 000000000..68fdb0d2f --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/credits/eitc/sc_eitc.py @@ -0,0 +1,15 @@ +from fiscalsim_us.model_api import * + + +class sc_eitc(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina EITC" + unit = USD + definition_period = YEAR + reference = "https://dor.sc.gov/forms-site/Forms/TC60_2021.pdf" + + def formula(tax_unit, period, parameters): + eitc = tax_unit("earned_income_tax_credit", period) + rate = parameters(period).gov.states.sc.tax.income.credits.eitc.rate + return np.round(eitc * rate, 1) diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/credits/two_wage_earner/sc_gross_earned_income.py b/fiscalsim_us/variables/gov/states/sc/tax/income/credits/two_wage_earner/sc_gross_earned_income.py new file mode 100644 index 000000000..5b350b050 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/credits/two_wage_earner/sc_gross_earned_income.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class sc_gross_earned_income(Variable): + value_type = float + entity = Person + label = "South Carolina gross earned income" + unit = USD + definition_period = YEAR + defined_for = StateCode.SC + + adds = "gov.states.sc.tax.income.credits.two_wage_earner.earned_income" diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/credits/two_wage_earner/sc_two_wage_earner_credit.py b/fiscalsim_us/variables/gov/states/sc/tax/income/credits/two_wage_earner/sc_two_wage_earner_credit.py new file mode 100644 index 000000000..783bcddff --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/credits/two_wage_earner/sc_two_wage_earner_credit.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class sc_two_wage_earner_credit(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina two wage earner credit" + defined_for = StateCode.SC + unit = USD + definition_period = YEAR + reference = ( + "https://dor.sc.gov/forms-site/Forms/SC1040TT_2021.pdf", + "https://dor.sc.gov/forms-site/Forms/IITPacket_2021.pdf#page=23", + ) + + def formula(tax_unit, period, parameters): + # Determine eligibility. Must be a joint filer. + filing_status = tax_unit("filing_status", period) + eligible = filing_status == filing_status.possible_values.JOINT + # Find relevant gross income of head and spouse. + person = tax_unit.members + income = person("sc_gross_earned_income", period) + head_income = tax_unit.max(income * person("is_tax_unit_head", period)) + spouse_income = tax_unit.max( + income * person("is_tax_unit_spouse", period) + ) + # Determine lesser of head and spouse income. + lesser_head_spouse_income = min_(head_income, spouse_income) + # Calculate credit based on rate. + p = parameters(period).gov.states.sc.tax.income.credits.two_wage_earner + credit_if_eligible = p.rate.calc(lesser_head_spouse_income) + return credit_if_eligible * eligible diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/deductions/net_capital_gain/sc_net_capital_gain_deduction.py b/fiscalsim_us/variables/gov/states/sc/tax/income/deductions/net_capital_gain/sc_net_capital_gain_deduction.py new file mode 100644 index 000000000..b8e48f033 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/deductions/net_capital_gain/sc_net_capital_gain_deduction.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class sc_net_capital_gain_deduction(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina net capital gain deduction" + unit = USD + definition_period = YEAR + defined_for = StateCode.SC + reference = ( + "https://dor.sc.gov/forms-site/Forms/IITPacket_2021.pdf#page=15", + "https://www.scstatehouse.gov/code/t12c006.php" + # South Carolina Code of Laws Section 12-6-1150 (A) + ) + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.sc.tax.income.deductions.net_capital_gain + capital_gains = tax_unit("net_capital_gain", period) + return capital_gains * p.rate diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_military_retirement_income_deduction_head.py b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_military_retirement_income_deduction_head.py new file mode 100644 index 000000000..e94d2b4c7 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_military_retirement_income_deduction_head.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class sc_military_retirement_income_deduction_head(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina military retirement income deduction for head" + defined_for = StateCode.SC + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_military_retirement_income_deduction_spouse.py b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_military_retirement_income_deduction_spouse.py new file mode 100644 index 000000000..27a1b4226 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_military_retirement_income_deduction_spouse.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class sc_military_retirement_income_deduction_spouse(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina military retirement income deduction for spouse" + defined_for = StateCode.SC + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_retirement_income_deduction_head.py b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_retirement_income_deduction_head.py new file mode 100644 index 000000000..ed11a6611 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_retirement_income_deduction_head.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class sc_retirement_income_deduction_head(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina retirement income deduction for head" + defined_for = StateCode.SC + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_retirement_income_deduction_spouse.py b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_retirement_income_deduction_spouse.py new file mode 100644 index 000000000..35c44ec10 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_retirement_income_deduction_spouse.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class sc_retirement_income_deduction_spouse(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina retirement income deduction for spouse" + defined_for = StateCode.SC + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_senior_exemption.py b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_senior_exemption.py new file mode 100644 index 000000000..90e8d8fd1 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/exemptions/sc_senior_exemption.py @@ -0,0 +1,59 @@ +from fiscalsim_us.model_api import * + + +class sc_senior_exemption(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina senior exemption" + unit = USD + definition_period = YEAR + reference = "https://dor.sc.gov/forms-site/Forms/SC1040_2022.pdf" + defined_for = StateCode.SC + + def formula(tax_unit, period, parameters): + # First get their filing status. + filing_status = tax_unit("filing_status", period) + + # Then get the SC senior exemptions part of the parameter tree + p = parameters(period).gov.states.sc.tax.income.exemptions.senior + + # Get the individual filer's age. + age_head = tax_unit("age_head", period) + + # Determine if head of household (filer) is eligible. + head_eligible = (age_head >= p.age_threshold).astype(int) + + # Get the spouse age, if applicable. + age_spouse = tax_unit("age_spouse", period) + + # Determine whether spouse is eligible (>= age 65). + joint = filing_status == filing_status.possible_values.JOINT + spouse_eligible = ((age_spouse >= p.age_threshold) * joint).astype(int) + + # Get SC retirement income deduction and military retirement income deduction + + head_deductions = add( + tax_unit, + period, + [ + "sc_retirement_income_deduction_head", + "sc_military_retirement_income_deduction_head", + ], + ) + spouse_deductions = add( + tax_unit, + period, + [ + "sc_retirement_income_deduction_spouse", + "sc_military_retirement_income_deduction_spouse", + ], + ) + + # Calculate senior exemption. The exemption can not be less than 0. Add head and spouse together. + # Per the legal code, this applies separately: + # "(2) In the case of married taxpayers who file a joint federal income tax return, the reduction required by item (1) applies to each individual separately" + head_exemption = max_(head_eligible * p.amount - head_deductions, 0) + spouse_exemption = max_( + spouse_eligible * p.spouse_amount - spouse_deductions, 0 + ) + return head_exemption + spouse_exemption diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/sc_state_tax_addback.py b/fiscalsim_us/variables/gov/states/sc/tax/income/sc_state_tax_addback.py new file mode 100644 index 000000000..171207fd9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/sc_state_tax_addback.py @@ -0,0 +1,51 @@ +from fiscalsim_us.model_api import * + + +class sc_state_tax_addback(Variable): + value_type = float + entity = TaxUnit + label = "South Carolina State Tax addback" + unit = USD + definition_period = YEAR + reference = ( + "https://dor.sc.gov/forms-site/Forms/SC1040_2022.pdf#page=2", + "https://dor.sc.gov/forms-site/Forms/SC1040inst_2022.pdf#page=2", + "https://www.scstatehouse.gov/code/t12c006.php", # SECTION 12-6-1130 (2) + ) + defined_for = StateCode.SC + + def formula(tax_unit, period, parameters): + p_us = parameters(period).gov.irs.deductions + itm_deds = [ + deduction + for deduction in p_us.itemized_deductions + if deduction not in ["salt_deduction"] + ] + us_itemizing = tax_unit("tax_unit_itemizes", period) + standard_deduction = tax_unit("standard_deduction", period) + filing_status = tax_unit("filing_status", period) + eligible = filing_status != filing_status.possible_values.SEPARATE + # line 1 + federal_itemized_deduction = ( + add(tax_unit, period, itm_deds) * us_itemizing + ) + # line 2 + federal_standard_deduction = standard_deduction * eligible + # line 3 + less_itm_amount = max_( + 0, federal_itemized_deduction - federal_standard_deduction + ) + # line 4 + salt = tax_unit("state_and_local_sales_or_income_tax", period) + # line 5 + real_estate_and_property_taxes = add( + tax_unit, period, ["real_estate_taxes"] + ) + less_income_amount = max_( + 0, + p_us.itemized.salt_and_real_estate.cap[filing_status] + - real_estate_and_property_taxes, + ) + # compare line 3,4,5. get the minimum + salt_or_income = min_(salt, less_income_amount) + return min_(salt_or_income, less_itm_amount) diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index 5da2d0472..334ff63cf 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -17,7 +17,7 @@ class state_income_tax(Variable): "in_income_tax", "ks_income_tax", "ky_income_tax", - "la_income_tax", + # "la_income_tax", --- activating will cause circular logic errors # "ma_income_tax", --- activating will cause circular logic errors # "md_income_tax", --- activating will cause circular logic errors # "me_income_tax", --- activating will cause circular logic errors diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_capital_gain_exclusion/vt_capital_gains_exclusion.py b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_capital_gain_exclusion/vt_capital_gains_exclusion.py new file mode 100644 index 000000000..c604fdb19 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_capital_gain_exclusion/vt_capital_gains_exclusion.py @@ -0,0 +1,39 @@ +from fiscalsim_us.model_api import * + + +class vt_capital_gains_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "Vermont capital gains exclusion" + unit = USD + documentation = "Vermont excludes a portion of capital gains, calculated either as a flat amount or as a fraction of adjusted net capital gains, and limited by a fraction of federal taxable income." + definition_period = YEAR + defined_for = StateCode.VT + reference = ( + "https://tax.vermont.gov/sites/tax/files/documents/IN-153-2022.pdf#page=1" # 2022 Schedule IN-153 Vermont Capital Gains Exclusion Calculation + "https://legislature.vermont.gov/statutes/section/32/151/05811" # Titl. 32 V.S.A. § 5811(21)(B)(ii) + "https://tax.vermont.gov/sites/tax/files/documents/IN-153%20Instr-2022.pdf" + ) + + def formula(tax_unit, period, parameters): + # Get adjusted net capital gains, which is capped at 0 + adjusted_net_capital_gain = tax_unit( + "adjusted_net_capital_gain", period + ) + p = parameters( + period + ).gov.states.vt.tax.income.agi.exclusions.capital_gain + # The flat exclusion is the less of a capped amount + # or the actual amount of net adjusted capital gains + flat_exclusion = min_(adjusted_net_capital_gain, p.flat.cap) + # Get percentage exclusion + percentage_exclusion = tax_unit( + "vt_percentage_capital_gains_exclusion", period + ) + # Filer can choose from flat or percentage exclusion. + # Assume the filer will always choose the larger one + chosen_exclusion = max_(flat_exclusion, percentage_exclusion) + # The chosen exclusion should not exceed 40% of federal taxable income + federal_taxable_income = tax_unit("taxable_income", period) + cap = federal_taxable_income * p.income_share_cap + return min_(chosen_exclusion, cap) diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_capital_gain_exclusion/vt_percentage_capital_gains_exclusion.py b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_capital_gain_exclusion/vt_percentage_capital_gains_exclusion.py new file mode 100644 index 000000000..fc30fc8b0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_capital_gain_exclusion/vt_percentage_capital_gains_exclusion.py @@ -0,0 +1,29 @@ +from fiscalsim_us.model_api import * + + +class vt_percentage_capital_gains_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "Vermont percentage capital gains exclusion" + unit = USD + documentation = "This can be selected to be subtracted from federal adjusted gross income in Vermont as percentage captial gains exclusion." + definition_period = YEAR + defined_for = StateCode.VT + reference = ( + "https://tax.vermont.gov/sites/tax/files/documents/IN-153-2022.pdf#page=1" # 2022 Schedule IN-153 Vermont Capital Gains Exclusion Calculation + "https://legislature.vermont.gov/statutes/section/32/151/05811" # Titl. 32 V.S.A. § 5811(21)(B)(ii) + "https://tax.vermont.gov/sites/tax/files/documents/IN-153%20Instr-2022.pdf" + ) + + def formula(tax_unit, period, parameters): + # Get adjusted net capital gain, which is capped at 0 + adjusted_net_capital_gain = tax_unit( + "adjusted_net_capital_gain", period + ) + p = parameters( + period + ).gov.states.vt.tax.income.agi.exclusions.capital_gain + # The percentage exclusion equals to a percentage of + # the adjusted net capital gain and has a maximum value + percentage_exclusion = adjusted_net_capital_gain * p.percentage.rate + return min_(percentage_exclusion, p.percentage.cap) diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_medical_expense_deduction.py b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_medical_expense_deduction.py new file mode 100644 index 000000000..4a07f6145 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_medical_expense_deduction.py @@ -0,0 +1,37 @@ +from fiscalsim_us.model_api import * + + +class vt_medical_expense_deduction(Variable): + value_type = float + entity = TaxUnit + definition_period = YEAR + label = "Vermont medical expense deduction" + reference = ( + "https://legislature.vermont.gov/statutes/section/32/151/05811" # Titl. 32 V.S.A. § 5811(21)(C)(iv) + "https://tax.vermont.gov/sites/tax/files/documents/IN-112%20Instr-2022.pdf#page=2", # Instruction for 2022 SCHEDULE IN-112 - MEDICAL DEDUCTION WORKSHEET + ) + unit = USD + defined_for = StateCode.VT + documentation = "Vermont medical expenses deducted from taxable income." + + def formula(tax_unit, period, parameters): + # Get federal medical expense deduction (Worksheet line 1a). + # This points to federal Form 1040, Schedule A, Line 4, which is the deduction itself + # (not the expenses). + # The law says "an amount equal to the itemized deduction for medical expenses + # taken at the federal level by the taxpayer" but does not state whether the filer + # must have itemized on the federal return to claim it. + # We assume they do not have to, based on the form. + federal_medical_expense_deduction = tax_unit( + "medical_expense_deduction", period + ) + # Get Vermont standard deduction plus personal exemptions (Worksheet line 2). + vt_standard_deduction = tax_unit("vt_standard_deduction", period) + vt_personal_exemptions = tax_unit("vt_personal_exemptions", period) + # Subtract standard deduction plus personal exemptions from vt allowed medical expense deduction and return (Worksheet line 3). + return max_( + 0, + federal_medical_expense_deduction + - vt_standard_deduction + - vt_personal_exemptions, + ) diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_subtractions.py b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_subtractions.py new file mode 100644 index 000000000..440b3835f --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/subtractions/vt_subtractions.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class vt_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "Vermont subtractions" + unit = USD + documentation = "Subtractions from Vermont adjusted gross income" + definition_period = YEAR + defined_for = StateCode.VT + reference = ( + "https://tax.vermont.gov/sites/tax/files/documents/IN-112-2022.pdf#page=1", # PART 1 SUBTRACTIONS TO FEDERAL ADJUSTED GROSS INCOME + "https://legislature.vermont.gov/statutes/section/32/151/05811", # Titl. 32 V.S.A. § 5811(21)(B)(i), (C)(iv), (B)(vi), (B)(ii), (B)(iv) + "https://tax.vermont.gov/sites/tax/files/documents/IN-112%20Instr-2022.pdf", + ) + # Get parameter list + adds = "gov.states.vt.tax.income.agi.subtractions" diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi.py b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi.py index 8d3ac7a63..c8e86fe5e 100644 --- a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi.py +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi.py @@ -11,4 +11,4 @@ class vt_agi(Variable): reference = "https://tax.vermont.gov/sites/tax/files/documents/IN-111-2022.pdf (Line 3)" adds = ["adjusted_gross_income", "vt_agi_additions"] - subtracts = ["vt_agi_subtractions"] + subtracts = ["vt_subtractions"] diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi_additions.py b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi_additions.py index 190443845..c90ae68f4 100644 --- a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi_additions.py +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi_additions.py @@ -4,12 +4,14 @@ class vt_agi_additions(Variable): value_type = float entity = TaxUnit - label = "VT AGI additions" + label = "Vermont AGI additions" unit = USD - documentation = "Additions to VT AGI over federal AGI." + documentation = "Additions to Vermont adjusted gross income" definition_period = YEAR defined_for = StateCode.VT - reference = dict( - title="2022 Schedule IN-112 Vermont Tax Adjustments and Credits, PART 1 ADDITIONS TO FEDERAL ADJUSTED GROSS INCOME", - href="https://tax.vermont.gov/sites/tax/files/documents/IN-112-2022.pdf", + reference = ( + "https://tax.vermont.gov/sites/tax/files/documents/IN-112-2022.pdf#page=1" + "https://legislature.vermont.gov/statutes/section/32/151/05811" ) + + adds = ["tax_exempt_interest_income"] diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi_subtractions.py b/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi_subtractions.py deleted file mode 100644 index ea483c743..000000000 --- a/fiscalsim_us/variables/gov/states/vt/tax/income/adjusted_gross_income/vt_agi_subtractions.py +++ /dev/null @@ -1,15 +0,0 @@ -from fiscalsim_us.model_api import * - - -class vt_agi_subtractions(Variable): - value_type = float - entity = TaxUnit - label = "VT AGI subtractions" - unit = USD - documentation = "Subtractions from VT AGI over federal AGI." - definition_period = YEAR - defined_for = StateCode.VT - reference = dict( - title="2022 Schedule IN-112 Vermont Tax Adjustments and Credits, PART 1 SUBTRACTIONS FROM FEDERAL ADJUSTED GROSS INCOME", - href="https://tax.vermont.gov/sites/tax/files/documents/IN-112-2022.pdf", - ) diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/deductions/vt_standard_deduction.py b/fiscalsim_us/variables/gov/states/vt/tax/income/deductions/vt_standard_deduction.py new file mode 100644 index 000000000..689feaf35 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/deductions/vt_standard_deduction.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class vt_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Vermont standard deduction" + unit = USD + definition_period = YEAR + reference = ( + "https://tax.vermont.gov/sites/tax/files/documents/IN-111-2022.pdf", # Line4 + "http://legislature.vermont.gov/statutes/section/32/151/05811", # Titl. 32 V.S.A. § 5811(21)(C)(ii)(iii) + ) + defined_for = StateCode.VT + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.vt.tax.income.deductions.standard + # Base deduction based on filing status. + filing_status = tax_unit("filing_status", period) + base_deduction = p.base[filing_status] + # Vermont mirrors the federal definition of aged/blind by citing 26 U.S.C. § 63(f). + # The aged_blind_count variable captures this, for head and spouse. + aged_blind_count = tax_unit("aged_blind_count", period) + aged_blind_deduction = aged_blind_count * p.additional + return base_deduction + aged_blind_deduction diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/exemptions/vt_personal_exemptions.py b/fiscalsim_us/variables/gov/states/vt/tax/income/exemptions/vt_personal_exemptions.py new file mode 100644 index 000000000..cd8c1c493 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/exemptions/vt_personal_exemptions.py @@ -0,0 +1,30 @@ +from fiscalsim_us.model_api import * + + +class vt_personal_exemptions(Variable): + value_type = float + entity = TaxUnit + label = "Vermont personal exemptions" + unit = USD + definition_period = YEAR + defined_for = StateCode.VT + reference = ( + "https://tax.vermont.gov/sites/tax/files/documents/IN-111-2022.pdf" + ) + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.vt.tax.income.exemption + # First, Need to determine the tax unit filing status, if they are filing jointly + filing_status = tax_unit("filing_status", period) + is_joint = filing_status == filing_status.possible_values.JOINT + # Then, determine whether either the head or the spouse of the tax unit is claimable as a dependent in another unit. + claimable_elsewhere_head = tax_unit("dsi", period) + claimable_elsewhere_spouse = tax_unit("dsi_spouse", period) + # If claimable elsewhere, it is not eligible for vt personal exemption (line 5a, line 5b) + eligible_head = (~claimable_elsewhere_head).astype(int) + eligible_spouse = (~claimable_elsewhere_spouse).astype(int) + eligible_count = eligible_head + (eligible_spouse * is_joint) + # Last, add number of other dependents claimed on federal Form 1040.(line 5c) + dependents = tax_unit("tax_unit_count_dependents", period) + total_exemption_count = eligible_count + dependents + return total_exemption_count * p.personal diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/vt_eitc.py b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_eitc.py new file mode 100644 index 000000000..2c28349c6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_eitc.py @@ -0,0 +1,16 @@ +from fiscalsim_us.model_api import * + + +class vt_eitc(Variable): + value_type = float + entity = TaxUnit + label = "Vermont earned income tax credit" + unit = USD + definition_period = YEAR + reference = "https://tax.vermont.gov/sites/tax/files/documents/IN-112-2022.pdf#page=1" + defined_for = StateCode.VT + + def formula(tax_unit, period, parameters): + eitc = tax_unit("earned_income_tax_credit", period) + rate = parameters(period).gov.states.vt.tax.income.credits.eitc.match + return eitc * rate diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax.py b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax.py new file mode 100644 index 000000000..a359d95f1 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class vt_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Vermont income tax" + unit = USD + definition_period = YEAR + defined_for = StateCode.VT + adds = ["vt_income_tax_before_refundable_credits"] + subtracts = ["vt_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax_before_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax_before_non_refundable_credits.py new file mode 100644 index 000000000..916dbbffc --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax_before_non_refundable_credits.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class vt_income_tax_before_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Vermont income tax before non-refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.VT + + def formula(tax_unit, period, parameters): + income = tax_unit("vt_taxable_income", period) + filing_status = tax_unit("filing_status", period) + status = filing_status.possible_values + p = parameters(period).gov.states.vt.tax.income.rates + return select( + [ + filing_status == status.SINGLE, + filing_status == status.JOINT, + filing_status == status.SEPARATE, + filing_status == status.WIDOW, + filing_status == status.HEAD_OF_HOUSEHOLD, + ], + [ + p.single.calc(income), + p.joint.calc(income), + p.separate.calc(income), + p.widow.calc(income), + p.head_of_household.calc(income), + ], + ) diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..bdce9252a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_income_tax_before_refundable_credits.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class vt_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Vermont income tax before refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.VT + + def formula(tax_unit, period, parameters): + itax_before_credits = tax_unit( + "vt_income_tax_before_non_refundable_credits", period + ) + non_refundable_credits = tax_unit("vt_non_refundable_credits", period) + return max_(0, itax_before_credits - non_refundable_credits) diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/vt_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_non_refundable_credits.py new file mode 100644 index 000000000..30ea7e733 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_non_refundable_credits.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class vt_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Vermont non-refundable tax credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.VT diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/vt_refundable_credits.py b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_refundable_credits.py new file mode 100644 index 000000000..f89b198b5 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class vt_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Vermont refundable credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.VT + + adds = "gov.states.vt.tax.income.credits.refundable" diff --git a/fiscalsim_us/variables/gov/states/vt/tax/income/vt_taxable_income.py b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_taxable_income.py new file mode 100644 index 000000000..894eebd99 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/vt/tax/income/vt_taxable_income.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class vt_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Vermont taxable income" + unit = USD + documentation = "VT AGI less taxable income deductions and exemptions" + definition_period = YEAR + reference = ( + "https://tax.vermont.gov/sites/tax/files/documents/IN-111-2022.pdf" + ) + defined_for = StateCode.VT + + def formula(tax_unit, period, parameters): + agi = tax_unit("vt_agi", period) + deductions = tax_unit("vt_standard_deduction", period) + exemptions = tax_unit("vt_personal_exemptions", period) + return max_(0, agi - deductions - exemptions) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_capital_gain_loss_addition.py b/fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_capital_gain_loss_addition.py new file mode 100644 index 000000000..948f1e268 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_capital_gain_loss_addition.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class wi_capital_gain_loss_addition(Variable): + value_type = float + entity = TaxUnit + label = "WI capital gain/loss addition to federal adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleAD-inst.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleAD-Inst.pdf#page=2" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + us_capital_loss = tax_unit("limited_capital_loss", period) + wi_capital_loss = tax_unit("wi_capital_loss", period) + return max_(0, us_capital_loss - wi_capital_loss) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_capital_loss.py b/fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_capital_loss.py new file mode 100644 index 000000000..ac6521771 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_capital_loss.py @@ -0,0 +1,23 @@ +from fiscalsim_us.model_api import * + + +class wi_capital_loss(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin capital loss (limited differently than US capital loss)" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleWDf.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleWDf.pdf#page=2" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + # calculate Schedule WD, Line 18 + GAIN_SOURCES = ["short_term_capital_gains", "long_term_capital_gains"] + netcg = add(tax_unit, period, GAIN_SOURCES) + # return Schedule WD, Line 28, as a positive amount as on form + p = parameters(period).gov.states.wi.tax.income.additions + limit = p.capital_loss.limit + return where(netcg < 0, min_(limit, -netcg), 0) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_income_additions.py b/fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_income_additions.py new file mode 100644 index 000000000..2c953beeb --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/additions/wi_income_additions.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class wi_income_additions(Variable): + value_type = float + entity = TaxUnit + label = "WI additions to federal adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleAD.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleAD-inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleADf.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleAD-Inst.pdf" + ) + defined_for = StateCode.WI + adds = "gov.states.wi.tax.income.additions.sources" diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/childcare_expense/wi_childcare_expense_credit.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/childcare_expense/wi_childcare_expense_credit.py new file mode 100644 index 000000000..8576a5753 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/childcare_expense/wi_childcare_expense_credit.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class wi_childcare_expense_credit(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin childcare expense credit" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=17" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + us_cdcc = tax_unit("cdcc", period) + p = parameters(period).gov.states.wi.tax.income + return us_cdcc * p.credits.childcare_expense.fraction diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/earned_income/wi_earned_income_credit.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/earned_income/wi_earned_income_credit.py new file mode 100644 index 000000000..0a4a8e3be --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/earned_income/wi_earned_income_credit.py @@ -0,0 +1,26 @@ +from fiscalsim_us.model_api import * + + +class wi_earned_income_credit(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin earned income credit (WI EITC)" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf#page=26" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=26" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.wi.tax.income.credits + inv_income = tax_unit("eitc_relevant_investment_income", period) + ineligible = inv_income > p.earned_income.investment_income_limit + us_eitc = tax_unit("earned_income_tax_credit", period) + child_count = tax_unit("eitc_child_count", period) + wi_frac = p.earned_income.fraction.calc(child_count) + return ~ineligible * us_eitc * wi_frac diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_credit.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_credit.py new file mode 100644 index 000000000..6e6445843 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_credit.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class wi_homestead_credit(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin homestead credit" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=3" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf#page=27" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=3" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=28" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = "wi_homestead_eligible" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.wi.tax.income.credits + uncapped_ptax = tax_unit("wi_homestead_property_tax", period) + capped_ptax = min_(p.homestead.property_tax.max, uncapped_ptax) + hincome = tax_unit("wi_homestead_income", period) + phase_out_start = p.homestead.phase_out.start + phase_out_rate = p.homestead.phase_out.rate + phase_out = max_(0, hincome - phase_out_start) * phase_out_rate + return max_(0, capped_ptax - phase_out) * p.homestead.rate diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_eligible.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_eligible.py new file mode 100644 index 000000000..cbc5870fa --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_eligible.py @@ -0,0 +1,34 @@ +from fiscalsim_us.model_api import * + + +class wi_homestead_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Wisconsin homestead credit eligibility status" + definition_period = YEAR + reference = "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2021/0013_homestead_tax_credit_informational_paper_13.pdf#page=7" + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.wi.tax.income.credits + # minimum age eligibility + head_age = tax_unit("age_head", period) + spouse_age = tax_unit("age_spouse", period) + min_age = p.homestead.eligible.min_age + age_eligible = (head_age >= min_age) | (spouse_age >= min_age) + # earnings eligibility + earnings = add(tax_unit, period, p.homestead.eligible.earnings_sources) + has_positive_earnings = earnings > 0 + min_elderly_age = p.homestead.eligible.min_elderly_age + head_is_elderly = head_age >= min_elderly_age + spouse_is_elderly = spouse_age >= min_elderly_age + is_elderly = head_is_elderly | spouse_is_elderly + head_is_disabled = tax_unit("head_is_disabled", period) + spouse_is_disabled = tax_unit("spouse_is_disabled", period) + is_disabled = head_is_disabled | spouse_is_disabled + earnings_eligible = has_positive_earnings | is_elderly | is_disabled + # income eligibility + homestead_income = tax_unit("wi_homestead_income", period) + income_eligible = homestead_income < p.homestead.eligible.max_income + # overall eligibility + return age_eligible & earnings_eligible & income_eligible diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_income.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_income.py new file mode 100644 index 000000000..ab710a9c2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_income.py @@ -0,0 +1,20 @@ +from fiscalsim_us.model_api import * + + +class wi_homestead_income(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin homestead credit income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH.pdf" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.wi.tax.income.credits + income = add(tax_unit, period, p.homestead.income.sources) + dependents = tax_unit("tax_unit_dependents", period) + return income - dependents * p.homestead.income.exemption diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_property_tax.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_property_tax.py new file mode 100644 index 000000000..83a6092f8 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/homestead/wi_homestead_property_tax.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class wi_homestead_property_tax(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin homestead credit property tax amount" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleH.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleH.pdf#page=2" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + ptax_owner = add(tax_unit, period, ["real_estate_taxes"]) + rent = add(tax_unit, period, ["rent"]) + p = parameters(period).gov.states.wi.tax.income.credits + ptax_renter = rent * p.homestead.property_tax.rent_ratio + return ptax_owner + ptax_renter diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/itemized_deduction/wi_itemized_deduction_credit.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/itemized_deduction/wi_itemized_deduction_credit.py new file mode 100644 index 000000000..439761d8b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/itemized_deduction/wi_itemized_deduction_credit.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class wi_itemized_deduction_credit(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin itemized deduction credit" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=4" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=4" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf#page=19" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + wi_itmded = tax_unit("itemized_deductions_less_salt", period) + wi_stdded = tax_unit("wi_standard_deduction", period) + excess_itmded = max_(0, wi_itmded - wi_stdded) + p = parameters(period).gov.states.wi.tax.income + return excess_itmded * p.credits.itemized_deduction.rate diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/married_couple/wi_married_couple_credit.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/married_couple/wi_married_couple_credit.py new file mode 100644 index 000000000..661cafbd9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/married_couple/wi_married_couple_credit.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class wi_married_couple_credit(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin married couple credit" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=4" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf#page=21" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=4" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=21" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + fstatus = tax_unit("filing_status", period) + eligible = fstatus == fstatus.possible_values.JOINT + p = parameters(period).gov.states.wi.tax.income.credits + income = add(tax_unit.members, period, p.married_couple.income_sources) + is_head = tax_unit.members("is_tax_unit_head", period) + is_spouse = tax_unit.members("is_tax_unit_spouse", period) + head_income = tax_unit.sum(is_head * income) + spouse_income = tax_unit.sum(is_spouse * income) + lower_income = min_(head_income, spouse_income) + return min_( + eligible * lower_income * p.married_couple.rate, + p.married_couple.max, + ) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/property_tax/wi_property_tax_credit.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/property_tax/wi_property_tax_credit.py new file mode 100644 index 000000000..0d409a199 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/property_tax/wi_property_tax_credit.py @@ -0,0 +1,24 @@ +from fiscalsim_us.model_api import * + + +class wi_property_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin property tax credit" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf#page=17" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=17" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf#page=19" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + rent = add(tax_unit, period, ["rent"]) + ptax = add(tax_unit, period, ["real_estate_taxes"]) + p = parameters(period).gov.states.wi.tax.income.credits.property_tax + proptax = ptax + rent * p.rent_fraction + return min_(p.max, proptax * p.rate) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/wi_nonrefundable_credits.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/wi_nonrefundable_credits.py new file mode 100644 index 000000000..6e580ffe0 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/wi_nonrefundable_credits.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class wi_nonrefundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin nonrefundable credits" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + adds = "gov.states.wi.tax.income.credits.non_refundable" diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/credits/wi_refundable_credits.py b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/wi_refundable_credits.py new file mode 100644 index 000000000..1279662bd --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/credits/wi_refundable_credits.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class wi_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin refundable credits" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + adds = "gov.states.wi.tax.income.credits.refundable" diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_capital_gain_loss_subtraction.py b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_capital_gain_loss_subtraction.py new file mode 100644 index 000000000..432f47511 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_capital_gain_loss_subtraction.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class wi_capital_gain_loss_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin capital gain/loss subtraction from federal AGI" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleWDf.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleWDf.pdf#page=2" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + # calculate Schedule WD, Line 8 + stcg_net = add(tax_unit, period, ["short_term_capital_gains"]) + # calculate Schedule WD, Line 17 + ltcg_net = add(tax_unit, period, ["long_term_capital_gains"]) + # calculate Schedule WD, Line 18 + totcg = max_(0, stcg_net + ltcg_net) + # calculate Schedule WD, Line 20, the capital gain reduction + p = parameters(period).gov.states.wi.tax.income.subtractions + fraction = p.capital_gain.fraction + cg_reduction = min_(totcg, max_(0, ltcg_net)) * fraction + # calculate Schedule WD, Line 27, the WI reduced capital gain + wi_cg = totcg - cg_reduction + # calculate Schedule WD, Line 29a + us_cg = totcg + # return Schedule SB capital gain subtraction (WB Line 29d) + return max_(0, us_cg - wi_cg) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_childcare_expense_subtraction.py b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_childcare_expense_subtraction.py new file mode 100644 index 000000000..6752344b2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_childcare_expense_subtraction.py @@ -0,0 +1,29 @@ +from fiscalsim_us.model_api import * + + +class wi_childcare_expense_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin childcare expense subtraction from federal AGI" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-inst.pdf#page=7" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + subtraction = parameters(period).gov.states.wi.tax.income.subtractions + uncapped_expenses = tax_unit("tax_unit_childcare_expenses", period) + eligible_dependents = tax_unit("count_cdcc_eligible", period) + count_eligible = min_( + eligible_dependents, subtraction.childcare_expense.max_dependents + ) + capped_expenses = min_( + uncapped_expenses, + count_eligible * subtraction.childcare_expense.max_amount, + ) + return min_( + capped_expenses, tax_unit("min_head_spouse_earned", period) + ) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_income_subtractions.py b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_income_subtractions.py new file mode 100644 index 000000000..55e7e4977 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_income_subtractions.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class wi_income_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin subtractions from federal adjusted gross income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSBf.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSB-Inst.pdf" + ) + defined_for = StateCode.WI + adds = "gov.states.wi.tax.income.subtractions.sources" diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_retirement_income_subtraction.py b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_retirement_income_subtraction.py new file mode 100644 index 000000000..6bc4bc9ee --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_retirement_income_subtraction.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class wi_retirement_income_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin retirement income subtraction from federal AGI" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-inst.pdf#page=9" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSBf.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSB-Inst.pdf#page=7" + ) + defined_for = "wi_retirement_income_subtraction_agi_eligible" + + def formula(tax_unit, period, parameters): + p = parameters(period).gov.states.wi.tax.income + psri = p.subtractions.retirement_income + person = tax_unit.members + age = person("age", period) + age_eligible = age >= psri.min_age + retirement_income = person("taxable_pension_income", period) + head_or_spouse = ~person("is_tax_unit_dependent", period) + uncapped_retinc = retirement_income * age_eligible * head_or_spouse + capped_retinc = min_(psri.max_amount, uncapped_retinc) + return tax_unit.sum(capped_retinc) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_retirement_income_subtraction_agi_eligible.py b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_retirement_income_subtraction_agi_eligible.py new file mode 100644 index 000000000..be7174599 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_retirement_income_subtraction_agi_eligible.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class wi_retirement_income_subtraction_agi_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Wisconsin retirement income subtraction AGI eligibility" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-inst.pdf#page=9" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSBf.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSB-Inst.pdf#page=7" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + agi = tax_unit("adjusted_gross_income", period) + fstatus = tax_unit("filing_status", period) + p = parameters(period).gov.states.wi.tax.income + return agi < p.subtractions.retirement_income.max_agi[fstatus] diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_unemployment_compensation_subtraction.py b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_unemployment_compensation_subtraction.py new file mode 100644 index 000000000..dada0130d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/subtractions/wi_unemployment_compensation_subtraction.py @@ -0,0 +1,27 @@ +from fiscalsim_us.model_api import * + + +class wi_unemployment_compensation_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin unemployment compensation subtraction from federal AGI" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-ScheduleSB-inst.pdf#page=2" + "https://www.revenue.wi.gov/TaxForms2022/2022-ScheduleSB-Inst.pdf#page=1" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + us_tuc = add(tax_unit, period, ["taxable_unemployment_compensation"]) + us_agi = tax_unit("adjusted_gross_income", period) + wi = parameters(period).gov.states.wi.tax.income + p = wi.subtractions.unemployment_compensation.income_phase_out + base_income = p.base[tax_unit("filing_status", period)] + us_taxed_socsec = tax_unit("tax_unit_taxable_social_security", period) + ucsub_income = base_income + us_taxed_socsec + excess_inc = max_(0, us_agi - ucsub_income) + tuc_limit = excess_inc * p.rate # WI Unemploy Compen Worksheet, Line 8 + wi_tuc = min_(tuc_limit, us_tuc) + return max_(0, us_tuc - wi_tuc) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/wi_agi.py b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_agi.py new file mode 100644 index 000000000..50050c344 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_agi.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class wi_agi(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin Adjusted Gross Income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf" + ) + defined_for = StateCode.WI + adds = ["adjusted_gross_income", "wi_income_additions"] + subtracts = ["wi_income_subtractions"] diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/wi_exemption.py b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_exemption.py new file mode 100644 index 000000000..cd8021bc2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_exemption.py @@ -0,0 +1,32 @@ +from fiscalsim_us.model_api import * + + +class wi_exemption(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin exemption" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + # compute base exemption amount + p = parameters(period).gov.states.wi.tax.income + base_amount = tax_unit("xtot", period) * p.exemption.base + # compute extra exemption amount + elderly_head = ( + tax_unit("age_head", period) >= p.exemption.old_age + ).astype(int) + elderly_spouse = ( + tax_unit("age_spouse", period) >= p.exemption.old_age + ).astype(int) + extra_amount = (elderly_head + elderly_spouse) * p.exemption.extra + # return total exemption amount + return base_amount + extra_amount diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_before_credits.py b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_before_credits.py new file mode 100644 index 000000000..8fe0dc5f9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_before_credits.py @@ -0,0 +1,38 @@ +from fiscalsim_us.model_api import * + + +class wi_income_tax_before_credits(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin income tax before credits" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + taxinc = tax_unit("wi_taxable_income", period) + fstatus = tax_unit("filing_status", period) + p = parameters(period).gov.states.wi.tax.income + return select( + [ + fstatus == fstatus.possible_values.SINGLE, + fstatus == fstatus.possible_values.JOINT, + fstatus == fstatus.possible_values.WIDOW, + fstatus == fstatus.possible_values.SEPARATE, + fstatus == fstatus.possible_values.HEAD_OF_HOUSEHOLD, + ], + [ + p.rates.single.calc(taxinc), + p.rates.joint.calc(taxinc), + p.rates.joint.calc(taxinc), + p.rates.separate.calc(taxinc), + p.rates.head_of_household.calc(taxinc), + ], + ) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_tax.py b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_tax.py new file mode 100644 index 000000000..59dac80e1 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_tax.py @@ -0,0 +1,18 @@ +from fiscalsim_us.model_api import * + + +class wi_income_tax(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin income tax" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf#page=3" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf#page=31" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf#page=3" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf#page=31" + ) + defined_for = StateCode.WI + adds = ["wi_income_tax_before_refundable_credits"] + subtracts = ["wi_refundable_credits"] diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..0e349ee7b --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_income_tax_before_refundable_credits.py @@ -0,0 +1,22 @@ +from fiscalsim_us.model_api import * + + +class wi_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin income tax before refundable credits" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + income_tax_before = tax_unit("wi_income_tax_before_credits", period) + nonrefundable_credits = tax_unit("wi_nonrefundable_credits", period) + return max_(0, income_tax_before - nonrefundable_credits) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py new file mode 100644 index 000000000..ee17e379a --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_standard_deduction.py @@ -0,0 +1,40 @@ +from fiscalsim_us.model_api import * + + +class wi_standard_deduction(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin standard deduction" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + fstatus = tax_unit("filing_status", period) + deduction = parameters(period).gov.states.wi.tax.income.deductions + max_amount = deduction.standard.max[fstatus] + agi = tax_unit("wi_agi", period) + phase_out_amount = select( + [ + fstatus == fstatus.possible_values.SINGLE, + fstatus == fstatus.possible_values.JOINT, + fstatus == fstatus.possible_values.WIDOW, + fstatus == fstatus.possible_values.SEPARATE, + fstatus == fstatus.possible_values.HEAD_OF_HOUSEHOLD, + ], + [ + deduction.standard.phase_out.single.calc(agi), + deduction.standard.phase_out.joint.calc(agi), + deduction.standard.phase_out.joint.calc(agi), + deduction.standard.phase_out.separate.calc(agi), + deduction.standard.phase_out.head_of_household.calc(agi), + ], + ) + return max_(0, max_amount - phase_out_amount) diff --git a/fiscalsim_us/variables/gov/states/wi/tax/income/wi_taxable_income.py b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_taxable_income.py new file mode 100644 index 000000000..6207d8080 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wi/tax/income/wi_taxable_income.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class wi_taxable_income(Variable): + value_type = float + entity = TaxUnit + label = "Wisconsin taxable income" + unit = USD + definition_period = YEAR + reference = ( + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2021/2021-Form1-Inst.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1f.pdf" + "https://www.revenue.wi.gov/TaxForms2022/2022-Form1-Inst.pdf" + "https://docs.legis.wisconsin.gov/misc/lfb/informational_papers/january_2023/0002_individual_income_tax_informational_paper_2.pdf" + ) + defined_for = StateCode.WI + + def formula(tax_unit, period, parameters): + taxinc = ( + tax_unit("wi_agi", period) + - tax_unit("wi_standard_deduction", period) + - tax_unit("wi_exemption", period) + ) + return max_(0, taxinc) diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_sctc.py b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_sctc.py new file mode 100644 index 000000000..93269cee2 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_sctc.py @@ -0,0 +1,19 @@ +from fiscalsim_us.model_api import * + + +class wv_sctc(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia senior citizens tax credit" + defined_for = "wv_sctc_eligible" + unit = USD + definition_period = YEAR + reference = "https://code.wvlegislature.gov/11-21-21/" + + def formula(tax_unit, period, parameters): + wv_taxable_property_value = tax_unit( + "wv_taxable_property_value", period + ) + p = parameters(period).gov.states.wv.tax.income.credits.sctc + + return min_(wv_taxable_property_value, p.max_amount) diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_sctc_eligible.py b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_sctc_eligible.py new file mode 100644 index 000000000..c66662f3e --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_sctc_eligible.py @@ -0,0 +1,35 @@ +from fiscalsim_us.model_api import * + + +class wv_sctc_eligible(Variable): + value_type = bool + entity = TaxUnit + label = "Eligible for the West Virginia senior citizens tax credit" + reference = ( + "https://code.wvlegislature.gov/11-21-21/" + "https://tax.wv.gov/Documents/TaxForms/2021/it140.pdf#page=27 " + "https://tax.wv.gov/Documents/PIT/2022/PersonalIncomeTaxFormsAndInstructions.2022.pdf#page=35" + ) + definition_period = YEAR + defined_for = StateCode.WV + + # The senior citizens tax credit is used to calculate the Homestead access property tax credit + # and provides a credit against property taxes as opposed to income taxes + def formula(tax_unit, period, parameters): + federal_agi = tax_unit("adjusted_gross_income", period) + wv_homestead_exemption = tax_unit("wv_homestead_exemption", period) + + p_sctc = parameters(period).gov.states.wv.tax.income.credits.sctc + p_homestead = parameters( + period + ).gov.states.wv.tax.income.exemptions.homestead_exemption + + fpg = tax_unit("tax_unit_fpg", period) + income_threshold = p_sctc.fpg_percentage * fpg + + meets_agi_condition = federal_agi <= income_threshold + meets_homestead_exemption_condition = ( + wv_homestead_exemption == p_homestead.max_amount + ) + + return meets_agi_condition & meets_homestead_exemption_condition diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_taxable_property_value.py b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_taxable_property_value.py new file mode 100644 index 000000000..942600f73 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/sctc/wv_taxable_property_value.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class wv_taxable_property_value(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia taxable property value" + defined_for = StateCode.WV + unit = USD + definition_period = YEAR + reference = "https://code.wvlegislature.gov/11-21-21/" + + adds = ["assessed_property_value"] + subtracts = ["wv_homestead_exemption"] diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit.py b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit.py new file mode 100644 index 000000000..85c9d962c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit.py @@ -0,0 +1,46 @@ +from fiscalsim_us.model_api import * + + +class wv_low_income_family_tax_credit(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia low-income family tax credit" + unit = USD + definition_period = YEAR + defined_for = StateCode.WV + + def formula(tax_unit, period, parameters): + filing_status = tax_unit("filing_status", period) + filing_statuses = filing_status.possible_values + p = parameters( + period + ).gov.states.wv.tax.income.credits.low_income_family_tax_credit + + wv_agi = tax_unit("wv_agi", period) + fpg = tax_unit("wv_low_income_family_tax_credit_fpg", period) + # modified agi limit + fpg_amount = p.fpg_percent[filing_status] * fpg + reduced_agi = wv_agi - fpg_amount + + credit_percentage = select( + [ + filing_status == filing_statuses.SINGLE, + filing_status == filing_statuses.SEPARATE, + filing_status == filing_statuses.JOINT, + filing_status == filing_statuses.HEAD_OF_HOUSEHOLD, + filing_status == filing_statuses.WIDOW, + ], + [ + p.amount.single.calc(reduced_agi), + p.amount.separate.calc(reduced_agi), + p.amount.joint.calc(reduced_agi), + p.amount.head_of_household.calc(reduced_agi), + p.amount.widow.calc(reduced_agi), + ], + ) + + tax_before_credits = tax_unit( + "wv_income_tax_before_non_refundable_credits", period + ) + + return tax_before_credits * credit_percentage diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit_fpg.py b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit_fpg.py new file mode 100644 index 000000000..8595ff08f --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/credits/wv_low_income_family_tax_credit_fpg.py @@ -0,0 +1,25 @@ +from fiscalsim_us.model_api import * + + +class wv_low_income_family_tax_credit_fpg(Variable): + value_type = float + entity = TaxUnit + label = "Federal poverty guidelines for the West Virginia low-income family tax credit" + unit = USD + definition_period = YEAR + defined_for = StateCode.WV + + def formula(tax_unit, period, parameters): + p = parameters( + period + ).gov.states.wv.tax.income.credits.low_income_family_tax_credit + + # max family size limit + n = tax_unit("tax_unit_size", period) + state_group = tax_unit.household("state_group", period) + + p_fpg = parameters(period).gov.hhs.fpg + p1 = p_fpg.first_person[state_group] + pn = p_fpg.additional_person[state_group] + family_size = min_(n, p.max_family_size) + return p1 + pn * (family_size - 1) diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/exemptions/homestead_exemption/wv_homestead_exemption.py b/fiscalsim_us/variables/gov/states/wv/tax/income/exemptions/homestead_exemption/wv_homestead_exemption.py new file mode 100644 index 000000000..5e9eee3df --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/exemptions/homestead_exemption/wv_homestead_exemption.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class wv_homestead_exemption(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia homestead exemption" + defined_for = StateCode.WV + unit = USD + definition_period = YEAR + reference = "https://code.wvlegislature.gov/11-21-21/" + + def formula(tax_unit, period, parameters): + assessed_property_value = add( + tax_unit, period, ["assessed_property_value"] + ) + p = parameters( + period + ).gov.states.wv.tax.income.exemptions.homestead_exemption + + return min_(assessed_property_value, p.max_amount) diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/subtractions/wv_low_income_earned_income_exclusion.py b/fiscalsim_us/variables/gov/states/wv/tax/income/subtractions/wv_low_income_earned_income_exclusion.py new file mode 100644 index 000000000..5c5fbd29c --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/subtractions/wv_low_income_earned_income_exclusion.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class wv_low_income_earned_income_exclusion(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia low-income earned income exclusion" + defined_for = StateCode.WV + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/subtractions/wv_public_pension_subtraction.py b/fiscalsim_us/variables/gov/states/wv/tax/income/subtractions/wv_public_pension_subtraction.py new file mode 100644 index 000000000..3ec75e4d6 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/subtractions/wv_public_pension_subtraction.py @@ -0,0 +1,28 @@ +from fiscalsim_us.model_api import * + + +class wv_public_pension_subtraction(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia public pension subtraction" + defined_for = StateCode.WV + unit = USD + definition_period = YEAR + reference = "https://code.wvlegislature.gov/11-21-12/" + + def formula(tax_unit, period, parameters): + person = tax_unit.members + # "benefits received under any federal retirement system to which Title 4 U.S.C. §111 applies" + # https://www.law.cornell.edu/uscode/text/4/111 + federal_pension_income = person( + "taxable_federal_pension_income", period + ) + p = parameters( + period + ).gov.states.wv.tax.income.subtractions.public_pension + person_capped = min_(federal_pension_income, p.max_amount) + # Only applies to head and spouse. + head_spouse_capped = person_capped * ~person( + "is_tax_unit_dependent", period + ) + return tax_unit.sum(head_spouse_capped) diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_additions.py b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_additions.py new file mode 100644 index 000000000..b9518d078 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_additions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class wv_additions(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia additions to the adjusted gross income" + unit = USD + definition_period = YEAR + defined_for = StateCode.WV diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_agi.py b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_agi.py new file mode 100644 index 000000000..0a57021b9 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_agi.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class wv_agi(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia adjusted gross income" + unit = USD + definition_period = YEAR + defined_for = StateCode.WV + + adds = ["adjusted_gross_income", "wv_additions"] + subtracts = ["wv_subtractions"] diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_credits.py b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_non_refundable_credits.py similarity index 89% rename from fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_credits.py rename to fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_non_refundable_credits.py index 82baa76de..e6c00fcae 100644 --- a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_credits.py +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_non_refundable_credits.py @@ -1,10 +1,10 @@ from fiscalsim_us.model_api import * -class wv_income_tax_before_credits(Variable): +class wv_income_tax_before_non_refundable_credits(Variable): value_type = float entity = TaxUnit - label = "WV income tax before credits" + label = "West Virginia income tax before non-refundable tax credits" unit = USD definition_period = YEAR defined_for = StateCode.WV diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_refundable_credits.py b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_refundable_credits.py new file mode 100644 index 000000000..dad9f45c4 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_income_tax_before_refundable_credits.py @@ -0,0 +1,17 @@ +from fiscalsim_us.model_api import * + + +class wv_income_tax_before_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia income tax before refundable tax credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.WV + + def formula(tax_unit, period, parameters): + tax_before_credits = tax_unit( + "wv_income_tax_before_non_refundable_credits", period + ) + credits = tax_unit("wv_non_refundable_credits", period) + return max_(tax_before_credits - credits, 0) diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_non_refundable_credits.py b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_non_refundable_credits.py new file mode 100644 index 000000000..464837f8d --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_non_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class wv_non_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia refundable tax credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.WV + + adds = "gov.states.wv.tax.income.credits.non_refundable" diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_refundable_credits.py b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_refundable_credits.py new file mode 100644 index 000000000..47c96ccef --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_refundable_credits.py @@ -0,0 +1,12 @@ +from fiscalsim_us.model_api import * + + +class wv_refundable_credits(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia refundable tax credits" + unit = USD + definition_period = YEAR + defined_for = StateCode.WV + + adds = "gov.states.wv.tax.income.credits.refundable" diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_subtractions.py b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_subtractions.py new file mode 100644 index 000000000..da6365d90 --- /dev/null +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_subtractions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class wv_subtractions(Variable): + value_type = float + entity = TaxUnit + label = "West Virginia subtractions from the adjusted gross income" + unit = USD + definition_period = YEAR + defined_for = StateCode.WV diff --git a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_taxable_income.py b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_taxable_income.py index ac5f97c64..0712dc35b 100644 --- a/fiscalsim_us/variables/gov/states/wv/tax/income/wv_taxable_income.py +++ b/fiscalsim_us/variables/gov/states/wv/tax/income/wv_taxable_income.py @@ -9,3 +9,11 @@ class wv_taxable_income(Variable): definition_period = YEAR reference = "https://code.wvlegislature.gov/11-21-4E/" defined_for = StateCode.WV + + def formula(tax_unit, period, parameters): + agi = tax_unit("wv_agi", period) + low_income_exclusion = tax_unit( + "wv_low_income_earned_income_exclusion", period + ) + exemptions = tax_unit("wv_personal_exemption", period) + return max_(agi - low_income_exclusion - exemptions, 0) diff --git a/fiscalsim_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py b/fiscalsim_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py index d4dca996b..6ff8efbef 100644 --- a/fiscalsim_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py +++ b/fiscalsim_us/variables/gov/usda/snap/eligibility/is_snap_eligible.py @@ -6,7 +6,7 @@ class is_snap_eligible(Variable): entity = SPMUnit label = "SNAP eligible" documentation = "Whether this SPM unit is eligible for SNAP benefits" - definition_period = YEAR + definition_period = MONTH reference = ( "https://www.law.cornell.edu/uscode/text/7/2017#a", "https://www.law.cornell.edu/uscode/text/7/2014#c", diff --git a/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_asset_test.py b/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_asset_test.py index 2fa6ccf42..b91f9c315 100644 --- a/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_asset_test.py +++ b/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_asset_test.py @@ -5,7 +5,6 @@ class meets_snap_asset_test(Variable): value_type = bool entity = SPMUnit label = "Meets SNAP asset test" - unit = USD documentation = "Whether the SPM unit's financial resources are within SNAP's allowable limit" definition_period = YEAR diff --git a/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_gross_income_test.py b/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_gross_income_test.py index b25525d1e..451221b3d 100644 --- a/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_gross_income_test.py +++ b/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_gross_income_test.py @@ -6,7 +6,7 @@ class meets_snap_gross_income_test(Variable): entity = SPMUnit label = "Meets SNAP gross income test" documentation = "Whether this SPM unit meets the SNAP gross income test" - definition_period = YEAR + definition_period = MONTH reference = ( "https://www.law.cornell.edu/uscode/text/7/2017#a", "https://www.law.cornell.edu/uscode/text/7/2014#c", diff --git a/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_net_income_test.py b/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_net_income_test.py index 1046c123c..1b86063dc 100644 --- a/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_net_income_test.py +++ b/fiscalsim_us/variables/gov/usda/snap/eligibility/meets_snap_net_income_test.py @@ -6,7 +6,7 @@ class meets_snap_net_income_test(Variable): entity = SPMUnit label = "Meets SNAP net income test" documentation = "Whether this SPM unit meets the SNAP net income test" - definition_period = YEAR + definition_period = MONTH reference = ( "https://www.law.cornell.edu/uscode/text/7/2017#a", "https://www.law.cornell.edu/uscode/text/7/2014#c", diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_excess_shelter_expense_deduction.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_excess_shelter_expense_deduction.py index 5a8530dff..09098d8f5 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_excess_shelter_expense_deduction.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_excess_shelter_expense_deduction.py @@ -4,7 +4,7 @@ class snap_excess_shelter_expense_deduction(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = ( "Excess shelter expense deduction for calculating SNAP benefit amount" ) @@ -26,7 +26,7 @@ def formula(spm_unit, period, parameters): uncapped_ded = max_(housing_cost - subtracted_income, 0) # Calculate capped deduction based on state group parameter. state_group = spm_unit.household("snap_region_str", period) - ded_cap = p.cap[state_group] * MONTHS_IN_YEAR + ded_cap = p.cap[state_group] capped_ded = min_(uncapped_ded, ded_cap) has_elderly_disabled = spm_unit("has_usda_elderly_disabled", period) # Cap for all but elderly/disabled people and add utility allowance. @@ -35,9 +35,7 @@ def formula(spm_unit, period, parameters): ) + spm_unit("snap_utility_allowance", period) # Homeless shelter deduction is flat and has no utility component. state = spm_unit.household("state_code_str", period) - homeless_deduction = ( - p.homeless.deduction * MONTHS_IN_YEAR * p.homeless.available[state] - ) + homeless_deduction = p.homeless.deduction * p.homeless.available[state] return where( spm_unit.household("is_homeless", period) & (housing_cost > 0) diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_net_income_pre_shelter.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_net_income_pre_shelter.py index da2c6bcbd..f16b0c83c 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_net_income_pre_shelter.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_net_income_pre_shelter.py @@ -4,7 +4,7 @@ class snap_net_income_pre_shelter(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = "SNAP net income before the shelter deduction, needed as intermediate to calculate shelter deduction" label = "SNAP net income (pre-shelter)" unit = USD diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_utility_allowance.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_utility_allowance.py index 57afe6bc5..30606367d 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_utility_allowance.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_utility_allowance.py @@ -7,7 +7,7 @@ class snap_utility_allowance(Variable): label = "Standard Utility Allowance" unit = USD documentation = "The regular utility allowance deduction for SNAP" - definition_period = YEAR + definition_period = MONTH def formula(spm_unit, period, parameters): utility = parameters(period).gov.usda.snap.income.deductions.utility diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_utility_allowance_type.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_utility_allowance_type.py index 1eb39359c..26a8623b4 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_utility_allowance_type.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/shelter/snap_utility_allowance_type.py @@ -17,7 +17,7 @@ class snap_utility_allowance_type(Variable): documentation = ( "The type of utility allowance that is eligible for the SPM unit" ) - definition_period = YEAR + definition_period = MONTH def formula(spm_unit, period, parameters): distinct_utility_bills = spm_unit( diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_child_support_deduction.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_child_support_deduction.py index f833a3550..347c06ea2 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_child_support_deduction.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_child_support_deduction.py @@ -9,13 +9,7 @@ class snap_child_support_deduction(Variable): documentation = ( "Deduction from SNAP gross income for child support payments" ) - definition_period = YEAR + definition_period = MONTH reference = "https://www.law.cornell.edu/uscode/text/7/2014#e_4" - def formula(spm_unit, period, parameters): - child_support = add(spm_unit, period, ["child_support_expense"]) - state = spm_unit.household("state_code_str", period) - is_deductible = parameters( - period - ).gov.usda.snap.income.deductions.child_support[state] - return where(is_deductible, child_support, 0) + adds = ["child_support_expense"] diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_deductions.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_deductions.py index 7252b0cb9..16646e537 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_deductions.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_deductions.py @@ -7,7 +7,7 @@ class snap_deductions(Variable): label = "SNAP income deductions" unit = USD documentation = "Deductions made from gross income for SNAP benefits" - definition_period = YEAR + definition_period = MONTH reference = "https://www.law.cornell.edu/uscode/text/7/2014#e" adds = "gov.usda.snap.income.deductions.allowed" diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_dependent_care_deduction.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_dependent_care_deduction.py index 144b3bd7d..e3592bf64 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_dependent_care_deduction.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_dependent_care_deduction.py @@ -7,7 +7,7 @@ class snap_dependent_care_deduction(Variable): label = "SNAP dependent care deduction" unit = USD documentation = "Deduction from SNAP gross income for dependent care" - definition_period = YEAR + definition_period = MONTH reference = "https://www.law.cornell.edu/uscode/text/7/2014#e_3" adds = ["childcare_expenses"] diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_earned_income_deduction.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_earned_income_deduction.py index 36fe572e5..604622c8a 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_earned_income_deduction.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_earned_income_deduction.py @@ -4,7 +4,7 @@ class snap_earned_income_deduction(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = ( "Earned income deduction for calculating SNAP benefit amount" ) diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_excess_medical_expense_deduction.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_excess_medical_expense_deduction.py index 52a3397f9..99e24a0e6 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_excess_medical_expense_deduction.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_excess_medical_expense_deduction.py @@ -9,7 +9,7 @@ class snap_excess_medical_expense_deduction(Variable): documentation = ( "Deduction from SNAP gross income for excess medical expenses" ) - definition_period = YEAR + definition_period = MONTH reference = "https://www.law.cornell.edu/uscode/text/7/2014#e_5" def formula(spm_unit, period, parameters): @@ -23,11 +23,11 @@ def formula(spm_unit, period, parameters): p = parameters( period ).gov.usda.snap.income.deductions.excess_medical_expense - disregard = p.disregard * MONTHS_IN_YEAR + disregard = p.disregard excess = max_(elderly_disabled_moop - disregard, 0) # Calculate standard medical deduction (SMD). state = spm_unit.household("state_code_str", period) - standard = p.standard[state] * MONTHS_IN_YEAR + standard = p.standard[state] standard_claimable = where(excess > 0, standard, 0) # Return the greater of SMD and normal deduction. return max_(excess, standard_claimable) diff --git a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_standard_deduction.py b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_standard_deduction.py index 01bd3b872..8f1f19a64 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_standard_deduction.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/deductions/snap_standard_deduction.py @@ -4,7 +4,7 @@ class snap_standard_deduction(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = "Standard deduction for calculating SNAP benefit amount" label = "SNAP standard deduction" unit = USD @@ -16,7 +16,4 @@ def formula(spm_unit, period, parameters): ).gov.usda.snap.income.deductions.standard state_group = spm_unit.household("state_group_str", period) capped_household_size = min_(spm_unit("spm_unit_size", period), 6) - return ( - standard_deductions[state_group][capped_household_size] - * MONTHS_IN_YEAR - ) + return standard_deductions[state_group][capped_household_size] diff --git a/fiscalsim_us/variables/gov/usda/snap/income/gross/snap_child_support_gross_income_deduction.py b/fiscalsim_us/variables/gov/usda/snap/income/gross/snap_child_support_gross_income_deduction.py new file mode 100644 index 000000000..ee9e7d0ac --- /dev/null +++ b/fiscalsim_us/variables/gov/usda/snap/income/gross/snap_child_support_gross_income_deduction.py @@ -0,0 +1,21 @@ +from fiscalsim_us.model_api import * + + +class snap_child_support_gross_income_deduction(Variable): + value_type = float + entity = SPMUnit + label = "SNAP child support payment deduction from gross income" + unit = USD + documentation = ( + "Deduction for child support payments when computing SNAP gross income" + ) + definition_period = MONTH + reference = "https://www.law.cornell.edu/uscode/text/7/2014#e_4" + + def formula(spm_unit, period, parameters): + child_support = add(spm_unit, period, ["child_support_expense"]) + state = spm_unit.household("state_code_str", period) + is_deductible = parameters( + period + ).gov.usda.snap.income.deductions.child_support[state] + return is_deductible * child_support diff --git a/fiscalsim_us/variables/gov/usda/snap/income/snap_gross_income.py b/fiscalsim_us/variables/gov/usda/snap/income/gross/snap_gross_income.py similarity index 64% rename from fiscalsim_us/variables/gov/usda/snap/income/snap_gross_income.py rename to fiscalsim_us/variables/gov/usda/snap/income/gross/snap_gross_income.py index 6fcfa4884..6b2a6f0ed 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/snap_gross_income.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/gross/snap_gross_income.py @@ -4,10 +4,13 @@ class snap_gross_income(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH label = "SNAP gross income" documentation = "Gross income for calculating SNAP eligibility" reference = "https://www.law.cornell.edu/uscode/text/7/2014#d" unit = USD adds = ["snap_earned_income", "snap_unearned_income"] + # Only child support can be subtracted when computing gross income, + # and only in certain states. + subtracts = ["snap_child_support_gross_income_deduction"] diff --git a/fiscalsim_us/variables/gov/usda/snap/income/snap_gross_income_fpg_ratio.py b/fiscalsim_us/variables/gov/usda/snap/income/gross/snap_gross_income_fpg_ratio.py similarity index 84% rename from fiscalsim_us/variables/gov/usda/snap/income/snap_gross_income_fpg_ratio.py rename to fiscalsim_us/variables/gov/usda/snap/income/gross/snap_gross_income_fpg_ratio.py index dc51d5976..6b4b3049f 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/snap_gross_income_fpg_ratio.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/gross/snap_gross_income_fpg_ratio.py @@ -4,7 +4,7 @@ class snap_gross_income_fpg_ratio(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH label = "SNAP gross income to FPL ratio" documentation = ( "SNAP gross income as a percentage of the federal poverty line" @@ -13,5 +13,5 @@ class snap_gross_income_fpg_ratio(Variable): def formula(spm_unit, period): income = spm_unit("snap_gross_income", period) - fpg = spm_unit("spm_unit_fpg", period) + fpg = spm_unit("snap_fpg", period) return income / fpg diff --git a/fiscalsim_us/variables/gov/usda/snap/income/snap_earned_income.py b/fiscalsim_us/variables/gov/usda/snap/income/snap_earned_income.py index b345f13fa..30462248b 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/snap_earned_income.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/snap_earned_income.py @@ -4,7 +4,7 @@ class snap_earned_income(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH label = "SNAP earned income" documentation = ( "Earned income for calculating the SNAP earned income deduction" diff --git a/fiscalsim_us/variables/gov/usda/snap/income/snap_fpg.py b/fiscalsim_us/variables/gov/usda/snap/income/snap_fpg.py new file mode 100644 index 000000000..e7e36fb9f --- /dev/null +++ b/fiscalsim_us/variables/gov/usda/snap/income/snap_fpg.py @@ -0,0 +1,26 @@ +from fiscalsim_us.model_api import * + + +class snap_fpg(Variable): + value_type = float + entity = SPMUnit + label = "SNAP federal poverty guideline" + unit = USD + documentation = ( + "The federal poverty guideline used to determine SNAP eligibility." + ) + definition_period = MONTH + + def formula(spm_unit, period, parameters): + n = spm_unit("spm_unit_size", period.this_year) + state_group = spm_unit.household("state_group_str", period.this_year) + year = period.start.year + month = period.start.month + if month >= 10: + instant_str = f"{year}-10-01" + else: + instant_str = f"{year - 1}-10-01" + p_fpg = parameters(instant_str).gov.hhs.fpg + p1 = p_fpg.first_person[state_group] / MONTHS_IN_YEAR + pn = p_fpg.additional_person[state_group] / MONTHS_IN_YEAR + return p1 + pn * (n - 1) diff --git a/fiscalsim_us/variables/gov/usda/snap/income/snap_net_income.py b/fiscalsim_us/variables/gov/usda/snap/income/snap_net_income.py index f9b447844..6104ca78b 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/snap_net_income.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/snap_net_income.py @@ -4,7 +4,7 @@ class snap_net_income(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = "Final net income, after all deductions" label = "SNAP net income" unit = USD diff --git a/fiscalsim_us/variables/gov/usda/snap/income/snap_net_income_fpg_ratio.py b/fiscalsim_us/variables/gov/usda/snap/income/snap_net_income_fpg_ratio.py index 6ab90656b..919362b3e 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/snap_net_income_fpg_ratio.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/snap_net_income_fpg_ratio.py @@ -4,7 +4,7 @@ class snap_net_income_fpg_ratio(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH label = "SNAP net income to FPL ratio" documentation = ( "SNAP net income as a percentage of the federal poverty line" @@ -13,5 +13,5 @@ class snap_net_income_fpg_ratio(Variable): def formula(spm_unit, period): income = spm_unit("snap_net_income", period) - fpg = spm_unit("spm_unit_fpg", period) + fpg = spm_unit("snap_fpg", period) return income / fpg diff --git a/fiscalsim_us/variables/gov/usda/snap/income/snap_unearned_income.py b/fiscalsim_us/variables/gov/usda/snap/income/snap_unearned_income.py index d659fb037..99d7bc72b 100644 --- a/fiscalsim_us/variables/gov/usda/snap/income/snap_unearned_income.py +++ b/fiscalsim_us/variables/gov/usda/snap/income/snap_unearned_income.py @@ -4,7 +4,7 @@ class snap_unearned_income(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH label = "SNAP unearned income" documentation = "Unearned income for calculating the SNAP benefit" reference = "https://www.law.cornell.edu/cfr/text/7/273.9#b_2" diff --git a/fiscalsim_us/variables/gov/usda/snap/snap.py b/fiscalsim_us/variables/gov/usda/snap/snap.py index c850d5e39..131ecacf8 100644 --- a/fiscalsim_us/variables/gov/usda/snap/snap.py +++ b/fiscalsim_us/variables/gov/usda/snap/snap.py @@ -4,7 +4,7 @@ class snap(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = "Final SNAP benefit amount, equal to net income minus food contribution" label = "SNAP allotment" reference = "https://www.law.cornell.edu/uscode/text/7/2017#a" diff --git a/fiscalsim_us/variables/gov/usda/snap/snap_emergency_allotment.py b/fiscalsim_us/variables/gov/usda/snap/snap_emergency_allotment.py index a0e4c788b..a8930b7b5 100644 --- a/fiscalsim_us/variables/gov/usda/snap/snap_emergency_allotment.py +++ b/fiscalsim_us/variables/gov/usda/snap/snap_emergency_allotment.py @@ -4,16 +4,28 @@ class snap_emergency_allotment(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = "SNAP emergency allotment" label = "SNAP emergency allotment" reference = "https://www.law.cornell.edu/uscode/text/7/2017#a" unit = USD def formula(spm_unit, period, parameters): - snap_ea = 0 - for month in period.get_subperiods("month"): - snap_ea = snap_ea + spm_unit( - "snap_emergency_allotment_monthly", month - ) - return snap_ea + # Save time by only recalculating the EA parameters for each month, + # rather than the whole parameter tree for each month. + p = parameters.gov.usda.snap.emergency_allotment(period) + if not p.allowed: + return 0 + # Federal SNAP rules are defined in U.S.C Title 7, Chapter 51, which also + # defines state powers to modify the rules. + eligible = spm_unit("is_snap_eligible", period) + max_allotment = spm_unit("snap_max_allotment", period) + normal_allotment = spm_unit("snap_normal_allotment", period) + # Calculate emergency allotment, which provides all eligible households the maximum. + state = spm_unit.household("state_code", period) + ea_in_effect = p.in_effect[state] + ea_minimum = p.minimum + ea_amount_if_in_effect = max_( + ea_minimum, max_allotment - normal_allotment + ) + return eligible * ea_in_effect * ea_amount_if_in_effect diff --git a/fiscalsim_us/variables/gov/usda/snap/snap_emergency_allotment_monthly.py b/fiscalsim_us/variables/gov/usda/snap/snap_emergency_allotment_monthly.py deleted file mode 100644 index 4e524093d..000000000 --- a/fiscalsim_us/variables/gov/usda/snap/snap_emergency_allotment_monthly.py +++ /dev/null @@ -1,31 +0,0 @@ -from fiscalsim_us.model_api import * - - -class snap_emergency_allotment_monthly(Variable): - value_type = float - entity = SPMUnit - definition_period = MONTH - documentation = "SNAP emergency allotment" - label = "SNAP emergency allotment" - reference = "https://www.law.cornell.edu/uscode/text/7/2017#a" - unit = USD - - def formula(spm_unit, period, parameters): - # Save time by only recalculating the EA parameters for each month, - # rather than the whole parameter tree for each month. - p = parameters.gov.usda.snap.emergency_allotment(period) - if not p.allowed: - return 0 - # Federal SNAP rules are defined in U.S.C Title 7, Chapter 51, which also - # defines state powers to modify the rules. - eligible = spm_unit("is_snap_eligible", period.this_year) - max_allotment = spm_unit("snap_max_allotment", period.this_year) - normal_allotment = spm_unit("snap_normal_allotment", period.this_year) - # Calculate emergency allotment, which provides all eligible households the maximum. - state = spm_unit.household("state_code", period.this_year) - ea_in_effect = p.in_effect[state] - ea_minimum = p.minimum * MONTHS_IN_YEAR - ea_amount_if_in_effect = ( - max_(ea_minimum, max_allotment - normal_allotment) / MONTHS_IN_YEAR - ) - return eligible * ea_in_effect * ea_amount_if_in_effect diff --git a/fiscalsim_us/variables/gov/usda/snap/snap_expected_contribution.py b/fiscalsim_us/variables/gov/usda/snap/snap_expected_contribution.py index 9789a5095..25e861bdc 100644 --- a/fiscalsim_us/variables/gov/usda/snap/snap_expected_contribution.py +++ b/fiscalsim_us/variables/gov/usda/snap/snap_expected_contribution.py @@ -4,7 +4,7 @@ class snap_expected_contribution(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = "Expected food contribution from SNAP net income" label = "SNAP expected food contribution" unit = USD diff --git a/fiscalsim_us/variables/gov/usda/snap/snap_max_allotment.py b/fiscalsim_us/variables/gov/usda/snap/snap_max_allotment.py index ca2d1bda9..7c122c10b 100644 --- a/fiscalsim_us/variables/gov/usda/snap/snap_max_allotment.py +++ b/fiscalsim_us/variables/gov/usda/snap/snap_max_allotment.py @@ -4,7 +4,7 @@ class snap_max_allotment(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = "Maximum SNAP allotment for SPM unit, based on the state group and household size." label = "SNAP maximum allotment" unit = USD @@ -24,4 +24,4 @@ def formula(spm_unit, period, parameters): additional_allotment = ( additional_members * max_allotments.additional[snap_region] ) - return (main_allotment + additional_allotment) * MONTHS_IN_YEAR + return main_allotment + additional_allotment diff --git a/fiscalsim_us/variables/gov/usda/snap/snap_min_allotment.py b/fiscalsim_us/variables/gov/usda/snap/snap_min_allotment.py index 0eed15adb..2b567c6a0 100644 --- a/fiscalsim_us/variables/gov/usda/snap/snap_min_allotment.py +++ b/fiscalsim_us/variables/gov/usda/snap/snap_min_allotment.py @@ -4,7 +4,7 @@ class snap_min_allotment(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH label = "SNAP minimum allotment" documentation = ( "Minimum allotment for SNAP based on household size and state" @@ -18,12 +18,9 @@ def formula(spm_unit, period, parameters): # Calculate the relevant maximum benefit, defined as the maximum # benefit for a household of a certain size in their state. snap_region = spm_unit.household("snap_region_str", period) - relevant_max_allotment = ( - snap.max_allotment.main[snap_region][ - str(min_allotment.relevant_max_allotment_household_size) - ] - * MONTHS_IN_YEAR - ) + relevant_max_allotment = snap.max_allotment.main[snap_region][ + str(min_allotment.relevant_max_allotment_household_size) + ] # Minimum benefits only apply to households up to a certain size. size = spm_unit("spm_unit_size", period) eligible = size <= min_allotment.maximum_household_size diff --git a/fiscalsim_us/variables/gov/usda/snap/snap_normal_allotment.py b/fiscalsim_us/variables/gov/usda/snap/snap_normal_allotment.py index 907888f46..3a605fb90 100644 --- a/fiscalsim_us/variables/gov/usda/snap/snap_normal_allotment.py +++ b/fiscalsim_us/variables/gov/usda/snap/snap_normal_allotment.py @@ -4,7 +4,7 @@ class snap_normal_allotment(Variable): value_type = float entity = SPMUnit - definition_period = YEAR + definition_period = MONTH documentation = "Normal SNAP benefit amount, equal to net income minus food contribution" label = "SNAP normal allotment" reference = "https://www.law.cornell.edu/uscode/text/7/2017#a" diff --git a/fiscalsim_us/variables/household/cliff.py b/fiscalsim_us/variables/household/cliff.py index 338967dcb..6a244affc 100644 --- a/fiscalsim_us/variables/household/cliff.py +++ b/fiscalsim_us/variables/household/cliff.py @@ -6,13 +6,14 @@ class cliff_evaluated(Variable): entity = Person label = "cliff evaluated" unit = USD - documentation = "Whether this person's cliff has been simulated. If not, then the cliff gap is assumed to be zero." + documentation = "Whether this person's cliff has been simulated. If not, the cliff gap is assumed to be zero." definition_period = YEAR def formula(person, period, parameters): adult_index_values = person("adult_index", period) cliff_adult_count = parameters(period).simulation.cliff_adults - return adult_index_values <= cliff_adult_count + is_adult = person("is_adult", period) + return is_adult & (adult_index_values <= cliff_adult_count) class cliff_gap(Variable): @@ -20,36 +21,38 @@ class cliff_gap(Variable): entity = Person label = "cliff gap" unit = USD - documentation = "Amount of income lost if this person's employment income increased by $2,000." + documentation = "Amount of income lost if this person's employment income increased by delta amount." definition_period = YEAR def formula(person, period, parameters): - simulation = person.simulation - alt_simulation = simulation.get_branch(f"all_adults_2k_pay_rise") - delta = parameters(period).simulation.cliff_threshold - for variable in simulation.tax_benefit_system.variables: - if variable not in simulation.input_variables: - alt_simulation.delete_arrays(variable) - alt_simulation.set_input( - "employment_income", - period, - person("employment_income", period) - + person("is_adult", period) * delta, - ) - alt_person = alt_simulation.person - household_net_income = person.spm_unit("spm_unit_net_income", period) - household_net_income_higher_earnings = alt_person.spm_unit( - "spm_unit_net_income", period - ) - increase = household_net_income_higher_earnings - household_net_income - return where(person("is_adult", period) & (increase < 0), -increase, 0) + netinc_base = person.household("household_net_income", period) + delta = parameters(period).simulation.cliff_delta + adult_count = parameters(period).simulation.cliff_adults + sim = person.simulation + increase = np.zeros(person.count, dtype=np.float32) + adult_indexes = person("adult_index", period) + for adult_index in range(1, 1 + adult_count): + alt_sim = sim.get_branch(f"cliff_for_adult_{adult_index}") + for variable in sim.tax_benefit_system.variables: + if variable not in sim.input_variables: + alt_sim.delete_arrays(variable) + mask = adult_index == adult_indexes + alt_sim.set_input( + "employment_income", + period, + person("employment_income", period) + mask * delta, + ) + alt_person = alt_sim.person + netinc_alt = alt_person.household("household_net_income", period) + increase[mask] += netinc_alt[mask] - netinc_base[mask] + return where(increase < 0, -increase, 0) class is_on_cliff(Variable): value_type = bool entity = Person label = "is on a tax-benefit cliff" - documentation = "Whether this person would be worse off if their employment income were $2,000 higher." + documentation = "Whether this person would be worse off if their employment income were higher." definition_period = YEAR def formula(person, period, parameters): diff --git a/fiscalsim_us/variables/household/demographic/age/age.py b/fiscalsim_us/variables/household/demographic/age/age.py index 814c71219..328b8d5bc 100644 --- a/fiscalsim_us/variables/household/demographic/age/age.py +++ b/fiscalsim_us/variables/household/demographic/age/age.py @@ -4,6 +4,6 @@ class age(Variable): value_type = float entity = Person - label = "Age" + label = "age" definition_period = YEAR default_value = 40 diff --git a/fiscalsim_us/variables/household/demographic/geographic/county/county.py b/fiscalsim_us/variables/household/demographic/geographic/county/county.py index ca6a86abc..dfc3161fe 100644 --- a/fiscalsim_us/variables/household/demographic/geographic/county/county.py +++ b/fiscalsim_us/variables/household/demographic/geographic/county/county.py @@ -1,34 +1,33 @@ -from fiscalsim_us.model_api import * -from fiscalsim_us.variables.household.demographic.geographic.county.county_enum import ( - County, -) -import numpy as np - - -class county(Variable): - value_type = Enum - possible_values = County - default_value = County.UNKNOWN - entity = Household - label = "County" - definition_period = YEAR - - def formula(household, period, parameters): - # Attempt to look up from ZIP code - zip_code = household("zip_code", period).astype(int) - zip_codes = ZIP_CODE_DATASET.set_index("zip_code") - county_name = zip_codes.county[zip_code] - state_code = zip_codes.state[zip_code] - county_key = county_name.apply( - lambda name: name.replace(" ", "_") - .replace("-", "_") - .replace(".", "") - .replace("'", "_") - .strip() - .upper() - ) - county_state = county_key.str.cat(state_code, sep="_") - county_names = pd.Series( - np.arange(len(County._member_names_)), index=County._member_names_ - ) - return county_names[county_state] +from fiscalsim_us.model_api import * +from fiscalsim_us.variables.household.demographic.geographic.county.county_enum import ( + County, +) + + +class county(Variable): + value_type = Enum + possible_values = County + default_value = County.UNKNOWN + entity = Household + label = "County" + definition_period = YEAR + + def formula(household, period, parameters): + # Attempt to look up from ZIP code + zip_code = household("zip_code", period).astype(int) + zip_codes = ZIP_CODE_DATASET.set_index("zip_code") + county_name = zip_codes.county[zip_code] + state_code = zip_codes.state[zip_code] + county_key = county_name.apply( + lambda name: name.replace(" ", "_") + .replace("-", "_") + .replace(".", "") + .replace("'", "_") + .strip() + .upper() + ) + county_state = county_key.str.cat(state_code, sep="_") + county_names = pd.Series( + np.arange(len(County._member_names_)), index=County._member_names_ + ) + return county_names[county_state] diff --git a/fiscalsim_us/variables/household/demographic/marital_unit/is_separated.py b/fiscalsim_us/variables/household/demographic/marital_unit/is_separated.py new file mode 100644 index 000000000..cdba83be5 --- /dev/null +++ b/fiscalsim_us/variables/household/demographic/marital_unit/is_separated.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class is_separated(Variable): + value_type = bool + entity = Person + label = "Separated" + documentation = "Whether the person is separated from a partner." + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/demographic/marital_unit/is_widowed.py b/fiscalsim_us/variables/household/demographic/marital_unit/is_widowed.py new file mode 100644 index 000000000..508e6aa44 --- /dev/null +++ b/fiscalsim_us/variables/household/demographic/marital_unit/is_widowed.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class is_widowed(Variable): + value_type = bool + entity = Person + label = "Widowed" + documentation = "Whether the person is widowed." + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/demographic/tax_unit/filing_status.py b/fiscalsim_us/variables/household/demographic/tax_unit/filing_status.py index c350999b8..f401bd1b1 100644 --- a/fiscalsim_us/variables/household/demographic/tax_unit/filing_status.py +++ b/fiscalsim_us/variables/household/demographic/tax_unit/filing_status.py @@ -20,11 +20,22 @@ class filing_status(Variable): def formula(tax_unit, period, parameters): has_spouse = add(tax_unit, period, ["is_tax_unit_spouse"]) > 0 has_dependents = tax_unit("tax_unit_dependents", period) > 0 + person = tax_unit.members + is_separated = tax_unit.any(person("is_separated", period)) + is_widowed = tax_unit.any(person("is_widowed", period)) return select( - [has_spouse, has_dependents, True], [ - FilingStatus.JOINT, + has_dependents & ~has_spouse, + has_spouse, + is_separated, + is_widowed, + True, + ], + [ FilingStatus.HEAD_OF_HOUSEHOLD, + FilingStatus.JOINT, + FilingStatus.SEPARATE, + FilingStatus.WIDOW, FilingStatus.SINGLE, ], ) diff --git a/fiscalsim_us/variables/household/demographic/tax_unit/is_tax_unit_head_or_spouse.py b/fiscalsim_us/variables/household/demographic/tax_unit/is_tax_unit_head_or_spouse.py new file mode 100644 index 000000000..2b380076c --- /dev/null +++ b/fiscalsim_us/variables/household/demographic/tax_unit/is_tax_unit_head_or_spouse.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class is_tax_unit_head_or_spouse(Variable): + value_type = bool + entity = Person + label = "Head or Spouse of tax unit" + definition_period = YEAR + + def formula(person, period, parameters): + head = person("is_tax_unit_head", period) + spouse = person("is_tax_unit_spouse", period) + return head | spouse diff --git a/fiscalsim_us/variables/household/demographic/tax_unit/tax_unit_household_id.py b/fiscalsim_us/variables/household/demographic/tax_unit/tax_unit_household_id.py new file mode 100644 index 000000000..6ec578b4a --- /dev/null +++ b/fiscalsim_us/variables/household/demographic/tax_unit/tax_unit_household_id.py @@ -0,0 +1,14 @@ +from fiscalsim_us.model_api import * + + +class tax_unit_household_id(Variable): + value_type = float + entity = TaxUnit + label = "Tax unit household ID" + definition_period = YEAR + + def formula(tax_unit, period, parameters): + person = tax_unit.members + return tax_unit.value_from_first_person( + person.household("household_id", period) + ) diff --git a/fiscalsim_us/variables/household/demographic/tax_unit/tax_unit_stillborn_children.py b/fiscalsim_us/variables/household/demographic/tax_unit/tax_unit_stillborn_children.py new file mode 100644 index 000000000..c68bf179d --- /dev/null +++ b/fiscalsim_us/variables/household/demographic/tax_unit/tax_unit_stillborn_children.py @@ -0,0 +1,8 @@ +from fiscalsim_us.model_api import * + + +class tax_unit_stillborn_children(Variable): + value_type = int + entity = TaxUnit + label = "Number of stillborn children in the filing year" + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/demographic/weights/tax_unit_weight.py b/fiscalsim_us/variables/household/demographic/weights/tax_unit_weight.py index 30b04385a..329b7b501 100644 --- a/fiscalsim_us/variables/household/demographic/weights/tax_unit_weight.py +++ b/fiscalsim_us/variables/household/demographic/weights/tax_unit_weight.py @@ -6,3 +6,6 @@ class tax_unit_weight(Variable): entity = TaxUnit label = "Tax unit weight" definition_period = YEAR + + def formula(tax_unit, period, parameters): + return tax_unit.household("household_weight", period) diff --git a/fiscalsim_us/variables/household/expense/childcare/tax_unit_childcare_expenses.py b/fiscalsim_us/variables/household/expense/childcare/tax_unit_childcare_expenses.py index 804fa60bb..b21ae2043 100644 --- a/fiscalsim_us/variables/household/expense/childcare/tax_unit_childcare_expenses.py +++ b/fiscalsim_us/variables/household/expense/childcare/tax_unit_childcare_expenses.py @@ -1,8 +1,4 @@ from fiscalsim_us.model_api import * -import warnings - -warnings.filterwarnings("ignore") -warnings.simplefilter("ignore") class tax_unit_childcare_expenses(Variable): @@ -13,14 +9,18 @@ class tax_unit_childcare_expenses(Variable): definition_period = YEAR def formula(tax_unit, period, parameters): - # Distribute the childcare expenses evenly across the SPM unit's members. + # distribute the SPM unit's childcare expenses evenly across + # children in SPM unit's Tax units spm_unit = tax_unit.spm_unit spm_unit_childcare = spm_unit("childcare_expenses", period) spm_unit_count_children = add(spm_unit, period, ["is_child"]) tax_unit_count_children = add(tax_unit, period, ["is_child"]) - child_ratio = where( - spm_unit_count_children > 0, - tax_unit_count_children / spm_unit_count_children, - 0, + # avoid array divide-by-zero warning by not using where() function + # see the following GitHub issue for more details: + # https://github.com/PolicyEngine/fiscalsim-us/issues/2494 + child_ratio = np.zeros_like(spm_unit_count_children) + mask = spm_unit_count_children > 0 + child_ratio[mask] = ( + tax_unit_count_children[mask] / spm_unit_count_children[mask] ) return spm_unit_childcare * child_ratio diff --git a/fiscalsim_us/variables/household/expense/education/non_public_school_tuition.py b/fiscalsim_us/variables/household/expense/education/non_public_school_tuition.py new file mode 100644 index 000000000..eec285149 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/education/non_public_school_tuition.py @@ -0,0 +1,8 @@ +from fiscalsim_us.model_api import * + + +class non_public_school_tuition(Variable): + value_type = float + entity = Person + definition_period = YEAR + label = "Nonchartered, Nonpublic School Tuition" diff --git a/fiscalsim_us/variables/household/expense/health/ambulance_expense.py b/fiscalsim_us/variables/household/expense/health/ambulance_expense.py new file mode 100644 index 000000000..ef1b07926 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/health/ambulance_expense.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class ambulance_expense(Variable): + value_type = float + entity = Person + label = "Ambulance expenses" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/health/er_visit_expense.py b/fiscalsim_us/variables/household/expense/health/er_visit_expense.py new file mode 100644 index 000000000..76180c5ce --- /dev/null +++ b/fiscalsim_us/variables/household/expense/health/er_visit_expense.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class er_visit_expense(Variable): + value_type = float + entity = Person + label = "Emergency room visit expenses" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/health/imaging_expense.py b/fiscalsim_us/variables/household/expense/health/imaging_expense.py new file mode 100644 index 000000000..c73fb7e58 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/health/imaging_expense.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class imaging_expense(Variable): + value_type = float + entity = Person + label = "Imaging expenses" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/health/inpatient_expense.py b/fiscalsim_us/variables/household/expense/health/inpatient_expense.py new file mode 100644 index 000000000..69ebacb50 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/health/inpatient_expense.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class inpatient_expense(Variable): + value_type = float + entity = Person + label = "Inpatient expenses" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/health/lab_expense.py b/fiscalsim_us/variables/household/expense/health/lab_expense.py new file mode 100644 index 000000000..bc44df4f8 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/health/lab_expense.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class lab_expense(Variable): + value_type = float + entity = Person + label = "Lab expenses" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/health/outpatient_expense.py b/fiscalsim_us/variables/household/expense/health/outpatient_expense.py new file mode 100644 index 000000000..4dc72e6c5 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/health/outpatient_expense.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class outpatient_expense(Variable): + value_type = float + entity = Person + label = "Outpatient expenses" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/health/physician_services_expense.py b/fiscalsim_us/variables/household/expense/health/physician_services_expense.py new file mode 100644 index 000000000..5b6000374 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/health/physician_services_expense.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class physician_services_expense(Variable): + value_type = float + entity = Person + label = "Physician services expenses" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/health/prescription_expense.py b/fiscalsim_us/variables/household/expense/health/prescription_expense.py new file mode 100644 index 000000000..49ee30e62 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/health/prescription_expense.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class prescription_expense(Variable): + value_type = float + entity = Person + label = "Prescription expenses" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/health/urgent_care_expense.py b/fiscalsim_us/variables/household/expense/health/urgent_care_expense.py new file mode 100644 index 000000000..204e83afa --- /dev/null +++ b/fiscalsim_us/variables/household/expense/health/urgent_care_expense.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class urgent_care_expense(Variable): + value_type = float + entity = Person + label = "Urgent care expenses" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/person/capital_loss.py b/fiscalsim_us/variables/household/expense/person/capital_loss.py deleted file mode 100644 index c0cf76b4e..000000000 --- a/fiscalsim_us/variables/household/expense/person/capital_loss.py +++ /dev/null @@ -1,14 +0,0 @@ -from fiscalsim_us.model_api import * - - -class capital_loss(Variable): - value_type = float - entity = Person - label = "Capital loss" - unit = USD - documentation = "Losses from transactions involving property." - definition_period = YEAR - - def formula(tax_unit, period, parameters): - capital_gains = tax_unit("capital_gains", period) - return max_(0, -capital_gains) diff --git a/fiscalsim_us/variables/household/expense/person/interest_expense.py b/fiscalsim_us/variables/household/expense/person/interest_expense.py index 030a3b8af..af91033af 100644 --- a/fiscalsim_us/variables/household/expense/person/interest_expense.py +++ b/fiscalsim_us/variables/household/expense/person/interest_expense.py @@ -4,6 +4,7 @@ class interest_expense(Variable): value_type = float entity = Person - label = "Interest paid on loans" + label = "Interest paid on all loans" unit = USD definition_period = YEAR + adds = ["mortgage_interest", "non_mortgage_interest"] diff --git a/fiscalsim_us/variables/household/expense/person/mortgage_interest.py b/fiscalsim_us/variables/household/expense/person/mortgage_interest.py new file mode 100644 index 000000000..6e09d4428 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/person/mortgage_interest.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class mortgage_interest(Variable): + value_type = float + entity = Person + label = "Mortgage interest" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/expense/person/non_mortgage_interest.py b/fiscalsim_us/variables/household/expense/person/non_mortgage_interest.py new file mode 100644 index 000000000..845bf02a8 --- /dev/null +++ b/fiscalsim_us/variables/household/expense/person/non_mortgage_interest.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class non_mortgage_interest(Variable): + value_type = float + entity = Person + label = "Non-mortgage interest" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/income/household/equiv_household_net_income.py b/fiscalsim_us/variables/household/income/household/equiv_household_net_income.py index 998dea0c8..890a35ac0 100644 --- a/fiscalsim_us/variables/household/income/household/equiv_household_net_income.py +++ b/fiscalsim_us/variables/household/income/household/equiv_household_net_income.py @@ -7,4 +7,8 @@ class equiv_household_net_income(Variable): label = "equivalised net income" definition_period = YEAR unit = USD - adds = ["spm_unit_oecd_equiv_net_income"] + + def formula(household, period, parameters): + number_of_people = household("household_size", period) + net_income = household("household_net_income", period) + return net_income / (number_of_people**0.5) diff --git a/fiscalsim_us/variables/household/income/household/household_benefits.py b/fiscalsim_us/variables/household/income/household/household_benefits.py index 13cb75490..92d982609 100644 --- a/fiscalsim_us/variables/household/income/household/household_benefits.py +++ b/fiscalsim_us/variables/household/income/household/household_benefits.py @@ -26,6 +26,7 @@ class household_benefits(Variable): "tanf", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", + "unemployment_compensation", # Contributed. "basic_income", "spm_unit_capped_housing_subsidy", diff --git a/fiscalsim_us/variables/household/income/household/household_refundable_tax_credits.py b/fiscalsim_us/variables/household/income/household/household_refundable_tax_credits.py index 5108ca523..aaff02949 100644 --- a/fiscalsim_us/variables/household/income/household/household_refundable_tax_credits.py +++ b/fiscalsim_us/variables/household/income/household/household_refundable_tax_credits.py @@ -1,45 +1,55 @@ -from fiscalsim_us.model_api import * - - -class household_refundable_tax_credits(Variable): - value_type = float - entity = Household - label = "refundable tax credits" - definition_period = YEAR - unit = USD - adds = [ - "income_tax_refundable_credits", # Federal. - "ca_refundable_credits", # California. - "il_refundable_credits", # Illinois. - "ks_refundable_credits", # Kansas. - "la_refundable_credits", # Louisianna - "ma_refundable_credits", # Massachusetts. - "md_refundable_credits", # Maryland. - "mn_refundable_credits", # Minnesota. - "mo_refundable_credits", # Missouri. - "or_refundable_credits", # Oregon. - "nd_refundable_credits", # North Dakota. - "ne_refundable_credits", # Nebraska. - "ny_refundable_credits", # New York. - # Skip PA, which has no refundable credits. - "ut_refundable_credits", # Utah. - "va_refundable_credits", # Virginia - "wa_refundable_credits", # Washington. - "nyc_refundable_credits", # New York City. - ] - - def formula(household, period, parameters): - added_components = household_refundable_tax_credits.adds - params = parameters(period) - p = params.gov.contrib.ubi_center.flat_tax - if p.abolish_federal_income_tax: - added_components = [ - c - for c in added_components - if c != "income_tax_refundable_credits" - ] - if params.simulation.reported_state_income_tax: - added_components = [ - "income_tax_refundable_credits", # Federal. - ] - return add(household, period, added_components) +from fiscalsim_us.model_api import * + + +class household_refundable_tax_credits(Variable): + value_type = float + entity = Household + label = "refundable tax credits" + definition_period = YEAR + unit = USD + adds = [ + "income_tax_refundable_credits", # Federal. + "ca_refundable_credits", # California. + "co_refundable_credits", # Colorado. + "dc_refundable_credits", # District of Columbia. + "ia_refundable_credits", # Iowa. + "il_refundable_credits", # Illinois. + "in_refundable_credits", # Indiana. + "ks_refundable_credits", # Kansas. + "ma_refundable_credits", # Massachusetts. + "me_refundable_credits", # Maine. + "md_refundable_credits", # Maryland. + "mn_refundable_credits", # Minnesota. + "mo_refundable_credits", # Missouri. + # Skip NC, which has no refundable credits. + "nd_refundable_credits", # North Dakota. + "ne_refundable_credits", # Nebraska. + "nh_refundable_credits", # New Hampshire. + "nj_refundable_credits", # New Jersey. + "nm_refundable_credits", # New Mexico. + "ny_refundable_credits", # New York. + "or_refundable_credits", # Oregon. + # Skip PA, which has no refundable credits. + "wa_refundable_credits", # Washington. + "ut_refundable_credits", # Utah. + "vt_refundable_credits", # Vermont. + "wi_refundable_credits", # Wisconsin. + # LOCAL + "nyc_refundable_credits", # New York City. + ] + + def formula(household, period, parameters): + added_components = household_refundable_tax_credits.adds + params = parameters(period) + p = params.gov.contrib.ubi_center.flat_tax + if p.abolish_federal_income_tax: + added_components = [ + c + for c in added_components + if c != "income_tax_refundable_credits" + ] + if params.simulation.reported_state_income_tax: + added_components = [ + "income_tax_refundable_credits", # Federal. + ] + return add(household, period, added_components) diff --git a/fiscalsim_us/variables/household/income/household/household_state_income_tax.py b/fiscalsim_us/variables/household/income/household/household_state_income_tax.py new file mode 100644 index 000000000..d6a8636b6 --- /dev/null +++ b/fiscalsim_us/variables/household/income/household/household_state_income_tax.py @@ -0,0 +1,78 @@ +from fiscalsim_us.model_api import * + + +class household_state_income_tax(Variable): + # This definition contains all modelled states, and exists to solve circular dependencies in state_income_tax. + value_type = float + entity = TaxUnit + label = "household State tax" + unit = USD + definition_period = YEAR + adds = [ + "ca_income_tax_before_refundable_credits", + "co_income_tax_before_refundable_credits", + "dc_income_tax_before_refundable_credits", + "ia_income_tax_before_refundable_credits", + "il_total_tax", + "in_income_tax_before_refundable_credits", + "ks_income_tax_before_refundable_credits", + "me_income_tax_before_refundable_credits", + "ma_income_tax_before_refundable_credits", + "md_income_tax_before_refundable_credits", + "mn_income_tax_before_refundable_credits", + "mo_income_tax_before_refundable_credits", + "nc_income_tax", + "nd_income_tax_before_refundable_credits", + "ne_income_tax_before_refundable_credits", + "nh_income_tax_before_refundable_credits", + "nj_income_tax_before_refundable_credits", + "ny_income_tax_before_refundable_credits", + "or_income_tax_before_refundable_credits", + "pa_income_tax", + "wa_income_tax_before_refundable_credits", + "nyc_income_tax_before_refundable_credits", + "ut_income_tax_before_refundable_credits", + "wi_income_tax_before_refundable_credits", + ] + subtracts = [ + "ca_refundable_credits", # California. + "co_refundable_credits", # Colorado + "dc_refundable_credits", # District of Columbia. + "ia_refundable_credits", # Iowa. + "il_refundable_credits", # Illinois. + "in_refundable_credits", # Indiana. + "ks_refundable_credits", # Kansas. + "ma_refundable_credits", # Massachusetts. + "me_refundable_credits", # Maine. + "md_refundable_credits", # Maryland. + "mn_refundable_credits", # Minnesota. + "mo_refundable_credits", # Missouri. + # Skip NC, which has no refundable credits. + "nd_refundable_credits", # North Dakota. + "ne_refundable_credits", # Nebraska. + "nh_refundable_credits", # New Hampshire. + "ny_refundable_credits", # New York. + "or_refundable_credits", # Oregon. + # Skip PA, which has no refundable credits. + "wa_refundable_credits", # Washington. + "nyc_refundable_credits", # New York City. + "ut_refundable_credits", # Utah. + "wi_refundable_credits", # Wisconsin. + ] + + def formula(tax_unit, period, parameters): + if parameters(period).simulation.reported_state_income_tax: + spm_unit = tax_unit.spm_unit + total_tax_unit_heads = add(spm_unit, period, ["is_tax_unit_head"]) + spm_unit_state_tax = spm_unit( + "spm_unit_state_tax_reported", period + ) + return where( + total_tax_unit_heads > 0, + spm_unit_state_tax / total_tax_unit_heads, + 0, + ) + else: + return add( + tax_unit, period, household_state_income_tax.adds + ) - add(tax_unit, period, household_state_income_tax.subtracts) diff --git a/fiscalsim_us/variables/household/income/household/household_tax_before_refundable_credits.py b/fiscalsim_us/variables/household/income/household/household_tax_before_refundable_credits.py index 48d60898d..105679034 100644 --- a/fiscalsim_us/variables/household/income/household/household_tax_before_refundable_credits.py +++ b/fiscalsim_us/variables/household/income/household/household_tax_before_refundable_credits.py @@ -1,57 +1,66 @@ -from fiscalsim_us.model_api import * - - -class household_tax_before_refundable_credits(Variable): - value_type = float - entity = Household - label = "tax" - documentation = "Total tax liability before refundable credits." - unit = USD - definition_period = YEAR - adds = [ - "employee_payroll_tax", - "self_employment_tax", - "income_tax_before_refundable_credits", # Federal. - "ca_income_tax_before_refundable_credits", - "il_total_tax", - "ks_income_tax_before_refundable_credits", - "la_income_tax_before_refundable_credits", - "ma_income_tax_before_refundable_credits", - "md_income_tax_before_refundable_credits", - "mn_income_tax_before_refundable_credits", - "mo_income_tax_before_refundable_credits", - "nd_income_tax_before_refundable_credits", - "ne_income_tax_before_refundable_credits", - "ny_income_tax_before_refundable_credits", - "or_income_tax_before_refundable_credits", - "pa_income_tax", # PA has no refundable credits - "ut_income_tax_before_refundable_credits", - "va_income_tax_before_refundable_credits", - "wa_income_tax_before_refundable_credits", - "flat_tax", - "nyc_income_tax_before_refundable_credits", - ] - - def formula(household, period, parameters): - added_components = household_tax_before_refundable_credits.adds - params = parameters(period) - flat_tax = params.gov.contrib.ubi_center.flat_tax - if flat_tax.abolish_payroll_tax: - added_components = [ - c for c in added_components if c != "employee_payroll_tax" - ] - if flat_tax.abolish_federal_income_tax: - added_components = [ - c - for c in added_components - if c != "income_tax_before_refundable_credits" - ] - if params.simulation.reported_state_income_tax: - added_components = [ - "employee_payroll_tax", - "self_employment_tax", - "income_tax_before_refundable_credits", # Federal. - "flat_tax", - "spm_unit_state_tax_reported", - ] - return add(household, period, added_components) +from fiscalsim_us.model_api import * + + +class household_tax_before_refundable_credits(Variable): + value_type = float + entity = Household + label = "tax" + documentation = "Total tax liability before refundable credits." + unit = USD + definition_period = YEAR + adds = [ + "employee_payroll_tax", + "self_employment_tax", + "income_tax_before_refundable_credits", # Federal. + "ca_income_tax_before_refundable_credits", + "co_income_tax_before_refundable_credits", + "dc_income_tax_before_refundable_credits", + "ia_income_tax_before_refundable_credits", + "il_total_tax", + "in_income_tax_before_refundable_credits", + "ks_income_tax_before_refundable_credits", + "me_income_tax_before_refundable_credits", + "ma_income_tax_before_refundable_credits", + "md_income_tax_before_refundable_credits", + "mn_income_tax_before_refundable_credits", + "mo_income_tax_before_refundable_credits", + "nc_income_tax", # NC has no refundable credits. + "nd_income_tax_before_refundable_credits", + "ne_income_tax_before_refundable_credits", + "nh_income_tax_before_refundable_credits", + "nj_income_tax_before_refundable_credits", + "nm_income_tax_before_refundable_credits", + "ny_income_tax_before_refundable_credits", + "or_income_tax_before_refundable_credits", + "pa_income_tax", # PA has no refundable credits. + "wa_income_tax_before_refundable_credits", + "flat_tax", + "nyc_income_tax_before_refundable_credits", + "ut_income_tax_before_refundable_credits", + "vt_income_tax_before_refundable_credits", + "wi_income_tax_before_refundable_credits", + ] + + def formula(household, period, parameters): + added_components = household_tax_before_refundable_credits.adds + params = parameters(period) + flat_tax = params.gov.contrib.ubi_center.flat_tax + if flat_tax.abolish_payroll_tax: + added_components = [ + c for c in added_components if c != "employee_payroll_tax" + ] + if flat_tax.abolish_federal_income_tax: + added_components = [ + c + for c in added_components + if c != "income_tax_before_refundable_credits" + ] + if params.simulation.reported_state_income_tax: + added_components = [ + "employee_payroll_tax", + "self_employment_tax", + "income_tax_before_refundable_credits", # Federal. + "flat_tax", + "spm_unit_state_tax_reported", + ] + return add(household, period, added_components) diff --git a/fiscalsim_us/variables/household/income/person/capital_gains/capital_gains.py b/fiscalsim_us/variables/household/income/person/capital_gains/capital_gains.py index 3fec31a69..50deedc8c 100644 --- a/fiscalsim_us/variables/household/income/person/capital_gains/capital_gains.py +++ b/fiscalsim_us/variables/household/income/person/capital_gains/capital_gains.py @@ -1,14 +1,11 @@ -from fiscalsim_us.model_api import * - - -class capital_gains(Variable): - value_type = float - entity = Person - label = "capital gains" - unit = USD - documentation = "Net gain from disposition of property." - definition_period = YEAR - adds = [ - "short_term_capital_gains", - "long_term_capital_gains", - ] +from fiscalsim_us.model_api import * + + +class capital_gains(Variable): + value_type = float + entity = Person + label = "Capital gains (both short-term and long-term)" + unit = USD + documentation = "Net gain from disposition of property." + definition_period = YEAR + adds = ["short_term_capital_gains", "long_term_capital_gains"] diff --git a/fiscalsim_us/variables/household/income/person/capital_gains/capital_losses.py b/fiscalsim_us/variables/household/income/person/capital_gains/capital_losses.py new file mode 100644 index 000000000..bfa7d5d66 --- /dev/null +++ b/fiscalsim_us/variables/household/income/person/capital_gains/capital_losses.py @@ -0,0 +1,13 @@ +from fiscalsim_us.model_api import * + + +class capital_losses(Variable): + value_type = float + entity = Person + label = "Capital losses (expressed as a non-negative number)" + unit = USD + documentation = "Losses from transactions involving property." + definition_period = YEAR + + def formula(person, period, parameters): + return max_(0, -person("capital_gains", period)) diff --git a/fiscalsim_us/variables/household/income/person/capital_gains/long_term_capital_gains.py b/fiscalsim_us/variables/household/income/person/capital_gains/long_term_capital_gains.py index b3d7a7115..2e28d5c19 100644 --- a/fiscalsim_us/variables/household/income/person/capital_gains/long_term_capital_gains.py +++ b/fiscalsim_us/variables/household/income/person/capital_gains/long_term_capital_gains.py @@ -4,9 +4,9 @@ class long_term_capital_gains(Variable): value_type = float entity = Person - label = "Long-term capital gains" + label = "long-term capital gains" unit = USD - documentation = "The sum of all gains made from (profitable) sales of assets held for more than one year." + documentation = "Net gains made from sales of assets held for more than one year (losses are expressed as negative gains)." definition_period = YEAR reference = dict( title="26 U.S. Code § 1222(3)", diff --git a/fiscalsim_us/variables/household/income/person/capital_gains/long_term_capital_losses.py b/fiscalsim_us/variables/household/income/person/capital_gains/long_term_capital_losses.py deleted file mode 100644 index 99e4d42ee..000000000 --- a/fiscalsim_us/variables/household/income/person/capital_gains/long_term_capital_losses.py +++ /dev/null @@ -1,14 +0,0 @@ -from fiscalsim_us.model_api import * - - -class long_term_capital_losses(Variable): - value_type = float - entity = Person - label = "Long-term capital losses" - unit = USD - documentation = "The sum of all losses from (loss-generating) sales of assets held for more than one year." - definition_period = YEAR - reference = dict( - title="26 U.S. Code § 1222(4)", - href="https://www.law.cornell.edu/uscode/text/26/1222#4", - ) diff --git a/fiscalsim_us/variables/household/income/person/capital_gains/short_term_capital_gains.py b/fiscalsim_us/variables/household/income/person/capital_gains/short_term_capital_gains.py index de4c2aeaf..d66e8ea3b 100644 --- a/fiscalsim_us/variables/household/income/person/capital_gains/short_term_capital_gains.py +++ b/fiscalsim_us/variables/household/income/person/capital_gains/short_term_capital_gains.py @@ -4,9 +4,9 @@ class short_term_capital_gains(Variable): value_type = float entity = Person - label = "Short-term capital gains" + label = "short-term capital gains" unit = USD - documentation = "The sum of all gains made from (profitable) sales of assets held for one year or less." + documentation = "Net gains made from sales of assets held for one year or less(losses are expressed as negative gains)." definition_period = YEAR reference = dict( title="26 U.S. Code § 1222(1)", diff --git a/fiscalsim_us/variables/household/income/person/capital_gains/short_term_capital_losses.py b/fiscalsim_us/variables/household/income/person/capital_gains/short_term_capital_losses.py deleted file mode 100644 index 00974abb1..000000000 --- a/fiscalsim_us/variables/household/income/person/capital_gains/short_term_capital_losses.py +++ /dev/null @@ -1,14 +0,0 @@ -from fiscalsim_us.model_api import * - - -class short_term_capital_losses(Variable): - value_type = float - entity = Person - label = "Short-term capital losses" - unit = USD - documentation = "The sum of all losses from (loss-generating) sales of assets held for one year or less." - definition_period = YEAR - reference = dict( - title="26 U.S. Code § 1222(2)", - href="https://www.law.cornell.edu/uscode/text/26/1222#2", - ) diff --git a/fiscalsim_us/variables/household/income/person/dividends/non_qualified_dividend_income.py b/fiscalsim_us/variables/household/income/person/dividends/non_qualified_dividend_income.py index 983b1819e..2462fed94 100644 --- a/fiscalsim_us/variables/household/income/person/dividends/non_qualified_dividend_income.py +++ b/fiscalsim_us/variables/household/income/person/dividends/non_qualified_dividend_income.py @@ -4,6 +4,6 @@ class non_qualified_dividend_income(Variable): value_type = float entity = Person - label = "Non-qualified dividend income" + label = "non-qualified dividend income" unit = USD definition_period = YEAR diff --git a/fiscalsim_us/variables/household/income/person/dividends/qualified_dividend_income.py b/fiscalsim_us/variables/household/income/person/dividends/qualified_dividend_income.py index 377d6fd51..b9b1e197c 100644 --- a/fiscalsim_us/variables/household/income/person/dividends/qualified_dividend_income.py +++ b/fiscalsim_us/variables/household/income/person/dividends/qualified_dividend_income.py @@ -4,6 +4,6 @@ class qualified_dividend_income(Variable): value_type = float entity = Person - label = "Qualified dividend income" + label = "qualified dividend income" unit = USD definition_period = YEAR diff --git a/fiscalsim_us/variables/household/income/person/farm/farm_rent_income.py b/fiscalsim_us/variables/household/income/person/farm/farm_rent_income.py index b768928f3..7a178570e 100644 --- a/fiscalsim_us/variables/household/income/person/farm/farm_rent_income.py +++ b/fiscalsim_us/variables/household/income/person/farm/farm_rent_income.py @@ -4,6 +4,6 @@ class farm_rent_income(Variable): value_type = float entity = Person - label = "Farm rent net income" + label = "farm rental income" unit = USD definition_period = YEAR diff --git a/fiscalsim_us/variables/household/income/person/interest/tax_exempt_interest_income.py b/fiscalsim_us/variables/household/income/person/interest/tax_exempt_interest_income.py index 837fc1eea..6ef8eabae 100644 --- a/fiscalsim_us/variables/household/income/person/interest/tax_exempt_interest_income.py +++ b/fiscalsim_us/variables/household/income/person/interest/tax_exempt_interest_income.py @@ -4,7 +4,7 @@ class tax_exempt_interest_income(Variable): value_type = float entity = Person - label = "Tax-exempt interest income" + label = "tax-exempt interest income" unit = USD definition_period = YEAR reference = "https://www.law.cornell.edu/uscode/text/26/subtitle-A/chapter-1/subchapter-B/part-III" diff --git a/fiscalsim_us/variables/household/income/person/interest/taxable_interest_income.py b/fiscalsim_us/variables/household/income/person/interest/taxable_interest_income.py index da8c0ddd6..cd9c8c4f5 100644 --- a/fiscalsim_us/variables/household/income/person/interest/taxable_interest_income.py +++ b/fiscalsim_us/variables/household/income/person/interest/taxable_interest_income.py @@ -4,6 +4,6 @@ class taxable_interest_income(Variable): value_type = float entity = Person - label = "Taxable interest income" + label = "taxable interest income" unit = USD definition_period = YEAR diff --git a/fiscalsim_us/variables/household/income/person/pensions/pension_survivors.py b/fiscalsim_us/variables/household/income/person/pensions/pension_survivors.py new file mode 100644 index 000000000..2297f0c75 --- /dev/null +++ b/fiscalsim_us/variables/household/income/person/pensions/pension_survivors.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class pension_survivors(Variable): + value_type = float + entity = Person + definition_period = YEAR + label = "Pension and annuity income from survivors benefits" + unit = USD diff --git a/fiscalsim_us/variables/household/income/person/pensions/taxable_federal_pension_income.py b/fiscalsim_us/variables/household/income/person/pensions/taxable_federal_pension_income.py new file mode 100644 index 000000000..cc7265c97 --- /dev/null +++ b/fiscalsim_us/variables/household/income/person/pensions/taxable_federal_pension_income.py @@ -0,0 +1,9 @@ +from fiscalsim_us.model_api import * + + +class taxable_federal_pension_income(Variable): + value_type = float + entity = Person + label = "Taxable federal pension income" + unit = USD + definition_period = YEAR diff --git a/fiscalsim_us/variables/household/income/person/self_employment/partnership_s_corp_income.py b/fiscalsim_us/variables/household/income/person/self_employment/partnership_s_corp_income.py index a9dc62d28..de001543b 100644 --- a/fiscalsim_us/variables/household/income/person/self_employment/partnership_s_corp_income.py +++ b/fiscalsim_us/variables/household/income/person/self_employment/partnership_s_corp_income.py @@ -4,6 +4,6 @@ class partnership_s_corp_income(Variable): value_type = float entity = Person - label = "Partnership/S-corp income" + label = "partnership/S-corp income" unit = USD definition_period = YEAR diff --git a/fiscalsim_us/variables/household/income/spm_unit/spm_unit_benefits.py b/fiscalsim_us/variables/household/income/spm_unit/spm_unit_benefits.py index 1837de08b..7d9ee9ea9 100644 --- a/fiscalsim_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/fiscalsim_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -26,6 +26,7 @@ def formula(spm_unit, period, parameters): "tanf", "high_efficiency_electric_home_rebate", "residential_efficiency_electrification_rebate", + "unemployment_compensation", # Contributed. "basic_income", ] diff --git a/fiscalsim_us/variables/household/income/spm_unit/spm_unit_pell_grant.py b/fiscalsim_us/variables/household/income/spm_unit/spm_unit_pell_grant.py new file mode 100644 index 000000000..052dcba7f --- /dev/null +++ b/fiscalsim_us/variables/household/income/spm_unit/spm_unit_pell_grant.py @@ -0,0 +1,11 @@ +from fiscalsim_us.model_api import * + + +class spm_unit_pell_grant(Variable): + value_type = float + entity = SPMUnit + label = "Pell Grant amount" + documentation = "SPM unit's Pell Grant educational subsidy" + definition_period = YEAR + unit = USD + adds = ["pell_grant"] diff --git a/fiscalsim_us/variables/household/income/tax_unit/form_4972_lumpsum_distributions.py b/fiscalsim_us/variables/household/income/tax_unit/form_4972_lumpsum_distributions.py new file mode 100644 index 000000000..8927a8d15 --- /dev/null +++ b/fiscalsim_us/variables/household/income/tax_unit/form_4972_lumpsum_distributions.py @@ -0,0 +1,10 @@ +from fiscalsim_us.model_api import * + + +class form_4972_lumpsum_distributions(Variable): + value_type = float + entity = TaxUnit + label = "Lump-sum distributions reported on IRS Form 4972" + unit = USD + definition_period = YEAR + documentation = "Lump-sum distributions reported on IRS Form 4972." diff --git a/fiscalsim_us/variables/household/marginal_tax_rate.py b/fiscalsim_us/variables/household/marginal_tax_rate.py index 996173532..ab6e7ed07 100644 --- a/fiscalsim_us/variables/household/marginal_tax_rate.py +++ b/fiscalsim_us/variables/household/marginal_tax_rate.py @@ -3,44 +3,34 @@ class marginal_tax_rate(Variable): label = "marginal tax rate" - documentation = "Percent of marginal income gains that do not increase household net income." + documentation = "Fraction of marginal income gains that do not increase household net income." entity = Person definition_period = YEAR value_type = float unit = "/1" def formula(person, period, parameters): + netinc_base = person.household("household_net_income", period) + delta = parameters(period).simulation.marginal_tax_rate_delta + adult_count = parameters(period).simulation.marginal_tax_rate_adults + sim = person.simulation mtr_values = np.zeros(person.count, dtype=np.float32) - simulation = person.simulation - adult_index_values = person("adult_index", period) - DELTA = 1_000 - mtr_adult_count = parameters( - period - ).simulation.marginal_tax_rate_adults - for adult_index in range(1, 1 + mtr_adult_count): - alt_simulation = simulation.get_branch( - f"adult_{adult_index}_pay_rise" - ) - mask = adult_index_values == adult_index - for variable in simulation.tax_benefit_system.variables: - if variable not in simulation.input_variables: - alt_simulation.delete_arrays(variable) - alt_simulation.set_input( + adult_indexes = person("adult_index", period) + for adult_index in range(1, 1 + adult_count): + alt_sim = sim.get_branch(f"mtr_for_adult_{adult_index}") + for variable in sim.tax_benefit_system.variables: + if variable not in sim.input_variables: + alt_sim.delete_arrays(variable) + mask = adult_index == adult_indexes + alt_sim.set_input( "employment_income", period, - person("employment_income", period) + mask * DELTA, - ) - alt_person = alt_simulation.person - household_net_income = person.household( - "household_net_income", period - ) - household_net_income_higher_earnings = alt_person.household( - "household_net_income", period - ) - increase = ( - household_net_income_higher_earnings - household_net_income + person("employment_income", period) + mask * delta, ) - mtr_values += where(mask, 1 - increase / DELTA, 0) + alt_person = alt_sim.person + netinc_alt = alt_person.household("household_net_income", period) + increase = netinc_alt - netinc_base + mtr_values += where(mask, 1 - increase / delta, 0) return mtr_values From d7b4f31df31ef3b855e7f186677be1b87782c5f0 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 03:08:50 -0600 Subject: [PATCH 14/37] Updated changelog files --- CHANGELOG.md | 2 +- changelog.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4be69743f..1e5616f88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.2.2] - 2023-10-13 12:00:00 +## [0.2.2] - 2023-10-13 03:30:00 ### Added diff --git a/changelog.yaml b/changelog.yaml index 8361d7182..8f6831977 100644 --- a/changelog.yaml +++ b/changelog.yaml @@ -150,4 +150,4 @@ changes: added: - Updates files from PolicyEngine-US v0.500.0 (e4a95733baafca0a7bec9ae79e96797416a4d237) - date: 2023-10-13 12:00:00 + date: 2023-10-13 03:30:00 From 95317cf9fe57c2923e75548712cd7810bc03f745 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 03:28:50 -0600 Subject: [PATCH 15/37] Turned off VA --- .../variables/gov/states/tax/income/state_income_tax.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index 334ff63cf..020881779 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -35,7 +35,7 @@ class state_income_tax(Variable): # "or_income_tax", --- activating will cause circular logic errors "pa_income_tax", "ri_income_tax", - "va_income_tax", + # "va_income_tax", --- temporarily deactivated until change if to where "ut_income_tax", "wa_income_tax", "wi_income_tax", From 2cec4861c9d7033070d173e8ec428fe4e34692fe Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 03:47:49 -0600 Subject: [PATCH 16/37] Deactivated UT in state_income_tax.py due to circularity --- .../variables/gov/states/tax/income/state_income_tax.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index 020881779..d656dc049 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -36,7 +36,7 @@ class state_income_tax(Variable): "pa_income_tax", "ri_income_tax", # "va_income_tax", --- temporarily deactivated until change if to where - "ut_income_tax", + # "ut_income_tax", --- temporarily deactivated until change if to where "wa_income_tax", "wi_income_tax", ] From d9b2f79077b7ce1e2384216aa14c708700d433b4 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 11:07:12 -0600 Subject: [PATCH 17/37] Updated version in setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 66b63d4d3..b7c132e5d 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name="fiscalsim-us", - version="0.2.2", + version="0.2.3", author="Center for Growth and Opportunity at Utah State University (CGO)", author_email="fiscalsim@thecgo.org", long_description=readme, From 1c4b165793001a4e4c9993e82e719fcf31c1a424 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 11:45:52 -0600 Subject: [PATCH 18/37] Moved prior year state/local tax variables to household folder --- .../income/tax_unit}/prior_year_local_income_tax_paid.py | 0 .../income/tax_unit}/prior_year_state_income_tax_paid.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename fiscalsim_us/variables/{gov/irs/taxcalc/deductions/itemized => household/income/tax_unit}/prior_year_local_income_tax_paid.py (100%) rename fiscalsim_us/variables/{gov/irs/taxcalc/deductions/itemized => household/income/tax_unit}/prior_year_state_income_tax_paid.py (100%) diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py b/fiscalsim_us/variables/household/income/tax_unit/prior_year_local_income_tax_paid.py similarity index 100% rename from fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_local_income_tax_paid.py rename to fiscalsim_us/variables/household/income/tax_unit/prior_year_local_income_tax_paid.py diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_state_income_tax_paid.py b/fiscalsim_us/variables/household/income/tax_unit/prior_year_state_income_tax_paid.py similarity index 100% rename from fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/prior_year_state_income_tax_paid.py rename to fiscalsim_us/variables/household/income/tax_unit/prior_year_state_income_tax_paid.py From 1f7954a3439cfc96335e8a9591ff511c5a11734c Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 11:57:11 -0600 Subject: [PATCH 19/37] Renamed and moved statelocal_sales_or_prior_inctax.py --- .../state_and_local_sales_or_income_tax.py | 24 ------------------- .../statelocal_sales_or_prior_inctax.py} | 4 ++-- 2 files changed, 2 insertions(+), 26 deletions(-) delete mode 100644 fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/state_and_local_sales_or_income_tax.py rename fiscalsim_us/variables/{gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py => household/income/tax_unit/statelocal_sales_or_prior_inctax.py} (86%) diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/state_and_local_sales_or_income_tax.py b/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/state_and_local_sales_or_income_tax.py deleted file mode 100644 index 1204b1411..000000000 --- a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/state_and_local_sales_or_income_tax.py +++ /dev/null @@ -1,24 +0,0 @@ -from fiscalsim_us.model_api import * - - -class state_and_local_sales_or_income_tax(Variable): - value_type = float - entity = TaxUnit - definition_period = YEAR - label = "State and local sales or income tax" - unit = USD - - def formula(tax_unit, period, parameters): - # Only sales or income tax can be itemized, but not both. - income_tax = add( - tax_unit, period, ["state_income_tax", "local_income_tax"] - ) - sales_tax = add( - tax_unit, period, ["state_sales_tax", "local_sales_tax"] - ) - return max_(income_tax, sales_tax) - - -filer_e18400 = variable_alias( - "filer_e18400", state_and_local_sales_or_income_tax -) diff --git a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py b/fiscalsim_us/variables/household/income/tax_unit/statelocal_sales_or_prior_inctax.py similarity index 86% rename from fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py rename to fiscalsim_us/variables/household/income/tax_unit/statelocal_sales_or_prior_inctax.py index 456fecf86..d96ff5d1d 100644 --- a/fiscalsim_us/variables/gov/irs/taxcalc/deductions/itemized/sales_or_prior_year_state_and_local_income_tax.py +++ b/fiscalsim_us/variables/household/income/tax_unit/statelocal_sales_or_prior_inctax.py @@ -10,7 +10,7 @@ class sales_or_prior_year_state_and_local_income_tax_paid(Variable): def formula(tax_unit, period, parameters): # Only sales or income tax can be itemized, but not both. - prior_year_income_tax = add( + prior_year_statelocal_inctax = add( tax_unit, period, [ @@ -21,4 +21,4 @@ def formula(tax_unit, period, parameters): sales_tax = add( tax_unit, period, ["state_sales_tax", "local_sales_tax"] ) - return max_(prior_year_income_tax, sales_tax) + return max_(prior_year_statelocal_inctax, sales_tax) From 283c9539598cf02febd6076b4f3c9fbb2660ce90 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 12:14:24 -0600 Subject: [PATCH 20/37] Updated salt_deduction.py --- .../taxable_income/deductions/itemizing/salt_deduction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py index c5d6ece80..a54bc8c7d 100644 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py +++ b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/salt_deduction.py @@ -15,7 +15,7 @@ def formula(tax_unit, period, parameters): tax_unit, period, [ - "sales_or_prior_year_state_and_local_income_tax_paid", + "statelocal_sales_or_prior_inctax", "real_estate_taxes", ], ) From 06cfbfd21bb85cb3585922b6452d7890d18a49a2 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 12:15:00 -0600 Subject: [PATCH 21/37] Deleted redundant prior_year_salt_paid.py --- .../deductions/itemizing/prior_year_salt_paid.py | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py diff --git a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py b/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py deleted file mode 100644 index 0d61d3dd4..000000000 --- a/fiscalsim_us/variables/gov/irs/income/taxable_income/deductions/itemizing/prior_year_salt_paid.py +++ /dev/null @@ -1,11 +0,0 @@ -from fiscalsim_us.model_api import * - - -class prior_year_salt_paid(Variable): - value_type = float - entity = TaxUnit - label = "Prior year SALT liability paid" - unit = USD - documentation = "State and local taxes plus real estate tax deduction from taxable income." - definition_period = YEAR - reference = "https://www.law.cornell.edu/uscode/text/26/164" From 47b7826d00584d713b744659d1d1e35f56816c8c Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 12:27:13 -0600 Subject: [PATCH 22/37] Update README.md in variables/gov/irs --- fiscalsim_us/variables/gov/irs/README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/fiscalsim_us/variables/gov/irs/README.md b/fiscalsim_us/variables/gov/irs/README.md index ac86d7968..fd6dd338a 100644 --- a/fiscalsim_us/variables/gov/irs/README.md +++ b/fiscalsim_us/variables/gov/irs/README.md @@ -1,11 +1,9 @@ # IRS -### SALT Deduction -- The SALT deduction depends on several input variables in Fiscalsim-us. - - 'sales_or_prior_year_state_and_local_income_tax.py' - - 'prior_year_state_income_tax_paid.py' - - 'prior_year_local_income_tax_paid.py' - - 'state_sales_tax.py' - - 'local_sales_tax.py' - - 'real_estate_taxes.py' +## State and local tax (SALT) Deduction +The SALT deduction previously created a circularity with some states' tax logic because itemizing federal filers can deduct current-year prepayments of state and local income tax liability (if greater than state and local sales tax liability) in the state and local tax deduction on the federal form. However, that current state and local income tax liability is simultaneously calculated and in some states requires the value of federal taxable income, which includes (subtracts) the SALT deduction. This creates a circularity in the tax logic that FiscalSim-US is not able to handle at this point. + +To be clear, the tax logic correctly includes this circularity. However, our solution is to write the code in the way that most filers use the SALT deduction, excluding the case in which filers deduct current-year state and local income tax liability. We created two new variables--`prior_year_state_income_tax_paid` and `prior_year_local_income_tax_paid`--and used those variables in the calculation of `statelocal_sales_or_prior_inctax`, which in turn goes into the `salt_deduction` variable calculation. In other words, the SALT deduction calculation in FiscalSim-US only allows for deducting prior year state and local income taxes. + +There is a workaround for capturing the effect of those who include their current-year paid state and local income taxes in their SALT deduction. Because the variables `prior_year_state_income_tax_paid` and `prior_year_local_income_tax_paid` are just household tax unit variables, a user can just increase those amounts to whatever level of total state and local income taxes paid go into the SALT deduction calculation. From 8df7ec62d888651592d5323abf08b0eee8ea3c4b Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 12:42:25 -0600 Subject: [PATCH 23/37] Updated instances of statelocal_sales_or_prior_inctax --- .../income/ia_itemized_deductions_indiv.yaml | 2 +- .../income/ia_itemized_deductions_joint.yaml | 2 +- .../income/ia_itemized_deductions_unit.yaml | 2 +- .../deductions/nm_itemized_deductions.yaml | 10 +++++----- .../sc/tax/income/sc_state_tax_addback.yaml | 20 +++++++++---------- .../deductions/nm_itemized_deductions.py | 2 +- .../sc/tax/income/sc_state_tax_addback.py | 2 +- .../statelocal_sales_or_prior_inctax.py | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_indiv.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_indiv.yaml index d12afc7a3..6f0c75da4 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_indiv.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_indiv.yaml @@ -14,7 +14,7 @@ tax_unit: members: [person1, person2] interest_deduction: 17_000 - state_and_local_sales_or_income_tax: 8_000 + statelocal_sales_or_prior_inctax: 8_000 households: household: members: [person1, person2] diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_joint.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_joint.yaml index 189471bf5..43d0ca468 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_joint.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_joint.yaml @@ -14,7 +14,7 @@ tax_unit: members: [person1, person2] interest_deduction: 17_000 - state_and_local_sales_or_income_tax: 8_000 + statelocal_sales_or_prior_inctax: 8_000 households: household: members: [person1, person2] diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_unit.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_unit.yaml index 046098b08..9ddc5998d 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_unit.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/ia/tax/income/ia_itemized_deductions_unit.yaml @@ -14,7 +14,7 @@ tax_unit: members: [person1, person2] interest_deduction: 17_000 - state_and_local_sales_or_income_tax: 8_000 + statelocal_sales_or_prior_inctax: 8_000 households: household: members: [person1, person2] diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_itemized_deductions.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_itemized_deductions.yaml index 32a6c88d0..f16319473 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_itemized_deductions.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/nm/tax/income/deductions/nm_itemized_deductions.yaml @@ -4,7 +4,7 @@ input: filing_status: SINGLE tax_unit_itemizes: True - state_and_local_sales_or_income_tax: 5_000 + statelocal_sales_or_prior_inctax: 5_000 real_estate_taxes: 7_500 standard_deduction: 5_000 state_code: NM @@ -17,7 +17,7 @@ input: filing_status: SINGLE tax_unit_itemizes: True - state_and_local_sales_or_income_tax: 5_000 + statelocal_sales_or_prior_inctax: 5_000 real_estate_taxes: 0 standard_deduction: 2_000 state_code: NM @@ -30,7 +30,7 @@ input: filing_status: SEPARATE tax_unit_itemizes: True - state_and_local_sales_or_income_tax: 7_500 + statelocal_sales_or_prior_inctax: 7_500 real_estate_taxes: 0 standard_deduction: 2_000 state_code: NM @@ -43,7 +43,7 @@ input: filing_status: SINGLE tax_unit_itemizes: True - state_and_local_sales_or_income_tax: 0 + statelocal_sales_or_prior_inctax: 0 real_estate_taxes: 0 standard_deduction: 2_000 state_code: NM @@ -56,7 +56,7 @@ input: filing_status: SINGLE tax_unit_itemizes: False - state_and_local_sales_or_income_tax: 7_500 + statelocal_sales_or_prior_inctax: 7_500 real_estate_taxes: 0 standard_deduction: 2_000 state_code: NM diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/sc_state_tax_addback.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/sc_state_tax_addback.yaml index 92fcbb446..42ec6a7ba 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/sc_state_tax_addback.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/sc/tax/income/sc_state_tax_addback.yaml @@ -9,14 +9,14 @@ casualty_loss_deduction: 0 standard_deduction: 4_000 real_estate_taxes: 3_000 - state_and_local_sales_or_income_tax: 1_000 + statelocal_sales_or_prior_inctax: 1_000 state_code: SC output: sc_state_tax_addback: 1_000 # line 3 = 2000 - 0 = 2000 # line 4 = 1000 # line 5 = 5000 - 3000 = 2000 - + - name: Test case 2 #salt has a cap of 10000 for JOINT period: 2021 input: @@ -28,11 +28,11 @@ casualty_loss_deduction: 0 standard_deduction: 4_000 real_estate_taxes: 3_000 - state_and_local_sales_or_income_tax: 1_000 + statelocal_sales_or_prior_inctax: 1_000 state_code: SC output: sc_state_tax_addback: 0 - # line 3 = 2000 - 4000 = 0 + # line 3 = 2000 - 4000 = 0 # line 4 = 1000 # line 5 = 10000 - 3000 = 7000 @@ -47,14 +47,14 @@ casualty_loss_deduction: 0 standard_deduction: 1_000 real_estate_taxes: 8_000 - state_and_local_sales_or_income_tax: 6_000 + statelocal_sales_or_prior_inctax: 6_000 state_code: SC output: sc_state_tax_addback: 2_000 - # line 3 = 4000 - 1000 = 3000 + # line 3 = 4000 - 1000 = 3000 # line 4 = 6000 # line 5 = 10000 - 8000 = 2000 - + - name: Test case 4 #salt has a cap of 10000 for JOINT period: 2021 input: @@ -66,11 +66,11 @@ casualty_loss_deduction: 0 standard_deduction: 4_000 real_estate_taxes: 3_000 - state_and_local_sales_or_income_tax: 1_000 + statelocal_sales_or_prior_inctax: 1_000 state_code: SC output: sc_state_tax_addback: 0 - # line 3 = 2000 - 4000 = 0 + # line 3 = 2000 - 4000 = 0 # line 4 = 1000 # line 5 = 10000 - 3000 = 7000 @@ -85,7 +85,7 @@ casualty_loss_deduction: 0 standard_deduction: 1_000 real_estate_taxes: 8_000 - state_and_local_sales_or_income_tax: 6_000 + statelocal_sales_or_prior_inctax: 6_000 state_code: SC output: sc_state_tax_addback: 0 diff --git a/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_itemized_deductions.py b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_itemized_deductions.py index 95d160e45..2ef9d02ba 100644 --- a/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_itemized_deductions.py +++ b/fiscalsim_us/variables/gov/states/nm/tax/income/deductions/nm_itemized_deductions.py @@ -21,7 +21,7 @@ def formula(tax_unit, period, parameters): # tax/income, federal Schedule A, line 5a. 1 salt_sales_or_income = tax_unit( - "state_and_local_sales_or_income_tax", period + "statelocal_sales_or_prior_inctax", period ) # state_and_local_tax, line 5d. 2 total_salt = ( diff --git a/fiscalsim_us/variables/gov/states/sc/tax/income/sc_state_tax_addback.py b/fiscalsim_us/variables/gov/states/sc/tax/income/sc_state_tax_addback.py index 171207fd9..b2c99efec 100644 --- a/fiscalsim_us/variables/gov/states/sc/tax/income/sc_state_tax_addback.py +++ b/fiscalsim_us/variables/gov/states/sc/tax/income/sc_state_tax_addback.py @@ -36,7 +36,7 @@ def formula(tax_unit, period, parameters): 0, federal_itemized_deduction - federal_standard_deduction ) # line 4 - salt = tax_unit("state_and_local_sales_or_income_tax", period) + salt = tax_unit("statelocal_sales_or_prior_inctax", period) # line 5 real_estate_and_property_taxes = add( tax_unit, period, ["real_estate_taxes"] diff --git a/fiscalsim_us/variables/household/income/tax_unit/statelocal_sales_or_prior_inctax.py b/fiscalsim_us/variables/household/income/tax_unit/statelocal_sales_or_prior_inctax.py index d96ff5d1d..ba0532934 100644 --- a/fiscalsim_us/variables/household/income/tax_unit/statelocal_sales_or_prior_inctax.py +++ b/fiscalsim_us/variables/household/income/tax_unit/statelocal_sales_or_prior_inctax.py @@ -1,7 +1,7 @@ from fiscalsim_us.model_api import * -class sales_or_prior_year_state_and_local_income_tax_paid(Variable): +class statelocal_sales_or_prior_inctax(Variable): value_type = float entity = TaxUnit definition_period = YEAR From b25f29f893880c43c9113b32946b3169d5aee222 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 12:55:40 -0600 Subject: [PATCH 24/37] Fixed typo in deductions_if_not_itemizing.yaml --- .../gov/irs/deductions/deductions_if_not_itemizing.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fiscalsim_us/parameters/gov/irs/deductions/deductions_if_not_itemizing.yaml b/fiscalsim_us/parameters/gov/irs/deductions/deductions_if_not_itemizing.yaml index 6a6473150..0884996f6 100644 --- a/fiscalsim_us/parameters/gov/irs/deductions/deductions_if_not_itemizing.yaml +++ b/fiscalsim_us/parameters/gov/irs/deductions/deductions_if_not_itemizing.yaml @@ -5,5 +5,5 @@ values: - qualified_business_income_deduction metadata: unit: variable - name: taxable_income_deductions_if_itemizing - label: Taxable income deductions if itemizing + name: taxable_income_deductions_if_not_itemizing + label: Taxable income deductions if not itemizing From e320c731190a3b6540e4bad119c5c73e8a4dcc61 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 14:05:35 -0600 Subject: [PATCH 25/37] Fixed typo in us_itemiz.yaml --- .../tests/policy/baseline/gov/irs/integration/us_itemize.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fiscalsim_us/tests/policy/baseline/gov/irs/integration/us_itemize.yaml b/fiscalsim_us/tests/policy/baseline/gov/irs/integration/us_itemize.yaml index 6df4abd5b..4584f1d2c 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/irs/integration/us_itemize.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/irs/integration/us_itemize.yaml @@ -52,6 +52,6 @@ state_income_tax: 4_576.44 adjusted_gross_income: 100_000 taxable_income_deductions_if_not_itemizing: 12_550 - taxable_income_deductions_if_itemizing: 8_000 + 10_000 + taxable_income_deductions_if_itemizing: 8_000 + 6_000 tax_unit_itemizes: true - taxable_income: 100_000 - 18_000 + taxable_income: 100_000 - 14_000 From fe387c11bed83fd104d497f58fad9bddd752bbfd Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 14:16:10 -0600 Subject: [PATCH 26/37] Unlock Utah in state_income_tax.py --- .../variables/gov/states/tax/income/state_income_tax.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index ff9cbc950..9737bd28e 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -36,7 +36,7 @@ class state_income_tax(Variable): "pa_income_tax", "ri_income_tax", # "va_income_tax", --- temporarily deactivated until change if to where - # "ut_income_tax", --- temporarily deactivated until change if to where + "ut_income_tax", "wa_income_tax", "wi_income_tax", ] From 7fa252d9ff307a86e0353ab17c9da0da90a7683a Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 14:25:12 -0600 Subject: [PATCH 27/37] Unlocked NM, NY, OK, and OR --- .../variables/gov/states/tax/income/state_income_tax.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index 9737bd28e..0a3069a20 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -29,10 +29,10 @@ class state_income_tax(Variable): "ne_income_tax", "nh_income_tax", "nj_income_tax", - # "nm_income_tax", --- activating will cause circular logic errors - # "ny_income_tax", --- activating will cause circular logic errors - # "ok_income_tax", --- activating will cause circular logic errors - # "or_income_tax", --- activating will cause circular logic errors + "nm_income_tax", + "ny_income_tax", + "ok_income_tax", + "or_income_tax", "pa_income_tax", "ri_income_tax", # "va_income_tax", --- temporarily deactivated until change if to where From 6e64c50b869ec216bfa0a2c0d6236d5b77bf01c7 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 14:41:48 -0600 Subject: [PATCH 28/37] Unlocked LA, MA, MD, ME in state_income_tax.py --- .../variables/gov/states/tax/income/state_income_tax.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index 0a3069a20..9db214594 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -17,10 +17,10 @@ class state_income_tax(Variable): "in_income_tax", "ks_income_tax", "ky_income_tax", - # "la_income_tax", --- activating will cause circular logic errors - # "ma_income_tax", --- activating will cause circular logic errors - # "md_income_tax", --- activating will cause circular logic errors - # "me_income_tax", --- activating will cause circular logic errors + "la_income_tax", + "ma_income_tax", + "md_income_tax", + "me_income_tax", "mn_income_tax", "mt_income_tax", # "mo_income_tax", --- activating will cause circular logic errors From 3d6f45674168fc8a6c4d122e62332582b701f77b Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Fri, 13 Oct 2023 14:55:35 -0600 Subject: [PATCH 29/37] Unlock DC, IA in state_income_tax.py --- .../variables/gov/states/tax/income/state_income_tax.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index 9db214594..19560004e 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -11,8 +11,8 @@ class state_income_tax(Variable): # state income tax variables listed in alphabetical order: "ca_income_tax", # "co_income_tax", --- activating will cause circular logic errors - # "dc_income_tax", --- activating will cause circular logic errors - # "ia_income_tax", --- activating will cause circular logic errors + "dc_income_tax", + "ia_income_tax", "il_income_tax", "in_income_tax", "ks_income_tax", From 60339a60c2745c6e9964939dc59e58f6671bd802 Mon Sep 17 00:00:00 2001 From: mitchellpound Date: Sat, 21 Oct 2023 09:23:48 -0600 Subject: [PATCH 30/37] Fixed circularity for CO in state_income_tax var --- .../tax/income/additions/co_state_addback.py | 20 +++++-------------- .../gov/states/tax/income/state_income_tax.py | 2 +- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py b/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py index d4ca2cd45..45156587a 100644 --- a/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py +++ b/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py @@ -15,18 +15,8 @@ class co_state_addback(Variable): def formula(tax_unit, period, parameters): federal_itemizer = tax_unit("tax_unit_itemizes", period) - state_inctax = max_(0, tax_unit("state_income_tax", period)) - property_taxes = add(tax_unit, period, ["real_estate_taxes"]) - # follow worksheet on page 5 of 2021 Book cited above: - irs_schA_line_5d = state_inctax + property_taxes - irs_schA_line_5e = tax_unit("salt_deduction", period) - ws_line_a = where( - irs_schA_line_5d > irs_schA_line_5e, - max_(0, irs_schA_line_5e - property_taxes), - state_inctax, - ) - p = parameters(period).gov.irs.deductions - ws_line_b = add(tax_unit, period, p.itemized_deductions) - ws_line_c = tax_unit("standard_deduction", period) - ws_line_d = max_(0, ws_line_b - ws_line_c) - return federal_itemizer * min_(ws_line_a, ws_line_d) + # Colorado only requires taxpayers to add back state income tax from + # Federal Schedule A (line 5a). It does not require taxpayers to + # add back state real estate or property tax from Schedule A + state_inctax = max_(0, tax_unit("statelocal_sales_or_prior_inctax", period)) + return federal_itemizer * state_inctax diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index 19560004e..eb6cdb0fc 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -10,7 +10,7 @@ class state_income_tax(Variable): adds = [ # state income tax variables listed in alphabetical order: "ca_income_tax", - # "co_income_tax", --- activating will cause circular logic errors + "co_income_tax", #--- activating will cause circular logic errors "dc_income_tax", "ia_income_tax", "il_income_tax", From 5ca626a158d8901e4024e554ee397b20994fdd70 Mon Sep 17 00:00:00 2001 From: mitchellpound Date: Sat, 21 Oct 2023 14:35:12 -0600 Subject: [PATCH 31/37] Fixed MO circularity in state_income_tax --- .../mo/tax/income/taxable_income/mo_net_state_income_taxes.py | 2 +- .../variables/gov/states/tax/income/state_income_tax.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py b/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py index 1bd42e2b5..2c613661f 100644 --- a/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py +++ b/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py @@ -20,7 +20,7 @@ def formula(tax_unit, period, parameters): p = parameters(period).gov.irs.deductions.itemized salt_cap = p.salt_and_real_estate.cap[filing_status] - uncapped_itax = max_(0, add(tax_unit, period, ["state_income_tax"])) + uncapped_itax = max_(0, add(tax_unit, period, ["statelocal_sales_or_prior_inctax"])) uncapped_ptax = add(tax_unit, period, ["real_estate_taxes"]) uncapped_salt = uncapped_itax + uncapped_ptax diff --git a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py index eb6cdb0fc..da49d267f 100644 --- a/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py +++ b/fiscalsim_us/variables/gov/states/tax/income/state_income_tax.py @@ -10,7 +10,7 @@ class state_income_tax(Variable): adds = [ # state income tax variables listed in alphabetical order: "ca_income_tax", - "co_income_tax", #--- activating will cause circular logic errors + "co_income_tax", "dc_income_tax", "ia_income_tax", "il_income_tax", @@ -23,7 +23,7 @@ class state_income_tax(Variable): "me_income_tax", "mn_income_tax", "mt_income_tax", - # "mo_income_tax", --- activating will cause circular logic errors + "mo_income_tax", "nc_income_tax", "nd_income_tax", "ne_income_tax", From 317d7625c7f3be22e581c99cbd21b1d991d0b594 Mon Sep 17 00:00:00 2001 From: Samuel Sanft Date: Mon, 23 Oct 2023 17:45:57 -0400 Subject: [PATCH 32/37] update environment.yml --- environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index 8ea1ff530..7edf0354e 100644 --- a/environment.yml +++ b/environment.yml @@ -1,4 +1,4 @@ name: fiscalsim-us-dev dependencies: - - python=3.10 + - python>=3.10,<3.12 - pip From a166f87dc681475c6d15bc8ae6063fc3a939f5f8 Mon Sep 17 00:00:00 2001 From: Samuel Sanft Date: Mon, 23 Oct 2023 17:54:18 -0400 Subject: [PATCH 33/37] update github action --- .github/workflows/build_and_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 8b253eb26..1c3916fde 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -6,7 +6,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: ["3.10"] + python-version: ["3.10", "3.11"] steps: - name: Checkout From 2a355813326880632d6aa07d924bd43bf0e697b9 Mon Sep 17 00:00:00 2001 From: mitchellpound Date: Mon, 23 Oct 2023 20:31:11 -0600 Subject: [PATCH 34/37] Fixed tests --- .../mo_net_state_income_taxes.yaml | 8 +++--- .../tax/income/additions/co_state_addback.py | 26 ++++++++++++++----- .../mo_net_state_income_taxes.py | 4 ++- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.yaml b/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.yaml index e8707e5d5..2d14e7f93 100644 --- a/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.yaml +++ b/fiscalsim_us/tests/policy/baseline/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.yaml @@ -3,7 +3,7 @@ absolute_error_margin: 0 input: filing_status: SINGLE - state_income_tax: 0 + prior_year_state_income_tax_paid: 0 state_code: MO output: mo_net_state_income_taxes: 0.0 @@ -13,7 +13,7 @@ absolute_error_margin: 0.01 input: filing_status: SINGLE - state_income_tax: 23_000 + prior_year_state_income_tax_paid: 23_000 state_code: MO output: mo_net_state_income_taxes: 10_000 @@ -24,7 +24,7 @@ input: filing_status: SINGLE real_estate_taxes: 4_000 - state_income_tax: 3_000 + prior_year_state_income_tax_paid: 3_000 state_code: MO output: mo_net_state_income_taxes: 3_000 @@ -35,7 +35,7 @@ input: filing_status: JOINT real_estate_taxes: 4_000 - state_income_tax: 8_000 + prior_year_state_income_tax_paid: 8_000 state_code: MO output: mo_net_state_income_taxes: 6_666.67 # = 10_000 * 2/3 diff --git a/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py b/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py index 45156587a..efcb3b96b 100644 --- a/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py +++ b/fiscalsim_us/variables/gov/states/co/tax/income/additions/co_state_addback.py @@ -8,15 +8,27 @@ class co_state_addback(Variable): unit = USD definition_period = YEAR reference = ( - "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=5" - "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5" + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2021.pdf#page=5", + "https://tax.colorado.gov/sites/tax/files/documents/DR_104_Book_2022.pdf#page=5", + "https://tax.colorado.gov/sites/tax/files/documents/ITT_State_Income_Tax_Addback_Jan_2023.pdf", ) defined_for = StateCode.CO def formula(tax_unit, period, parameters): federal_itemizer = tax_unit("tax_unit_itemizes", period) - # Colorado only requires taxpayers to add back state income tax from - # Federal Schedule A (line 5a). It does not require taxpayers to - # add back state real estate or property tax from Schedule A - state_inctax = max_(0, tax_unit("statelocal_sales_or_prior_inctax", period)) - return federal_itemizer * state_inctax + + salt_deduct = tax_unit("salt_deduction", period) + local_taxes = add( + tax_unit, period, ["prior_year_local_income_tax_paid"] + ) + property_taxes = add(tax_unit, period, ["real_estate_taxes"]) + state_addback = max_(0, salt_deduct - local_taxes - property_taxes) + + # return the max between the "extra" itemized deductions above the std + # and the state taxes included in the SALT deduction + p = parameters(period).gov.irs.deductions + item_deducts = add(tax_unit, period, p.itemized_deductions) + std_deducts = tax_unit("standard_deduction", period) + alt_addback = max_(0, item_deducts - std_deducts) + + return federal_itemizer * min_(state_addback, alt_addback) diff --git a/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py b/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py index 2c613661f..63da281de 100644 --- a/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py +++ b/fiscalsim_us/variables/gov/states/mo/tax/income/taxable_income/mo_net_state_income_taxes.py @@ -20,7 +20,9 @@ def formula(tax_unit, period, parameters): p = parameters(period).gov.irs.deductions.itemized salt_cap = p.salt_and_real_estate.cap[filing_status] - uncapped_itax = max_(0, add(tax_unit, period, ["statelocal_sales_or_prior_inctax"])) + uncapped_itax = max_( + 0, add(tax_unit, period, ["prior_year_state_income_tax_paid"]) + ) uncapped_ptax = add(tax_unit, period, ["real_estate_taxes"]) uncapped_salt = uncapped_itax + uncapped_ptax From 2dd8ee9907e4d06cdc68e3fc48b2bdd8788034c8 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Tue, 24 Oct 2023 09:10:27 -0600 Subject: [PATCH 35/37] Updated version in setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b7c132e5d..a4594894d 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name="fiscalsim-us", - version="0.2.3", + version="0.2.4", author="Center for Growth and Opportunity at Utah State University (CGO)", author_email="fiscalsim@thecgo.org", long_description=readme, From 964d773e818c946c3bde5264767866ea0011ee44 Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Tue, 24 Oct 2023 09:12:08 -0600 Subject: [PATCH 36/37] Updated CHANGELOG.md --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ad434620..c58e5f853 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.2.4] - 2023-10-24 10:00:00 + +### Added + +- Fixed circularity in CO tax logic +- Fixed circularity in MO tax logic + ## [0.2.3] - 2023-10-13 16:00:00 ### Added @@ -171,6 +178,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - First prototype version based off of openfisca-us and tax-calculator. +[0.2.4]: https://github.com/TheCGO/fiscalsim-us/compare/v0.2.3...v0.2.4 [0.2.3]: https://github.com/TheCGO/fiscalsim-us/compare/v0.2.2...v0.2.3 [0.2.2]: https://github.com/TheCGO/fiscalsim-us/compare/v0.2.1...v0.2.2 [0.2.1]: https://github.com/TheCGO/fiscalsim-us/compare/v0.2.0...v0.2.1 From cc3e12d81fd34410fa757373c7120fa7c56ec4aa Mon Sep 17 00:00:00 2001 From: Richard Evans Date: Tue, 24 Oct 2023 09:13:35 -0600 Subject: [PATCH 37/37] Updated changelog.yaml --- changelog.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.yaml b/changelog.yaml index 5fffd669b..78b4d1bf5 100644 --- a/changelog.yaml +++ b/changelog.yaml @@ -157,3 +157,9 @@ - adjusted `salt_deduction.py` to calculate based on the added variables - Adds three files `prior_year_state_income_tax_paid.py`, `prior_year_local_income_tax_paid.py`, and `sales_or_prior_year_state_and_local_income_tax.py` date: 2023-10-13 16:00:00 +- bump: patch + changes: + added: + - Fixed circularity in CO tax logic + - Fixed circularity in MO tax logic + date: 2023-10-24 10:00:00