From 11aec734d411eadb939bc2ea7c7f06eb66baa4b9 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 20 Oct 2026 20:29:56 -0400 Subject: [PATCH 1/6] Fix Montana disability exclusion repeal, elderly credit receipts and occupancy tests - End the disability income exclusion from 2024: 2021 Mont. Laws ch. 503 section 65 repeals 15-30-2110, MCA, for tax years after 2023 (section 70(1)). Drop it from the 2024 and 2025 subtraction lists. - Make the elderly homeowner/renter credit's federal refundable credits an actual-receipt input (MCA 15-30-2337(4), "all income received"; ARM 42.4.301(2)(b), "received") instead of this year's return entitlement. - Require a head or spouse who is 62, a Montana resident for 9 months and an owner, renter or lessee for 6 months (MCA 15-30-2338(1)(a)-(c)); another household member's bill no longer makes a rent-free occupant eligible. Co-Authored-By: Claude Opus 5.5 --- ...e-bugs-mt-disability-ehrc-elderly.fixed.md | 1 + .../minimum_occupancy_months.yaml | 14 ++ .../minimum_residency_months.yaml | 14 ++ .../tax/income/subtractions/subtractions.yaml | 9 +- ...mt_elderly_homeowner_or_renter_credit.yaml | 93 +++++++-- ...er_credit_disability_and_unemployment.yaml | 5 +- ...y_homeowner_or_renter_credit_eligible.yaml | 181 +++++++++++++++++- ...ter_credit_federal_refundable_credits.yaml | 78 +++++--- ..._renter_credit_gross_household_income.yaml | 21 +- ...ner_or_renter_credit_pre_one_claimant.yaml | 50 ++++- ...lity_income_exclusion_eligible_person.yaml | 11 ++ ...mt_disability_income_exclusion_person.yaml | 49 +++++ .../test_mt_elderly_credit_one_claimant.py | 93 ++++++--- ...st_mt_elderly_credit_refundable_credits.py | 97 +++++----- ...rly_homeowner_or_renter_credit_eligible.py | 37 +++- ...enter_credit_federal_refundable_credits.py | 30 ++- ...y_homeowner_or_renter_credit_gross_rent.py | 5 + ...er_or_renter_credit_mt_residency_months.py | 28 +++ ...nter_credit_qualifying_occupancy_months.py | 46 +++++ ...bility_income_exclusion_eligible_person.py | 17 +- .../mt_disability_income_exclusion_person.py | 14 +- 21 files changed, 745 insertions(+), 148 deletions(-) create mode 100644 changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md create mode 100644 policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/minimum_occupancy_months.yaml create mode 100644 policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/minimum_residency_months.yaml create mode 100644 policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_mt_residency_months.py create mode 100644 policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py diff --git a/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md new file mode 100644 index 00000000000..beaedfdedcd --- /dev/null +++ b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md @@ -0,0 +1 @@ +End Montana's disability income exclusion with its 2024 repeal, count only the federal refundable credits a household actually received in the elderly homeowner/renter credit's gross household income, and require that credit's claimant to meet the six-month owner, renter or lessee occupancy and nine-month residence tests (MCA 15-30-2338(1)(b)-(c)). diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/minimum_occupancy_months.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/minimum_occupancy_months.yaml new file mode 100644 index 00000000000..803a15294f8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/minimum_occupancy_months.yaml @@ -0,0 +1,14 @@ +description: Montana requires a claimant of the elderly homeowner or renter credit to occupy one or more Montana dwellings as an owner, renter, or lessee for at least this many months of the claim period. +values: + 2009-01-01: 6 +metadata: + unit: month + period: year + label: Montana elderly homeowner or renter credit minimum qualifying occupancy months + reference: + - title: MCA 15-30-2338(1)(c) + href: https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0380/0150-0300-0230-0380.html + - title: MCA 15-30-2338(1)(c) (2009) + href: https://mca.legmt.gov/bills/2009/mca/15/30/15-30-2338.htm + - title: 2025 Montana Form 2 instructions, Elderly Homeowner/Renter Credit, "You occupied a Montana residence as a renter, owner, or lessee for at least six months during the tax year" + href: https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=44 diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/minimum_residency_months.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/minimum_residency_months.yaml new file mode 100644 index 00000000000..436e8e7e89d --- /dev/null +++ b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/minimum_residency_months.yaml @@ -0,0 +1,14 @@ +description: Montana requires a claimant of the elderly homeowner or renter credit to reside in Montana for at least this many months of the claim period. +values: + 2009-01-01: 9 +metadata: + unit: month + period: year + label: Montana elderly homeowner or renter credit minimum residency months + reference: + - title: MCA 15-30-2338(1)(b) + href: https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0380/0150-0300-0230-0380.html + - title: MCA 15-30-2338(1)(b) (2009) + href: https://mca.legmt.gov/bills/2009/mca/15/30/15-30-2338.htm + - title: 2025 Montana Form 2 instructions, Elderly Homeowner/Renter Credit, "You lived in Montana for at least nine months during the tax year" + href: https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=44 diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml index b65aa2ced80..1d9453d6d31 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml @@ -19,7 +19,9 @@ values: - mt_interest_exemption_person - mt_tuition_subtraction_person - mt_old_age_subtraction - - mt_disability_income_exclusion_person + # 2021 Mont. Laws ch. 503 (SB 399) section 65 repealed 15-30-2110, MCA, + # and with it the disability income exclusion, for tax years beginning + # after December 31, 2023 (section 70(1)). - salt_refund_income # MCA 15-30-2120 / Form 2 Subtractions Schedule 2025-01-01: # Section 15-30-2120 starts from federal taxable income, so federal @@ -29,7 +31,6 @@ values: - mt_interest_exemption_person - mt_tuition_subtraction_person - mt_old_age_subtraction - - mt_disability_income_exclusion_person # TODO: Remove this subtraction starting in 2029 because the federal # Schedule 1-A deductions expire after 2028. - mt_federal_obbba_subtraction @@ -49,3 +50,7 @@ metadata: href: https://leg.mt.gov/bills/mca/title_0150/chapter_0300/part_0210/section_0100/0150-0300-0210-0100.html - title: 2025 Montana Form 2 Instructions href: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=21 + - title: "2021 Montana Session Laws, chapter 503 (SB 399), section 65 (repealer) and section 70 (effective dates) #page 68,70" + href: https://archive.legmt.gov/content/Publications/sales/2021SessionLaws_V3_ERRATA-VERSION.pdf#page=68 + - title: 2024 Montana Form 2 instructions, repealed deductions + href: https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2024_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml index a9f54d8324d..7bae3c11f41 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml @@ -937,6 +937,8 @@ person2: age: 40 employment_income: 10_000 + # Federal EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 tax_units: tax_unit1: members: [person1] @@ -949,9 +951,9 @@ output: # The claimant's adult son lives in the household and files his own # return. Line 5 pensions 20_000. Line 8, refundable credits received by - # all household members: his federal EITC 632 (Rev. Proc. 2023-34, no - # qualifying child, wages between 8_260 and 10_330) and Montana EITC - # 10% x 632 = 63.20, 695.20 in all. Line 17 his wages 10_000. Line 18 + # all household members: the 632 federal EITC refund he received in 2024 + # and Montana EITC 10% x 632 = 63.20 (Rev. Proc. 2023-34, no qualifying + # child, wages between 8_260 and 10_330), 695.20 in all. Line 17 his wages 10_000. Line 18 # gross household income 30_695.20; line 20 = 30_695.20 - 12_600 = # 18_095.20; line 21 = 0.05; line 22 = 904.76; line 27 = 2_000 - 904.76 # = 1_095.24; line 28 = 1_095.24 (under 1_150); line 29 = 100%; line 30 = @@ -971,6 +973,8 @@ person2: age: 30 employment_income: 10_000 + # Federal EITC and refundable CTC received during 2024. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 4_525 person3: age: 5 tax_units: @@ -984,8 +988,9 @@ state_name: MT output: # The claimant's daughter and grandchild live in the household; the - # daughter files her own return. Line 8: federal EITC 34% x 10_000 = - # 3_400, refundable part of the federal child tax credit + # daughter files her own return. Line 8, received during 2024: federal + # EITC 34% x 10_000 = 3_400, refundable part of the federal child tax + # credit # min(1_700, 15% x (10_000 - 2_500)) = 1_125, Montana EITC 340; 4_865 in # all. Line 17 her wages 10_000. Line 18 = 20_000 + 4_865 + 10_000 = # 34_865; line 20 = 22_265; line 22 = 22_265 x 0.05 = 1_113.25; line 27 = @@ -1007,6 +1012,8 @@ person2: age: 30 employment_income: 12_000 + # Federal EITC and refundable CTC received during 2024. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 5_505 person3: age: 5 tax_units: @@ -1019,7 +1026,7 @@ members: [person1, person2, person3] state_name: MT output: - # Line 8: federal EITC 34% x 12_000 = 4_080 (under the 12_390 earned + # Line 8, received during 2024: federal EITC 34% x 12_000 = 4_080 (under the 12_390 earned # income amount), refundable child tax credit # min(1_700, 15% x 9_500) = 1_425, Montana EITC 408; 5_913 in all. # Line 18 = 20_000 + 5_913 + 12_000 = 37_913; line 20 = 25_313; @@ -1075,6 +1082,8 @@ person2: age: 40 employment_income: 10_000 + # Federal EITC refund received during 2023. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 584.70 tax_units: tax_unit1: members: [person1] @@ -1109,26 +1118,26 @@ rent: 4_800 mt_elderly_homeowner_or_renter_credit_received: 60 mt_elderly_homeowner_or_renter_credit_property_tax_rebate_received: 20 + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 500 person2: age: 70 taxable_pension_income: 15_000 rent: 7_200 mt_elderly_homeowner_or_renter_credit_received: 40 mt_elderly_homeowner_or_renter_credit_property_tax_rebate_received: 80 + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 300 tax_units: tax_unit1: members: [person1] - income_tax_refundable_credits: 500 tax_unit2: members: [person2] - income_tax_refundable_credits: 300 households: household: members: [person1, person2] state_code: MT output: - # Schedule 2EC line 8 counts each return's federal refundable credits - # once, plus actual elderly-credit and rebate receipts. Person amounts: + # Schedule 2EC line 8 counts the federal refundable credits each person + # received, plus actual elderly-credit and rebate receipts. Person amounts: # 10_000 + 500 + 60 + 20 = 10_580; 15_000 + 300 + 40 + 80 = 15_420. # Line 18 = 26_000; line 22 = (26_000 - 12_600) * .05 = 670. # Line 25 rent equivalents = [4_800, 7_200] * .15 = [720, 1_080]. @@ -1297,7 +1306,7 @@ # Line 18 = 20_000 + 10_000 = 30_000; line 22 = 870; line 30 = 1_130. mt_elderly_homeowner_or_renter_credit: [1_130, 0] -- name: 2024 Schedule 2EC, a parent living in an adult child's home claims the child's property tax as rent +- name: 2024 Schedule 2EC, a parent without owner, renter or lessee status in an adult child's home cannot claim period: 2024 absolute_error_margin: 0.01 input: @@ -1327,6 +1336,51 @@ household: members: [person1, person2] state_name: MT + output: + # MCA 15-30-2338(1)(c): a claimant "must have occupied one or more + # dwellings in Montana as an owner, renter, or lessee for at least 6 + # months". The parent pays no rent and is billed no property tax, and + # the child's bill does not establish the parent's status. ARM + # 42.4.302(2)(b) lets only an eligible claimant use another's bill as + # rent. The child is 45 (§ 15-30-2338(1)(a)). Neither may claim; before + # this test the parent's credit was 341. + mt_elderly_homeowner_or_renter_credit_eligible: [false, false] + mt_elderly_homeowner_or_renter_credit: [0, 0] + mt_refundable_credits: [0, 0] + +- name: 2024 Schedule 2EC, a parent who leases an adult child's home rent-free claims the child's property tax as rent + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 80 + taxable_pension_income: 14_000 + rent: 0 + ssi: 0 + # A documented lessee for the whole year. + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + person2: + age: 45 + taxable_interest_income: 6_000 + rent: 0 + real_estate_taxes: 4_000 + ssi: 0 + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + tax_units: + tax_unit1: + members: [person1] + tax_unit2: + members: [person2] + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_name: MT output: # The home is in the child's name. "If the property occupied by you is # in a name other than your own, the property taxes billed for that @@ -1336,8 +1390,7 @@ # line 21 = 0.035; line 22 = 259. # Parent: line 23 = 0; line 24 = 4_000 (the child's bill, as rent); # line 25 = 600; line 26 = 600; line 27 = 600 - 259 = 341; line 28 = - # 341; line 29 = 100% (under 35_000); line 30 = 341. Before this rule - # the parent's line 24 was 0 and the credit 0. + # 341; line 29 = 100% (under 35_000); line 30 = 341. # The child is 45, so not a claimant (§ 15-30-2338(1)(a)). mt_elderly_homeowner_or_renter_credit_net_household_income: [259, 0] mt_elderly_homeowner_or_renter_credit_gross_rent: [4_000, 0] @@ -1453,12 +1506,15 @@ output: # SSI is pinned at 0 to isolate the credit's arithmetic. Line 18 = # 20_000; line 20 = 7_400; line 21 = 0.035; line 22 = 259. - # person1 (home in person2's name): line 24 = 2_000; line 25 = 300; - # line 27 = 300 - 259 = 41. + # person1 pays no rent and is billed nothing, so nothing shows that they + # occupy the home as an owner, renter or lessee (MCA 15-30-2338(1)(c)): + # not eligible. As a lessee they would have line 24 = 2_000, line 25 = + # 300 and line 27 = 300 - 259 = 41. # person2: line 23 = 2_000; line 27 = 2_000 - 259 = 1_741; line 28 = # 1_150 cap. # One claimant per household (§ 15-30-2341(1)): person2 claims 1_150. - mt_elderly_homeowner_or_renter_credit_pre_one_claimant: [41, 1_150] + mt_elderly_homeowner_or_renter_credit_eligible: [false, true] + mt_elderly_homeowner_or_renter_credit_pre_one_claimant: [0, 1_150] mt_elderly_homeowner_or_renter_credit_selected_claimant: [false, true] mt_elderly_homeowner_or_renter_credit: [0, 1_150] @@ -1585,15 +1641,20 @@ taxable_pension_income: 14_000 rent: 0 ssi: 0 + # A rent-free lessee. An input for one person gives the others the + # input default, not the formula, so record everyone's months. + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 person2: age: 45 rent: 0 ssi: 0 + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 person3: age: 43 rent: 0 real_estate_taxes: 4_000 ssi: 0 + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 tax_units: tax_unit1: members: [person1] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml index 9acc7082943..629f179e385 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml @@ -188,6 +188,8 @@ unemployment_compensation: 9_000 real_estate_taxes: 1_500 ssi: 0 + # Economic Impact Payments received during 2020. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_800 tax_units: tax_unit: members: [person1] @@ -198,7 +200,8 @@ output: # IRC 85(c) excludes the 9_000 from 2020 federal AGI (AGI without it is # 16_000, under 150_000). Line 1 federal AGI 16_000; line 7 refundable - # credits received, the 2020 recovery rebate credit 1_200 + 600 = 1_800; + # credits received, the 2020 Economic Impact Payments 1_200 + 600 = + # 1_800; # line 8 other income not listed above, the excluded 9_000; line 10 = # 26_800. adjusted_gross_income_person: 16_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml index 97841644257..4151ced40fc 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml @@ -1,32 +1,197 @@ - name: Ineligible -age period: 2022 input: - greater_age_head_spouse: 60 + age: 60 + rent: 6_000 state_code: MT output: mt_elderly_homeowner_or_renter_credit_eligible: false -- name: Eligible +- name: Eligible renter period: 2022 input: - greater_age_head_spouse: 63 + age: 63 + rent: 6_000 state_code: MT output: + # Rent paid shows the filer occupies the home as a renter; a Montana + # household is a full-year resident. + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + mt_elderly_homeowner_or_renter_credit_mt_residency_months: 12 mt_elderly_homeowner_or_renter_credit_eligible: true -- name: If one person is old enough, everybody is eligible +- name: Eligible owner billed property tax period: 2022 + input: + age: 63 + real_estate_taxes: 2_000 + state_code: MT + output: + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + mt_elderly_homeowner_or_renter_credit_eligible: true + +- name: If one spouse qualifies, every member of the return is eligible + period: 2022 + input: + people: + person1: + age: 60 + rent: 6_000 + person2: + age: 70 + person3: + age: 10 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: MT + output: + # The joint return's rent is "the rent that you paid" (Schedule 2EC line + # 24), so both spouses rent the home; only one must meet the age + # requirement (2025 instructions, PDF page 44). + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: [12, 12, 0] + mt_elderly_homeowner_or_renter_credit_eligible: [true, true, true] + +- name: A parent without owner, renter or lessee status cannot qualify through another member's bill + period: 2024 + input: + people: + parent: + age: 80 + rent: 0 + child: + age: 45 + rent: 0 + real_estate_taxes: 4_000 + tax_units: + parent_return: + members: [parent] + child_return: + members: [child] + households: + home: + members: [parent, child] + state_code: MT + output: + # MCA 15-30-2338(1)(c): the claimant "must have occupied one or more + # dwellings in Montana as an owner, renter, or lessee for at least 6 + # months". The parent pays no rent and is billed no property tax, so + # nothing shows that status; the child's bill does not establish it. + # The child owns the home but is 45 (§ 15-30-2338(1)(a)). + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: [0, 12] + mt_elderly_homeowner_or_renter_credit_eligible: [false, false] + +- name: A parent with documented lessee status in a child's home qualifies + period: 2024 + input: + people: + parent: + age: 80 + rent: 0 + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + child: + age: 45 + rent: 0 + real_estate_taxes: 4_000 + # An input for one person gives the others the input default, not + # the formula, so record everyone's months. + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + tax_units: + parent_return: + members: [parent] + child_return: + members: [child] + households: + home: + members: [parent, child] + state_code: MT + output: + # Zero cash rent does not by itself rule out lessee status; an input + # that records it establishes the occupancy test. + mt_elderly_homeowner_or_renter_credit_eligible: [true, false] + +- name: A renter meeting both month thresholds exactly is eligible + period: 2024 + input: + age: 80 + rent: 6_000 + state_code: MT + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 6 + mt_elderly_homeowner_or_renter_credit_mt_residency_months: 9 + output: + # § 15-30-2338(1)(b)-(c): at least 9 months of residence and at least + # 6 months of occupancy as an owner, renter or lessee. + mt_elderly_homeowner_or_renter_credit_eligible: true + +- name: Five months of qualifying occupancy fails + period: 2024 + input: + age: 80 + rent: 6_000 + state_code: MT + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 5 + mt_elderly_homeowner_or_renter_credit_mt_residency_months: 12 + output: + mt_elderly_homeowner_or_renter_credit_eligible: false + +- name: Eight months of Montana residence fails + period: 2024 + input: + age: 80 + rent: 6_000 + state_code: MT + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + mt_elderly_homeowner_or_renter_credit_mt_residency_months: 8 + output: + mt_elderly_homeowner_or_renter_credit_eligible: false + +- name: The occupancy test applies from 2009 + period: 2009 + input: + people: + parent: + age: 80 + rent: 0 + child: + age: 45 + rent: 0 + real_estate_taxes: 4_000 + tax_units: + parent_return: + members: [parent] + child_return: + members: [child] + households: + home: + members: [parent, child] + state_code: MT + output: + # MCA 15-30-2338(1)(c) (2009) is unchanged since its 2009 recodification. + mt_elderly_homeowner_or_renter_credit_eligible: [false, false] + +- name: The tests must be met by the same spouse + period: 2024 input: people: - person1: {} - person2: {} + person1: + age: 60 + rent: 6_000 + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + person2: + age: 70 + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 0 tax_units: tax_unit: members: [person1, person2] - greater_age_head_spouse: 70 households: household: members: [person1, person2] state_code: MT output: - mt_elderly_homeowner_or_renter_credit_eligible: [true, true] + # § 15-30-2338(1) requires "an individual" to meet the age, residence + # and occupancy tests. The renter is 60; the 70-year-old spouse is + # recorded as not renting, owning or leasing the home. + mt_elderly_homeowner_or_renter_credit_eligible: [false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml index 5f2f32ff9fe..abf0b202d75 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml @@ -1,4 +1,4 @@ -- name: Case 1, a single parent's federal EITC and refundable CTC are counted once, on the head. +- name: Case 1, a federal EITC and refundable CTC claimed on this year's return are not received this year. period: 2024 absolute_error_margin: 0.01 input: @@ -16,49 +16,71 @@ members: [person1, person2] state_code: MT output: - # Rev. Proc. 2023-34, one qualifying child: 34% x 10_000 = 3_400 (under - # the 12_390 earned income amount). Refundable CTC: no tax before credits - # (10_000 is under the standard deduction), so - # min(1_700, 15% x (10_000 - 2_500)) = 1_125. + # Rev. Proc. 2023-34, one qualifying child: 34% x 10_000 = 3_400. + # Refundable CTC: min(1_700, 15% x (10_000 - 2_500)) = 1_125. eitc: 3_400 refundable_ctc: 1_125 - # 3_400 + 1_125 = 4_525, on the head only. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: [4_525, 0] + # Gross household income counts "all income received" during the year + # (MCA 15-30-2337(4)); the 2023 instructions, line 7, combine "all the + # refundable credits received by the members of the household in + # 2023". This return's credits are paid after the year ends, so no + # receipt is supplied and none counts. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: [0, 0] -- name: Case 2, a joint return's federal refundable credits go to the head, not the spouse or child. +- name: Case 2, a current-return entitlement adds nothing to gross household income. period: 2024 absolute_error_margin: 0.01 input: people: person1: - age: 35 - employment_income: 15_000 - person2: - age: 33 - person3: - age: 4 + age: 70 + taxable_pension_income: 20_000 tax_units: tax_unit: - members: [person1, person2, person3] + members: [person1] + income_tax_refundable_credits: 5_000 + households: + household: + members: [person1] + state_code: MT + output: + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 0 + mt_elderly_homeowner_or_renter_credit_gross_household_income: 20_000 + +- name: Case 3, federal refundable credits received count once, on the person who received them. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + taxable_pension_income: 20_000 + person2: + age: 40 + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 + tax_units: + tax_unit1: + members: [person1] + tax_unit2: + members: [person2] households: household: - members: [person1, person2, person3] + members: [person1, person2] state_code: MT output: - # Rev. Proc. 2023-34, one child: 15_000 is above the 12_390 earned income - # amount and under the 29_640 joint phaseout threshold, so the maximum - # 4_213. Refundable CTC: min(1_700, 15% x (15_000 - 2_500) = 1_875) - # = 1_700. Total 5_913. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: [5_913, 0, 0] + # 2024 Schedule 2EC line 8: refundable credits received by all household + # members. The son received a 632 federal EITC refund during 2024. + mt_elderly_homeowner_or_renter_credit_gross_household_income: [20_000, 632] -- name: Case 3, the 2021 Economic Impact Payment counts with the federal EITC. +- name: Case 4, the 2021 Economic Impact Payment received in 2021 counts. period: 2021 absolute_error_margin: 0.01 input: people: person1: age: 63 - employment_income: 20_892.60 + taxable_pension_income: 20_000 + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_400 tax_units: tax_unit: members: [person1] @@ -69,13 +91,11 @@ output: # 2021 Elderly Homeowner/Renter Credit Schedule instructions, line 7: # "Refundable credits include the federal and Montana Earned Income Tax - # Credit, the federal Child Tax Credits, Economic Impact Payments". - # 2021 childless EITC (ARPA): 1_502 - 15.3% x (20_892.60 - 11_610) - # = 81.76. Recovery rebate credit (third-round payment): 1_400. - eitc: 81.76 - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_481.76 + # Credit, the federal Child Tax Credits, Economic Impact Payments". The + # third-round payment of 1_400 was received in 2021: 20_000 + 1_400. + mt_elderly_homeowner_or_renter_credit_gross_household_income: 21_400 -- name: Case 4, zero outside Montana. +- name: Case 5, zero by default outside Montana. period: 2024 input: people: diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml index 63408d7c55c..90aeefef83f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml @@ -202,6 +202,8 @@ person2: age: 40 employment_income: 10_000 + # Federal EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 tax_units: tax_unit1: members: [person1] @@ -214,11 +216,12 @@ output: # 2024 Schedule 2EC line 8: "Combine all the refundable credits received # by all household members in 2024. Refundable credits include the - # federal and Montana earned income tax credits". Rev. Proc. 2023-34, no - # qualifying child: 10_000 is above the 8_260 earned income amount and - # under the 10_330 phaseout threshold, so the maximum 632; the Montana - # EITC is 10% of it, 63.20. The member's 10_000 + 632 + 63.20. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: [0, 632] + # federal and Montana earned income tax credits". The member received a + # 632 federal EITC refund. Rev. Proc. 2023-34, no qualifying child: + # 10_000 is above the 8_260 earned income amount and under the 10_330 + # phaseout threshold, so this year's federal EITC is the maximum 632 and + # the Montana EITC is 10% of it, 63.20. The member's 10_000 + 632 + + # 63.20. mt_elderly_homeowner_or_renter_credit_gross_household_income: [20_000, 10_695.20] - name: A parent's federal EITC and refundable child tax credit count in gross household income @@ -232,6 +235,8 @@ person2: age: 30 employment_income: 10_000 + # Federal EITC and refundable CTC received during 2024. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 4_525 person3: age: 5 tax_units: @@ -331,6 +336,8 @@ age: 40 employment_income: 10_000 mt_refundable_credits_before_renter_credit: 0 + # Federal EITC refund received during 2017. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 383.01 tax_units: tax_unit: members: [person1] @@ -354,6 +361,8 @@ age: 40 employment_income: 10_000 mt_refundable_credits_before_renter_credit: 0 + # Federal EITC refund received during 2016. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 383.01 tax_units: tax_unit: members: [person1] @@ -517,6 +526,8 @@ person2: age: 35 employment_income: 25_000 + # Federal EITC and refundable CTC received during 2024. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 9_854.83 person3: age: 5 person4: diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml index 98ed9ddbb9c..85cfb0be0c9 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml @@ -46,17 +46,22 @@ taxable_pension_income: 14_000 rent: 0 ssi: 0 + # A rent-free lessee. An input for one person gives the others the + # input default, not the formula, so record everyone's months. + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 person2: age: 72 taxable_pension_income: 4_000 rent: 0 ssi: 0 real_estate_taxes: 900 + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 person3: age: 45 taxable_interest_income: 2_000 rent: 0 ssi: 0 + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 0 tax_units: tax_unit1: members: [person1] @@ -79,8 +84,8 @@ # SSI is pinned at 0 to isolate the credit's arithmetic. # 2024 Schedule 2EC. Line 18 = 14_000 + 4_000 + 2_000 = 20_000; line 20 # = 7_400; line 21 = 0.035; line 22 = 259. - # person1 (home in person2's name): line 24 = 900; line 25 = 135; line - # 27 = max(135 - 259, 0) = 0. + # person1 (a lessee of a home in person2's name): line 24 = 900; line + # 25 = 135; line 27 = max(135 - 259, 0) = 0. # person2: line 23 = 900; line 27 = 900 - 259 = 641. # person3 is billed nothing either, so their line 24 is also 900, but # they are under 62 and not a claimant. @@ -97,12 +102,15 @@ taxable_pension_income: 9_000 rent: 0 ssi: 0 + # A rent-free lessee for the whole year. + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 person2: age: 60 taxable_pension_income: 3_000 rent: 0 ssi: 0 real_estate_taxes: 2_500 + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 tax_units: tax_unit1: members: [person1] @@ -124,3 +132,41 @@ # person2 is 60, so not a claimant, though the home is in their name. mt_elderly_homeowner_or_renter_credit_pre_one_claimant: [375, 0] mt_elderly_homeowner_or_renter_credit: [375, 0] + +- name: Case 4, without owner, renter or lessee status the other member's bill gives no credit. + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 64 + taxable_pension_income: 9_000 + rent: 0 + ssi: 0 + person2: + age: 60 + taxable_pension_income: 3_000 + rent: 0 + ssi: 0 + real_estate_taxes: 2_500 + tax_units: + tax_unit1: + members: [person1] + tax_unit2: + members: [person2] + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_name: MT + output: + # Case 3 without the lessee input: person1 pays no rent and is billed no + # property tax, so nothing shows the occupancy MCA 15-30-2338(1)(c) + # requires, and person2's bill cannot establish it. + mt_elderly_homeowner_or_renter_credit_eligible: [false, false] + mt_elderly_homeowner_or_renter_credit_pre_one_claimant: [0, 0] + mt_elderly_homeowner_or_renter_credit: [0, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_disability_income_exclusion_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_disability_income_exclusion_eligible_person.yaml index 88e0ae31968..dd2af65b976 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_disability_income_exclusion_eligible_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_disability_income_exclusion_eligible_person.yaml @@ -17,3 +17,14 @@ state_code: MT output: mt_disability_income_exclusion_eligible_person: 1 + +- name: No one is eligible after the 2024 repeal + period: 2024 + input: + is_tax_unit_head: true + retired_on_total_disability: true + age: 64 + state_code: MT + output: + # 2021 Mont. Laws ch. 503, sections 65 and 70(1). + mt_disability_income_exclusion_eligible_person: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_disability_income_exclusion_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_disability_income_exclusion_person.yaml index 8dfa12b9d19..1974d9f1a20 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_disability_income_exclusion_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/subtractions/mt_disability_income_exclusion_person.yaml @@ -36,3 +36,52 @@ output: # 5,000 - 2,000 = 3,000, under the 5,200 cap. mt_disability_income_exclusion_person: 3_000 + +- name: Before its repeal, the exclusion is available in 2023. + period: 2023 + input: + state_code: MT + age: 60 + retired_on_total_disability: true + disability_benefits: 5_200 + output: + # min(5_200 cap, 5_200 taxable disability benefits) = 5_200. + mt_disability_income_exclusion_person: 5_200 + +- name: The exclusion ends in 2024, the first year after its repeal. + period: 2024 + input: + state_code: MT + age: 60 + retired_on_total_disability: true + disability_benefits: 5_200 + output: + # 2021 Mont. Laws ch. 503 (SB 399) section 65 repeals 15-30-2110, MCA, + # which held the exclusion, for tax years beginning after December 31, + # 2023 (section 70(1)). The 2024 Form 2 instructions list the "partial + # retirement disability deduction for taxpayers under age 65" among the + # repealed deductions. + mt_disability_income_exclusion_eligible_person: false + mt_disability_income_exclusion_person: 0 + mt_disability_income_exclusion: 0 + mt_subtractions: 0 + +- name: The repeal continues in 2025. + period: 2025 + input: + state_code: MT + age: 60 + retired_on_total_disability: true + disability_benefits: 5_200 + output: + mt_disability_income_exclusion_person: 0 + mt_subtractions: 0 + +- name: After the repeal, even an eligibility input gives no exclusion. + period: 2024 + input: + state_code: MT + disability_benefits: 15_000 + mt_disability_income_exclusion_eligible_person: true + output: + mt_disability_income_exclusion_person: 0 diff --git a/policyengine_us/tests/test_mt_elderly_credit_one_claimant.py b/policyengine_us/tests/test_mt_elderly_credit_one_claimant.py index 782b76873c6..99de26eee3e 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_one_claimant.py +++ b/policyengine_us/tests/test_mt_elderly_credit_one_claimant.py @@ -12,8 +12,12 @@ property tax is treated as living in a home in another member's name, whose property tax "can qualify as rent only" (ARM 42.4.302(2)(b)): its line 24 is the larger of the rent it paid and the property tax billed to the -household's other members. The model pays the tax unit whose credit is -largest. +household's other members. That bill does not make it eligible: its head or +spouse must have occupied the home as an owner, renter, or lessee (MCA +15-30-2338(1)(c)). By default a tax unit that pays rent or is billed property +tax meets that test and one with neither does not; a tax unit marked as a +lessee here meets it through the qualifying-occupancy input. The model pays +the tax unit whose credit is largest. A reference written here from the schedule's lines is compared with the model for random Montana households of one to three tax units (single or @@ -59,13 +63,34 @@ YEAR = 2024 TOLERANCE = 0.01 P = system.parameters(YEAR).gov.states.mt.tax.income.credits.elderly_homeowner_or_renter +OCCUPANCY = "mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months" + + +def occupies(unit): + """Whether the tax unit's head and spouse occupy the home as owners, + renters, or lessees: they pay rent, are billed property tax, or are + marked as lessees.""" + return unit.get("lessee", False) or unit["property_tax"] > 0 or unit["rent"] > 0 + + +def eligible(unit): + """MCA 15-30-2338(1)(a) and (c); every household here is a full-year + Montana resident.""" + oldest = max(adult["age"] for adult in unit["adults"]) + return oldest >= P.age_threshold and occupies(unit) def build_situation(households): """Each household is a list of tax units; each tax unit is a dict with "adults" (a list of dicts with age, pension, interest and social security) and the head's property tax and rent. Every household is built - twice: as given, and with its tax units in reverse order.""" + twice: as given, and with its tax units in reverse order. When any tax + unit is marked as a lessee, every adult's qualifying occupancy is an + input: an input for some people gives the others its default, not its + formula.""" + any_lessee = any( + unit.get("lessee", False) for units in households for unit in units + ) people, tax_units, marital_units, spm_units, families, situation_households = ( {}, {}, @@ -100,6 +125,10 @@ def build_situation(households): head = unit_members[0] people[head]["real_estate_taxes"] = {YEAR: unit["property_tax"]} people[head]["rent"] = {YEAR: unit["rent"]} + if any_lessee: + months = 12 if occupies(unit) else 0 + for person in unit_members: + people[person][OCCUPANCY] = {YEAR: months} tax_units[unit_key] = {"members": unit_members} marital_units[unit_key] = {"members": unit_members} members += unit_members @@ -137,7 +166,6 @@ def reference(units): household_property_tax = sum(unit["property_tax"] for unit in units) credits = [] for unit in units: - eligible = max(adult["age"] for adult in unit["adults"]) >= P.age_threshold # Line 24: a tax unit billed no property tax may use the property tax # billed to the household's other members as rent, in place of the # rent it paid if that is larger (ARM 42.4.302(2)(b)). @@ -147,7 +175,7 @@ def reference(units): # Lines 23-28. housing = unit["property_tax"] + rent * P.rent_equivalent_tax_rate capped = min(max(housing - net, 0), P.cap) - credits.append(eligible * capped * multiplier) + credits.append(eligible(unit) * capped * multiplier) return gross, credits @@ -198,10 +226,7 @@ def assert_properties(households): # 3. At most one payment; one selection where any tax unit is # eligible. assert (credit > tol).sum() <= 1, units - any_eligible = any( - max(adult["age"] for adult in unit["adults"]) >= P.age_threshold - for unit in units - ) + any_eligible = any(eligible(unit) for unit in units) assert selected.sum() == int(any_eligible), units # 4. Nothing or the whole credit; the selected unit gets it all. assert np.all((np.abs(credit) <= tol) | (np.abs(credit - pre) <= tol)), ( @@ -247,17 +272,22 @@ def test_worked_example(): {"adults": [adult(80, pension=14_000)], "property_tax": 0, "rent": 0}, {"adults": [adult(45, interest=6_000)], "property_tax": 4_000, "rent": 0}, ] +# The same parent holding the home as a rent-free lessee. +LESSEE_IN_CHILDS_HOME = [ + {**PARENT_IN_CHILDS_HOME[0], "lessee": True}, + PARENT_IN_CHILDS_HOME[1], +] def test_property_tax_in_another_name_worked_example(): - """2024 Schedule 2EC: a parent, 80, with a 14,000 pension lives in the - home of an adult child, 45, who has 6,000 of interest and is billed 4,000 - of property tax; each files their own return. Line 18 = 20,000; line 22 - = 7,400 x 0.035 = 259. The home is in the child's name, so its property - tax "can qualify as rent only" on the parent's schedule (ARM - 42.4.302(2)(b)): line 24 = 4,000, line 25 = 600, line 27 = 341. The child - is under 62 and cannot claim.""" - households = [PARENT_IN_CHILDS_HOME] + """2024 Schedule 2EC: a parent, 80, with a 14,000 pension lives rent-free + as a lessee in the home of an adult child, 45, who has 6,000 of interest + and is billed 4,000 of property tax; each files their own return. Line + 18 = 20,000; line 22 = 7,400 x 0.035 = 259. The home is in the child's + name, so its property tax "can qualify as rent only" on the parent's + schedule (ARM 42.4.302(2)(b)): line 24 = 4,000, line 25 = 600, line 27 = + 341. The child is under 62 and cannot claim.""" + households = [LESSEE_IN_CHILDS_HOME] result = calculate(households) assert result["pre_one_claimant"] == pytest.approx([341, 0, 0, 341], abs=TOLERANCE) assert result["selected"].tolist() == [True, False, False, True] @@ -265,6 +295,19 @@ def test_property_tax_in_another_name_worked_example(): assert_properties(households) +def test_another_members_bill_does_not_establish_occupancy(): + """The same parent without owner, renter, or lessee status: no rent paid + and no property tax billed, so nothing shows the six months of + qualifying occupancy MCA 15-30-2338(1)(c) requires, and the child's bill + cannot. Neither tax unit is eligible, so no one is selected or paid.""" + households = [PARENT_IN_CHILDS_HOME] + result = calculate(households) + assert result["pre_one_claimant"] == pytest.approx([0, 0, 0, 0], abs=TOLERANCE) + assert result["selected"].tolist() == [False, False, False, False] + assert result["credit"] == pytest.approx([0, 0, 0, 0], abs=TOLERANCE) + assert_properties(households) + + def raise_property_tax(units, index, increase): """The household with `increase` more property tax billed to the head of tax unit `index`.""" @@ -297,15 +340,15 @@ def assert_raising_a_bill(units, index, increase): def test_newly_billed_tax_unit_can_lose_credit(): """The exception in invariant 6, which follows the form's reading of line - 23 ("the property tax you were billed"). Billing the parent 100 of + 23 ("the property tax you were billed"). Billing the lessee parent 100 of property tax makes the home theirs too: line 23 = 100 and line 24 = 0, so line 27 = max(100 - 259, 0) = 0 instead of 341. Line 22 is unchanged at 259. The child's bill still counts for no one but the child.""" result = calculate( - [PARENT_IN_CHILDS_HOME, raise_property_tax(PARENT_IN_CHILDS_HOME, 0, 100)] + [LESSEE_IN_CHILDS_HOME, raise_property_tax(LESSEE_IN_CHILDS_HOME, 0, 100)] ) assert result["pre_one_claimant"][[0, 4]] == pytest.approx([341, 0], abs=TOLERANCE) - assert_raising_a_bill(PARENT_IN_CHILDS_HOME, 1, 500) + assert_raising_a_bill(LESSEE_IN_CHILDS_HOME, 1, 500) try: @@ -391,8 +434,10 @@ def tax_unit(draw): ] ] ) - # A parent in an adult child's home: the child's bill is the parent's - # rent (line 24 = 4,000; line 27 = 600 - 259 = 341). + # A lessee parent in an adult child's home: the child's bill is the + # parent's rent (line 24 = 4,000; line 27 = 600 - 259 = 341). + @hypothesis.example([LESSEE_IN_CHILDS_HOME]) + # Without owner, renter, or lessee status the parent is not eligible. @hypothesis.example([PARENT_IN_CHILDS_HOME]) # The same parent paying the child 2,400 of rent: line 24 is the larger # bill, 4,000, not 2,400 + 4,000. @@ -418,7 +463,7 @@ def raised_bill(draw): max_examples=10, deadline=None, derandomize=True, suppress_health_check=SLOW ) @hypothesis.given(raised_bill()) - # Raising the child's bill raises the parent's rent and credit. - @hypothesis.example((PARENT_IN_CHILDS_HOME, 1, 500)) + # Raising the child's bill raises the lessee parent's rent and credit. + @hypothesis.example((LESSEE_IN_CHILDS_HOME, 1, 500)) def test_raising_a_bill(case): assert_raising_a_bill(*case) diff --git a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py index a946da6f053..f5226dca080 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py +++ b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py @@ -1,26 +1,27 @@ -"""Property tests: refundable credits in the Montana elderly homeowner/renter -credit's gross household income. - -ARM 42.4.301(2)(b)-(c) counts "federal refundable tax credits received" and -"any state refundable tax credits received" in gross household income, and -the 2024 Schedule 2EC line 8 combines "all the refundable credits received by -all household members". The model sums a person-level gross household income -over the household, so each tax unit's federal refundable credits are put on -its head once. These tests check that allocation for households of a claimant -aged 62 or older and a younger member who files their own return with up to -two children, so that the member can have a federal EITC and a refundable -child tax credit. +"""Property tests: federal refundable credits received in the Montana elderly +homeowner/renter credit's gross household income. + +MCA 15-30-2337(4) defines gross household income as "all income received by +all individuals of a household", ARM 42.4.301(2)(b) counts "federal +refundable tax credits received", and the 2024 Schedule 2EC line 8 combines +"all the refundable credits received by all household members". The credits +claimed on a return are paid after its year ends, so the model takes the +federal refundable credits each person received during the year as an input +(mt_elderly_homeowner_or_renter_credit_federal_refundable_credits), not the +current return's entitlement. These tests check that input for households of +a claimant aged 62 or older and a younger member who files their own return +with up to two children, so that the member's return has a federal EITC and +a refundable child tax credit. YAML cases cannot compare two simulations or draw household structures, so -this file does both. Each example runs the households twice: as given (W) and -with the federal refundable credits in gross household income set to zero +this file does both. Each example runs the households twice: with the +federal refundable credits each person received (W) and with none received (Z). Properties, for every household: -1. Counted once: the household sum of the person-level federal credits - equals the sum of income_tax_refundable_credits over its tax units, read - from the tax-unit array. -2. Accounting: gross household income in W exceeds Z by exactly those - credits. +1. An entitlement is not a receipt: in Z the input is zero for everyone, + whatever the federal refundable credits on this year's returns. +2. Accounting: gross household income in W exceeds Z by exactly the credits + received, each counted once. 3. More income never raises the credit: the credit in W is at most Z's. 4. The credit is between zero and the cap, and zero when gross household income is $45,000 or more. @@ -46,10 +47,11 @@ CREDIT = "mt_elderly_homeowner_or_renter_credit" -def build_situation(cases, zero_federal_credits): +def build_situation(cases, received): """One Montana household per case: the claimant files alone; the member - files with their children. Also returns each person's and tax unit's - case index.""" + files with their children. With `received`, each adult received the + case's federal refundable credits during the year. Also returns each + person's and tax unit's case index.""" people, tax_units, households, case_of = {}, {}, {}, {} for i, c in enumerate(cases): claimant, member = f"claimant_{i}", f"member_{i}" @@ -59,10 +61,12 @@ def build_situation(cases, zero_federal_credits): "taxable_pension_income": {YEAR: c["pension"]}, "real_estate_taxes": {YEAR: c["property_tax"]}, "rent": {YEAR: c["rent"]}, + FEDERAL: {YEAR: c["claimant_received"] if received else 0}, } people[member] = { "age": {YEAR: c["member_age"]}, "employment_income": {YEAR: c["wages"]}, + FEDERAL: {YEAR: c["member_received"] if received else 0}, } for child, age in zip(children, c["child_ages"]): people[child] = {"age": {YEAR: age}} @@ -74,19 +78,14 @@ def build_situation(cases, zero_federal_credits): "members": [claimant, member, *children], "state_code": {YEAR: "MT"}, } - if zero_federal_credits: - # Set for everyone: an input for some people gives the others its - # default, not its formula. - for person in people.values(): - person[FEDERAL] = {YEAR: 0} situation = {"people": people, "tax_units": tax_units, "households": households} return situation, case_of -def calculate(cases, zero_federal_credits): +def calculate(cases, received): """Household totals of person- and tax-unit-level variables, summed by entity id rather than array position.""" - situation, case_of = build_situation(cases, zero_federal_credits) + situation, case_of = build_situation(cases, received) simulation = Simulation(situation=situation) def by_household(variable, entity): @@ -113,16 +112,17 @@ def tolerance(amount): def assert_properties(cases): - w = calculate(cases, zero_federal_credits=False) - z = calculate(cases, zero_federal_credits=True) + w = calculate(cases, received=True) + z = calculate(cases, received=False) for i, c in enumerate(cases): tol = tolerance(w["gross"][i]) - federal = w["federal_tax_unit"][i] - # 1. Each tax unit's federal refundable credits count once. - assert w["federal_person"][i] == pytest.approx(federal, abs=tol), c + received = c["claimant_received"] + c["member_received"] + # 1. This year's federal refundable credits are not a receipt. assert z["federal_person"][i] == 0, c - # 2. They are the whole difference in gross household income. - assert w["gross"][i] - z["gross"][i] == pytest.approx(federal, abs=tol), c + assert w["federal_person"][i] == pytest.approx(received, abs=tol), c + # 2. The credits received are the whole difference in gross + # household income, counted once. + assert w["gross"][i] - z["gross"][i] == pytest.approx(received, abs=tol), c # 3. More income never raises the credit. assert w["credit"][i] <= z["credit"][i] + tol, c for result in (w, z): @@ -141,24 +141,29 @@ def assert_properties(cases): def test_worked_example(): """2024 Schedule 2EC: the claimant's line 5 pension 20,000; the - daughter's wages 10,000 (line 17) and her line 8 credits: federal EITC - 34% x 10,000 = 3,400, refundable child tax credit min(1,700, 15% x - 7,500) = 1,125 and Montana EITC 340. Line 18 = 34,865; line 22 = - (34,865 - 12,600) x 0.05 = 1,113.25; line 27 = 2,000 - 1,113.25 = - 886.75; line 30 = 886.75. Without the federal credits, line 18 = - 30,340, line 22 = 887 and line 30 = 1,113.""" + daughter's wages 10,000 (line 17). Her 2024 return has a federal EITC of + 34% x 10,000 = 3,400 and a refundable child tax credit of min(1,700, 15% + x 7,500) = 1,125, paid in 2025, so they are not received in 2024. Line 8 + counts the 4,525 of federal credits she received during 2024 and her + Montana EITC of 340. Line 18 = 34,865; line 22 = (34,865 - 12,600) x + 0.05 = 1,113.25; line 27 = 2,000 - 1,113.25 = 886.75; line 30 = 886.75. + With nothing received, line 18 = 30,340, line 22 = 887 and line 30 = + 1,113.""" case = { "claimant_age": 70, "pension": 20_000, "property_tax": 2_000, "rent": 0, + "claimant_received": 0, "member_age": 30, "wages": 10_000, "child_ages": [5], + "member_received": 4_525, } - w = calculate([case], zero_federal_credits=False) - z = calculate([case], zero_federal_credits=True) - assert w["federal_tax_unit"][0] == pytest.approx(4_525, abs=TOLERANCE) + w = calculate([case], received=True) + z = calculate([case], received=False) + assert z["federal_tax_unit"][0] == pytest.approx(4_525, abs=TOLERANCE) + assert z["federal_person"][0] == 0 assert w["gross"][0] == pytest.approx(34_865, abs=TOLERANCE) assert w["credit"][0] == pytest.approx(886.75, abs=TOLERANCE) assert z["gross"][0] == pytest.approx(30_340, abs=TOLERANCE) @@ -188,11 +193,13 @@ def case(draw): "pension": draw(amount(40_000)), "property_tax": draw(st.integers(min_value=0, max_value=4_000)), "rent": draw(amount(12_000)), + "claimant_received": draw(amount(2_000)), "member_age": draw(st.integers(min_value=19, max_value=61)), "wages": draw(amount(30_000)), "child_ages": draw( st.lists(st.integers(min_value=0, max_value=16), max_size=2) ), + "member_received": draw(amount(10_000)), } @hypothesis.settings(max_examples=10, deadline=None, suppress_health_check=SLOW) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.py index 64c06f91e30..4cdb7d7823e 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.py @@ -7,13 +7,40 @@ class mt_elderly_homeowner_or_renter_credit_eligible(Variable): label = "Eligible for the Montana Elderly Homeowner/Renter Credit" definition_period = YEAR defined_for = StateCode.MT + reference = ( + # MCA 15-30-2338(1)(a)-(c): age 62, 9 months of residence and 6 months + # of occupancy as an owner, renter, or lessee + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0380/0150-0300-0230-0380.html", + "https://mca.legmt.gov/bills/2009/mca/15/30/15-30-2338.htm", + # 2025 instructions: the tests the claimant attests to, and "If you are + # married filing jointly and both spouses own or rent the residence, + # only one of you must meet the age requirement" + "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=44", + ) def formula(person, period, parameters): p = parameters( period ).gov.states.mt.tax.income.credits.elderly_homeowner_or_renter - # If the filer is married and both spouses owned or rent the residence - # Only one of them must meet the age requierments - # reference: https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2022_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=47 - greater_age_head_spouse = person.tax_unit("greater_age_head_spouse", period) - return greater_age_head_spouse >= p.age_threshold + # Section 15-30-2338(1) sets the tests for "an individual", so one head + # or spouse must meet all of them. Another member's property tax, + # which ARM 42.4.302(2)(b) lets an eligible claimant use as rent, + # cannot establish the occupancy test. + age_eligible = person("age", period) >= p.age_threshold + residency_months = person( + "mt_elderly_homeowner_or_renter_credit_mt_residency_months", period + ) + occupancy_months = person( + "mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months", + period, + ) + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + qualifies = ( + head_or_spouse + & age_eligible + & (residency_months >= p.minimum_residency_months) + & (occupancy_months >= p.minimum_occupancy_months) + ) + # Every member of the return shares the result, so the credit stays + # on the head when the qualifying claimant is the spouse. + return person.tax_unit.any(qualifies) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py index 25342808b61..8eeffa562de 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py @@ -4,24 +4,36 @@ class mt_elderly_homeowner_or_renter_credit_federal_refundable_credits(Variable): value_type = float entity = Person - label = "Federal refundable credits in Montana elderly homeowner/renter credit gross household income" + label = "Federal refundable credits received, in Montana elderly homeowner/renter credit gross household income" + documentation = ( + "Federal refundable tax credit cash this person received during the " + "year, such as an earned income or child tax credit refund from the " + "prior year's return or an Economic Impact Payment. Defaults to zero: " + "the credits claimed on this year's return are paid after the year " + "ends, so they do not establish a receipt." + ) unit = USD definition_period = YEAR defined_for = StateCode.MT reference = ( + # MCA 15-30-2337(4): gross household income is "all income received + # by all individuals of a household" + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0370/0150-0300-0230-0370.html", # ARM 42.4.301(2)(b): "federal refundable tax credits received" "https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/768c8344-24ee-4950-9d5e-9d8fc97ec0f7", - # 2023 instructions, line 7: "the federal and Montana Earned Income Tax - # Credit, the federal Child Tax Credits" + # 2023 instructions, line 7: "Combine all the refundable credits + # received by the members of the household in 2023", including "the + # federal and Montana Earned Income Tax Credit, the federal Child Tax + # Credits" "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2023_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=51", # 2024 Schedule 2EC, line 8: "the federal and Montana earned income tax # credits, the refundable portion of the federal child tax credit" "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2024_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=47", ) - def formula(person, period, parameters): - # Federal refundable credits are claimed on the tax unit's return. - # Gross household income sums this person-level amount over the - # household, so count each return's credits once, on its head. - head = person("is_tax_unit_head", period) - return head * person.tax_unit("income_tax_refundable_credits", period) + # An actual-receipt input, like mt_elderly_homeowner_or_renter_credit_received. + # The refundable credits on this year's return, income_tax_refundable_credits, + # are an entitlement paid in a later year, not a receipt during this one. + # Reading last year's return instead would rerun the whole prior-year + # federal tax computation for each record, and it reads 0 whenever the + # inputs cover only one year. diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_rent.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_rent.py index a33e3c26ea1..ed3531c0fd9 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_rent.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_rent.py @@ -40,6 +40,11 @@ def formula(tax_unit, period, parameters): # line 25 counts 15% of it. With the tax unit billed nothing, "the # property taxes billed for that property" are the household's whole # property tax. + # The rule lets an eligible claimant use the bill. The claimant must + # still have occupied the home as an owner, renter, or lessee (MCA + # 15-30-2338(1)(c)), which another member's bill does not show; + # mt_elderly_homeowner_or_renter_credit_eligible applies that test, + # and the credit is computed only for eligible claimants. # The rule says the claimant "may use" the bill. The model reads that # as a choice between two measures of what it costs to occupy one # home, not an addition to the rent paid, and takes the larger. Using diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_mt_residency_months.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_mt_residency_months.py new file mode 100644 index 00000000000..7a5982f9af0 --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_mt_residency_months.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class mt_elderly_homeowner_or_renter_credit_mt_residency_months(Variable): + value_type = int + entity = Person + label = ( + "Months of Montana residence, for the Montana elderly homeowner/renter credit" + ) + documentation = ( + "Months of the year, from 0 to 12, this person resided in Montana. " + "Defaults to 12 for members of a Montana household, whose state the " + "model treats as their residence for the whole year." + ) + unit = "month" + definition_period = YEAR + defined_for = StateCode.MT + reference = ( + # MCA 15-30-2338(1)(b): resided in Montana "for at least 9 months" + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0380/0150-0300-0230-0380.html", + "https://mca.legmt.gov/bills/2009/mca/15/30/15-30-2338.htm", + # 2025 instructions: the claimant attests "You lived in Montana for at + # least nine months during the tax year" + "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=44", + ) + + def formula(person, period, parameters): + return MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py new file mode 100644 index 00000000000..0d09e6b9e8c --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py @@ -0,0 +1,46 @@ +from policyengine_us.model_api import * + + +class mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months(Variable): + value_type = int + entity = Person + label = "Months occupying a Montana dwelling as an owner, renter, or lessee, for the Montana elderly homeowner/renter credit" + documentation = ( + "Months of the year, from 0 to 12, this person occupied one or more " + "Montana dwellings as an owner, renter, or lessee. Another household " + "member's property tax bill does not establish that status. Defaults " + "to 12 for the head and spouse of a tax unit that pays rent or is " + "billed property tax, and to 0 otherwise." + ) + unit = "month" + definition_period = YEAR + defined_for = StateCode.MT + reference = ( + # MCA 15-30-2338(1)(c), (2): occupied one or more dwellings in Montana + # "as an owner, renter, or lessee for at least 6 months" + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0380/0150-0300-0230-0380.html", + "https://mca.legmt.gov/bills/2009/mca/15/30/15-30-2338.htm", + # 2025 instructions: the claimant attests "You occupied a Montana + # residence as a renter, owner, or lessee for at least six months + # during the tax year" + "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=44", + ) + + def formula(person, period, parameters): + # Rent paid and property tax billed are the return's (Schedule 2EC + # lines 23 and 24, "the property tax you were billed" and "the rent + # that you paid"), so they show that the head and spouse occupy the + # home as renters or owners. Annual amounts carry no months; like + # the household's state, they are taken to cover the whole year. + # A tax unit with neither shows no such status: the household's bill + # in another member's name can count as rent only for a claimant + # who is otherwise eligible (ARM 42.4.302(2)(b)), so it cannot + # establish the status here. Supply this input for an occupant who + # holds the home as a lessee or owner without either amount. + rent = add(person.tax_unit, period, ["rent"]) + property_tax = person.tax_unit( + "mt_elderly_homeowner_or_renter_credit_property_tax_billed", period + ) + documented = (rent > 0) | (property_tax > 0) + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + return where(head_or_spouse & documented, MONTHS_IN_YEAR, 0) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_eligible_person.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_eligible_person.py index 30f6653eaed..4dd28b58c37 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_eligible_person.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_eligible_person.py @@ -7,7 +7,17 @@ class mt_disability_income_exclusion_eligible_person(Variable): label = "Montana disability income exclusion eligible person" defined_for = StateCode.MT definition_period = YEAR - reference = "https://rules.mt.gov/gateway/RuleNo.asp?RN=42%2E15%2E217" + reference = ( + "https://rules.mt.gov/gateway/RuleNo.asp?RN=42%2E15%2E217", + # 2021 Mont. Laws ch. 503 (SB 399): section 65 repeals 15-30-2110, + # MCA, which held the exclusion; section 70(1) applies the repeal to + # tax years beginning after December 31, 2023. + # PDF pages 68, 70 + "https://archive.legmt.gov/content/Publications/sales/2021SessionLaws_V3_ERRATA-VERSION.pdf#page=68", + # 2024 Form 2 instructions, repealed deductions: "Partial retirement + # disability deduction for taxpayers under age 65" + "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2024_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=5", + ) def formula(person, period, parameters): # first select head and spouse with ages below the specific threshold, and @@ -18,3 +28,8 @@ def formula(person, period, parameters): eligible_retiree = age_eligible & is_retired_on_disability head_or_spouse = person("is_tax_unit_head_or_spouse", period) return eligible_retiree & head_or_spouse + + def formula_2024(person, period, parameters): + # The exclusion is repealed for tax years beginning after December 31, + # 2023 (2021 Mont. Laws ch. 503, sections 65 and 70(1)). + return False diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_person.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_person.py index f4a3bfb1ea7..c35d3c97470 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_person.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_person.py @@ -8,8 +8,20 @@ class mt_disability_income_exclusion_person(Variable): defined_for = "mt_disability_income_exclusion_eligible_person" unit = USD definition_period = YEAR - reference = "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2022_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=31" + reference = ( + "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2022_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=31", + # 2021 Mont. Laws ch. 503 (SB 399): section 65 repeals 15-30-2110, + # MCA, which held the exclusion; section 70(1) applies the repeal to + # tax years beginning after December 31, 2023. + # PDF pages 68, 70 + "https://archive.legmt.gov/content/Publications/sales/2021SessionLaws_V3_ERRATA-VERSION.pdf#page=68", + ) def formula(person, period, parameters): p = parameters(period).gov.states.mt.tax.income.subtractions.disability_income return min_(p.cap, person("taxable_disability_benefits", period)) + + def formula_2024(person, period, parameters): + # Repealed from 2024 (2021 Mont. Laws ch. 503, sections 65 and 70(1)), + # even for a person whose eligibility is supplied as an input. + return 0 From 4e74b36c753e557bf199441365ea833ebcd10cf9 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 20 Oct 2026 21:07:47 -0400 Subject: [PATCH 2/6] Supply federal refundable credit receipts in the remaining Montana elderly credit tests Cases that relied on this year's recovery rebate credit or EITC flowing into gross household income now record the payment received during the year. A business-loss case inputs eligibility, since its couple has no rent or property tax. Found in review; the 2021 TAXSIM case now counts the 1,400 Economic Impact Payment received in 2021 but not the 2021 EITC paid in 2022. Co-Authored-By: Claude Opus 5.5 --- .../mt_elderly_homeowner_or_renter_credit.yaml | 17 ++++++++++------- ...nter_credit_disability_and_unemployment.yaml | 15 +++++++++++---- ...or_renter_credit_gross_household_income.yaml | 3 +++ ...redit_unemployment_compensation_addback.yaml | 6 ++++-- .../test_mt_elderly_credit_nontaxable_income.py | 16 ++++++++-------- 5 files changed, 36 insertions(+), 21 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml index 7bae3c11f41..c11b75bca95 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml @@ -216,6 +216,8 @@ age: 63 employment_income: 20_892.60 real_estate_taxes: 863.08 + # The third Economic Impact Payment, received during 2021. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_400 tax_units: tax_unit: members: [person1] @@ -227,13 +229,14 @@ # (863.08 - (gross_hh - 6,300) x 0.05) x 1.0, capped at $1,000. # 2021 instructions, line 7: "Refundable credits include the federal and # Montana Earned Income Tax Credit, the federal Child Tax Credits, - # Economic Impact Payments". Federal EITC (ARPA, no qualifying child) - # 1_502 - 15.3% x (20_892.60 - 11_610) = 81.76; Montana EITC 3% = 2.45; - # Economic Impact Payment 1_400. Line 10 = 20_892.60 + 1_484.21 = - # 22_376.81; line 12 = 16_076.81; line 14 = 803.84; line 19 = 863.08 - - # 803.84 = 59.24. The earlier expected value, 133.33, counted only the - # Montana EITC. - mt_elderly_homeowner_or_renter_credit: 59.24 + # Economic Impact Payments". Received in 2021: the 1_400 Economic Impact + # Payment. The 2021 federal EITC (ARPA, no qualifying child), 1_502 - + # 15.3% x (20_892.60 - 11_610) = 81.76, is paid in 2022, so it is not; + # the Montana EITC on the 2021 return, 3% = 2.45, counts as the model's + # Montana refundable credits. Line 10 = 20_892.60 + 1_400 + 2.45 = + # 22_295.05; line 12 = 15_995.05; line 14 = 799.75; line 19 = 863.08 - + # 799.75 = 63.33. + mt_elderly_homeowner_or_renter_credit: 63.33 - name: MT EHRC uses the $12,600 exclusion from 2022 (HB 191) period: 2022 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml index 629f179e385..2774d85213e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml @@ -224,10 +224,13 @@ taxable_pension_income: 14_000 rent: 12_000 ssi: 0 + # Economic Impact Payments received during 2020. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_800 person2: age: 40 unemployment_compensation: 14_000 ssi: 0 + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_800 tax_units: tax_unit1: members: [person1] @@ -240,8 +243,8 @@ output: # The claimant's daughter files her own return. Of her 14_000, 10_200 is # excluded and 14_000 - 10_200 = 3_800 is in her federal AGI. Line 1 - # federal AGI 14_000 + 3_800 = 17_800; line 7 each return's 2020 - # recovery rebate credit, 1_800 + 1_800 = 3_600; line 8 her excluded + # federal AGI 14_000 + 3_800 = 17_800; line 7 the 2020 Economic Impact + # Payments each received, 1_800 + 1_800 = 3_600; line 8 her excluded # 10_200; line 10 = 31_600. adjusted_gross_income_person: [14_000, 3_800] mt_elderly_homeowner_or_renter_credit_gross_household_income: [15_800, 15_800] @@ -263,6 +266,8 @@ taxable_pension_income: 15_000 real_estate_taxes: 1_400 ssi: 0 + # Economic Impact Payments received during 2020. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_800 person2: age: 20 is_full_time_student: true @@ -280,7 +285,7 @@ # The claimant's grandson, a student, is her dependent. All of his 4_000 # is excluded from federal AGI, and his own gross income counts it in # full, so nothing more is added for it. Line 1 federal AGI 15_000; line - # 7 the recovery rebate credit 1_800; line 8 his 4_000; line 10 = 20_800. + # 7 the Economic Impact Payments received, 1_800; line 8 his 4_000; line 10 = 20_800. mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback: [0, 0] mt_elderly_homeowner_or_renter_credit_gross_household_income: [16_800, 4_000] # Line 12 = 14_500; line 13 = 0.05; line 14 = 725. @@ -299,6 +304,8 @@ unemployment_compensation: 9_000 real_estate_taxes: 1_500 ssi: 0 + # Economic Impact Payment received during 2021. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_400 tax_units: tax_unit: members: [person1] @@ -308,7 +315,7 @@ state_name: MT output: # No exclusion in 2021. Line 1 federal AGI 25_000; line 7 the 2021 - # recovery rebate credit 1_400; line 10 = 26_400. + # Economic Impact Payment received, 1_400; line 10 = 26_400. mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback: 0 mt_elderly_homeowner_or_renter_credit_gross_household_income: 26_400 # Line 12 = 20_100; line 13 = 0.05; line 14 = 1_005. diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml index 90aeefef83f..158c5386cbf 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml @@ -72,10 +72,13 @@ age: 70 taxable_pension_income: 20_000 mt_refundable_credits_before_renter_credit: 0 + # Net household income is computed for eligible claimants. + mt_elderly_homeowner_or_renter_credit_eligible: true person2: age: 68 self_employment_income: -5_000 mt_refundable_credits_before_renter_credit: 0 + mt_elderly_homeowner_or_renter_credit_eligible: true tax_units: tax_unit: members: [person1, person2] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback.yaml index 21e4ee2e4f4..671354ab063 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback.yaml @@ -140,6 +140,8 @@ age: 68 taxable_pension_income: 20_000 taxable_unemployment_compensation: 0 + # The couple's Economic Impact Payments received during 2020. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 3_600 person2: age: 64 unemployment_compensation: 8_000 @@ -167,8 +169,8 @@ adjusted_gross_income_person: [20_000, 1_200, 0] dependent_gross_income: [0, 0, 4_000] mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback: [0, 6_800, 0] - # Each person's compensation once. The head also carries the joint - # return's 2020 recovery rebate credit, 1_200 x 2 + 600 x 2 = 3_600. + # Each person's compensation once. The head also carries the couple's + # 2020 Economic Impact Payments, 1_200 x 2 + 600 x 2 = 3_600. mt_elderly_homeowner_or_renter_credit_gross_household_income: [23_600, 8_000, 4_000] - name: Case 8, a person recorded as both a dependent and the head. diff --git a/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py b/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py index 3090ca71bfc..7886f258162 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py +++ b/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py @@ -28,7 +28,7 @@ 1. The household's gross household income is the pension plus every member's unemployment compensation and disability benefits, each once, plus the refundable credits the household received (read from the model; - no one has earnings, so these are the recovery rebate credits). + no one has earnings or a supplied federal receipt, so these are zero). 2. The credit equals an independent reading of the schedule (standard exclusion, Household Income Reduction Table, cap, Credit Multiplier Table), lies between zero and the cap, and is zero at 45_000 or more. @@ -319,10 +319,10 @@ def test_worked_example(results): """2020 Elderly Homeowner/Renter Credit Schedule, own_return arrangement: the claimant's pension 12_000 and unemployment compensation 6_000, all excluded from federal AGI; the other adult's 12_000 of compensation, - 1_800 of it in federal AGI; each return's recovery rebate credit 1_800. - Line 1 = 12_000 + 1_800; line 7 = 3_600; line 8 = 6_000 + 10_200; line - 10 = 33_600; line 12 = 27_300; line 14 = 1_365; line 19 = 135; line 22 = - 135 at the 100% multiplier.""" + 1_800 of it in federal AGI. No Economic Impact Payment receipt is + supplied, so line 7 = 0. Line 1 = 12_000 + 1_800; line 8 = 6_000 + + 10_200; line 10 = 30_000; line 12 = 23_700; line 14 = 1_185; line 19 = + 315; line 22 = 315 at the 100% multiplier.""" i = CASES.index( dict( arrangement="own_return", @@ -334,6 +334,6 @@ def test_worked_example(results): ) ) r = results[2020] - assert r["refundable_credits"][i] == pytest.approx(3_600, abs=TOLERANCE) - assert r["gross_household_income"][i] == pytest.approx(33_600, abs=TOLERANCE) - assert r["credit"][i] == pytest.approx(135, abs=TOLERANCE) + assert r["refundable_credits"][i] == pytest.approx(0, abs=TOLERANCE) + assert r["gross_household_income"][i] == pytest.approx(30_000, abs=TOLERANCE) + assert r["credit"][i] == pytest.approx(315, abs=TOLERANCE) From 974c705ba327db3352cd21c0b5de5f0946486abd Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 06:41:48 +0000 Subject: [PATCH 3/6] Count 2020-21 EIPs by default; keep each occupant's own occupancy facts The receipt-only default dropped the 2020 and 2021 Economic Impact Payments, which were advanced during the claim year, so gross household income (MCA 15-30-2337(4)) now defaults to the return's recovery rebate credits on the head. A supplied receipt still replaces it. Recording one rent-free lessee through the occupancy-months variable gave every other person the input default of 0, so a homeowner sibling lost eligibility and the household's $1,150 claim fell to $41. Lessee months now go in a separate input with default 0, and residence months use a default of 12 instead of a formula, so each person's months follow their own facts under MCA 15-30-2338(1). The two source-conflict backlog entries this PR settles are updated: the rent-free entry is ruled for the statute, the timing entry is removed because the regulation and the 2021-2024 schedules all count credits received, and the open 2009-2016 statute/rule question is added. Co-Authored-By: Claude Opus 5.5 --- ...e-bugs-mt-disability-ehrc-elderly.fixed.md | 2 +- .../gross_income_sources.yaml | 4 + ...mt_elderly_homeowner_or_renter_credit.yaml | 66 +++++++++++-- ...er_credit_disability_and_unemployment.yaml | 20 +--- ...y_homeowner_or_renter_credit_eligible.yaml | 48 +++++++++- ...ter_credit_federal_refundable_credits.yaml | 96 ++++++++++++++++++- ...ner_or_renter_credit_pre_one_claimant.yaml | 10 +- ...dit_unemployment_compensation_addback.yaml | 6 +- ...est_mt_elderly_credit_nontaxable_income.py | 16 ++-- .../test_mt_elderly_credit_one_claimant.py | 20 ++-- ...st_mt_elderly_credit_refundable_credits.py | 4 +- ...enter_credit_federal_refundable_credits.py | 26 ++++- ...er_or_renter_credit_mt_residency_months.py | 11 ++- ...nter_credit_qualifying_occupancy_months.py | 23 +++-- ...renter_credit_unbilled_occupancy_months.py | 24 +++++ source_conflicts/candidates.yaml | 95 ++++++++++-------- 16 files changed, 347 insertions(+), 124 deletions(-) create mode 100644 policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months.py diff --git a/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md index beaedfdedcd..7aedae846e4 100644 --- a/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md +++ b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md @@ -1 +1 @@ -End Montana's disability income exclusion with its 2024 repeal, count only the federal refundable credits a household actually received in the elderly homeowner/renter credit's gross household income, and require that credit's claimant to meet the six-month owner, renter or lessee occupancy and nine-month residence tests (MCA 15-30-2338(1)(b)-(c)). +End Montana's disability income exclusion with its 2024 repeal, count only the federal refundable credits a household actually received (by default the 2020 and 2021 Economic Impact Payments) in the elderly homeowner/renter credit's gross household income, and require that credit's claimant to meet the six-month owner, renter or lessee occupancy and nine-month residence tests (MCA 15-30-2338(1)(b)-(c)). diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml index f28c95c8377..fccbdf3a096 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml @@ -85,6 +85,10 @@ values: # Refundable credits received (2023 schedule line 7, Schedule 2EC line 8 # from 2024): Montana's refundable credits other than this credit, # and this credit as received during the year (ARM 42.4.301(2)(c)). + # Known gap: mt_refundable_credits_before_renter_credit is the Montana + # refundable credits on this year's return, which are paid after the + # year ends, not the Montana credits received during the year (MCA + # 15-30-2337(4)). Federal credits use receipts from 2017. - mt_refundable_credits_before_renter_credit - mt_elderly_homeowner_or_renter_credit_received # ARM 42.4.301(2)(b), amended effective 11/10/2017, counts "federal diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml index c11b75bca95..47aed5c8586 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml @@ -216,8 +216,6 @@ age: 63 employment_income: 20_892.60 real_estate_taxes: 863.08 - # The third Economic Impact Payment, received during 2021. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_400 tax_units: tax_unit: members: [person1] @@ -230,7 +228,8 @@ # 2021 instructions, line 7: "Refundable credits include the federal and # Montana Earned Income Tax Credit, the federal Child Tax Credits, # Economic Impact Payments". Received in 2021: the 1_400 Economic Impact - # Payment. The 2021 federal EITC (ARPA, no qualifying child), 1_502 - + # Payment (the 2021 recovery rebate credit, which the model counts by + # default). The 2021 federal EITC (ARPA, no qualifying child), 1_502 - # 15.3% x (20_892.60 - 11_610) = 81.76, is paid in 2022, so it is not; # the Montana EITC on the 2021 return, 3% = 2.45, counts as the model's # Montana refundable credits. Line 10 = 20_892.60 + 1_400 + 2.45 = @@ -1362,14 +1361,13 @@ rent: 0 ssi: 0 # A documented lessee for the whole year. - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 person2: age: 45 taxable_interest_income: 6_000 rent: 0 real_estate_taxes: 4_000 ssi: 0 - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 tax_units: tax_unit1: members: [person1] @@ -1395,6 +1393,10 @@ # line 25 = 600; line 26 = 600; line 27 = 600 - 259 = 341; line 28 = # 341; line 29 = 100% (under 35_000); line 30 = 341. # The child is 45, so not a claimant (§ 15-30-2338(1)(a)). + # Not modelled: § 15-30-2337(7)(b) leaves "bona fide lessees, tenants, + # or roomers and boarders on contract" out of the household. The model + # counts every member's income in line 18, so this case reads the parent + # as a member of the child's household rather than a lessee on contract. mt_elderly_homeowner_or_renter_credit_net_household_income: [259, 0] mt_elderly_homeowner_or_renter_credit_gross_rent: [4_000, 0] mt_elderly_homeowner_or_renter_credit_pre_one_claimant: [341, 0] @@ -1521,6 +1523,53 @@ mt_elderly_homeowner_or_renter_credit_selected_claimant: [false, true] mt_elderly_homeowner_or_renter_credit: [0, 1_150] +- name: 2024 Schedule 2EC, two elderly siblings, one a rent-free lessee recorded by input; the owner still claims + period: 2024 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 66 + taxable_pension_income: 10_000 + rent: 0 + ssi: 0 + # The only occupancy input in the household. + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 + person2: + age: 70 + taxable_pension_income: 10_000 + rent: 0 + real_estate_taxes: 2_000 + ssi: 0 + tax_units: + tax_unit1: + members: [person1] + tax_unit2: + members: [person2] + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_name: MT + output: + # Recording person1's lessee months leaves person2's months to follow + # person2's own bill (MCA 15-30-2338(1)(c)): both qualify. + # Line 18 = 20_000; line 20 = 7_400; line 21 = 0.035; line 22 = 259. + # person1: line 24 = the household's bill, 2_000; line 25 = 300; line + # 27 = 300 - 259 = 41. + # person2: line 23 = 2_000; line 27 = 2_000 - 259 = 1_741; line 28 = + # 1_150 cap. + # One claimant per household (§ 15-30-2341(1)): person2's 1_150. + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: [12, 12] + mt_elderly_homeowner_or_renter_credit_eligible: [true, true] + mt_elderly_homeowner_or_renter_credit_pre_one_claimant: [41, 1_150] + mt_elderly_homeowner_or_renter_credit_selected_claimant: [false, true] + mt_elderly_homeowner_or_renter_credit: [0, 1_150] + - name: 2024 Schedule 2EC, a dependent's bill stays on the claimant's line 23 period: 2024 absolute_error_margin: 0.01 @@ -1644,20 +1693,17 @@ taxable_pension_income: 14_000 rent: 0 ssi: 0 - # A rent-free lessee. An input for one person gives the others the - # input default, not the formula, so record everyone's months. - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + # A rent-free lessee. + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 person2: age: 45 rent: 0 ssi: 0 - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 person3: age: 43 rent: 0 real_estate_taxes: 4_000 ssi: 0 - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 tax_units: tax_unit1: members: [person1] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml index 2774d85213e..9acc7082943 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_disability_and_unemployment.yaml @@ -188,8 +188,6 @@ unemployment_compensation: 9_000 real_estate_taxes: 1_500 ssi: 0 - # Economic Impact Payments received during 2020. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_800 tax_units: tax_unit: members: [person1] @@ -200,8 +198,7 @@ output: # IRC 85(c) excludes the 9_000 from 2020 federal AGI (AGI without it is # 16_000, under 150_000). Line 1 federal AGI 16_000; line 7 refundable - # credits received, the 2020 Economic Impact Payments 1_200 + 600 = - # 1_800; + # credits received, the 2020 recovery rebate credit 1_200 + 600 = 1_800; # line 8 other income not listed above, the excluded 9_000; line 10 = # 26_800. adjusted_gross_income_person: 16_000 @@ -224,13 +221,10 @@ taxable_pension_income: 14_000 rent: 12_000 ssi: 0 - # Economic Impact Payments received during 2020. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_800 person2: age: 40 unemployment_compensation: 14_000 ssi: 0 - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_800 tax_units: tax_unit1: members: [person1] @@ -243,8 +237,8 @@ output: # The claimant's daughter files her own return. Of her 14_000, 10_200 is # excluded and 14_000 - 10_200 = 3_800 is in her federal AGI. Line 1 - # federal AGI 14_000 + 3_800 = 17_800; line 7 the 2020 Economic Impact - # Payments each received, 1_800 + 1_800 = 3_600; line 8 her excluded + # federal AGI 14_000 + 3_800 = 17_800; line 7 each return's 2020 + # recovery rebate credit, 1_800 + 1_800 = 3_600; line 8 her excluded # 10_200; line 10 = 31_600. adjusted_gross_income_person: [14_000, 3_800] mt_elderly_homeowner_or_renter_credit_gross_household_income: [15_800, 15_800] @@ -266,8 +260,6 @@ taxable_pension_income: 15_000 real_estate_taxes: 1_400 ssi: 0 - # Economic Impact Payments received during 2020. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_800 person2: age: 20 is_full_time_student: true @@ -285,7 +277,7 @@ # The claimant's grandson, a student, is her dependent. All of his 4_000 # is excluded from federal AGI, and his own gross income counts it in # full, so nothing more is added for it. Line 1 federal AGI 15_000; line - # 7 the Economic Impact Payments received, 1_800; line 8 his 4_000; line 10 = 20_800. + # 7 the recovery rebate credit 1_800; line 8 his 4_000; line 10 = 20_800. mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback: [0, 0] mt_elderly_homeowner_or_renter_credit_gross_household_income: [16_800, 4_000] # Line 12 = 14_500; line 13 = 0.05; line 14 = 725. @@ -304,8 +296,6 @@ unemployment_compensation: 9_000 real_estate_taxes: 1_500 ssi: 0 - # Economic Impact Payment received during 2021. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_400 tax_units: tax_unit: members: [person1] @@ -315,7 +305,7 @@ state_name: MT output: # No exclusion in 2021. Line 1 federal AGI 25_000; line 7 the 2021 - # Economic Impact Payment received, 1_400; line 10 = 26_400. + # recovery rebate credit 1_400; line 10 = 26_400. mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback: 0 mt_elderly_homeowner_or_renter_credit_gross_household_income: 26_400 # Line 12 = 20_100; line 13 = 0.05; line 14 = 1_005. diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml index 4151ced40fc..1a6516f3b3f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml @@ -91,14 +91,11 @@ parent: age: 80 rent: 0 - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 child: age: 45 rent: 0 real_estate_taxes: 4_000 - # An input for one person gives the others the input default, not - # the formula, so record everyone's months. - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 tax_units: parent_return: members: [parent] @@ -110,7 +107,9 @@ state_code: MT output: # Zero cash rent does not by itself rule out lessee status; an input - # that records it establishes the occupancy test. + # that records it establishes the occupancy test. The child's months + # still follow the child's own bill. + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: [12, 12] mt_elderly_homeowner_or_renter_credit_eligible: [true, false] - name: A renter meeting both month thresholds exactly is eligible @@ -195,3 +194,42 @@ # and occupancy tests. The renter is 60; the 70-year-old spouse is # recorded as not renting, owning or leasing the home. mt_elderly_homeowner_or_renter_credit_eligible: [false, false] + +- name: The spouse alone can qualify, and one person's residence input leaves the other's at 12 + period: 2024 + input: + people: + person1: + age: 75 + taxable_pension_income: 10_000 + ssi: 0 + # The head lived in Montana only 8 months. + mt_elderly_homeowner_or_renter_credit_mt_residency_months: 8 + person2: + age: 65 + rent: 6_000 + ssi: 0 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MT + output: + # The joint return's rent shows both spouses rent the home (12 months + # each). The 75-year-old head fails the 9-month residence test + # (§ 15-30-2338(1)(b)); the 65-year-old spouse meets all three tests, + # so the return qualifies and both members are eligible. + mt_elderly_homeowner_or_renter_credit_mt_residency_months: [8, 12] + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: [12, 12] + mt_elderly_homeowner_or_renter_credit_eligible: [true, true] + # 2024 Schedule 2EC: line 18 = 10_000; line 20 = max(10_000 - 12_600, + # 0) = 0; line 22 = 0. Line 24 = 6_000; line 25 = 15% = 900; line 27 = + # 900, under the 1_150 cap, at the 100% multiplier. The credit stays on + # the head. + mt_elderly_homeowner_or_renter_credit_pre_one_claimant: [900, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml index abf0b202d75..92d55c5b758 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml @@ -72,7 +72,7 @@ # members. The son received a 632 federal EITC refund during 2024. mt_elderly_homeowner_or_renter_credit_gross_household_income: [20_000, 632] -- name: Case 4, the 2021 Economic Impact Payment received in 2021 counts. +- name: Case 4, the 2021 Economic Impact Payment received in 2021 counts by default. period: 2021 absolute_error_margin: 0.01 input: @@ -80,7 +80,6 @@ person1: age: 63 taxable_pension_income: 20_000 - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_400 tax_units: tax_unit: members: [person1] @@ -91,10 +90,99 @@ output: # 2021 Elderly Homeowner/Renter Credit Schedule instructions, line 7: # "Refundable credits include the federal and Montana Earned Income Tax - # Credit, the federal Child Tax Credits, Economic Impact Payments". The - # third-round payment of 1_400 was received in 2021: 20_000 + 1_400. + # Credit, the federal Child Tax Credits, Economic Impact Payments". IRC + # 6428B(g) advanced the third-round payment during 2021: 1_400 for one + # adult with AGI 20_000, under the 75_000 single threshold. Gross + # household income is 20_000 + 1_400. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_400 mt_elderly_homeowner_or_renter_credit_gross_household_income: 21_400 +- name: Case 4a, the 2020 Economic Impact Payments received in 2020 count by default. + period: 2020 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + taxable_pension_income: 20_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MT + output: + # IRC 6428(f) and 6428A(f) advanced the 2020 credits: 1_200 (CARES) and + # 600 (CAA) for one adult with AGI 20_000, under the 75_000 single + # threshold. Gross household income is 20_000 + 1_800. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 1_800 + mt_elderly_homeowner_or_renter_credit_gross_household_income: 21_800 + +- name: Case 4b, a joint return's 2020 payments are counted once, on the head. + period: 2020 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + taxable_pension_income: 30_000 + person2: + age: 68 + tax_units: + tax_unit: + members: [person1, person2] + filing_status: JOINT + households: + household: + members: [person1, person2] + state_code: MT + output: + # Two adults, AGI 30_000 under the 150_000 joint threshold: 1_200 x 2 + + # 600 x 2 = 3_600, on the head. Each person's share of gross household + # income: the head 30_000 + 3_600 = 33_600, the spouse 0. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: [3_600, 0] + mt_elderly_homeowner_or_renter_credit_gross_household_income: [33_600, 0] + +- name: Case 4c, a supplied receipt replaces the 2021 default. + period: 2021 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 63 + taxable_pension_income: 20_000 + # A claimant who received no payment during 2021. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 0 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MT + output: + mt_elderly_homeowner_or_renter_credit_gross_household_income: 20_000 + +- name: Case 4d, no default receipt in 2022, when no payment was made. + period: 2022 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 63 + taxable_pension_income: 20_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MT + output: + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 0 + mt_elderly_homeowner_or_renter_credit_gross_household_income: 20_000 + - name: Case 5, zero by default outside Montana. period: 2024 input: diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml index 85cfb0be0c9..ca7e757c684 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml @@ -46,22 +46,19 @@ taxable_pension_income: 14_000 rent: 0 ssi: 0 - # A rent-free lessee. An input for one person gives the others the - # input default, not the formula, so record everyone's months. - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + # A rent-free lessee. + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 person2: age: 72 taxable_pension_income: 4_000 rent: 0 ssi: 0 real_estate_taxes: 900 - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 person3: age: 45 taxable_interest_income: 2_000 rent: 0 ssi: 0 - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 0 tax_units: tax_unit1: members: [person1] @@ -103,14 +100,13 @@ rent: 0 ssi: 0 # A rent-free lessee for the whole year. - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 person2: age: 60 taxable_pension_income: 3_000 rent: 0 ssi: 0 real_estate_taxes: 2_500 - mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 tax_units: tax_unit1: members: [person1] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback.yaml index 671354ab063..21e4ee2e4f4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback.yaml @@ -140,8 +140,6 @@ age: 68 taxable_pension_income: 20_000 taxable_unemployment_compensation: 0 - # The couple's Economic Impact Payments received during 2020. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 3_600 person2: age: 64 unemployment_compensation: 8_000 @@ -169,8 +167,8 @@ adjusted_gross_income_person: [20_000, 1_200, 0] dependent_gross_income: [0, 0, 4_000] mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback: [0, 6_800, 0] - # Each person's compensation once. The head also carries the couple's - # 2020 Economic Impact Payments, 1_200 x 2 + 600 x 2 = 3_600. + # Each person's compensation once. The head also carries the joint + # return's 2020 recovery rebate credit, 1_200 x 2 + 600 x 2 = 3_600. mt_elderly_homeowner_or_renter_credit_gross_household_income: [23_600, 8_000, 4_000] - name: Case 8, a person recorded as both a dependent and the head. diff --git a/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py b/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py index 7886f258162..3090ca71bfc 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py +++ b/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py @@ -28,7 +28,7 @@ 1. The household's gross household income is the pension plus every member's unemployment compensation and disability benefits, each once, plus the refundable credits the household received (read from the model; - no one has earnings or a supplied federal receipt, so these are zero). + no one has earnings, so these are the recovery rebate credits). 2. The credit equals an independent reading of the schedule (standard exclusion, Household Income Reduction Table, cap, Credit Multiplier Table), lies between zero and the cap, and is zero at 45_000 or more. @@ -319,10 +319,10 @@ def test_worked_example(results): """2020 Elderly Homeowner/Renter Credit Schedule, own_return arrangement: the claimant's pension 12_000 and unemployment compensation 6_000, all excluded from federal AGI; the other adult's 12_000 of compensation, - 1_800 of it in federal AGI. No Economic Impact Payment receipt is - supplied, so line 7 = 0. Line 1 = 12_000 + 1_800; line 8 = 6_000 + - 10_200; line 10 = 30_000; line 12 = 23_700; line 14 = 1_185; line 19 = - 315; line 22 = 315 at the 100% multiplier.""" + 1_800 of it in federal AGI; each return's recovery rebate credit 1_800. + Line 1 = 12_000 + 1_800; line 7 = 3_600; line 8 = 6_000 + 10_200; line + 10 = 33_600; line 12 = 27_300; line 14 = 1_365; line 19 = 135; line 22 = + 135 at the 100% multiplier.""" i = CASES.index( dict( arrangement="own_return", @@ -334,6 +334,6 @@ def test_worked_example(results): ) ) r = results[2020] - assert r["refundable_credits"][i] == pytest.approx(0, abs=TOLERANCE) - assert r["gross_household_income"][i] == pytest.approx(30_000, abs=TOLERANCE) - assert r["credit"][i] == pytest.approx(315, abs=TOLERANCE) + assert r["refundable_credits"][i] == pytest.approx(3_600, abs=TOLERANCE) + assert r["gross_household_income"][i] == pytest.approx(33_600, abs=TOLERANCE) + assert r["credit"][i] == pytest.approx(135, abs=TOLERANCE) diff --git a/policyengine_us/tests/test_mt_elderly_credit_one_claimant.py b/policyengine_us/tests/test_mt_elderly_credit_one_claimant.py index 99de26eee3e..a18d486f8e3 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_one_claimant.py +++ b/policyengine_us/tests/test_mt_elderly_credit_one_claimant.py @@ -16,7 +16,7 @@ spouse must have occupied the home as an owner, renter, or lessee (MCA 15-30-2338(1)(c)). By default a tax unit that pays rent or is billed property tax meets that test and one with neither does not; a tax unit marked as a -lessee here meets it through the qualifying-occupancy input. The model pays +lessee here meets it through the unbilled-occupancy input. The model pays the tax unit whose credit is largest. A reference written here from the schedule's lines is compared with the @@ -63,7 +63,7 @@ YEAR = 2024 TOLERANCE = 0.01 P = system.parameters(YEAR).gov.states.mt.tax.income.credits.elderly_homeowner_or_renter -OCCUPANCY = "mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months" +LESSEE_MONTHS = "mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months" def occupies(unit): @@ -84,13 +84,10 @@ def build_situation(households): """Each household is a list of tax units; each tax unit is a dict with "adults" (a list of dicts with age, pension, interest and social security) and the head's property tax and rent. Every household is built - twice: as given, and with its tax units in reverse order. When any tax - unit is marked as a lessee, every adult's qualifying occupancy is an - input: an input for some people gives the others its default, not its - formula.""" - any_lessee = any( - unit.get("lessee", False) for units in households for unit in units - ) + twice: as given, and with its tax units in reverse order. A tax unit + marked as a lessee records 12 unbilled occupancy months for its adults; + every other adult's occupancy follows the model's own rent and property + tax rule.""" people, tax_units, marital_units, spm_units, families, situation_households = ( {}, {}, @@ -125,10 +122,9 @@ def build_situation(households): head = unit_members[0] people[head]["real_estate_taxes"] = {YEAR: unit["property_tax"]} people[head]["rent"] = {YEAR: unit["rent"]} - if any_lessee: - months = 12 if occupies(unit) else 0 + if unit.get("lessee", False): for person in unit_members: - people[person][OCCUPANCY] = {YEAR: months} + people[person][LESSEE_MONTHS] = {YEAR: 12} tax_units[unit_key] = {"members": unit_members} marital_units[unit_key] = {"members": unit_members} members += unit_members diff --git a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py index f5226dca080..7a2403a605e 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py +++ b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py @@ -8,7 +8,9 @@ claimed on a return are paid after its year ends, so the model takes the federal refundable credits each person received during the year as an input (mt_elderly_homeowner_or_renter_credit_federal_refundable_credits), not the -current return's entitlement. These tests check that input for households of +current return's entitlement; its default counts only the 2020 and 2021 +Economic Impact Payments, which are zero in 2024. These tests check that +input for households of a claimant aged 62 or older and a younger member who files their own return with up to two children, so that the member's return has a federal EITC and a refundable child tax credit. diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py index 8eeffa562de..e5ef0041fa8 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py @@ -8,9 +8,12 @@ class mt_elderly_homeowner_or_renter_credit_federal_refundable_credits(Variable) documentation = ( "Federal refundable tax credit cash this person received during the " "year, such as an earned income or child tax credit refund from the " - "prior year's return or an Economic Impact Payment. Defaults to zero: " - "the credits claimed on this year's return are paid after the year " - "ends, so they do not establish a receipt." + "prior year's return or an Economic Impact Payment. Defaults to the " + "return's recovery rebate credits (the 2020 and 2021 Economic Impact " + "Payments, advanced during the same year), on the tax unit head, and " + "to zero in other years: the other credits claimed on this year's " + "return are paid after the year ends, so they do not establish a " + "receipt. A supplied amount replaces the default." ) unit = USD definition_period = YEAR @@ -31,9 +34,24 @@ class mt_elderly_homeowner_or_renter_credit_federal_refundable_credits(Variable) "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2024_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=47", ) - # An actual-receipt input, like mt_elderly_homeowner_or_renter_credit_received. + # An actual-receipt amount, like mt_elderly_homeowner_or_renter_credit_received. # The refundable credits on this year's return, income_tax_refundable_credits, # are an entitlement paid in a later year, not a receipt during this one. # Reading last year's return instead would rerun the whole prior-year # federal tax computation for each record, and it reads 0 whenever the # inputs cover only one year. + # + # The recovery rebate credits are the exception. IRC 6428(f), 6428A(f) + # and 6428B(g) paid them in advance as Economic Impact Payments, by + # December 31, 2020 (CARES), January 15, 2021 (CAA) and December 31, + # 2021 (ARPA), so each year's credit was received in that year. The + # CAA credit is a 2020 credit whose advance could run to January 15, + # 2021; it is counted in 2020 with the CARES payment. The return's + # credit stands in for the advance payment; any amount reconciled on the + # return is paid the next year and is not separated here. The credit + # parameters are zero outside 2020 and 2021, so so is this default. + def formula(person, period, parameters): + # Gross household income sums this person-level amount over the + # household, so count each return's payments once, on its head. + head = person("is_tax_unit_head", period) + return head * person.tax_unit("recovery_rebate_credit", period) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_mt_residency_months.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_mt_residency_months.py index 7a5982f9af0..18271b451c0 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_mt_residency_months.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_mt_residency_months.py @@ -9,10 +9,14 @@ class mt_elderly_homeowner_or_renter_credit_mt_residency_months(Variable): ) documentation = ( "Months of the year, from 0 to 12, this person resided in Montana. " - "Defaults to 12 for members of a Montana household, whose state the " - "model treats as their residence for the whole year." + "Defaults to 12: the model treats a Montana household's state as its " + "members' residence for the whole year. An input for one person " + "leaves everyone else at 12." ) unit = "month" + # A default rather than a formula, so supplying one person's months + # leaves the others at the full year instead of at 0. + default_value = MONTHS_IN_YEAR definition_period = YEAR defined_for = StateCode.MT reference = ( @@ -23,6 +27,3 @@ class mt_elderly_homeowner_or_renter_credit_mt_residency_months(Variable): # least nine months during the tax year" "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=44", ) - - def formula(person, period, parameters): - return MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py index 0d09e6b9e8c..3b45c0aaeb4 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py @@ -8,9 +8,13 @@ class mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months(Variable documentation = ( "Months of the year, from 0 to 12, this person occupied one or more " "Montana dwellings as an owner, renter, or lessee. Another household " - "member's property tax bill does not establish that status. Defaults " - "to 12 for the head and spouse of a tax unit that pays rent or is " - "billed property tax, and to 0 otherwise." + "member's property tax bill does not establish that status. 12 for " + "the head and spouse of a tax unit that pays rent or is billed " + "property tax; otherwise the months recorded in " + "mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months, " + "which defaults to 0. Record a rent-free lessee or owner there, not " + "here: an input to this variable for one person sets everyone " + "else's months to 0." ) unit = "month" definition_period = YEAR @@ -35,12 +39,19 @@ def formula(person, period, parameters): # A tax unit with neither shows no such status: the household's bill # in another member's name can count as rent only for a claimant # who is otherwise eligible (ARM 42.4.302(2)(b)), so it cannot - # establish the status here. Supply this input for an occupant who - # holds the home as a lessee or owner without either amount. + # establish the status here. An occupant who holds the home as a + # lessee or owner without either amount is recorded through a + # separate input, so recording one person leaves everyone else's + # months to follow their own rent and bill. rent = add(person.tax_unit, period, ["rent"]) property_tax = person.tax_unit( "mt_elderly_homeowner_or_renter_credit_property_tax_billed", period ) documented = (rent > 0) | (property_tax > 0) head_or_spouse = person("is_tax_unit_head_or_spouse", period) - return where(head_or_spouse & documented, MONTHS_IN_YEAR, 0) + documented_months = where(head_or_spouse & documented, MONTHS_IN_YEAR, 0) + unbilled_months = person( + "mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months", + period, + ) + return min_(max_(documented_months, unbilled_months), MONTHS_IN_YEAR) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months.py new file mode 100644 index 00000000000..09c822d1243 --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months(Variable): + value_type = int + entity = Person + label = "Months occupying a Montana dwelling as an owner, renter, or lessee without rent paid or property tax billed, for the Montana elderly homeowner/renter credit" + documentation = ( + "Months of the year, from 0 to 12, this person occupied one or more " + "Montana dwellings as an owner, renter, or lessee that neither rent " + "paid nor property tax billed to their tax unit shows, such as a " + "lessee who pays no rent. Defaults to 0. Supplying it for one person " + "leaves everyone else's occupancy to follow their own rent and " + "property tax." + ) + unit = "month" + definition_period = YEAR + defined_for = StateCode.MT + reference = ( + # MCA 15-30-2338(1)(c): occupied one or more dwellings in Montana + # "as an owner, renter, or lessee for at least 6 months" + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0380/0150-0300-0230-0380.html", + "https://mca.legmt.gov/bills/2009/mca/15/30/15-30-2338.htm", + ) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 1cea80fc061..dca8d99e00e 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -5151,40 +5151,6 @@ candidates: non-loss adjustments, and adds back only the business and capital losses (mt_elderly_homeowner_or_renter_credit_gross_household_income.py, elderly_homeowner_or_renter/gross_income_sources.yaml). Identify the omitted adjustments and verify applicability in both years.' -- id: us-mt:elderly-credit-refundable-credit-timing - program: elderly-homeowner-renter-credit - years: - from: 2021 - to: 2023 - type: tax - question: Do refundable credits enter elderly-credit income when received under the regulation or as reported - on the current return under the schedule? - sources: - - kind: regulation - citation: ARM 42.4.301(2)(b)-(c) - url: null - - kind: form - citation: 2021-2023 Elderly Homeowner/Renter Credit Schedule - url: https://revenue.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2/2023_Montana_Individual_Income_Tax_Return_Form_2.pdf#page=10 - readings: - statute: The cited regulation counts refundable credits actually received; no statute is supplied. - other: The schedule directs use of amounts reported on the current Form 2. - pe_us: - follows: unknown - code: - - policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py - - policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_received.py - - policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml - - policyengine_us/variables/gov/states/mt/tax/income/tax_calculation/mt_refundable_credits_before_renter_credit.py - - policyengine_us/parameters/gov/states/mt/tax/income/credits/refundable.yaml - prs: - - https://github.com/PolicyEngine/policyengine-us/pull/9915 - state: unreviewed - note: PE-US uses the current return's federal and other Montana refundable credits (the Montana EITC from 2019) - as a proxy for credits received, while the elderly credit itself enters as an input for the amount received - during the year (mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py, mt_refundable_credits_before_renter_credit.py, - credits/refundable.yaml, mt_elderly_homeowner_or_renter_credit_received.py, elderly_homeowner_or_renter/gross_income_sources.yaml). - Resolve the regulation/form timing difference, noting that the 2024 caption uses received amounts. - id: us-mt:elderly-credit-rent-free-occupants program: income-tax years: @@ -5195,7 +5161,7 @@ candidates: sources: - kind: statute citation: MCA 15-30-2338(1)(c) - url: null + url: https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0380/0150-0300-0230-0380.html - kind: regulation citation: ARM 42.4.302(2)(b) url: https://www.law.cornell.edu/regulations/montana/Mont-Admin-r-42.4.302 @@ -5203,22 +5169,67 @@ candidates: citation: 2025 Form 2 instructions, Schedule 2EC line 23, PDF page 47 url: https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=47 readings: - statute: The owner, renter or lessee condition potentially excludes a rent-free occupant. + statute: The owner, renter or lessee condition excludes a rent-free occupant who holds none of those statuses. other: Another person's property tax bill qualifies as the claimant's rent. example: An 80-year-old parent with a $14,000 pension living rent-free in a child's home with $4,000 property - tax receives a 2024 credit of $341 versus $0 before. + tax and no lessee status receives a 2024 credit of $0 under the statute, against $341 under the other reading. + Recorded as a lessee, the parent receives $341. pe_us: - follows: conflicting-source + follows: statute code: + - policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.py + - policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py + - policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months.py - policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_rent.py - policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_property_tax_billed.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/9945 + - https://github.com/PolicyEngine/policyengine-us/pull/10331 + state: ruled + note: 'PE-US follows the statute from #10331: a head or spouse must have occupied a Montana dwelling as an owner, + renter or lessee for 6 months (mt_elderly_homeowner_or_renter_credit_eligible.py). Rent paid or property tax + billed to the tax unit shows that status (mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py); + a rent-free lessee is recorded through mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months.py. + The household''s bill still counts as rent for an eligible claimant whose tax unit is billed nothing, which + ARM 42.4.302(2)(b) allows "an eligible claimant" (mt_elderly_homeowner_or_renter_credit_gross_rent.py), so + the regulation is read as measuring rent, not as conferring eligibility. Move to the register once its sources + are captured.' +- id: us-mt:elderly-credit-federal-refundable-credits-before-2017 + program: elderly-homeowner-renter-credit + years: + from: 2009 + to: 2016 + type: tax + question: Before ARM 42.4.301(2)(b) was amended on November 10, 2017, did gross household income count federal + refundable credits received, as nontaxable income under the statute, or only federal refunds that recovered + a prior-year Montana tax benefit, under the regulation and the form? + sources: + - kind: statute + citation: MCA 15-30-2337(9)(a) (2009) + url: https://archive.legmt.gov/bills/2009/mca/15/30/15-30-2337.htm + - kind: regulation + citation: ARM 42.4.301(2)(b) as in effect 8/20/2004 to 11/9/2017 + url: https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/788508cc-8418-41c8-926d-3dfb11af3fd6 + - kind: form + citation: 2016 Montana Form 2EC Gross Household Income Worksheet, PDF pages 74-75 + url: https://taxsim.nber.org/historical_state_tax_forms/MT/2016/Form_2_booklet_2016.pdf#page=74 + readings: + statute: A refundable credit received is nontaxable income under (9)(a), so it counts from 2009. + other: A refundable credit paid in excess of tax is a federal refund, which the pre-2017 regulation counts only + to the extent it recovered a prior-year Montana tax benefit, and the 2016 worksheet lists only federal income + tax refunds taxable in Montana; so it does not count before 2017. + pe_us: + follows: conflicting-source + code: + - policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml + - policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10331 state: open - note: 'PE-US follows the regulation and instructions: when no one in the claimant''s tax unit is billed property - tax, the household''s property tax counts as rent, taking the larger of that and rent paid, so a rent-free occupant - can qualify (mt_elderly_homeowner_or_renter_credit_gross_rent.py). The source-choice question remains open; - the statute-first rule requires a model change if the regulation expands rather than interprets statutory eligibility.' + note: PE-US follows the regulation and the form before 2017. The federal refundable credits received + (mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py) enter the source list only from 2017 + (elderly_homeowner_or_renter/gross_income_sources.yaml). Whether the pre-2017 regulation narrows the statute's + "all nontaxable income", and how far a Montana rule binds against its statute, is open for the project lead. - id: us-mt:liheap-business-equity-limit program: liheap years: From 5007d15256e45525d2117ba606e156e087951c32 Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Tue, 3 Nov 2026 14:41:52 -0500 Subject: [PATCH 4/6] Montana elderly credit: count Montana refundable credits received, not this year's (#10653) * Count Montana refundable credits received, not this year's, in elderly credit income MCA 15-30-2337(4) counts income received during the year, and ARM 42.4.301(2)(c) counts "any state refundable tax credits received". Schedule 2EC line 8 still took the Montana EITC from this year's return, which is paid after the year ends. A Montana receipt input (default 0) replaces it in the 2017 and 2023 source lists, as the federal credits already do; the 2009 list drops it, since Montana had no other refundable credit before 2019. taxsim #1492 (2024, single, 63): the credit moves from 235.27 to 237.73 (TaxAct 237). Worked cases that supply federal receipts now supply the Montana receipt the same way; the 2021 case drops the 2.45 Montana EITC paid in 2022 (63.33 -> 63.45). Co-Authored-By: Claude Opus 5.5 (1M context) * Note that the property tax rebate has its own input (review G1) Co-Authored-By: Claude Opus 5.5 (1M context) --------- Co-authored-by: Claude Opus 5.5 (1M context) --- ...e-bugs-mt-disability-ehrc-elderly.fixed.md | 2 +- .../gross_income_sources.yaml | 22 ++++--- ...mt_elderly_homeowner_or_renter_credit.yaml | 58 +++++++++++++++++-- ..._renter_credit_gross_household_income.yaml | 6 ++ ...est_mt_elderly_credit_household_members.py | 4 +- ...est_mt_elderly_credit_nontaxable_income.py | 5 +- ...st_mt_elderly_credit_refundable_credits.py | 22 +++---- ..._renter_credit_state_refundable_credits.py | 33 +++++++++++ 8 files changed, 120 insertions(+), 32 deletions(-) create mode 100644 policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py diff --git a/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md index 7aedae846e4..8ddd6d50972 100644 --- a/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md +++ b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md @@ -1 +1 @@ -End Montana's disability income exclusion with its 2024 repeal, count only the federal refundable credits a household actually received (by default the 2020 and 2021 Economic Impact Payments) in the elderly homeowner/renter credit's gross household income, and require that credit's claimant to meet the six-month owner, renter or lessee occupancy and nine-month residence tests (MCA 15-30-2338(1)(b)-(c)). +End Montana's disability income exclusion with its 2024 repeal, count only the federal and Montana refundable credits a household actually received (by default the 2020 and 2021 Economic Impact Payments, and no Montana credits) in the elderly homeowner/renter credit's gross household income, and require that credit's claimant to meet the six-month owner, renter or lessee occupancy and nine-month residence tests (MCA 15-30-2338(1)(b)-(c)). diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml index fccbdf3a096..6046db17fb7 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml @@ -83,17 +83,15 @@ values: # unemployment"; Schedule 2EC line 14 from 2024, the total received). - mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback # Refundable credits received (2023 schedule line 7, Schedule 2EC line 8 - # from 2024): Montana's refundable credits other than this credit, - # and this credit as received during the year (ARM 42.4.301(2)(c)). - # Known gap: mt_refundable_credits_before_renter_credit is the Montana - # refundable credits on this year's return, which are paid after the - # year ends, not the Montana credits received during the year (MCA - # 15-30-2337(4)). Federal credits use receipts from 2017. - - mt_refundable_credits_before_renter_credit + # from 2024): this credit as received during the year (ARM + # 42.4.301(2)(c)). Before 2019 Montana had no other refundable credit; + # Montana credits received count from 2017, with the federal ones. - mt_elderly_homeowner_or_renter_credit_received - # ARM 42.4.301(2)(b), amended effective 11/10/2017, counts "federal - # refundable credits received"; the 2017 Form 2EC worksheet counts "any - # federal or state refundable credits". + # ARM 42.4.301(2)(b)-(c), amended effective 11/10/2017, counts "federal + # refundable credits received" and "any state refundable credits + # received"; the 2017 Form 2EC worksheet counts "any federal or state + # refundable credits". Both are receipts during the year, not the credits + # on this year's return (MCA 15-30-2337(4)). 2017-01-01: - adjusted_gross_income_person - tax_exempt_interest_income @@ -110,7 +108,7 @@ values: - gi_cash_assistance - tax_exempt_disability_benefits - mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback - - mt_refundable_credits_before_renter_credit + - mt_elderly_homeowner_or_renter_credit_state_refundable_credits - mt_elderly_homeowner_or_renter_credit_received - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits # Actual rebate receipts count under the statutory nontaxable-income @@ -133,7 +131,7 @@ values: - gi_cash_assistance - tax_exempt_disability_benefits - mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback - - mt_refundable_credits_before_renter_credit + - mt_elderly_homeowner_or_renter_credit_state_refundable_credits - mt_elderly_homeowner_or_renter_credit_received - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits - mt_elderly_homeowner_or_renter_credit_property_tax_rebate_received diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml index 47aed5c8586..0266bfc0029 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml @@ -230,12 +230,11 @@ # Economic Impact Payments". Received in 2021: the 1_400 Economic Impact # Payment (the 2021 recovery rebate credit, which the model counts by # default). The 2021 federal EITC (ARPA, no qualifying child), 1_502 - - # 15.3% x (20_892.60 - 11_610) = 81.76, is paid in 2022, so it is not; - # the Montana EITC on the 2021 return, 3% = 2.45, counts as the model's - # Montana refundable credits. Line 10 = 20_892.60 + 1_400 + 2.45 = - # 22_295.05; line 12 = 15_995.05; line 14 = 799.75; line 19 = 863.08 - - # 799.75 = 63.33. - mt_elderly_homeowner_or_renter_credit: 63.33 + # 15.3% x (20_892.60 - 11_610) = 81.76, is paid in 2022, so it is not, + # and nor is the Montana EITC on the 2021 return, 3% = 2.45. Line 10 = + # 20_892.60 + 1_400 = 22_292.60; line 12 = 15_992.60; line 14 = 799.63; + # line 19 = 863.08 - 799.63 = 63.45. + mt_elderly_homeowner_or_renter_credit: 63.45 - name: MT EHRC uses the $12,600 exclusion from 2022 (HB 191) period: 2022 @@ -941,6 +940,8 @@ employment_income: 10_000 # Federal EITC refund received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 63.20 tax_units: tax_unit1: members: [person1] @@ -977,6 +978,8 @@ employment_income: 10_000 # Federal EITC and refundable CTC received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 4_525 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 340 person3: age: 5 tax_units: @@ -1016,6 +1019,8 @@ employment_income: 12_000 # Federal EITC and refundable CTC received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 5_505 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 408 person3: age: 5 tax_units: @@ -1086,6 +1091,8 @@ employment_income: 10_000 # Federal EITC refund received during 2023. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 584.70 + # Montana EITC refund received during 2023. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 17.54 tax_units: tax_unit1: members: [person1] @@ -1724,3 +1731,42 @@ # child's spouse; line 25 = 600; line 27 = 600; line 30 = 600. mt_elderly_homeowner_or_renter_credit_gross_rent: [4_000, 0] mt_elderly_homeowner_or_renter_credit: [600, 0, 0] + +- name: 2024 Schedule 2EC, this return's federal and Montana EITC are not refundable credits received in 2024 (taxsim 1492) + period: 2024 + absolute_error_margin: 1 + input: + people: + person1: + age: 63 + employment_income: 10_057.14 + social_security_retirement: 11_043.82 + rent: 3_795.12 + households: + household: + members: [person1] + state_code: MT + output: + # TaxAct Schedule 2EC line 18: 21,100. The 2024 federal EITC (632) and + # Montana EITC (63.20) are paid in 2025, so line 8 is 0. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 0 + mt_elderly_homeowner_or_renter_credit_gross_household_income: 21_100.96 + mt_elderly_homeowner_or_renter_credit: 237.73 # TaxAct line 30: 237 + +- name: 2024 Schedule 2EC, a Montana EITC refund received in 2024 from the 2023 return counts on line 8 + period: 2024 + absolute_error_margin: 1 + input: + people: + person1: + age: 63 + employment_income: 10_057.14 + social_security_retirement: 11_043.82 + rent: 3_795.12 + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 60 + households: + household: + members: [person1] + state_code: MT + output: + mt_elderly_homeowner_or_renter_credit_gross_household_income: 21_160.96 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml index 158c5386cbf..73347b8029f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml @@ -207,6 +207,8 @@ employment_income: 10_000 # Federal EITC refund received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 63.20 tax_units: tax_unit1: members: [person1] @@ -240,6 +242,8 @@ employment_income: 10_000 # Federal EITC and refundable CTC received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 4_525 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 340 person3: age: 5 tax_units: @@ -531,6 +535,8 @@ employment_income: 25_000 # Federal EITC and refundable CTC received during 2024. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 9_854.83 + # Montana EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 647.98 person3: age: 5 person4: diff --git a/policyengine_us/tests/test_mt_elderly_credit_household_members.py b/policyengine_us/tests/test_mt_elderly_credit_household_members.py index bb0ef7d06ec..91459ff2d47 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_household_members.py +++ b/policyengine_us/tests/test_mt_elderly_credit_household_members.py @@ -151,7 +151,9 @@ def calculate(cases): dependent = np.asarray(simulation.calculate("is_tax_unit_dependent", YEAR)) other_refundable_credits = np.asarray( simulation.calculate( - "mt_refundable_credits_before_renter_credit", YEAR, map_to="household" + "mt_elderly_homeowner_or_renter_credit_state_refundable_credits", + YEAR, + map_to="household", ) ) federal_refundable_credits = np.asarray( diff --git a/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py b/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py index 3090ca71bfc..c1be241cac7 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py +++ b/policyengine_us/tests/test_mt_elderly_credit_nontaxable_income.py @@ -211,7 +211,10 @@ def by_household(variable, year): "mt_elderly_homeowner_or_renter_credit_federal_refundable_credits", year, ) - + by_household("mt_refundable_credits_before_renter_credit", year), + + by_household( + "mt_elderly_homeowner_or_renter_credit_state_refundable_credits", + year, + ), } for year in YEARS } diff --git a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py index 7a2403a605e..ebe84e0fcf3 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py +++ b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py @@ -144,13 +144,13 @@ def assert_properties(cases): def test_worked_example(): """2024 Schedule 2EC: the claimant's line 5 pension 20,000; the daughter's wages 10,000 (line 17). Her 2024 return has a federal EITC of - 34% x 10,000 = 3,400 and a refundable child tax credit of min(1,700, 15% - x 7,500) = 1,125, paid in 2025, so they are not received in 2024. Line 8 - counts the 4,525 of federal credits she received during 2024 and her - Montana EITC of 340. Line 18 = 34,865; line 22 = (34,865 - 12,600) x - 0.05 = 1,113.25; line 27 = 2,000 - 1,113.25 = 886.75; line 30 = 886.75. - With nothing received, line 18 = 30,340, line 22 = 887 and line 30 = - 1,113.""" + 34% x 10,000 = 3,400, a refundable child tax credit of min(1,700, 15% x + 7,500) = 1,125 and a Montana EITC of 340, all paid in 2025, so none is + received in 2024. Line 8 counts the 4,525 of federal credits she + received during 2024. Line 18 = 34,525; line 22 = (34,525 - 12,600) x + 0.05 = 1,096.25; line 27 = 2,000 - 1,096.25 = 903.75; line 30 = 903.75. + With nothing received, line 18 = 30,000, line 22 = 870 and line 30 = + 1,130.""" case = { "claimant_age": 70, "pension": 20_000, @@ -166,10 +166,10 @@ def test_worked_example(): z = calculate([case], received=False) assert z["federal_tax_unit"][0] == pytest.approx(4_525, abs=TOLERANCE) assert z["federal_person"][0] == 0 - assert w["gross"][0] == pytest.approx(34_865, abs=TOLERANCE) - assert w["credit"][0] == pytest.approx(886.75, abs=TOLERANCE) - assert z["gross"][0] == pytest.approx(30_340, abs=TOLERANCE) - assert z["credit"][0] == pytest.approx(1_113, abs=TOLERANCE) + assert w["gross"][0] == pytest.approx(34_525, abs=TOLERANCE) + assert w["credit"][0] == pytest.approx(903.75, abs=TOLERANCE) + assert z["gross"][0] == pytest.approx(30_000, abs=TOLERANCE) + assert z["credit"][0] == pytest.approx(1_130, abs=TOLERANCE) assert_properties([case]) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py new file mode 100644 index 00000000000..0c281935821 --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class mt_elderly_homeowner_or_renter_credit_state_refundable_credits(Variable): + value_type = float + entity = Person + label = "Montana refundable credits received, in Montana elderly homeowner/renter credit gross household income" + documentation = ( + "Montana refundable tax credit cash this person received during the " + "year, other than the elderly homeowner/renter credit, such as a " + "Montana earned income tax credit refund from the prior year's " + "return. Defaults to zero: the Montana credits claimed on this year's " + "return are paid after the year ends, so they do not establish a " + "receipt. The elderly homeowner/renter credit received enters " + "separately through mt_elderly_homeowner_or_renter_credit_received, " + "and the Montana property tax rebate received through " + "mt_elderly_homeowner_or_renter_credit_property_tax_rebate_received, " + "so leave both out of this amount." + ) + unit = USD + definition_period = YEAR + defined_for = StateCode.MT + reference = ( + # MCA 15-30-2337(4): gross household income is "all income received + # by all individuals of a household" + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0370/0150-0300-0230-0370.html", + # ARM 42.4.301(2)(c): "any state refundable tax credits received" + "https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/768c8344-24ee-4950-9d5e-9d8fc97ec0f7", + # 2024 Schedule 2EC, line 8: "Combine all the refundable credits + # received by all household members in 2024", including "the federal + # and Montana earned income tax credits" + "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2024_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=47", + ) From 41d17497ca8253b50780321c1bfb9965bb17bc8e Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Tue, 3 Nov 2026 16:38:52 -0500 Subject: [PATCH 5/6] Address the round-2 review of the Montana elderly credit and disability fixes - S5: split the federal receipt into the 2020-2021 Economic Impact Payment default and a new input-only variable for other federal receipts, so supplying one member's receipt no longer zeroes every other return's payments; add the 2021 two-return cases. - S6: pin the Montana receipt's place in the 2017 source list with a 2021 case. - S7(b): reword the 2009 source-list comment to match ARM 42.4.301(2)(c) before 2017 ("Montana state income tax ... refunds received") and the 2016 instructions, and count supplied Montana receipts from 2009 (default 0, so default results are unchanged). - G2: trim the Hypothesis property test to the worked example, which keeps the two-simulation checks. - G3: note the 2337(7)(b) pooling in the pre-one-claimant cases and the former 2110(10) weekly limit and $15,000 reduction. - G4: replace formula_2024 with a disability_income.in_effect parameter. - G6: document that the 2021 advance child tax credit is not in the default. - G7: pin the 12-month cap on qualifying occupancy. - G9: capture the pre-2017 ARM 42.4.301 expressions, ARM 42.4.302, the 2009 MCA 15-30-2337 and the 2016 and 2025 form pages for the two candidates. - G10: describe supplied receipts as receipts, not this year's credits. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- ...e-bugs-mt-disability-ehrc-elderly.fixed.md | 2 +- .../gross_income_sources.yaml | 16 +- .../disability_income/in_effect.yaml | 15 ++ ...mt_elderly_homeowner_or_renter_credit.yaml | 67 ++++--- ...y_homeowner_or_renter_credit_eligible.yaml | 12 ++ ...ter_credit_federal_refundable_credits.yaml | 77 +++++++- ..._renter_credit_gross_household_income.yaml | 105 +++++++---- ...ner_or_renter_credit_pre_one_claimant.yaml | 7 + ...st_mt_elderly_credit_refundable_credits.py | 94 +++------- ...enter_credit_federal_refundable_credits.py | 41 ++++- ...credit_other_federal_refundable_credits.py | 33 ++++ ..._renter_credit_state_refundable_credits.py | 3 + ...bility_income_exclusion_eligible_person.py | 10 +- .../mt_disability_income_exclusion_person.py | 22 ++- source_conflicts/candidates.yaml | 11 +- .../sources/us-mt/arm-42-4-301-2004.html | 108 +++++++++++ .../sources/us-mt/arm-42-4-301-2010.html | 108 +++++++++++ .../sources/us-mt/arm-42-4-301-2013.html | 108 +++++++++++ .../sources/us-mt/arm-42-4-302-2024.html | 116 ++++++++++++ .../us-mt/form-2-booklet-2016-p74-75.txt | 167 ++++++++++++++++++ .../us-mt/form-2-instructions-2025-p47.txt | 79 +++++++++ .../sources/us-mt/mca-15-30-2337-2009.txt | 28 +++ 22 files changed, 1065 insertions(+), 164 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/mt/tax/income/subtractions/disability_income/in_effect.yaml create mode 100644 policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits.py create mode 100644 source_conflicts/sources/us-mt/arm-42-4-301-2004.html create mode 100644 source_conflicts/sources/us-mt/arm-42-4-301-2010.html create mode 100644 source_conflicts/sources/us-mt/arm-42-4-301-2013.html create mode 100644 source_conflicts/sources/us-mt/arm-42-4-302-2024.html create mode 100644 source_conflicts/sources/us-mt/form-2-booklet-2016-p74-75.txt create mode 100644 source_conflicts/sources/us-mt/form-2-instructions-2025-p47.txt create mode 100644 source_conflicts/sources/us-mt/mca-15-30-2337-2009.txt diff --git a/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md index 8ddd6d50972..01508a2db52 100644 --- a/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md +++ b/changelog.d/statute-bugs-mt-disability-ehrc-elderly.fixed.md @@ -1 +1 @@ -End Montana's disability income exclusion with its 2024 repeal, count only the federal and Montana refundable credits a household actually received (by default the 2020 and 2021 Economic Impact Payments, and no Montana credits) in the elderly homeowner/renter credit's gross household income, and require that credit's claimant to meet the six-month owner, renter or lessee occupancy and nine-month residence tests (MCA 15-30-2338(1)(b)-(c)). +End Montana's disability income exclusion with its 2024 repeal, count only the federal and Montana refundable credits a household actually received (by default the 2020 and 2021 Economic Impact Payments, with other receipts as separate inputs) in the elderly homeowner/renter credit's gross household income, and require that credit's claimant to meet the six-month owner, renter or lessee occupancy and nine-month residence tests (MCA 15-30-2338(1)(b)-(c)). diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml index 6046db17fb7..d4a4ad7bffb 100644 --- a/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml +++ b/policyengine_us/parameters/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/gross_income_sources.yaml @@ -12,7 +12,7 @@ metadata: href: https://law.justia.com/codes/montana/2022/title-15/chapter-30/part-23/section-15-30-2337/ - title: HB191 (2021), section 1(9), all nontaxable income href: https://archive.legmt.gov/bills/2021/HB0199/HB0191_X.pdf#page=2 - - title: ARM 42.4.301(2) as in effect 8/20/2004 to 11/9/2017 ("elderly homeowner/renter credit refunds received") + - title: ARM 42.4.301(2) as in effect 8/20/2004 to 11/9/2017 ("Montana state income tax and elderly homeowner/renter credit refunds received") href: https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/788508cc-8418-41c8-926d-3dfb11af3fd6 - title: ARM 42.4.301(2) as in effect 11/10/2017 to 9/6/2024 ("federal refundable credits received" and "any state refundable credits received") href: https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/297c7a8d-f6f4-4b70-a7b7-fe1cedee53e7 @@ -20,7 +20,7 @@ metadata: href: https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/768c8344-24ee-4950-9d5e-9d8fc97ec0f7 - title: "2014 Montana Form 2EC instructions, Part II, disability benefits including SSI payments and workers' compensation; Income Source Worksheet, line 7, alimony, cash public assistance, unemployment #page 53-54" href: https://taxsim.nber.org/historical_state_tax_forms/MT/2014/Form_2_booklet_2014.pdf#page=53 - - title: "2016 Montana Form 2EC instructions, Part II, disability benefits including SSI payments and workers' compensation, and cash public assistance and relief; Gross Household Income Worksheet, line 7, alimony, cash public assistance, unemployment #page 74-75" + - title: "2016 Montana Form 2EC instructions, Part II, disability benefits including SSI payments and workers' compensation, cash public assistance and relief, and federally taxable state tax refunds; Gross Household Income Worksheet, line 7, alimony, cash public assistance, unemployment #page 74-75" href: https://taxsim.nber.org/historical_state_tax_forms/MT/2016/Form_2_booklet_2016.pdf#page=74 - title: "2017 Montana Form 2EC instructions, Part II, disability benefits including SSI payments and workers' compensation, and cash public assistance and relief; Gross Household Income Worksheet, items 4 and 5 (alimony, cash public assistance, unemployment) #page 64-65" href: https://taxsim.nber.org/historical_state_tax_forms/MT/2017/Form%202%202017%20Booklet.pdf#page=64 @@ -83,9 +83,15 @@ values: # unemployment"; Schedule 2EC line 14 from 2024, the total received). - mt_elderly_homeowner_or_renter_credit_unemployment_compensation_addback # Refundable credits received (2023 schedule line 7, Schedule 2EC line 8 - # from 2024): this credit as received during the year (ARM - # 42.4.301(2)(c)). Before 2019 Montana had no other refundable credit; - # Montana credits received count from 2017, with the federal ones. + # from 2024): this credit and the other Montana refundable credits, as + # received during the year. Before 11/10/2017, ARM 42.4.301(2)(c) + # counted "Montana state income tax and elderly homeowner/renter credit + # refunds received", and a Montana refundable credit is paid as part of + # the Montana income tax refund. The 2016 instructions give "Federally + # taxable state tax refunds" and "Elderly homeowner/renter credit + # allowed" as examples of "all the income received, taxable and + # nontaxable". Federal refundable credits received count from 2017. + - mt_elderly_homeowner_or_renter_credit_state_refundable_credits - mt_elderly_homeowner_or_renter_credit_received # ARM 42.4.301(2)(b)-(c), amended effective 11/10/2017, counts "federal # refundable credits received" and "any state refundable credits diff --git a/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/disability_income/in_effect.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/disability_income/in_effect.yaml new file mode 100644 index 00000000000..f2766ced5f0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/disability_income/in_effect.yaml @@ -0,0 +1,15 @@ +description: Montana provides the disability income exclusion if this is true. +values: + 2010-01-01: true + # 2021 Mont. Laws ch. 503 repeals 15-30-2110, MCA, which held the + # exclusion, for income tax years beginning after December 31, 2023. + 2024-01-01: false +metadata: + unit: bool + period: year + label: Montana disability income exclusion in effect + reference: + - title: "2021 Mont. Laws ch. 503 (SB 399), section 65 repeals 15-30-2110, MCA; section 70(1) applies the act to income tax years beginning after December 31, 2023 #page 68,70" + href: https://archive.legmt.gov/content/Publications/sales/2021SessionLaws_V3_ERRATA-VERSION.pdf#page=68 + - title: 2024 Montana Form 2 instructions, repealed deductions, "Partial retirement disability deduction for taxpayers under age 65" + href: https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2024_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=5 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml index 0266bfc0029..3da2456c035 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml @@ -938,9 +938,9 @@ person2: age: 40 employment_income: 10_000 - # Federal EITC refund received during 2024. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 - # Montana EITC refund received during 2024. + # Supplied receipts: federal and Montana EITC refunds received during + # 2024. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 632 mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 63.20 tax_units: tax_unit1: @@ -954,13 +954,12 @@ output: # The claimant's adult son lives in the household and files his own # return. Line 5 pensions 20_000. Line 8, refundable credits received by - # all household members: the 632 federal EITC refund he received in 2024 - # and Montana EITC 10% x 632 = 63.20 (Rev. Proc. 2023-34, no qualifying - # child, wages between 8_260 and 10_330), 695.20 in all. Line 17 his wages 10_000. Line 18 - # gross household income 30_695.20; line 20 = 30_695.20 - 12_600 = - # 18_095.20; line 21 = 0.05; line 22 = 904.76; line 27 = 2_000 - 904.76 - # = 1_095.24; line 28 = 1_095.24 (under 1_150); line 29 = 100%; line 30 = - # 1_095.24. Counting only his Montana EITC gave 1_126.84. + # all household members: the supplied receipts, a 632 federal and a 63.20 + # Montana EITC refund he received in 2024, 695.20 in all. Line 17 his + # wages 10_000. Line 18 gross household income 30_695.20; line 20 = + # 30_695.20 - 12_600 = 18_095.20; line 21 = 0.05; line 22 = 904.76; line + # 27 = 2_000 - 904.76 = 1_095.24; line 28 = 1_095.24 (under 1_150); line + # 29 = 100%; line 30 = 1_095.24. mt_elderly_homeowner_or_renter_credit_net_household_income: [904.76, 0] mt_elderly_homeowner_or_renter_credit: [1_095.24, 0] @@ -976,9 +975,9 @@ person2: age: 30 employment_income: 10_000 - # Federal EITC and refundable CTC received during 2024. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 4_525 - # Montana EITC refund received during 2024. + # Supplied receipts: federal EITC and refundable CTC, and a Montana + # EITC refund, received during 2024. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 4_525 mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 340 person3: age: 5 @@ -993,12 +992,11 @@ state_name: MT output: # The claimant's daughter and grandchild live in the household; the - # daughter files her own return. Line 8, received during 2024: federal - # EITC 34% x 10_000 = 3_400, refundable part of the federal child tax - # credit - # min(1_700, 15% x (10_000 - 2_500)) = 1_125, Montana EITC 340; 4_865 in - # all. Line 17 her wages 10_000. Line 18 = 20_000 + 4_865 + 10_000 = - # 34_865; line 20 = 22_265; line 22 = 22_265 x 0.05 = 1_113.25; line 27 = + # daughter files her own return. Line 8, the supplied receipts during + # 2024: 4_525 of federal EITC and refundable child tax credit and a 340 + # Montana EITC refund; 4_865 in all. Line 17 her wages 10_000. Line 18 = + # 20_000 + 4_865 + 10_000 = 34_865; line 20 = 22_265; line 22 = 22_265 x + # 0.05 = 1_113.25; line 27 = # 2_000 - 1_113.25 = 886.75; line 29 = 100% (under 35_000); line 30 = # 886.75. mt_elderly_homeowner_or_renter_credit_gross_household_income: [20_000, 14_865, 0] @@ -1017,9 +1015,9 @@ person2: age: 30 employment_income: 12_000 - # Federal EITC and refundable CTC received during 2024. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 5_505 - # Montana EITC refund received during 2024. + # Supplied receipts: federal EITC and refundable CTC, and a Montana + # EITC refund, received during 2024. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 5_505 mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 408 person3: age: 5 @@ -1033,13 +1031,11 @@ members: [person1, person2, person3] state_name: MT output: - # Line 8, received during 2024: federal EITC 34% x 12_000 = 4_080 (under the 12_390 earned - # income amount), refundable child tax credit - # min(1_700, 15% x 9_500) = 1_425, Montana EITC 408; 5_913 in all. - # Line 18 = 20_000 + 5_913 + 12_000 = 37_913; line 20 = 25_313; + # Line 8, the supplied receipts during 2024: 5_505 of federal EITC and + # refundable child tax credit and a 408 Montana EITC refund; 5_913 in + # all. Line 18 = 20_000 + 5_913 + 12_000 = 37_913; line 20 = 25_313; # line 22 = 1_265.65; line 27 = 734.35; line 29 = 30% (37_501 to 40_000); - # line 30 = 734.35 x 0.3 = 220.31. Counting only the Montana EITC, line - # 18 was 32_408 and the credit 1_009.60. + # line 30 = 734.35 x 0.3 = 220.31. mt_elderly_homeowner_or_renter_credit: [220.31, 0, 0] - name: 2025 Schedule 2EC worked case, the credit and the property tax rebate received in 2025 count @@ -1089,9 +1085,9 @@ person2: age: 40 employment_income: 10_000 - # Federal EITC refund received during 2023. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 584.70 - # Montana EITC refund received during 2023. + # Supplied receipts: federal and Montana EITC refunds received during + # 2023. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 584.70 mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 17.54 tax_units: tax_unit1: @@ -1107,9 +1103,8 @@ output: # Line 1 federal AGI of all household members 30_000. Line 7, the # refundable credits received by the members of the household: the - # son's federal EITC, Rev. Proc. 2022-38, no qualifying child, - # 600 - 7.65% x (10_000 - 9_800) = 584.70, and Montana EITC 3%, 17.54; - # 602.24 in all. No actual property-rebate receipt is supplied, so + # supplied receipts, the son's 584.70 federal and 17.54 Montana EITC + # refunds; 602.24 in all. No actual property-rebate receipt is supplied, so # none counts. Line 10 = 30_602.24; line 12 = 18_002.24; line 13 = # 0.05; line 14 = 900.11; line 19 = 2_000 - 900.11 = 1_099.89; line 20 # = 1_099.89; line 21 = 100%; line 22 = 1_099.89. @@ -1127,14 +1122,14 @@ rent: 4_800 mt_elderly_homeowner_or_renter_credit_received: 60 mt_elderly_homeowner_or_renter_credit_property_tax_rebate_received: 20 - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 500 + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 500 person2: age: 70 taxable_pension_income: 15_000 rent: 7_200 mt_elderly_homeowner_or_renter_credit_received: 40 mt_elderly_homeowner_or_renter_credit_property_tax_rebate_received: 80 - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 300 + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 300 tax_units: tax_unit1: members: [person1] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml index 1a6516f3b3f..219aa9c6cd6 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml @@ -147,6 +147,18 @@ output: mt_elderly_homeowner_or_renter_credit_eligible: false +- name: An unbilled occupancy input above 12 months is capped at 12 + period: 2024 + input: + age: 80 + rent: 0 + state_code: MT + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 13 + output: + # A claim period has 12 months, so qualifying occupancy is at most 12. + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: 12 + mt_elderly_homeowner_or_renter_credit_eligible: true + - name: The occupancy test applies from 2009 period: 2009 input: diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml index 92d55c5b758..f60c4b8f340 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.yaml @@ -57,7 +57,8 @@ taxable_pension_income: 20_000 person2: age: 40 - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 + # A supplied receipt: a federal EITC refund received during 2024. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 632 tax_units: tax_unit1: members: [person1] @@ -69,7 +70,9 @@ state_code: MT output: # 2024 Schedule 2EC line 8: refundable credits received by all household - # members. The son received a 632 federal EITC refund during 2024. + # members. The son received a 632 federal EITC refund during 2024; no + # Economic Impact Payment was made in 2024, so the default adds nothing. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: [0, 632] mt_elderly_homeowner_or_renter_credit_gross_household_income: [20_000, 632] - name: Case 4, the 2021 Economic Impact Payment received in 2021 counts by default. @@ -152,7 +155,9 @@ person1: age: 63 taxable_pension_income: 20_000 - # A claimant who received no payment during 2021. + # A claimant who received no payment during 2021. Supplying this + # variable replaces the default for every member, so supply it for + # everyone in the household. mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 0 tax_units: tax_unit: @@ -183,6 +188,72 @@ mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 0 mt_elderly_homeowner_or_renter_credit_gross_household_income: 20_000 +- name: Case 4e, another member's other receipts add to the 2021 payments and leave the claimant's in place. + period: 2021 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + taxable_pension_income: 20_000 + real_estate_taxes: 2_000 + daughter: + age: 40 + employment_income: 15_000 + # A supplied receipt: a 600 federal refund received during 2021, + # beyond her Economic Impact Payment. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 600 + tax_units: + claimant_unit: + members: [claimant] + daughter_unit: + members: [daughter] + households: + household: + members: [claimant, daughter] + state_code: MT + output: + # Each return's head received the 1_400 third-round payment during 2021 + # (IRC 6428B(g); one adult, AGI under the 75_000 single threshold). The + # daughter's 600 adds to hers, and supplying it leaves the claimant's + # 1_400 in place: [1_400, 1_400 + 600] = [1_400, 2_000]. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: [1_400, 2_000] + # 2021 schedule. Line 10 = 20_000 + 1_400 + 15_000 + 2_000 = 38_400; + # line 12 = 38_400 - 6_300 = 32_100; line 13 = 0.05; line 14 = 1_605; + # line 19 = 2_000 - 1_605 = 395 (under the 1_000 cap); line 21 = 30% + # (37_501 to 40_000); line 22 = 395 x 0.3 = 118.50. + mt_elderly_homeowner_or_renter_credit_gross_household_income: [21_400, 17_000] + mt_elderly_homeowner_or_renter_credit: [118.50, 0] + +- name: Case 4f, without other receipts the same household counts both payments. + period: 2021 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + taxable_pension_income: 20_000 + real_estate_taxes: 2_000 + daughter: + age: 40 + employment_income: 15_000 + tax_units: + claimant_unit: + members: [claimant] + daughter_unit: + members: [daughter] + households: + household: + members: [claimant, daughter] + state_code: MT + output: + # Line 10 = 20_000 + 1_400 + 15_000 + 1_400 = 37_800; line 12 = 31_500; + # line 14 = 1_575; line 19 = 2_000 - 1_575 = 425; line 21 = 30%; line 22 + # = 425 x 0.3 = 127.50. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: [1_400, 1_400] + mt_elderly_homeowner_or_renter_credit_gross_household_income: [21_400, 16_400] + mt_elderly_homeowner_or_renter_credit: [127.50, 0] + - name: Case 5, zero by default outside Montana. period: 2024 input: diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml index 73347b8029f..609cba0f5bb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml @@ -205,9 +205,9 @@ person2: age: 40 employment_income: 10_000 - # Federal EITC refund received during 2024. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 632 - # Montana EITC refund received during 2024. + # Supplied receipts: federal and Montana EITC refunds received during + # 2024. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 632 mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 63.20 tax_units: tax_unit1: @@ -222,11 +222,9 @@ # 2024 Schedule 2EC line 8: "Combine all the refundable credits received # by all household members in 2024. Refundable credits include the # federal and Montana earned income tax credits". The member received a - # 632 federal EITC refund. Rev. Proc. 2023-34, no qualifying child: - # 10_000 is above the 8_260 earned income amount and under the 10_330 - # phaseout threshold, so this year's federal EITC is the maximum 632 and - # the Montana EITC is 10% of it, 63.20. The member's 10_000 + 632 + - # 63.20. + # 632 federal and a 63.20 Montana EITC refund during 2024; both are + # supplied receipts, not this year's credits, which are paid in 2025. + # The member's 10_000 + 632 + 63.20. mt_elderly_homeowner_or_renter_credit_gross_household_income: [20_000, 10_695.20] - name: A parent's federal EITC and refundable child tax credit count in gross household income @@ -240,9 +238,9 @@ person2: age: 30 employment_income: 10_000 - # Federal EITC and refundable CTC received during 2024. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 4_525 - # Montana EITC refund received during 2024. + # Supplied receipts: federal EITC and refundable CTC, and a Montana + # EITC refund, received during 2024. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 4_525 mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 340 person3: age: 5 @@ -257,9 +255,9 @@ state_name: MT output: # 2024 Schedule 2EC line 8 counts "the refundable portion of the federal - # child tax credit". Federal EITC 34% x 10_000 = 3_400; refundable CTC - # min(1_700, 15% x 7_500) = 1_125; Montana EITC 340. The parent: - # 10_000 + 3_400 + 1_125 + 340 = 14_865. + # child tax credit". The parent received 4_525 of federal EITC and + # refundable child tax credit and a 340 Montana EITC refund during 2024 + # (supplied receipts). The parent: 10_000 + 4_525 + 340 = 14_865. mt_elderly_homeowner_or_renter_credit_gross_household_income: [20_000, 14_865, 0] - name: The elderly homeowner/renter credit received during the year counts @@ -343,8 +341,8 @@ age: 40 employment_income: 10_000 mt_refundable_credits_before_renter_credit: 0 - # Federal EITC refund received during 2017. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 383.01 + # A supplied receipt: a federal EITC refund received during 2017. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 383.01 tax_units: tax_unit: members: [person1] @@ -355,9 +353,7 @@ output: # ARM 42.4.301(2)(b), effective 11/10/2017: "federal refundable credits # received"; 2017 Form 2EC worksheet item 4: "Any federal or state - # refundable credits". Rev. Proc. 2016-55, no qualifying child: - # 510 - 7.65% x (10_000 - 8_340) = 383.01. - eitc: 383.01 + # refundable credits". 10_000 + the 383.01 received. mt_elderly_homeowner_or_renter_credit_gross_household_income: 10_383.01 - name: Federal refundable credits do not count before 2017 @@ -368,8 +364,8 @@ age: 40 employment_income: 10_000 mt_refundable_credits_before_renter_credit: 0 - # Federal EITC refund received during 2016. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 383.01 + # A supplied receipt: a federal EITC refund received during 2016. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 383.01 tax_units: tax_unit: members: [person1] @@ -383,6 +379,57 @@ # tax in a prior year". mt_elderly_homeowner_or_renter_credit_gross_household_income: 10_000 +- name: Montana refundable credits received count in 2017 to 2022 + period: 2021 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 63 + taxable_pension_income: 20_000 + # Supplied receipts: no Economic Impact Payment, and a 50 Montana + # EITC refund received during 2021. + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 0 + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 50 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MT + output: + # ARM 42.4.301(2)(c), effective 11/10/2017: "any state refundable + # credits received"; 2021 instructions, line 7: "Combine all the + # refundable credits received by the members of the household in 2021", + # including "the federal and Montana Earned Income Tax Credit". + # 20_000 + 0 + 50. + mt_elderly_homeowner_or_renter_credit_gross_household_income: 20_050 + +- name: Montana refundable credits received count before 2017 + period: 2016 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + taxable_pension_income: 20_000 + # A supplied receipt: a 50 Montana refundable credit paid with a + # Montana income tax refund received during 2016. + mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 50 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: MT + output: + # The 2004-2017 ARM 42.4.301(2)(c) counted "Montana state income tax and + # elderly homeowner/renter credit refunds received", and MCA + # 15-30-2337(9)(a) (2009) counts all nontaxable income. 20_000 + 50. + mt_elderly_homeowner_or_renter_credit_gross_household_income: 20_050 + - name: A filer's short-term loss netted against their own long-term gain does not reduce gross household income period: 2024 input: @@ -533,9 +580,9 @@ person2: age: 35 employment_income: 25_000 - # Federal EITC and refundable CTC received during 2024. - mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 9_854.83 - # Montana EITC refund received during 2024. + # Supplied receipts: federal EITC and refundable CTC, and a Montana + # EITC refund, received during 2024. + mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 9_854.83 mt_elderly_homeowner_or_renter_credit_state_refundable_credits: 647.98 person3: age: 5 @@ -552,12 +599,10 @@ members: [person1, person2, person3, person4] state_name: MT output: - # Three generations. The daughter's line 8 credits: federal EITC with - # two children 6_960 - 21.06% x (25_000 - 22_720) = 6_479.83; refundable - # child tax credit min(2 x 1_700, 15% x (25_000 - 2_500)) = 3_375; - # Montana EITC 10% = 647.98. Her total: 25_000 + 6_479.83 + 3_375 + - # 647.98 = 35_502.81. The grandchild is her dependent; their 3_000 of - # wages count through the dependent path. + # Three generations. The daughter's line 8 credits are the supplied + # receipts: 9_854.83 federal and 647.98 Montana. Her total: 25_000 + + # 9_854.83 + 647.98 = 35_502.81. The grandchild is her dependent; their + # 3_000 of wages count through the dependent path. mt_elderly_homeowner_or_renter_credit_gross_household_income: [15_000, 35_502.81, 0, 3_000] - name: A prior-year capital loss carryover does not reduce the year's gain diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml index ca7e757c684..305f7ff435e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_pre_one_claimant.yaml @@ -86,6 +86,10 @@ # person2: line 23 = 900; line 27 = 900 - 259 = 641. # person3 is billed nothing either, so their line 24 is also 900, but # they are under 62 and not a claimant. + # Not modelled: § 15-30-2337(7)(b) leaves "bona fide lessees, tenants, + # or roomers and boarders on contract" out of the household. The model + # counts every member's income in line 18, so this case reads person1 as + # a member of person2's household rather than a lessee on contract. mt_elderly_homeowner_or_renter_credit_gross_rent: [900, 0, 900] mt_elderly_homeowner_or_renter_credit_pre_one_claimant: [0, 641, 0] @@ -126,6 +130,9 @@ # 0) = 0; line 22 = 0. # person1: line 24 = 2_500; line 25 = 375; line 27 = 375. # person2 is 60, so not a claimant, though the home is in their name. + # Not modelled: § 15-30-2337(7)(b), as in Case 2. Line 18 pools both + # members' income; a lessee on contract would be outside person2's + # household. mt_elderly_homeowner_or_renter_credit_pre_one_claimant: [375, 0] mt_elderly_homeowner_or_renter_credit: [375, 0] diff --git a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py index ebe84e0fcf3..f025eeb3028 100644 --- a/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py +++ b/policyengine_us/tests/test_mt_elderly_credit_refundable_credits.py @@ -1,32 +1,29 @@ -"""Property tests: federal refundable credits received in the Montana elderly +"""Worked example: federal refundable credits received in the Montana elderly homeowner/renter credit's gross household income. MCA 15-30-2337(4) defines gross household income as "all income received by all individuals of a household", ARM 42.4.301(2)(b) counts "federal refundable tax credits received", and the 2024 Schedule 2EC line 8 combines "all the refundable credits received by all household members". The credits -claimed on a return are paid after its year ends, so the model takes the -federal refundable credits each person received during the year as an input -(mt_elderly_homeowner_or_renter_credit_federal_refundable_credits), not the -current return's entitlement; its default counts only the 2020 and 2021 -Economic Impact Payments, which are zero in 2024. These tests check that -input for households of -a claimant aged 62 or older and a younger member who files their own return -with up to two children, so that the member's return has a federal EITC and -a refundable child tax credit. - -YAML cases cannot compare two simulations or draw household structures, so -this file does both. Each example runs the households twice: with the -federal refundable credits each person received (W) and with none received -(Z). Properties, for every household: - -1. An entitlement is not a receipt: in Z the input is zero for everyone, - whatever the federal refundable credits on this year's returns. +claimed on a return are paid after its year ends, so the model counts the +federal refundable credits each person received during the year +(mt_elderly_homeowner_or_renter_credit_federal_refundable_credits): the 2020 +and 2021 Economic Impact Payments by default, which are zero in 2024, plus +other receipts supplied through +mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits, not +the current return's entitlement. + +YAML cases cannot compare two simulations, so this file does. It runs one +household, a claimant aged 70 and a daughter who files her own return with +one child, twice: with the federal refundable credits each person received +(W) and with none received (Z). It checks, against the 2024 Schedule 2EC: + +1. An entitlement is not a receipt: in Z the receipt is zero, though the + daughter's return has 4,525 of federal refundable credits. 2. Accounting: gross household income in W exceeds Z by exactly the credits - received, each counted once. + received, counted once. 3. More income never raises the credit: the credit in W is at most Z's. -4. The credit is between zero and the cap, and zero when gross household - income is $45,000 or more. +4. The credit is between zero and the cap. 5. Montana tax changes only through the credit: Montana refundable credits other than this one are the same in W and Z, and the household's Montana income tax rises by exactly the fall in its credit. @@ -42,9 +39,9 @@ YEAR = 2024 CAP = 1_150 -INCOME_LIMIT = 45_000 TOLERANCE = 0.01 FEDERAL = "mt_elderly_homeowner_or_renter_credit_federal_refundable_credits" +OTHER = "mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits" GROSS = "mt_elderly_homeowner_or_renter_credit_gross_household_income" CREDIT = "mt_elderly_homeowner_or_renter_credit" @@ -63,12 +60,12 @@ def build_situation(cases, received): "taxable_pension_income": {YEAR: c["pension"]}, "real_estate_taxes": {YEAR: c["property_tax"]}, "rent": {YEAR: c["rent"]}, - FEDERAL: {YEAR: c["claimant_received"] if received else 0}, + OTHER: {YEAR: c["claimant_received"] if received else 0}, } people[member] = { "age": {YEAR: c["member_age"]}, "employment_income": {YEAR: c["wages"]}, - FEDERAL: {YEAR: c["member_received"] if received else 0}, + OTHER: {YEAR: c["member_received"] if received else 0}, } for child, age in zip(children, c["child_ages"]): people[child] = {"age": {YEAR: age}} @@ -119,7 +116,8 @@ def assert_properties(cases): for i, c in enumerate(cases): tol = tolerance(w["gross"][i]) received = c["claimant_received"] + c["member_received"] - # 1. This year's federal refundable credits are not a receipt. + # 1. This year's federal refundable credits are not a receipt, and + # no Economic Impact Payment was made in 2024. assert z["federal_person"][i] == 0, c assert w["federal_person"][i] == pytest.approx(received, abs=tol), c # 2. The credits received are the whole difference in gross @@ -128,10 +126,8 @@ def assert_properties(cases): # 3. More income never raises the credit. assert w["credit"][i] <= z["credit"][i] + tol, c for result in (w, z): - # 4. Bounds and the income limit. + # 4. Bounds. assert -tol <= result["credit"][i] <= CAP + tol, c - if result["gross"][i] >= INCOME_LIMIT + tol: - assert result["credit"][i] == 0, c # 5. Montana tax moves only through this credit. assert w["mt_other_credits"][i] == pytest.approx( z["mt_other_credits"][i], abs=TOLERANCE @@ -146,8 +142,9 @@ def test_worked_example(): daughter's wages 10,000 (line 17). Her 2024 return has a federal EITC of 34% x 10,000 = 3,400, a refundable child tax credit of min(1,700, 15% x 7,500) = 1,125 and a Montana EITC of 340, all paid in 2025, so none is - received in 2024. Line 8 counts the 4,525 of federal credits she - received during 2024. Line 18 = 34,525; line 22 = (34,525 - 12,600) x + received in 2024. Line 8 counts the federal credits she received during + 2024, a supplied receipt of 4,525. Line 18 = 34,525; line 22 = + (34,525 - 12,600) x 0.05 = 1,096.25; line 27 = 2,000 - 1,096.25 = 903.75; line 30 = 903.75. With nothing received, line 18 = 30,000, line 22 = 870 and line 30 = 1,130.""" @@ -171,40 +168,3 @@ def test_worked_example(): assert z["gross"][0] == pytest.approx(30_000, abs=TOLERANCE) assert z["credit"][0] == pytest.approx(1_130, abs=TOLERANCE) assert_properties([case]) - - -try: - import hypothesis - import hypothesis.strategies as st -except ImportError: # pragma: no cover - hypothesis = None - -if hypothesis is not None: - # Each example builds two Simulations; on a loaded runner input - # generation can trip the too_slow health check, which says nothing about - # the model. - SLOW = [hypothesis.HealthCheck.too_slow] - - def amount(high): - return st.one_of(st.just(0), st.integers(min_value=1, max_value=high)) - - @st.composite - def case(draw): - return { - "claimant_age": draw(st.integers(min_value=62, max_value=90)), - "pension": draw(amount(40_000)), - "property_tax": draw(st.integers(min_value=0, max_value=4_000)), - "rent": draw(amount(12_000)), - "claimant_received": draw(amount(2_000)), - "member_age": draw(st.integers(min_value=19, max_value=61)), - "wages": draw(amount(30_000)), - "child_ages": draw( - st.lists(st.integers(min_value=0, max_value=16), max_size=2) - ), - "member_received": draw(amount(10_000)), - } - - @hypothesis.settings(max_examples=10, deadline=None, suppress_health_check=SLOW) - @hypothesis.given(st.lists(case(), min_size=1, max_size=6)) - def test_properties(cases): - assert_properties(cases) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py index e5ef0041fa8..f115e131918 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py @@ -7,13 +7,18 @@ class mt_elderly_homeowner_or_renter_credit_federal_refundable_credits(Variable) label = "Federal refundable credits received, in Montana elderly homeowner/renter credit gross household income" documentation = ( "Federal refundable tax credit cash this person received during the " - "year, such as an earned income or child tax credit refund from the " - "prior year's return or an Economic Impact Payment. Defaults to the " - "return's recovery rebate credits (the 2020 and 2021 Economic Impact " - "Payments, advanced during the same year), on the tax unit head, and " - "to zero in other years: the other credits claimed on this year's " - "return are paid after the year ends, so they do not establish a " - "receipt. A supplied amount replaces the default." + "year: the return's recovery rebate credits (the 2020 and 2021 " + "Economic Impact Payments, advanced during the same year) on the tax " + "unit head, plus " + "mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits, " + "the other federal refundable credits received, such as an earned " + "income or child tax credit refund from the prior year's return. The " + "other credits claimed on this year's return are paid after the year " + "ends, so they do not establish a receipt. Record other receipts in " + "that input. An input to this variable replaces the computed amount " + "for everyone and sets anyone not given a value to 0, so supply it " + "for every household member, for example to record that a return " + "received no payment." ) unit = USD definition_period = YEAR @@ -24,6 +29,10 @@ class mt_elderly_homeowner_or_renter_credit_federal_refundable_credits(Variable) "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0370/0150-0300-0230-0370.html", # ARM 42.4.301(2)(b): "federal refundable tax credits received" "https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/768c8344-24ee-4950-9d5e-9d8fc97ec0f7", + # 2021 instructions, line 7: "Combine all the refundable credits + # received by the members of the household in 2021", including "the + # federal Child Tax Credits, Economic Impact Payments" + "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2021_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=49", # 2023 instructions, line 7: "Combine all the refundable credits # received by the members of the household in 2023", including "the # federal and Montana Earned Income Tax Credit, the federal Child Tax @@ -50,8 +59,24 @@ class mt_elderly_homeowner_or_renter_credit_federal_refundable_credits(Variable) # credit stands in for the advance payment; any amount reconciled on the # return is paid the next year and is not separated here. The credit # parameters are zero outside 2020 and 2021, so so is this default. + # + # Not counted by default: the 2021 advance child tax credit. IRC 7527A + # advanced half of the estimated 2021 child tax credit in monthly + # payments from July to December 2021, and the 2021 instructions list + # "the federal Child Tax Credits" among the credits received. The model + # does not compute the advance payments, so a household that received + # them records them in + # mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits. + # + # Other receipts come from that separate input, so supplying one + # person's leaves every other return's default payments in place. def formula(person, period, parameters): # Gross household income sums this person-level amount over the # household, so count each return's payments once, on its head. head = person("is_tax_unit_head", period) - return head * person.tax_unit("recovery_rebate_credit", period) + payments = head * person.tax_unit("recovery_rebate_credit", period) + other = person( + "mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits", + period, + ) + return payments + other diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits.py new file mode 100644 index 00000000000..3d2ada2787c --- /dev/null +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits(Variable): + value_type = float + entity = Person + label = "Federal refundable credits received other than Economic Impact Payments, in Montana elderly homeowner/renter credit gross household income" + documentation = ( + "Federal refundable tax credit cash this person received during the " + "year other than the Economic Impact Payments that " + "mt_elderly_homeowner_or_renter_credit_federal_refundable_credits " + "counts by default, such as an earned income or child tax credit " + "refund from the prior year's return. Defaults to zero: the credits " + "claimed on this year's return are paid after the year ends, so they " + "do not establish a receipt. Supplying it for one person leaves " + "everyone else's receipts, including each return's default payments, " + "in place." + ) + unit = USD + definition_period = YEAR + defined_for = StateCode.MT + reference = ( + # MCA 15-30-2337(4): gross household income is "all income received + # by all individuals of a household" + "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0370/0150-0300-0230-0370.html", + # ARM 42.4.301(2)(b): "federal refundable tax credits received" + "https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/768c8344-24ee-4950-9d5e-9d8fc97ec0f7", + # 2024 Schedule 2EC, line 8: "Combine all the refundable credits + # received by all household members in 2024", including "the federal + # and Montana earned income tax credits, the refundable portion of the + # federal child tax credit" + "https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2024_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=47", + ) diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py index 0c281935821..675bedc84cf 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_state_refundable_credits.py @@ -26,6 +26,9 @@ class mt_elderly_homeowner_or_renter_credit_state_refundable_credits(Variable): "https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0370/0150-0300-0230-0370.html", # ARM 42.4.301(2)(c): "any state refundable tax credits received" "https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/768c8344-24ee-4950-9d5e-9d8fc97ec0f7", + # ARM 42.4.301(2)(c) before 11/10/2017: "Montana state income tax and + # elderly homeowner/renter credit refunds received" + "https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/c90ea93a-03a2-4605-a0f8-f2f3760198bf/document/788508cc-8418-41c8-926d-3dfb11af3fd6", # 2024 Schedule 2EC, line 8: "Combine all the refundable credits # received by all household members in 2024", including "the federal # and Montana earned income tax credits" diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_eligible_person.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_eligible_person.py index 4dd28b58c37..b3900c215c4 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_eligible_person.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_eligible_person.py @@ -27,9 +27,7 @@ def formula(person, period, parameters): is_retired_on_disability = person("retired_on_total_disability", period) eligible_retiree = age_eligible & is_retired_on_disability head_or_spouse = person("is_tax_unit_head_or_spouse", period) - return eligible_retiree & head_or_spouse - - def formula_2024(person, period, parameters): - # The exclusion is repealed for tax years beginning after December 31, - # 2023 (2021 Mont. Laws ch. 503, sections 65 and 70(1)). - return False + # in_effect is false from 2024: the exclusion is repealed for tax + # years beginning after December 31, 2023 (2021 Mont. Laws ch. 503, + # sections 65 and 70(1)). + return p.in_effect & eligible_retiree & head_or_spouse diff --git a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_person.py b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_person.py index c35d3c97470..bdf34d4e13b 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_person.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/subtractions/disability/mt_disability_income_exclusion_person.py @@ -5,11 +5,24 @@ class mt_disability_income_exclusion_person(Variable): value_type = float entity = Person label = "Montana disability income exclusion for each person" + documentation = ( + "Taxable disability benefits of a person eligible for the exclusion, up " + "to the annual cap. Former MCA 15-30-2110(10) allowed up to $100 a " + "week of benefits and reduced the exclusion by adjusted gross income " + "above $15,000 (a married couple's combined income). The model " + "applies the annual cap, 52 weeks at $100, without counting weeks of " + "benefits, and does not apply the $15,000 reduction. Repealed from " + "2024." + ) defined_for = "mt_disability_income_exclusion_eligible_person" unit = USD definition_period = YEAR reference = ( "https://revenuefiles.mt.gov/files/Forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2022_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=31", + # Former MCA 15-30-2110(10) (2021 edition): "up to $100 a week"; "If + # the adjusted gross income before this exclusion exceeds $15,000, + # the excess reduces the exclusion by an equal amount." + "https://mca.legmt.gov/bills/2022/mca/title_0150/chapter_0300/part_0210/section_0100/0150-0300-0210-0100.html", # 2021 Mont. Laws ch. 503 (SB 399): section 65 repeals 15-30-2110, # MCA, which held the exclusion; section 70(1) applies the repeal to # tax years beginning after December 31, 2023. @@ -19,9 +32,10 @@ class mt_disability_income_exclusion_person(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.mt.tax.income.subtractions.disability_income - return min_(p.cap, person("taxable_disability_benefits", period)) - - def formula_2024(person, period, parameters): + # Not modelled: the weekly limit for fewer than 52 weeks of benefits + # and the reduction above $15,000 of adjusted gross income (former + # MCA 15-30-2110(10); tracked in rulespec-us#1741). + exclusion = min_(p.cap, person("taxable_disability_benefits", period)) # Repealed from 2024 (2021 Mont. Laws ch. 503, sections 65 and 70(1)), # even for a person whose eligibility is supplied as an input. - return 0 + return p.in_effect * exclusion diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index fc14eddd33c..f922f27b04c 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -5287,8 +5287,8 @@ candidates: citation: MCA 15-30-2338(1)(c) url: https://mca.legmt.gov/bills/mca/title_0150/chapter_0300/part_0230/section_0380/0150-0300-0230-0380.html - kind: regulation - citation: ARM 42.4.302(2)(b) - url: https://www.law.cornell.edu/regulations/montana/Mont-Admin-r-42.4.302 + citation: ARM 42.4.302(2)(b), expression effective 9/7/2024 + url: https://rules.mt.gov/api/policy-library-public/collections/aec52c46-128e-4279-9068-8af5d5432d74/policies/5eedb34b-939b-4c09-ad35-59502b699bf6/document/e7a48415-15da-4847-8132-2b196c217e14 - kind: instructions citation: 2025 Form 2 instructions, Schedule 2EC line 23, PDF page 47 url: https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=47 @@ -5316,8 +5316,9 @@ candidates: a rent-free lessee is recorded through mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months.py. The household''s bill still counts as rent for an eligible claimant whose tax unit is billed nothing, which ARM 42.4.302(2)(b) allows "an eligible claimant" (mt_elderly_homeowner_or_renter_credit_gross_rent.py), so - the regulation is read as measuring rent, not as conferring eligibility. Move to the register once its sources - are captured.' + the regulation is read as measuring rent, not as conferring eligibility. ARM 42.4.302 and the 2025 instructions + page are captured under source_conflicts/sources/us-mt/; MCA 15-30-2338 is in the Axiom corpus. Move to the + register after #10331 merges.' - id: us-mt:elderly-credit-federal-refundable-credits-before-2017 program: elderly-homeowner-renter-credit years: @@ -5354,6 +5355,8 @@ candidates: (mt_elderly_homeowner_or_renter_credit_federal_refundable_credits.py) enter the source list only from 2017 (elderly_homeowner_or_renter/gross_income_sources.yaml). Whether the pre-2017 regulation narrows the statute's "all nontaxable income", and how far a Montana rule binds against its statute, is open for the project lead. + The 2009 statute, the three ARM 42.4.301 expressions in force from 8/20/2004 to 11/9/2017 (whose (2) text is + the same) and the 2016 booklet pages are captured under source_conflicts/sources/us-mt/. - id: us-mt:liheap-business-equity-limit program: liheap years: diff --git a/source_conflicts/sources/us-mt/arm-42-4-301-2004.html b/source_conflicts/sources/us-mt/arm-42-4-301-2004.html new file mode 100644 index 00000000000..006d6378dec --- /dev/null +++ b/source_conflicts/sources/us-mt/arm-42-4-301-2004.html @@ -0,0 +1,108 @@ + + + + + + + + +
+
+

