Skip to content

Commit

Permalink
Merge pull request #1382 from CMSgov/feature/QPPSE-911_2023-PCF-Update
Browse files Browse the repository at this point in the history
[QPPSE-911] 2023 PCF Update
  • Loading branch information
saquino0827 committed Nov 22, 2023
2 parents 198dc15 + 3a57593 commit 87a0f18
Show file tree
Hide file tree
Showing 151 changed files with 761,363 additions and 3,169 deletions.
4 changes: 2 additions & 2 deletions ERROR_MESSAGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,5 +89,5 @@ Any text in the following format `(Example)` are considered variables to be fill
* 103 : CT - PCF Submissions must have the `(PCF Measure minimum)` following measures: `(Listing of valid measure ids)`
* 105 : CT - If multiple TINs/NPIs are submitted, each must be reported within a separate performer
* 106 : CT - PI submissions are not allowed within PCF
* 107 : CT - NPI/TIN Warning: NPI/TIN `(npi)`-`(tin)` was active on the PCF practitioner roster for `(apm)` during the performance year but was not found in the file. Please ensure your submission contains all NPI/TIN combinations that were active on your roster at any point during the performance year. Your QRDA III file and/or roster may require updates. Note: The QPP website does not have access to roster updates made after December 2, 2022. It is therefore critical that you ensure your roster is up to date and your QRDA III file contains all NPI/TIN values that were active on your roster during the performance year. Instructions on how to update your roster are available in the PCF Practice Management Guide, available on PCF Connect (https://app.innovation.cms.gov/CMMIConnect/IDMLogin).
* 108 : CT - NPI/TIN Warning: NPI/TIN `(npi)`-`(tin)` was reported in the file but does not exist at the practice or was not active on the PCF practitioner roster for `(apm)` during the performance year. Please ensure your submission only contains NPI/TIN combinations that were active on your roster at any point during the performance year. Your QRDA III file and/or roster may require updates. Note: The QPP website does not have access to roster updates made after December 2, 2022. It is therefore critical that you ensure your roster is up to date and your QRDA III file contains all NPI/TIN values that were active on your roster during the performance year. Instructions on how to update your roster are available in the PCF Practice Management Guide, available on PCF Connect (https://app.innovation.cms.gov/CMMIConnect/IDMLogin).
* 107 : CT - NPI/TIN Warning: Missing NPI/TIN Combination Identified. NPI/TIN `(npi)`-`(tin)` was active on the PCF practitioner roster for `(apm)` during the performance year but was not found in the file. Please ensure your submission contains all NPI/TIN combinations that were active on your roster at any point during the performance year. Your QRDA III file and/or roster may require updates. Note: The QPP website does not have access to roster updates made after December 1, 2023. It is therefore critical that you ensure your roster is up to date and your QRDA III file contains all NPI/TIN values that were active on your roster during the performance year. Please contact your health IT vendor if your QRDA III file requires updates. Instructions on how to update your roster are available in the PCF Practice Management Guide (https://cmmi.my.salesforce.com/sfc/p/#i0000000iryR/a/t00000028RsP/dMF_romOmf5VLe7p5lUj8vch11mPmELP6ZuyI16vS.Y).
* 108 : CT - NPI/TIN Warning: Unexpected NPI/TIN Combination Found. NPI/TIN `(npi)`-`(tin)` was reported in the file but does not exist at the practice or was not active on the PCF practitioner roster for `(apm)` during the performance year. Please ensure your submission only contains NPI/TIN combinations that were active on your roster at any point during the performance year. Your QRDA III file and/or roster may require updates. Note: The QPP website does not have access to roster updates made after December 1, 2023. It is therefore critical that you ensure your roster is up to date and your QRDA III file contains all NPI/TIN values that were active on your roster during the performance year. Please contact your health IT vendor if your QRDA III file requires updates. Instructions on how to update your roster are available in the PCF Practice Management Guide (https://cmmi.my.salesforce.com/sfc/p/#i0000000iryR/a/t00000028RsP/dMF_romOmf5VLe7p5lUj8vch11mPmELP6ZuyI16vS.Y).
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,11 @@ public enum ProblemCode implements LocalizedProblem {
+ "Here is a link to the IG section on identifiers: " + DocumentationReference.IDENTIFIERS),
PCF_CLINICAL_DOCUMENT_INVALID_APM(63, "The Alternative Payment Model (APM) Entity Identifier is not valid. "
+ " Here is a link to the IG section on identifiers: " + DocumentationReference.IDENTIFIERS),
PCF_PLUS_MISSING_SUPPLEMENTAL_CODE(66, "Missing the `(Supplemental Type)` - `(Type Qualification)` supplemental data for code "
PCF_MISSING_SUPPLEMENTAL_CODE(66, "Missing the `(Supplemental Type)` - `(Type Qualification)` supplemental data for code "
+ "`(Supplemental Data Code)` for the measure id `(Measure Id)`'s Sub-population `(Sub Population)`", true),
PCF_PLUS_SUPPLEMENTAL_DATA_MISSING_COUNT(67, "Must have one count for Supplemental Data `(Supplemental Data Code)` "
PCF_SUPPLEMENTAL_DATA_MISSING_COUNT(67, "Must have one count for Supplemental Data `(Supplemental Data Code)` "
+ "on Sub-population `(Sub Population)` for the measure id `(Measure Id)`", true),
PCF_PLUS_SUBMISSION_ENDED(68, "Your `(Program name)` submission was made after the `(Program name)` Measure section submission deadline of "
PCF_SUBMISSION_ENDED(68, "Your `(Program name)` submission was made after the `(Program name)` Measure section submission deadline of "
+ "`(Submission end date)`. Your `(Program name)` QRDA III file has not been processed. Please contact `(Program name)` Support at "
+ "`(PCF+ contact email)` for assistance.", true),
INVALID_PERFORMANCE_PERIOD_FORMAT(69, "`(Performance period start or end date)` is an invalid date format. "
Expand Down Expand Up @@ -199,18 +199,20 @@ public enum ProblemCode implements LocalizedProblem {
PCF_MULTI_TIN_NPI_SINGLE_PERFORMER(105, "If multiple TINs/NPIs are submitted, each must be reported within a separate performer"),
PCF_NO_PI(106, "PI submissions are not allowed within PCF"),
PCF_MISSING_COMBINATION(107,
"NPI/TIN Warning: NPI/TIN `(npi)`-`(tin)` was active on the PCF practitioner roster for `(apm)` during the performance year but was not found in the file. "
"NPI/TIN Warning: Missing NPI/TIN Combination Identified. NPI/TIN `(npi)`-`(tin)` was active on the PCF practitioner roster for `(apm)` during the performance year but was not found in the file. "
+ "Please ensure your submission contains all NPI/TIN combinations that were active on your roster at any point during the performance year. "
+ "Your QRDA III file and/or roster may require updates. Note: The QPP website does not have access to roster updates made after December 2, 2022. "
+ "Your QRDA III file and/or roster may require updates. Note: The QPP website does not have access to roster updates made after December 1, 2023. "
+ "It is therefore critical that you ensure your roster is up to date and your QRDA III file contains all NPI/TIN values that were active on your roster during the performance year. "
+ "Instructions on how to update your roster are available in the PCF Practice Management Guide, available on PCF Connect (https://app.innovation.cms.gov/CMMIConnect/IDMLogin).",
+ "Please contact your health IT vendor if your QRDA III file requires updates. "
+ "Instructions on how to update your roster are available in the PCF Practice Management Guide (https://cmmi.my.salesforce.com/sfc/p/#i0000000iryR/a/t00000028RsP/dMF_romOmf5VLe7p5lUj8vch11mPmELP6ZuyI16vS.Y).",
true),
PCF_INVALID_COMBINATION(108,
"NPI/TIN Warning: NPI/TIN `(npi)`-`(tin)` was reported in the file but does not exist at the practice or was not active on the PCF practitioner roster for `(apm)` during the performance year. "
"NPI/TIN Warning: Unexpected NPI/TIN Combination Found. NPI/TIN `(npi)`-`(tin)` was reported in the file but does not exist at the practice or was not active on the PCF practitioner roster for `(apm)` during the performance year. "
+ "Please ensure your submission only contains NPI/TIN combinations that were active on your roster at any point during the performance year. "
+ "Your QRDA III file and/or roster may require updates. Note: The QPP website does not have access to roster updates made after December 2, 2022. "
+ "Your QRDA III file and/or roster may require updates. Note: The QPP website does not have access to roster updates made after December 1, 2023. "
+ "It is therefore critical that you ensure your roster is up to date and your QRDA III file contains all NPI/TIN values that were active on your roster during the performance year. "
+ "Instructions on how to update your roster are available in the PCF Practice Management Guide, available on PCF Connect (https://app.innovation.cms.gov/CMMIConnect/IDMLogin).",
+ "Please contact your health IT vendor if your QRDA III file requires updates. "
+ "Instructions on how to update your roster are available in the PCF Practice Management Guide (https://cmmi.my.salesforce.com/sfc/p/#i0000000iryR/a/t00000028RsP/dMF_romOmf5VLe7p5lUj8vch11mPmELP6ZuyI16vS.Y).",
true);

private static final Map<Integer, ProblemCode> CODE_TO_VALUE = Arrays.stream(values())
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");
return requiredSubstring.equalsIgnoreCase("15E") || requiredSubstring.equalsIgnoreCase("15C");
}

/**
Expand All @@ -205,7 +205,7 @@ private void validateSubmissionDate(Node node) {
String formatted = endDate.format(OUTPUT_END_DATE_FORMAT);
String program = node.getValue(ClinicalDocumentDecoder.PROGRAM_NAME);
addError(Detail.forProblemAndNode(
ProblemCode.PCF_PLUS_SUBMISSION_ENDED.format(program, program, formatted, program, program,
ProblemCode.PCF_SUBMISSION_ENDED.format(program, program, formatted, program, program,
EnvironmentHelper.getOrDefault(CPC_PLUS_CONTACT_EMAIL, DEFAULT_CPC_PLUS_CONTACT_EMAIL)),
node));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ private Predicate<Node> filterDataBySupplementalCode(String code) {
*/
private void addSupplementalValidationError(Node node, SupplementalData supplementalData, String measureId) {
LocalizedProblem error =
ProblemCode.PCF_PLUS_MISSING_SUPPLEMENTAL_CODE.format(
ProblemCode.PCF_MISSING_SUPPLEMENTAL_CODE.format(
supplementalData.getType(), supplementalData, supplementalData.getCode(),
measureId, node.getValue(MeasureDataDecoder.MEASURE_TYPE));
addError(Detail.forProblemAndNode(error, node));
Expand All @@ -126,7 +126,7 @@ private void addSupplementalValidationError(Node node, SupplementalData suppleme
* @return initialized {@link LocalizedProblem}
*/
private LocalizedProblem makeIncorrectCountSizeLocalizedError(Node node, String supplementalCode, String measureId) {
return ProblemCode.PCF_PLUS_SUPPLEMENTAL_DATA_MISSING_COUNT.format(
return ProblemCode.PCF_SUPPLEMENTAL_DATA_MISSING_COUNT.format(
supplementalCode, node.getValue(MeasureDataDecoder.MEASURE_TYPE),
measureId);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@
public class PcfQualityMeasureSectionValidator extends NodeValidator {

static final String[] PCF_REQUIRED_MEASURES = {
"2c928082-74c2-3313-0174-c60bd07b02a6", // 122v10
"2c928082-74c2-3313-0174-daf39f2c0658", // 130v10
"2c928082-7505-caf9-0175-2382d1bd06b1" // 165v10
"2c928085-7b2a-eb52-017b-56761e0218d0", // 122v11
"2c928083-7ace-2267-017b-11fbb9c913c4", // 130v11
"2c928082-7a14-d92c-017a-67b6f9971ea8" // 165v11
};

static final String[] PCF_MEASURE_IDS = {
"122v10",
"130v10",
"165v10"
"122v11",
"130v11",
"165v11"
};

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ public class NegativePcfRoundTripTest {
ApmEntityIds apmEntityIds;

static final String[] PCF_MEASURE_IDS = {
"122v10",
"130v10",
"165v10"
"122v11",
"130v11",
"165v11"
};

@BeforeEach
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
import static com.google.common.truth.Truth.assertThat;
import static gov.cms.qpp.acceptance.Util.getXml;

public class Pcf2022AcceptanceTest {
private static final Path BASE = Paths.get("src/test/resources/pcf/acceptance2022");
public class Pcf2023AcceptanceTest {
private static final Path BASE = Paths.get("src/test/resources/pcf/acceptance2023");
private static final Path SUCCESS = BASE.resolve("success");
private static final Path SUCCESS_WARNING = BASE.resolve("warning");
private static final Path FAILURE = BASE.resolve("failure");
Expand All @@ -42,16 +42,6 @@ static Stream<Path> successWithWarningsData() {
return getXml(SUCCESS_WARNING);
}

@BeforeAll
static void setUpCustomMeasureData() {
MeasureConfigs.setMeasureDataFile("test-2022-measure-data.json");
}

@AfterAll
static void resetMeasuresData() {
MeasureConfigs.setMeasureDataFile(MeasureConfigs.DEFAULT_MEASURE_DATA_FILE_NAME);
}

@ParameterizedTest
@MethodSource("failureData")
void testPcfFileFailures(Path entry) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ public class PcfRoundTripTest {
@SuppressWarnings("unchecked")
@BeforeAll
static void setup() throws URISyntaxException, IOException {
MeasureConfigs.setMeasureDataFile("test-2022-measure-data.json");
ApmEntityIds apmEntityIds = new ApmEntityIds("test_apm_entity_ids.json", "test_pcf_apm_entity_ids.json");
URL sample = PcfRoundTripTest.class.getClassLoader()
.getResource("pcf/success/PCF_Sample_QRDA-III.xml");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ void testFailureSupplementalDataMissingCountTest() throws Exception {
Node underTest = placeholder.findFirstNode(TemplateId.MEASURE_DATA_CMS_V4);
List<Detail> errors = validator.validateSingleNode(underTest).getErrors();

LocalizedProblem expectedError = ProblemCode.PCF_PLUS_SUPPLEMENTAL_DATA_MISSING_COUNT.format(
LocalizedProblem expectedError = ProblemCode.PCF_SUPPLEMENTAL_DATA_MISSING_COUNT.format(
SupplementalData.MALE.getCode(), SubPopulationLabel.IPOP.name(), MEASURE_ID);

assertThat(errors).comparingElementsUsing(DetailsErrorEquals.INSTANCE)
Expand Down Expand Up @@ -115,7 +115,7 @@ private Consumer<SupplementalData> supplementalDataCheck(final String scenarioFi
Node underTest = placeholder.findFirstNode(TemplateId.MEASURE_DATA_CMS_V4);
List<Detail> errors = validator.validateSingleNode(underTest).getErrors();

LocalizedProblem expectedError = ProblemCode.PCF_PLUS_MISSING_SUPPLEMENTAL_CODE
LocalizedProblem expectedError = ProblemCode.PCF_MISSING_SUPPLEMENTAL_CODE
.format(supplementalData.getType(), supplementalData, supplementalData.getCode(),
MEASURE_ID, SubPopulationLabel.IPOP.name());

Expand Down
Loading

0 comments on commit 87a0f18

Please sign in to comment.