[613] | 1 | DGENUPL ;ALB/CJM,ISA/KWP,TDM - PROCESS INCOMING (Z11 EVENT TYPE) HL7 MESSAGES ; 8/11/05 5:21pm
|
---|
| 2 | ;;5.3;REGISTRATION;**147,222,232,363,472,497,564,677,672**;Aug 13,1993
|
---|
| 3 | ;Phase II Moved Z11 to DGENUPL7
|
---|
| 4 | ORUZ11(MSGIEN,ERRCOUNT) ;
|
---|
| 5 | ;Description: This procedure is used to process a batch of ORU~Z11
|
---|
| 6 | ;messages or a single ORU~Z11 message.The processing consists of
|
---|
| 7 | ;uploading the patient enrollment and eligibility data.
|
---|
| 8 | ;
|
---|
| 9 | ;Input:
|
---|
| 10 | ; MSGIEN - the ien of the HL7 message in the HL7 MESSAGE TEXT file
|
---|
| 11 | ;Output:
|
---|
| 12 | ; ERRCOUNT - count of messages that were not processed due to
|
---|
| 13 | ; errors encountered (pass by reference)
|
---|
| 14 | ;
|
---|
| 15 | N CURLINE,SSN,DOB,SEX,SEG,MSGID,SSN,DFN,ERRMSG,SEG
|
---|
| 16 | ;
|
---|
| 17 | K ^TMP("IVM","HLS",$J)
|
---|
| 18 | ;
|
---|
| 19 | ;initialize HL7 variable
|
---|
| 20 | S HLSDT="IVMQ" ;location of error message
|
---|
| 21 | ;
|
---|
| 22 | S CURLINE=1
|
---|
| 23 | D ADVANCE(MSGIEN,.CURLINE)
|
---|
| 24 | Q:'CURLINE
|
---|
| 25 | F Q:'CURLINE D D ADVANCE(MSGIEN,.CURLINE)
|
---|
| 26 | .D GETSEG(MSGIEN,CURLINE,.SEG)
|
---|
| 27 | .S MSGID=SEG(10)
|
---|
| 28 | .D NXTSEG(MSGIEN,CURLINE,.SEG)
|
---|
| 29 | .I SEG("TYPE")'="PID" D ADDERROR(MSGID,,"PID SEGMENT MISSING",.ERRCOUNT) Q
|
---|
| 30 | .S DFN=$$LOOKUP^DGENPTA(SEG(19),$$FMDATE^HLFNC(SEG(7)),SEG(8),.ERRMSG)
|
---|
| 31 | .I 'DFN D ADDERROR(MSGID,SEG(19),ERRMSG,.ERRCOUNT) Q
|
---|
| 32 | .D Z11^DGENUPL7(MSGIEN,MSGID,.CURLINE,DFN,.ERRCOUNT)
|
---|
| 33 | S HLEVN=+$G(ERRCOUNT) ;# of events included in the reply
|
---|
| 34 | M ^TMP("HLS",$J)=^TMP("IVM","HLS",$J) ;DG*5.3*472
|
---|
| 35 | K ^TMP("IVM","HLS",$J)
|
---|
| 36 | Q
|
---|
| 37 | ;
|
---|
| 38 | ORFZ11(MSGIEN,MSGID) ;
|
---|
| 39 | ;Description: This procedure is used to process an ORF~Z11 message
|
---|
| 40 | ;It uploads the patient enrollment and eligibility data.
|
---|
| 41 | ;An acknowledgment is returned.
|
---|
| 42 | ;
|
---|
| 43 | ;Input:
|
---|
| 44 | ; MSGIEN - the internal entry number of the HL7 message in the HL7 MESSAGE TEXT file (772)
|
---|
| 45 | ; MSGID - the message control id from the MSH segment
|
---|
| 46 | ;
|
---|
| 47 | ;Output: none
|
---|
| 48 | ;
|
---|
| 49 | N CURLINE,DFN,QUERYIEN,QARRAY,QRYMSGID,ERRCOUNT,HECERROR,SEG,DGRESENT
|
---|
| 50 | ;CURLINE tracks current line in the message
|
---|
| 51 | ;QUERYIEN the ien of query in the ENROLLMENT QUERY LOG
|
---|
| 52 | ;QRYMSGID the Message Controll ID of the query
|
---|
| 53 | ;QARRAY array containing the ENROLLMENT QUERY LOG record
|
---|
| 54 | ;HECERROR error message returned by HEC in response to query
|
---|
| 55 | ;DGRESENT flag=1 if query was resent
|
---|
| 56 | ;
|
---|
| 57 | S (QUERYIEN,ERRCOUNT)=0
|
---|
| 58 | ;
|
---|
| 59 | ;initialize HL7 variable
|
---|
| 60 | S HLSDT="IVMQ" ;subscript in ^TMP( global for ACK message
|
---|
| 61 | ;
|
---|
| 62 | K ^TMP("IVM","HLS",$J)
|
---|
| 63 | ;
|
---|
| 64 | S CURLINE=1
|
---|
| 65 | S HECERROR=""
|
---|
| 66 | ;
|
---|
| 67 | D ;drops out on error
|
---|
| 68 | .D NXTSEG(MSGIEN,.CURLINE,.SEG)
|
---|
| 69 | .I SEG("TYPE")'="MSA" D ADDERROR(MSGID,,"MISSING MSA SEGMENT",.ERRCOUNT) Q
|
---|
| 70 | .;trace the reply back to the query
|
---|
| 71 | .S QRYMSGID=SEG(2)
|
---|
| 72 | .S QUERYIEN=$$FINDMSG^DGENQRY(QRYMSGID)
|
---|
| 73 | .I 'QUERYIEN D ADDERROR(MSGID,,"NO RECORD OF QUERY",.ERRCOUNT) Q
|
---|
| 74 | .I QUERYIEN,'$$GET^DGENQRY(QUERYIEN,.QARRAY) D ADDERROR(MSGID,,"NO RECORD OF QUERY",.ERRCOUNT) Q
|
---|
| 75 | .S DFN=QARRAY("DFN")
|
---|
| 76 | .I (SEG(1)="AR")!(SEG(1)="AE") D Q
|
---|
| 77 | ..;HEC was unable to reply to the query. If due to incorrect patient
|
---|
| 78 | ..;info, then resend the query, otherwise just log it as unsuccessful
|
---|
| 79 | ..N SSN,DOB,SEX,DGPAT,HECMSG
|
---|
| 80 | ..S HECMSG=SEG(3)
|
---|
| 81 | ..D NXTSEG(MSGIEN,.CURLINE,.SEG)
|
---|
| 82 | ..Q:(SEG("TYPE")'="QRD")
|
---|
| 83 | ..S SSN=SEG(8)
|
---|
| 84 | ..D NXTSEG(MSGIEN,.CURLINE,.SEG)
|
---|
| 85 | ..Q:(SEG("TYPE")'="QRF")
|
---|
| 86 | ..S DOB=$$FMDATE^HLFNC(SEG(4))
|
---|
| 87 | ..S SEX=SEG(5)
|
---|
| 88 | ..;if patient id info incorrect, resend the query
|
---|
| 89 | ..I $$GET^DGENPTA(DFN,.DGPAT),((DOB'=DGPAT("DOB"))!(SEX'=DGPAT("SEX"))!(SSN'=DGPAT("SSN"))) I $$RESEND^DGENQRY1(QUERYIEN) S DGRESENT=1 Q
|
---|
| 90 | ..S HECERROR="HEC UNABLE TO RESPOND TO QUERY- "_HECMSG Q
|
---|
| 91 | .;
|
---|
| 92 | .F SEG="QRD","QRF","PID" D NXTSEG(MSGIEN,.CURLINE,.SEG) I SEG("TYPE")'=SEG D ADDERROR(MSGID,,SEG_" SEGMENT MISSING",.ERRCOUNT) Q
|
---|
| 93 | .S CURLINE=CURLINE-1 ;should point to line before PID
|
---|
| 94 | .I $$SSN^DGENPTA(DFN)'=SEG(19) D ADDERROR(MSGID,,"SSN DOES NOT MATCH",.ERRCOUNT) Q
|
---|
| 95 | .D Z11^DGENUPL7(MSGIEN,MSGID,.CURLINE,DFN,.ERRCOUNT)
|
---|
| 96 | ;
|
---|
| 97 | ;update the query log
|
---|
| 98 | I $G(HECERROR)="",ERRCOUNT S HECERROR="UPLOAD FAILED DUE TO CONSISTENCY CHECKS"
|
---|
| 99 | I '$G(DGRESENT),$$RECEIVE^DGENQRY1(QUERYIEN,HECERROR,MSGID)
|
---|
| 100 | ;
|
---|
| 101 | S HLEVN=+$G(ERRCOUNT) ;# of events included in the reply
|
---|
| 102 | ;
|
---|
| 103 | ;if there was no error, create an 'AA' ack
|
---|
| 104 | ;I 'ERRCOUNT D ACCEPT^DGENUPL1(MSGID) ;DG*5.3*472
|
---|
| 105 | ;D MVERRORS^DGENUPL1 ;DG*5.3*472
|
---|
| 106 | ;transmit the ack
|
---|
| 107 | ;********************************************************
|
---|
| 108 | ;7.12.01;KSD; COMMENTED OUT. DON'T SEND ACK TO ORF
|
---|
| 109 | ;I $D(HLTRANS) S HLARYTYP="GB",HLFORMAT=1 D GENACK^HLMA1(HLEID,HLMTIENS,HLEIDS,HLARYTYP,HLFORMAT,.HLRESLTA,HLMTIEN)
|
---|
| 110 | ;
|
---|
| 111 | Q
|
---|
| 112 | ;
|
---|
| 113 | ADDERROR(MSGID,SSN,ERRMSG,ERRCOUNT) ;
|
---|
| 114 | ;Description - writes an error message to a global. It will be
|
---|
| 115 | ;transmitted in the ack later.
|
---|
| 116 | ;
|
---|
| 117 | ;Inputs:
|
---|
| 118 | ; MSGID -message control id of HL7 msg in the MSH segment
|
---|
| 119 | ; SSN - patient social security number
|
---|
| 120 | ; ERRMSG - the error message
|
---|
| 121 | ; ERRCOUNT - count of errors written so far
|
---|
| 122 | ;
|
---|
| 123 | ;Outputs: none
|
---|
| 124 | ;
|
---|
| 125 | S ERRCOUNT=+$G(ERRCOUNT)
|
---|
| 126 | ;
|
---|
| 127 | I (ERRCOUNT*2)+1=1 D
|
---|
| 128 | . K HL,HLMID,HLMTIEN,HLDT,HLDT1
|
---|
| 129 | . D INIT^HLFNC2(HLEID,.HL)
|
---|
| 130 | . D CREATE^HLTF(.HLMID,.HLMTIEN,.HLDT,.HLDT1)
|
---|
| 131 | K HLRES
|
---|
| 132 | S MID=HLMID_"-"_((ERRCOUNT*2)+1)
|
---|
| 133 | D MSH^HLFNC2(.HL,MID,.HLRES)
|
---|
| 134 | S ^TMP("IVM","HLS",$J,(ERRCOUNT*2)+1)=HLRES
|
---|
| 135 | S ^TMP("IVM","HLS",$J,(ERRCOUNT*2)+2)="MSA"_HLFS_"AE"_HLFS_MSGID_HLFS_ERRMSG_" - SSN "_$S($L($G(SSN)):SSN,1:"NOT FOUND")
|
---|
| 136 | S ERRCOUNT=ERRCOUNT+1
|
---|
| 137 | ;Put in error message in HECERROR to be included in the NOTIFY message for a solicited query
|
---|
| 138 | I $D(HECERROR) S HECERROR=ERRMSG
|
---|
| 139 | Q
|
---|
| 140 | ;
|
---|
| 141 | NXTSEG(MSGIEN,CURLINE,SEG) ;
|
---|
| 142 | ;Description: Returns the next segment
|
---|
| 143 | ;
|
---|
| 144 | ;Input:
|
---|
| 145 | ; MSGIEN - ien in HL7 MESSAGE TEXT file
|
---|
| 146 | ; CURLINE - subscript of the current segment
|
---|
| 147 | ;
|
---|
| 148 | ;Output:
|
---|
| 149 | ; SEG - an array with the fields of the segment (pass by reference)
|
---|
| 150 | ; CURLINE - upon exiting, will be the subscript of the next segment
|
---|
| 151 | ;
|
---|
| 152 | S CURLINE=CURLINE+1
|
---|
| 153 | D GETSEG(MSGIEN,CURLINE,.SEG)
|
---|
| 154 | Q
|
---|
| 155 | ;
|
---|
| 156 | GETSEG(MSGIEN,CURLINE,SEG) ;
|
---|
| 157 | ;returns the current segment
|
---|
| 158 | ;
|
---|
| 159 | ;Input:
|
---|
| 160 | ; MSGIEN - ien in HL7 MESSAGE TEXT file
|
---|
| 161 | ; CURLINE - subscript of the current segment
|
---|
| 162 | ;
|
---|
| 163 | ;Output:
|
---|
| 164 | ; SEG - an array with the fields of the segment (pass by reference)
|
---|
| 165 | ;
|
---|
| 166 | N SEGMENT,I
|
---|
| 167 | S:$G(HLFS)="" HLFS=$G(HL("FS")) S:HLFS="" HLFS="^"
|
---|
| 168 | S SEGMENT=$G(^TMP($J,IVMRTN,CURLINE,0))
|
---|
| 169 | S SEG("TYPE")=$E(SEGMENT,1,3)
|
---|
| 170 | ;
|
---|
| 171 | ;the MSH & BHS segs contain as their first piece the field separator, which makes breaKing the seqment into fields a bit different
|
---|
| 172 | I (SEG("TYPE")="MSH")!(SEG("TYPE")="BHS") D
|
---|
| 173 | .S SEG(1)=$E(SEGMENT,4)
|
---|
| 174 | .F I=2:1:30 S SEG(I)=$P(SEGMENT,HLFS,I)
|
---|
| 175 | E D
|
---|
| 176 | .F I=2:1:41 S SEG(I-1)=$P(SEGMENT,HLFS,I)
|
---|
| 177 | Q
|
---|
| 178 | ;
|
---|
| 179 | ADVANCE(MSGIEN,CURLINE) ;
|
---|
| 180 | ;Description: Used to find the begining of the next message in the batch.
|
---|
| 181 | ;
|
---|
| 182 | ;Input:
|
---|
| 183 | ; MSGIEN - ien of message in the HL7 MESSAGE TEXT file.
|
---|
| 184 | ; CURLINE - current position in the message
|
---|
| 185 | ;Output:
|
---|
| 186 | ; CURLINE - starting position of next message in the batch, or 0 if
|
---|
| 187 | ; the end of the message is reached
|
---|
| 188 | ;
|
---|
| 189 | Q:'CURLINE
|
---|
| 190 | F S CURLINE=$O(^TMP($J,IVMRTN,CURLINE)) Q:'CURLINE Q:$E($G(^TMP($J,IVMRTN,CURLINE,0)),1,3)="MSH"
|
---|
| 191 | S CURLINE=+CURLINE
|
---|
| 192 | Q
|
---|