001/*- 002 * #%L 003 * Smile CDR - CDR 004 * %% 005 * Copyright (C) 2016 - 2025 Smile CDR, Inc. 006 * %% 007 * All rights reserved. 008 * #L% 009 */ 010package ca.cdr.api.pub.hl7v2.common.abstraction; 011 012import ca.uhn.hl7v2.HL7Exception; 013import ca.uhn.hl7v2.model.AbstractMessage; 014import ca.uhn.hl7v2.model.Group; 015import ca.uhn.hl7v2.model.v25.group.ADT_A01_INSURANCE; 016import ca.uhn.hl7v2.model.v25.group.ADT_A01_PROCEDURE; 017import ca.uhn.hl7v2.model.v25.group.ADT_A03_INSURANCE; 018import ca.uhn.hl7v2.model.v25.group.ADT_A03_PROCEDURE; 019import ca.uhn.hl7v2.model.v25.group.ADT_A05_INSURANCE; 020import ca.uhn.hl7v2.model.v25.group.ADT_A05_PROCEDURE; 021import ca.uhn.hl7v2.model.v25.group.ADT_A06_INSURANCE; 022import ca.uhn.hl7v2.model.v25.group.ADT_A06_PROCEDURE; 023import ca.uhn.hl7v2.model.v25.group.BAR_P12_PROCEDURE; 024import ca.uhn.hl7v2.model.v25.group.DFT_P03_INSURANCE; 025import ca.uhn.hl7v2.model.v25.group.OMG_O19_INSURANCE; 026import ca.uhn.hl7v2.model.v25.group.OMG_O19_ORDER; 027import ca.uhn.hl7v2.model.v25.group.ORM_O01_INSURANCE; 028import ca.uhn.hl7v2.model.v25.group.ORM_O01_ORDER; 029import ca.uhn.hl7v2.model.v25.message.ADT_A01; 030import ca.uhn.hl7v2.model.v25.message.ADT_A02; 031import ca.uhn.hl7v2.model.v25.message.ADT_A03; 032import ca.uhn.hl7v2.model.v25.message.ADT_A05; 033import ca.uhn.hl7v2.model.v25.message.ADT_A06; 034import ca.uhn.hl7v2.model.v25.message.ADT_A09; 035import ca.uhn.hl7v2.model.v25.message.ADT_A12; 036import ca.uhn.hl7v2.model.v25.message.ADT_A15; 037import ca.uhn.hl7v2.model.v25.message.ADT_A17; 038import ca.uhn.hl7v2.model.v25.message.ADT_A21; 039import ca.uhn.hl7v2.model.v25.message.ADT_A24; 040import ca.uhn.hl7v2.model.v25.message.ADT_A30; 041import ca.uhn.hl7v2.model.v25.message.ADT_A38; 042import ca.uhn.hl7v2.model.v25.message.ADT_A39; 043import ca.uhn.hl7v2.model.v25.message.ADT_A45; 044import ca.uhn.hl7v2.model.v25.message.ADT_A60; 045import ca.uhn.hl7v2.model.v25.message.BAR_P12; 046import ca.uhn.hl7v2.model.v25.message.DFT_P03; 047import ca.uhn.hl7v2.model.v25.message.MDM_T01; 048import ca.uhn.hl7v2.model.v25.message.MDM_T02; 049import ca.uhn.hl7v2.model.v25.message.OMG_O19; 050import ca.uhn.hl7v2.model.v25.message.ORM_O01; 051import ca.uhn.hl7v2.model.v25.message.ORU_R01; 052import ca.uhn.hl7v2.model.v25.message.RAS_O17; 053import ca.uhn.hl7v2.model.v25.message.RDE_O11; 054import ca.uhn.hl7v2.model.v25.message.VXU_V04; 055import ca.uhn.hl7v2.model.v25.segment.DG1; 056import ca.uhn.hl7v2.model.v25.segment.IN1; 057import ca.uhn.hl7v2.model.v25.segment.IN2; 058import ca.uhn.hl7v2.model.v25.segment.PR1; 059import ca.uhn.hl7v2.model.v25.segment.PV1; 060import ca.uhn.hl7v2.model.v25.segment.PV2; 061 062import java.util.ArrayList; 063import java.util.List; 064import java.util.function.Function; 065import java.util.stream.Collectors; 066 067/** 068 * Wraps the relevant portion of an HL7 V2 message to an {@link IVisitMessage} 069 */ 070public class VisitMessageFactory { 071 072 public IVisitMessage asVisitMessage(AbstractMessage theMsg) throws HL7Exception { 073 if (theMsg instanceof ADT_A01) { 074 return asVisitMessage((ADT_A01) theMsg); 075 } else if (theMsg instanceof ADT_A02) { 076 return asVisitMessage((ADT_A02) theMsg); 077 } else if (theMsg instanceof ADT_A03) { 078 return asVisitMessage((ADT_A03) theMsg); 079 } else if (theMsg instanceof ADT_A05) { 080 return asVisitMessage((ADT_A05) theMsg); 081 } else if (theMsg instanceof ADT_A06) { 082 return asVisitMessage((ADT_A06) theMsg); 083 } else if (theMsg instanceof ADT_A09) { 084 return asVisitMessage((ADT_A09) theMsg); 085 } else if (theMsg instanceof ADT_A12) { 086 return asVisitMessage((ADT_A12) theMsg); 087 } else if (theMsg instanceof ADT_A15) { 088 return asVisitMessage((ADT_A15) theMsg); 089 } else if (theMsg instanceof ADT_A17) { 090 return asVisitMessage((ADT_A17) theMsg); 091 } else if (theMsg instanceof ADT_A21) { 092 return asVisitMessage((ADT_A21) theMsg); 093 } else if (theMsg instanceof ADT_A24) { 094 return asVisitMessage((ADT_A24) theMsg); 095 } else if (theMsg instanceof ADT_A30) { 096 return asVisitMessage((ADT_A30) theMsg); 097 } else if (theMsg instanceof ADT_A38) { 098 return asVisitMessage((ADT_A38) theMsg); 099 } else if (theMsg instanceof ADT_A39) { 100 return asVisitMessage((ADT_A39) theMsg); 101 } else if (theMsg instanceof ADT_A45) { 102 return asVisitMessage((ADT_A45) theMsg); 103 } else if (theMsg instanceof ADT_A60) { 104 return asVisitMessage((ADT_A60) theMsg); 105 } else if (theMsg instanceof DFT_P03) { 106 return asVisitMessage((DFT_P03) theMsg); 107 } else if (theMsg instanceof OMG_O19) { 108 return asVisitMessage((OMG_O19) theMsg); 109 } else if (theMsg instanceof ORM_O01) { 110 return asVisitMessage((ORM_O01) theMsg); 111 } else if (theMsg instanceof ORU_R01) { 112 return asVisitMessage((ORU_R01) theMsg); 113 } else if (theMsg instanceof RAS_O17) { 114 return asVisitMessage((RAS_O17) theMsg); 115 } else if (theMsg instanceof RDE_O11) { 116 return asVisitMessage((RDE_O11) theMsg); 117 } else if (theMsg instanceof VXU_V04) { 118 return asVisitMessage((VXU_V04) theMsg); 119 } else if (theMsg instanceof BAR_P12) { 120 return asVisitMessage((BAR_P12) theMsg); 121 } else if (theMsg instanceof MDM_T01) { 122 return asVisitMessage((MDM_T01) theMsg); 123 } else if (theMsg instanceof MDM_T02) { 124 return asVisitMessage((MDM_T02) theMsg); 125 } else { 126 return null; 127 } 128 } 129 130 private VisitMessage getDefaultVisitMessageAndSetPV1PV2(PV1 thePv1, PV2 thePv2) { 131 return new VisitMessage() 132 .setPV1(thePv1) 133 .setPV2(thePv2) 134 .setDG1(null, null) 135 .setROL(null, null) 136 .setGT1(null) 137 .setOBX(null); 138 } 139 140 private <T> List<IVisitMessage.IVisitMessageInsurance> getInsurances( 141 List<T> theInsurances, Function<T, IN1> theIn1Function, Function<T, IN2> theIn2Function) { 142 return theInsurances.stream() 143 .map(t -> new VisitMessageInsurance<>(t, theIn1Function, theIn2Function)) 144 .collect(Collectors.toList()); 145 } 146 147 private <T> List<IVisitMessage.IVisitMessageProcedure> getProcedures( 148 List<T> theProcedures, Function<T, PR1> thePr1Function) { 149 return theProcedures.stream() 150 .map(t -> new VisitMessageProcedure((Group) t, thePr1Function)) 151 .collect(Collectors.toList()); 152 } 153 154 private IVisitMessage asVisitMessage(ADT_A39 theMsg) { 155 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPATIENT().getPV1(), null); 156 } 157 158 private IVisitMessage asVisitMessage(ADT_A60 theMsg) { 159 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()); 160 } 161 162 private IVisitMessage asVisitMessage(ADT_A15 theMsg) { 163 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()); 164 } 165 166 private IVisitMessage asVisitMessage(DFT_P03 theMsg) throws HL7Exception { 167 VisitMessage visitMessage = getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 168 .setDG1(theMsg.getDG1All(), () -> theMsg.insertDG1(theMsg.getDG1Reps())) 169 .setGT1(theMsg.getGT1All()); 170 171 List<IVisitMessage.IVisitMessageInsurance> insurances = 172 getInsurances(theMsg.getINSURANCEAll(), DFT_P03_INSURANCE::getIN1, DFT_P03_INSURANCE::getIN2); 173 visitMessage.setInsurances( 174 insurances, 175 () -> new VisitMessageInsurance<>( 176 theMsg.insertINSURANCE(theMsg.getINSURANCEReps()), 177 DFT_P03_INSURANCE::getIN1, 178 DFT_P03_INSURANCE::getIN2)); 179 return visitMessage; 180 } 181 182 private IVisitMessage asVisitMessage(ORU_R01 theMsg) { 183 return getDefaultVisitMessageAndSetPV1PV2( 184 theMsg.getPATIENT_RESULT().getPATIENT().getVISIT().getPV1(), 185 theMsg.getPATIENT_RESULT().getPATIENT().getVISIT().getPV2()); 186 } 187 188 private IVisitMessage asVisitMessage(RAS_O17 theMsg) { 189 return getDefaultVisitMessageAndSetPV1PV2( 190 theMsg.getPATIENT().getPATIENT_VISIT().getPV1(), 191 theMsg.getPATIENT().getPATIENT_VISIT().getPV2()); 192 } 193 194 private IVisitMessage asVisitMessage(RDE_O11 theMsg) { 195 return getDefaultVisitMessageAndSetPV1PV2( 196 theMsg.getPATIENT().getPATIENT_VISIT().getPV1(), 197 theMsg.getPATIENT().getPATIENT_VISIT().getPV2()); 198 } 199 200 private IVisitMessage asVisitMessage(ADT_A01 theMsg) throws HL7Exception { 201 VisitMessage visitMessage = getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 202 .setDG1(theMsg.getDG1All(), () -> theMsg.insertDG1(theMsg.getDG1Reps())) 203 .setROL(theMsg.getROL2All(), () -> theMsg.insertROL2(theMsg.getROL2Reps())) 204 .setAL1(theMsg.getAL1All(), () -> theMsg.insertAL1(theMsg.getAL1Reps())) 205 .setGT1(theMsg.getGT1All()) 206 .setOBX(theMsg.getOBXAll()); 207 208 List<IVisitMessage.IVisitMessageProcedure> procedures = 209 getProcedures(theMsg.getPROCEDUREAll(), ADT_A01_PROCEDURE::getPR1); 210 visitMessage.setProcedures( 211 procedures, 212 () -> new VisitMessageProcedure<>( 213 theMsg.insertPROCEDURE(theMsg.getPROCEDUREReps()), ADT_A01_PROCEDURE::getPR1)); 214 215 List<IVisitMessage.IVisitMessageInsurance> insurances = 216 getInsurances(theMsg.getINSURANCEAll(), ADT_A01_INSURANCE::getIN1, ADT_A01_INSURANCE::getIN2); 217 visitMessage.setInsurances( 218 insurances, 219 () -> new VisitMessageInsurance<>( 220 theMsg.insertINSURANCE(theMsg.getINSURANCEReps()), 221 ADT_A01_INSURANCE::getIN1, 222 ADT_A01_INSURANCE::getIN2)); 223 224 return visitMessage; 225 } 226 227 private IVisitMessage asVisitMessage(ADT_A02 theMsg) throws HL7Exception { 228 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 229 .setROL(theMsg.getROL2All(), () -> theMsg.insertROL2(theMsg.getROL2Reps())) 230 .setOBX(theMsg.getOBXAll()); 231 } 232 233 private IVisitMessage asVisitMessage(ADT_A03 theMsg) throws HL7Exception { 234 VisitMessage visitMessage = getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 235 .setDG1(theMsg.getDG1All(), () -> theMsg.insertDG1(theMsg.getDG1Reps())) 236 .setROL(theMsg.getROL2All(), () -> theMsg.insertROL2(theMsg.getROL2Reps())) 237 .setAL1(theMsg.getAL1All(), () -> theMsg.insertAL1(theMsg.getAL1Reps())) 238 .setGT1(theMsg.getGT1All()) 239 .setOBX(theMsg.getOBXAll()); 240 241 List<IVisitMessage.IVisitMessageProcedure> procedures = 242 getProcedures(theMsg.getPROCEDUREAll(), ADT_A03_PROCEDURE::getPR1); 243 visitMessage.setProcedures( 244 procedures, 245 () -> new VisitMessageProcedure<>( 246 theMsg.insertPROCEDURE(theMsg.getPROCEDUREReps()), ADT_A03_PROCEDURE::getPR1)); 247 248 List<IVisitMessage.IVisitMessageInsurance> insurances = 249 getInsurances(theMsg.getINSURANCEAll(), ADT_A03_INSURANCE::getIN1, ADT_A03_INSURANCE::getIN2); 250 visitMessage.setInsurances( 251 insurances, 252 () -> new VisitMessageInsurance<>( 253 theMsg.insertINSURANCE(theMsg.getINSURANCEReps()), 254 ADT_A03_INSURANCE::getIN1, 255 ADT_A03_INSURANCE::getIN2)); 256 257 return visitMessage; 258 } 259 260 private IVisitMessage asVisitMessage(ADT_A05 theMsg) throws HL7Exception { 261 VisitMessage visitMessage = getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 262 .setDG1(theMsg.getDG1All(), () -> theMsg.insertDG1(theMsg.getDG1Reps())) 263 .setROL(theMsg.getROL2All(), () -> theMsg.insertROL2(theMsg.getROL2Reps())) 264 .setAL1(theMsg.getAL1All(), () -> theMsg.insertAL1(theMsg.getAL1Reps())) 265 .setGT1(theMsg.getGT1All()) 266 .setOBX(theMsg.getOBXAll()); 267 268 List<IVisitMessage.IVisitMessageProcedure> procedures = 269 getProcedures(theMsg.getPROCEDUREAll(), ADT_A05_PROCEDURE::getPR1); 270 visitMessage.setProcedures( 271 procedures, 272 () -> new VisitMessageProcedure<>( 273 theMsg.insertPROCEDURE(theMsg.getPROCEDUREReps()), ADT_A05_PROCEDURE::getPR1)); 274 275 List<IVisitMessage.IVisitMessageInsurance> insurances = 276 getInsurances(theMsg.getINSURANCEAll(), ADT_A05_INSURANCE::getIN1, ADT_A05_INSURANCE::getIN2); 277 visitMessage.setInsurances( 278 insurances, 279 () -> new VisitMessageInsurance<>( 280 theMsg.insertINSURANCE(theMsg.getINSURANCEReps()), 281 ADT_A05_INSURANCE::getIN1, 282 ADT_A05_INSURANCE::getIN2)); 283 284 return visitMessage; 285 } 286 287 private IVisitMessage asVisitMessage(ADT_A06 theMsg) throws HL7Exception { 288 VisitMessage visitMessage = getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 289 .setDG1(theMsg.getDG1All(), () -> theMsg.insertDG1(theMsg.getDG1Reps())) 290 .setROL(theMsg.getROL2All(), () -> theMsg.insertROL2(theMsg.getROL2Reps())) 291 .setAL1(theMsg.getAL1All(), () -> theMsg.insertAL1(theMsg.getAL1Reps())) 292 .setGT1(theMsg.getGT1All()) 293 .setOBX(theMsg.getOBXAll()); 294 295 List<IVisitMessage.IVisitMessageProcedure> procedures = 296 getProcedures(theMsg.getPROCEDUREAll(), ADT_A06_PROCEDURE::getPR1); 297 visitMessage.setProcedures( 298 procedures, 299 () -> new VisitMessageProcedure<>( 300 theMsg.insertPROCEDURE(theMsg.getPROCEDUREReps()), ADT_A06_PROCEDURE::getPR1)); 301 302 List<IVisitMessage.IVisitMessageInsurance> insurances = 303 getInsurances(theMsg.getINSURANCEAll(), ADT_A06_INSURANCE::getIN1, ADT_A06_INSURANCE::getIN2); 304 visitMessage.setInsurances( 305 insurances, 306 () -> new VisitMessageInsurance<>( 307 theMsg.insertINSURANCE(theMsg.getINSURANCEReps()), 308 ADT_A06_INSURANCE::getIN1, 309 ADT_A06_INSURANCE::getIN2)); 310 return visitMessage; 311 } 312 313 private IVisitMessage asVisitMessage(ADT_A09 theMsg) throws HL7Exception { 314 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 315 .setDG1(theMsg.getDG1All(), () -> theMsg.insertDG1(theMsg.getDG1Reps())) 316 .setOBX(theMsg.getOBXAll()); 317 } 318 319 private IVisitMessage asVisitMessage(ADT_A12 theMsg) throws HL7Exception { 320 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 321 .setOBX(theMsg.getOBXAll()); 322 } 323 324 private IVisitMessage asVisitMessage(ADT_A17 theMsg) throws HL7Exception { 325 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 326 .setOBX(theMsg.getOBXAll()); 327 } 328 329 private IVisitMessage asVisitMessage(ADT_A21 theMsg) throws HL7Exception { 330 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 331 .setOBX(theMsg.getOBXAll()); 332 } 333 334 private IVisitMessage asVisitMessage(ADT_A38 theMsg) throws HL7Exception { 335 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), theMsg.getPV2()) 336 .setDG1(theMsg.getDG1All(), () -> theMsg.insertDG1(theMsg.getDG1Reps())) 337 .setOBX(theMsg.getOBXAll()); 338 } 339 340 private IVisitMessage asVisitMessage(ADT_A45 theMsg) { 341 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getMERGE_INFO().getPV1(), null); 342 } 343 344 @SuppressWarnings("unused") 345 private IVisitMessage asVisitMessage(ADT_A30 theMsg) { 346 return getDefaultVisitMessageAndSetPV1PV2(null, null); 347 } 348 349 private IVisitMessage asVisitMessage(ADT_A24 theMsg) { 350 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), null); 351 } 352 353 private IVisitMessage asVisitMessage(VXU_V04 theMsg) { 354 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPATIENT().getPV1(), null); 355 } 356 357 private IVisitMessage asVisitMessage(ORM_O01 theMsg) throws HL7Exception { 358 List<DG1> dg1List = new ArrayList<>(); 359 for (ORM_O01_ORDER nextOrder : theMsg.getORDERAll()) { 360 dg1List.addAll(nextOrder.getORDER_DETAIL().getDG1All()); 361 } 362 363 VisitMessage visitMessage = getDefaultVisitMessageAndSetPV1PV2( 364 theMsg.getPATIENT().getPATIENT_VISIT().getPV1(), 365 theMsg.getPATIENT().getPATIENT_VISIT().getPV2()) 366 .setDG1(dg1List, null); 367 368 List<IVisitMessage.IVisitMessageInsurance> insurances = getInsurances( 369 theMsg.getPATIENT().getINSURANCEAll(), ORM_O01_INSURANCE::getIN1, ORM_O01_INSURANCE::getIN2); 370 visitMessage.setInsurances( 371 insurances, 372 () -> new VisitMessageInsurance<>( 373 theMsg.getPATIENT().insertINSURANCE(theMsg.getPATIENT().getINSURANCEReps()), 374 ORM_O01_INSURANCE::getIN1, 375 ORM_O01_INSURANCE::getIN2)); 376 377 return visitMessage; 378 } 379 380 private IVisitMessage asVisitMessage(OMG_O19 theMsg) throws HL7Exception { 381 List<DG1> dg1List = new ArrayList<>(); 382 for (OMG_O19_ORDER nextOrder : theMsg.getORDERAll()) { 383 dg1List.addAll(nextOrder.getDG1All()); 384 } 385 386 VisitMessage visitMessage = getDefaultVisitMessageAndSetPV1PV2( 387 theMsg.getPATIENT().getPATIENT_VISIT().getPV1(), 388 theMsg.getPATIENT().getPATIENT_VISIT().getPV2()) 389 .setDG1(dg1List, null); 390 391 List<IVisitMessage.IVisitMessageInsurance> insurances = getInsurances( 392 theMsg.getPATIENT().getINSURANCEAll(), OMG_O19_INSURANCE::getIN1, OMG_O19_INSURANCE::getIN2); 393 visitMessage.setInsurances( 394 insurances, 395 () -> new VisitMessageInsurance<>( 396 theMsg.getPATIENT().insertINSURANCE(theMsg.getPATIENT().getINSURANCEReps()), 397 OMG_O19_INSURANCE::getIN1, 398 OMG_O19_INSURANCE::getIN2)); 399 400 return visitMessage; 401 } 402 403 private IVisitMessage asVisitMessage(BAR_P12 theMsg) throws HL7Exception { 404 VisitMessage visitMessage = getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), null) 405 .setDG1(theMsg.getDG1All(), () -> theMsg.insertDG1(theMsg.getDG1Reps())); 406 407 List<IVisitMessage.IVisitMessageProcedure> procedures = 408 getProcedures(theMsg.getPROCEDUREAll(), BAR_P12_PROCEDURE::getPR1); 409 visitMessage.setProcedures( 410 procedures, 411 () -> new VisitMessageProcedure<>( 412 theMsg.insertPROCEDURE(theMsg.getPROCEDUREReps()), BAR_P12_PROCEDURE::getPR1)); 413 414 return visitMessage; 415 } 416 417 private IVisitMessage asVisitMessage(MDM_T01 theMsg) { 418 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), null); 419 } 420 421 private IVisitMessage asVisitMessage(MDM_T02 theMsg) { 422 return getDefaultVisitMessageAndSetPV1PV2(theMsg.getPV1(), null); 423 } 424}