42.4.301 DEFINITIONS

+

 

+

  The following definitions apply to this sub-chapter:

+

(1) "Amenities" are items that enhance the pleasantness or desirability of rental or retirement homes, or contribute to the pleasure and enjoyment of the occupant(s) , rather than to their indispensable needs.

+

(2) "Gross household income" as defined under 15-30-171 , MCA, is further defined as:

+

(a) all capital gains income transactions less return of capital;

+

(b) federal refunds received during the tax year to the extent that the amount recovered reduced the claimant's Montana income tax in a prior year; and

+

(c) Montana state income tax and elderly homeowner/renter credit refunds received.

+

(3) "Land surrounding the eligible residence for the elderly homeowner/renter credit" is the one-acre farmstead or primary acre associated with the primary residence.

+

(a) If the one-acre farmstead or primary acre is not separately identified on the tax bill or assessment notice from the other acreage and the ownership is less than 20 acres, the allowable credit shall be calculated as follows: total amount of property tax billed on the land, divided by the total acreage, to equal the allowable amount of property tax used in the credit calculation.

+

(b) Land ownership of 20 acres or more that does not have the one-acre farmstead or primary acre separately identified on the tax bill or assessment notice must be submitted to the department's local office for computation of the allowable amount of property tax used in the credit calculation.

