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
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ gem 'mustache'

gem 'cqm-models', '~> 4.2.0'
gem 'cqm-parsers', '~> 4.1.1.2'
gem 'cqm-reports', '~> 4.1.6'
gem 'cqm-reports', git: 'https://github.com/projecttacoma/cqm-reports', branch: '2027_CMS_III'
gem 'cqm-validators', '~> 4.0.6'

# # Use faker to generate addresses
Expand Down
34 changes: 20 additions & 14 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
GIT
remote: https://github.com/projecttacoma/cqm-reports
revision: 99d87fcaee37c84b0fd3d530633cd4125d47b686
branch: 2027_CMS_III
specs:
cqm-reports (4.1.8)
cqm-models (~> 4.0)
cqm-validators (~> 4.0)
erubis (~> 2.7)
log4r (~> 1.1)
memoist (~> 0.9)
mongoid-tree (> 2.0)
mustache
nokogiri (>= 1.16.2)
uuid (~> 2.3)
zip-zip (~> 0.3)

GEM
remote: https://rubygems.org/
specs:
Expand Down Expand Up @@ -170,17 +187,6 @@ GEM
typhoeus
uuid (~> 2.3.7)
zip-zip (~> 0.3)
cqm-reports (4.1.6)
cqm-models (~> 4.0)
cqm-validators (~> 4.0)
erubis (~> 2.7)
log4r (~> 1.1)
memoist (~> 0.9)
mongoid-tree (> 2.0)
mustache
nokogiri (>= 1.16.2)
uuid (~> 2.3)
zip-zip (~> 0.3)
cqm-validators (4.0.6)
nokogiri (>= 1.16.2)
crack (1.0.1)
Expand Down Expand Up @@ -333,7 +339,7 @@ GEM
thor (>= 0.14, < 2.0)
jquery-ui-rails (8.0.0)
railties (>= 3.2.16)
json (2.19.4)
json (2.21.1)
kaminari-core (1.2.2)
kaminari-mongoid (1.0.2)
kaminari-core (~> 1.0)
Expand Down Expand Up @@ -385,7 +391,7 @@ GEM
ruby-progressbar
mocha (3.1.0)
ruby2_keywords (>= 0.0.5)
mongo (2.24.0)
mongo (2.24.1)
base64
bson (>= 4.14.1, < 6.0.0)
mongoid (9.0.11)
Expand Down Expand Up @@ -712,7 +718,7 @@ DEPENDENCIES
codecov
cqm-models (~> 4.2.0)
cqm-parsers (~> 4.1.1.2)
cqm-reports (~> 4.1.6)
cqm-reports!
cqm-validators (~> 4.0.6)
csv (~> 3.3, >= 3.3.5)
cucumber-rails
Expand Down
15 changes: 15 additions & 0 deletions app/models/cms_program_task.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ def ep_program_specific_validators
return app_plus_indiv_validators if product_test.cms_program == 'APP_PLUS_INDIV'
return app_plus_group_validators if product_test.cms_program == 'APP_PLUS_GROUP'
return app_plus_entity_validators if product_test.cms_program == 'APP_PLUS_APMENTITY'
return asm_indiv_validators if product_test.cms_program == 'ASM_INDIV'
return asm_group_validators if product_test.cms_program == 'ASM_GROUP'
return lead_apm_entity_validators if product_test.cms_program == 'LEAD_APM_ENTITY'

[]
end
Expand Down Expand Up @@ -153,6 +156,18 @@ def mips_subgroup_validators
ep_validators
end

def asm_indiv_validators
ep_validators
end

def asm_group_validators
ep_validators
end

def lead_apm_entity_validators
ep_validators
end

