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}