[613] | 1 | DGROHLR ;DJH/AMA - ROM HL7 RECEIVE DRIVERS ; 09 Jul 2003 4:41 PM
|
---|
| 2 | ;;5.3;Registration;**533,572**;Aug 13, 1993
|
---|
| 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 (ACK, QRY and ORF) for Register Once Messaging.
|
---|
| 8 | ;
|
---|
| 9 | ;All procedures and functions assume that all VistA HL7 environment
|
---|
| 10 | ;variables are properly initialized and will produce a fatal error if
|
---|
| 11 | ;they are missing.
|
---|
| 12 | ;
|
---|
| 13 | ;The received message is copied to a temporary work global for
|
---|
| 14 | ;processing. The message type is determined from the MSH segment and
|
---|
| 15 | ;a receive processing procedure specific to the message type is called.
|
---|
| 16 | ;(Ex. ORF~R01 message calls procedure: RCVORF). The specific receive
|
---|
| 17 | ;processing procedure calls a message specific parse procedure to
|
---|
| 18 | ;validate the message data and return data arrays for storage. If no
|
---|
| 19 | ;parse errors are reported during validation, then the data arrays are
|
---|
| 20 | ;stored by the receive processing procedure. Control, along with any
|
---|
| 21 | ;parse validation errors, is then passed to the message specific send
|
---|
| 22 | ;processing procedures to build and transmit the acknowledgment and
|
---|
| 23 | ;query results messages.
|
---|
| 24 | ;
|
---|
| 25 | ; The message specific procedures are as follows:
|
---|
| 26 | ;
|
---|
| 27 | ; Message Receive Procedure Parse Procedure Send Procedure
|
---|
| 28 | ; ------- ----------------- ---------------- --------------
|
---|
| 29 | ; SNDACK^DGROHLS
|
---|
| 30 | ; ACK~R01 RCVACK^DGROHLR PARSACK^DGROHLU4 N/A
|
---|
| 31 | ; QRY~R02 RCVQRY^DGROHLR PARSQRY^DGROHLQ3 SNDORF^DGROHLS
|
---|
| 32 | ; ORF~R01 RCVORF^DGROHLR PARSORF^DGROHLQ3 N/A
|
---|
| 33 | ;
|
---|
| 34 | N DGCNT,DGMSGTYP,DGSEG,DGSEGCNT,DGWRK
|
---|
| 35 | ;
|
---|
| 36 | S DGWRK=$NA(^TMP("DGROHL7",$J))
|
---|
| 37 | K @DGWRK
|
---|
| 38 | ;
|
---|
| 39 | ;load work global with segments
|
---|
| 40 | F DGSEGCNT=1:1 X HLNEXT Q:HLQUIT'>0 D
|
---|
| 41 | . S DGCNT=0
|
---|
| 42 | . S @DGWRK@(DGSEGCNT,DGCNT)=HLNODE
|
---|
| 43 | . F S DGCNT=$O(HLNODE(DGCNT)) Q:'DGCNT D
|
---|
| 44 | . . S @DGWRK@(DGSEGCNT,DGCNT)=HLNODE(DGCNT)
|
---|
| 45 | ;
|
---|
| 46 | ;get message type from "MSH"
|
---|
| 47 | I $$NXTSEG^DGROHLUT(DGWRK,0,HL("FS"),.DGSEG),$G(DGSEG("TYPE"))="MSH" D
|
---|
| 48 | . S DGMSGTYP=$P(DGSEG(9),$E(HL("ECH"),1),1)
|
---|
| 49 | . ;HLMTIENS is only required by RCVORU and RCVQRY, thus $GET
|
---|
| 50 | . I DGMSGTYP="" S (DGMSGTYP,HL("MTN"))="ORF",HLMTIENS=HLMTIEN
|
---|
| 51 | . I DGMSGTYP=HL("MTN") D @("RCV"_DGMSGTYP_"(DGWRK,$G(HLMTIENS),.HL)")
|
---|
| 52 | ;
|
---|
| 53 | ;cleanup
|
---|
| 54 | K @DGWRK
|
---|
| 55 | Q
|
---|
| 56 | ;
|
---|
| 57 | RCVACK(DGWRK,DGMIEN,DGHL) ;Receive ACK Message Types (ACK~R01)
|
---|
| 58 | ;
|
---|
| 59 | ; Input:
|
---|
| 60 | ; DGWRK - name of work global containing segments
|
---|
| 61 | ; DGMIEN - IEN of message entry in file #773
|
---|
| 62 | ; DGHL - HL environment array
|
---|
| 63 | ;
|
---|
| 64 | ; Output:
|
---|
| 65 | ; none
|
---|
| 66 | ;
|
---|
| 67 | N DGACK ;ACK data array
|
---|
| 68 | N DGERR ;error array
|
---|
| 69 | N DGLIEN ;HL7 transmission log IEN
|
---|
| 70 | N DGROL ;HL7 transmssion log data array
|
---|
| 71 | ;
|
---|
| 72 | S ACKCODE=0
|
---|
| 73 | D PARSACK^DGROHLU4(DGWRK,.DGHL,.DGACK,.DGERR)
|
---|
| 74 | I $G(DGACK("ACKCODE"))'="AA" S ACKCODE=1
|
---|
| 75 | Q
|
---|
| 76 | ;
|
---|
| 77 | RCVQRY(DGWRK,DGMIEN,DGHL) ;Receive QRY Message Types (QRY~R02)
|
---|
| 78 | ;
|
---|
| 79 | ; Input:
|
---|
| 80 | ; DGWRK - name of work global containing segments
|
---|
| 81 | ; DGMIEN - IEN of message entry in file #773
|
---|
| 82 | ; DGHL - HL environment array
|
---|
| 83 | ;
|
---|
| 84 | ; Output:
|
---|
| 85 | ; none
|
---|
| 86 | ;
|
---|
| 87 | N DGDFN,DGQRY,DGQRYERR,DGSEGERR
|
---|
| 88 | ;
|
---|
| 89 | D PARSQRY^DGROHLQ3(DGWRK,.DGHL,.DGQRY,.DGSEGERR)
|
---|
| 90 | S DGDFN=$$GETDFN^DGROUT2(DGQRY("ICN"),DGQRY("DOB"),DGQRY("SSN"))
|
---|
| 91 | I DGDFN'>0 D
|
---|
| 92 | . S DGQRYERR="NM"
|
---|
| 93 | . ;
|
---|
| 94 | . ;THE ICN FROM THE MPI DOES NOT MATCH A PATIENT, SO NOTIFY THE MPI
|
---|
| 95 | . D MPIMAIL^DGROMAIL(.DGQRY)
|
---|
| 96 | . ;
|
---|
| 97 | D SNDORF^DGROHLS(.DGQRY,DGMIEN,.DGHL,DGDFN,.DGSEGERR,.DGQRYERR)
|
---|
| 98 | Q
|
---|
| 99 | ;
|
---|
| 100 | RCVORF(DGWRK,DGMIEN,DGHL) ;Receive ORF Message Types (ORF~R01)
|
---|
| 101 | ;
|
---|
| 102 | ; Input:
|
---|
| 103 | ; DGWRK - name of work global containing segments, ^TMP("DGROHL7",$J)
|
---|
| 104 | ; DGMIEN - IEN of message entry in file #773
|
---|
| 105 | ; DGHL - HL environment array
|
---|
| 106 | ;
|
---|
| 107 | ; Output:
|
---|
| 108 | ; none
|
---|
| 109 | ;
|
---|
| 110 | N DGDATA ;patient data array to upload
|
---|
| 111 | N DGERR ;parse error array
|
---|
| 112 | N DGORF ;ORF data array
|
---|
| 113 | ;
|
---|
| 114 | S DGDATA=$NA(^TMP("DGROFDA",$J)) K @DGDATA
|
---|
| 115 | D PARSORF^DGROHLQ3(DGWRK,.DGHL,.DGORF,.DGERR,.DGDATA)
|
---|
| 116 | ;
|
---|
| 117 | I $D(DGROVRCK) DO
|
---|
| 118 | . S:('$D(DGORF("PATCH"))) DGROVRCK=0
|
---|
| 119 | . I ($D(DGORF("PATCH"))),(+DGORF("PATCH")'=572) S DGROVRCK=0
|
---|
| 120 | ;
|
---|
| 121 | ;* QUIT conditions
|
---|
| 122 | Q:'$D(DGORF)
|
---|
| 123 | Q:(+$G(DGORF("DFN"))'>0)
|
---|
| 124 | Q:'$D(^DPT(DGORF("DFN"),0))
|
---|
| 125 | Q:('$D(DGORF("PATCH")))
|
---|
| 126 | Q:(+DGORF("PATCH")'=572)
|
---|
| 127 | ;
|
---|
| 128 | S DFN=DGORF("DFN")
|
---|
| 129 | ;
|
---|
| 130 | ;Get DFN at Last Site Treated
|
---|
| 131 | S LSTDFN=+$O(@DGDATA@(2,""))
|
---|
| 132 | ;CHECK BUSINESS RULES
|
---|
| 133 | D POW^DGRODEBR(DGDATA,DFN,LSTDFN) ;POW STATUS
|
---|
| 134 | D AO^DGRODEBR(DGDATA,DFN,LSTDFN) ;AGENT ORANGE EXPOSURE
|
---|
| 135 | D IR^DGRODEBR(DGDATA,DFN,LSTDFN) ;RADIATION EXPOSURE
|
---|
| 136 | D DOD^DGRODEBR(DGDATA,DFN,LSTDFN) ;DATE OF DEATH
|
---|
| 137 | D TA^DGRODEBR(DGDATA,LSTDFN) ;TEMPORARY ADDRESS
|
---|
| 138 | D SP^DGRODEBR(DGDATA,DFN,LSTDFN) ;SENSITIVE PATIENT
|
---|
| 139 | D CA^DGRODEBR(DGDATA,LSTDFN) ;CONFIDENTIAL ADDRESS
|
---|
| 140 | D PA^DGRODEBR(DGDATA,LSTDFN) ;PERMANENT ADDRESS
|
---|
| 141 | ;
|
---|
| 142 | ;File the data
|
---|
| 143 | D CONVFDA^DGROHLR1(DFN,DGDATA)
|
---|
| 144 | ;CLEAN UP
|
---|
| 145 | K @DGDATA
|
---|
| 146 | Q
|
---|