+

(4) "Rent" is the amount of money charged to a tenant to occupy a dwelling. "Rent" does not include amenities such as meals, housekeeping, nursing care, etc.

+

 

+

Authorizing statute(s): Sec. 15-30-305, MCA

+

Implementing statute(s): Sec. 15-30-171, 15-30-172, 15-30-173, 15-30-176, 15-30-177, and 15-30-178, MCA

+
+
+
+
+
+
+

History: NEW, 2004 MAR p. 1965, Eff. 8/20/04.

+
+
+ + \ No newline at end of file diff --git a/source_conflicts/sources/us-mt/arm-42-4-301-2010.html b/source_conflicts/sources/us-mt/arm-42-4-301-2010.html new file mode 100644 index 00000000000..89013691f79 --- /dev/null +++ b/source_conflicts/sources/us-mt/arm-42-4-301-2010.html @@ -0,0 +1,108 @@ + + + + + + + + +
+
+

42.4.301 DEFINITIONS

+

 

+

The following definitions apply to this subchapter:

+

(1) "Amenities" are items that enhance the pleasantness or desirability of rental or retirement homes, or contribute to the pleasure and enjoyment of the occupant(s), rather than to their indispensable needs.

+

(2) "Gross household income" as defined under 15-30-2337, MCA, is further defined as:

