001    package org.vmdb.hl7;
002    
003    import java.util.*;
004    
005    /**
006     * <p><Title:> Patient Identification (PID) Segment. </p>
007     * <p>Description: HL7 Network Connectivity For VMDB. </p>
008     * <p>Copyright: Copyright (c) 2002-2003. </p>
009     * <p>Company: Veterinary Medical Database (VMDB). </p>
010     * <p>The PID segment is used as the primary means of communicating information
011     * concerning the veterinary patient identification. This segment is required
012     * for all VMDB reporting messages. For VMDB usage, only one PID segment per
013     * message is allowed.<p>
014     * <p>See HL7 Standard Chapter 3 for additional details.</p>
015     * @author Michael K. Martin
016     * @version 1.0
017     */
018    
019    public class PIDSegment extends HL7Segment {
020       private String sNm = "PID";
021       private String sRl =
022                   "DT[SI][CX]{CX}[{CX}]{XPN}[XPN]TS[IS][XPN][CE]XAD[IS][XTN][XTN][CE]" +
023                   "[CE][CE][CX][ST][DLN][CX][CE][ST][ID][NM][CE][CE][CE][TS][ID]" +
024                   "[ID][IS][TS][HD]CE[CE][ST][CE]";
025    
026       /**
027       * Construct an empty patient identification segment.
028       */
029       public PIDSegment() {
030          setName( sNm );
031          setRule( sRl );
032       }
033    
034       /**
035        * Construct an empty patient identification segment, setting its containing message
036        * object.
037        * @param msgParent HL7SegmentContainer (normally a Group 4 loop) object that
038        * contains this segment.
039        */
040       public PIDSegment( HL7SegmentContainer msgParent ) {
041          super( msgParent );
042          setName( sNm );
043          setRule( sRl );
044       }
045    
046       /**
047        * Set the sending facility.  This version takes only the facility ID.
048        * @param sNamespaceID abbreviation of facility
049        */
050       public void addPatientId( String sId, String sAssigningAuthority ) {
051          CXElement cxE = new CXElement();
052          cxE.setIdentifier( sId );
053          cxE.setAssigningAuthorityName( sAssigningAuthority );
054          cxE.setName( "PID.3" );
055          try {
056             setField( cxE, 3, true );
057          }
058          catch( ArrayIndexOutOfBoundsException ae ) {
059             ae.printStackTrace();
060          }
061          catch( MalformedSegmentException mfe ) {
062             mfe.printStackTrace();
063          }
064       }
065    
066       /**
067        * Get the patient identifier list as a Java iterator over the repeating
068        * Field.  Each Object in the iteration is a {@link org.vmdb.hl7.CXElement CXElement}
069        * @return Iterator with all CXElements or null if none or error
070        */
071       public Iterator listPatientIds() {
072          return listFields( 3 );
073       }
074    
075       /**
076        * Set patient name as just a single string (usually "Confidential")<br><br>
077        * TODO: Make "Confidential" the default for new PIDs?
078        * @param sPatName String of patient name
079        *
080        */
081       public void setPatientName( String sPatName ) {
082          XPNElement e = new XPNElement();
083          e.setValue( sPatName );
084          try {
085             setField( e, 5 );
086          }
087          catch( ArrayIndexOutOfBoundsException ae ) {
088             ae.printStackTrace();
089          }
090          catch( MalformedSegmentException mfe ) {
091             mfe.printStackTrace();
092          }
093       }
094    
095       /**
096        * Set full patient name as XPN element defined as completely as you like.
097        * @param xpnName XPNElement with name defined
098        *
099        */
100       public void setPatientName( XPNElement xpnName ) {
101          try {
102             setField( xpnName, 5 );
103          }
104          catch( ArrayIndexOutOfBoundsException ae ) {
105             ae.printStackTrace();
106          }
107          catch( MalformedSegmentException mfe ) {
108             mfe.printStackTrace();
109          }
110       }
111    
112       /**
113        * Get just the name string stored in family name.
114        * @return String with family name
115        */
116       public String getPatientNameString() {
117          HL7Element e = getField( 5 );
118          if( e != null )
119             return e.getValue();
120          else
121             return "";
122       }
123    
124       /**
125        * Get the full patient name as XPNElement
126        * @return XPNElement with fully defined name
127        *
128        */
129       public XPNElement getPatientName() {
130          return (XPNElement)getField( 5 );
131       }
132    
133       /**
134        * Set the date of birth (date time but who's going to include time)
135        * @param sBDate String with date in ISO format
136        */
137       public void setDateOfBirth( String sBDate ) {
138          TSElement tsE = new TSElement();
139          tsE.setDateTime( sBDate );
140          try {
141             setField( tsE, 7 );
142          }
143          catch( ArrayIndexOutOfBoundsException ae ) {
144             ae.printStackTrace();
145          }
146          catch( MalformedSegmentException mfe ) {
147             mfe.printStackTrace();
148          }
149       }
150    
151       /**
152        * Set the date of birth (date time but who's going to include time)
153        * @param sBDate String with date in ISO format
154        */
155       public void setDateOfBirth( TSElement tsBDate ) {
156          try {
157             setField( tsBDate, 7 );
158          }
159          catch( ArrayIndexOutOfBoundsException ae ) {
160             ae.printStackTrace();
161          }
162          catch( MalformedSegmentException mfe ) {
163             mfe.printStackTrace();
164          }
165       }
166    
167       /**
168        * Get birthdate string
169        * @return String with birthdate in ISO format
170        */
171       public String getDateOfBirth() {
172          TSElement tsE = (TSElement)getField( 7 );
173          if( tsE != null )
174             return tsE.getDateTime();
175          else
176             return "";
177       }
178    
179       /**
180        * Set the administrative sex
181        * @param sSex String with gender as M, C, T, F, S, O, U, H, or X
182        */
183       public void setSex( String sSex ) {
184          try {
185             setField( sSex, 8 );
186          }
187          catch( ArrayIndexOutOfBoundsException ae ) {
188             ae.printStackTrace();
189          }
190       }
191    
192       /**
193        * Get birthdate string
194        * @return String with sex
195        */
196       public String getSex() {
197          return getField( 8 ).getValue();
198       }
199    
200    
201       /**
202        * Set patient zipcode as just a single string
203        * @param sZipcode String of patient zipcode
204        *
205        */
206       public void setPatientZipcode( String sZipcode ) {
207          XADElement xadE = (XADElement)getField( 11 );
208          if( xadE != null ) {
209             xadE.setName( "PID.11" );
210             xadE.setPostalCode( sZipcode );
211          }
212          else {
213             (new Exception( "Field 11 NULL in setPatientZipcode" )).printStackTrace();
214          }
215       }
216    
217       /**
218        * Set patient country as just a single string (ISO abbreviation prefered)
219        * @param sCountry String of patient country
220        *
221        */
222       public void setPatientCountry( String sCountry ) {
223          XADElement xadE = (XADElement)getField( 11 );
224          if( xadE != null ) {
225             xadE.setName( "PID.11" );
226             xadE.setCountry( sCountry );
227          }
228          else {
229             (new Exception( "Field 11 NULL in setPatientZipcode" )).printStackTrace();
230          }
231       }
232    
233       /**
234        * Set full patient address as XAD element defined as completely as you like
235        * @param xadAddress XADElement with address set
236        *
237        */
238       public void setPatientAddress( XADElement xadAddress ) {
239          xadAddress.setName( "PID.11" );
240          try {
241             setField( xadAddress, 11 );
242          }
243          catch( ArrayIndexOutOfBoundsException ae ) {
244             ae.printStackTrace();
245          }
246          catch( MalformedSegmentException mfe ) {
247             mfe.printStackTrace();
248          }
249       }
250    
251       /**
252        * Get just the zipcode string from address
253        * @return String with zipcode
254        */
255       public String getPatientZipcode() {
256          XADElement xadE = (XADElement)getField( 11 );
257          if( xadE != null ) {
258             return xadE.getPostalCode();
259          }
260          else
261             return "";
262       }
263    
264       /**
265        * Get just the Country string from address
266        * @return String with Country
267        */
268       public String getPatientCountry() {
269          XADElement xadE = (XADElement)getField( 11 );
270          if( xadE != null ) {
271             return xadE.getCountry();
272          }
273          else
274             return "";
275       }
276    
277       /**
278        * Get the full patient address as XADElement
279        * @return XADElement with fully defined name
280        *
281        */
282       public XADElement getPatientAddress() {
283          return (XADElement)getField( 11 );
284       }
285    
286       /**
287        * Set multiple birth indicator to true or false
288        * @param bMulti boolean true if multiple
289        *
290        */
291       public void setMultipleBirth( boolean bMulti ) {
292          String sMulti = bMulti ? "YES" : "NO";
293          try {
294             setField( sMulti, 24 );
295          }
296          catch( ArrayIndexOutOfBoundsException ae ) {
297             ae.printStackTrace();
298          }
299       }
300    
301       /**
302        * Get birthdate string
303        * @return String with sex
304        */
305       public boolean getMultipleBirth() {
306          String sMulti = getField( 24 ).getValue();
307          if( sMulti == null || sMulti.equalsIgnoreCase( "NO" )
308                             || sMulti.equalsIgnoreCase( "FALSE" ) )
309             return false;
310          else if ( sMulti.equalsIgnoreCase( "YES" ) || sMulti.equalsIgnoreCase( "TRUE" ) )
311             return true;
312          else {
313             ( new Exception( "Cannot read " + sMulti + " as boolean in Multiple Birth Indicator" ) ).printStackTrace();
314             return false;
315          }
316       }
317    
318          /**
319           * Set the coded species.  This version takes the fully qualified CE elements
320           * @param sCode code value normally Snomed CT
321           * @param sText spelled out term
322           * @param sSystem normally Snomed CT
323           */
324       public void setSpecies( String sCode, String sText, String sCodeType ) {
325          CEElement ceE = new CEElement( sCode, sText, sCodeType );
326          ceE.setName( "PID.35" );
327          try {
328             setField( ceE, 35 );
329          }
330          catch( ArrayIndexOutOfBoundsException ae ) {
331             ae.printStackTrace();
332          }
333          catch( MalformedSegmentException mfe ) {
334             mfe.printStackTrace();
335          }
336       }
337    
338          /**
339           * Set the coded species.  This version takes the fully qualified CE elements
340           * @param sCode code value normally Snomed CT
341           * @param sText spelled out term
342           * @param sSystem normally Snomed CT
343           * @param sAltCode alternate code value for the SAME species
344           * @param sAltText spelled out term
345           * @param sAltSystem alternate coding system
346           */
347       public void setSpecies( String sCode, String sText, String sCodeType ,
348                               String sAltCode, String sAltText, String sAltCodeType) {
349          CEElement ceE = new CEElement( sCode, sText, sCodeType,
350                                         sAltCode, sAltText, sAltCodeType );
351          ceE.setName( "PID.35" );
352          try {
353             setField( ceE, 35 );
354          }
355          catch( ArrayIndexOutOfBoundsException ae ) {
356             ae.printStackTrace();
357          }
358          catch( MalformedSegmentException mfe ) {
359             mfe.printStackTrace();
360          }
361       }
362    
363          /**
364           * Set the coded species.  This version takes the fully qualified CE elements
365           * @param ceSpecies species as preformed CEElement
366           */
367       public void setSpecies( CEElement ceSpecies ) {
368          ceSpecies.setName( "PID.35" );
369          try {
370             setField( ceSpecies, 35 );
371          }
372          catch( ArrayIndexOutOfBoundsException ae ) {
373             ae.printStackTrace();
374          }
375          catch( MalformedSegmentException mfe ) {
376             mfe.printStackTrace();
377          }
378       }
379    
380       /**
381        * Get the species code as the complete CEElement
382        * @return CEElement with coded species
383        */
384       public CEElement getSpecies() {
385          return (CEElement)getField( 35 );
386       }
387    
388       /**
389        * Get just the universal id of the sending facility, the VMDB
390        * identifier in this case.
391        * @return String with species spelled out
392        */
393       public String getSpeciesText() {
394          CEElement ceE = (CEElement)getField( 35 );
395          if( ceE != null )
396             return ceE.getText();
397          else
398             return "";
399       }
400    
401       /**
402        * Get just the universal id of the sending facility, the VMDB
403        * identifier in this case.
404        * @return String with coded (normally snomed) species
405        */
406       public String getSpeciesCode() {
407          CEElement ceE = (CEElement)getField( 35 );
408          if( ceE != null )
409             return ceE.getIdentifier();
410          else
411             return "";
412       }
413    
414       /**
415        * Get just the universal id of the sending facility, the VMDB
416        * identifier in this case.
417        * @return String with coding system used for species (normally snomed)
418        */
419       public String getSpeciesCodingSystem() {
420          CEElement ceE = (CEElement)getField( 35 );
421          if( ceE != null )
422             return ceE.getCodingSystem();
423          else
424             return "";
425       }
426    
427          /**
428           * Set the coded breed.  This version takes the fully qualified CE elements
429           * @param sCode code value normally Snomed CT
430           * @param sText spelled out term
431           * @param sSystem normally Snomed CT
432           */
433       public void setBreed( String sCode, String sText, String sCodeType ) {
434          CEElement ceE = new CEElement( sCode, sText, sCodeType );
435          ceE.setName( "PID.36" );
436          try {
437             setField( ceE, 36 );
438          }
439          catch( ArrayIndexOutOfBoundsException ae ) {
440             ae.printStackTrace();
441          }
442          catch( MalformedSegmentException mfe ) {
443             mfe.printStackTrace();
444          }
445       }
446    
447          /**
448           * Set the coded breed.  This version takes the fully qualified CE elements
449           * @param sCode code value normally Snomed CT
450           * @param sText spelled out term
451           * @param sSystem normally Snomed CT
452           * @param sAltCode alternate code for the same Breed
453           * @param sAltText spelled out term
454           * @param sAltSystem alternate coding system
455           */
456       public void setBreed( String sCode, String sText, String sCodeType,
457                             String sAltCode, String sAltText, String sAltCodeType ) {
458          CEElement ceE = new CEElement( sCode, sText, sCodeType,
459                                         sAltCode, sAltText, sAltCodeType );
460          ceE.setName( "PID.36" );
461          try {
462             setField( ceE, 36 );
463          }
464          catch( ArrayIndexOutOfBoundsException ae ) {
465             ae.printStackTrace();
466          }
467          catch( MalformedSegmentException mfe ) {
468             mfe.printStackTrace();
469          }
470       }
471    
472          /**
473           * Set the coded breed.  This version takes the predefined CE element
474           * @param ceSpecies
475           */
476       public void setBreed( CEElement ceSpecies ) {
477          ceSpecies.setName( "PID.36" );
478          try {
479             setField( ceSpecies, 36 );
480          }
481          catch( ArrayIndexOutOfBoundsException ae ) {
482             ae.printStackTrace();
483          }
484          catch( MalformedSegmentException mfe ) {
485             mfe.printStackTrace();
486          }
487       }
488    
489       /**
490        * Get the breed code as the complete CEElement
491        * @return CEElement with coded species
492        */
493       public CEElement getBreed() {
494          return (CEElement)getField( 36 );
495       }
496    
497       /**
498        * Get just the breed code value.
499        * @return String with id
500        */
501       public String getBreedCode() {
502          CEElement ceE = (CEElement)getField( 36 );
503          if( ceE != null )
504             return ceE.getIdentifier();
505          else
506             return "";
507       }
508    
509       /**
510        * Get just the text of the breed code value.
511        * @return String with id
512        */
513       public String getBreedText() {
514          CEElement ceE = (CEElement)getField( 36 );
515          if( ceE != null )
516             return ceE.getText();
517          else
518             return "";
519       }
520    
521       /**
522        * Get just the coding system of the breed code value.
523        * @return String with coding system (normally snomed)
524        */
525       public String getBreedCodingSystem() {
526          CEElement ceE = (CEElement)getField( 36 );
527          if( ceE != null )
528             return ceE.getCodingSystem();
529          else
530             return "";
531       }
532    
533       /**
534        * Set the Strain
535        * @param sStrain String with strain
536        */
537       public void setStrain( String sStrain ) {
538          try {
539             setField( sStrain, 37 );
540          }
541          catch( ArrayIndexOutOfBoundsException ae ) {
542             ae.printStackTrace();
543          }
544       }
545    
546       /**
547        * Get strain string
548        * @return String with strain
549        */
550       public String getStrain() {
551          HL7Element e = getField( 37 );
552          if( e == null )
553             return "";
554          else
555             return e.getValue();
556       }
557    
558    }// End Class PIDSegment
559