# Common validators for EH programs
def eh_validators
[::Validators::CMSQRDA1HQRSchematronValidator.new(product_test.bundle.version, as_warnings: false),
Expand Down
1 change: 1 addition & 0 deletions app/models/cms_program_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class CMSProgramTest < ProductTest
# List of cms programs
validates :cms_program, inclusion: %w[HQR_PI HQR_IQR HQR_PI_IQR HQR_IQR_VOL HQR_OQR HQR_REHQR
MCP_STANDARD MCP_FQHC
ASM_INDIV ASM_GROUP LEAD_APM_ENTITY
APP_PLUS_INDIV APP_PLUS_GROUP APP_PLUS_APMENTITY
CPCPLUS PCF MIPS_INDIV MIPS_GROUP MIPS_VIRTUALGROUP MIPS_APMENTITY
MIPS_APP1_INDIV MIPS_APP1_GROUP MIPS_SUBGROUP MIPS_APP1_APMENTITY HL7_Cat_I HL7_Cat_III]
Expand Down
2 changes: 1 addition & 1 deletion app/views/products/report/_cvu_plus_report.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
</tr>
</thead>
<tbody>
<% %w[HQR_PI HQR_IQR HQR_PI_IQR HQR_IQR_VOL HQR_OQR HQR_REHQR MIPS_GROUP MIPS_INDIV MIPS_VIRTUALGROUP MIPS_APMENTITY MIPS_APP1_INDIV MIPS_APP1_GROUP MIPS_SUBGROUP MIPS_APP1_APMENTITY CPCPLUS PCF MCP_STANDARD MCP_FQHC APP_PLUS_INDIV APP_PLUS_GROUP APP_PLUS_APMENTITY].each do |test| %>
<% %w[HQR_PI HQR_IQR HQR_PI_IQR HQR_IQR_VOL HQR_OQR HQR_REHQR MIPS_GROUP MIPS_INDIV MIPS_VIRTUALGROUP MIPS_APMENTITY MIPS_APP1_INDIV MIPS_APP1_GROUP MIPS_SUBGROUP MIPS_APP1_APMENTITY CPCPLUS PCF MCP_STANDARD MCP_FQHC APP_PLUS_INDIV APP_PLUS_GROUP APP_PLUS_APMENTITY ASM_INDIV ASM_GROUP LEAD_APM_ENTITY].each do |test| %>
<tr>
<% ptest = @product.product_tests.cms_program_tests.where(cms_program: test ) %>
<% next if ptest.empty? %>
Expand Down
98 changes: 75 additions & 23 deletions config/cms_ig.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,21 @@ CMS Programs:
- APP_PLUS_INDIV
- APP_PLUS_GROUP
- APP_PLUS_APMENTITY
'2026':
- MIPS_GROUP
- MIPS_INDIV
- MIPS_VIRTUALGROUP
- MIPS_APMENTITY
- MIPS_APP1_INDIV
- MIPS_APP1_GROUP
- MIPS_APP1_APMENTITY
- MIPS_SUBGROUP
- APP_PLUS_INDIV
- APP_PLUS_GROUP
- APP_PLUS_APMENTITY
- ASM_INDIV
- ASM_GROUP
- LEAD_APM_ENTITY
eh:
'2020':
- HQR_PI
Expand Down Expand Up @@ -136,7 +151,7 @@ Program Criterion:
description:
eh: 'The organizations Facility CMS Certification Number (CCN). CCN is required for HQR.'
conf:
eh: '(CONF:4444-28241_C01)'
eh: '(CONF:4509-28241_C01)'
programs:
- HQR_PI
- HQR_IQR
Expand All @@ -156,7 +171,7 @@ Program Criterion:
description:
eh: 'Medicare HIC Number is not required for HQR but should be submitted if the payer is Medicare and the patient has an HIC number assigned.'
conf:
eh: '(CONF:4444- 16857_C01)'
eh: '(CONF:4509- 16857_C01)'
programs:
- HQR_PI
- HQR_IQR
Expand Down Expand Up @@ -189,7 +204,7 @@ Program Criterion:
description:
eh: 'Medicare Beneficiary Identifier (MBI) is not required for HQR but should be submitted if the payer is Medicare and the patient has an MBI number assigned.'
conf:
eh: '(CONF:4444- 28697_C01)'
eh: '(CONF:4509- 28697_C01)'
programs:
- HQR_PI
- HQR_IQR
Expand All @@ -199,24 +214,18 @@ Program Criterion:
- HQR_REHQR
CMS EHR Certification ID:
name: 'CMS EHR Certification ID'
optional:
- MIPS_GROUP
- MIPS_INDIV
- MIPS_VIRTUALGROUP
- MIPS_APMENTITY
- MIPS_APP1_INDIV
- MIPS_APP1_GROUP
- MIPS_APP1_APMENTITY
description:
CPCPLUS: 'For CPC+, all QRDA III files must include a CMS EHR Certification ID. Nulls will not be allowed.'
PCF: 'For PCF, all QRDA III files must include a CMS EHR Certification ID. Nulls will not be allowed.'
MIPS_GROUP: 'CMS EHR Certification ID is optional for the MIPS Quality performance category.'
MIPS_INDIV: 'CMS EHR Certification ID is optional for the MIPS Quality performance category.'
MIPS_VIRTUALGROUP: 'CMS EHR Certification ID is optional for the MIPS Quality performance category.'
MIPS_APMENTITY: 'CMS EHR Certification ID is optional for the MIPS Quality performance category.'
MIPS_APP1_INDIV: 'CMS EHR Certification ID is optional for the MIPS Quality performance category.'
MIPS_APP1_GROUP: 'CMS EHR Certification ID is optional for the MIPS Quality performance category.'
MIPS_APP1_APMENTITY: 'CMS EHR Certification ID is optional for the MIPS Quality performance category.'
MIPS_GROUP: 'For MIPS and ASM submissions, CMS EHR Certification ID is required for the Quality performance category.'
MIPS_INDIV: 'For MIPS and ASM submissions, CMS EHR Certification ID is required for the Quality performance category.'
MIPS_VIRTUALGROUP: 'For MIPS and ASM submissions, CMS EHR Certification ID is required for the Quality performance category.'
MIPS_APMENTITY: 'For MIPS and ASM submissions, CMS EHR Certification ID is required for the Quality performance category.'
MIPS_APP1_INDIV: 'For MIPS and ASM submissions, CMS EHR Certification ID is required for the Quality performance category.'
MIPS_APP1_GROUP: 'For MIPS and ASM submissions, CMS EHR Certification ID is required for the Quality performance category.'
MIPS_APP1_APMENTITY: 'For MIPS and ASM submissions, CMS EHR Certification ID is required for the Quality performance category.'
ASM_INDIV: 'For MIPS and ASM submissions, CMS EHR Certification ID is required for the Quality performance category.'
ASM_GROUP: 'For MIPS and ASM submissions, CMS EHR Certification ID is required for the Quality performance category.'
eh: 'The Certified Health Information Technology (IT) Product List (CHPL) is the authoritative and comprehensive listing of health IT certified through the Office of the National Coordinator for Health Information Technology (ONC) Health IT Certification Program. A CMS EHR Certification Identification Number is a number generated by the CHPL and used for reporting to CMS.'
conf:
eh: '(CONF:CMS_0005)'
Expand All @@ -239,16 +248,31 @@ Program Criterion:
- MIPS_APP1_APMENTITY
- MCP_STANDARD
- MCP_FQHC
- ASM_INDIV
- ASM_GROUP
TIN:
name: 'Tax Identification Number'
optional:
- HQR_PI
- HQR_IQR
- HQR_PI_IQR
- HQR_IQR_VOL
- HQR_OQR
- HQR_REHQR
description:
CPCPLUS: 'For CPC+: it must contain at least one performer, each performer contains one TIN and one NPI'
PCF: 'For PCF: it must contain at least one performer, each performer contains one TIN and one NPI'
MIPS_GROUP: 'For MIPS group reporting: it must contain exactly one performer, which contains one TIN. No NPI is allowed.'
MIPS_INDIV: 'For MIPS individual reporting: it must contain exactly one performer, which contains one TIN and one NPI.'
MIPS_APP1_INDIV: 'Required for APP group reporting and APP individual reporting'
MIPS_APP1_GROUP: 'Required for APP group reporting and APP individual reporting'
APP_PLUS_INDIV: 'Required for APP Plus group reporting and APP Plus individual reporting'
APP_PLUS_GROUP: 'Required for APP Plus group reporting and APP Plus individual reporting'
ASM_INDIV: 'Required for ASM individual and group reporting'
ASM_GROUP: 'Required for ASM individual and group reporting'
eh: 'For HQR, TIN may not be applicable. If TIN is submitted for HQR, then it SHALL conform to the constraints specified for TIN. and the TIN must be in valid format (9 decimal digits).'
conf:
eh: '(CONF:4444-16593)'
eh: '(CMS_0119)'
ep: '(CONF:3338-18190)'
programs:
- HQR_PI
Expand All @@ -267,6 +291,8 @@ Program Criterion:
- MCP_FQHC
- APP_PLUS_INDIV
- APP_PLUS_GROUP
- ASM_INDIV
- ASM_GROUP
Virtual Group Identifier:
name: 'Virtual Group Identifier'
description:
Expand All @@ -277,15 +303,26 @@ Program Criterion:
- MIPS_VIRTUALGROUP
NPI:
name: 'National Provider Identification number'
optional:
- HQR_PI
- HQR_IQR
- HQR_PI_IQR
- HQR_IQR_VOL
- HQR_OQR
- HQR_REHQR
description:
CPCPLUS: 'For CPC+: it must contain at least one performer, each performer contains one TIN and one NPI'
PCF: 'For PCF: it must contain at least one performer, each performer contains one TIN and one NPI'
MIPS_INDIV: 'For MIPS individual reporting: it must contain exactly one performer, which contains one TIN and one NPI.'
MIPS_APP1_INDIV: 'Required for APP individual reporting'
APP_PLUS_INDIV: 'Required for APP Plus individual reporting'
ASM_INDIV: 'Required for ASM individual and group reporting'
ASM_GROUP: 'Required for ASM individual and group reporting'
eh: 'For HQR, NPI may not be applicable. If NPI is submitted for HQR, then the NPI SHALL conform to the constraints specified for NPI and the NPI must be in the correct format.'
ep:
conf:
eh: '(CONF:3364-28497)'
ep: '(CONF:3338-18247)'
eh: '(CMS_0115)'
ep: '(CONF:5562-18247)'
programs:
- HQR_PI
- HQR_IQR
Expand All @@ -299,6 +336,8 @@ Program Criterion:
- PCF
- MCP_STANDARD
- APP_PLUS_INDIV
- ASM_INDIV
- ASM_GROUP
CPCPLUS APM Entity Identifier:
name: 'CPCPLUS APM Entity Identifier'
description:
Expand All @@ -325,15 +364,16 @@ Program Criterion:
- MCP_STANDARD
- MCP_FQHC
MIPS APM Entity Identifier:
name: 'MIPS APM Entity Identifier'
name: 'APM Entity Identifier'
description:
ep: 'This is the MIPS APM Entity Identifier assigned to the MIPS practice site.'
ep: 'This is the APM Entity Identifier assigned to the practice site.'
conf:
ep: '(CONF:CMS_109)'
programs:
- MIPS_APMENTITY
- MIPS_APP1_APMENTITY
- APP_PLUS_APMENTITY
- LEAD_APM_ENTITY
MIPS Subgroup Identifier:
name: 'MIPS Subgroup Identifier'
description:
Expand Down Expand Up @@ -379,3 +419,15 @@ requirement.'
- MIPS_APP1_INDIV
- MIPS_APP1_GROUP
- MIPS_APP1_APMENTITY
ASM Cohort:
name: 'ASM Cohort'
description:
ep: 'Each ASM participant is assigned to a specific cohort.'
conf:
ep: '(CONF:CMS_160)'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Should this be 165?

programs:
- ASM_INDIV
- ASM_GROUP
optional:
- ASM_INDIV
- ASM_GROUP
1 change: 0 additions & 1 deletion config/cypress.yml
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,6 @@ version_config:
code: "854901"
codeSystem: "2.16.840.1.113883.6.88"
CMSQRDA3SchematronValidator_warnings:
- "The 2027 CMS EC QRDA Category III submission rules haven't been finalized yet"
CMSQRDA1HQRSchematronValidator_warnings:

# Configuration for values to use when randomizing patients in test decks
Expand Down
2 changes: 1 addition & 1 deletion lib/cypress/api_measure_evaluator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,7 @@ def calcuate_cat3(product_test_id, bundle_id)
end
options = { provider: pt.patients.first.providers.first, submission_program: cat3_submission_program,
start_time: pt.start_date, end_time: pt.end_date, ry2025_submission: pt.bundle.major_version == '2024',
ry2026_submission: pt.bundle.major_version == '2025' }
ry2026_submission: pt.bundle.major_version == '2025', ry2027_submission: pt.bundle.major_version == '2026' }
# To pass C3 tests, all populations and supplemental codes need to be reported
xml = Qrda3.new(cloned_pt.send(:expected_results_with_all_supplemental_codes), pt.measures, options).render