+

(a) all capital gains income transactions less return of capital;

+

(b) federal refunds received during the tax year to the extent that the amount recovered reduced the claimant's Montana income tax in a prior year; and

+

(c) Montana state income tax and elderly homeowner/renter credit refunds received.

+

(3) "Land surrounding the eligible residence for the elderly homeowner/renter credit" is the one-acre farmstead or primary acre associated with the primary residence.

+

(a) If the one-acre farmstead or primary acre is not separately identified on the tax bill or assessment notice from the other acreage and the ownership is less than 20 acres, the allowable credit shall be calculated as follows: total amount of property tax billed on the land, divided by the total acreage, to equal the allowable amount of property tax used in the credit calculation.

+

(b) Land ownership of 20 acres or more that does not have the one-acre farmstead or primary acre separately identified on the tax bill or assessment notice must be submitted to the department's local office for computation of the allowable amount of property tax used in the credit calculation.

+

(4) "Rent" is the amount of money charged to a tenant to occupy a dwelling. "Rent" does not include amenities such as meals, housekeeping, nursing care, etc.

+

 

+

Authorizing statute(s): 15-30-2620, MCA

+

Implementing statute(s): 15-30-2337, 15-30-2338, 15-30-2340, MCA

+
+
+
+
+
+
+

History: NEW, 2004 MAR p. 1965, Eff. 8/20/04; AMD, 2010 MAR p. 1211, Eff. 5/14/10.

