Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/health-coverage-rules.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added reported current health coverage inputs and ACA/Medicaid coverage reconciliation helpers.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
- name: Case 1, Marketplace plus Medicaid conflict is flagged.
period: 2025
input:
has_marketplace_health_coverage_at_interview: true
has_medicaid_health_coverage_at_interview: true
output:
coverage_report_model_conflict: true

- name: Case 2, Marketplace without conflicting coverage is not flagged.
period: 2025
input:
age: 40
medicaid_enrolled: false
is_chip_eligible: false
medicare_enrolled: false
has_esi: false
has_marketplace_health_coverage_at_interview: true
output:
coverage_report_model_conflict: false

- name: Case 3, non-Marketplace coverage without reported Marketplace is not flagged.
period: 2025
input:
has_marketplace_health_coverage_at_interview: false
has_non_marketplace_direct_purchase_health_coverage_at_interview: true
output:
coverage_report_model_conflict: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
- name: Case 1, Medicaid enrollment counts as qualifying non-Marketplace coverage.
period: 2025
input:
medicaid_enrolled: true
output:
has_qualifying_non_marketplace_health_coverage_at_interview: true

- name: Case 2, IHS-only coverage does not count as qualifying non-Marketplace coverage.
period: 2025
input:
age: 40
medicaid_enrolled: false
is_chip_eligible: false
medicare_enrolled: false
has_esi: false
has_indian_health_service_coverage_at_interview: true
output:
has_qualifying_non_marketplace_health_coverage_at_interview: false

- name: Case 3, off-exchange coverage counts as qualifying non-Marketplace coverage.
period: 2025
input:
has_non_marketplace_direct_purchase_health_coverage_at_interview: true
output:
has_qualifying_non_marketplace_health_coverage_at_interview: true
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,28 @@
is_medicaid_eligible: [true]
medicaid_enrolled: [true]
takes_up_medicaid_if_eligible: [true]

- name: Case 5, current Medicaid coverage preserves CA continuous coverage.
period: 2026
input:
people:
person1:
age: 35
employment_income: 15_000
immigration_status: UNDOCUMENTED
has_medicaid_health_coverage_at_interview: true
tax_units:
tax_unit:
members: [person1]
spm_units:
spm_unit:
members: [person1]
households:
household:
members: [person1]
state_code: CA
output:
receives_medicaid: [false]
is_ca_medicaid_immigration_status_eligible: [true]
is_medicaid_eligible: [true]
medicaid_enrolled: [true]
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from policyengine_us.model_api import *


class coverage_report_model_conflict(Variable):
value_type = bool
entity = Person
label = "Marketplace coverage conflicts with modeled qualifying non-Marketplace coverage"
definition_period = YEAR

def formula(person, period, parameters):
return person("has_marketplace_health_coverage_at_interview", period) & person(
"has_qualifying_non_marketplace_health_coverage_at_interview",
period,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from policyengine_us.model_api import *


class has_qualifying_non_marketplace_health_coverage_at_interview(Variable):
value_type = bool
entity = Person
label = "Person has qualifying non-Marketplace health coverage at interview"
definition_period = YEAR

def formula(person, period, parameters):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use adds

return (
person(
"qualifying_non_marketplace_health_coverage_type_count_at_interview",
period,
)
> 0
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from policyengine_us.model_api import *


class qualifying_non_marketplace_health_coverage_type_count_at_interview(Variable):
value_type = int
entity = Person
label = "Count of qualifying non-Marketplace health coverage types at interview"
definition_period = YEAR
adds = [
"has_esi",
"medicaid_enrolled",
"has_medicaid_health_coverage_at_interview",
"is_chip_eligible",
"medicare_enrolled",
"has_non_marketplace_direct_purchase_health_coverage_at_interview",
"has_other_means_tested_health_coverage_at_interview",
"has_tricare_health_coverage_at_interview",
"has_champva_health_coverage_at_interview",
"has_va_health_coverage_at_interview",
]
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,17 @@ def formula(person, period, parameters):
immigration_status_str,
p.medi_cal_enrollment_freeze.affected_statuses,
)
receives_medicaid = person("receives_medicaid", period)
current_medicaid_coverage = person("receives_medicaid", period) | person(
"has_medicaid_health_coverage_at_interview", period
)

# Freeze-affected (UNDOCUMENTED): standard age eligibility OR
# continuous coverage (already enrolled)
# Not freeze-affected (DACA/TPS/others): always eligible
# (Health4All covered all ages by 2024, freeze doesn't apply)
return is_ca_state_funded_status & where(
is_freeze_affected,
standard_eligible | receives_medicaid,
standard_eligible | current_medicaid_coverage,
True,
)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from policyengine_us.model_api import *


class has_champva_health_coverage_at_interview(Variable):
value_type = bool
entity = Person
label = "Person currently has CHAMPVA health coverage"
definition_period = YEAR
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from policyengine_us.model_api import *


class has_indian_health_service_coverage_at_interview(Variable):
value_type = bool
entity = Person
label = "Person currently has Indian Health Service coverage"
definition_period = YEAR
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@
class has_marketplace_health_coverage(Variable):
value_type = bool
entity = Person
label = "Is eligible for health insurance from an ACA Marketplace plan because has no employer-sponsored health insurance coverage."
label = "Person has modeled Marketplace health coverage"
definition_period = YEAR
default_value = True
documentation = """
Legacy modeled Marketplace coverage status.

Use has_marketplace_health_coverage_at_interview for reported current
Marketplace coverage from survey data.
"""
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from policyengine_us.model_api import *


class has_marketplace_health_coverage_at_interview(Variable):
value_type = bool
entity = Person
label = "Person currently has Marketplace health coverage"
definition_period = YEAR
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from policyengine_us.model_api import *


class has_medicaid_health_coverage_at_interview(Variable):
value_type = bool
entity = Person
label = "Person currently has Medicaid health coverage"
definition_period = YEAR
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from policyengine_us.model_api import *


class has_non_marketplace_direct_purchase_health_coverage_at_interview(Variable):
value_type = bool
entity = Person
label = "Person currently has non-Marketplace direct-purchase health coverage"
definition_period = YEAR
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from policyengine_us.model_api import *


class has_other_means_tested_health_coverage_at_interview(Variable):
value_type = bool
entity = Person
label = "Person currently has other means-tested health coverage"
definition_period = YEAR
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from policyengine_us.model_api import *


class has_tricare_health_coverage_at_interview(Variable):
value_type = bool
entity = Person
label = "Person currently has TRICARE health coverage"
definition_period = YEAR
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from policyengine_us.model_api import *


class has_va_health_coverage_at_interview(Variable):
value_type = bool
entity = Person
label = "Person currently has VA health coverage"
definition_period = YEAR
Loading