From a6c2bef22930ca120269ddcf63428ee46cc8c962 Mon Sep 17 00:00:00 2001 From: Justin McKelvy <60718638+Capt-Mac@users.noreply.github.com> Date: Thu, 8 Feb 2024 11:31:56 -0700 Subject: [PATCH] 5654 measurescorer bug for denominator exception (#5677) * update measure bundles and tests for enforced populationId specification on Measure group resources * bump CR version to PRE17 * fix bug in versionEnumTest * Update hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5654-measurescorer-bug.yaml Co-authored-by: Tadgh --------- Co-authored-by: Tadgh --- .../test/java/ca/uhn/fhir/util/VersionEnumTest.java | 2 +- .../changelog/7_0_0/5654-measurescorer-bug.yaml | 5 +++++ .../src/test/resources/BCSEHEDISMY2022-bundle.json | 6 ++++++ .../ColorectalCancerScreeningsFHIR-bundle.json | 2 +- .../test/resources/Exm104FhirR4MeasureBundle.json | 13 +++++++++---- .../resources/largeValueSetMeasureTest-Bundle.json | 3 +++ .../multiversion/EXM124-7.0.000-bundle.json | 8 ++++++++ .../multiversion/EXM124-9.0.000-bundle.json | 8 ++++++++ pom.xml | 2 +- 9 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5654-measurescorer-bug.yaml diff --git a/hapi-fhir-base/src/test/java/ca/uhn/fhir/util/VersionEnumTest.java b/hapi-fhir-base/src/test/java/ca/uhn/fhir/util/VersionEnumTest.java index b0d8c5bf8a4..7e965b6b4fc 100644 --- a/hapi-fhir-base/src/test/java/ca/uhn/fhir/util/VersionEnumTest.java +++ b/hapi-fhir-base/src/test/java/ca/uhn/fhir/util/VersionEnumTest.java @@ -29,7 +29,7 @@ public class VersionEnumTest { int minor = Integer.parseInt(parts[1]); int patch = Integer.parseInt(parts[2]); - if (major >= 6 && minor >= 3) { + if ((major == 6 && minor >= 3) || (major >= 7)) { if (minor % 2 == 1) { patch = 0; } diff --git a/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5654-measurescorer-bug.yaml b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5654-measurescorer-bug.yaml new file mode 100644 index 00000000000..d922fa2e95c --- /dev/null +++ b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5654-measurescorer-bug.yaml @@ -0,0 +1,5 @@ +type: fix +issue: 5654 +title: "Fixed a MeasureReport measureScoring bug impacting any measures currently using denominator-exception population will +incorrectly calculate the score without following specification. This bug adds an extension to MeasureReport Groups to capture calculated denominator and +numerator to bring transparency to the measureScore calculation and act as a dataSource of measureScore instead of behind the scenes calculations." diff --git a/hapi-fhir-storage-cr/src/test/resources/BCSEHEDISMY2022-bundle.json b/hapi-fhir-storage-cr/src/test/resources/BCSEHEDISMY2022-bundle.json index 59ac27f84f0..0666c3df416 100644 --- a/hapi-fhir-storage-cr/src/test/resources/BCSEHEDISMY2022-bundle.json +++ b/hapi-fhir-storage-cr/src/test/resources/BCSEHEDISMY2022-bundle.json @@ -1843,6 +1843,7 @@ "guidance": "* For Medicare plans, I-SNP and LTI exclusions are not included in the measure calculation logic and need to be programmed manually. Administrative data must be used for these exclusions.\n*Non-administrative data may be used for the frailty and advanced illness exclusion.\n

**Allocation:**
The member was enrolled with a medical benefit throughout the Participation Period.

No more than one gap in enrollment of up to 45 days for each full calendar year of the Participation Period (i.e., the Measurement Period and the year prior to the Measurement Period).

No gaps in enrollment are allowed from October 1 two years prior to the Measurement Period through December 31 two years prior to the Measurement Period.

**Reporting:**
For Medicare plans, the SES stratifications are mutually exclusive. NCQA calculates a total rate for Medicare plans by adding all six Medicare stratifications.

SES and product line stratifications are not included in the measure calculation logic and need to be programmed manually.

**Stratification:**
1. Commercial.\n2. Medicaid.\n3. Medicare: Non-LIS/DE, Nondisability.\n4. Medicare: LIS/DE.\n5. Medicare: Disability\n6. Medicare: LIS/DE and Disability.\n7. Medicare: Other.\n8. Medicare: Unknown.

", "group": [ { "population": [ { + "id": "initial-population", "code": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/measure-population", @@ -1856,6 +1857,7 @@ "expression": "Initial Population" } }, { + "id": "denominator", "code": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/measure-population", @@ -1869,6 +1871,7 @@ "expression": "Denominator" } }, { + "id": "denominator-exclusion", "code": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/measure-population", @@ -1882,6 +1885,7 @@ "expression": "Exclusions" } }, { + "id": "numerator", "code": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/measure-population", @@ -1897,6 +1901,7 @@ } ] } ], "supplementalData": [ { + "id": "Enrolled-During-Participation-Period", "code": { "text": "Enrolled During Participation Period" }, @@ -1911,6 +1916,7 @@ "expression": "Enrolled During Participation Period" } }, { + "id": "participation-period", "code": { "text": "Participation Period" }, diff --git a/hapi-fhir-storage-cr/src/test/resources/ColorectalCancerScreeningsFHIR-bundle.json b/hapi-fhir-storage-cr/src/test/resources/ColorectalCancerScreeningsFHIR-bundle.json index 87864f5254d..b48340e557e 100644 --- a/hapi-fhir-storage-cr/src/test/resources/ColorectalCancerScreeningsFHIR-bundle.json +++ b/hapi-fhir-storage-cr/src/test/resources/ColorectalCancerScreeningsFHIR-bundle.json @@ -147712,7 +147712,7 @@ } ], "library": [ - "http://ecqi.healthit.gov/ecqms/Library/ColorectalCancerScreeningsFHIR|0.0.001" + "http://ecqi.healthit.gov/ecqms/Library/ColorectalCancerScreeningsFHIR" ], "disclaimer": "The performance Measure is not a clinical guideline and does not establish a standard of medical care, and has not been tested for all potential applications. THE MEASURE AND SPECIFICATIONS ARE PROVIDED \"AS IS\" WITHOUT WARRANTY OF ANY KIND.\n \nDue to technical limitations, registered trademarks are indicated by (R) or [R] and unregistered trademarks are indicated by (TM) or [TM].", "scoring": { diff --git a/hapi-fhir-storage-cr/src/test/resources/Exm104FhirR4MeasureBundle.json b/hapi-fhir-storage-cr/src/test/resources/Exm104FhirR4MeasureBundle.json index 2768880210d..96f35977412 100644 --- a/hapi-fhir-storage-cr/src/test/resources/Exm104FhirR4MeasureBundle.json +++ b/hapi-fhir-storage-cr/src/test/resources/Exm104FhirR4MeasureBundle.json @@ -140,7 +140,7 @@ } ], "library": [ - "http://localhost:8080/fhir/Library/library-EXM104|8.2.000" + "http://localhost:8080/fhir/Library/EXM104|8.2.000" ], "disclaimer": "These performance measures are not clinical guidelines and do not establish a standard of medical care, and have not been tested for all potential applications. The measures and specifications are provided without warranty.", "scoring": { @@ -177,6 +177,7 @@ "id": "group-1", "population": [ { + "id": "initial-population", "code": { "coding": [ { @@ -192,6 +193,7 @@ } }, { + "id": "numerator", "code": { "coding": [ { @@ -207,6 +209,7 @@ } }, { + "id": "denominator", "code": { "coding": [ { @@ -222,6 +225,7 @@ } }, { + "id": "denominator-exclusion", "code": { "coding": [ { @@ -237,6 +241,7 @@ } }, { + "id": "denominator-exception", "code": { "coding": [ { @@ -341,7 +346,7 @@ { "resource": { "resourceType": "Library", - "id": "library-EXM104", + "id": "EXM104", "extension": [ { "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-softwaresystem", @@ -350,7 +355,7 @@ } } ], - "url": "http://localhost:8080/fhir/Library/library-EXM104", + "url": "http://localhost:8080/fhir/Library/EXM104", "version": "8.2.000", "name": "library-EXM104", "status": "active", @@ -600,7 +605,7 @@ }, "request": { "method": "PUT", - "url": "Library/library-EXM104" + "url": "Library/EXM104" } }, { diff --git a/hapi-fhir-storage-cr/src/test/resources/largeValueSetMeasureTest-Bundle.json b/hapi-fhir-storage-cr/src/test/resources/largeValueSetMeasureTest-Bundle.json index a4785ce2534..1e20e8e31df 100644 --- a/hapi-fhir-storage-cr/src/test/resources/largeValueSetMeasureTest-Bundle.json +++ b/hapi-fhir-storage-cr/src/test/resources/largeValueSetMeasureTest-Bundle.json @@ -1377,6 +1377,7 @@ "id": "group-1", "population": [ { + "id": "initial-population", "code": { "coding": [ { @@ -1392,6 +1393,7 @@ } }, { + "id": "denominator", "code": { "coding": [ { @@ -1407,6 +1409,7 @@ } }, { + "id": "numerator", "code": { "coding": [ { diff --git a/hapi-fhir-storage-cr/src/test/resources/multiversion/EXM124-7.0.000-bundle.json b/hapi-fhir-storage-cr/src/test/resources/multiversion/EXM124-7.0.000-bundle.json index 65b48a37b9e..e33706679ef 100644 --- a/hapi-fhir-storage-cr/src/test/resources/multiversion/EXM124-7.0.000-bundle.json +++ b/hapi-fhir-storage-cr/src/test/resources/multiversion/EXM124-7.0.000-bundle.json @@ -1372,6 +1372,7 @@ "id": "group-1", "population": [ { + "id": "initial-population", "code": { "coding": [ { @@ -1387,6 +1388,7 @@ } }, { + "id": "numerator", "code": { "coding": [ { @@ -1402,6 +1404,7 @@ } }, { + "id": "denominator", "code": { "coding": [ { @@ -1417,6 +1420,7 @@ } }, { + "id": "denominator-exclusion", "code": { "coding": [ { @@ -1436,6 +1440,7 @@ ], "supplementalData": [ { + "id": "sde-ethnicity", "code": { "text": "sde-ethnicity" }, @@ -1455,6 +1460,7 @@ } }, { + "id": "sde-payer", "code": { "text": "sde-payer" }, @@ -1474,6 +1480,7 @@ } }, { + "id": "sde-race", "code": { "text": "sde-race" }, @@ -1493,6 +1500,7 @@ } }, { + "id": "sde-sex", "code": { "text": "sde-sex" }, diff --git a/hapi-fhir-storage-cr/src/test/resources/multiversion/EXM124-9.0.000-bundle.json b/hapi-fhir-storage-cr/src/test/resources/multiversion/EXM124-9.0.000-bundle.json index afec4ed9ae9..1e940988fd5 100644 --- a/hapi-fhir-storage-cr/src/test/resources/multiversion/EXM124-9.0.000-bundle.json +++ b/hapi-fhir-storage-cr/src/test/resources/multiversion/EXM124-9.0.000-bundle.json @@ -1372,6 +1372,7 @@ "id": "group-1", "population": [ { + "id": "initial-population", "code": { "coding": [ { @@ -1387,6 +1388,7 @@ } }, { + "id": "numerator", "code": { "coding": [ { @@ -1402,6 +1404,7 @@ } }, { + "id": "denominator", "code": { "coding": [ { @@ -1417,6 +1420,7 @@ } }, { + "id": "denominator-exclusion", "code": { "coding": [ { @@ -1436,6 +1440,7 @@ ], "supplementalData": [ { + "id": "sde-ethnicity", "code": { "text": "sde-ethnicity" }, @@ -1455,6 +1460,7 @@ } }, { + "id": "sde-payer", "code": { "text": "sde-payer" }, @@ -1474,6 +1480,7 @@ } }, { + "id": "sde-race", "code": { "text": "sde-race" }, @@ -1493,6 +1500,7 @@ } }, { + "id": "sde-sex", "code": { "text": "sde-sex" }, diff --git a/pom.xml b/pom.xml index 8e9a0f2c814..ad97d8a54f4 100644 --- a/pom.xml +++ b/pom.xml @@ -993,7 +993,7 @@ 1.0.8 - 3.0.0-PRE15 + 3.0.0-PRE17 5.4.1