| 1 | SCMSVPID ;ALB/ESD HL7 PID Segment Validation ; 23 Oct 98  3:36 PM
 | 
|---|
| 2 |  ;;5.3;Scheduling;**44,66,162,254,293**;Aug 13, 1993
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | EN(PIDSEG,HLQ,HLFS,HLECH,VALERR,ENCDT,EVNTHL7) ;
 | 
|---|
| 6 |  ; Entry point to return the HL7 PID (Patient ID) validation segment
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  ;  Input:  PIDSEG  - Array containing PID segment (pass by ref)
 | 
|---|
| 9 |  ;                    PIDSEG = First 245 characters
 | 
|---|
| 10 |  ;                    PIDSEG(1..n) = Continuation nodes
 | 
|---|
| 11 |  ;             HLQ  - HL7 null variable
 | 
|---|
| 12 |  ;            HLFS  - HL7 field separator
 | 
|---|
| 13 |  ;           HLECH  - HL7 encoding characters
 | 
|---|
| 14 |  ;          VALERR  - The array name to put the errors in
 | 
|---|
| 15 |  ;           ENCDT  - The date/time of the encounter.
 | 
|---|
| 16 |  ;         EVNTHL7  - Event type ("A08" for add/edit, "A23" for delete)
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  ; Output:  1 if PID passed validity check
 | 
|---|
| 19 |  ;          Error message if PID failed validity check in form of:
 | 
|---|
| 20 |  ;          -1^"xxx failed validity check" (xxx=element in PID segment)
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 |  ;Declare variables
 | 
|---|
| 23 |  N MSG,SEQ,SD,PARSEG,SEG
 | 
|---|
| 24 |  S PARSEG=$NA(^TMP("SCMSVPID",$J,"PARSEG"))
 | 
|---|
| 25 |  K @PARSEG
 | 
|---|
| 26 |  S MSG="-1^Element in PID segment failed validity check"
 | 
|---|
| 27 |  ;-Set encoding chars to standard HL7 encoding chars if not passed in
 | 
|---|
| 28 |  I '$D(HLQ) S HLQ=$C(34,34)
 | 
|---|
| 29 |  S HLECH=$G(HLECH)
 | 
|---|
| 30 |  S:HLECH="" HLECH="~|\&"
 | 
|---|
| 31 |  ;-Create array of elements to validate
 | 
|---|
| 32 |  F SEQ=3,5,7,8,10,11,16,17,19,22 S SD(SEQ)=""  ;Elements for 'add' or 'edit' transactions
 | 
|---|
| 33 |  I $G(EVNTHL7)="A23" K SD F I=3,19 S SD(SEQ)=""  ;Elements for 'delete' transactions
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 |  S SEG="PID"
 | 
|---|
| 36 |  D VALIDATE^SCMSVUT0(SEG,$G(PIDSEG),"0006",VALERR,.CNT)
 | 
|---|
| 37 |  I $D(@VALERR@(SEG)) G ENQ
 | 
|---|
| 38 |  ;-Parse out fields
 | 
|---|
| 39 |  D SEGPRSE^SCMSVUT5("PIDSEG",PARSEG,HLFS)
 | 
|---|
| 40 |  ;-Remember DFN
 | 
|---|
| 41 |  ;S DFN=$$CONVERT^SCMSVUT0($G(@PARSEG@(3)),$E(HLECH,1),HLQ)
 | 
|---|
| 42 |  ;S DFN=+$P(DFN,$E(HLECH,1),1)
 | 
|---|
| 43 |  ;-Validate segment name
 | 
|---|
| 44 |  S CNT=1
 | 
|---|
| 45 |  D VALIDATE^SCMSVUT0(SEG,$G(@PARSEG@(0)),$P($T(0),";",3),VALERR,.CNT)
 | 
|---|
| 46 |  ;-Validate fields
 | 
|---|
| 47 |  S SEQ=0
 | 
|---|
| 48 |  F  S SEQ=+$O(SD(SEQ)) Q:'SEQ  D
 | 
|---|
| 49 |  .I SEQ=11 D ADDRCHK(SEG,VALERR,.CNT) Q
 | 
|---|
| 50 |  .I (SEQ=10)!(SEQ=22) D  Q
 | 
|---|
| 51 |  ..N PARSEQ,REP,COMP
 | 
|---|
| 52 |  ..S PARSEQ=$NA(^TMP("SCMSVPID",$J,"PARSEQ"))
 | 
|---|
| 53 |  ..K @PARSEQ
 | 
|---|
| 54 |  ..D SEQPRSE^SCMSVUT5($NA(@PARSEG@(SEQ)),PARSEQ,HLECH)
 | 
|---|
| 55 |  ..S REP=0
 | 
|---|
| 56 |  ..F  S REP=+$O(@PARSEQ@(REP)) Q:'REP  D
 | 
|---|
| 57 |  ...S DATA=$$CONVERT^SCMSVUT0($G(@PARSEQ@(REP,1)),$E(HLECH,4),HLQ)
 | 
|---|
| 58 |  ...D VALIDATE^SCMSVUT0(SEG,$P(DATA,$E(HLECH,1),1),$P($T(@(SEQ)),";",3),VALERR,.CNT)
 | 
|---|
| 59 |  ..K @PARSEQ
 | 
|---|
| 60 |  .S DATA=$G(@PARSEG@(SEQ))
 | 
|---|
| 61 |  .S DATA=$$CONVERT^SCMSVUT0(DATA,$E(HLECH,1),HLQ)
 | 
