diff --git a/changelog.d/cdcc-expense-distribution.fixed.md b/changelog.d/cdcc-expense-distribution.fixed.md new file mode 100644 index 00000000000..1fdf0686cb3 --- /dev/null +++ b/changelog.d/cdcc-expense-distribution.fixed.md @@ -0,0 +1 @@ +Add care expenses for a disabled adult dependent or spouse to the Child and Dependent Care Credit base, via a new care_expenses input, so a disabled qualifying individual age 18 or older is no longer attributed $0 of care expenses; the federal credit and its state mirrors (e.g. Kansas) previously returned $0 in this case. diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/cdcc/cdcc_relevant_expenses.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/cdcc/cdcc_relevant_expenses.yaml index ba37b26263b..8ed8c1ecdd6 100644 --- a/policyengine_us/tests/policy/baseline/gov/irs/credits/cdcc/cdcc_relevant_expenses.yaml +++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/cdcc/cdcc_relevant_expenses.yaml @@ -24,3 +24,19 @@ min_head_spouse_earned: 8_000 output: cdcc_relevant_expenses: 5_000 + +- name: Adult dependent care expenses add to the childcare base + absolute_error_margin: 0.01 + period: 2024 + input: + people: + person1: + pre_subsidy_care_expenses: 2_000 + tax_units: + tax_unit: + members: [person1] + tax_unit_childcare_expenses: 1_000 + cdcc_limit: 6_000 + min_head_spouse_earned: 10_000 + output: + cdcc_relevant_expenses: 3_000 # 1_000 childcare + 2_000 adult care diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/cdcc/integration.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/cdcc/integration.yaml index c0210fa2edd..04b075b799d 100644 --- a/policyengine_us/tests/policy/baseline/gov/irs/credits/cdcc/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/cdcc/integration.yaml @@ -95,3 +95,36 @@ output: # expected results from patched TAXSIM35 2023-01-13 version taxsim_tfica: 11_130.24 income_tax: 24_507.2 + +- name: Disabled adult dependent's care expenses reach the CDCC via care_expenses + absolute_error_margin: 0.01 + period: 2024 + input: + people: + person1: + age: 40 + employment_income: 40_000 + is_tax_unit_head: true + person2: # earning spouse: the earned-income test passes without deemed income + age: 38 + employment_income: 30_000 + is_tax_unit_spouse: true + person3: # disabled adult dependent: care billed as adult care, not childcare + age: 18 + is_incapable_of_self_care: true + is_tax_unit_dependent: true + pre_subsidy_care_expenses: 6_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + # The childcare pipeline is untouched (no children under 13); the adult-care + # expense enters the CDCC base via care_expenses. + tax_unit_childcare_expenses: 0 + care_expenses: [0, 0, 6_000] + cdcc_relevant_expenses: 3_000 # min(6_000, $3,000 cap for one individual, earnings) + cdcc: 600 # 20% x 3_000 at $70,000 joint AGI diff --git a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_cdcc.yaml b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_cdcc.yaml index a84e622894b..e2ff3ef47d6 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_cdcc.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ks/tax/income/ks_cdcc.yaml @@ -5,3 +5,32 @@ state_code: KS output: ks_cdcc: 0.25 * 1_000 + +- name: Disabled adult dependent's care expenses count toward Kansas CDCC + absolute_error_margin: 0.01 + period: 2024 + input: + people: + person1: + age: 40 + employment_income: 40_000 + is_tax_unit_head: true + person2: + age: 38 + employment_income: 30_000 + is_tax_unit_spouse: true + person3: + age: 18 + is_incapable_of_self_care: true + is_tax_unit_dependent: true + pre_subsidy_care_expenses: 6_000 + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: KS + output: + cdcc: 600 # federal credit, fed by the adult-care expense + ks_cdcc: 300 # Kansas share of the federal credit diff --git a/policyengine_us/tests/policy/baseline/household/expense/childcare/care_expenses.yaml b/policyengine_us/tests/policy/baseline/household/expense/childcare/care_expenses.yaml index 884e9c1b413..69c31dcef59 100644 --- a/policyengine_us/tests/policy/baseline/household/expense/childcare/care_expenses.yaml +++ b/policyengine_us/tests/policy/baseline/household/expense/childcare/care_expenses.yaml @@ -4,3 +4,8 @@ pre_subsidy_care_expenses: 100 output: care_expenses: 100 + +- name: Care expenses default to zero + period: 2024 + output: + care_expenses: 0 diff --git a/policyengine_us/variables/gov/irs/credits/cdcc/cdcc_relevant_expenses.py b/policyengine_us/variables/gov/irs/credits/cdcc/cdcc_relevant_expenses.py index 16f557ee386..d6fab08529e 100644 --- a/policyengine_us/variables/gov/irs/credits/cdcc/cdcc_relevant_expenses.py +++ b/policyengine_us/variables/gov/irs/credits/cdcc/cdcc_relevant_expenses.py @@ -13,7 +13,14 @@ class cdcc_relevant_expenses(Variable): ) def formula(tax_unit, period, parameters): - expenses = tax_unit("tax_unit_childcare_expenses", period) + # Section 21 employment-related expenses cover care for any qualifying + # individual: childcare for children under 13 + # (tax_unit_childcare_expenses) plus care for a disabled qualifying + # individual of any age — a disabled adult dependent or spouse + # (care_expenses, a person-level monthly input summed to the year). + childcare = tax_unit("tax_unit_childcare_expenses", period) + adult_care = add(tax_unit, period, ["care_expenses"]) + expenses = childcare + adult_care cdcc_limit = tax_unit("cdcc_limit", period) eligible_capped_expenses = min_(expenses, cdcc_limit) # cap further to the lowest earnings between the taxpayer and spouse diff --git a/policyengine_us/variables/household/expense/childcare/care_expenses.py b/policyengine_us/variables/household/expense/childcare/care_expenses.py index 8e71e908508..bb978b72ff1 100644 --- a/policyengine_us/variables/household/expense/childcare/care_expenses.py +++ b/policyengine_us/variables/household/expense/childcare/care_expenses.py @@ -4,11 +4,12 @@ class care_expenses(Variable): value_type = float entity = Person - label = "Care expenses" + label = "Care expenses for a disabled adult dependent or spouse" unit = USD - definition_period = MONTH + definition_period = YEAR + reference = "https://www.law.cornell.edu/uscode/text/26/21#b_2" def formula(person, period, parameters): + # No public subsidy applies to adult dependent care, so this passes + # through the pre-subsidy amount (mirrors childcare_expenses). return person("pre_subsidy_care_expenses", period) - - # Add subsidies in a .yaml file once added to the model diff --git a/policyengine_us/variables/household/expense/childcare/pre_subsidy_care_expenses.py b/policyengine_us/variables/household/expense/childcare/pre_subsidy_care_expenses.py index d1ad457f759..c4e7cbe7a50 100644 --- a/policyengine_us/variables/household/expense/childcare/pre_subsidy_care_expenses.py +++ b/policyengine_us/variables/household/expense/childcare/pre_subsidy_care_expenses.py @@ -4,6 +4,7 @@ class pre_subsidy_care_expenses(Variable): value_type = float entity = Person - label = "Pre subsidy care expenses" - definition_period = MONTH + label = "Pre-subsidy care expenses for a disabled adult dependent or spouse" + definition_period = YEAR unit = USD + reference = "https://www.law.cornell.edu/uscode/text/26/21#b_2"