Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: SCMSVPID

SCMSVPID.m

Go to the documentation of this file.
  1. SCMSVPID ;ALB/ESD HL7 PID Segment Validation ; 23 Oct 98 3:36 PM
  1. ;;5.3;Scheduling;**44,66,162,254,293,441**;Aug 13, 1993;Build 14
  1. ;
  1. ;
  1. EN(PIDSEG,HLQ,HLFS,HLECH,VALERR,ENCDT,EVNTHL7) ;
  1. ; Entry point to return the HL7 PID (Patient ID) validation segment
  1. ;
  1. ; Input: PIDSEG - Array containing PID segment (pass by ref)
  1. ; PIDSEG = First 245 characters
  1. ; PIDSEG(1..n) = Continuation nodes
  1. ; HLQ - HL7 null variable
  1. ; HLFS - HL7 field separator
  1. ; HLECH - HL7 encoding characters
  1. ; VALERR - The array name to put the errors in
  1. ; ENCDT - The date/time of the encounter.
  1. ; EVNTHL7 - Event type ("A08" for add/edit, "A23" for delete)
  1. ;
  1. ; Output: 1 if PID passed validity check
  1. ; Error message if PID failed validity check in form of:
  1. ; -1^"xxx failed validity check" (xxx=element in PID segment)
  1. ;
  1. ;Declare variables
  1. N MSG,SEQ,SD,PARSEG,SEG,I
  1. S PARSEG=$NA(^TMP("SCMSVPID",$J,"PARSEG"))
  1. K @PARSEG
  1. S MSG="-1^Element in PID segment failed validity check"
  1. ;-Set encoding chars to standard HL7 encoding chars if not passed in
  1. I '$D(HLQ) S HLQ=$C(34,34)
  1. S HLECH=$G(HLECH)
  1. S:HLECH="" HLECH="~|\&"
  1. ;-Create array of elements to validate
  1. F SEQ=3,5,7,8,10,11,16,17,19,22 S SD(SEQ)="" ;Elements for 'add' or 'edit' transactions
  1. I $G(EVNTHL7)="A23" K SD F I=3,19 S SD(SEQ)="" ;Elements for 'delete' transactions
  1. ;
  1. S SEG="PID"
  1. D VALIDATE^SCMSVUT0(SEG,$G(PIDSEG),"0006",VALERR,.CNT)
  1. I $D(@VALERR@(SEG)) G ENQ
  1. ;-Parse out fields
  1. D SEGPRSE^SCMSVUT5("PIDSEG",PARSEG,HLFS)
  1. ;-Remember DFN
  1. ;S DFN=$$CONVERT^SCMSVUT0($G(@PARSEG@(3)),$E(HLECH,1),HLQ)
  1. ;S DFN=+$P(DFN,$E(HLECH,1),1)
  1. ;-Validate segment name
  1. S CNT=1
  1. D VALIDATE^SCMSVUT0(SEG,$G(@PARSEG@(0)),$P($T(0),";",3),VALERR,.CNT)
  1. ;-Validate fields
  1. S SEQ=0
  1. F S SEQ=+$O(SD(SEQ)) Q:'SEQ D
  1. .I SEQ=11 D ADDRCHK(SEG,VALERR,.CNT) Q
  1. .I (SEQ=10)!(SEQ=22)!(SEQ=3) D Q
  1. ..N PARSEQ,REP,COMP
  1. ..S PARSEQ=$NA(^TMP("SCMSVPID",$J,"PARSEQ"))
  1. ..K @PARSEQ
  1. ..D SEQPRSE^SCMSVUT5($NA(@PARSEG@(SEQ)),PARSEQ,HLECH)
  1. ..S REP=0
  1. ..F S REP=+$O(@PARSEQ@(REP)) Q:'REP D
  1. ...I SEQ=3,$G(@PARSEQ@(REP,5))'="PI" Q
  1. ...S DATA=$$CONVERT^SCMSVUT0($G(@PARSEQ@(REP,1)),$E(HLECH,4),HLQ)
  1. ...D VALIDATE^SCMSVUT0(SEG,$P(DATA,$E(HLECH,1),1),$P($T(@(SEQ)),";",3),VALERR,.CNT)
  1. ..K @PARSEQ
  1. .S DATA=$G(@PARSEG@(SEQ))
  1. .S DATA=$$CONVERT^SCMSVUT0(DATA,$E(HLECH,1),HLQ)
  1. .;S:SEQ=3 DATA=$P(DATA,$E(HLECH,1),1)
  1. .S:SEQ=5 DATA=$$FMNAME^HLFNC(DATA)
  1. .S:SEQ=7 DATA=$$FMDATE^HLFNC(DATA)
  1. .D VALIDATE^SCMSVUT0(SEG,DATA,$P($T(@(SEQ)),";",3),VALERR,.CNT)
  1. ;
  1. ENQ K @PARSEG
  1. Q $S($D(@VALERR@(SEG,1)):MSG,1:1)
  1. ;
  1. ;
  1. ADDRCHK(SEG,VALERR,CNT) ;- Validity check for address (seq 11)
  1. ;
  1. ;Declare variables
  1. N PARSEQ,REP,COMP,DATA,TYPE,OFFSET,CODE,STATE,SKIP,FORIGN
  1. ;Parse sequence into repeated components
  1. S PARSEQ=$NA(^TMP("SCMSVPID",$J,"PARSEQ"))
  1. K @PARSEQ
  1. D SEQPRSE^SCMSVUT5($NA(@PARSEG@(11)),PARSEQ,HLECH)
  1. ;Validate
  1. S REP=0
  1. F S REP=+$O(@PARSEQ@(REP)) Q:'REP D
  1. .;Get address type
  1. .S TYPE=$$CONVERT^SCMSVUT0($G(@PARSEQ@(REP,7)),$E(HLECH,4),HLQ)
  1. .;Set foreign country flag
  1. .S FORIGN=$$FOR^DGADDUTL($$CONVERT^SCMSVUT0($G(@PARSEQ@(REP,6)),$E(HLECH,4),HLQ))
  1. .I (TYPE'["P")&(TYPE'["VAC") Q ;validate permanent and confidential addresses
  1. .S:TYPE="" TYPE="P" S:TYPE'="P" TYPE="VACA"
  1. .;Calculate error code offset
  1. .S OFFSET=$S($E(TYPE,1,4)="VACA":200,TYPE="P":0,1:0)
  1. .;If it's a confidential address, everything is allowed to be empty
  1. .I $E(TYPE,1,4)="VACA" S SKIP=1 D Q:SKIP
  1. ..F SEQ=1,2,3,4,5,8,9,12 D Q:'SKIP
  1. ...S DATA=$$CONVERT^SCMSVUT0($G(@PARSEQ@(REP,SEQ)),$E(HLECH,4),HLQ)
  1. ...I SEQ=12 Q:DATA=$E(HLECH,4) S SKIP=0 Q
  1. ...I DATA'="" S SKIP=0
  1. .;Validate components
  1. .S STATE=0
  1. .F SEQ=1,2,3,4,5,7,9,12 D
  1. ..I FORIGN,((SEQ=4)!(SEQ=5)!(SEQ=9)) Q ;foreign addresses have no state/zip/county
  1. ..I TYPE="P" Q:((SEQ=7)!(SEQ=12))
  1. ..S DATA=$$CONVERT^SCMSVUT0($G(@PARSEQ@(REP,SEQ)),$E(HLECH,4),HLQ)
  1. ..I SEQ=12 Q:DATA=$E(HLECH,4)
  1. ..I SEQ=9 S STATE=$G(@PARSEQ@(REP,4)) I STATE'="" S STATE=+$O(^DIC(5,"C",STATE,""))
  1. ..S CODE=$S(SEQ<10:"110",1:"11")_SEQ
  1. ..S CODE=OFFSET+$P($T(@(CODE)),";",3)
  1. ..D VALIDATE^SCMSVUT0(SEG,DATA,CODE,VALERR,.CNT)
  1. K @PARSEQ
  1. Q
  1. ;
  1. ERR ;;Invalid or missing patient ID data for encounter (HL7 PID data segment)
  1. ;
  1. ;
  1. ;- PID data elements validated
  1. ;
  1. 0 ;;0035;HL7 SEGMENT NAME
  1. 3 ;;2030;PATIENT ID (INTERNAL)
  1. 5 ;;2000;NAME
  1. 7 ;;2050;DATE OF BIRTH
  1. 8 ;;2100;SEX
  1. 10 ;;2150;RACE
  1. 1101 ;;2200;STREET ADDRESS 1
  1. 1102 ;;2210;STREET ADDRESS 2
  1. 1103 ;;2220;CITY
  1. 1104 ;;2230;STATE
  1. 1105 ;;2240;ZIP CODE
  1. 1107 ;;2270;ADDRESS TYPE
  1. 1109 ;;2250;COUNTY CODE
  1. 1112 ;;2280;ADDRESS START/STOP DATE
  1. 16 ;;2300;MARITAL STATUS
  1. 17 ;;2330;RELIGION
  1. 19 ;;2360;SSN
  1. 22 ;;2380;ETHNICITY