diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..aef46edaf39 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,8 @@ +- bump: minor + changes: + added: + - DC General Assistance for Children (GAC). + - DC TANF work requirements. + - DC Program on Work, Employment, and Responsibility (POWER). + fixed: + - Refactored formulas in accordance with TANF and GAC. diff --git a/policyengine_us/parameters/gov/states/dc/dhs/gac/README.md b/policyengine_us/parameters/gov/states/dc/dhs/gac/README.md new file mode 100644 index 00000000000..fd28de011eb --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/gac/README.md @@ -0,0 +1 @@ +# General Assistance for Children Program (GAC) diff --git a/policyengine_us/parameters/gov/states/dc/dhs/gac/income_disregard/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhs/gac/income_disregard/amount.yaml new file mode 100644 index 00000000000..3c101b0c521 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/gac/income_disregard/amount.yaml @@ -0,0 +1,12 @@ +description: The District of Columbia deducts this flat amount from the gross earned income under the General Assistance for Children program. + +values: + 2020-10-01: 7.5 + +metadata: + unit: currency-USD + period: month + label: DC GAC gross earned income disregard amount + reference: + - title: Code of the District of Columbia § 4-205.05a (f) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.05a#(f) diff --git a/policyengine_us/parameters/gov/states/dc/dhs/power/README.md b/policyengine_us/parameters/gov/states/dc/dhs/power/README.md new file mode 100644 index 00000000000..6fc0ad42b8c --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/power/README.md @@ -0,0 +1 @@ +# Program on Work, Employment, and Responsibility (POWER) diff --git a/policyengine_us/parameters/gov/states/dc/dhs/power/age_threshold/older.yaml b/policyengine_us/parameters/gov/states/dc/dhs/power/age_threshold/older.yaml new file mode 100644 index 00000000000..32a18f4792a --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/power/age_threshold/older.yaml @@ -0,0 +1,11 @@ +description: The District of Columbia provides the Program on Work, Employment, and Responsibility (POWER) to filers at this age or older. +values: + 2021-01-01: 60 + +metadata: + unit: year + period: year + label: DC POWER older age threshold + reference: + - title: Code of the District of Columbia § 4-205.72a (a)(5) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.72a diff --git a/policyengine_us/parameters/gov/states/dc/dhs/power/age_threshold/younger.yaml b/policyengine_us/parameters/gov/states/dc/dhs/power/age_threshold/younger.yaml new file mode 100644 index 00000000000..32354cdd75b --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/power/age_threshold/younger.yaml @@ -0,0 +1,11 @@ +description: The District of Columbia provides the Program on Work, Employment, and Responsibility (POWER) to filers younger than this age. +values: + 2021-01-01: 19 + +metadata: + unit: year + period: year + label: DC POWER younger age threshold + reference: + - title: Code of the District of Columbia § 4-205.72a (a)(3)(D) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.72a diff --git a/policyengine_us/parameters/gov/states/dc/dhs/power/disqualifying_benefits.yaml b/policyengine_us/parameters/gov/states/dc/dhs/power/disqualifying_benefits.yaml new file mode 100644 index 00000000000..065b2706c42 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/power/disqualifying_benefits.yaml @@ -0,0 +1,14 @@ +description: The District of Columbia considers receipt of these benefits as disqualifying for the Program on Work, Employment, and Responsibility (POWER). +values: + 1975-01-01: + - dc_tanf + - ssi + - unemployment_compensation + +metadata: + label: DC POWER disqualifying benefits + period: year + unit: list + reference: + - title: § 4-205.72. POWER — Establishment; eligibility. + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.72#(d) diff --git a/policyengine_us/parameters/gov/states/dc/dhs/qualified_noncitizen_statuses.yaml b/policyengine_us/parameters/gov/states/dc/dhs/qualified_noncitizen_statuses.yaml new file mode 100644 index 00000000000..4c856fbca8d --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/qualified_noncitizen_statuses.yaml @@ -0,0 +1,21 @@ +description: The District of Columbia considers these statuses as qualified noncitizens for the Temporary Assistance for Needy Families program. +values: + 1975-01-01: + - LEGAL_PERMANENT_RESIDENT + - ASYLEE + - REFUGEE + - PAROLED_ONE_YEAR + - DEPORTATION_WITHHELD + - CONDITIONAL_ENTRANT + - CUBAN_HAITIAN_ENTRANT + + +metadata: + label: DC TANF qualified noncitizen statuses + period: year + unit: list + reference: + - title: § 4-205.24. Eligibility requirements for alien children + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.24#(a) + - title: 8 U.S. Code § 1641 - Definitions + href: https://www.law.cornell.edu/uscode/text/8/1641 diff --git a/policyengine_us/parameters/gov/states/dc/dhs/tanf/standard_payment/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhs/tanf/standard_payment/amount.yaml index 05cd02ce84e..4bc9e52dc2c 100644 --- a/policyengine_us/parameters/gov/states/dc/dhs/tanf/standard_payment/amount.yaml +++ b/policyengine_us/parameters/gov/states/dc/dhs/tanf/standard_payment/amount.yaml @@ -4,7 +4,7 @@ metadata: unit: currency-USD period: month breakdown: - - range(1, 11) + - range(0, 20) label: DC TANF standard payment amount reference: - title: TANF for District Families diff --git a/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/amount.yaml new file mode 100644 index 00000000000..5fb2aee2278 --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/amount.yaml @@ -0,0 +1,20 @@ +description: The District of Columbia requires this amount of weekly working hours under the Temporary Assistance for Needy Families program, based on youngest child age. +metadata: + type: single_amount + threshold_unit: year + amount_unit: int + period: week + label: DC TANF single parent weekly working hours + reference: + - title: Code of the District of Columbia § 4-205.19b (b) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19b#(b) + +brackets: + - threshold: + 2021-01-01: 0 + amount: + 2021-01-01: 20 + - threshold: + 2021-01-01: 6 + amount: + 2021-01-01: 30 diff --git a/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/higher/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/higher/amount.yaml new file mode 100644 index 00000000000..7a3b40720eb --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/higher/amount.yaml @@ -0,0 +1,12 @@ +description: The District of Columbia requires this higher amount of weekly working hours under the Temporary Assistance for Needy Families program, if they do not include young child member. + +values: + 2020-10-01: 30 + +metadata: + unit: hour + period: week + label: DC TANF work requirement higher amount + reference: + - title: Code of the District of Columbia § 4-205.19b (b)(1) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19b#(b) diff --git a/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/lower/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/lower/amount.yaml new file mode 100644 index 00000000000..29de3da37ba --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/lower/amount.yaml @@ -0,0 +1,12 @@ +description: The District of Columbia requires this lower amount of weekly working hours under the Temporary Assistance for Needy Families program, if they include young child member. + +values: + 2020-10-01: 20 + +metadata: + unit: hour + period: week + label: DC TANF work requirement lower amount + reference: + - title: Code of the District of Columbia § 4-205.19b (b)(1) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19b#(b) diff --git a/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/lower/young_child_age_threshold.yaml b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/lower/young_child_age_threshold.yaml new file mode 100644 index 00000000000..b3a97182e4d --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/single_parent/lower/young_child_age_threshold.yaml @@ -0,0 +1,11 @@ +description: The District of Columbia provides a lower work requirement hours for applicants with children younger than this age under the Temporary Assistance for Needy Families program. +values: + 2021-01-01: 6 + +metadata: + unit: year + period: year + label: DC TANF work requirement young child age threshold + reference: + - title: Code of the District of Columbia § 4-205.19b (b)(1) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19b#(b) diff --git a/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/two_parents/amount.yaml b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/two_parents/amount.yaml new file mode 100644 index 00000000000..25c22337abc --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/required_hours/two_parents/amount.yaml @@ -0,0 +1,12 @@ +description: The District of Columbia requires this amount of combined weekly working hours for two-parent applicants under the Temporary Assistance for Needy Families program. + +values: + 2020-10-01: 35 + +metadata: + unit: hour + period: week + label: DC TANF two-parent work requirement amount + reference: + - title: Code of the District of Columbia § 4-205.19b (c) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19b#(c) diff --git a/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/work_exempted/elderly_age_threshold.yaml b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/work_exempted/elderly_age_threshold.yaml new file mode 100644 index 00000000000..f92f28e9ece --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/work_exempted/elderly_age_threshold.yaml @@ -0,0 +1,11 @@ +description: The District of Columbia exempts work requirement for applicants at than this age or older under the Temporary Assistance for Needy Families program. +values: + 2021-01-01: 60 + +metadata: + unit: year + period: year + label: DC TANF work exempted elderly age threshold + reference: + - title: Code of the District of Columbia § 4-205.19g (b)(3) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19g#(b) diff --git a/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/work_exempted/infant_age_threshold.yaml b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/work_exempted/infant_age_threshold.yaml new file mode 100644 index 00000000000..d0a13e79deb --- /dev/null +++ b/policyengine_us/parameters/gov/states/dc/dhs/tanf/work_requirement/work_exempted/infant_age_threshold.yaml @@ -0,0 +1,11 @@ +description: The District of Columbia exempts work requirement for single parent applicants with infant younger than this age under the Temporary Assistance for Needy Families program. +values: + 2021-01-01: 1 + +metadata: + unit: year + period: year + label: DC TANF work exempted infant age threshold + reference: + - title: Code of the District of Columbia § 4-205.19g (b)(2) + href: https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19g#(b) diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/tanf/cash/integration.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/tanf/cash/integration.yaml index ce73099554f..23bb22cf9d6 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/tanf/cash/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/tanf/cash/integration.yaml @@ -71,6 +71,7 @@ spm_unit: members: [parent, child] is_tanf_enrolled: true + dc_tanf_meets_work_requirements: true households: household: members: [parent, child] diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/dc_pap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/dc_pap_eligible_child.yaml new file mode 100644 index 00000000000..3e016069cad --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/dc_pap_eligible_child.yaml @@ -0,0 +1,47 @@ +- name: Default person is 18 and out of school, therefore ineligible child under Public Assistance Programs. + period: 2022 + output: + dc_pap_eligible_child: false + +- name: Is eligible for PAP due to children under 18 + period: 2022-01 + input: + age: 17 + is_tax_unit_dependent: true + is_in_secondary_school: false + immigration_status: CITIZEN + state_code: DC + output: + dc_pap_eligible_child: true + +- name: 18-year-old out of school is not eligible for PAP + period: 2022-01 + input: + age: 18 + is_in_secondary_school: false + immigration_status: CITIZEN + state_code: DC + output: + dc_pap_eligible_child: false + +- name: Is eligible for PAP due to being an 18-year-old in school + period: 2022-01 + input: + age: 18 + is_tax_unit_dependent: true + is_in_secondary_school: true + immigration_status: CITIZEN + state_code: DC + output: + dc_pap_eligible_child: true + +- name: Ineligible for PAP due to immigration status. + period: 2022-01 + input: + age: 18 + is_tax_unit_dependent: true + is_in_secondary_school: true + immigration_status: UNDOCUMENTED + state_code: DC + output: + dc_pap_eligible_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/dc_gac.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/dc_gac.yaml new file mode 100644 index 00000000000..6b41afbe8fd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/dc_gac.yaml @@ -0,0 +1,86 @@ +- name: Integration test 1, child is related to head or spouse, ineligible. + period: 2022 + input: + people: + person1: + age: 40 + employment_income: 4_000 + person2: + age: 1 + is_tax_unit_dependent: true + is_related_to_head_or_spouse: true + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_gac_assistance_unit_size: 0 + dc_gac_eligible: false + +- name: Integration test 2 + period: 2024-01 + input: + people: + person1: + age: 40 + employment_income: 4_000 + person2: + age: 1 + employment_income: 0 + is_tax_unit_dependent: true + is_related_to_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_gac_eligible_child: [false, true] + dc_gac_assistance_unit_size: 1 + dc_gac_standard_payment: 450 + dc_gac_countable_income: 0 + dc_gac_eligible: true + dc_gac: 450 + +- name: Integration test 3 + period: 2024-01 + input: + people: + person1: + age: 40 + employment_income: 4_000 + person2: + age: 17 + employment_income: 3_600 # $300 monthly + is_tax_unit_dependent: true + monthly_hours_worked: 120 * 12 + is_full_time_student: false + is_related_to_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_gac_eligible_child: [false, true] + dc_gac_assistance_unit_size: 1 + dc_gac_standard_payment: 450 + dc_gac_countable_income: 292.5 + dc_gac_eligible: true + dc_gac: 157.5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/dc_gac_standard_payment.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/dc_gac_standard_payment.yaml new file mode 100644 index 00000000000..f10d1b8aef4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/dc_gac_standard_payment.yaml @@ -0,0 +1,39 @@ +- name: If one person, grant standard is $437 * 12/yr. + period: 2022 + input: + state_code: DC + dc_gac_assistance_unit_size: 1 + output: + dc_gac_standard_payment: 437 * 12 + +- name: If ten people, grant standard is $1750 * 12/yr. + period: 2022 + input: + state_code: DC + dc_gac_assistance_unit_size: 10 + output: + dc_gac_standard_payment: 1_750 * 12 + +- name: Only calculate for DC. + period: 2023 + input: + state_code: VA + dc_gac_assistance_unit_size: 10 + output: + dc_gac_standard_payment: 0 + +- name: 17 people in 2022, should be capped at 10 + period: 2022 + input: + state_code: DC + dc_gac_assistance_unit_size: 17 + output: + dc_gac_standard_payment: 1_750 * 12 + +- name: 17 people in january of 2024, should be capped at 19 + period: 2024-01 + input: + state_code: DC + dc_gac_assistance_unit_size: 17 + output: + dc_gac_standard_payment: 2_668 diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible.yaml new file mode 100644 index 00000000000..83f4b846ddb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible.yaml @@ -0,0 +1,39 @@ +- name: Is demographic eligible, income eligible and resource eligible. + period: 2023-01 + input: + state_code: DC + dc_gac_eligible_child: true + dc_gac_income_eligible: true + dc_tanf_resources_eligible: true + output: + dc_gac_eligible: true + +- name: Is demographic eligible, income eligible but not resource eligible. + period: 2023-01 + input: + state_code: DC + dc_gac_eligible_child: true + dc_gac_income_eligible: true + dc_tanf_resources_eligible: false + output: + dc_gac_eligible: false + +- name: Is demographic eligible, resource eligible but not income eligible. + period: 2023-01 + input: + state_code: DC + dc_gac_eligible_child: true + dc_gac_income_eligible: false + dc_tanf_resources_eligible: true + output: + dc_gac_eligible: false + +- name: Is resource eligible, income eligible but not demographic eligible. + period: 2023-01 + input: + state_code: DC + dc_gac_eligible_child: false + dc_gac_income_eligible: true + dc_tanf_resources_eligible: true + output: + dc_gac_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible_child.yaml new file mode 100644 index 00000000000..723e97fae0f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible_child.yaml @@ -0,0 +1,58 @@ +- name: Is eligible for GAC due to children under 18 + period: 2022-01 + input: + age: 17 + is_tax_unit_dependent: true + is_in_secondary_school: false + is_related_to_head_or_spouse: false + immigration_status: CITIZEN + state_code: DC + output: + dc_gac_eligible_child: true + +- name: 18-year-old out of school is not eligible for GAC + period: 2022-01 + input: + age: 18 + is_in_secondary_school: false + is_related_to_head_or_spouse: false + immigration_status: CITIZEN + state_code: DC + output: + dc_gac_eligible_child: false + +- name: Is eligible for GAC due to being an 18-year-old in school + period: 2022-01 + input: + age: 18 + is_tax_unit_dependent: true + is_in_secondary_school: true + is_related_to_head_or_spouse: false + immigration_status: CITIZEN + state_code: DC + output: + dc_gac_eligible_child: true + +- name: Is ineligible for GAC due to related to head or spouse. + period: 2022-01 + input: + age: 18 + is_tax_unit_dependent: true + is_in_secondary_school: true + is_related_to_head_or_spouse: true + immigration_status: CITIZEN + state_code: DC + output: + dc_gac_eligible_child: false + +- name: Is ineligible for GAC due to immigration status. + period: 2022-01 + input: + age: 18 + is_tax_unit_dependent: true + is_in_secondary_school: true + is_related_to_head_or_spouse: false + immigration_status: UNDOCUMENTED + state_code: DC + output: + dc_gac_eligible_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/eligibility/dc_gac_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/eligibility/dc_gac_income_eligible.yaml new file mode 100644 index 00000000000..5a60efe7269 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/eligibility/dc_gac_income_eligible.yaml @@ -0,0 +1,26 @@ +- name: Household with no income is eligible. + period: 2023 + input: + state_code: DC + dc_gac_standard_payment: 1 + dc_gac_countable_income: 0 + output: + dc_gac_income_eligible: true + +- name: Household with income equals need standard is eligible. + period: 2023 + input: + state_code: DC + dc_gac_standard_payment: 1 + dc_gac_countable_income: 1 + output: + dc_gac_income_eligible: true + +- name: Household with income exceeding need standard is ineligible. + period: 2023 + input: + state_code: DC + dc_gac_standard_payment: 1 + dc_gac_countable_income: 2 + output: + dc_gac_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/income/dc_gac_earned_income_after_disregard_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/income/dc_gac_earned_income_after_disregard_person.yaml new file mode 100644 index 00000000000..2f93cec0ea1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/gac/income/dc_gac_earned_income_after_disregard_person.yaml @@ -0,0 +1,32 @@ +- name: Full time student earnings are fully disregarded. + period: 2023-01 + input: + dc_tanf_gross_earned_income: 100 + is_full_time_student: true + monthly_hours_worked: 120 * 12 + dc_gac_eligible_child: true + state_code: DC + output: + dc_gac_earned_income_after_disregard_person: 0 + +- name: Only GAC eligible child income counts. + period: 2023-01 + input: + dc_tanf_gross_earned_income: 100 + is_full_time_student: false + monthly_hours_worked: 120 *12 + dc_gac_eligible_child: false + state_code: DC + output: + dc_gac_earned_income_after_disregard_person: 0 + +- name: Part-time student and working full time get $7.5 disregarded. + period: 2023-01 + input: + dc_tanf_gross_earned_income: 100 + is_full_time_student: false + monthly_hours_worked: 120 * 12 + dc_gac_eligible_child: true + state_code: DC + output: + dc_gac_earned_income_after_disregard_person: 92.5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/integration_tests.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/integration_tests.yaml new file mode 100644 index 00000000000..64ca7bb7f31 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/integration_tests.yaml @@ -0,0 +1,171 @@ +- name: Case 1, applicant has an eligible child. + period: 2024-01 + input: + people: + person1: + age: 40 + employment_income: 6_000 + weekly_hours_worked: 25 + person2: + age: 1 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: false + childcare_expenses: 5_000 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_tanf_childcare_deduction: 200 + dc_tanf_earned_income_after_disregard_person: [340, 0] + dc_tanf_countable_income: 140 + dc_tanf_standard_payment: 560 + dc_tanf_eligible: true + dc_tanf: 420 + dc_gac_eligible: false + dc_gac: 0 + dc_power_eligible: false + dc_power: 0 + +- name: Case 2, testing GAC, applicant has a TANF unrelated child. + period: 2024-01 + input: + people: + person1: + age: 40 + employment_income: 4_020 + person2: + age: 1 + is_tax_unit_dependent: true + is_related_to_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2] + childcare_expenses: 0 + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_tanf_assistance_unit_size: 1 + dc_tanf_eligible: false + dc_tanf: 0 + dc_gac_eligible: true + dc_gac: 450 + +- name: Case 3, testing TANF and POWER, applicants is working and has an incapacitated member, take TANF. + period: 2024-01 + input: + people: + person1: + age: 40 + employment_income: 6_000 + weekly_hours_worked: 40 + person2: + age: 3 + is_tax_unit_dependent: true + is_incapable_of_self_care: true + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: false + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_tanf_assistance_unit_size: 2 + dc_tanf_eligible: true + dc_tanf_countable_income: 340 + dc_tanf_standard_payment: 560 + dc_tanf: 220 + dc_power_eligible: false + dc_power: 0 + +- name: Case 4, testing TANF and POWER, applicants is not working, ineligible for TANF, eligible for POWER. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 0 + weekly_hours_worked: 0 + is_parent: true + person2: + age: 3 + is_tax_unit_dependent: true + is_incapable_of_self_care: true + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: false + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_tanf_assistance_unit_size: 2 + dc_tanf_eligible: false + dc_tanf_countable_income: 0 + dc_tanf_standard_payment: 560 + dc_tanf: 0 + dc_tanf_basic_eligibility_requirements: true + dc_power_head_or_spouse_eligible: [true, false] + dc_power_eligible: true + dc_power: 560 + +- name: Case 5, testing GAC and TANF and POWER, applicant has two child, one related to head or spouse, one is not related, + period: 2024-01 + input: + people: + person1: + age: 40 + employment_income: 6_000 + weekly_hours_worked: 0 + is_parent: true + person2: + age: 3 + is_tax_unit_dependent: true + is_incapable_of_self_care: true + person3: + age: 8 + is_tax_unit_dependent: true + is_related_to_head_or_spouse: false + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_tanf_assistance_unit_size: 2 + dc_gac_assistance_unit_size: 1 + dc_tanf_eligible: false + dc_power_eligible: true + dc_gac_eligible: true + dc_tanf: 0 + dc_gac: 450 + dc_tanf_countable_income: 340 + dc_tanf_standard_payment: 560 + dc_power: 220 + diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/power/dc_power.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/power/dc_power.yaml new file mode 100644 index 00000000000..e9a126f8b8b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/power/dc_power.yaml @@ -0,0 +1,26 @@ +- name: If ineligible, they get zero. + period: 2023 + input: + dc_power_eligible: false + dc_tanf_standard_payment: 100 + dc_tanf_countable_income: 0 + output: + dc_power: 0 + +- name: If eligible, they get difference between grant standard and countable income. + period: 2023 + input: + dc_power_eligible: true + dc_tanf_standard_payment: 100 + dc_tanf_countable_income: 0 + output: + dc_power: 100 + +- name: If eligible but countable income exceeds grant standard, they get 0. + period: 2023 + input: + dc_power_eligible: true + dc_tanf_standard_payment: 100 + dc_tanf_countable_income: 110 + output: + dc_power: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/power/dc_power_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/power/dc_power_eligible.yaml new file mode 100644 index 00000000000..1a71c2dfce7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/power/dc_power_eligible.yaml @@ -0,0 +1,94 @@ +- name: Case 1, family of 4. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 60 + is_tax_unit_head: true + person2: + age: 59 + is_tax_unit_spouse: true + person3: + age: 3 + is_tax_unit_dependent: true + person4: + age: 30 + is_pregnant: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + dc_tanf_basic_eligibility_requirements: true + dc_power_has_disqualifying_benefits: false + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: DC + output: + dc_power_head_or_spouse_eligible: [true, false, false, false] + dc_power_eligible: true + +- name: Case 2, does not meet TANF basic eligibility requirements. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + weekly_hours_worked: 0 + person2: + is_tax_unit_dependent: true + is_incapable_of_self_care: true + weekly_hours_worked: 0 + person3: + age: 5 + is_tax_unit_dependent: true + weekly_hours_worked: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + dc_tanf_basic_eligibility_requirements: false + dc_power_has_disqualifying_benefits: false + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_power_eligible: false + +- name: Case 3, receives ssi, not eligible. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + ssi: 10 + weekly_hours_worked: 0 + person2: + is_incapable_of_self_care: true + weekly_hours_worked: 0 + person3: + age: 5 + is_tax_unit_dependent: true + weekly_hours_worked: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_power_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/power/dc_power_head_or_spouse_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/power/dc_power_head_or_spouse_eligible.yaml new file mode 100644 index 00000000000..7f3dbcbe237 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/power/dc_power_head_or_spouse_eligible.yaml @@ -0,0 +1,84 @@ +- name: Case 1, has incapacitated member. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + is_parent: true + person2: + age: 30 + is_tax_unit_spouse: true + is_incapable_of_self_care: true + is_parent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_power_head_or_spouse_eligible: [true, true, false] + +- name: Case 2, spouse is pregnant. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + person2: + age: 18 + is_tax_unit_spouse: true + is_pregnant: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_power_head_or_spouse_eligible: [false, true, false] + +- name: Case 3, is older than 60 years old. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 60 + is_tax_unit_head: true + person2: + age: 59 + is_tax_unit_spouse: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_power_head_or_spouse_eligible: [true, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_assistance_unit_size.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_assistance_unit_size.yaml new file mode 100644 index 00000000000..07f15bfe34f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_assistance_unit_size.yaml @@ -0,0 +1,17 @@ +- name: Case 1, all members are in TANF assistance unit size. + period: 2024-01 + input: + spm_unit_size: 3 + dc_gac_assistance_unit_size: 0 + state_code: DC + output: + dc_tanf_assistance_unit_size: 3 + +- name: Case 2, one member is in GAC assistance unit. + period: 2024-01 + input: + spm_unit_size: 3 + dc_gac_assistance_unit_size: 1 + state_code: DC + output: + dc_tanf_assistance_unit_size: 2 diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_standard_payment.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_standard_payment.yaml index eecec3ff0d7..c6c135031f5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_standard_payment.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/dc_tanf_standard_payment.yaml @@ -2,7 +2,7 @@ period: 2022 input: state_code: DC - spm_unit_size: 1 + dc_tanf_assistance_unit_size: 1 output: dc_tanf_standard_payment: 437 * 12 @@ -10,7 +10,7 @@ period: 2022 input: state_code: DC - spm_unit_size: 10 + dc_tanf_assistance_unit_size: 10 output: dc_tanf_standard_payment: 1_750 * 12 @@ -18,7 +18,7 @@ period: 2023 input: state_code: VA - spm_unit_size: 10 + dc_tanf_assistance_unit_size: 10 output: dc_tanf_standard_payment: 0 @@ -26,7 +26,7 @@ period: 2022 input: state_code: DC - spm_unit_size: 17 + dc_tanf_assistance_unit_size: 17 output: dc_tanf_standard_payment: 1_750 * 12 @@ -34,6 +34,6 @@ period: 2024-01 input: state_code: DC - spm_unit_size: 17 + dc_tanf_assistance_unit_size: 17 output: dc_tanf_standard_payment: 2_668 diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_basic_eligibility_requirements.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_basic_eligibility_requirements.yaml new file mode 100644 index 00000000000..564c0476d88 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_basic_eligibility_requirements.yaml @@ -0,0 +1,39 @@ +- name: Is demographic eligible, income eligible and resource eligible. + period: 2023-01 + input: + state_code: DC + dc_tanf_demographic_eligible_person: true + dc_tanf_income_eligible: true + dc_tanf_resources_eligible: true + output: + dc_tanf_basic_eligibility_requirements: true + +- name: Is demographic eligible, income eligible but not resource eligible. + period: 2023-01 + input: + state_code: DC + dc_tanf_demographic_eligible_person: true + dc_tanf_income_eligible: true + dc_tanf_resources_eligible: false + output: + dc_tanf_basic_eligibility_requirements: false + +- name: Is demographic eligible, resource eligible but not income eligible. + period: 2023-01 + input: + state_code: DC + dc_tanf_demographic_eligible_person: true + dc_tanf_income_eligible: false + dc_tanf_resources_eligible: true + output: + dc_tanf_basic_eligibility_requirements: false + +- name: Is resource eligible, income eligible but not demographic eligible. + period: 2023-01 + input: + state_code: DC + dc_tanf_demographic_eligible_person: false + dc_tanf_income_eligible: true + dc_tanf_resources_eligible: true + output: + dc_tanf_basic_eligibility_requirements: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_demographic_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_demographic_eligible_person.yaml index 014532a849d..30241012d90 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_demographic_eligible_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_demographic_eligible_person.yaml @@ -39,3 +39,14 @@ state_code: DC output: dc_tanf_demographic_eligible_person: true + +- name: Is ineligible for TANF due to not related to head or spouse. + period: 2022-01 + input: + age: 17 + is_tax_unit_dependent: true + is_in_secondary_school: false + is_related_to_head_or_spouse: false + state_code: DC + output: + dc_tanf_demographic_eligible_person: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_eligible.yaml index 08ea66e115f..1b426416ac4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_eligible.yaml @@ -5,7 +5,7 @@ dc_tanf_demographic_eligible_person: true dc_tanf_income_eligible: true dc_tanf_resources_eligible: true - dc_tanf_immigration_status_eligible_person: true + dc_tanf_meets_work_requirements: true output: dc_tanf_eligible: true @@ -16,7 +16,7 @@ dc_tanf_demographic_eligible_person: true dc_tanf_income_eligible: true dc_tanf_resources_eligible: false - dc_tanf_immigration_status_eligible_person: true + dc_tanf_meets_work_requirements: true output: dc_tanf_eligible: false @@ -27,7 +27,7 @@ dc_tanf_demographic_eligible_person: true dc_tanf_income_eligible: false dc_tanf_resources_eligible: true - dc_tanf_immigration_status_eligible_person: true + dc_tanf_meets_work_requirements: true output: dc_tanf_eligible: false @@ -38,17 +38,17 @@ dc_tanf_demographic_eligible_person: false dc_tanf_income_eligible: true dc_tanf_resources_eligible: true - dc_tanf_immigration_status_eligible_person: true + dc_tanf_meets_work_requirements: true output: dc_tanf_eligible: false -- name: Immigration status ineligible. +- name: Does not meet work requirement. period: 2023-01 input: state_code: DC dc_tanf_demographic_eligible_person: true dc_tanf_income_eligible: true dc_tanf_resources_eligible: true - dc_tanf_immigration_status_eligible_person: false + dc_tanf_meets_work_requirements: false output: dc_tanf_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_immigration_status_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_immigration_status_eligible_person.yaml index db022f11a84..e68b2ee69dc 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_immigration_status_eligible_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_immigration_status_eligible_person.yaml @@ -2,7 +2,6 @@ period: 2023 input: immigration_status: REFUGEE - is_ssi_qualified_noncitizen: true state_code: DC output: dc_tanf_immigration_status_eligible_person: true @@ -11,25 +10,14 @@ period: 2023 input: immigration_status: UNDOCUMENTED - is_ssi_qualified_noncitizen: false state_code: DC output: dc_tanf_immigration_status_eligible_person: false -- name: Eligible refugee - period: 2023 - input: - immigration_status: REFUGEE - is_ssi_qualified_noncitizen: true - state_code: DC - output: - dc_tanf_immigration_status_eligible_person: true - - name: Eligible citizen period: 2023 input: immigration_status: CITIZEN - is_ssi_qualified_noncitizen: false state_code: DC output: dc_tanf_immigration_status_eligible_person: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_income_eligible.yaml index 549299e5811..3bab3c3b2ee 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/eligibility/dc_tanf_income_eligible.yaml @@ -7,7 +7,6 @@ output: dc_tanf_income_eligible: true - - name: Household with income equals need standard is eligible. period: 2023 input: @@ -17,7 +16,6 @@ output: dc_tanf_income_eligible: true - - name: Household with income exceeding need standard is ineligible. period: 2023 input: diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/integration.yaml index 951024aa110..98c2dc8ea3b 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/integration.yaml @@ -8,6 +8,7 @@ spm_units: spm_unit: members: [parent, child] + dc_tanf_meets_work_requirements: true households: household: members: [parent, child] @@ -15,7 +16,7 @@ output: dc_tanf: 545*12 -- name: Case 2, applicant has a eligible child. +- name: Case 2, applicant has an eligible child. period: 2022 input: people: @@ -30,6 +31,7 @@ members: [person1, person2] is_tanf_enrolled: false childcare_expenses: 5_000 + dc_tanf_meets_work_requirements: true tax_units: tax_unit: members: [person1, person2] @@ -45,7 +47,7 @@ dc_tanf_eligible: true dc_tanf: 545*12 -- name: Case 3, applicant has a eligible child enrolled in tanf. +- name: Case 3, applicant has an eligible child enrolled in TANF. period: 2022 input: people: @@ -60,6 +62,7 @@ members: [person1, person2] is_tanf_enrolled: true childcare_expenses: 0 + dc_tanf_meets_work_requirements: true tax_units: tax_unit: members: [person1, person2] @@ -90,6 +93,7 @@ members: [person1, person2] is_tanf_enrolled: false childcare_expenses: 1_200 + dc_tanf_meets_work_requirements: true tax_units: tax_unit: members: [person1, person2] diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_is_working.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_is_working.yaml new file mode 100644 index 00000000000..a8912497fd7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_is_working.yaml @@ -0,0 +1,128 @@ +- name: Case 1, two-parent household, combined hours higher than 35. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 30 + person2: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 5 + person3: + is_tax_unit_head_or_spouse: false + weekly_hours_worked: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_tanf_is_working: [true, true, true] + +- name: Case 2, two-parent household, combined hours lower than 35. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 30 + person2: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 4 + person3: + is_tax_unit_head_or_spouse: false + weekly_hours_worked: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_tanf_is_working: [false, false, false] + +- name: Case 3, single parent household, has child under 6. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 20 + person2: + age: 5 + is_tax_unit_head_or_spouse: false + weekly_hours_worked: 0 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_tanf_is_working: [true, false] + +- name: Case 4, single parent household, no child under 6. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 20 + person2: + age: 8 + is_tax_unit_head_or_spouse: false + weekly_hours_worked: 0 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_tanf_is_working: [false, false] + +- name: Case 5, single parent household, no child under 6, eligible because work 30 hours a week. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 30 + person2: + age: 8 + is_tax_unit_head_or_spouse: false + weekly_hours_worked: 0 + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: DC + output: + dc_tanf_is_working: [true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_meets_work_requirements.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_meets_work_requirements.yaml new file mode 100644 index 00000000000..b45e11ce122 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_meets_work_requirements.yaml @@ -0,0 +1,53 @@ +- name: Case 1, two-parent household, combined hours higher than 35. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 30 + person2: + is_tax_unit_head_or_spouse: true + weekly_hours_worked: 5 + person3: + is_tax_unit_head_or_spouse: false + weekly_hours_worked: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_tanf_meets_work_requirements: true + +- name: Case 2, single parent household with an infant. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + person2: + age: 61 + person3: + age: 0.5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + filing_status: SINGLE + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_tanf_meets_work_requirements: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_work_requirement_exempt.yaml b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_work_requirement_exempt.yaml new file mode 100644 index 00000000000..88979d7a224 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_work_requirement_exempt.yaml @@ -0,0 +1,81 @@ +- name: Case 1, family of 4. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 61 + person2: + age: 60 + person3: + age: 3 + is_tax_unit_dependent: true + person4: + age: 30 + is_pregnant: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: DC + output: + dc_tanf_work_requirement_exempt: [true, false, true, false] + +- name: Case 2, single parent household with an infant. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + person2: + age: 35 + person3: + age: 0.5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + filing_status: SINGLE + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_tanf_work_requirement_exempt: [true, false, true] + +- name: Case 3, has college student. + period: 2023-01 + absolute_error_margin: 0.5 + input: + people: + person1: + age: 30 + is_tax_unit_head: true + person2: + age: 23 + is_full_time_college_student: true + person3: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: DC + output: + dc_tanf_work_requirement_exempt: [false, true, true] diff --git a/policyengine_us/variables/gov/states/dc/dhs/dc_pap_eligible_child.py b/policyengine_us/variables/gov/states/dc/dhs/dc_pap_eligible_child.py new file mode 100644 index 00000000000..7ddb1729e89 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/dc_pap_eligible_child.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class dc_pap_eligible_child(Variable): + value_type = bool + entity = Person + definition_period = MONTH + label = "Eligible child for DC Public Assistance Programs based on demographics" + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.18" + ) + defined_for = "dc_tanf_immigration_status_eligible_person" + + def formula(person, period, parameters): + p = parameters(period).gov.states.dc.dhs.tanf.age_threshold + age = person("monthly_age", period) + dependent = person("is_tax_unit_dependent", period) + secondary_school_student = person("is_in_secondary_school", period) + age_limit = where( + secondary_school_student, p.student_dependent, p.minor_child + ) + + return dependent & (age < age_limit) diff --git a/policyengine_us/variables/gov/states/dc/dhs/gac/dc_gac.py b/policyengine_us/variables/gov/states/dc/dhs/gac/dc_gac.py new file mode 100644 index 00000000000..b3c8a0406d9 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/gac/dc_gac.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class dc_gac(Variable): + value_type = float + entity = SPMUnit + label = "DC General Assistance for Children (GAC)" + unit = USD + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.05a" + ) + defined_for = "dc_gac_eligible" + + def formula(spm_unit, period, parameters): + countable_income = spm_unit("dc_gac_countable_income", period) + standard_payment = spm_unit("dc_gac_standard_payment", period) + return max_(standard_payment - countable_income, 0) diff --git a/policyengine_us/variables/gov/states/dc/dhs/gac/dc_gac_assistance_unit_size.py b/policyengine_us/variables/gov/states/dc/dhs/gac/dc_gac_assistance_unit_size.py new file mode 100644 index 00000000000..971708e86cc --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/gac/dc_gac_assistance_unit_size.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class dc_gac_assistance_unit_size(Variable): + value_type = int + entity = SPMUnit + label = "DC General Assistance for Children (GAC) assistance unit size" + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.05a" + ) + defined_for = StateCode.DC + + # Only eligible child can be counted as a member of the GAC assistance unit. + adds = ["dc_gac_eligible_child"] diff --git a/policyengine_us/variables/gov/states/dc/dhs/gac/dc_gac_standard_payment.py b/policyengine_us/variables/gov/states/dc/dhs/gac/dc_gac_standard_payment.py new file mode 100644 index 00000000000..34565be8d1f --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/gac/dc_gac_standard_payment.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class dc_gac_standard_payment(Variable): + value_type = float + entity = SPMUnit + label = "DC General Assistance for Children (GAC) standard payment" + unit = USD + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.52" + ) + defined_for = StateCode.DC + + def formula(spm_unit, period, parameters): + unit_size = spm_unit("dc_gac_assistance_unit_size", period) + p = parameters(period).gov.states.dc.dhs.tanf.standard_payment + capped_unit_size = min_(unit_size, p.max_unit_size) + return p.amount[capped_unit_size] diff --git a/policyengine_us/variables/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible.py b/policyengine_us/variables/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible.py new file mode 100644 index 00000000000..2c077c9af93 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class dc_gac_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for DC General Assistance for Children (GAC)" + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.05a#(c)" + ) + defined_for = "dc_gac_income_eligible" + + def formula(spm_unit, period, parameters): + has_eligible_child = ( + add(spm_unit, period, ["dc_gac_eligible_child"]) > 0 + ) + resources_eligible = spm_unit("dc_tanf_resources_eligible", period) + + return has_eligible_child & resources_eligible diff --git a/policyengine_us/variables/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible_child.py b/policyengine_us/variables/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible_child.py new file mode 100644 index 00000000000..fabbc641d5d --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/gac/eligibility/dc_gac_eligible_child.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class dc_gac_eligible_child(Variable): + value_type = bool + entity = Person + definition_period = MONTH + label = "Eligible child for DC General Assistance for Children (GAC) based on demographics" + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.05a" + ) + defined_for = "dc_pap_eligible_child" + + def formula(person, period, parameters): + return ~person("is_related_to_head_or_spouse", period) diff --git a/policyengine_us/variables/gov/states/dc/dhs/gac/eligibility/dc_gac_income_eligible.py b/policyengine_us/variables/gov/states/dc/dhs/gac/eligibility/dc_gac_income_eligible.py new file mode 100644 index 00000000000..eed682a6a63 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/gac/eligibility/dc_gac_income_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class dc_gac_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = ( + "Eligible for DC General Assistance for Children (GAC) due to income" + ) + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.10" + ) + defined_for = StateCode.DC + + def formula(spm_unit, period, parameters): + countable_income = spm_unit("dc_gac_countable_income", period) + standard_payment = spm_unit("dc_gac_standard_payment", period) + return countable_income <= standard_payment diff --git a/policyengine_us/variables/gov/states/dc/dhs/gac/income/dc_gac_countable_income.py b/policyengine_us/variables/gov/states/dc/dhs/gac/income/dc_gac_countable_income.py new file mode 100644 index 00000000000..fd59fa70a28 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/gac/income/dc_gac_countable_income.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class dc_gac_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "DC General Assistance for Children (GAC) countable income" + unit = USD + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.05a#(e)" + ) + defined_for = StateCode.DC + + adds = [ + "dc_gac_earned_income_after_disregard_person", + "dc_gac_countable_unearned_income_person", + ] diff --git a/policyengine_us/variables/gov/states/dc/dhs/gac/income/dc_gac_countable_unearned_income_person.py b/policyengine_us/variables/gov/states/dc/dhs/gac/income/dc_gac_countable_unearned_income_person.py new file mode 100644 index 00000000000..0acedf63e4f --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/gac/income/dc_gac_countable_unearned_income_person.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class dc_gac_countable_unearned_income_person(Variable): + value_type = float + entity = Person + label = ( + "DC General Assistance for Children (GAC) unearned income per person" + ) + unit = USD + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.05a#(e)" + ) + defined_for = "dc_gac_eligible_child" + + adds = ["dc_tanf_gross_unearned_income"] diff --git a/policyengine_us/variables/gov/states/dc/dhs/gac/income/dc_gac_earned_income_after_disregard_person.py b/policyengine_us/variables/gov/states/dc/dhs/gac/income/dc_gac_earned_income_after_disregard_person.py new file mode 100644 index 00000000000..ce5fa51eb04 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/gac/income/dc_gac_earned_income_after_disregard_person.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class dc_gac_earned_income_after_disregard_person(Variable): + value_type = float + entity = Person + label = "DC General Assistance for Children (GAC) earned income after disregard per person" + unit = USD + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.05a#(e)" + ) + defined_for = "dc_gac_eligible_child" + + def formula(person, period, parameters): + p = parameters(period).gov.states.dc.dhs + gross_earnings = person("dc_tanf_gross_earned_income", period) + adjusted_income = max_( + gross_earnings - p.gac.income_disregard.amount, 0 + ) + full_time_student = person("is_full_time_student", period) + weekly_hours_worked = person("monthly_hours_worked", period) + work_full_time = ( + weekly_hours_worked + >= p.tanf.work_requirement.required_hours.single_parent.higher.amount + ) + + return where(work_full_time & ~full_time_student, adjusted_income, 0) diff --git a/policyengine_us/variables/gov/states/dc/dhs/power/dc_power.py b/policyengine_us/variables/gov/states/dc/dhs/power/dc_power.py new file mode 100644 index 00000000000..2f4d663434e --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/power/dc_power.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class dc_power(Variable): + value_type = float + entity = SPMUnit + label = "DC Program on Work, Employment, and Responsibility (POWER)" + unit = USD + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.52" + ) + defined_for = "dc_power_eligible" + + def formula(spm_unit, period, parameters): + standard_payment = spm_unit("dc_tanf_standard_payment", period) + countable_income = spm_unit("dc_tanf_countable_income", period) + return max_(standard_payment - countable_income, 0) diff --git a/policyengine_us/variables/gov/states/dc/dhs/power/dc_power_eligible.py b/policyengine_us/variables/gov/states/dc/dhs/power/dc_power_eligible.py new file mode 100644 index 00000000000..7a4c192aa98 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/power/dc_power_eligible.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class dc_power_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + label = "Eligible for DC Program on Work, Employment, and Responsibility (POWER)" + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.72", + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.72a", + ) + defined_for = StateCode.DC + + def formula(spm_unit, period, parameters): + has_eligible_head_or_spouse = ( + add(spm_unit, period, ["dc_power_head_or_spouse_eligible"]) > 0 + ) + meets_basic_eligibility_requirements = spm_unit( + "dc_tanf_basic_eligibility_requirements", period + ) + has_disqualifying_benefits = spm_unit( + "dc_power_has_disqualifying_benefits", period + ) + + return ( + has_eligible_head_or_spouse + & meets_basic_eligibility_requirements + & ~has_disqualifying_benefits + ) diff --git a/policyengine_us/variables/gov/states/dc/dhs/power/dc_power_has_disqualifying_beneifts.py b/policyengine_us/variables/gov/states/dc/dhs/power/dc_power_has_disqualifying_beneifts.py new file mode 100644 index 00000000000..aad6fd09789 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/power/dc_power_has_disqualifying_beneifts.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class dc_power_has_disqualifying_benefits(Variable): + value_type = bool + entity = SPMUnit + label = "Is receiving disqualifying benefits under DC Program on Work, Employment, and Responsibility (POWER)" + definition_period = YEAR + defined_for = StateCode.DC + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.72#(d)" + ) + + adds = "gov.states.dc.dhs.power.disqualifying_benefits" diff --git a/policyengine_us/variables/gov/states/dc/dhs/power/dc_power_head_or_spouse_eligible.py b/policyengine_us/variables/gov/states/dc/dhs/power/dc_power_head_or_spouse_eligible.py new file mode 100644 index 00000000000..d41e7953c78 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/power/dc_power_head_or_spouse_eligible.py @@ -0,0 +1,38 @@ +from policyengine_us.model_api import * + + +class dc_power_head_or_spouse_eligible(Variable): + value_type = bool + entity = Person + definition_period = MONTH + label = "Eligible for DC Program on Work, Employment, and Responsibility (POWER)" + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.72", + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.72a", + ) + defined_for = "is_tax_unit_head_or_spouse" + + def formula(person, period, parameters): + p = parameters(period).gov.states.dc.dhs.power.age_threshold + spm_unit = person.spm_unit + is_parent = person("is_parent", period) + is_pregnant = person("is_pregnant", period) + age = person("monthly_age", period) + + # Parent of a minor child with incapacitated household member (includes self) + # Covers both 4-205.72(b)(2) and 4-205.72a(a)(1)(A) + has_incapable_of_self_care = spm_unit.any( + person("is_incapable_of_self_care", period) + ) + has_minor_child = spm_unit.any(person("dc_pap_eligible_child", period)) + parent_with_incapacitated = ( + is_parent & has_minor_child & has_incapable_of_self_care + ) + + # Parent of a minor child and experienced domestic violence (4-205.72a (a)(2)(A))(not modeled) + # Pregnant or parenting teen under 19 (4-205.72a(a)(3)) + teen_parent = (is_pregnant | is_parent) & (age < p.younger) + + # Parent or caretaker who is 60 years of age or older (4-205.72a (a)(5)) + + return parent_with_incapacitated | teen_parent | (age >= p.older) diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/dc_tanf_assistance_unit_size.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/dc_tanf_assistance_unit_size.py new file mode 100644 index 00000000000..319b04f182f --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/dc_tanf_assistance_unit_size.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class dc_tanf_assistance_unit_size(Variable): + value_type = int + entity = SPMUnit + label = "DC Temporary Assistance for Needy Families (TANF) assistance unit size" + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.15" + ) + defined_for = StateCode.DC + + adds = ["spm_unit_size"] + subtracts = ["dc_gac_assistance_unit_size"] diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/dc_tanf_standard_payment.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/dc_tanf_standard_payment.py index e161b223f3f..fdd2aa8a27c 100644 --- a/policyengine_us/variables/gov/states/dc/dhs/tanf/dc_tanf_standard_payment.py +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/dc_tanf_standard_payment.py @@ -15,7 +15,7 @@ class dc_tanf_standard_payment(Variable): defined_for = StateCode.DC def formula(spm_unit, period, parameters): - unit_size = spm_unit("spm_unit_size", period) + unit_size = spm_unit("dc_tanf_assistance_unit_size", period) p = parameters(period).gov.states.dc.dhs.tanf.standard_payment capped_unit_size = min_(unit_size, p.max_unit_size) return p.amount[capped_unit_size] diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_basic_eligibility_requirements.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_basic_eligibility_requirements.py new file mode 100644 index 00000000000..c3d3792818b --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_basic_eligibility_requirements.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class dc_tanf_basic_eligibility_requirements(Variable): + value_type = bool + entity = SPMUnit + label = "Basic eligibility requirements for DC Temporary Assistance for Needy Families (TANF)" + definition_period = MONTH + reference = "https://dhs.dc.gov/service/tanf-district-families" + defined_for = StateCode.DC + + def formula(spm_unit, period, parameters): + demographic_eligible = ( + add(spm_unit, period, ["dc_tanf_demographic_eligible_person"]) > 0 + ) + income_eligible = spm_unit("dc_tanf_income_eligible", period) + resources_eligible = spm_unit("dc_tanf_resources_eligible", period) + return demographic_eligible & income_eligible & resources_eligible diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_demographic_eligible_person.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_demographic_eligible_person.py index 95a950174a7..d583a52502c 100644 --- a/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_demographic_eligible_person.py +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_demographic_eligible_person.py @@ -13,17 +13,15 @@ class dc_tanf_demographic_eligible_person(Variable): defined_for = StateCode.DC def formula(person, period, parameters): - p = parameters(period).gov.states.dc.dhs.tanf.age_threshold - age = person("monthly_age", period) - dependent = person("is_tax_unit_dependent", period) - minor_child = age < p.minor_child - eligible_minor_child = minor_child & dependent - - student_dependent = age < p.student_dependent - secondary_school_student = person("is_in_secondary_school", period) - eligible_student_dependent = ( - secondary_school_student & student_dependent & dependent + pap_eligible_child = person("dc_pap_eligible_child", period) + related_to_head_or_spouse = person( + "is_related_to_head_or_spouse", period ) - pregnant = person("is_pregnant", period) - return eligible_minor_child | eligible_student_dependent | pregnant + immigration_status_eligible = person( + "dc_tanf_immigration_status_eligible_person", period + ) + + return (pap_eligible_child & related_to_head_or_spouse) | ( + pregnant & immigration_status_eligible + ) diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_eligible.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_eligible.py index 02203c90871..586b21e0639 100644 --- a/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_eligible.py +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_eligible.py @@ -10,22 +10,10 @@ class dc_tanf_eligible(Variable): defined_for = StateCode.DC def formula(spm_unit, period, parameters): - demographic_eligible = ( - add(spm_unit, period, ["dc_tanf_demographic_eligible_person"]) > 0 + meets_basic_eligibility_requirements = spm_unit( + "dc_tanf_basic_eligibility_requirements", period ) - income_eligible = spm_unit("dc_tanf_income_eligible", period) - resources_eligible = spm_unit("dc_tanf_resources_eligible", period) - immigration_status_eligible = ( - add( - spm_unit, - period, - ["dc_tanf_immigration_status_eligible_person"], - ) - > 0 - ) - return ( - demographic_eligible - & income_eligible - & resources_eligible - & immigration_status_eligible + meets_work_requirements = spm_unit( + "dc_tanf_meets_work_requirements", period ) + return meets_basic_eligibility_requirements & meets_work_requirements diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_immigration_status_eligible_person.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_immigration_status_eligible_person.py index 009ebbffca2..63ac833a316 100644 --- a/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_immigration_status_eligible_person.py +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/eligibility/dc_tanf_immigration_status_eligible_person.py @@ -12,9 +12,14 @@ class dc_tanf_immigration_status_eligible_person(Variable): defined_for = StateCode.DC def formula(person, period, parameters): - qualified_noncitizen = person("is_ssi_qualified_noncitizen", period) + p = parameters(period).gov.states.dc.dhs immigration_status = person("immigration_status", period) + immigration_status_str = immigration_status.decode_to_str() is_citizen = ( immigration_status == immigration_status.possible_values.CITIZEN ) + qualified_noncitizen = np.isin( + immigration_status_str, + p.qualified_noncitizen_statuses, + ) return qualified_noncitizen | is_citizen diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_income.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_income.py index 711377c3fbd..167034a0072 100644 --- a/policyengine_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_income.py +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/income/dc_tanf_countable_income.py @@ -20,5 +20,10 @@ def formula(spm_unit, period, parameters): "dc_tanf_countable_unearned_income", ], ) + # Exclude income from GAC, this only applies when the child in household is unrelated to + # the head or spouse + gac_countable_income = spm_unit("dc_gac_countable_income", period) childcare_deduction = spm_unit("dc_tanf_childcare_deduction", period) - return max_(income_sources - childcare_deduction, 0) + return max_( + income_sources - gac_countable_income - childcare_deduction, 0 + ) diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_is_working.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_is_working.py new file mode 100644 index 00000000000..6a92be97693 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_is_working.py @@ -0,0 +1,40 @@ +from policyengine_us.model_api import * + + +class dc_tanf_is_working(Variable): + value_type = bool + entity = Person + label = "Person is working under the work requirement for DC Temporary Assistance for Needy Families (TANF)" + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19b" + ) + defined_for = StateCode.DC + + def formula(person, period, parameters): + p = parameters( + period + ).gov.states.dc.dhs.tanf.work_requirement.required_hours + weekly_hours_worked = person("weekly_hours_worked", period.this_year) + age = person("monthly_age", period) + # For single parent with a child under 6, work 20 hours pr week + # For single parent with a child at 6 or older, work 30 hours pr week + spm_unit = person.spm_unit + is_youngest_member = person.get_rank(spm_unit, age, spm_unit) == 0 + youngest_age = spm_unit.sum(is_youngest_member * age) + single_parent_requirement = ( + weekly_hours_worked >= p.single_parent.amount.calc(youngest_age) + ) + # For 2-parent, work 35 hours pr week (combined) + # Or 55 hours per week if family receives federally-funded childcare and + # no adult has a disability (not modeled) + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period) + parent_hours = where(is_head_or_spouse, weekly_hours_worked, 0) + combined_parent_hours = spm_unit.sum(parent_hours) + two_parent_requirement = combined_parent_hours >= p.two_parents.amount + is_two_parent_unit = spm_unit.sum(is_head_or_spouse) > 1 + return where( + is_two_parent_unit, + two_parent_requirement, + single_parent_requirement, + ) diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_meets_work_requirements.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_meets_work_requirements.py new file mode 100644 index 00000000000..639cfaecd27 --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_meets_work_requirements.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class dc_tanf_meets_work_requirements(Variable): + value_type = bool + entity = SPMUnit + label = "Work requirement satisfied for DC Temporary Assistance for Needy Families (TANF)" + definition_period = MONTH + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19b", + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19g", + ) + defined_for = StateCode.DC + + def formula(spm_unit, period, parameters): + person = spm_unit.members + is_working = person("dc_tanf_is_working", period) + work_requirement_exempt = person( + "dc_tanf_work_requirement_exempt", period + ) + meets_work_requirements = is_working | work_requirement_exempt + return spm_unit.sum(~meets_work_requirements) == 0 diff --git a/policyengine_us/variables/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_work_requirement_exempt.py b/policyengine_us/variables/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_work_requirement_exempt.py new file mode 100644 index 00000000000..d5a9d12134a --- /dev/null +++ b/policyengine_us/variables/gov/states/dc/dhs/tanf/work_requirement/dc_tanf_work_requirement_exempt.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class dc_tanf_work_requirement_exempt(Variable): + value_type = bool + entity = Person + definition_period = MONTH + label = "Exempted from working requirement for DC Temporary Assistance for Needy Families (TANF)" + reference = ( + "https://code.dccouncil.gov/us/dc/council/code/sections/4-205.19g" + ) + defined_for = StateCode.DC + + def formula(person, period, parameters): + p = parameters( + period + ).gov.states.dc.dhs.tanf.work_requirement.work_exempted + age = person("monthly_age", period) + # (1) Eligible child who are not the head of an assistance unit can exempt + eligible_child = person("dc_pap_eligible_child", period) + # (2) Single parent works more than 30 hours per week (modeled in work requirements) + # (3) Two-parent work more than 35 hours per week (modeled in work requirements) + # (4) Single parent can exempt with infant less than 1 years old can exempt + filing_status = person.tax_unit("filing_status", period) + joint = filing_status == filing_status.possible_values.JOINT + has_infant = person.spm_unit.any(age < p.infant_age_threshold) + is_head = person("is_tax_unit_head", period) + single_parent_exempt = ~joint & has_infant & is_head + # (5) Person older than 60 can exempt + elderly = age > p.elderly_age_threshold + # (6) Individuals who are enrolled in post-secondary educational institutions + is_college_student = person("is_full_time_college_student", period) + + return ( + eligible_child + | single_parent_exempt + | elderly + | is_college_student + ) diff --git a/policyengine_us/variables/household/demographic/person/is_related_to_head_or_spouse.py b/policyengine_us/variables/household/demographic/person/is_related_to_head_or_spouse.py new file mode 100644 index 00000000000..80b0948c246 --- /dev/null +++ b/policyengine_us/variables/household/demographic/person/is_related_to_head_or_spouse.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class is_related_to_head_or_spouse(Variable): + value_type = bool + entity = Person + label = "Person is related to head or spouse" + definition_period = YEAR + default_value = True