+
+
+ + \ No newline at end of file diff --git a/source_conflicts/sources/us-mt/arm-42-4-301-2013.html b/source_conflicts/sources/us-mt/arm-42-4-301-2013.html new file mode 100644 index 00000000000..8ae290df10f --- /dev/null +++ b/source_conflicts/sources/us-mt/arm-42-4-301-2013.html @@ -0,0 +1,108 @@ + + + + + + + + +
+
+

42.4.301 DEFINITIONS

+

 

+

The following definitions apply to this subchapter:

+

(1) "Amenities" are items that enhance the pleasantness or desirability of rental or retirement homes, or contribute to the pleasure and enjoyment of the occupant(s), rather than to their indispensable needs.

+

(2) "Gross household income" as defined under 15-30-2337, MCA, is further defined as:

+

(a) all capital gains income transactions less return of capital;

+

(b) federal refunds received during the tax year to the extent that the amount recovered reduced the claimant's Montana income tax in a prior year; and

+

(c) Montana state income tax and elderly homeowner/renter credit refunds received.

+

(3) "Land surrounding the eligible residence for the elderly homeowner/renter credit" is the one-acre farmstead or primary acre associated with the primary residence.

+

(a) If the one-acre farmstead or primary acre is not separately identified on the tax bill or assessment notice from the other acreage and the ownership is less than 20 acres, the allowable credit shall be calculated as follows: total amount of property tax billed, multiplied by 80 percent or divided by the total acreage, whichever is higher, to equal the allowable amount of property tax used in the credit calculation.

