Skip to content

Commit

Permalink
Merge pull request #1441 from CMSgov/feature/QPPSE-2054-Update_CehrtID
Browse files Browse the repository at this point in the history
QPPSE-2054: Update CEHRT ID to support only 15C format
  • Loading branch information
sivaksb authored Jun 4, 2024
2 parents 13af31f + 4f30348 commit a6dd7ec
Show file tree
Hide file tree
Showing 14 changed files with 17 additions and 2,367 deletions.
2 changes: 1 addition & 1 deletion ERROR_MESSAGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ Any text in the following format `(Example)` are considered variables to be fill
* 94 : CT - The denominator exclusion id `(denexUuid)` for measure `(measure id)` has a count value that is greater than the denominator. The Denominator exclusion cannot be a greater value than the denominator.
* 95 : CT - The Clinical Document must contain one Category Section v5 with the extension 2020-12-01
* 96 : CT - The APM to TIN/NPI Combination file is missing.
* 97 : CT - `(Program name)` QRDA-III Submissions require a valid CMS EHR Certification ID (Valid Formats: XX15EXXXXXXXXXX, XX15CXXXXXXXXXX)
* 97 : CT - `(Program name)` QRDA-III Submissions require a valid CMS EHR Certification ID (Valid Formats: XX15CXXXXXXXXXX)
* 98 : CT - The performance rate cannot have a value of 0 and must be of value Null Attribute (NA).
* 100 : CT - More than one CMS EHR Certification ID was found. Please submit with only one CMS EHR Certification id.
* 101 : CT - Denominator count must be equal to Initial Population count for `(Program name)` measure population `(measure population id)`.Please see the Table 15 of `(Submission year's)` Implementation Guide for valid measure GUIDs: https://ecqi.healthit.gov/sites/default/files/2024-CMS-QRDA-III-EC-IG-v1.1-508.pdf#page=43
Expand Down
2 changes: 1 addition & 1 deletion commandline/src/test/resources/valid-QRDA-III-latest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ CDA Header
<id root="2.16.840.1.113883.3.249.5.1"
extension="AR000000"
assigningAuthorityName="CMS-CMMI"/>
<id root="2.16.840.1.113883.3.2074.1" extension="XX15EXXXXXXXXXX"/>
<id root="2.16.840.1.113883.3.2074.1" extension="XX15CXXXXXXXXXX"/>
<code code="394730007"
displayName="healthcare related organization"
codeSystem="2.16.840.1.113883.6.96"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ public enum ProblemCode implements LocalizedProblem {
+ "denominator. The Denominator exclusion cannot be a greater value than the denominator.", true),
MEASURE_SECTION_V5_REQUIRES_CATEGORY_SECTION(95, "The Clinical Document must contain one Category Section v5 with the extension 2020-12-01"),
MISSING_API_TIN_NPI_FILE(96, "The APM to TIN/NPI Combination file is missing."),
PCF_MISSING_CEHRT_ID(97, "`(Program name)` QRDA-III Submissions require a valid CMS EHR Certification ID (Valid Formats: XX15EXXXXXXXXXX, XX15CXXXXXXXXXX)", true),
PCF_MISSING_CEHRT_ID(97, "`(Program name)` QRDA-III Submissions require a valid CMS EHR Certification ID (Valid Formats: XX15CXXXXXXXXXX)", true),
PCF_ZERO_PERFORMANCE_RATE(98, "The performance rate cannot have a value of 0 and must be of value Null Attribute (NA)."),
PCF_DUPLICATE_CEHRT(100, "More than one CMS EHR Certification ID was found. Please submit with only one CMS EHR Certification id."),
PCF_DENOMINATOR_COUNT_INVALID(101, "Denominator count must be equal to Initial Population count for `(Program name)` measure population `(measure population id)`."
Expand Down
4 changes: 2 additions & 2 deletions commons/src/main/resources/measures-data.json
Original file line number Diff line number Diff line change
Expand Up @@ -12709,7 +12709,7 @@
"administrativeClaims"
],
"measureSpecification": {
"default": "https://qpp.cms.gov/docs/cost_specifications/2023-12-05-mif-ebcm-chron-copd.pdf"
"default": "https://qpp.cms.gov/docs/cost_specifications/2023-12-05-mif-ebcm-ip-copd.pdf"
},
"allowedPrograms": [
"mips",
Expand Down Expand Up @@ -12920,7 +12920,7 @@
"administrativeClaims"
],
"measureSpecification": {
"default": "https://qpp.cms.gov/docs/cost_specifications/2023-12-05-mif-ebcm-ip-copd.pdf"
"default": "https://qpp.cms.gov/docs/cost_specifications/2023-12-05-mif-ebcm-chron-copd.pdf"
},
"allowedPrograms": [
"mips",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ private void validateCehrtId(Node node, String programName) {
}

private boolean cehrtFormat(String requiredSubstring) {
return requiredSubstring.equalsIgnoreCase("15E") || requiredSubstring.equalsIgnoreCase("15C");
return requiredSubstring.equalsIgnoreCase("15C");
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,8 @@ class PiSectionRoundTripTest {

private static final Path PI_RESTRICTED_MEASURES =
Paths.get("src/test/resources/negative/mipsInvalidPIMeasureIds.xml");
private static final Path APP1_APM_ENTITY_CEHRT1 =
Paths.get("src/test/resources/app/2024/App1-ApmEntity-Qrda-III-1.xml");
private static final Path APP1_APM_ENTITY_CEHRT2 =
Paths.get("src/test/resources/app/2024/App1-ApmEntity-Qrda-III-2.xml");
private static final Path APP1_APM_ENTITY_CEHRT =
Paths.get("src/test/resources/app/2024/App1-ApmEntity-Qrda-III.xml");
private static final Path APP1_GROUP_CEHRT =
Paths.get("src/test/resources/app/2024/App1-Group-QRDA-III.xml");
private static final Path APP1_INDIVIDUAL_CEHRT =
Expand Down Expand Up @@ -191,7 +189,7 @@ void testPiSectionRestrictedMeasures() {

@Test
void testAppApmCehrtIsEncoded() {
Converter converter = new Converter(new PathSource(APP1_APM_ENTITY_CEHRT1));
Converter converter = new Converter(new PathSource(APP1_APM_ENTITY_CEHRT));
AllErrors errors = null;
List<Detail> warnings = null;
JsonWrapper qppWrapper = null;
Expand All @@ -209,29 +207,6 @@ void testAppApmCehrtIsEncoded() {
assertThat(warnings).isNull();
List<String> cehrtIdList = JsonHelper.readJsonAtJsonPath(qppWrapper.toString(),
"$.measurementSets[?(@.category=='pi')].cehrtId", new TypeRef<List<String>>() { });
assertThat(cehrtIdList.get(0)).isEqualTo("XX15EXXXXXXXXXX");
}

@Test
void testNewCehrtIDValidation() {
Converter converter = new Converter(new PathSource(APP1_APM_ENTITY_CEHRT2));
AllErrors errors = null;
List<Detail> warnings = null;
JsonWrapper qppWrapper = null;


List<Detail> details = new ArrayList<>();
try {
qppWrapper = converter.transform();
} catch (TransformException failure) {
errors = failure.getDetails();
warnings = failure.getConversionReport().getWarnings();
}

assertThat(errors).isNull();
assertThat(warnings).isNull();
List<String> cehrtIdList = JsonHelper.readJsonAtJsonPath(qppWrapper.toString(),
"$.measurementSets[?(@.category=='pi')].cehrtId", new TypeRef<List<String>>() { });
assertThat(cehrtIdList.get(0)).isEqualTo("XX15CXXXXXXXXXX");
}

Expand All @@ -255,7 +230,7 @@ void testAppGroupCehrtIsEncoded() {
assertThat(warnings).isNull();
List<String> cehrtIdList = JsonHelper.readJsonAtJsonPath(qppWrapper.toString(),
"$.measurementSets[?(@.category=='pi')].cehrtId", new TypeRef<List<String>>() { });
assertThat(cehrtIdList.get(0)).isEqualTo("XX15EXXXXXXXXXX");
assertThat(cehrtIdList.get(0)).isEqualTo("XX15CXXXXXXXXXX");
}

@Test
Expand All @@ -278,7 +253,7 @@ void testAppIndividualCehrtIsEncoded() {
assertThat(warnings).isNull();
List<String> cehrtIdList = JsonHelper.readJsonAtJsonPath(qppWrapper.toString(),
"$.measurementSets[?(@.category=='pi')].cehrtId", new TypeRef<List<String>>() { });
assertThat(cehrtIdList.get(0)).isEqualTo("XX15EXXXXXXXXXX");
assertThat(cehrtIdList.get(0)).isEqualTo("XX15CXXXXXXXXXX");
}

private void assertAciSectionHasSingleQedNode(Node aciSectionNode) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ private Node createPcfClinicalDocumentNodeOnly() {
clinicalDocumentNode.putValue(ClinicalDocumentDecoder.PCF_ENTITY_ID, "DogCow");
clinicalDocumentNode.putValue(ClinicalDocumentDecoder.TAX_PAYER_IDENTIFICATION_NUMBER, "123456789");
clinicalDocumentNode.putValue(ClinicalDocumentDecoder.NATIONAL_PROVIDER_IDENTIFIER, "9900000099");
clinicalDocumentNode.putValue(ClinicalDocumentDecoder.CEHRT, "XX15EXXXXXXXXXX");
clinicalDocumentNode.putValue(ClinicalDocumentDecoder.CEHRT, "XX15CXXXXXXXXXX");

return clinicalDocumentNode;
}
Expand Down
Loading

0 comments on commit a6dd7ec

Please sign in to comment.