Skip to content

Commit 1ab48de

Browse files
Merge pull request #1539 from CMSgov/QPPA-10470
QPPA-10470: support appPlus program submission
2 parents 9ec89e8 + 62b7641 commit 1ab48de

File tree

5 files changed

+60
-20
lines changed

5 files changed

+60
-20
lines changed

converter/src/main/java/gov/cms/qpp/conversion/decode/ClinicalDocumentDecoder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,15 +246,15 @@ private Pair<String, String> getProgramNameEntityPair(String name) {
246246
break;
247247

248248
case APP_PLUS_INDIVIDUAL:
249-
pair = new ImmutablePair<>(APP_PLUS_INDIVIDUAL, ENTITY_INDIVIDUAL);
249+
pair = new ImmutablePair<>(APP_PLUS_PROGRAM_NAME, ENTITY_INDIVIDUAL);
250250
break;
251251

252252
case APP_PLUS_GROUP:
253-
pair = new ImmutablePair<>(APP_PLUS_GROUP, ENTITY_GROUP);
253+
pair = new ImmutablePair<>(APP_PLUS_PROGRAM_NAME, ENTITY_GROUP);
254254
break;
255255

256256
case APP_PLUS_APM:
257-
pair = new ImmutablePair<>(APP_PLUS_APM, ENTITY_APM);
257+
pair = new ImmutablePair<>(APP_PLUS_PROGRAM_NAME, ENTITY_APM);
258258
break;
259259

260260
case SSP_PI_INDIVIDUAL:

converter/src/main/java/gov/cms/qpp/conversion/encode/ClinicalDocumentEncoder.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private void encodeToplevel(JsonWrapper wrapper, Node thisNode) {
7979
wrapper.put(ENTITY_ID, thisNode.getValue(ENTITY_ID));
8080
}
8181

82-
if ((Program.isApp(thisNode) || Program.isMips(thisNode))
82+
if ((Program.isApp(thisNode) || Program.isMips(thisNode) || Program.isAppPlus(thisNode))
8383
&& ENTITY_APM.equalsIgnoreCase(entityType)) {
8484
wrapper.put(ENTITY_ID, thisNode.getValue(ENTITY_ID));
8585
}
@@ -118,7 +118,7 @@ private JsonWrapper encodeMeasurementSets(
118118
Node currentNode
119119
) {
120120
JsonWrapper measurementSetsWrapper = new JsonWrapper();
121-
JsonWrapper childWrapper;
121+
String measureRoot = TemplateId.MEASURE_SECTION_V5.getRoot();
122122

123123
for (Node child : childMapByTemplateId.values()) {
124124
if (child == null) {
@@ -133,23 +133,31 @@ private JsonWrapper encodeMeasurementSets(
133133
}
134134

135135
try {
136-
childWrapper = new JsonWrapper();
136+
JsonWrapper childWrapper = new JsonWrapper();
137137
sectionEncoder.encode(childWrapper, child);
138138
childWrapper.put("source", "qrda3");
139139

140-
String mvpId = currentNode.getValue(MVP_ID);
141-
if (TemplateId.MEASURE_SECTION_V5.getRoot().equalsIgnoreCase(childType.getRoot())
142-
&& !StringUtils.isEmpty(mvpId)) {
143-
childWrapper.put(PROGRAM_NAME, mvpId);
144-
}
145-
else if (TemplateId.MEASURE_SECTION_V5.getRoot().equalsIgnoreCase(childType.getRoot())
146-
&& MIPS_APM.equalsIgnoreCase(
147-
currentNode.getValue(RAW_PROGRAM_NAME))) {
148-
childWrapper.put(PROGRAM_NAME, MIPS.toLowerCase(Locale.getDefault()));
149-
} else if (TemplateId.MEASURE_SECTION_V5.getRoot().equalsIgnoreCase(childType.getRoot())
150-
&& APP_APM.equalsIgnoreCase(
151-
currentNode.getValue(RAW_PROGRAM_NAME))) {
152-
childWrapper.put(PROGRAM_NAME, APP_PROGRAM_NAME.toLowerCase(Locale.getDefault()));
140+
if (measureRoot.equalsIgnoreCase(childType.getRoot())) {
141+
String mvpId = currentNode.getValue(MVP_ID);
142+
if (!StringUtils.isEmpty(mvpId)) {
143+
childWrapper.put(PROGRAM_NAME, mvpId);
144+
} else {
145+
String raw = currentNode.getValue(RAW_PROGRAM_NAME);
146+
String key = (raw != null ? raw.toUpperCase(Locale.ROOT) : "");
147+
148+
switch (key) {
149+
case MIPS_APM:
150+
childWrapper.put(PROGRAM_NAME,
151+
MIPS.toLowerCase(Locale.getDefault()));
152+
break;
153+
case APP_APM:
154+
childWrapper.put(PROGRAM_NAME,
155+
APP_PROGRAM_NAME.toLowerCase(Locale.getDefault()));
156+
break;
157+
default:
158+
// no matching program
159+
}
160+
}
153161
}
154162

155163
measurementSetsWrapper.put(childWrapper);

converter/src/main/java/gov/cms/qpp/conversion/model/Program.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public enum Program {
1616
MIPS("MIPS_GROUP", "MIPS_INDIV", "MIPS_VIRTUALGROUP", "MIPS", "MIPS_APMENTITY", "MIPS_SUBGROUP"),
1717
PCF("PCF"),
1818
APP("MIPS_APP1_INDIV", "MIPS_APP1_GROUP", "MIPS_APP1_APMENTITY"),
19+
APP_PLUS("APP_PLUS_INDIV", "APP_PLUS_GROUP", "APP_PLUS_APMENTITY"),
1920
ALL;
2021

2122
private final Set<String> aliases;
@@ -59,6 +60,16 @@ public static boolean isApp(Node node) {
5960
return extractProgram(node) == Program.APP;
6061
}
6162

63+
/**
64+
* Checks if a node is using the appPlus program
65+
*
66+
* @param node
67+
* @return
68+
*/
69+
public static boolean isAppPlus(Node node) {
70+
return extractProgram(node) == Program.APP_PLUS;
71+
}
72+
6273
/**
6374
* Extracts a program type from a node
6475
*

converter/src/main/java/gov/cms/qpp/conversion/validate/ClinicalDocumentValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ protected void performValidation(final Node node) {
5353
String entityType = Optional.ofNullable(node.getValue(ENTITY_TYPE)).orElse("<missing>");
5454

5555
forceCheckErrors(node).valueIn(ProblemCode.CLINICAL_DOCUMENT_INCORRECT_PROGRAM_NAME.format(VALID_PROGRAM_NAMES, programName),
56-
PROGRAM_NAME, MIPS_PROGRAM_NAME, PCF, APP_PROGRAM_NAME);
56+
PROGRAM_NAME, MIPS_PROGRAM_NAME, PCF, APP_PROGRAM_NAME, APP_PLUS_PROGRAM_NAME);
5757

5858
if (ENTITY_VIRTUAL_GROUP.equals(entityType)) {
5959
forceCheckErrors(node).value(ProblemCode.VIRTUAL_GROUP_ID_REQUIRED, ENTITY_ID);

converter/src/test/java/gov/cms/qpp/conversion/model/ProgramTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,27 @@ void testSetOfProgramNames() {
115115
assertThat(actual).containsAtLeastElementsIn(expected);
116116
}
117117

118+
@Test
119+
void testIsAppPlusIndividualIsTrue() {
120+
Node node = new Node();
121+
node.putValue(RAW_PROGRAM_NAME, "APP_PLUS_INDIV");
122+
assertThat(Program.isAppPlus(node)).isTrue();
123+
}
124+
125+
@Test
126+
void testIsAppPlusGroupIsTrue() {
127+
Node node = new Node();
128+
node.putValue(RAW_PROGRAM_NAME, "APP_PLUS_GROUP");
129+
assertThat(Program.isAppPlus(node)).isTrue();
130+
}
131+
132+
@Test
133+
void testIsAppPlusAppEntityIsTrue() {
134+
Node node = new Node();
135+
node.putValue(RAW_PROGRAM_NAME, "APP_PLUS_APMENTITY");
136+
assertThat(Program.isAppPlus(node)).isTrue();
137+
}
138+
118139
@Override
119140
public Class<? extends Enum<?>> getEnumType() {
120141
return Program.class;

0 commit comments

Comments
 (0)