+

(b) Land ownership of 20 acres or more that does not have the one-acre farmstead or primary acre separately identified on the tax bill or assessment notice must be submitted to the department's local office for computation of the allowable amount of property tax used in the credit calculation.

+

(4) "Rent" is the amount of money charged to a tenant to occupy a dwelling. "Rent" does not include amenities such as meals, housekeeping, nursing care, etc.

+

 

+

Authorizing statute(s): 15-30-2620, MCA

+

Implementing statute(s): 15-30-2337, 15-30-2338, 15-30-2340, MCA

+
+
+
+
+
+
+

History: NEW, 2004 MAR p. 1965, Eff. 8/20/04; AMD, 2010 MAR p. 1211, Eff. 5/14/10; AMD, 2013 MAR p. 1450, Eff. 8/9/13.

+
+
+ + \ No newline at end of file diff --git a/source_conflicts/sources/us-mt/arm-42-4-302-2024.html b/source_conflicts/sources/us-mt/arm-42-4-302-2024.html new file mode 100644 index 00000000000..1060c776bb2 --- /dev/null +++ b/source_conflicts/sources/us-mt/arm-42-4-302-2024.html @@ -0,0 +1,116 @@ + + + + + + + + +
+
+

42.4.302 COMPUTATION OF ELDERLY HOMEOWNER/RENTER TAX CREDIT

