diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..98d3cd4a234 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Implement New Jersey WorkFirst (WFNJ). diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/README.md b/policyengine_us/parameters/gov/states/nj/njdhs/tanf/README.md deleted file mode 100644 index eb8aeb3f951..00000000000 --- a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/README.md +++ /dev/null @@ -1 +0,0 @@ -# Temporary Assistance for Needy Families diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/eligibility/resources/limit.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/tanf/eligibility/resources/limit.yaml deleted file mode 100644 index fb20c3717b2..00000000000 --- a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/eligibility/resources/limit.yaml +++ /dev/null @@ -1,12 +0,0 @@ -description: New Jersey limits its TANF eligibility to households with up to this amount of resources. - -metadata: - unit: currency-USD - label: New Jersey TANF resource limit - reference: - - title: New Jersey Administration State Code | Work First New Jersey Program | 1090-33.2 Resource Limits (a)(3) - href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=ed375ccd-2ce7-480b-8fed-7953f9bb3e83&action=pawlinkdoc&pdcomponentid=&pddocfullpath=%2Fshared%2Fdocument%2Fadministrative-codes%2Furn%3AcontentItem%3A5XKV-PW91-F7ND-G1GP-00008-00&pdtocnodeidentifier=AAOAERAAEAAU&config=00JAA1YTg5OGJlYi04MTI4LTRlNjQtYTc4Yi03NTQxN2E5NmE0ZjQKAFBvZENhdGFsb2ftaXPxZTR7bRPtX1Jok9kz&ecomp=-3vckkk&prid=d0c89fcb-13c2-409a-9f5d-d3fc9e10aeca - - title: New Jersey State Plan for TANF(2021-2023) - href: https://www.nj.gov/humanservices/dfd/programs/workfirstnj/tanf_2021_23_st_plan.pdf#page=21 -values: - 2023-01-01: 2_000 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/income/earned.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/tanf/income/earned.yaml deleted file mode 100644 index 01b7d6eb231..00000000000 --- a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/income/earned.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: New Jersey TANF counts these income sources as earned income. -values: - 2023-03-22: - - employment_income - - self_employment_income -metadata: - unit: list - reference: - title: New Jersey Administrative Code | 10:90-3.9 Income--WFNJ TANF/GA (c) - href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=e6f530e6-7e61-4172-a706-2284151eecb9&nodeid=AAOAERAAEAAJ&nodepath=%2FROOT%2FAAO%2FAAOAER%2FAAOAERAAE%2FAAOAERAAEAAJ&level=4&haschildren=&populated=false&title=%C2%A7+10%3A90-3.9+Income--WFNJ+TANF%2FGA&config=00JAA1YTg5OGJlYi04MTI4LTRlNjQtYTc4Yi03NTQxN2E5NmE0ZjQKAFBvZENhdGFsb2ftaXPxZTR7bRPtX1Jok9kz&pddocfullpath=%2Fshared%2Fdocument%2Fadministrative-codes%2Furn%3AcontentItem%3A5XKV-PW31-F22N-X1S1-00008-00&ecomp=8gf5kkk&prid=01f94881-dbbf-4726-a383-98be3eeb2468 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/income/unearned.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/tanf/income/unearned.yaml deleted file mode 100644 index 6e342631f88..00000000000 --- a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/income/unearned.yaml +++ /dev/null @@ -1,18 +0,0 @@ -description: New Jersey TANF counts these income sources as unearned income. -values: - 2021-01-01: - - veterans_benefits - - rental_income - - alimony_income - - dividend_income - - interest_income - - pension_income - - unemployment_compensation - - gi_cash_assistance - - social_security -metadata: - unit: list - reference: - title: New Jersey Administrative Code | 10:90-3.9(e) - href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=d6417ab8-827f-47fe-80e3-61bbdb8bd1a1&pdistocdocslideraccess=true&config=00JAA1YTg5OGJlYi04MTI4LTRlNjQtYTc4Yi03NTQxN2E5NmE0ZjQKAFBvZENhdGFsb2ftaXPxZTR7bRPtX1Jok9kz&pddocfullpath=%2Fshared%2Fdocument%2Fadministrative-codes%2Furn%3AcontentItem%3A5XKV-PW31-F22N-X1S1-00008-00&pdcomponentid=234124&pdtocnodeidentifier=AAOAERAAEAAJ&ecomp=-3vckkk&prid=64e539a6-10a7-417d-aad3-dfe3a9bcae3c - diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_allowable_income/additional.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_allowable_income/additional.yaml deleted file mode 100644 index 10f0eaea4d6..00000000000 --- a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_allowable_income/additional.yaml +++ /dev/null @@ -1,15 +0,0 @@ -description: New Jersey limits its TANF program to households with up to this income level for people beyond size. - -metadata: - unit: currency-USD - period: month - label: New Jersey TANF monthly income limit per additional person - reference: - # Legal code provides 2003 law; state plan provides updated values. - - title: New Jersey Administration State Code | Work First New Jersey Program | Financial Eligibility, Income, Resources, Benefits | § 10:90-3.3 WFNJ/TANF-initial allowable maximum income and maximum benefit payment levels (Schedules I and II) - href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=977adb3e-e3a6-4eba-8d54-e69ee35f7dcd&nodeid=AAOAERAAEAAD&nodepath=%2FROOT%2FAAO%2FAAOAER%2FAAOAERAAE%2FAAOAERAAEAAD&level=4&haschildren=&populated=false&title=%C2%A7+10%3A90-3.3+WFNJ%2FTANF-initial+allowable+maximum+income+and+maximum+benefit+payment+levels+(Schedules+I+and+II)&config=00JAA1YTg5OGJlYi04MTI4LTRlNjQtYTc4Yi03NTQxN2E5NmE0ZjQKAFBvZENhdGFsb2ftaXPxZTR7bRPtX1Jok9kz&pddocfullpath=%2Fshared%2Fdocument%2Fadministrative-codes%2Furn%3AcontentItem%3A5XKV-PWD1-JTGH-B3FM-00008-00&ecomp=8gf5kkk&prid=039b2ed1-6268-497c-a43f-3e4c508cdc00 - - title: New Jersey State Plan for TANF(2021-2023) - href: https://www.nj.gov/humanservices/dfd/programs/workfirstnj/tanf_2021_23_st_plan.pdf#page=63 - -values: - 2023-01-01: 99 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_allowable_income/main.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_allowable_income/main.yaml deleted file mode 100644 index 0fa46df6108..00000000000 --- a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_allowable_income/main.yaml +++ /dev/null @@ -1,31 +0,0 @@ -description: New Jersey limits its TANF program to households with up to this income level, by household size. - -metadata: - unit: currency-USD - period: month - breakdown: - - range(1, 9) - label: New Jersey TANF monthly maximum allowable income - reference: - # Legal code provides 2003 law; state plan provides updated values. - - title: New Jersey Administration State Code | Work First New Jersey Program | Financial Eligibility, Income, Resources, Benefits | § 10:90-3.3 WFNJ/TANF-initial allowable maximum income and maximum benefit payment levels (Schedules I and II) - href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=977adb3e-e3a6-4eba-8d54-e69ee35f7dcd&nodeid=AAOAERAAEAAD&nodepath=%2FROOT%2FAAO%2FAAOAER%2FAAOAERAAE%2FAAOAERAAEAAD&level=4&haschildren=&populated=false&title=%C2%A7+10%3A90-3.3+WFNJ%2FTANF-initial+allowable+maximum+income+and+maximum+benefit+payment+levels+(Schedules+I+and+II)&config=00JAA1YTg5OGJlYi04MTI4LTRlNjQtYTc4Yi03NTQxN2E5NmE0ZjQKAFBvZENhdGFsb2ftaXPxZTR7bRPtX1Jok9kz&pddocfullpath=%2Fshared%2Fdocument%2Fadministrative-codes%2Furn%3AcontentItem%3A5XKV-PWD1-JTGH-B3FM-00008-00&ecomp=8gf5kkk&prid=039b2ed1-6268-497c-a43f-3e4c508cdc00 - - title: New Jersey State Plan for TANF(2021-2023) - href: https://www.nj.gov/humanservices/dfd/programs/workfirstnj/tanf_2021_23_st_plan.pdf#page=63 - -1: - 2023-01-01: 321 -2: - 2023-01-01: 638 -3: - 2023-01-01: 839 -4: - 2023-01-01: 966 -5: - 2023-01-01: 1_092 -6: - 2023-01-01: 1_221 -7: - 2023-01-01: 1_341 -8: - 2023-01-01: 1_442 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_benefit/additional.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_benefit/additional.yaml deleted file mode 100644 index c8b78884f95..00000000000 --- a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_benefit/additional.yaml +++ /dev/null @@ -1,16 +0,0 @@ -description: New Jersey limits its TANF program to households with this maximum benefit for people beyond size. - -metadata: - unit: currency-USD - period: month - label: New Jersey TANF monthly maximum benefit per additional person - reference: - # Administrative code has old values, apparently without inflation adjustments. - - title: New Jersey Administrative Code | § 10:90-3.3 WFNJ/TANF-initial allowable maximum income and maximum benefit payment levels (Schedules I and II) - href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=977adb3e-e3a6-4eba-8d54-e69ee35f7dcd&nodeid=AAOAERAAEAAD&nodepath=%2FROOT%2FAAO%2FAAOAER%2FAAOAERAAE%2FAAOAERAAEAAD&level=4&haschildren=&populated=false&title=%C2%A7+10%3A90-3.3+WFNJ%2FTANF-initial+allowable+maximum+income+and+maximum+benefit+payment+levels+(Schedules+I+and+II)&config=00JAA1YTg5OGJlYi04MTI4LTRlNjQtYTc4Yi03NTQxN2E5NmE0ZjQKAFBvZENhdGFsb2ftaXPxZTR7bRPtX1Jok9kz&pddocfullpath=%2Fshared%2Fdocument%2Fadministrative-codes%2Furn%3AcontentItem%3A5XKV-PWD1-JTGH-B3FM-00008-00&ecomp=8gf5kkk&prid=039b2ed1-6268-497c-a43f-3e4c508cdc00 - # State plan has updated values. - - title: New Jersey State Plan for TANF(2021-2023) - href: https://www.nj.gov/humanservices/dfd/programs/workfirstnj/tanf_2021_23_st_plan.pdf#page=63 - -values: - 2023-01-01: 66 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_benefit/main.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_benefit/main.yaml deleted file mode 100644 index c90f40d6442..00000000000 --- a/policyengine_us/parameters/gov/states/nj/njdhs/tanf/maximum_benefit/main.yaml +++ /dev/null @@ -1,32 +0,0 @@ -description: New Jersey limits its TANF program to households with this maximum benefits, by household size. - -metadata: - unit: currency-USD - period: month - breakdown: - - range(1, 9) - label: New Jersey TANF monthly maximum benefit - reference: - # Administrative code has old values, apparently without inflation adjustments. - - title: New Jersey Administrative Code | § 10:90-3.3 WFNJ/TANF-initial allowable maximum income and maximum benefit payment levels (Schedules I and II) - href: https://advance.lexis.com/documentpage/?pdmfid=1000516&crid=977adb3e-e3a6-4eba-8d54-e69ee35f7dcd&nodeid=AAOAERAAEAAD&nodepath=%2FROOT%2FAAO%2FAAOAER%2FAAOAERAAE%2FAAOAERAAEAAD&level=4&haschildren=&populated=false&title=%C2%A7+10%3A90-3.3+WFNJ%2FTANF-initial+allowable+maximum+income+and+maximum+benefit+payment+levels+(Schedules+I+and+II)&config=00JAA1YTg5OGJlYi04MTI4LTRlNjQtYTc4Yi03NTQxN2E5NmE0ZjQKAFBvZENhdGFsb2ftaXPxZTR7bRPtX1Jok9kz&pddocfullpath=%2Fshared%2Fdocument%2Fadministrative-codes%2Furn%3AcontentItem%3A5XKV-PWD1-JTGH-B3FM-00008-00&ecomp=8gf5kkk&prid=039b2ed1-6268-497c-a43f-3e4c508cdc00 - # State plan has updated values. - - title: New Jersey State Plan for TANF(2021-2023) - href: https://www.nj.gov/humanservices/dfd/programs/workfirstnj/tanf_2021_23_st_plan.pdf#page=63 - -1: - 2023-01-01: 214 -2: - 2023-01-01: 425 -3: - 2023-01-01: 559 -4: - 2023-01-01: 644 -5: - 2023-01-01: 728 -6: - 2023-01-01: 814 -7: - 2023-01-01: 894 -8: - 2023-01-01: 961 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/README.md b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/README.md new file mode 100644 index 00000000000..29d2a8a5ea0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/README.md @@ -0,0 +1 @@ +# WorkFirst New Jersey program diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/income/child_support_disregard.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/income/child_support_disregard.yaml new file mode 100644 index 00000000000..f6a792bf600 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/income/child_support_disregard.yaml @@ -0,0 +1,25 @@ +description: New Jersey excludes child support received up to this amount based on the number of children under the WorkFirst New Jersey program. + +metadata: + type: single_amount + threshold_unit: person + amount_unit: currency-USD + period: month + label: New Jersey WFNJ child support disregard by number of children + reference: + - title: N.J.A.C. 10:90-3.8(h) + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-8 + +brackets: + - threshold: + 2015-01-01: 0 + amount: + 2015-01-01: 0 + - threshold: + 2015-01-01: 1 + amount: + 2015-01-01: 100 + - threshold: + 2015-01-01: 2 + amount: + 2015-01-01: 200 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/income/earned_income_disregard.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/income/earned_income_disregard.yaml new file mode 100644 index 00000000000..329c7465a99 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/income/earned_income_disregard.yaml @@ -0,0 +1,26 @@ +description: New Jersey excludes this share of earned income based on months of employment under the WorkFirst New Jersey program. + +brackets: + - threshold: + 2015-01-01: 1 + amount: + 2015-01-01: 1 # 100% disregard for first month + - threshold: + 2015-01-01: 2 + amount: + 2015-01-01: 0.75 # 75% disregard for months 2-7 + - threshold: + 2015-01-01: 8 + amount: + 2015-01-01: 0.5 # 50% disregard for month 8+ + +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + label: New Jersey WFNJ earned income disregard rate by month (20+ hours/week) + reference: + - title: N.J.A.C. 10:90-3.8(c) - Tiered earned income disregards + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-8 + - title: New Jersey State Plan for TANF FFY 2024-2026 + href: https://www.nj.gov/humanservices/providers/grants/public/publicnoticefiles/Draft%20New%20Jersey%20State%20Plan%20for%20Temporary%20Assistance%20for%20Needy%20Families%20(TANF)%20FFY%202024%20-%20FFY%202026.pdf#page=22 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/income/limit.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/income/limit.yaml new file mode 100644 index 00000000000..4e53d7e832c --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/income/limit.yaml @@ -0,0 +1,14 @@ +description: New Jersey sets the maximum allowable income as this multiple of the maximum benefit under the WorkFirst New Jersey program. + +metadata: + unit: /1 + period: month + label: New Jersey WFNJ maximum allowable income rate + reference: + - title: N.J.A.C. 10:90-3.2 (a) + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-2 + - title: New Jersey State Plan for TANF FFY 2024-2026 + href: https://www.nj.gov/humanservices/providers/grants/public/publicnoticefiles/Draft%20New%20Jersey%20State%20Plan%20for%20Temporary%20Assistance%20for%20Needy%20Families%20(TANF)%20FFY%202024%20-%20FFY%202026.pdf#page=22 + +values: + 2015-01-01: 1.5 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/max_household_size.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/max_household_size.yaml new file mode 100644 index 00000000000..717b43e3879 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/max_household_size.yaml @@ -0,0 +1,14 @@ +description: New Jersey uses this threshold as the maximum household size for the WorkFirst New Jersey program income and benefit tables. + +metadata: + unit: person + period: year + label: New Jersey WFNJ maximum household size for tables + reference: + - title: N.J.A.C. 10:90-3.3(a) - Maximum table size (8 persons) + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-3 + - title: New Jersey State Plan for TANF FFY 2024-2026 + href: https://www.nj.gov/humanservices/providers/grants/public/publicnoticefiles/Draft%20New%20Jersey%20State%20Plan%20for%20Temporary%20Assistance%20for%20Needy%20Families%20(TANF)%20FFY%202024%20-%20FFY%202026.pdf#page=64 + +values: + 2015-01-01: 8 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/payment_levels/additional_person.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/payment_levels/additional_person.yaml new file mode 100644 index 00000000000..3f16eb6c278 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/payment_levels/additional_person.yaml @@ -0,0 +1,16 @@ +description: New Jersey provides this additional benefit per person beyond the base household size under the WorkFirst New Jersey program. + +metadata: + unit: currency-USD + period: month + label: New Jersey WFNJ monthly maximum benefit per additional person + reference: + - title: N.J.A.C. 10:90-3.3(a)(2) Schedule II - Each Additional Person + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-3 + - title: New Jersey State Plan for TANF FFY 2024-2026 + href: https://www.nj.gov/humanservices/providers/grants/public/publicnoticefiles/Draft%20New%20Jersey%20State%20Plan%20for%20Temporary%20Assistance%20for%20Needy%20Families%20(TANF)%20FFY%202024%20-%20FFY%202026.pdf#page=64 + +values: + 2015-01-01: 50 + 2018-07-01: 55 + 2019-08-01: 66 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/payment_levels/amount.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/payment_levels/amount.yaml new file mode 100644 index 00000000000..048b6c791ff --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/payment_levels/amount.yaml @@ -0,0 +1,48 @@ +description: New Jersey provides this amount as the maximum benefit under the WorkFirst New Jersey program. + +metadata: + unit: currency-USD + period: month + breakdown: + - range(1, 9) # size + breakdown_label: + - Assistance unit size + label: New Jersey WFNJ monthly maximum benefit + reference: + - title: N.J.A.C. 10:90-3.3(b) Schedule II - Maximum Benefit Payment Levels + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-3 + - title: New Jersey State Plan for TANF FFY 2024-2026 + href: https://www.nj.gov/humanservices/providers/grants/public/publicnoticefiles/Draft%20New%20Jersey%20State%20Plan%20for%20Temporary%20Assistance%20for%20Needy%20Families%20(TANF)%20FFY%202024%20-%20FFY%202026.pdf#page=64 + +1: + 2015-01-01: 162 + 2018-07-01: 178 + 2019-08-01: 214 +2: + 2015-01-01: 322 + 2018-07-01: 354 + 2019-08-01: 425 +3: + 2015-01-01: 424 + 2018-07-01: 466 + 2019-08-01: 559 +4: + 2015-01-01: 488 + 2018-07-01: 537 + 2019-08-01: 644 +5: + 2015-01-01: 552 + 2018-07-01: 607 + 2019-08-01: 728 +6: + 2015-01-01: 616 + 2018-07-01: 678 + 2019-08-01: 814 +7: + 2015-01-01: 677 + 2018-07-01: 745 + 2019-08-01: 894 +8: + 2015-01-01: 728 + 2018-07-01: 801 + 2019-08-01: 961 diff --git a/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/resources/limit.yaml b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/resources/limit.yaml new file mode 100644 index 00000000000..9dbf08d9df2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/nj/njdhs/wfnj/resources/limit.yaml @@ -0,0 +1,14 @@ +description: New Jersey limits resources to this amount under the WorkFirst New Jersey program. + +metadata: + unit: currency-USD + period: eternity + label: New Jersey WFNJ resource limit + reference: + - title: N.J.A.C. 10:90-3.20(a)(3) - Basic resource exemption + href: https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-20 + - title: New Jersey State Plan for TANF FFY 2024-2026 + href: https://www.nj.gov/humanservices/providers/grants/public/publicnoticefiles/Draft%20New%20Jersey%20State%20Plan%20for%20Temporary%20Assistance%20for%20Needy%20Families%20(TANF)%20FFY%202024%20-%20FFY%202026.pdf#page=21 + +values: + 2015-01-01: 2_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_countable_gross_unearned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_countable_gross_unearned_income.yaml deleted file mode 100644 index fbae0071246..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_countable_gross_unearned_income.yaml +++ /dev/null @@ -1,50 +0,0 @@ -- name: No unearned income, $0 per year - period: 2023 - input: - state_code: NJ - veterans_benefits: 0 - rental_income: 0 - alimony_income: 0 - dividend_income: 0 - interest_income: 0 - pension_income: 0 - unemployment_compensation: 0 - gi_cash_assistance: 0 - social_security: 0 - is_tanf_enrolled: false - output: - nj_tanf_countable_gross_unearned_income: 0 - -- name: No unearned income and TANF enrolled, $0 per year - period: 2023 - input: - state_code: NJ - veterans_benefits: 0 - rental_income: 0 - alimony_income: 0 - dividend_income: 0 - interest_income: 0 - pension_income: 0 - unemployment_compensation: 0 - gi_cash_assistance: 0 - social_security: 0 - is_tanf_enrolled: true - output: - nj_tanf_countable_gross_unearned_income: 0 - -- name: $1,000 of each unearned income, $10,000 per year - period: 2023 - input: - state_code: NJ - veterans_benefits: 1_000 - rental_income: 1_000 - alimony_income: 1_000 - dividend_income: 1_000 - interest_income: 1_000 - pension_income: 1_000 - unemployment_compensation: 1_000 - gi_cash_assistance: 1_000 - social_security: 1_000 - is_tanf_enrolled: false - output: - nj_tanf_countable_gross_unearned_income: 9_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_maximum_allowable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_maximum_allowable_income.yaml deleted file mode 100644 index 613d9fc52ce..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_maximum_allowable_income.yaml +++ /dev/null @@ -1,23 +0,0 @@ -- name: If no children and one adult, New Jersey TANF maximum allowable income is $321/mo. - period: 2023 - input: - state_code: NJ - spm_unit_size: 1 - output: - nj_tanf_maximum_allowable_income: 321 * 12 - -- name: If not eligible, we don't calculate it. - period: 2023 - input: - state_code: CO - spm_unit_size: 1 - output: - nj_tanf_maximum_allowable_income: 0 - -- name: If 10 people, maximum allowable income is $1442 + 2 * $99 = $1640 per month. - period: 2023 - input: - state_code: NJ - spm_unit_size: 10 - output: - nj_tanf_maximum_allowable_income: 1_640 * 12 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_maximum_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_maximum_benefit.yaml deleted file mode 100644 index 4deef891eaa..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_maximum_benefit.yaml +++ /dev/null @@ -1,25 +0,0 @@ -- name: If no children and one adult, New Jersey TANF maximum benefit is $214/month. - period: 2023 - input: - state_code: NJ - spm_unit_size: 1 - output: - nj_tanf_maximum_benefit: 214 * 12 - -- name: If not eligible, we don't calculate it. - period: 2023 - input: - state_code: CO - spm_unit_size: 1 - output: - nj_tanf_maximum_benefit: 0 - -- name: If 10 people, maximum benefit is $961 + 2 * $66 = $1093 per month. - period: 2023 - input: - state_code: NJ - spm_unit_size: 10 - output: - nj_tanf_maximum_benefit: 1_093 * 12 - - diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_resources_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_resources_eligible.yaml deleted file mode 100644 index 76d6d9db90e..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/tanf/nj_tanf_resources_eligible.yaml +++ /dev/null @@ -1,16 +0,0 @@ -- name: Households with assets lower than or equal to $2,000 are eligible. - period: 2023 - input: - state_code: NJ - nj_tanf_countable_resources: 2_000 - output: - nj_tanf_resources_eligible: true - - -- name: Households with assets higher than $2,000 are ineligible. - period: 2023 - input: - state_code: NJ - nj_tanf_countable_resources: 4_000 - output: - nj_tanf_resources_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/integration.yaml new file mode 100644 index 00000000000..d3bf5b7ed5c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/integration.yaml @@ -0,0 +1,190 @@ +- name: Case 1, eligible single parent with one child and no income. + period: 2024-01 + input: + people: + person1: + age: 30 + is_citizen_or_legal_immigrant: true + person2: + age: 5 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 1_000 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Maximum benefit for 2 people: $425/month + nj_wfnj_payment_levels: 425 + # Gross income eligible: $0 <= $638 + nj_wfnj_gross_income_eligible: true + # Resources eligible: $1,000 <= $2,000 + nj_wfnj_resources_eligible: true + # Income eligible: gross income $0 <= $638 max allowable + nj_wfnj_income_eligible: true + # Overall eligible + nj_wfnj_eligible: true + # Benefit: $425 - $0 = $425 + nj_wfnj: 425 + +- name: Case 2, eligible family of 3 with earned income. + period: 2024-01 + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + employment_income_before_lsr: 2_400 # $2,400/year = $200/month + person2: + age: 32 + is_citizen_or_legal_immigrant: true + person3: + age: 8 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_size: 3 + spm_unit_assets: 500 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # Maximum benefit for 3 people: $559/month + nj_wfnj_payment_levels: 559 + # Gross income eligible: $200 <= $839 + nj_wfnj_gross_income_eligible: true + # January = 100% disregard, so countable earned = 0 + nj_wfnj_countable_earned_income_person: [0, 0, 0] + # Income eligible: gross income $200 <= $839 max allowable + nj_wfnj_income_eligible: true + # Resources eligible: $500 <= $2,000 + nj_wfnj_resources_eligible: true + # Overall eligible + nj_wfnj_eligible: true + # Benefit: $559 - $0 = $559 + nj_wfnj: 559 + +- name: Case 3, ineligible due to high resources. + period: 2024-01 + input: + people: + person1: + age: 28 + is_citizen_or_legal_immigrant: true + person2: + age: 3 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 5_000 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Resources: $5,000 > $2,000 limit + nj_wfnj_resources_eligible: false + # Income eligible (no income) + nj_wfnj_income_eligible: true + # Overall ineligible due to resources + nj_wfnj_eligible: false + nj_wfnj: 0 + +- name: Case 4, ineligible due to high income (new applicant). + period: 2024-01 + input: + people: + person1: + age: 40 + is_citizen_or_legal_immigrant: true + social_security: 12_000 + person2: + age: 6 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 1_000 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Max benefit for 2: $425 + nj_wfnj_payment_levels: 425 + # Gross income: $1,000/month > $638 max allowable + nj_wfnj_gross_income_eligible: false + nj_wfnj_income_eligible: false + nj_wfnj_resources_eligible: true + nj_wfnj_eligible: false + nj_wfnj: 0 + +- name: Case 5, enrolled with unearned income reducing benefit. + period: 2024-01 + input: + people: + person1: + age: 25 + is_citizen_or_legal_immigrant: true + social_security: 2_400 + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 1 + spm_unit_assets: 500 + is_demographic_tanf_eligible: true + is_tanf_enrolled: true # Enrolled - uses countable income test + households: + household: + members: [person1] + state_code: NJ + output: + # Max benefit for 1: $214 + nj_wfnj_payment_levels: 214 + # Enrolled: countable income $200 < $214 max benefit + nj_wfnj_income_eligible: true + nj_wfnj_resources_eligible: true + nj_wfnj_eligible: true + # Benefit: $214 - $200 = $14 + nj_wfnj: 14 + +- name: Case 6, ineligible due to no citizen or legal immigrant. + period: 2024-01 + input: + people: + person1: + age: 30 + is_citizen_or_legal_immigrant: false + person2: + age: 5 + is_citizen_or_legal_immigrant: false + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 500 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Income eligible (no income) + nj_wfnj_income_eligible: true + nj_wfnj_resources_eligible: true + # Ineligible due to immigration status + nj_wfnj_eligible: false + nj_wfnj: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj.yaml new file mode 100644 index 00000000000..3be7857326c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj.yaml @@ -0,0 +1,179 @@ +# Tests for NJ WFNJ benefit calculation. +# Benefit = max(maximum_benefit - countable_income, 0) if eligible, else 0 +# Maximum benefit by household size: 1=$214, 2=$425, 3=$559, 4=$644... + +- name: Case 1, eligible with no income - full benefit. + period: 2024-01 + input: + people: + person1: + age: 30 + is_citizen_or_legal_immigrant: true + person2: + age: 5 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 1_000 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_wfnj_eligible: true + # Maximum benefit for 2 people: $425 + nj_wfnj_payment_levels: 425 + # Benefit = $425 - $0 = $425 + nj_wfnj: 425 + +- name: Case 2, eligible with income - reduced benefit. + period: 2024-01 + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + social_security: 1_200 # $100/month + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 1 + spm_unit_assets: 500 + is_demographic_tanf_eligible: true + is_tanf_enrolled: true # Enrolled for ongoing test + households: + household: + members: [person1] + state_code: NJ + output: + nj_wfnj_eligible: true + # Maximum benefit for 1 person: $214 + nj_wfnj_payment_levels: 214 + # Benefit = $214 - $100 = $114 + nj_wfnj: 114 + +- name: Case 3, ineligible - zero benefit. + period: 2024-01 + input: + people: + person1: + age: 28 + is_citizen_or_legal_immigrant: true + social_security: 12_000 # $1,000/month + person2: + age: 6 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 500 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Max allowable for 2: $638, income $1,000 > $638 + nj_wfnj_income_eligible: false + nj_wfnj_eligible: false + nj_wfnj: 0 + +- name: Case 4, enrolled but income exceeds max benefit - clipped to zero. + period: 2024-01 + input: + people: + person1: + age: 25 + is_citizen_or_legal_immigrant: true + social_security: 2_640 # $220/month, just above $214 max benefit for 1 + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 1 + spm_unit_assets: 500 + is_demographic_tanf_eligible: true + is_tanf_enrolled: true # Enrolled - uses countable income test + households: + household: + members: [person1] + state_code: NJ + output: + # Maximum benefit for 1: $214 + nj_wfnj_payment_levels: 214 + # Enrolled: countable income $220 >= $214 max benefit + nj_wfnj_income_eligible: false + nj_wfnj_eligible: false + # Ineligible, so benefit = 0 + nj_wfnj: 0 + +- name: Case 5, minimum benefit of $1. + period: 2024-01 + input: + people: + person1: + age: 30 + is_citizen_or_legal_immigrant: true + social_security: 2_556 # $213/month + spm_units: + spm_unit: + members: [person1] + spm_unit_size: 1 + spm_unit_assets: 500 + is_demographic_tanf_eligible: true + is_tanf_enrolled: true + households: + household: + members: [person1] + state_code: NJ + output: + nj_wfnj_eligible: true + # Benefit = $214 - $213 = $1 + nj_wfnj: 1 + +- name: Case 6, maximum benefit (large household, zero income). + period: 2024-01 + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + person2: + age: 32 + is_citizen_or_legal_immigrant: true + person3: + age: 12 + is_citizen_or_legal_immigrant: true + person4: + age: 10 + is_citizen_or_legal_immigrant: true + person5: + age: 8 + is_citizen_or_legal_immigrant: true + person6: + age: 6 + is_citizen_or_legal_immigrant: true + person7: + age: 4 + is_citizen_or_legal_immigrant: true + person8: + age: 2 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + spm_unit_size: 8 + spm_unit_assets: 1_000 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: NJ + output: + nj_wfnj_eligible: true + # Maximum benefit for 8 people: $961 + nj_wfnj_payment_levels: 961 + nj_wfnj: 961 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_countable_earned_income_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_countable_earned_income_person.yaml new file mode 100644 index 00000000000..d130be552dd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_countable_earned_income_person.yaml @@ -0,0 +1,47 @@ +# NOTE: The earned income disregard is based on months of employment, not calendar +# months. PolicyEngine cannot track employment duration, so we use calendar months +# as a proxy. The tiered disregards are defined in a bracket parameter: +# - January (month 1): 100% disregard +# - February-July (months 2-7): 75% disregard +# - August-December (months 8-12): 50% disregard + +- name: Case 1, January with 100% disregard. + period: 2024-01 + input: + state_code: NJ + employment_income_before_lsr: 12_000 # $1,000/month + output: + # January (month 1): 100% disregard + # 1_000 * (1 - 1.0) = 0 + nj_wfnj_countable_earned_income_person: 0 + +- name: Case 2, zero income. + period: 2024-01 + input: + state_code: NJ + employment_income_before_lsr: 0 + output: + nj_wfnj_countable_earned_income_person: 0 + +- name: Case 3, high income with full disregard in January. + period: 2024-01 + input: + state_code: NJ + employment_income_before_lsr: 60_000 # $5,000/month + output: + # January: 100% disregard + # 5_000 * (1 - 1.0) = 0 + nj_wfnj_countable_earned_income_person: 0 + +- name: Case 4, full year aggregation showing tiered disregards. + period: 2024 + input: + state_code: NJ + employment_income_before_lsr: 12_000 # $1,000/month + output: + # Annual countable income aggregated across 12 months: + # - January (month 1): $1,000 * 0% = $0 (100% disregard) + # - Feb-Jul (months 2-7): $1,000 * 25% * 6 = $1,500 (75% disregard) + # - Aug-Dec (months 8-12): $1,000 * 50% * 5 = $2,500 (50% disregard) + # Total: $0 + $1,500 + $2,500 = $4,000 + nj_wfnj_countable_earned_income_person: 4_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_countable_unearned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_countable_unearned_income.yaml new file mode 100644 index 00000000000..8107b4d71d3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_countable_unearned_income.yaml @@ -0,0 +1,136 @@ +# Tests for NJ WFNJ countable unearned income +# Logic: gross_unearned - child_support_disregard +# Child support disregard by number of children: +# - 0 children: $0 max disregard +# - 1 child: $100 max disregard +# - 2+ children: $200 max disregard + +- name: Case 1, no children with unearned income only. + period: 2024-01 + input: + people: + person1: + age: 30 + social_security: 1_200 # $100/month + households: + household: + members: [person1] + state_code: NJ + output: + # Gross unearned: $100/month, 0 children -> $0 disregard + nj_wfnj_countable_unearned_income: 100 + +- name: Case 2, one child with child support below $100. + period: 2024-01 + input: + people: + person1: + age: 30 + child_support_received: 600 # $50/month + person2: + age: 10 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Gross: $50, 1 child -> max $100 disregard + # Disregard: min(50, 100) = $50, Countable: $50 - $50 = $0 + nj_wfnj_countable_unearned_income: 0 + +- name: Case 3, one child with child support above $100. + period: 2024-01 + input: + people: + person1: + age: 30 + child_support_received: 1_800 # $150/month + social_security: 600 # $50/month + person2: + age: 10 + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Gross: $200, 1 child -> max $100 disregard + # Disregard: min(150, 100) = $100, Countable: $200 - $100 = $100 + nj_wfnj_countable_unearned_income: 100 + +- name: Case 4, two children with child support below $200. + period: 2024-01 + input: + people: + person1: + age: 30 + child_support_received: 1_200 # $100/month + person2: + age: 10 + person3: + age: 8 + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # Gross: $100, 2 children -> max $200 disregard + # Disregard: min(100, 200) = $100, Countable: $100 - $100 = $0 + nj_wfnj_countable_unearned_income: 0 + +- name: Case 5, two children with child support above $200. + period: 2024-01 + input: + people: + person1: + age: 30 + child_support_received: 3_600 # $300/month + social_security: 600 # $50/month + person2: + age: 10 + person3: + age: 8 + households: + household: + members: [person1, person2, person3] + state_code: NJ + output: + # Gross: $350, 2 children -> max $200 disregard + # Disregard: min(300, 200) = $200, Countable: $350 - $200 = $150 + nj_wfnj_countable_unearned_income: 150 + +- name: Case 6, no unearned income. + period: 2024-01 + input: + people: + person1: + age: 30 + person2: + age: 10 + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_wfnj_countable_unearned_income: 0 + +- name: Case 7, three children uses same $200 cap as two children. + period: 2024-01 + input: + people: + person1: + age: 30 + child_support_received: 3_600 # $300/month + person2: + age: 12 + person3: + age: 10 + person4: + age: 8 + households: + household: + members: [person1, person2, person3, person4] + state_code: NJ + output: + # Gross: $300, 3 children -> max $200 disregard (same as 2+) + # Disregard: min(300, 200) = $200, Countable: $300 - $200 = $100 + nj_wfnj_countable_unearned_income: 100 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_eligible.yaml new file mode 100644 index 00000000000..a86c2902919 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_eligible.yaml @@ -0,0 +1,168 @@ +# Tests for NJ WFNJ eligibility determination. +# Eligibility requires all of: +# 1. Income eligible (income <= max allowable AND income < max benefit) +# 2. Resources eligible (resources <= $2,000) +# 3. Demographic eligible (has eligible child/parent per federal TANF rules) +# 4. At least one citizen or legal immigrant in household + +- name: Case 1, all conditions met - eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + is_citizen_or_legal_immigrant: true + person2: + age: 5 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 1_000 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Income eligible: $0 income <= $638 max allowable AND $0 < $425 max benefit + nj_wfnj_income_eligible: true + # Resources eligible: $1,000 <= $2,000 limit + nj_wfnj_resources_eligible: true + # All conditions met + nj_wfnj_eligible: true + +- name: Case 2, income ineligible - not eligible. + period: 2024-01 + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + social_security: 12_000 # $1,000/month + person2: + age: 4 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 500 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # Unearned income: $12,000/12 = $1,000/month + # Max allowable for 2 people: $638 + # $1,000 > $638, so income ineligible + nj_wfnj_income_eligible: false + nj_wfnj_resources_eligible: true + nj_wfnj_eligible: false + +- name: Case 3, resources ineligible - not eligible. + period: 2024-01 + input: + people: + person1: + age: 28 + is_citizen_or_legal_immigrant: true + person2: + age: 6 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 3_000 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + # No income, so income eligible + nj_wfnj_income_eligible: true + # Resources: $3,000 > $2,000 limit + nj_wfnj_resources_eligible: false + nj_wfnj_eligible: false + +- name: Case 4, demographic ineligible - not eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + is_citizen_or_legal_immigrant: true + person2: + age: 40 + is_citizen_or_legal_immigrant: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 1_000 + is_demographic_tanf_eligible: false + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_wfnj_income_eligible: true + nj_wfnj_resources_eligible: true + # Demographic ineligible (no eligible child) + nj_wfnj_eligible: false + +- name: Case 5, no citizen or legal immigrant - not eligible. + period: 2024-01 + input: + people: + person1: + age: 32 + is_citizen_or_legal_immigrant: false + person2: + age: 7 + is_citizen_or_legal_immigrant: false + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 1_000 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_wfnj_income_eligible: true + nj_wfnj_resources_eligible: true + # No citizen or legal immigrant in household + nj_wfnj_eligible: false + +- name: Case 6, mixed citizen and non-citizen household - eligible. + period: 2024-01 + input: + people: + person1: + age: 30 + is_citizen_or_legal_immigrant: false + person2: + age: 5 + is_citizen_or_legal_immigrant: true # At least one citizen + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_size: 2 + spm_unit_assets: 1_000 + is_demographic_tanf_eligible: true + households: + household: + members: [person1, person2] + state_code: NJ + output: + nj_wfnj_income_eligible: true + nj_wfnj_resources_eligible: true + # At least one citizen or legal immigrant in household + nj_wfnj_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_gross_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_gross_income_eligible.yaml new file mode 100644 index 00000000000..12595830350 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_gross_income_eligible.yaml @@ -0,0 +1,38 @@ +- name: Case 1, no income is eligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + output: + # Gross income $0 <= $321 + nj_wfnj_gross_income_eligible: true + +- name: Case 2, income below max allowable is eligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + social_security: 3_600 # $300/month + output: + # Gross income $300 <= $321 + nj_wfnj_gross_income_eligible: true + +- name: Case 3, income above max allowable is ineligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + social_security: 4_800 # $400/month + output: + # Gross income $400 > $321 + nj_wfnj_gross_income_eligible: false + +- name: Case 4, income at max allowable is eligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + social_security: 3_852 # $321/month + output: + # Gross income $321 <= $321 + nj_wfnj_gross_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_income_eligible.yaml new file mode 100644 index 00000000000..b4246c07fb7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_income_eligible.yaml @@ -0,0 +1,90 @@ +- name: Case 1, new applicant with no income is eligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + is_tanf_enrolled: false + output: + # New applicant: gross income $0 <= $321 max allowable + nj_wfnj_income_eligible: true + +- name: Case 2, new applicant with income below both limits is eligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + social_security: 2_400 # $200/month + is_tanf_enrolled: false + output: + # New applicant: gross $200 <= $321, countable $200 < $214 + nj_wfnj_income_eligible: true + +- name: Case 3, new applicant with income above max allowable is ineligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + social_security: 4_800 # $400/month + is_tanf_enrolled: false + output: + # New applicant: gross income $400 > $321 max allowable + nj_wfnj_income_eligible: false + +- name: Case 4, enrolled with countable income below max benefit is eligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + social_security: 2_400 # $200/month + is_tanf_enrolled: true + output: + # Enrolled: countable income $200 < $214 max benefit + nj_wfnj_income_eligible: true + +- name: Case 5, enrolled with countable income at max benefit is ineligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + social_security: 2_568 # $214/month + is_tanf_enrolled: true + output: + # Enrolled: countable income $214 >= $214 max benefit + nj_wfnj_income_eligible: false + +- name: Case 6, enrolled with countable income $1 below max benefit is eligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + social_security: 2_556 # $213/month + is_tanf_enrolled: true + output: + # Enrolled: countable income $213 < $214 max benefit + nj_wfnj_income_eligible: true + +- name: Case 7, new applicant with earned income in January (100% disregard). + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + employment_income_before_lsr: 3_600 # $300/month gross + is_tanf_enrolled: false + output: + # Gross income = $300, max allowable = $321: passes + # Countable = $0 (100% disregard in January), max benefit = $214: passes + nj_wfnj_income_eligible: true + +- name: Case 8, enrolled with gross above limit but countable below (skips gross test). + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 1 + social_security: 1_200 # $100/month unearned + employment_income_before_lsr: 3_600 # $300/month earned (disregarded in Jan) + is_tanf_enrolled: true + output: + # Gross = $400 > $321 (would fail gross test) + # Countable = $100 (earned disregarded) < $214: passes + # Enrolled uses countable test only + nj_wfnj_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_payment_levels.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_payment_levels.yaml new file mode 100644 index 00000000000..a0f662ce50e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_payment_levels.yaml @@ -0,0 +1,84 @@ +# Tests for NJ WFNJ payment levels across different time periods +# Historical values: +# 2015-01 to 2018-06: Frozen 30 years +# 2018-07 to 2019-07: +10% increase +# 2019-08 onwards: +20% increase (current) + +- name: Case 1, 2016 values (pre-2018 frozen rates). + period: 2016-01 + input: + state_code: NJ + spm_unit_size: 1 + output: + # Size 1: $162 (frozen rate) + nj_wfnj_payment_levels: 162 + +- name: Case 2, 2019 values (after July 2018 +10% increase). + period: 2019-01 + input: + state_code: NJ + spm_unit_size: 1 + output: + # Size 1: $178 (after +10%) + nj_wfnj_payment_levels: 178 + +- name: Case 3, 2020 values (after Aug 2019 +20% increase). + period: 2020-01 + input: + state_code: NJ + spm_unit_size: 1 + output: + # Size 1: $214 (current) + nj_wfnj_payment_levels: 214 + +- name: Case 4, family of 3 current rate. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 3 + output: + # Size 3: $559 + nj_wfnj_payment_levels: 559 + +- name: Case 5, family of 8 (max table size). + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 8 + output: + # Size 8: $961 + nj_wfnj_payment_levels: 961 + +- name: Case 6, family of 9 (first additional person beyond table). + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 9 + output: + # $961 + 1 * $66 = $1,027 + nj_wfnj_payment_levels: 1_027 + +- name: Case 7, family of 10 uses additional per person rate. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 10 + output: + # $961 + 2 * $66 = $1,093 + nj_wfnj_payment_levels: 1_093 + +- name: Case 8, family of 2. + period: 2024-01 + input: + state_code: NJ + spm_unit_size: 2 + output: + nj_wfnj_payment_levels: 425 + +- name: Case 9, non-NJ state returns zero. + period: 2024-01 + input: + state_code: CO + spm_unit_size: 1 + output: + nj_wfnj_payment_levels: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_resources_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_resources_eligible.yaml new file mode 100644 index 00000000000..0dbdc6a1b38 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/nj/njdhs/wfnj/nj_wfnj_resources_eligible.yaml @@ -0,0 +1,23 @@ +- name: Case 1, household with assets at $2,000 limit is eligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_assets: 2_000 + output: + nj_wfnj_resources_eligible: true + +- name: Case 2, household with assets above $2,000 is ineligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_assets: 2_001 + output: + nj_wfnj_resources_eligible: false + +- name: Case 3, household with zero assets is eligible. + period: 2024-01 + input: + state_code: NJ + spm_unit_assets: 0 + output: + nj_wfnj_resources_eligible: true diff --git a/policyengine_us/variables/gov/states/nj/njdhs/tanf/income/nj_tanf_countable_gross_unearned_income.py b/policyengine_us/variables/gov/states/nj/njdhs/tanf/income/nj_tanf_countable_gross_unearned_income.py deleted file mode 100644 index 432f2f9d962..00000000000 --- a/policyengine_us/variables/gov/states/nj/njdhs/tanf/income/nj_tanf_countable_gross_unearned_income.py +++ /dev/null @@ -1,12 +0,0 @@ -from policyengine_us.model_api import * - - -class nj_tanf_countable_gross_unearned_income(Variable): - value_type = float - entity = SPMUnit - label = "New Jersey TANF countable gross unearned income" - unit = USD - definition_period = YEAR - defined_for = StateCode.NJ - - adds = "gov.states.nj.njdhs.tanf.income.unearned" diff --git a/policyengine_us/variables/gov/states/nj/njdhs/tanf/income/nj_tanf_gross_earned_income.py b/policyengine_us/variables/gov/states/nj/njdhs/tanf/income/nj_tanf_gross_earned_income.py deleted file mode 100644 index 402b2c500d9..00000000000 --- a/policyengine_us/variables/gov/states/nj/njdhs/tanf/income/nj_tanf_gross_earned_income.py +++ /dev/null @@ -1,12 +0,0 @@ -from policyengine_us.model_api import * - - -class nj_tanf_gross_earned_income(Variable): - value_type = float - entity = SPMUnit - label = "New Jersey TANF gross earned income" - unit = USD - definition_period = YEAR - defined_for = StateCode.NJ - - adds = "gov.states.nj.njdhs.tanf.income.earned" diff --git a/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_countable_resources.py b/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_countable_resources.py deleted file mode 100644 index 4192e40a635..00000000000 --- a/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_countable_resources.py +++ /dev/null @@ -1,10 +0,0 @@ -from policyengine_us.model_api import * - - -class nj_tanf_countable_resources(Variable): - value_type = float - entity = SPMUnit - label = "Countable resources for New Jersey TANF" - unit = USD - definition_period = YEAR - defined_for = StateCode.NJ diff --git a/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_maximum_allowable_income.py b/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_maximum_allowable_income.py deleted file mode 100644 index 6f6b8d509e7..00000000000 --- a/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_maximum_allowable_income.py +++ /dev/null @@ -1,29 +0,0 @@ -from policyengine_us.model_api import * - - -class nj_tanf_maximum_allowable_income(Variable): - value_type = float - entity = SPMUnit - label = "New Jersey TANF maximum allowable income" - unit = USD - definition_period = YEAR - defined_for = StateCode.NJ - - def formula(spm_unit, period, parameters): - # Get number of people in SPM unit. - people = spm_unit("spm_unit_size", period) - # Cap them at the maximum specified in the tables. - capped_people = min_(people, 8).astype(int) - # Calculate additional people beyond the maximum in tables. - additional_people = people - capped_people - # Get the relevant part of the parameter tree. - p = parameters( - period - ).gov.states.nj.njdhs.tanf.maximum_allowable_income - # Look up the main maximum allowable income for the number of (capped) people. - base = p.main[capped_people] - # Add the additional maximum allowable income for the additional people. - additional_maximum_allowable_income = p.additional * additional_people - monthly = base + additional_maximum_allowable_income - # Return annual value. - return monthly * MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_maximum_benefit.py b/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_maximum_benefit.py deleted file mode 100644 index 9a03d5cb35d..00000000000 --- a/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_maximum_benefit.py +++ /dev/null @@ -1,27 +0,0 @@ -from policyengine_us.model_api import * - - -class nj_tanf_maximum_benefit(Variable): - value_type = float - entity = SPMUnit - label = "New Jersey TANF maximum benefit" - unit = USD - definition_period = YEAR - defined_for = StateCode.NJ - - def formula(spm_unit, period, parameters): - # Get number of people in SPM unit. - people = spm_unit("spm_unit_size", period) - # Cap them at the maximum specified in the tables. - capped_people = min_(people, 8).astype(int) - # Calculate additional people beyond the maximum in tables. - additional_people = people - capped_people - # Get the relevant part of the parameter tree. - p = parameters(period).gov.states.nj.njdhs.tanf.maximum_benefit - # Look up the main maximum benefit for the number of (capped) people. - base = p.main[capped_people] - # Add the additional maximum benefit for the additional people. - additional_maximum_benefit = p.additional * additional_people - monthly = base + additional_maximum_benefit - # Return annual value. - return monthly * MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_resources_eligible.py b/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_resources_eligible.py deleted file mode 100644 index b0c3623b1c3..00000000000 --- a/policyengine_us/variables/gov/states/nj/njdhs/tanf/nj_tanf_resources_eligible.py +++ /dev/null @@ -1,16 +0,0 @@ -from policyengine_us.model_api import * - - -class nj_tanf_resources_eligible(Variable): - value_type = bool - entity = SPMUnit - label = "New Jersey TANF resources eligible" - definition_period = YEAR - defined_for = StateCode.NJ - - def formula(spm_unit, period, parameters): - # The WFNJ/TANF resource limit is $2,000 for an assistance unit. - # https://www.nj.gov/humanservices/dfd/programs/workfirstnj/tanf_2021_23_st_plan.pdf#page=21 - p = parameters(period).gov.states.nj.njdhs.tanf.eligibility.resources - countable_resources = spm_unit("nj_tanf_countable_resources", period) - return countable_resources <= p.limit diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_eligible.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_eligible.py new file mode 100644 index 00000000000..aae69a1824a --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_eligible.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class nj_wfnj_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "New Jersey WFNJ eligible" + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-1", + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-20", + ) + + def formula(spm_unit, period, parameters): + income_eligible = spm_unit("nj_wfnj_income_eligible", period) + resources_eligible = spm_unit("nj_wfnj_resources_eligible", period) + demographic_eligible = spm_unit("is_demographic_tanf_eligible", period) + has_citizen_or_legal_immigrant = ( + add(spm_unit, period, ["is_citizen_or_legal_immigrant"]) > 0 + ) + return ( + income_eligible + & resources_eligible + & demographic_eligible + & has_citizen_or_legal_immigrant + ) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_gross_income_eligible.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_gross_income_eligible.py new file mode 100644 index 00000000000..98ca70bb19d --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_gross_income_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class nj_wfnj_gross_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "New Jersey WFNJ gross income eligible" + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-3", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nj.njdhs.wfnj + gross_income = spm_unit("nj_wfnj_gross_income", period) + payment_levels = spm_unit("nj_wfnj_payment_levels", period) + max_allowable = np.round(payment_levels * p.income.limit) + return gross_income <= max_allowable diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_income_eligible.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_income_eligible.py new file mode 100644 index 00000000000..cde8d42e74c --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_income_eligible.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class nj_wfnj_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "New Jersey WFNJ income eligible" + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-1", + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-3", + ) + + def formula(spm_unit, period, parameters): + is_enrolled = spm_unit("is_tanf_enrolled", period) + gross_income_eligible = spm_unit( + "nj_wfnj_gross_income_eligible", period + ) + countable_income = spm_unit("nj_wfnj_countable_income", period) + payment_levels = spm_unit("nj_wfnj_payment_levels", period) + countable_income_eligible = countable_income < payment_levels + + # Enrolled: countable income test only + # Not enrolled: both gross income AND countable income tests + return where( + is_enrolled, + countable_income_eligible, + gross_income_eligible & countable_income_eligible, + ) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_resources_eligible.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_resources_eligible.py new file mode 100644 index 00000000000..bd4f68ed3dc --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/eligibility/nj_wfnj_resources_eligible.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class nj_wfnj_resources_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "New Jersey WFNJ resources eligible" + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-20" + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nj.njdhs.wfnj.resources + resources = spm_unit("spm_unit_assets", period.this_year) + return resources <= p.limit diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_countable_earned_income_person.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_countable_earned_income_person.py new file mode 100644 index 00000000000..6d804550931 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_countable_earned_income_person.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class nj_wfnj_countable_earned_income_person(Variable): + value_type = float + entity = Person + label = "New Jersey WFNJ countable earned income" + unit = USD + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-8" + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.nj.njdhs.wfnj.income + gross_earned = person("tanf_gross_earned_income", period) + month = period.start.month + + # Calendar month proxy for enrollment months (assuming ≥20 hrs/week). + # N.J.A.C. 10:90-3.8 provides tiered disregards based on months enrolled. + # Use calendar months as a proxy: + # - January (month 1): 100% disregard + # - February-July (months 2-7): 75% disregard + # - August-December (months 8-12): 50% disregard + disregard_rate = p.earned_income_disregard.calc(month) + return gross_earned * (1 - disregard_rate) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_countable_income.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_countable_income.py new file mode 100644 index 00000000000..4df4b5562e8 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_countable_income.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class nj_wfnj_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "New Jersey WFNJ countable income" + unit = USD + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-3", + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-8", + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-1", + ) + + adds = [ + "nj_wfnj_countable_earned_income_person", + "nj_wfnj_countable_unearned_income", + ] diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_countable_unearned_income.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_countable_unearned_income.py new file mode 100644 index 00000000000..280b19e4e17 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_countable_unearned_income.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class nj_wfnj_countable_unearned_income(Variable): + value_type = float + entity = SPMUnit + label = "New Jersey WFNJ countable unearned income" + unit = USD + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-1", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.nj.njdhs.wfnj.income + gross_unearned = add(spm_unit, period, ["tanf_gross_unearned_income"]) + child_support = add(spm_unit, period, ["child_support_received"]) + num_children = spm_unit("spm_unit_count_children", period.this_year) + max_disregard = p.child_support_disregard.calc(num_children) + child_support_disregard = min_(child_support, max_disregard) + return max_(gross_unearned - child_support_disregard, 0) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_gross_income.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_gross_income.py new file mode 100644 index 00000000000..9b64e120524 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/income/nj_wfnj_gross_income.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class nj_wfnj_gross_income(Variable): + value_type = float + entity = SPMUnit + label = "New Jersey WFNJ gross income" + unit = USD + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-3", + ) + + adds = [ + "tanf_gross_earned_income", + "tanf_gross_unearned_income", + ] diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/nj_wfnj.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/nj_wfnj.py new file mode 100644 index 00000000000..b89b8900383 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/nj_wfnj.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class nj_wfnj(Variable): + value_type = float + entity = SPMUnit + label = "New Jersey WFNJ benefit" + unit = USD + definition_period = MONTH + defined_for = "nj_wfnj_eligible" + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-3" + ) + + def formula(spm_unit, period, parameters): + payment_levels = spm_unit("nj_wfnj_payment_levels", period) + countable_income = spm_unit("nj_wfnj_countable_income", period) + return max_(payment_levels - countable_income, 0) diff --git a/policyengine_us/variables/gov/states/nj/njdhs/wfnj/nj_wfnj_payment_levels.py b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/nj_wfnj_payment_levels.py new file mode 100644 index 00000000000..b05bdabe2f0 --- /dev/null +++ b/policyengine_us/variables/gov/states/nj/njdhs/wfnj/nj_wfnj_payment_levels.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class nj_wfnj_payment_levels(Variable): + value_type = float + entity = SPMUnit + label = "New Jersey WFNJ payment levels" + unit = USD + definition_period = MONTH + defined_for = StateCode.NJ + reference = ( + "https://www.law.cornell.edu/regulations/new-jersey/N-J-A-C-10-90-3-3" + ) + + def formula(spm_unit, period, parameters): + size = spm_unit("spm_unit_size", period.this_year) + p = parameters(period).gov.states.nj.njdhs.wfnj + capped_size = min_(size, p.max_household_size) + additional = size - capped_size + base = p.payment_levels.amount[capped_size] + additional_amount = p.payment_levels.additional_person * additional + return base + additional_amount