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.v25.message.ADT_A01;
015import ca.uhn.hl7v2.model.v25.message.ADT_A02;
016import ca.uhn.hl7v2.model.v25.message.ADT_A03;
017import ca.uhn.hl7v2.model.v25.message.ADT_A05;
018import ca.uhn.hl7v2.model.v25.message.ADT_A06;
019import ca.uhn.hl7v2.model.v25.message.ADT_A09;
020import ca.uhn.hl7v2.model.v25.message.ADT_A12;
021import ca.uhn.hl7v2.model.v25.message.ADT_A15;
022import ca.uhn.hl7v2.model.v25.message.ADT_A17;
023import ca.uhn.hl7v2.model.v25.message.ADT_A21;
024import ca.uhn.hl7v2.model.v25.message.ADT_A24;
025import ca.uhn.hl7v2.model.v25.message.ADT_A30;
026import ca.uhn.hl7v2.model.v25.message.ADT_A38;
027import ca.uhn.hl7v2.model.v25.message.ADT_A39;
028import ca.uhn.hl7v2.model.v25.message.ADT_A45;
029import ca.uhn.hl7v2.model.v25.message.ADT_A60;
030import ca.uhn.hl7v2.model.v25.message.BAR_P12;
031import ca.uhn.hl7v2.model.v25.message.DFT_P03;
032import ca.uhn.hl7v2.model.v25.message.MDM_T01;
033import ca.uhn.hl7v2.model.v25.message.MDM_T02;
034import ca.uhn.hl7v2.model.v25.message.OMG_O19;
035import ca.uhn.hl7v2.model.v25.message.ORM_O01;
036import ca.uhn.hl7v2.model.v25.message.ORU_R01;
037import ca.uhn.hl7v2.model.v25.message.RAS_O17;
038import ca.uhn.hl7v2.model.v25.message.RDE_O11;
039import ca.uhn.hl7v2.model.v25.message.VXU_V04;
040
041/**
042 * Wraps the relevant portion of an HL7 V2 message to an {@link IPatientMessage}
043 */
044public class PatientMessageFactory {
045
046        public IPatientMessage asPatientMessage(AbstractMessage theMsg) throws HL7Exception {
047                if (theMsg instanceof ADT_A01 msg) {
048                        return asPatientMessage(msg);
049                } else if (theMsg instanceof ADT_A02 msg) {
050                        return asPatientMessage(msg);
051                } else if (theMsg instanceof ADT_A03 msg) {
052                        return asPatientMessage(msg);
053                } else if (theMsg instanceof ADT_A05 msg) {
054                        return asPatientMessage(msg);
055                } else if (theMsg instanceof ADT_A06 msg) {
056                        return asPatientMessage(msg);
057                } else if (theMsg instanceof ADT_A09 msg) {
058                        return asPatientMessage(msg);
059                } else if (theMsg instanceof ADT_A12 msg) {
060                        return asPatientMessage(msg);
061                } else if (theMsg instanceof ADT_A15 msg) {
062                        return asPatientMessage(msg);
063                } else if (theMsg instanceof ADT_A17 msg) {
064                        return asPatientMessage(msg);
065                } else if (theMsg instanceof ADT_A21 msg) {
066                        return asPatientMessage(msg);
067                } else if (theMsg instanceof ADT_A24 msg) {
068                        return asPatientMessage(msg);
069                } else if (theMsg instanceof ADT_A30 msg) {
070                        return asPatientMessage(msg);
071                } else if (theMsg instanceof ADT_A38 msg) {
072                        return asPatientMessage(msg);
073                } else if (theMsg instanceof ADT_A39 msg) {
074                        return asPatientMessage(msg);
075                } else if (theMsg instanceof ADT_A45 msg) {
076                        return asPatientMessage(msg);
077                } else if (theMsg instanceof ADT_A60 msg) {
078                        return asPatientMessage(msg);
079                } else if (theMsg instanceof DFT_P03 msg) {
080                        return asPatientMessage(msg);
081                } else if (theMsg instanceof OMG_O19 msg) {
082                        return asPatientMessage(msg);
083                } else if (theMsg instanceof ORM_O01 msg) {
084                        return asPatientMessage(msg);
085                } else if (theMsg instanceof ORU_R01 msg) {
086                        return asPatientMessage(msg);
087                } else if (theMsg instanceof RAS_O17 msg) {
088                        return asPatientMessage(msg);
089                } else if (theMsg instanceof RDE_O11 msg) {
090                        return asPatientMessage(msg);
091                } else if (theMsg instanceof VXU_V04 msg) {
092                        return asPatientMessage(msg);
093                } else if (theMsg instanceof BAR_P12 msg) {
094                        return asPatientMessage(msg);
095                } else if (theMsg instanceof MDM_T01 msg) {
096                        return asPatientMessage(msg);
097                } else if (theMsg instanceof MDM_T02 msg) {
098                        return asPatientMessage(msg);
099                } else {
100                        return null;
101                }
102        }
103
104        private IPatientMessage asPatientMessage(DFT_P03 theMsg) throws HL7Exception {
105                return new PatientMessage()
106                                .setPID(theMsg.getPID())
107                                .setPD1(theMsg.getPD1())
108                                .setIAM(null)
109                                .setNK1(null, null)
110                                .setROL(theMsg.getROLAll(), () -> theMsg.insertROL(theMsg.getROLReps()));
111        }
112
113        private IPatientMessage asPatientMessage(ORU_R01 theMsg) throws HL7Exception {
114                return new PatientMessage()
115                                .setPID(theMsg.getPATIENT_RESULT().getPATIENT().getPID())
116                                .setPD1(theMsg.getPATIENT_RESULT().getPATIENT().getPD1())
117                                .setIAM(null)
118                                .setNK1(theMsg.getPATIENT_RESULT().getPATIENT().getNK1All(), () -> theMsg.getPATIENT_RESULT()
119                                                .getPATIENT()
120                                                .insertNK1(theMsg.getPATIENT_RESULT().getPATIENT().getNK1Reps()))
121                                .setROL(null, null);
122        }
123
124        private IPatientMessage asPatientMessage(RAS_O17 theMsg) {
125                return new PatientMessage()
126                                .setPID(theMsg.getPATIENT().getPID())
127                                .setPD1(theMsg.getPATIENT().getPD1())
128                                .setIAM(null)
129                                .setNK1(null, null)
130                                .setROL(null, null);
131        }
132
133        private IPatientMessage asPatientMessage(RDE_O11 theMsg) {
134                return new PatientMessage()
135                                .setPID(theMsg.getPATIENT().getPID())
136                                .setPD1(theMsg.getPATIENT().getPD1())
137                                .setIAM(null)
138                                .setNK1(null, null)
139                                .setROL(null, null);
140        }
141
142        private IPatientMessage asPatientMessage(ADT_A01 theMsg) throws HL7Exception {
143                return new PatientMessage()
144                                .setPID(theMsg.getPID())
145                                .setPD1(theMsg.getPD1())
146                                .setIAM(null)
147                                .setNK1(theMsg.getNK1All(), () -> theMsg.insertNK1(theMsg.getNK1Reps()))
148                                .setROL(theMsg.getROLAll(), () -> theMsg.insertROL(theMsg.getROLReps()));
149        }
150
151        private IPatientMessage asPatientMessage(ADT_A02 theMsg) throws HL7Exception {
152                return new PatientMessage()
153                                .setPID(theMsg.getPID())
154                                .setPD1(theMsg.getPD1())
155                                .setIAM(null)
156                                .setNK1(null, null)
157                                .setROL(theMsg.getROLAll(), () -> theMsg.insertROL(theMsg.getROLReps()));
158        }
159
160        private IPatientMessage asPatientMessage(ADT_A03 theMsg) throws HL7Exception {
161                return new PatientMessage()
162                                .setPID(theMsg.getPID())
163                                .setPD1(theMsg.getPD1())
164                                .setIAM(null)
165                                .setNK1(theMsg.getNK1All(), () -> theMsg.insertNK1(theMsg.getNK1Reps()))
166                                .setROL(theMsg.getROLAll(), () -> theMsg.insertROL(theMsg.getROLReps()));
167        }
168
169        private IPatientMessage asPatientMessage(ADT_A05 theMsg) throws HL7Exception {
170                return new PatientMessage()
171                                .setPID(theMsg.getPID())
172                                .setPD1(theMsg.getPD1())
173                                .setIAM(null)
174                                .setNK1(theMsg.getNK1All(), () -> theMsg.insertNK1(theMsg.getNK1Reps()))
175                                .setROL(theMsg.getROLAll(), () -> theMsg.insertROL(theMsg.getROLReps()));
176        }
177
178        private IPatientMessage asPatientMessage(ADT_A06 theMsg) throws HL7Exception {
179                return new PatientMessage()
180                                .setPID(theMsg.getPID())
181                                .setPD1(theMsg.getPD1())
182                                .setIAM(null)
183                                .setNK1(theMsg.getNK1All(), () -> theMsg.insertNK1(theMsg.getNK1Reps()))
184                                .setROL(theMsg.getROLAll(), () -> theMsg.insertROL(theMsg.getROLReps()));
185        }
186
187        private IPatientMessage asPatientMessage(ADT_A09 theMsg) {
188                return new PatientMessage()
189                                .setPID(theMsg.getPID())
190                                .setPD1(theMsg.getPD1())
191                                .setIAM(null)
192                                .setNK1(null, null)
193                                .setROL(null, null);
194        }
195
196        private IPatientMessage asPatientMessage(ADT_A12 theMsg) {
197                return new PatientMessage()
198                                .setPID(theMsg.getPID())
199                                .setPD1(theMsg.getPD1())
200                                .setIAM(null)
201                                .setNK1(null, null)
202                                .setROL(null, null);
203        }
204
205        private IPatientMessage asPatientMessage(ADT_A17 theMsg) {
206                return new PatientMessage()
207                                .setPID(theMsg.getPID())
208                                .setPD1(theMsg.getPD1())
209                                .setIAM(null)
210                                .setNK1(null, null)
211                                .setROL(null, null);
212        }
213
214        private IPatientMessage asPatientMessage(ADT_A21 theMsg) {
215                return new PatientMessage()
216                                .setPID(theMsg.getPID())
217                                .setPD1(theMsg.getPD1())
218                                .setIAM(null)
219                                .setNK1(null, null)
220                                .setROL(null, null);
221        }
222
223        private IPatientMessage asPatientMessage(ADT_A38 theMsg) {
224                return new PatientMessage()
225                                .setPID(theMsg.getPID())
226                                .setPD1(theMsg.getPD1())
227                                .setIAM(null)
228                                .setNK1(null, null)
229                                .setROL(null, null);
230        }
231
232        private IPatientMessage asPatientMessage(ADT_A30 theMsg) {
233                return new PatientMessage()
234                                .setPID(theMsg.getPID())
235                                .setPD1(theMsg.getPD1())
236                                .setIAM(null)
237                                .setNK1(null, null)
238                                .setROL(null, null);
239        }
240
241        private IPatientMessage asPatientMessage(ADT_A60 theMsg) throws HL7Exception {
242                return new PatientMessage()
243                                .setPID(theMsg.getPID())
244                                // No PD1 in this structure.
245                                .setPD1(null)
246                                .setIAM(theMsg.getIAMAll())
247                                .setNK1(null, null)
248                                .setROL(null, null);
249        }
250
251        private IPatientMessage asPatientMessage(ADT_A24 theMsg) {
252                return new PatientMessage()
253                                .setPID(theMsg.getPID())
254                                .setPD1(theMsg.getPD1())
255                                .setIAM(null)
256                                .setNK1(null, null)
257                                .setROL(null, null);
258        }
259
260        private IPatientMessage asPatientMessage(ADT_A15 theMsg) {
261                return new PatientMessage()
262                                .setPID(theMsg.getPID())
263                                .setPD1(theMsg.getPD1())
264                                .setIAM(null)
265                                .setNK1(null, null)
266                                .setROL(null, null);
267        }
268
269        private IPatientMessage asPatientMessage(ADT_A39 theMsg) {
270                return new PatientMessage()
271                                // PATIENT has multiple reps actually.. need to deal with that
272                                // if we ever implement A39
273                                .setPID(theMsg.getPATIENT().getPID())
274                                .setPD1(theMsg.getPATIENT().getPD1())
275                                .setIAM(null)
276                                .setNK1(null, null)
277                                .setROL(null, null);
278        }
279
280        private IPatientMessage asPatientMessage(ADT_A45 theMsg) {
281                return new PatientMessage()
282                                .setPID(theMsg.getPID())
283                                .setPD1(theMsg.getPD1())
284                                .setIAM(null)
285                                .setNK1(null, null)
286                                .setROL(null, null);
287        }
288
289        private IPatientMessage asPatientMessage(ORM_O01 theMsg) {
290                return new PatientMessage()
291                                .setPID(theMsg.getPATIENT().getPID())
292                                .setIAM(null)
293                                .setPD1(theMsg.getPATIENT().getPD1())
294                                .setNK1(null, null)
295                                .setROL(null, null);
296        }
297
298        private IPatientMessage asPatientMessage(OMG_O19 theMsg) {
299                return new PatientMessage()
300                                .setPID(theMsg.getPATIENT().getPID())
301                                .setIAM(null)
302                                .setPD1(theMsg.getPATIENT().getPD1())
303                                .setNK1(null, null)
304                                .setROL(null, null);
305        }
306
307        private IPatientMessage asPatientMessage(VXU_V04 theMsg) {
308                return new PatientMessage()
309                                .setPID(theMsg.getPID())
310                                .setPD1(theMsg.getPD1())
311                                .setIAM(null)
312                                .setNK1(null, null)
313                                .setROL(null, null);
314        }
315
316        private IPatientMessage asPatientMessage(BAR_P12 theMsg) {
317                return new PatientMessage()
318                                .setPID(theMsg.getPID())
319                                .setPD1(null)
320                                .setIAM(null)
321                                .setNK1(null, null)
322                                .setROL(null, null);
323        }
324
325        private IPatientMessage asPatientMessage(MDM_T01 theMsg) {
326                return new PatientMessage().setPID(theMsg.getPID());
327        }
328
329        private IPatientMessage asPatientMessage(MDM_T02 theMsg) {
330                return new PatientMessage().setPID(theMsg.getPID());
331        }
332}