+

 

+

(1) When a claimant owns the dwelling but rents the land or owns the land and rents the dwelling, the claimant shall include on the claim form the rent-equivalent tax paid on the rented property to the property tax billed on the owned property. The total shall then be reduced as provided by 15-30-2340, MCA. The credit will be the reduced amount or $1,150, whichever is less.

+

(2) To calculate the credit, an eligible claimant may use property taxes billed:

+

(a) on property held in a revocable trust if the grantor(s) of the property or their spouse is the claimant and either or both are trustees of the revocable trust; or

+

(b) as rent if the property occupied by the claimant is in a name other than the claimant.

+

(3) When a claimant lives in a health, long-term, or residential care facility (facility), as defined in 50-5-101, MCA, the rent allowed in calculation of the credit is the actual out-of-pocket amount paid for rent.

+

(a) If one spouse lives in a facility and the other lives at a different address, they may report either the rent paid for the facility or the rent/property taxes billed for the other address, but not both. Married couples who are living apart are entitled to file and receive only one credit per year.

+

(b) If a claimant lives in a facility, the out-of-pocket rent being claimed must exclude payments for amenities. To satisfy this obligation, the claimant must either:

+

(i) utilize a detailed statement provided by the facility itemizing the amount paid for rent and for amenities; or

+

(ii) determine the amount of allowable rent by deducting amenities from the total amount paid as follows:

+

(A) 20 percent for services related to boarding such as meals, housekeeping, laundry, and transportation;

+

(B) 30 percent for services related to continuous care such as assisted living, medical care, paramedical care, memory care, medical supplies, and pharmacy; or

+

(C) 50 percent if the services in both (A) and (B) are provided.

+

(c) Examples of calculating the allowable rent in (b) are as follows:

+

(i) Val rents a room in an independent living facility. Her $1,000 monthly payment includes utilities and parking, but no services delivered by personnel. No further calculation is needed. Val is allowed to report the full $1,000 per month as rent.

+

(ii) Paul rents a room in an independent living facility. In addition to utilities and cable, his $2,500 monthly payment includes boarding such as housekeeping, meals, and transportation provided by staff and contractors. The facility's year-end statement does not itemize his total amount paid. Paul deducts 20 percent ($2,500 - 20%) for the boarding services and may report $2,000 per month as rent.

