1 | VDEFQM ;INTEGIC/AM & BPOIFO/JG - VDEF API ; 21 Dec 2005 11:38 AM
|
---|
2 | ;;1.0;VDEF;**3**;Dec 28, 2004
|
---|
3 | ;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | ; IA's: #4271 - Lookup to file #771.2
|
---|
6 | ; #4321 - Lookup to file #779.001
|
---|
7 | ;
|
---|
8 | Q ; No bozos
|
---|
9 | ;
|
---|
10 | ; Validates and places a request in the VDEF queue
|
---|
11 | QUEUE(EVENT,PAIR,MSTEXT,REQIEN,DYNAMIC) ;
|
---|
12 | ; EVENT = HL7 event in the form Event Type^Message Type (e.g. ADT^A28)
|
---|
13 | ; PAIR = Name/value pairs uniquely identifying the IEN
|
---|
14 | ; (e.g. SUBTYPE="CHEM"^IEN=1234)
|
---|
15 | ; MSTEXT = Returned text message, passed by reference
|
---|
16 | ; REQIEN = Requestor IEN in file 579.1, only valued for solicited
|
---|
17 | ; requests
|
---|
18 | ; DYNAMIC = Dynamic Addressing array in nodes DYNAMIC("LINKS",1-n)
|
---|
19 | ;
|
---|
20 | N CNT,CUSTIEN,DATA,DESTIEN,ERR,EVENTIEN,EVTY,EVTYIEN,FDA,VDI,IENROOT
|
---|
21 | N MESIEN,MSTY,OUTPUT,QUEIEN,RQIEN,SUBTYPE,SUBIEN,NVPIEN
|
---|
22 | N D0,DA,DH,DI,DIC,DIE,DIK,DIKRFIL,DIN,DIROOT,DR,X,Y
|
---|
23 | S MSTEXT="",REQIEN=$G(REQIEN) S:$G(U)="" U="^"
|
---|
24 | ;
|
---|
25 | ; Check for the existence of the HL7 event
|
---|
26 | I $G(EVENT)="" S MSTEXT="HL7 event is required" G EXBAD
|
---|
27 | ;
|
---|
28 | ; Check for the existence of the name/value pair
|
---|
29 | I $G(PAIR)="" S MSTEXT="Name/value pair(s) is required" G EXBAD
|
---|
30 | ;
|
---|
31 | ; Retrieve the HL7 Message Type and the HL7 Event Type
|
---|
32 | S MSTY=$P($G(EVENT),U,1),EVTY=$P($G(EVENT),U,2)
|
---|
33 | ;
|
---|
34 | ; Validate the HL7 Message type
|
---|
35 | I MSTY="" S MSTEXT="HL7 Message Type is required" G EXBAD
|
---|
36 | ;
|
---|
37 | ; Validate the HL7 Event type
|
---|
38 | I EVTY="" S MSTEXT="HL7 Event Type is required" G EXBAD
|
---|
39 | ;
|
---|
40 | ; Get the default Requestor IEN or '1' if not set up
|
---|
41 | S REQIEN=$O(^VDEFHL7(579.1,"C","Y",0)) S:REQIEN="" REQIEN=1
|
---|
42 | ;
|
---|
43 | ; Retrieve Requestor data and see if Requestor is enabled
|
---|
44 | S DATA=$G(^VDEFHL7(579.1,REQIEN,0)) I $P(DATA,U,5)="I" D G EXBAD
|
---|
45 | . S MSTEXT="VDEF HL7 messaging disabled for this Requestor"
|
---|
46 | ;
|
---|
47 | ; Get the Request Queue IEN for this Requestor
|
---|
48 | S QUEIEN=$P(DATA,U,4) I 'QUEIEN S MSTEXT="Could not get a valid Request Queue" G EXBAD
|
---|
49 | ;
|
---|
50 | ; Get the Destination IEN for this Requestor
|
---|
51 | S DESTIEN=$P(DATA,U,3) I 'DESTIEN S MSTEXT="No Destination for this Requestor" G EXBAD
|
---|
52 | ;
|
---|
53 | ; Validate Name/Value Pair
|
---|
54 | I $P($P(PAIR,U),"=",1)'="SUBTYPE"!($P($P(PAIR,U,2),"=",1)'="IEN") D G EXBAD
|
---|
55 | . S MSTEXT="Invalid Name/Value Pair"
|
---|
56 | S SUBTYPE=$P($P(PAIR,U),"=",2),NVPIEN=$P($P(PAIR,U,2),"=",2)
|
---|
57 | ;
|
---|
58 | ; Validate the Subtype
|
---|
59 | S SUBIEN=$$FIND1^DIC(577.4,"","BX",SUBTYPE)
|
---|
60 | I 'SUBIEN S MSTEXT="Invalid VDEF Subtype" G EXBAD
|
---|
61 | ;
|
---|
62 | ; Validate the HL7 Message and Event Types
|
---|
63 | S MESIEN=$$FIND1^DIC(771.2,"","BX",MSTY)
|
---|
64 | I 'MESIEN S MSTEXT="Invalid HL7 Message Type" G EXBAD
|
---|
65 | S EVTYIEN=$$FIND1^DIC(779.001,,"BX",EVTY)
|
---|
66 | I 'EVTYIEN S MSTEXT="Invalid HL7 Event Type" G EXBAD
|
---|
67 | ;
|
---|
68 | ; Validate the VDEF Event
|
---|
69 | S EVENTIEN=$O(^VDEFHL7(577,"BB",MESIEN,EVTYIEN,SUBIEN,""))
|
---|
70 | I 'EVENTIEN S MSTEXT="Invalid 'Message Type-Event Type-Subtype'" G EXBAD
|
---|
71 | ;
|
---|
72 | ; Check if this Request is for a disabled custodial package
|
---|
73 | S X=$G(^VDEFHL7(577,EVENTIEN,0)),CUSTIEN=$P(X,U,9)
|
---|
74 | I $P($G(^VDEFHL7(579.6,+CUSTIEN,0)),U,2)="I" D G EXBAD
|
---|
75 | . S MSTEXT="Custodial package disabled for this event"
|
---|
76 | ;
|
---|
77 | ; Check if this VDEF API is disabled
|
---|
78 | I $P(X,U,11)'="A" D G EXBAD
|
---|
79 | . S MSTEXT="VDEF API "_$P(X,U,1)_" is turned off"
|
---|
80 | ;
|
---|
81 | ; Start filing request into ^VDEFHL7(579.3
|
---|
82 | ; Lock the queue to prevent other requests from being added to it
|
---|
83 | ; doesn't affect the processing of existing requests
|
---|
84 | L +^VDEFHL7(579.3,QUEIEN,"ADD"):10
|
---|
85 | E S MSTEXT="VDEF queuing is currently unavailable" G EXBAD
|
---|
86 | ;
|
---|
87 | ; Populate the Request data (579.31) for this queue
|
---|
88 | S FDA(1,579.31,"+1,"_QUEIEN_",",.01)=9999 ; DINUM placeholder
|
---|
89 | S FDA(1,579.31,"+1,"_QUEIEN_",",.02)="Q" ; Request status - "Q"ueued
|
---|
90 | S FDA(1,579.31,"+1,"_QUEIEN_",",.03)=MSTY ; Message Type
|
---|
91 | S FDA(1,579.31,"+1,"_QUEIEN_",",.04)=EVTY ; Event Type
|
---|
92 | S FDA(1,579.31,"+1,"_QUEIEN_",",.06)=REQIEN ; Requestor
|
---|
93 | S FDA(1,579.31,"+1,"_QUEIEN_",",.07)=DESTIEN ; Destination
|
---|
94 | D NOW^%DTC S FDA(1,579.31,"+1,"_QUEIEN_",",.08)=% ; DTS when request was added
|
---|
95 | S FDA(1,579.31,"+1,"_QUEIEN_",",.18)=EVENTIEN ; VDEF Event IEN
|
---|
96 | D UPDATE^DIE("","FDA(1)","IENROOT","ERR")
|
---|
97 | S RQIEN=$G(IENROOT(1)) ; Get the assigned Request entry IEN
|
---|
98 | ;
|
---|
99 | ; Lock this queue entry to prevent the Request Processor from
|
---|
100 | ; retrieving an incomplete Request
|
---|
101 | L +^VDEFHL7(579.3,QUEIEN,RQIEN)
|
---|
102 | L -^VDEFHL7(579.3,QUEIEN,"ADD") ; Release the queue "ADD" lock
|
---|
103 | ;
|
---|
104 | ; Update the DINUM field with the IEN value for this Request
|
---|
105 | S FDA(1,579.31,RQIEN_","_QUEIEN_",",.01)=RQIEN D FILE^DIE("","FDA(1)","ERR(2)")
|
---|
106 | ;
|
---|
107 | ; Set up the name value pairs multiple (579.311)
|
---|
108 | F VDI=1,2 D
|
---|
109 | . S FDA(1,579.311,"+"_VDI_","_RQIEN_","_QUEIEN_",",.01)=VDI
|
---|
110 | . S FDA(1,579.311,"+"_VDI_","_RQIEN_","_QUEIEN_",",.02)=$P(PAIR,U,VDI)
|
---|
111 | D UPDATE^DIE("","FDA(1)","","ERR")
|
---|
112 | ;
|
---|
113 | ; Set up the Dynamic Adressing multiple, if passed in
|
---|
114 | S (VDI,DATA)="",CNT=0 F S VDI=$O(DYNAMIC("LINKS",VDI)) Q:'VDI D
|
---|
115 | . ; CNT and VDI may be different since the "LINKS" array may be sparse
|
---|
116 | . S DATA=$G(DYNAMIC("LINKS",VDI)),CNT=CNT+1
|
---|
117 | . S FDA(1,579.313,"+"_CNT_","_RQIEN_","_QUEIEN_",",.01)=VDI
|
---|
118 | . S FDA(1,579.313,"+"_CNT_","_RQIEN_","_QUEIEN_",",.02)=DATA
|
---|
119 | ;
|
---|
120 | ; File Dynamic Addressing information
|
---|
121 | I $D(FDA) D UPDATE^DIE("","FDA(1)","","ERR")
|
---|
122 | L -^VDEFHL7(579.3,QUEIEN,RQIEN) ; Release the lock on this Request
|
---|
123 | S MSTEXT="Message "_MSTY_", Event "_EVTY_", Subtype "_SUBTYPE_" queued for processing"
|
---|
124 | EXIT Q 1 ; Good exit
|
---|
125 | EXBAD Q 0 ; Bad, bad exit
|
---|
126 | ;
|
---|
127 | ; Function to set up a Request Processor Scheduling Rule
|
---|
128 | SCHEDULE(Q,H) ;
|
---|
129 | N HT,SIEN,NZ,DOW,STM,ETM
|
---|
130 | I $G(Q)="" Q ""
|
---|
131 | I $G(H)="" S H=$H
|
---|
132 | S DOW=H-2#7,SIEN=0,HT=0
|
---|
133 | F S SIEN=$O(^VDEFHL7(579.3,Q,2,SIEN)) Q:'SIEN D Q:HT'=0
|
---|
134 | . S NZ=^VDEFHL7(579.3,Q,2,SIEN,0)
|
---|
135 | . Q:$P(NZ,U,2)'=DOW
|
---|
136 | . S STM=$P(NZ,U,4),ETM=$P(NZ,U,5)
|
---|
137 | . S STM=$TR(STM,":- "),STM=$E(STM,1,2)*60+$E(STM,3,4)*60+$E(STM,5,6)
|
---|
138 | . S ETM=$TR(ETM,":- "),ETM=$E(ETM,1,2)*60+$E(ETM,3,4)*60+$E(ETM,5,6)
|
---|
139 | . I $P(H,",",2)'<STM,$P(H,",",2)'>ETM S HT=$P(NZ,U,3)
|
---|
140 | I HT'=0 Q HT_U_(ETM-$P(H,",",2))
|
---|
141 | Q ""
|
---|
142 | ;
|
---|
143 | TIMECK(T) N H,M,S I T?4.6N S H=+$E(T,1,2),M=+$E(T,3,4),S=+$E(T,5,6)
|
---|
144 | E I T[":" S H=+$P(T,":"),M=+$P(T,":",2),S=+$P(T,":",3)
|
---|
145 | E I T["-" S H=+$P(T,"-"),M=+$P(T,"-",2),S=+$P(T,"-",3)
|
---|
146 | E I T[" " S H=+$P(T," "),M=+$P(T," ",2),S=+$P(T," ",3)
|
---|
147 | E Q 0
|
---|
148 | I H<24,M<60,S<60 Q 1
|
---|
149 | Q 0
|
---|
150 | ;
|
---|
151 | REQUEUE(Q,X) ; Requeue Checked Out requests.
|
---|
152 | ; Change the status of all "C" entries in a Request Queue to "Q".
|
---|
153 | ; If ZTQUEUED not set, run this interactively.
|
---|
154 | ; Input - Request Queue IEN
|
---|
155 | ; Output - 0 = no requests requeued
|
---|
156 | ; 1 = requests weere requeued
|
---|
157 | S X=0
|
---|
158 | I $G(Q)="" W:'$D(ZTQUEUED) !,"Invalid queue IEN" Q
|
---|
159 | ;
|
---|
160 | ; Quit if no requests are Checked Out
|
---|
161 | I $O(^VDEFHL7(579.3,"C","C",0))="" W:'$D(ZTQUEUED) !,"No Requests in Checked Out status" Q
|
---|
162 | ;
|
---|
163 | ; Get Queue
|
---|
164 | N QUE S QUE=$P($G(^VDEFHL7(579.3,Q,0)),U)
|
---|
165 | I QUE="" W:'$D(ZTQUEUED) !,"Invalid queue" Q
|
---|
166 | G REQUEUE1:$D(ZTQUEUED)
|
---|
167 | K DIR S DIR(0)="Y",DIR("A")="Are you sure you want to continue",DIR("B")="No"
|
---|
168 | W !,"This action will reset all entries in the '"_QUE_"' queue to 'Q'ueued."
|
---|
169 | D ^DIR I Y=0 W !,"Entries not reset." Q
|
---|
170 | REQUEUE1 N FDA,IEN,MSG S IEN=""
|
---|
171 | F S IEN=$O(^VDEFHL7(579.3,"C","C",Q,IEN)) Q:'IEN D
|
---|
172 | . ;
|
---|
173 | . ; If request has not had an alert yet or can't be locked,
|
---|
174 | . ; don't requeue it.
|
---|
175 | . Q:$$GET1^DIQ(579.31,IEN_","_Q_",",.15,"I")=""
|
---|
176 | . L +^VDEFHL7(579.3,Q,IEN):1 Q:'$T
|
---|
177 | . ;
|
---|
178 | . ; Change status to "Q" (queued up) and delete
|
---|
179 | . ; the old check out date/time and alert date/time
|
---|
180 | . ; and error message
|
---|
181 | . K FDA,MSG S FDA(579.31,IEN_","_Q_",",.02)="Q"
|
---|
182 | . S FDA(579.31,IEN_","_Q_",",.15)="@"
|
---|
183 | . S FDA(579.31,IEN_","_Q_",",.09)="@"
|
---|
184 | . D FILE^DIE(,"FDA","MSG")
|
---|
185 | . K ^VDEFHL7(579.3,Q,1,IEN,"ERRMSG")
|
---|
186 | . L -^VDEFHL7(579.3,Q,IEN)
|
---|
187 | . S X=1
|
---|
188 | W:'$D(ZTQUEUED) !,"Entries reset to 'Q'ueued status for "_QUE_"."
|
---|
189 | Q
|
---|
190 | ;
|
---|
191 | ; Requeue Errored Out requests.
|
---|
192 | ; Change the status of all "E" entries in a Request Queue to "Q".
|
---|
193 | ; If ZTQUEUED not set, run this interactively.
|
---|
194 | RQERR(Q,X) ;
|
---|
195 | S X=0
|
---|
196 | I $G(Q)="" W:'$D(ZTQUEUED) !,"Invalid queue IEN" Q
|
---|
197 | ;
|
---|
198 | ; Quit if no requests are Errored Out
|
---|
199 | I $O(^VDEFHL7(579.3,"C","E",0))="" W:'$D(ZTQUEUED) !,"No Requests in Errored Out status" Q
|
---|
200 | ;
|
---|
201 | ; Get Queue
|
---|
202 | N QUE S QUE=$P($G(^VDEFHL7(579.3,Q,0)),U)
|
---|
203 | I QUE="" W:'$D(ZTQUEUED) !,"Invalid queue" Q
|
---|
204 | G RQERR1:$D(ZTQUEUED)
|
---|
205 | K DIR S DIR(0)="Y",DIR("A")="Are you sure you want to continue",DIR("B")="No"
|
---|
206 | W !,"This action resets all Errored Out entries in the '"_QUE_"' queue to 'Q'ueued."
|
---|
207 | D ^DIR I Y=0 W !,"Entries not reset." Q
|
---|
208 | RQERR1 N FDA,IEN,MSG S IEN=""
|
---|
209 | F S IEN=$O(^VDEFHL7(579.3,"C","E",Q,IEN)) Q:'IEN D
|
---|
210 | . L +^VDEFHL7(579.3,Q,IEN):1 Q:'$T
|
---|
211 | . ;
|
---|
212 | . ; Fix the actual status in the record if it's not "E".
|
---|
213 | . I $$GET1^DIQ(579.31,IEN_","_Q_",",.02,"I")'="E" D
|
---|
214 | .. K FDA,MSG S FDA(579.31,IEN_","_Q_",",.02)="E"
|
---|
215 | .. D FILE^DIE(,"FDA","MSG")
|
---|
216 | . ;
|
---|
217 | . ; Change status to "Q" (queued up) and delete
|
---|
218 | . ; the old check out date/time and alert date/time
|
---|
219 | . ; and error message
|
---|
220 | . K FDA,MSG S FDA(579.31,IEN_","_Q_",",.02)="Q"
|
---|
221 | . S FDA(579.31,IEN_","_Q_",",.15)="@"
|
---|
222 | . S FDA(579.31,IEN_","_Q_",",.09)="@"
|
---|
223 | . D FILE^DIE(,"FDA","MSG")
|
---|
224 | . K ^VDEFHL7(579.3,Q,1,IEN,"ERRMSG")
|
---|
225 | . L -^VDEFHL7(579.3,Q,IEN)
|
---|
226 | . S X=1
|
---|
227 | W:'$D(ZTQUEUED) !,"Entries reset to 'Q'ueued status for "_QUE_"."
|
---|
228 | Q
|
---|