|---|
| 62 |  .S:SEQ=3 DATA=$P(DATA,$E(HLECH,1),1)
 | 
|---|
| 63 |  .S:SEQ=5 DATA=$$FMNAME^HLFNC(DATA)
 | 
|---|
| 64 |  .S:SEQ=7 DATA=$$FMDATE^HLFNC(DATA)
 | 
|---|
| 65 |  .D VALIDATE^SCMSVUT0(SEG,DATA,$P($T(@(SEQ)),";",3),VALERR,.CNT)
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 | ENQ K @PARSEG
 | 
|---|
| 68 |  Q $S($D(@VALERR@(SEG,1)):MSG,1:1)
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 | ADDRCHK(SEG,VALERR,CNT) ;- Validity check for address (seq 11)
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 |  ;Declare variables
 | 
|---|
| 74 |  N PARSEQ,REP,COMP,DATA,TYPE,OFFSET,CODE,STATE,SKIP
 | 
|---|
| 75 |  ;Parse sequence into repeated components
 | 
|---|
| 76 |  S PARSEQ=$NA(^TMP("SCMSVPID",$J,"PARSEQ"))
 | 
|---|
| 77 |  K @PARSEQ
 | 
|---|
| 78 |  D SEQPRSE^SCMSVUT5($NA(@PARSEG@(11)),PARSEQ,HLECH)
 | 
|---|
| 79 |  ;Validate
 | 
|---|
| 80 |  S REP=0
 | 
|---|
| 81 |  F  S REP=+$O(@PARSEQ@(REP)) Q:'REP  D
 | 
|---|
| 82 |  .;Get address type
 | 
|---|
| 83 |  .S TYPE=$$CONVERT^SCMSVUT0($G(@PARSEQ@(REP,7)),$E(HLECH,4),HLQ)
 | 
|---|
| 84 |  .S:TYPE="" TYPE="P" S:TYPE'="P" TYPE="VACA"
 | 
|---|
| 85 |  .;Calculate error code offset
 | 
|---|
| 86 |  .S OFFSET=$S($E(TYPE,1,4)="VACA":200,TYPE="P":0,1:0)
 | 
|---|
| 87 |  .;If it's a confidential address, everything is allowed to be empty
 | 
|---|
| 88 |  .I $E(TYPE,1,4)="VACA" S SKIP=1 D  Q:SKIP
 | 
|---|
| 89 |  ..F SEQ=1,2,3,4,5,8,9,12 D  Q:'SKIP
 | 
|---|
| 90 |  ...S DATA=$$CONVERT^SCMSVUT0($G(@PARSEQ@(REP,SEQ)),$E(HLECH,4),HLQ)
 | 
|---|
| 91 |  ...I SEQ=12 Q:DATA=$E(HLECH,4)  S SKIP=0 Q
 | 
|---|
| 92 |  ...I DATA'="" S SKIP=0
 | 
|---|
| 93 |  .;Validate components
 | 
|---|
| 94 |  .S STATE=0
 | 
|---|
| 95 |  .F SEQ=1,2,3,4,5,7,9,12 D
 | 
|---|
| 96 |  ..I TYPE="P" Q:((SEQ=7)!(SEQ=12))
 | 
|---|
| 97 |  ..S DATA=$$CONVERT^SCMSVUT0($G(@PARSEQ@(REP,SEQ)),$E(HLECH,4),HLQ)
 | 
|---|
| 98 |  ..I SEQ=9 S STATE=$G(@PARSEQ@(REP,4)) I STATE'="" S STATE=+$O(^DIC(5,"C",STATE,""))
 | 
|---|
| 99 |  ..S CODE=$S(SEQ<10:"110",1:"11")_SEQ
 | 
|---|
| 100 |  ..S CODE=OFFSET+$P($T(@(CODE)),";",3)
 | 
|---|
| 101 |  ..D VALIDATE^SCMSVUT0(SEG,DATA,CODE,VALERR,.CNT)
 | 
|---|
| 102 |  K @PARSEQ
 | 
|---|
| 103 |  Q
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 | ERR ;;Invalid or missing patient ID data for encounter (HL7 PID data segment)
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  ;
 | 
|---|
| 108 |  ;- PID data elements validated
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 | 0 ;;0035;HL7 SEGMENT NAME
 | 
|---|
| 111 | 3 ;;2030;PATIENT ID (INTERNAL)
 | 
|---|
| 112 | 5 ;;2000;NAME
 | 
|---|
| 113 | 7 ;;2050;DATE OF BIRTH
 | 
|---|
| 114 | 8 ;;2100;SEX
 | 
|---|
| 115 | 10 ;;2150;RACE
 | 
|---|
| 116 | 1101 ;;2200;STREET ADDRESS 1
 | 
|---|
| 117 | 1102 ;;2210;STREET ADDRESS 2
 | 
|---|
| 118 | 1103 ;;2220;CITY
 | 
|---|
| 119 | 1104 ;;2230;STATE
 | 
|---|
| 120 | 1105 ;;2240;ZIP CODE
 | 
|---|
| 121 | 1107 ;;2270;ADDRESS TYPE
 | 
|---|
| 122 | 1109 ;;2250;COUNTY CODE
 | 
|---|
| 123 | 1112 ;;2280;ADDRESS START/STOP DATE
 | 
|---|
| 124 | 16 ;;2300;MARITAL STATUS
 | 
|---|
| 125 | 17 ;;2330;RELIGION
 | 
|---|
| 126 | 19 ;;2360;SSN
 | 
|---|
| 127 | 22 ;;2380;ETHNICITY
 | 
|---|