1 | LA7VHL ;DALOI/DLR - Main Driver for incoming HL7 V1.6 messages ; Jan 12, 2005
|
---|
2 | ;;5.2;AUTOMATED LAB INSTRUMENTS;**27,46,62,64,67**;Sep 27, 1994
|
---|
3 | ; This routine is not meant to be invoked by name
|
---|
4 | ;
|
---|
5 | QUIT
|
---|
6 | ;
|
---|
7 | ; This routine is called by the HL7 package V1.6 to process
|
---|
8 | ; incoming HL7 messages. Expected variables are those
|
---|
9 | ; documented in the HL7 package documentation. The line
|
---|
10 | ; tag is called if it is entered into the PROCESSING ROUTINE
|
---|
11 | ; field for the server protocol.
|
---|
12 | ;
|
---|
13 | ORR ; Process incoming ORR messages
|
---|
14 | ACK ; Process incoming ACK messages
|
---|
15 | ORM ; Process incoming ORM messages
|
---|
16 | ORU ; Process incoming ORU messages
|
---|
17 | ;
|
---|
18 | N HLA,HLL,HLP,X,Y
|
---|
19 | N LA76248,LA76249,LA7AAT,LA7AERR,LA7CS,LA7DT,LA7ECH,LA7FS,LA7HLS,LA7HLSA,LA7INTYP,LA7MEDT,LA7MTYP,LA7RAP,LA7PRID,LA7RSITE,LA7SAP,LA7SEQ,LA7SSITE,LA7TYPE,LA7VER,LA7VI,LA7VJ,LA7X
|
---|
20 | ;
|
---|
21 | S DT=$$DT^XLFDT
|
---|
22 | S (LA76248,LA76249,LA7INTYP,LA7SEQ)=0
|
---|
23 | ;
|
---|
24 | K ^TMP("HLA",$J)
|
---|
25 | ;
|
---|
26 | ; Setup DUZ array to 'non-human' user LRLAB,HL
|
---|
27 | ; If user not found - send alert to G.LAB MESSAGING
|
---|
28 | S LA7X=$$FIND1^DIC(200,"","OX","LRLAB,HL","B","")
|
---|
29 | I LA7X<1 D Q
|
---|
30 | . N MSG
|
---|
31 | . S MSG="Lab Messaging - Unable to identify user 'LRLAB,HL' in NEW PERSON file"
|
---|
32 | . D XQA^LA7UXQA(0,LA76248,0,0,MSG,"",0)
|
---|
33 | D DUZ^XUP(LA7X)
|
---|
34 | ;
|
---|
35 | ; Set up LA7HLS with HL variables to build ACK message.
|
---|
36 | ; Handle situation when systems use different encoding characters.
|
---|
37 | D RSPINIT^HLFNC2(HL("EIDS"),.LA7HLS)
|
---|
38 | ;
|
---|
39 | ; Move message from HL7 global to Lab global
|
---|
40 | F LA7VI=1:1 X HLNEXT Q:HLQUIT'>0 D
|
---|
41 | . K LA7SEG
|
---|
42 | . I HLNODE="" Q
|
---|
43 | . S LA7SEG(0)=HLNODE
|
---|
44 | . S LA7VJ=0
|
---|
45 | . F S LA7VJ=$O(HLNODE(LA7VJ)) Q:'LA7VJ S LA7SEG(LA7VJ)=HLNODE(LA7VJ)
|
---|
46 | . I $E(LA7SEG(0),1,3)="MSH" D MSH
|
---|
47 | . I LA7SEQ<1 D REJECT("no MSH segment found") Q
|
---|
48 | . D FILE6249^LA7VHLU(LA76249,.LA7SEG)
|
---|
49 | ;
|
---|
50 | ; Update entry in 62.49
|
---|
51 | ; Change status to (Q)ueued for processing from (B)uilding
|
---|
52 | I LA76249>0,$P($G(^LAHM(62.49,LA76249,0)),"^",3)'="E" D
|
---|
53 | . N FDA,LA7ERR
|
---|
54 | . S FDA(1,62.49,LA76249_",",2)="Q"
|
---|
55 | . D FILE^DIE("","FDA(1)","LA7ERR(1)")
|
---|
56 | ;
|
---|
57 | ; Release lock on file #62.49 entry (tells LA7VIN message is stored).
|
---|
58 | I LA76249>0 L -^LAHM(62.49,LA76249)
|
---|
59 | ;
|
---|
60 | ; Run processing routine
|
---|
61 | I '$D(^LAHM(62.48,LA76248,1)) D CREATE^LA7LOG(5)
|
---|
62 | I $D(^LAHM(62.48,LA76248,1)) X ^(1)
|
---|
63 | ;
|
---|
64 | ; Don't (ACK)nowledge ACK or ORR messages
|
---|
65 | I $G(LA7MTYP)="ACK"!($G(LA7MTYP)="ORR") Q
|
---|
66 | ;
|
---|
67 | ; No application acknowledgement
|
---|
68 | I $G(LA7AAT(1))="NE" Q
|
---|
69 | ;
|
---|
70 | ; Other system only wants ACK on successful completion condition and we found an error.
|
---|
71 | I $G(LA7AERR)'="",$G(LA7AAT(1))="SU" Q
|
---|
72 | ;
|
---|
73 | ; Other system only wants ACK on error/reject condition
|
---|
74 | I $G(LA7AERR)="",$G(LA7AAT(1))="ER" Q
|
---|
75 | ;
|
---|
76 | ; If POC interface and no error then quit - send application ack after
|
---|
77 | ; processing message.
|
---|
78 | I $G(LA7AERR)="",LA7INTYP>19,LA7INTYP<30 S X=$$DONTPURG^HLUTIL() Q
|
---|
79 | ;
|
---|
80 | ; If POC interface and error then setup HLL array
|
---|
81 | I LA7INTYP>19,LA7INTYP<30 D
|
---|
82 | . S HLL("SET FOR APP ACK")=1
|
---|
83 | . S HLL("LINKS",1)=HL("EIDS")_"^"_$P(LA76248(0),"^")
|
---|
84 | ;
|
---|
85 | ; HL7 returns this as ACK if no errors found
|
---|
86 | I $G(LA7AERR)="" S HLA("HLA",1)="MSA"_LA7HLS("RFS")_"AA"_LA7HLS("RFS")_HL("MID")
|
---|
87 | ;
|
---|
88 | ; Send ACK message
|
---|
89 | I $D(HLA("HLA")) D
|
---|
90 | . S HLP("NAMESPACE")="LA"
|
---|
91 | . D GENACK^HLMA1(HL("EID"),HLMTIENS,HL("EIDS"),"LM",1,.LA7HLSA,"",.HLP)
|
---|
92 | ;
|
---|
93 | I $D(^TMP("HLA",$J)) D
|
---|
94 | . S HLP("NAMESPACE")="LA"
|
---|
95 | . D GENACK^HLMA1(HL("EID"),HLMTIENS,HL("EIDS"),"GM",1,.LA7HLSA,"",.HLP)
|
---|
96 | ;
|
---|
97 | Q
|
---|
98 | ;
|
---|
99 | ;
|
---|
100 | MSH ;;MSH
|
---|
101 | ;
|
---|
102 | N LA7CFIG,LA7MID,LA7NOW,X
|
---|
103 | ;
|
---|
104 | S LA7SEQ=1
|
---|
105 | S LA7FS=$E(LA7SEG(0),4)
|
---|
106 | S LA7ECH=$E(LA7SEG(0),5,8)
|
---|
107 | S LA7CS=$E(LA7ECH,1)
|
---|
108 | ; Sending application
|
---|
109 | S LA7SAP=$P($$P^LA7VHLU(.LA7SEG,3,LA7FS),LA7CS)
|
---|
110 | ; Sending facility
|
---|
111 | S LA7SSITE=$P($$P^LA7VHLU(.LA7SEG,4,LA7FS),LA7CS)
|
---|
112 | ; Receiving application
|
---|
113 | S LA7RAP=$P($$P^LA7VHLU(.LA7SEG,5,LA7FS),LA7CS)
|
---|
114 | ; Receiving facility
|
---|
115 | S LA7RSITE=$P($$P^LA7VHLU(.LA7SEG,6,LA7FS),LA7CS)
|
---|
116 | ; Date/time of message
|
---|
117 | S LA7MEDT=$$P^LA7VHLU(.LA7SEG,7,LA7FS)
|
---|
118 | ; Message type/trigger event/message structure
|
---|
119 | S X=$$P^LA7VHLU(.LA7SEG,9,LA7FS)
|
---|
120 | S LA7MTYP=$P(X,LA7CS),LA7MTYP("EVN")=$P(X,LA7CS,2),LA7MTYP("MSGSTR")=$P(X,LA7CS,3)
|
---|
121 | ; Message Control ID
|
---|
122 | S LA7MID=$$P^LA7VHLU(.LA7SEG,10,LA7FS)
|
---|
123 | ; Processing ID
|
---|
124 | S LA7PRID=$$P^LA7VHLU(.LA7SEG,11,LA7FS)
|
---|
125 | ; Version ID
|
---|
126 | S LA7VER=$$P^LA7VHLU(.LA7SEG,12,LA7FS)
|
---|
127 | ; Accept acknowledgement type
|
---|
128 | S LA7AAT(0)=$$P^LA7VHLU(.LA7SEG,15,LA7FS)
|
---|
129 | ; Application acknowledgement type
|
---|
130 | S LA7AAT(1)=$$P^LA7VHLU(.LA7SEG,16,LA7FS)
|
---|
131 | ;
|
---|
132 | S LA7CFIG=LA7SAP_LA7SSITE_LA7RAP_LA7RSITE
|
---|
133 | S X=LA7CFIG X ^%ZOSF("LPC")
|
---|
134 | S LA76248=+$O(^LAHM(62.48,"C",$E(LA7CFIG,1,27)_Y,0))
|
---|
135 | I 'LA76248 S LA76248=+$O(^LAHM(62.48,"B",LA7SAP,0))
|
---|
136 | I 'LA76248,$E(LA7SAP,1,11)="LA7V REMOTE" S LA76248=+$O(^LAHM(62.48,"B","LA7V COLLECTION "_$P(LA7SAP," ",3),0))
|
---|
137 | I 'LA76248 D Q
|
---|
138 | . D CREATE^LA7LOG(1)
|
---|
139 | . D REJECT("no config in 62.48")
|
---|
140 | ;
|
---|
141 | ; Determine interface type
|
---|
142 | S LA7INTYP=+$P(^LAHM(62.48,LA76248,0),"^",9)
|
---|
143 | ;
|
---|
144 | I '$P($G(^LAHM(62.48,LA76248,0)),"^",3) D
|
---|
145 | . D CREATE^LA7LOG(3)
|
---|
146 | . D REJECT("config is inactive")
|
---|
147 | ;
|
---|
148 | ; store incoming message in ^LAHM(62.49)
|
---|
149 | S LA76249=$$INIT6249^LA7VHLU
|
---|
150 | I LA76249<1 Q
|
---|
151 | ;
|
---|
152 | ; update entry in 62.49
|
---|
153 | N FDA,LA7ERR
|
---|
154 | I $G(LA76248) S FDA(1,62.49,LA76249_",",.5)=LA76248
|
---|
155 | S FDA(1,62.49,LA76249_",",1)="I"
|
---|
156 | S FDA(1,62.49,LA76249_",",3)=3
|
---|
157 | S FDA(1,62.49,LA76249_",",102)=LA7SAP
|
---|
158 | S FDA(1,62.49,LA76249_",",103)=LA7SSITE
|
---|
159 | S FDA(1,62.49,LA76249_",",104)=LA7RAP
|
---|
160 | S FDA(1,62.49,LA76249_",",105)=LA7RSITE
|
---|
161 | S FDA(1,62.49,LA76249_",",106)=LA7MEDT
|
---|
162 | S FDA(1,62.49,LA76249_",",108)=LA7MTYP
|
---|
163 | S FDA(1,62.49,LA76249_",",109)=LA7MID
|
---|
164 | S FDA(1,62.49,LA76249_",",110)=LA7PRID
|
---|
165 | S FDA(1,62.49,LA76249_",",111)=LA7VER
|
---|
166 | S FDA(1,62.49,LA76249_",",700)=HL("EID")_";"_HLMTIENS_";"_HL("EIDS")
|
---|
167 | D FILE^DIE("","FDA(1)","LA7ERR(1)")
|
---|
168 | ;
|
---|
169 | Q
|
---|
170 | ;
|
---|
171 | ;
|
---|
172 | REJECT(LA7AR) ; Build a reject segment if the incoming message could not be processed.
|
---|
173 | ; Setting HLA("HLA",1) conforms to HL7 package rules for acknowledgements
|
---|
174 | ; LA7AR is a free text string that is included in the reject
|
---|
175 | ; message for debugging purposes.
|
---|
176 | ;
|
---|
177 | S HLA("HLA",1)="MSA"_LA7HLS("RFS")_"AR"_LA7HLS("RFS")_HL("MID")_LA7HLS("RFS")_LA7AR
|
---|
178 | S LA7AERR=LA7AR
|
---|
179 | Q
|
---|