Expand Down
1 change: 1 addition & 0 deletions lib/validators/program_criteria_validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ def find_entered_value(entered_value, checked_criteria)
'PCF APM Entity Identifier' => "//cda:participant/cda:associatedEntity/cda:id[@extension='#{entered_value}' and @root='2.16.840.1.113883.3.249.5.3']",
'MVP Code' => "//cda:participant[@typeCode='TRC']/cda:associatedEntity[@classCode='PROG']/cda:id[@extension='#{entered_value}' and @root='2.16.840.1.113883.3.249.5.6']",
'SSP PI Reporting' => "//cda:participant[@typeCode='IND']/cda:associatedEntity[@classCode='PROG']/cda:id[@extension='#{entered_value}' and @root='2.16.840.1.113883.3.249.5.7']",
'ASM Cohort' => "//cda:participant[@typeCode='IND']/cda:associatedEntity[@classCode='PROG']/cda:id[@extension='#{entered_value}' and @root='2.16.840.1.113883.3.249.5.8']",
'MIPS APM Entity Identifier' => "//cda:documentationOf/cda:serviceEvent/cda:performer/cda:assignedEntity/cda:representedOrganization/cda:id[@extension='#{entered_value}' and @root='2.16.840.1.113883.3.249.5.4']",
'MCP APM Entity Identifier' => "//cda:documentationOf/cda:serviceEvent/cda:performer/cda:assignedEntity/cda:representedOrganization/cda:id[@extension='#{entered_value}' and @root='2.16.840.1.113883.3.249.5.4']",
'MIPS Subgroup Identifier' => "//cda:documentationOf/cda:serviceEvent/cda:performer/cda:assignedEntity/cda:representedOrganization/cda:id[@extension='#{entered_value}' and @root='2.16.840.1.113883.3.249.5.5']",
Expand Down
Loading
Loading