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..01508a2db52 --- /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 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 f28c95c8377..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,13 +83,21 @@ 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)). - - mt_refundable_credits_before_renter_credit + # 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), 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 @@ -106,7 +114,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 @@ -129,7 +137,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/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/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/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml b/policyengine_us/parameters/gov/states/mt/tax/income/subtractions/subtractions.yaml index 78b1cee6d27..a2c38938f6a 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 @@ -21,7 +21,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 - mt_other_subtractions 2025-01-01: @@ -32,7 +34,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 @@ -53,3 +54,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..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 @@ -227,13 +227,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 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, + # 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 @@ -267,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] @@ -937,6 +937,10 @@ person2: age: 40 employment_income: 10_000 + # 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: members: [person1] @@ -949,13 +953,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: 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 - # 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] @@ -971,6 +974,10 @@ person2: age: 30 employment_income: 10_000 + # 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 tax_units: @@ -984,11 +991,11 @@ 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 - # 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] @@ -1007,6 +1014,10 @@ person2: age: 30 employment_income: 12_000 + # 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 tax_units: @@ -1019,13 +1030,11 @@ members: [person1, person2, person3] state_name: MT output: - # Line 8: 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 @@ -1075,6 +1084,10 @@ person2: age: 40 employment_income: 10_000 + # 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: members: [person1] @@ -1089,9 +1102,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. @@ -1109,26 +1121,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_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_other_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 +1309,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 +1339,50 @@ 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_unbilled_occupancy_months: 12 + person2: + age: 45 + taxable_interest_income: 6_000 + rent: 0 + real_estate_taxes: 4_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: # 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,9 +1392,12 @@ # 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)). + # 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] @@ -1453,11 +1512,61 @@ 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_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] + +- 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] @@ -1585,6 +1694,8 @@ taxable_pension_income: 14_000 rent: 0 ssi: 0 + # A rent-free lessee. + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 person2: age: 45 rent: 0 @@ -1614,3 +1725,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_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 97841644257..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 @@ -1,32 +1,274 @@ - 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: {} - person2: {} + 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_unbilled_occupancy_months: 12 + 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: + # Zero cash rent does not by itself rule out lessee status; an input + # 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 + 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: 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: + 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: + 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] + households: + household: + members: [person1, person2] + state_code: MT + output: + # § 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] + +- 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: + 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] - greater_age_head_spouse: 70 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 5f2f32ff9fe..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 @@ -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,73 @@ 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, person2, person3] + members: [person1] 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] + mt_elderly_homeowner_or_renter_credit_federal_refundable_credits: 0 + mt_elderly_homeowner_or_renter_credit_gross_household_income: 20_000 -- name: Case 3, the 2021 Economic Impact Payment counts with the federal EITC. +- 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 + # 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] + tax_unit2: + members: [person2] + households: + household: + members: [person1, person2] + 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; 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. period: 2021 absolute_error_margin: 0.01 input: people: person1: age: 63 - employment_income: 20_892.60 + taxable_pension_income: 20_000 tax_units: tax_unit: members: [person1] @@ -69,13 +93,168 @@ 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". 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. 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: + 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 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 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..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,11 +70,12 @@ 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: members: [person1, person2] @@ -202,6 +202,10 @@ person2: age: 40 employment_income: 10_000 + # 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: members: [person1] @@ -214,11 +218,10 @@ 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 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 @@ -232,6 +235,10 @@ person2: age: 30 employment_income: 10_000 + # 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 tax_units: @@ -245,9 +252,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 @@ -330,7 +337,8 @@ 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: tax_unit: members: [person1] @@ -341,9 +349,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 @@ -353,7 +359,8 @@ 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: tax_unit: members: [person1] @@ -367,6 +374,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: @@ -517,6 +575,10 @@ person2: age: 35 employment_income: 25_000 + # 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 person4: @@ -532,12 +594,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 98ed9ddbb9c..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 @@ -46,6 +46,8 @@ taxable_pension_income: 14_000 rent: 0 ssi: 0 + # A rent-free lessee. + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 person2: age: 72 taxable_pension_income: 4_000 @@ -79,11 +81,15 @@ # 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. + # 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] @@ -97,6 +103,8 @@ taxable_pension_income: 9_000 rent: 0 ssi: 0 + # A rent-free lessee for the whole year. + mt_elderly_homeowner_or_renter_credit_unbilled_occupancy_months: 12 person2: age: 60 taxable_pension_income: 3_000 @@ -122,5 +130,46 @@ # 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] + +- 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_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_one_claimant.py b/policyengine_us/tests/test_mt_elderly_credit_one_claimant.py index 782b76873c6..a18d486f8e3 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 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 model for random Montana households of one to three tax units (single or @@ -59,13 +63,31 @@ YEAR = 2024 TOLERANCE = 0.01 P = system.parameters(YEAR).gov.states.mt.tax.income.credits.elderly_homeowner_or_renter +LESSEE_MONTHS = "mt_elderly_homeowner_or_renter_credit_unbilled_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. 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 = ( {}, {}, @@ -100,6 +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 unit.get("lessee", False): + for person in unit_members: + people[person][LESSEE_MONTHS] = {YEAR: 12} tax_units[unit_key] = {"members": unit_members} marital_units[unit_key] = {"members": unit_members} members += unit_members @@ -137,7 +162,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 +171,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 +222,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 +268,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 +291,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 +336,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 +430,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 +459,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..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,29 +1,29 @@ -"""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. - -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 -(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. +"""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 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, 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. @@ -39,17 +39,18 @@ 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" -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 +60,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"]}, + OTHER: {YEAR: c["claimant_received"] if received else 0}, } people[member] = { "age": {YEAR: c["member_age"]}, "employment_income": {YEAR: c["wages"]}, + OTHER: {YEAR: c["member_received"] if received else 0}, } for child, age in zip(children, c["child_ages"]): people[child] = {"age": {YEAR: age}} @@ -74,19 +77,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,23 +111,23 @@ 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, and + # no Economic Impact Payment was made in 2024. 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): - # 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 @@ -141,61 +139,32 @@ 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, 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 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.""" 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) - 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) + 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_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]) - - -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)), - "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) - ), - } - - @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_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..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 @@ -4,24 +4,79 @@ 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: 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 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" + # 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 + # 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", ) + # 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. + # + # 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): - # 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. + # household, so count each return's payments once, on its head. head = person("is_tax_unit_head", period) - return head * person.tax_unit("income_tax_refundable_credits", 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_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..18271b451c0 --- /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,29 @@ +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: 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 = ( + # 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", + ) 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_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..66865513fc3 --- /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,65 @@ +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. 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. 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 + 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. 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. + # 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 + ) + documented = (rent > 0) | (property_tax > 0) + head_or_spouse = person("is_tax_unit_head_or_spouse", period) + 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_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..675bedc84cf --- /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,36 @@ +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", + # 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" + "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_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/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..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 @@ -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 @@ -17,4 +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 + # 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 f4a3bfb1ea7..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,37 @@ 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" + 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. + # 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)) + # 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 p.in_effect * exclusion diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 6427e4fd8e9..68c442649aa 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -6186,40 +6186,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: @@ -6230,30 +6196,78 @@ 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 + 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 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. 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: + 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. + 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.
+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.
+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.
+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.
+