[613] | 1 | DGPFHLR ;ALB/RPM - PRF HL7 RECEIVE DRIVERS ; 8/14/06 12:01pm
|
---|
| 2 | ;;5.3;Registration;**425,650**;Aug 13, 1993;Build 3
|
---|
| 3 | ;
|
---|
| 4 | RCV ;Receive all message types and route to message specific receiver
|
---|
| 5 | ;
|
---|
| 6 | ;This procedure is the main driver entry point for receiving all
|
---|
| 7 | ;message types (ORU, ACK, QRY and ORF) for patient record flag
|
---|
| 8 | ;assignment sharing.
|
---|
| 9 | ;
|
---|
| 10 | ;All procedures and functions assume that all VistA HL7 environment
|
---|
| 11 | ;variables are properly initialized and will produce a fatal error if
|
---|
| 12 | ;they are missing.
|
---|
| 13 | ;
|
---|
| 14 | ;The received message is copied to a temporary work global for
|
---|
| 15 | ;processing. The message type is determined from the MSH segment and
|
---|
| 16 | ;a receive processing procedure specific to the message type is called.
|
---|
| 17 | ;(Ex. ORU~R01 message calls procedure: RCVORU). The specific receive
|
---|
| 18 | ;processing procedure calls a message specific parse procedure to
|
---|
| 19 | ;validate the message data and return data arrays for storage. If no
|
---|
| 20 | ;parse errors are reported during validation, then the data arrays are
|
---|
| 21 | ;stored by the receive processing procedure. Control, along with any
|
---|
| 22 | ;parse validation errors, is then passed to the message specific send
|
---|
| 23 | ;processing procedures to build and transmit the acknowledgment and
|
---|
| 24 | ;query results messages.
|
---|
| 25 | ;
|
---|
| 26 | ; The message specific procedures are as follows:
|
---|
| 27 | ;
|
---|
| 28 | ; Message Receive Procedure Parse Procedure Send Procedure
|
---|
| 29 | ; ------- ----------------- ---------------- --------------
|
---|
| 30 | ; ORU~R01 RCVORU^DGPFHLR PARSORU^DGPFHLU SNDACK^DGPFHLS
|
---|
| 31 | ; ACK~R01 RCVACK^DGPFHLR PARSACK^DGPFHLU4 N/A
|
---|
| 32 | ; QRY~R02 RCVQRY^DGPFHLR PARSQRY^DGPFHLQ3 SNDORF^DGPFHLS
|
---|
| 33 | ; ORF~R04 RCVORF^DGPFHLR PARSORF^DGPFHLQ3 N/A
|
---|
| 34 | ;
|
---|
| 35 | N DGCNT
|
---|
| 36 | N DGMSGTYP
|
---|
| 37 | N DGSEG
|
---|
| 38 | N DGSEGCNT
|
---|
| 39 | N DGWRK
|
---|
| 40 | ;
|
---|
| 41 | S DGWRK=$NA(^TMP("DGPFHL7",$J))
|
---|
| 42 | K @DGWRK
|
---|
| 43 | ;
|
---|
| 44 | ;load work global with segments
|
---|
| 45 | F DGSEGCNT=1:1 X HLNEXT Q:HLQUIT'>0 D
|
---|
| 46 | . S DGCNT=0
|
---|
| 47 | . S @DGWRK@(DGSEGCNT,DGCNT)=HLNODE
|
---|
| 48 | . F S DGCNT=$O(HLNODE(DGCNT)) Q:'DGCNT D
|
---|
| 49 | . . S @DGWRK@(DGSEGCNT,DGCNT)=HLNODE(DGCNT)
|
---|
| 50 | ;
|
---|
| 51 | ;get message type from "MSH"
|
---|
| 52 | I $$NXTSEG^DGPFHLUT(DGWRK,0,HL("FS"),.DGSEG),$G(DGSEG("TYPE"))="MSH" D
|
---|
| 53 | . S DGMSGTYP=$P(DGSEG(9),$E(HL("ECH"),1),1)
|
---|
| 54 | . ;HLMTIENS is only required by RCVORU and RCVQRY, thus $GET
|
---|
| 55 | . I DGMSGTYP=HL("MTN") D @("RCV"_DGMSGTYP_"(DGWRK,$G(HLMTIENS),.HL)")
|
---|
| 56 | ;
|
---|
| 57 | ;cleanup
|
---|
| 58 | K @DGWRK
|
---|
| 59 | Q
|
---|
| 60 | ;
|
---|
| 61 | RCVORU(DGWRK,DGMIEN,DGHL) ;Receive ORU Message Types (ORU~R01)
|
---|
| 62 | ;
|
---|
| 63 | ; Input:
|
---|
| 64 | ; DGWRK - name of work global containing segments
|
---|
| 65 | ; DGMIEN - IEN of message entry in file #773
|
---|
| 66 | ; DGHL - HL environment array
|
---|
| 67 | ;
|
---|
| 68 | ; Output:
|
---|
| 69 | ; none
|
---|
| 70 | ;
|
---|
| 71 | N DGORU
|
---|
| 72 | N DGSEGERR
|
---|
| 73 | N DGSTOERR ;store error array
|
---|
| 74 | N DGACKTYP
|
---|
| 75 | ;
|
---|
| 76 | S DGORU=$NA(^TMP("DGPF",$J))
|
---|
| 77 | K @DGORU
|
---|
| 78 | D PARSORU^DGPFHLU(DGWRK,.DGHL,DGORU,.DGSEGERR)
|
---|
| 79 | ;
|
---|
| 80 | I '$D(DGSEGERR),$$STOORU(DGORU,.DGSTOERR) D
|
---|
| 81 | . S DGACKTYP="AA"
|
---|
| 82 | E D
|
---|
| 83 | . S DGACKTYP="AE"
|
---|
| 84 | ;
|
---|
| 85 | D SNDACK^DGPFHLS(DGACKTYP,DGMIEN,.DGHL,.DGSEGERR,.DGSTOERR)
|
---|
| 86 | ;
|
---|
| 87 | ;cleanup
|
---|
| 88 | K @DGORU
|
---|
| 89 | Q
|
---|
| 90 | ;
|
---|
| 91 | STOORU(DGORU,DGERR) ;store ORU data array
|
---|
| 92 | ;
|
---|
| 93 | ; Input:
|
---|
| 94 | ; DGORU - parsed ORU segment data array
|
---|
| 95 | ;
|
---|
| 96 | ; Output:
|
---|
| 97 | ; Function value - 1 on success; 0 on failure
|
---|
| 98 | ; DGERR - defined on failure
|
---|
| 99 | ;
|
---|
| 100 | N DGADT ;assignment date
|
---|
| 101 | N DGCNT ;count of assignment histories sent
|
---|
| 102 | N DGPFA ;assignment data array
|
---|
| 103 | N DGPFAH ;assignment history data array
|
---|
| 104 | N DGSINGLE ;flag to indicate a single history update
|
---|
| 105 | ;
|
---|
| 106 | ;
|
---|
| 107 | S DGPFA("SNDFAC")=$G(@DGORU@("SNDFAC"))
|
---|
| 108 | S DGPFA("DFN")=$G(@DGORU@("DFN"))
|
---|
| 109 | S DGPFA("FLAG")=$G(@DGORU@("FLAG"))
|
---|
| 110 | ;
|
---|
| 111 | ;init STATUS as a placeholder, $$STATUS^DGPFUT sets value in loop
|
---|
| 112 | S DGPFA("STATUS")=""
|
---|
| 113 | S DGPFA("OWNER")=$G(@DGORU@("OWNER"))
|
---|
| 114 | S DGPFA("ORIGSITE")=$G(@DGORU@("ORIGSITE"))
|
---|
| 115 | M DGPFA("NARR")=@DGORU@("NARR")
|
---|
| 116 | ;
|
---|
| 117 | ;count number of assignment histories sent
|
---|
| 118 | S (DGADT,DGCNT)=0
|
---|
| 119 | F S DGADT=$O(@DGORU@(DGADT)) Q:'DGADT S DGCNT=DGCNT+1
|
---|
| 120 | S DGSINGLE=$S(DGCNT>1:0,1:1)
|
---|
| 121 | S DGADT=0
|
---|
| 122 | ;
|
---|
| 123 | ;process only the last history action when assignment already exists
|
---|
| 124 | I 'DGSINGLE,$$FNDASGN^DGPFAA(DGPFA("DFN"),DGPFA("FLAG")) D
|
---|
| 125 | . S DGADT=+$O(@DGORU@($O(@DGORU@(9999999.999999),-1)),-1)
|
---|
| 126 | . S DGSINGLE=1
|
---|
| 127 | ;
|
---|
| 128 | F S DGADT=$O(@DGORU@(DGADT)) Q:'DGADT D Q:$D(DGERR)
|
---|
| 129 | . N DGPFAH ;assignment history data array
|
---|
| 130 | . ;
|
---|
| 131 | . S DGPFAH("ASSIGNDT")=DGADT
|
---|
| 132 | . S DGPFAH("ACTION")=$G(@DGORU@(DGADT,"ACTION"))
|
---|
| 133 | . S DGPFAH("ENTERBY")=.5 ;POSTMASTER
|
---|
| 134 | . S DGPFAH("APPRVBY")=.5 ;POSTMASTER
|
---|
| 135 | . M DGPFAH("COMMENT")=@DGORU@(DGADT,"COMMENT")
|
---|
| 136 | . ;
|
---|
| 137 | . ;calculate the assignment STATUS from the ACTION
|
---|
| 138 | . S DGPFA("STATUS")=$$STATUS^DGPFUT(DGPFAH("ACTION"))
|
---|
| 139 | . ;validate before filing for single updates and new assignments
|
---|
| 140 | . I DGSINGLE!(DGPFAH("ACTION")=1) D
|
---|
| 141 | . . I $$STOHL7^DGPFAA3(.DGPFA,.DGPFAH,"DGERR")
|
---|
| 142 | . ;otherwise, just file it
|
---|
| 143 | . E D
|
---|
| 144 | . . I $$STOALL^DGPFAA(.DGPFA,.DGPFAH,.DGERR)
|
---|
| 145 | ;
|
---|
| 146 | ;convert dialog to dialog code
|
---|
| 147 | I $D(DGERR) S DGERR=$G(DGERR("DIERR",1))
|
---|
| 148 | ;
|
---|
| 149 | Q '$D(DGERR)
|
---|
| 150 | ;
|
---|
| 151 | RCVACK(DGWRK,DGMIEN,DGHL) ;Receive ACK Message Types (ACK~R01)
|
---|
| 152 | ;
|
---|
| 153 | ; Input:
|
---|
| 154 | ; DGWRK - name of work global containing segments
|
---|
| 155 | ; DGMIEN - IEN of message entry in file #773
|
---|
| 156 | ; DGHL - HL environment array
|
---|
| 157 | ;
|
---|
| 158 | ; Output:
|
---|
| 159 | ; none
|
---|
| 160 | ;
|
---|
| 161 | N DGACK ;ACK data array
|
---|
| 162 | N DGERR ;error array
|
---|
| 163 | N DGLIEN ;HL7 transmission log IEN
|
---|
| 164 | ;
|
---|
| 165 | D PARSACK^DGPFHLU4(DGWRK,.DGHL,.DGACK,.DGERR)
|
---|
| 166 | S DGLIEN=$$FNDLOG^DGPFHLL(26.17,$G(DGACK("MSGID")))
|
---|
| 167 | Q:'DGLIEN
|
---|
| 168 | ;
|
---|
| 169 | I $G(DGACK("ACKCODE"))="AA" D
|
---|
| 170 | . D STOSTAT^DGPFHLL(26.17,DGLIEN,"A",.DGERR)
|
---|
| 171 | E D
|
---|
| 172 | . ;update transmission log status (REJECTED) and process error
|
---|
| 173 | . D STOSTAT^DGPFHLL(26.17,DGLIEN,"RJ",.DGERR)
|
---|
| 174 | . D PROCERR^DGPFHLU5(DGLIEN,.DGACK,.DGERR)
|
---|
| 175 | Q
|
---|
| 176 | ;
|
---|
| 177 | RCVQRY(DGWRK,DGMIEN,DGHL) ;Receive QRY Message Types (QRY~R02)
|
---|
| 178 | ;
|
---|
| 179 | ; Input:
|
---|
| 180 | ; DGWRK - name of work global containing segments
|
---|
| 181 | ; DGMIEN - IEN of message entry in file #773
|
---|
| 182 | ; DGHL - HL environment array
|
---|
| 183 | ;
|
---|
| 184 | ; Output:
|
---|
| 185 | ; none
|
---|
| 186 | ;
|
---|
| 187 | N DGDFN
|
---|
| 188 | N DGDFNERR
|
---|
| 189 | N DGQRY
|
---|
| 190 | N DGQRYERR
|
---|
| 191 | N DGSEGERR
|
---|
| 192 | ;
|
---|
| 193 | D PARSQRY^DGPFHLQ3(DGWRK,.DGHL,.DGQRY,.DGSEGERR)
|
---|
| 194 | S DGDFN=$$GETDFN^DGPFUT2(DGQRY("ICN"),"DGDFNERR")
|
---|
| 195 | I DGDFN'>0,$G(DGDFNERR("DIERR",1))]"" D
|
---|
| 196 | . S DGQRYERR=DGDFNERR("DIERR",1)
|
---|
| 197 | D SNDORF^DGPFHLS(.DGQRY,DGMIEN,.DGHL,DGDFN,.DGSEGERR,.DGQRYERR)
|
---|
| 198 | Q
|
---|
| 199 | ;
|
---|
| 200 | RCVORF(DGWRK,DGMIEN,DGHL) ;Receive ORF Message Types (ORF~R04)
|
---|
| 201 | ;
|
---|
| 202 | ; Input:
|
---|
| 203 | ; DGWRK - name of work global containing segments
|
---|
| 204 | ; DGMIEN - IEN of message entry in file #773
|
---|
| 205 | ; DGHL - HL environment array
|
---|
| 206 | ;
|
---|
| 207 | ; Output:
|
---|
| 208 | ; none
|
---|
| 209 | ;
|
---|
| 210 | N DGDFN ;pointer to PATIENT (#2) file
|
---|
| 211 | N DGLIEN ;HL7 query log IEN
|
---|
| 212 | N DGORF ;ORF data array root
|
---|
| 213 | N DGERR ;parser error array
|
---|
| 214 | N DGSTAT ;query log status
|
---|
| 215 | ;
|
---|
| 216 | S DGORF=$NA(^TMP("DGPF",$J))
|
---|
| 217 | K @DGORF
|
---|
| 218 | D PARSORF^DGPFHLQ4(DGWRK,.DGHL,DGORF,.DGERR)
|
---|
| 219 | S DGDFN=+$$GETDFN^MPIF001($G(@DGORF@("ICN")))
|
---|
| 220 | ;
|
---|
| 221 | ;successful query
|
---|
| 222 | I $G(@DGORF@("ACKCODE"))="AA" D
|
---|
| 223 | . S DGSTAT=$S(+$O(@DGORF@(0))>0:"A",1:"AN")
|
---|
| 224 | . ;
|
---|
| 225 | . ;REJECT when filer fails; otherwise mark event as COMPLETE
|
---|
| 226 | . I '$$STOORF(DGDFN,DGORF) D
|
---|
| 227 | . . S DGSTAT="RJ"
|
---|
| 228 | . . S DGERR($O(DGERR(""),-1)+1)=261120 ;Unable to file
|
---|
| 229 | . E D STOEVNT^DGPFHLL1(DGDFN,"C")
|
---|
| 230 | ;
|
---|
| 231 | ;failed query
|
---|
| 232 | I $G(@DGORF@("ACKCODE"))'="AA" S DGSTAT="RJ"
|
---|
| 233 | ;
|
---|
| 234 | ;find and update query log status
|
---|
| 235 | S DGLIEN=$$FNDLOG^DGPFHLL(26.19,$G(@DGORF@("MSGID")))
|
---|
| 236 | I DGLIEN D STOSTAT^DGPFHLL(26.19,DGLIEN,DGSTAT,.DGERR)
|
---|
| 237 | ;
|
---|
| 238 | ;purge PRF HL7 QUERY LOG when status is COMPLETE
|
---|
| 239 | I $$GETSTAT^DGPFHLL1(DGDFN)="C" D PRGQLOG^DGPFHLL($$FNDEVNT^DGPFHLL1(DGDFN))
|
---|
| 240 | ;
|
---|
| 241 | ;cleanup
|
---|
| 242 | K @DGORF
|
---|
| 243 | Q
|
---|
| 244 | ;
|
---|
| 245 | STOORF(DGDFN,DGORF,DGERR) ;store ORF data
|
---|
| 246 | ;
|
---|
| 247 | ; Input:
|
---|
| 248 | ; DGDFN - pointer to patient in PATIENT (#2) file
|
---|
| 249 | ; DGORF - parsed ORF segments data array
|
---|
| 250 | ;
|
---|
| 251 | ; Output:
|
---|
| 252 | ; Function value - 1 on success; 0 on failure
|
---|
| 253 | ; DGERR - defined on failure
|
---|
| 254 | ;
|
---|
| 255 | N DGADT ;activity date ("ASSIGNDT")
|
---|
| 256 | N DGPFA ;assignment data array
|
---|
| 257 | N DGPFAH ;assignment history data array
|
---|
| 258 | N DGSET ;set id to represent a single PRF assignment
|
---|
| 259 | ;
|
---|
| 260 | ;
|
---|
| 261 | S DGSET=0
|
---|
| 262 | F S DGSET=$O(@DGORF@(DGSET)) Q:'DGSET D
|
---|
| 263 | . N DGPFA ;assignment data array
|
---|
| 264 | . ;
|
---|
| 265 | . S DGPFA("DFN")=DGDFN
|
---|
| 266 | . S DGPFA("FLAG")=$G(@DGORF@(DGSET,"FLAG"))
|
---|
| 267 | . Q:DGPFA("FLAG")']""
|
---|
| 268 | . ;
|
---|
| 269 | . ;prevent overwriting existing assignments
|
---|
| 270 | . Q:$$FNDASGN^DGPFAA(DGPFA("DFN"),DGPFA("FLAG"))
|
---|
| 271 | . ;
|
---|
| 272 | . ;init STATUS as a placeholder, $$STATUS^DGPFUT sets value in loop
|
---|
| 273 | . S DGPFA("STATUS")=""
|
---|
| 274 | . S DGPFA("OWNER")=$G(@DGORF@(DGSET,"OWNER"))
|
---|
| 275 | . S DGPFA("ORIGSITE")=$G(@DGORF@(DGSET,"ORIGSITE"))
|
---|
| 276 | . M DGPFA("NARR")=@DGORF@(DGSET,"NARR")
|
---|
| 277 | . S DGADT=0 ;each DGADT represents a single PRF history action
|
---|
| 278 | . F S DGADT=$O(@DGORF@(DGSET,DGADT)) Q:'DGADT D Q:$D(DGERR)
|
---|
| 279 | . . N DGPFAH ;assignment history data array
|
---|
| 280 | . . ;
|
---|
| 281 | . . S DGPFAH("ASSIGNDT")=DGADT
|
---|
| 282 | . . S DGPFAH("ACTION")=$G(@DGORF@(DGSET,DGADT,"ACTION"))
|
---|
| 283 | . . S DGPFAH("ENTERBY")=.5 ;POSTMASTER
|
---|
| 284 | . . S DGPFAH("APPRVBY")=.5 ;POSTMASTER
|
---|
| 285 | . . M DGPFAH("COMMENT")=@DGORF@(DGSET,DGADT,"COMMENT")
|
---|
| 286 | . . ;
|
---|
| 287 | . . ;calculate the assignment STATUS from the ACTION
|
---|
| 288 | . . S DGPFA("STATUS")=$$STATUS^DGPFUT(DGPFAH("ACTION"))
|
---|
| 289 | . . I $$STOALL^DGPFAA(.DGPFA,.DGPFAH,.DGERR)
|
---|
| 290 | Q '$D(DGERR)
|
---|