+

(iii) Ron lives in a long-term care facility and receives boarding services, assistance with daily living activities, and special memory care. The facility's year-end statement partially itemizes Ron's $40,000 total payment, showing the amount charged by the contractor for his memory care. The statement does not list the amounts charged for boarding and care provided by staff. Ron deducts 50 percent ($40,000 - 50%) for boarding (20%) and care (30%) and may report $20,000 as annual rent.

+

(iv) George rents an apartment in an assisted living facility. The facility's year-end statement itemizes his $30,000 total payment as $14,400 for rent, $5,000 for boarding, and $10,600 for care. George may report the $14,400 rent or, alternately, choose to deduct 50 percent from the total ($30,000 - 50%) for boarding (20%) and care (30%) and may report $15,000 as annual rent.

+

(v) Mary rents a room in an assisted living facility for six months while recovering from a medical procedure. Her $2,000 total monthly payment includes assistance with daily living activities provided by staff, but she chose not to receive any additional services such as boarding. The facility does not itemize her payment. Mary deducts 30 percent from the monthly payment ($2,000 - 30%) for the care and may report $1,400 per month as rent. Further, Mary may report either the allowable rent paid to the facility, or the monthly rent she paid for her primary residence during the same six-month period, but not both.

+

 

+

Authorizing statute(s): 15-30-2620, MCA

+

Implementing statute(s): 15-30-2340, 15-30-2341, 50-5-101, MCA

+
+
+
+
+
+
+

History: NEW, 1982 MAR p. 608, Eff. 3/26/82; AMD, 1983 MAR p. 1265, Eff. 9/16/83; AMD, 1993 MAR p. 571, Eff. 4/16/93; AMD, 1995 MAR p. 2851, Eff. 12/22/95; AMD, 1996 MAR p. 3148, Eff. 12/6/96; AMD, 1998 MAR p. 183, Eff. 1/16/98; AMD and TRANS, from ARM 42.15.506, 2004 MAR p. 1965, Eff. 8/20/04; AMD, 2010 MAR p. 1211, Eff. 5/14/10; AMD, 2014 MAR p. 2475, Eff. 10/10/14; AMD, 2017 MAR p. 2092, Eff. 11/10/17; AMD, 2024 MAR p. 2162, Eff. 9/7/24.

+
+
+ + \ No newline at end of file diff --git a/source_conflicts/sources/us-mt/form-2-booklet-2016-p74-75.txt b/source_conflicts/sources/us-mt/form-2-booklet-2016-p74-75.txt new file mode 100644 index 00000000000..78d690732e4 --- /dev/null +++ b/source_conflicts/sources/us-mt/form-2-booklet-2016-p74-75.txt @@ -0,0 +1,167 @@ +Source: https://taxsim.nber.org/historical_state_tax_forms/MT/2016/Form_2_booklet_2016.pdf#page=74 +2016 Montana Form 2 booklet, Form 2EC instructions and Gross Household Income Worksheet. Pages 74-75, text extracted with pdftotext 4.00 (Xpdf), reading order. + +Page 2EC-1 + +Instructions for filing Montana Form 2EC + +Instructions for Elderly Homeowner/Renter Credit Form 2EC + +The Montana Elderly Homeowner/Renter Credit program is a property tax relief program that provides for refundable tax credit of up to $1,000. To claim this credit, you must live in a household where the total revenue of all household members is less than $45,000 for that year, be 62 or older, have lived in Montana for more than nine months during the tax year, and occupied a Montana residence as a renter, owner or lessee for a total of six months or more during the year. +The total amount of income from all household members used to determine your eligibility is called “gross household income.” Gross household income does not always equal the taxable income that individuals report on their Montana income tax return. It may also include income that is normally not taxable. Part II of these instructions provides a list of the income that must be included in gross household income. +You can claim this credit directly on this return if you are not required to file a Montana individual income tax return (Form 2). If you are required to file Form 2, you only need to enter your social security number(s) on the heading of this form and attach it to Form 2. +If either spouse died during the claim year, enter the date of death in the appropriate box. If filing an individual tax return is not required and this claim is for either a deceased individual or a married couple who are both deceased, please include federal Form 1310. +Part I – Qualifications +You need to answer “Yes” to all four statements before you apply for the elderly homeowner/renter credit. Any “No” answer means you are not eligible for the credit. +Even though you may be eligible for the credit after completing Parts II and III of this form, it may be that you are not entitled to receive any credit. Note that only one claim is allowed per household and that married taxpayers who are living apart may qualify for only one credit per year. +Age 62 Test +If you were 62 or older as of December 31, 2016, you can answer “Yes” to this statement. If you are married and both spouses own or rent your residence, only one of you has to meet the age requirement. +Six-Month Test +You can answer “Yes” to this question as long as you have occupied one or more residences as an owner and/or renter for six months or more during the year. +Nine-Month Test +You must have lived in Montana for nine months or more during the year to answer “Yes” to this statement. If you are the personal representative of the estate of an eligible individual who died during the year, you cannot claim this credit if that individual died before October 1, 2016. If you are married filing this claim with your spouse and if your + +spouse, who would have been the only eligible individual, dies before October 1, 2016, you are not eligible for this credit. You are eligible only if, as a surviving spouse, you are age 62 or older and you can continue to answer “Yes” to the other statements. +Gross Household Income +If your gross household income was less than $45,000, you can answer “Yes” to this question. Your gross household income includes all income received by all individuals in the household. Use the worksheet on page 2 to calculate your Gross Household Income. +Part II – Gross Household Income +Enter your gross household income on line 1. Your gross household income is all the income received, taxable and nontaxable, by all individuals who live in your household. This includes, but is not limited to, the income of adult children and unrelated individuals living in your household. In addition to federal adjusted gross income, the following are examples of items that are included in gross household income: +●● Inheritances +●● Pension and annuity income (this includes railroad retirement) +●● Disability benefits including, but not limited to, veteran’s disability, SSI payments and workers’ compensation +●● Any capital gains that you excluded from your Montana adjusted gross income, such as the gain from the sale of your primary residence +●● Alimony and support payments +●● Nontaxable strike benefits +●● Cash public assistance and relief - Do not include LIEAP (Low Income Energy Assistance Program) or SNAP (Supplemental Nutrition Assistance Program, formerly known as the Food Stamp Program) +●● Interest on federal, state, county and municipal bonds +●● All social security payments except those paid directly to a nursing home +●● Federal income tax refunds taxable in Montana +●● Federally taxable state tax refunds +●● Elderly homeowner/renter credit allowed +You may have a basis (the amount you invested) in some items above. If applicable, you may reduce the amount received as an item of income by your basis in that item. For example, if you paid $50,000 for the ownership of a primary residence, $50,000 is your basis. If you sell that residence for $80,000, your gross household income only includes the gain of $30,000 ($80,000 sales price minus $50,000 basis). +If you received pension or annuity income or a distribution from a traditional IRA, include the federally taxable amount as shown on your form 1099. +Do not reduce your gross household income by any losses that you included in your federal adjusted gross income. + + +Instructions for filing Montana Form 2EC + +The following Gross Household Income Worksheet can be used to help you calculate your gross household income. + +Gross Household Income Worksheet + +Income Source (taxable and nontaxable) + +Amount + +1. Wages, salaries, bonuses, tips, etc. + +2. Business, partnership, rent, royalties (do not include losses) + +3. Dividends, interest (including interest from federal, state, county and municipal bonds) and capital gains (do not include capital losses) + +4. Federally taxable state refunds + +5. Federal tax refund taxable in Montana + +6. Prior year 2EC refunds + +7. Alimony, cash public assistance, unemployment + +8. Pension, annuities, IRA distributions, benefits from railroad retirement, public employee’s retirement, veteran’s disability and social security (Do not include social security income paid directly to a nursing home) + +9. Income from any source or other household members not included above + +10. Add lines 1 through 9; enter the total here and on Form 2EC, line 1. This is your gross household income. + +Line 4 – Household Income Reduction Table + +If your household income on line 3 is: + +At least + +But not more than Your multiplier is + +$0 + +$1,999 + +0.000 + +$2,000 + +$2,999 + +0.006 + +$3,000 + +$3,999 + +0.016 + +$4,000 + +$4,999 + +0.024 + +$5,000 + +$5,999 + +0.028 + +$6,000 + +$6,999 + +0.032 + +$7,000 + +$7,999 + +0.035 + +$8,000 + +$8,999 + +0.039 + +$9,000 + +$9,999 + +0.042 + +$10,000 + +$10,999 + +0.045 + +$11,000 + +$11,999 + +0.048 + +$12,000 and greater + +0.050 + +Page 2EC-2 +Part III – Credit Computation +Enter the physical address of the residence you are basing your claim on if it is different than the mailing address shown on this form or your Form 2. If you had multiple residences during the year, enter the address of the one you occupied the longest. You need to include a copy of your 2016 property tax bill and/or your signed rent receipts when you file Form 2EC. If you are unable to get signed rent receipts, a statement detailing the rent paid during the year signed by your landlord is an acceptable substitute. If you are filing electronically, you do not need to send us your property tax bill or rent receipts. When you file electronically, you represent that you have completed Form 2EC, retained the required documents in your tax records and will provide those documents to us upon request. +Line 6 – Property Tax Billed +Report the amount of taxes, special assessment and fees that were billed on the property tax statement. Do not report the amount of property tax you actually paid. +You are allowed only the property tax billed on your primary residence and up to one acre of land that is associated with this residence. If the one-acre farmstead or primary acre is not separately identified on your tax bill and if your ownership is less than 20 acres, your property tax to be used in the credit calculation is the larger of: total amount of property tax billed multiplied by 80%, or total amount of property tax billed divided by the total acreage. +If your property tax bill is on property that you held in a revocable trust and if you are the grantor(s) and trustee(s) of that property, you can qualify for this credit. If your property taxes are billed to your living trust or life estate, you can qualify for this credit. If the property occupied by you is in a name other than your own, the property taxes billed for that property can qualify as rent only. +Line 7 – Rent Equivalent Paid +Your rent is only the amount of money that you paid to occupy your home. If you live in a health care, long-term care, personal care or residential care facility, the rent allowed is the actual out-of-pocket rent that you paid. If the facility does not provide you with an adequate breakdown between your rent and amenities, your rent is limited to $30 a day and it cannot exceed $10,950 a year. +Note: Do not include rent you pay for an apartment or a +facility that is exempt from property tax because the credit is not allowed in these situations. Verify with your landlord or facility that the property is subject to property taxes beyond assessments such as sewer and garbage fees. You may also contact us for assistance in determining if the property is exempt from property tax. Items that also should not be included as rent equivalent paid on line 7 are as follows (this list is not all inclusive): +●● Mortgage payments +●● Amenities such as meals, housekeeping or nursing care +●● Nursing home costs that are paid directly from social security to the facility diff --git a/source_conflicts/sources/us-mt/form-2-instructions-2025-p47.txt b/source_conflicts/sources/us-mt/form-2-instructions-2025-p47.txt new file mode 100644 index 00000000000..65a6e92f03b --- /dev/null +++ b/source_conflicts/sources/us-mt/form-2-instructions-2025-p47.txt @@ -0,0 +1,79 @@ +Source: https://revenue.mt.gov/files/forms/Montana-Individual-Income-Tax-Return-Form-2-Instructions/2025_Montana_Individual_Income_Tax_Return_Form_2_Instructions.pdf#page=47 +2025 Montana Form 2 instructions, Schedule 2EC. Page 47, text extracted with pdftotext 4.00 (Xpdf), reading order. + +If your property tax bill is on property that you held in a revocable trust and if you are the grantor(s) of that property, or your property taxes are billed to your living trust or life estate, you can qualify for this credit. +If the property occupied by you is in a name other than your own, the property taxes billed for that property can qualify as rent only. +Line 24 – Rent equivalent paid. Your rent is only the amount of money that you paid to occupy your home. +Do not use rent you pay for an apartment or a facility that is exempt from property tax because the credit is not allowed in these situations. Verify with your landlord or facility that the property is subject to property taxes beyond assessments such as sewer and garbage fees. You may also contact us for assistance in determining if the property is exempt from property tax. Items that also should not be included as rent equivalent paid on line 24 are as follows (this list is not all-inclusive): +● Mortgage payments, including mortgage interest +● Nursing home costs that are paid directly from Social Security to the facility +● Rent paid for you by a rental assistance program (this amount should also not be included in your gross household income) +If you live in a healthcare, long-term care, personal care, or residential care facility, the rent allowed is the actual out-of-pocket rent that you paid. It does not include services provided by staff, such as board expenses including meals, housekeeping, transportation, and medical or paramedical expenses such as nursing care, assisted living care, and memory care. The out-of-pocket rent can be determined using a facility statement providing the breakdown between rent and these amenities. If you do not receive a statement from your facility, use Worksheet D, Long-Term Care Facility Rent Calculation Worksheet to determine the amount of what would be considered board for purposes of calculating the credit. + +Worksheet C – Long-Term Care + +Facility Rent Calculation + +1 Total payment to the facility 1 + +2 If you received board services + +(meals, housekeeping, + +laundry, transportation), + +multiply line 1 by 20% (0.20) 2 + +3 If you received care (nursing + +care, assisted living care, + +memory care), multiply line 1 + +by 30% (0.30) + +3 + +4 Subtract lines 2 and 3 from + +line 1. Enter here and on + +Schedule 2EC, line 24. + +This is your rent. 4 + +Line 29 – Credit Multiplier Table + +Credit Multiplier Table + +If line 18 is + +Multiplier + +Less than $35,000 + +1.00 (100%) + +$35,000 to $37,500 + +0.40 (40%) + +$37,501 to $40,000 + +0.30 (30%) + +$40,001 to $42,500 + +0.20 (20%) + +$42,501 to $44,999 + +0.10 (10%) + +$45,000 and greater + +0.00 (0%) + +2025 Montana Form 2 Instructions + +Page 41 of 42 diff --git a/source_conflicts/sources/us-mt/mca-15-30-2337-2009.txt b/source_conflicts/sources/us-mt/mca-15-30-2337-2009.txt new file mode 100644 index 00000000000..28d512918f0 --- /dev/null +++ b/source_conflicts/sources/us-mt/mca-15-30-2337-2009.txt @@ -0,0 +1,28 @@ +Source: https://archive.legmt.gov/bills/2009/mca/15/30/15-30-2337.htm +Montana Code Annotated 2009, 15-30-2337. Text extracted from the HTML page: scripts and tags removed, entities decoded, one paragraph per line. + +15-30-2337. Residential property tax credit for elderly -- definitions. As used in 15-30-2337 through 15-30-2341, the following definitions apply: +(1) "Claim period" means the tax year for individuals required to file Montana individual income tax returns and the calendar year for individuals not required to file returns. +(2) "Claimant" means a person who is eligible to file a claim under 15-30-2338. +(3) "Department" means the department of revenue. +(4) "Gross household income" means all income received by all individuals of a household while they are members of the household. +(5) "Gross rent" means the total rent in cash or its equivalent actually paid during the claim period by the renter or lessee for the right of occupancy of the homestead pursuant to an arm's-length transaction with the landlord. +(6) "Homestead" means: +(a) a single-family dwelling or unit of a multiple-unit dwelling that is subject to property taxes in Montana and as much of the surrounding land, but not in excess of 1 acre, as is reasonably necessary for its use as a dwelling; or +(b) a single-family dwelling or unit of a multiple-unit dwelling that is rented from a county or municipal housing authority as provided in Title 7, chapter 15. +(7) (a) "Household" means an association of persons who live in the same dwelling, sharing its furnishings, facilities, accommodations, and expenses. +(b) The term does not include bona fide lessees, tenants, or roomers and boarders on contract. +(8) "Household income" means the amount obtained by subtracting $6,300 from gross household income. +(9) (a) "Income" means, except as provided in subsection (9)(b), federal adjusted gross income, without regard to loss, as that quantity is defined in the Internal Revenue Code of the United States, plus all nontaxable income, including but not limited to: +(i) the amount of any pension or annuity, including Railroad Retirement Act benefits and veterans' disability benefits; +(ii) the amount of capital gains excluded from adjusted gross income; +(iii) alimony; +(iv) support money; +(v) nontaxable strike benefits; +(vi) cash public assistance and relief; +(vii) interest on federal, state, county, and municipal bonds; and +(viii) all payments received under federal social security except social security income paid directly to a nursing home. +(b) For the purposes of this subsection (9), income is reduced by the taxpayer's basis. +(10) "Property tax billed" means taxes levied against the homestead, including special assessments and fees but excluding penalties or interest during the claim period. +(11) "Rent-equivalent tax paid" means 15% of the gross rent. +History: En. Sec. 1, Ch. 584, L. 1981; amd. Sec. 1, Ch. 134, L. 1983; amd. Sec. 1, Ch. 605, L. 1983; amd. Sec. 1, Ch. 27, L. 1987; amd. Sec. 1, Ch. 559, L. 1989; amd. Sec. 1, Ch. 693, L. 1989; amd. Sec. 3, Ch. 612, L. 1991; amd. Sec. 1, Ch. 543, L. 1997; amd. Sec. 1, Ch. 445, L. 1999; amd. Sec. 4, Ch. 147, L. 2009; Sec. 15-30-171, MCA 2007; redes. 15-30-2337 by Sec. 1, Ch. 147, L. 2009. From c43e5d6c954b9667d4cdcc42ea219c13b83d85bd Mon Sep 17 00:00:00 2001 From: David Trimmer Date: Wed, 4 Nov 2026 13:54:51 -0500 Subject: [PATCH 6/6] Address the round-3 review of the Montana elderly credit fixes - Document that the microdata put rent and property tax on the household reference person, so co-resident owners or renters in other tax units fail the occupancy test by default; link the microcosm tenure issue (SA1). - Pin the head-or-spouse condition in eligibility with a dependent case (G1). - Drop the inert mt_refundable_credits_before_renter_credit inputs from elderly credit YAML cases, keeping the 2022 integration case that checks Montana income tax (G2). Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01LqCGPgxDukji8Bhs57c5rH --- ...mt_elderly_homeowner_or_renter_credit.yaml | 1 - ...or_renter_credit_dependent_deductions.yaml | 8 ------ ...y_homeowner_or_renter_credit_eligible.yaml | 27 +++++++++++++++++++ ..._renter_credit_gross_household_income.yaml | 5 ---- ...nter_credit_qualifying_occupancy_months.py | 10 ++++++- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml index 3da2456c035..fff1350290b 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit.yaml @@ -268,7 +268,6 @@ long_term_capital_gains: -3_000 social_security_retirement: 10_000 real_estate_taxes: 2_000 - mt_refundable_credits_before_renter_credit: 0 tax_units: tax_unit: members: [person1] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_dependent_deductions.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_dependent_deductions.yaml index a0bd2ad43a7..2c95c7185f3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_dependent_deductions.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_dependent_deductions.yaml @@ -67,7 +67,6 @@ age: 70 is_tax_unit_dependent: false taxable_pension_income: 20_000 - mt_refundable_credits_before_renter_credit: 0 dependent: age: 16 is_tax_unit_dependent: true @@ -79,7 +78,6 @@ self_employed_pension_contributions: 600 long_term_capital_gains: -3_000 rental_income: -2_000 - mt_refundable_credits_before_renter_credit: 0 tax_units: tax_unit: members: [claimant, dependent] @@ -104,14 +102,12 @@ age: 70 is_tax_unit_dependent: false taxable_pension_income: 20_000 - mt_refundable_credits_before_renter_credit: 0 dependent: age: 16 is_tax_unit_dependent: true employment_income: 10_000 qualified_adoption_assistance_expense: 500 us_bonds_for_higher_ed: 700 - mt_refundable_credits_before_renter_credit: 0 tax_units: tax_unit: members: [claimant, dependent] @@ -134,14 +130,12 @@ age: 70 is_tax_unit_dependent: false taxable_pension_income: 20_000 - mt_refundable_credits_before_renter_credit: 0 dependent: age: 19 is_tax_unit_dependent: true employment_income: 10_000 traditional_ira_contributions: 10_000 educator_expense: 1_000 - mt_refundable_credits_before_renter_credit: 0 tax_units: tax_unit: members: [claimant, dependent] @@ -169,14 +163,12 @@ age: 70 is_tax_unit_dependent: false taxable_pension_income: 20_000 - mt_refundable_credits_before_renter_credit: 0 dependent: age: 19 is_tax_unit_dependent: true employment_income: 2_000 traditional_ira_contributions: 10_000 educator_expense: 1_000 - mt_refundable_credits_before_renter_credit: 0 tax_units: tax_unit: members: [claimant, dependent] diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml index 219aa9c6cd6..3bd427251ac 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_eligible.yaml @@ -207,6 +207,33 @@ # recorded as not renting, owning or leasing the home. mt_elderly_homeowner_or_renter_credit_eligible: [false, false] +- name: A dependent who meets the tests does not qualify the return + period: 2024 + input: + people: + head: + age: 40 + rent: 6_000 + dependent: + age: 70 + is_tax_unit_dependent: true + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 + tax_units: + tax_unit: + members: [head, dependent] + households: + household: + members: [head, dependent] + state_code: MT + output: + # § 15-30-2338(1) sets the tests for the individual who claims. The + # model computes the claim on the return of the tax unit head and + # spouse, so only they can qualify it. The 70-year-old dependent has + # 12 recorded lessee months and 12 residence months (the default) but + # is not the head or spouse; the head is 40 (§ 15-30-2338(1)(a)). + mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months: [12, 12] + mt_elderly_homeowner_or_renter_credit_eligible: [false, false] + - name: The spouse alone can qualify, and one person's residence input leaves the other's at 12 period: 2024 input: diff --git a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml index 609cba0f5bb..2814d4ac976 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mt/tax/income/credits/elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_gross_household_income.yaml @@ -49,7 +49,6 @@ age: 70 taxable_pension_income: 20_000 long_term_capital_gains: -3_000 - mt_refundable_credits_before_renter_credit: 0 tax_units: tax_unit: members: [person1] @@ -71,13 +70,11 @@ person1: age: 70 taxable_pension_income: 20_000 - mt_refundable_credits_before_renter_credit: 0 # Net household income is computed for eligible claimants. mt_elderly_homeowner_or_renter_credit_eligible: true person2: age: 68 self_employment_income: -5_000 - mt_refundable_credits_before_renter_credit: 0 mt_elderly_homeowner_or_renter_credit_eligible: true tax_units: tax_unit: @@ -340,7 +337,6 @@ person1: age: 40 employment_income: 10_000 - mt_refundable_credits_before_renter_credit: 0 # A supplied receipt: a federal EITC refund received during 2017. mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 383.01 tax_units: @@ -363,7 +359,6 @@ person1: age: 40 employment_income: 10_000 - mt_refundable_credits_before_renter_credit: 0 # A supplied receipt: a federal EITC refund received during 2016. mt_elderly_homeowner_or_renter_credit_other_federal_refundable_credits: 383.01 tax_units: diff --git a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py index 3b45c0aaeb4..66865513fc3 100644 --- a/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py +++ b/policyengine_us/variables/gov/states/mt/tax/income/credits/mt_elderly_homeowner_or_renter/mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months.py @@ -14,7 +14,9 @@ class mt_elderly_homeowner_or_renter_credit_qualifying_occupancy_months(Variable "mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months, " "which defaults to 0. Record a rent-free lessee or owner there, not " "here: an input to this variable for one person sets everyone " - "else's months to 0." + "else's months to 0. The microdata put a household's rent and " + "property tax on the household reference person, so by default a " + "co-resident owner or renter in another tax unit fails this test." ) unit = "month" definition_period = YEAR @@ -43,6 +45,12 @@ def formula(person, period, parameters): # lessee or owner without either amount is recorded through a # separate input, so recording one person leaves everyone else's # months to follow their own rent and bill. + # The microdata put a household's rent and property tax on its + # reference person, so an older co-owner or co-renter filing in + # another tax unit (a partner, sibling or parent) gets 0 months + # unless the input is supplied, and the credit is understated. + # Tenure facts for other adults are tracked in + # https://github.com/PolicyEngine/microcosm/issues/1514 rent = add(person.tax_unit, period, ["rent"]) property_tax = person.tax_unit( "mt_elderly_homeowner_or_renter_credit_property_tax_billed", period