| [613] | 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 | 
|---|