| 1 | HLEVAPI3 ;O-OIFO/LJA - Event Monitor APIs ;02/04/2004 14:42 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | EVENTONE(HLEVIENM,HLEVNM,HLEVIENE) ; Master job check of an event... | 
|---|
| 5 | ; ZTSKMST -- req | 
|---|
| 6 | N CONT,CURR,CURRNOW,IEN,LAPSEMIN,LASTRUN,MAILGRP,MCHECK,MSTART,NO,NODE | 
|---|
| 7 | N NODE0,NODE40,PAR1,PAR2,PAR3,PAR4,PAR5,PAR6,PAR7,PAR8,RUNNOW | 
|---|
| 8 | N START,STAT,ZTDESC,ZTDTH,ZTIO,ZTRTN | 
|---|
| 9 | ; | 
|---|
| 10 | S NODE0=$G(^HLEV(776.1,+$G(HLEVIENE),0)) | 
|---|
| 11 | I NODE0']"" D RECEVM(HLEVIENM,HLEVIENE,"X^NO-0-NODE") QUIT  ;-> | 
|---|
| 12 | S STAT=$P(NODE0,U,2) I STAT'="A" D RECEVM(HLEVIENM,HLEVIENE,"I") QUIT  ;-> | 
|---|
| 13 | ; Requeue minutes for monitor... | 
|---|
| 14 | S LAPSE=$P(NODE0,U,4) I LAPSE'?1.N D RECEVM(HLEVIENM,HLEVIENE,"X^INVALID-LAPSE") QUIT  ;-> | 
|---|
| 15 | ; | 
|---|
| 16 | ; Required M TAG^RTN for monitor... | 
|---|
| 17 | S MSTART=$TR($P(NODE0,U,6),"~",U) I '$$OKMCODE^HLEVAPI0(MSTART) D  QUIT  ;-> | 
|---|
| 18 | .  D RECEVM(HLEVIENM,HLEVIENE,"X^INVALID-M ["_$TR(MSTART,U,"~")_"]") | 
|---|
| 19 | ; | 
|---|
| 20 | ; Optional M $$EXTFUNCTION^RTN for determining whether new job should start | 
|---|
| 21 | S MCHECK=$TR($P(NODE0,U,7),"~",U) | 
|---|
| 22 | ; | 
|---|
| 23 | ; If M check for start code exists, but is not valid M code, quit... | 
|---|
| 24 | I MCHECK]"",'$$OKMCODE^HLEVAPI0($P(MCHECK,"$$",2,99)) D  QUIT  ;-> | 
|---|
| 25 | .  D RECEVM(HLEVIENM,HLEVIENE,"X-INVALID-M-CHK ["_$TR(MCHECK,U,"~")_"]") | 
|---|
| 26 | ; | 
|---|
| 27 | ; When last run (started)?  Return NULL if not completed... | 
|---|
| 28 | S IEN=$O(^HLEV(776,"M",+HLEVIENE,":"),-1) | 
|---|
| 29 | S (NODE,LASTRUN(1))=$G(^HLEV(776,+IEN,0)) | 
|---|
| 30 | S LASTRUN=$P(NODE,U),LASTRUN=$S(LASTRUN?7N1"."1.N:LASTRUN,1:"") | 
|---|
| 31 | S X=$P(NODE,U,2) I X?7N1"."1.N S LASTRUN=X | 
|---|
| 32 | ; | 
|---|
| 33 | ; Set start new job default to YES... | 
|---|
| 34 | S CONT=1 | 
|---|
| 35 | ; | 
|---|
| 36 | ; If M start check code doesn't exist, check usual fields... | 
|---|
| 37 | I MCHECK']"" D  QUIT:'CONT  ;-> | 
|---|
| 38 | . | 
|---|
| 39 | .  ;Start new monitor if last job running and timestamp is current, | 
|---|
| 40 | .  ;or monitor never run... | 
|---|
| 41 | . | 
|---|
| 42 | .  ; Never run, so start new monitor... | 
|---|
| 43 | .  QUIT:LASTRUN']"" | 
|---|
| 44 | . | 
|---|
| 45 | .  ; Monitor running now, and is current, so don't do anything... | 
|---|
| 46 | .  S CURRNOW=$$CURR^HLEVAPI1(+IEN) I CURRNOW D  QUIT  ;-> | 
|---|
| 47 | .  .  I CURRNOW S CONT=0 | 
|---|
| 48 | .  .  D RECEVM(HLEVIENM,HLEVIENE,"R") ; Monitor running already... | 
|---|
| 49 | . | 
|---|
| 50 | .  ; Monitor run, and if time to run new monitor, quit... | 
|---|
| 51 | .  S RUNNOW=$$RUNEV^HLEVAPI0(LASTRUN,LAPSE) QUIT:RUNNOW  ;-> | 
|---|
| 52 | . | 
|---|
| 53 | .  S CONT=0 ; Set "no new monitor job needed" variable... | 
|---|
| 54 | .  D RECEVM(HLEVIENM,HLEVIENE,"E") QUIT  ;-> Too early... | 
|---|
| 55 | ; | 
|---|
| 56 | I MCHECK]"" D  QUIT:'CONT  ;-> | 
|---|
| 57 | .  N HLEVRUN | 
|---|
| 58 | .  D RUNS(HLEVIENE,.HLEVRUN) ; Define recent monitor runs for API call... | 
|---|
| 59 | .  S CONT="S CONT="_MCHECK X CONT | 
|---|
| 60 | .  S CONT=$S(CONT=1:1,1:0) QUIT:CONT  ;-> | 
|---|
| 61 | .  D RECEVM(HLEVIENM,HLEVIENE,"M") ; Package API check failed... | 
|---|
| 62 | ; | 
|---|
| 63 | S HLEVIENJ=$$NEWEVENT^HLEVAPI(HLEVIENE) I HLEVIENJ'>0 D  QUIT  ;-> | 
|---|
| 64 | .  KILL HLPAR1D,HLPAR2D,HLPAR3D,HLPAR4D,HLPAR5D,HLPAR6D,HLPAR7D,HLPAR8D | 
|---|
| 65 | ; | 
|---|
| 66 | ; Queue a new job... | 
|---|
| 67 | S ZTIO="",ZTDTH=$H,ZTDESC="HL Event Monitor - #"_HLEVIENE | 
|---|
| 68 | S ZTRTN="QUEUEV^HLEVAPI3" | 
|---|
| 69 | S ZTSAVE("HLEVIENJ")="",ZTSAVE("HLEVIENE")="" | 
|---|
| 70 | S ZTSAVE("HLEVNM")="",ZTSAVE("HLEVIENM")="" | 
|---|
| 71 | D ^%ZTLOAD | 
|---|
| 72 | ; | 
|---|
| 73 | ; Save info in 776.2... | 
|---|
| 74 | D RECEVM(HLEVIENM,HLEVIENE,"Q",ZTSK,+HLEVIENJ) | 
|---|
| 75 | ; | 
|---|
| 76 | ; Save task number in 776... | 
|---|
| 77 | D UPDFLDE^HLEVAPI(+HLEVIENJ,8,ZTSK) | 
|---|
| 78 | ; | 
|---|
| 79 | ; Reset back... | 
|---|
| 80 | S ZTSK=ZTSKMST | 
|---|
| 81 | ; | 
|---|
| 82 | QUIT | 
|---|
| 83 | ; | 
|---|
| 84 | RUNS(HLEVIENE,RUN) ; Find latest 10 runs for calling API... | 
|---|
| 85 | N CT,IEN,NODE | 
|---|
| 86 | KILL RUN | 
|---|
| 87 | S CT=0,IEN=":" | 
|---|
| 88 | F  S IEN=$O(^HLEV(776,"M",HLEVIENE,IEN),-1) Q:'IEN  D  QUIT:CT>9 | 
|---|
| 89 | .  S NODE=$G(^HLEV(776,+IEN,0)) QUIT:NODE']""  ;-> | 
|---|
| 90 | .  S CT=CT+1 | 
|---|
| 91 | .  S RUN(CT)=NODE | 
|---|
| 92 | Q | 
|---|
| 93 | ; | 
|---|
| 94 | RECEVM(HLEVIENM,HLEVIENE,RES,ZTSK,HLEVIENJ) ; | 
|---|
| 95 | N CT,DATA,REA | 
|---|
| 96 | ; | 
|---|
| 97 | I $E(RES)="X" S REA=$P(RES,U,2),RES="X" | 
|---|
| 98 | ; | 
|---|
| 99 | S RES=$S($G(RES)]"":RES,1:"?") | 
|---|
| 100 | S NOEVCHK(RES)=$G(NOEVCHK(RES))+1 | 
|---|
| 101 | ; | 
|---|
| 102 | QUIT:$G(^HLEV(776.2,+$G(HLEVIENM),0))']""  ;-> | 
|---|
| 103 | QUIT:$G(^HLEV(776.1,+$G(HLEVIENE),0))']""  ;-> | 
|---|
| 104 | ; | 
|---|
| 105 | S CT=$O(^HLEV(776.2,+HLEVIENM,51,":"),-1)+1 | 
|---|
| 106 | S ^HLEV(776.2,+HLEVIENM,51,0)="^776.2051PA^"_CT_U_CT | 
|---|
| 107 | S DATA=HLEVIENE_U_$G(RES)_U_$$NOW^XLFDT | 
|---|
| 108 | I $G(ZTSK) S $P(DATA,U,4)=ZTSK | 
|---|
| 109 | I $G(REA)]"" S $P(DATA,U,7)=REA | 
|---|
| 110 | I $G(HLEVIENJ)>0 S $P(DATA,U,8)=HLEVIENJ | 
|---|
| 111 | S ^HLEV(776.2,+HLEVIENM,51,+CT,0)=DATA | 
|---|
| 112 | S ^HLEV(776.2,+HLEVIENM,51,"B",HLEVIENE,CT)="" | 
|---|
| 113 | ; | 
|---|
| 114 | Q | 
|---|
| 115 | ; | 
|---|
| 116 | QUEUEV ; Queued event job starts here... | 
|---|
| 117 | ; HLEVIENE,HLEVIENJ,HLEVIENM -- req | 
|---|
| 118 | N EVMCODE,EVMGRP,EVNAME,NODE,EVPAR1,EVPAR2,EVPAR3,EVPAR4,EVPAR5 | 
|---|
| 119 | N EVPAR6,DVPAR7,EVPAR8 | 
|---|
| 120 | ; | 
|---|
| 121 | S ZTREQ="@" | 
|---|
| 122 | ; | 
|---|
| 123 | ; Mark RUNNING before doing anything else... | 
|---|
| 124 | D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"R",+HLEVIENJ) | 
|---|
| 125 | ; | 
|---|
| 126 | S NODE=$G(^HLEV(776.1,+$G(HLEVIENE),0)) I NODE']"" D  QUIT  ;-> | 
|---|
| 127 | .  D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"XE",+HLEVIENJ) | 
|---|
| 128 | S EVNAME=$P(NODE,U),EVMGRP=$P(NODE,U,5) | 
|---|
| 129 | S EVMCODE=$TR($P(NODE,U,6),"~",U) I EVMCODE'?1.8E1"^"1.8E D  QUIT  ;-> | 
|---|
| 130 | .  D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"XE",+HLEVIENJ) | 
|---|
| 131 | ; | 
|---|
| 132 | ; Node 40... | 
|---|
| 133 | S NODE40=$G(^HLEV(776.1,+HLEVIENE,40)) | 
|---|
| 134 | F NO=1:1:8 S @("EVPAR"_NO)=$P(NODE40,U,NO) | 
|---|
| 135 | ; | 
|---|
| 136 | ; Final M code check... | 
|---|
| 137 | I '$$OKMCODE^HLEVAPI0(EVMCODE) D  QUIT  ;-> | 
|---|
| 138 | .  D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"XM",+HLEVIENJ) | 
|---|
| 139 | ; | 
|---|
| 140 | D @EVMCODE | 
|---|
| 141 | ; | 
|---|
| 142 | D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"F",+HLEVIENJ) | 
|---|
| 143 | ; | 
|---|
| 144 | Q | 
|---|
| 145 | ; | 
|---|
| 146 | MAILIT ; Generic mail out call... | 
|---|
| 147 | ; HLEVIENE,HLEVIENJ -- req | 
|---|
| 148 | ; XMY(...) can be created before this call... | 
|---|
| 149 | N MGRP | 
|---|
| 150 | ; | 
|---|
| 151 | D DEBUG^HLEVAPI2("MAILIT") ; Debug data created conditionally | 
|---|
| 152 | ; | 
|---|
| 153 | ; Stop all event monitoring to enable on-site debugging... | 
|---|
| 154 | QUIT:$G(^TMP("HLEVFLAG",$J))["STOP"  ;-> | 
|---|
| 155 | ; | 
|---|
| 156 | D ADDXMYS^HLEVAPI2(HLEVIENE,$G(XTMP)) | 
|---|
| 157 | ; | 
|---|
| 158 | ; If no mail group, and no passed in XMY, use DUZ... | 
|---|
| 159 | I '$D(XMY),$G(DUZ)>0 S XMY(DUZ)="" | 
|---|
| 160 | ; | 
|---|
| 161 | QUIT:'$D(XMY) | 
|---|
| 162 | ; | 
|---|
| 163 | D SENDMAIL^HLEVAPI(HLEVIENE,+$G(HLEVIENJ),.XMY) ; Use generic email... | 
|---|
| 164 | ; | 
|---|
| 165 | KILL XMSUB,XMTEXT,XMY | 
|---|
| 166 | ; | 
|---|
| 167 | Q | 
|---|
| 168 | ; | 
|---|
| 169 | MONFLAG(VAL) ; Set ^TMP("HLEVFLAG",$J), or return it's value... | 
|---|
| 170 | ; User may pass in the following values for VAL... | 
|---|
| 171 | ; | 
|---|
| 172 | ; * ABORT,STOP   -> Will set ^TMP("HLEVFLAG",$J)="STOP" | 
|---|
| 173 | ; * START,RUN,XEC -> Will kill ^TMP("HLEVFLAG",$J) | 
|---|
| 174 | ; * SHOW,"" -> Will return value of ^TMP("HLEVFLAG",$J) | 
|---|
| 175 | ; | 
|---|
| 176 | ; What did user pass in? | 
|---|
| 177 | S VAL=$$UP^XLFSTR($G(VAL)) | 
|---|
| 178 | S VAL=$S(VAL="STOP":"STOP",VAL="ABORT":"STOP",VAL="SET":"STOP",VAL="KILL":"@",VAL="START":"@",VAL="RUN":"@",VAL="XEC":"@",1:"") | 
|---|
| 179 | ; | 
|---|
| 180 | I VAL']"" QUIT $G(^TMP("HLEVFLAG",$J)) ;-> Just show value... | 
|---|
| 181 | I VAL="@" KILL ^TMP("HLEVFLAG",$J) QUIT "" ;-> | 
|---|
| 182 | I VAL="STOP" S ^TMP("HLEVFLAG",$J)="STOP" QUIT "STOP" ;-> | 
|---|
| 183 | ; | 
|---|
| 184 | Q $G(^TMP("HLEVFLAG",$J)) | 
|---|
| 185 | ; | 
|---|
| 186 | COUNT(MON,STATUS,GBL,LIM) ; Number of entries for monitor with STATUS... | 
|---|
| 187 | ; | 
|---|
| 188 | ; Pass in... MON    -> Name or IEN of monitor | 
|---|
| 189 | ; | 
|---|
| 190 | ;            STATUS -> 776's STATUS field code or full expansion | 
|---|
| 191 | ;                      -- Default = RUNNING | 
|---|
| 192 | ;                      -- Pass in ALL for all entries | 
|---|
| 193 | ; | 
|---|
| 194 | ;            [GBL]  -> Global for entry storage. [OPTIONAL] | 
|---|
| 195 | ;                      Creates @GBL@(#)=IEN ~ 776 zero node | 
|---|
| 196 | ;                      (KILL @GBL at beginning!) | 
|---|
| 197 | ; | 
|---|
| 198 | ;            [LIM]  -> Limit to # entries/status to store in GBL. | 
|---|
| 199 | ; | 
|---|
| 200 | ; | 
|---|
| 201 | ; Examples: | 
|---|
| 202 | ; | 
|---|
| 203 | ; $$COUNT("FAST HL7 PURGE #2") -> # events running (default) | 
|---|
| 204 | ; $$COUNT("FAST HL7 PURGE #2","R") -> # events running | 
|---|
| 205 | ; $$COUNT("FAST HL7 PURGE #2","ALL") -> # events of all statuses | 
|---|
| 206 | ; | 
|---|
| 207 | ; The call...  $$COUNT("FAST HL7 PURGE #2","ALL","HLEV",1) | 
|---|
| 208 | ; | 
|---|
| 209 | ; Returns...   (1) # event entries that exist of all statuses. | 
|---|
| 210 | ;              (2) Stores entries in HLEV(#)=zero node | 
|---|
| 211 | ;              (3) Stores only the most recent entry (LIM=1) | 
|---|
| 212 | ; | 
|---|
| 213 | ;              If LIM>2, for example, the most recent two entries | 
|---|
| 214 | ;              would be returned.  But, note that the subscripting | 
|---|
| 215 | ;              is not oldest to newest, but newest (with subscript | 
|---|
| 216 | ;              of 1) to oldest (with subscript of 2.) | 
|---|
| 217 | ; | 
|---|
| 218 | N CT,IEN,NO | 
|---|
| 219 | ; | 
|---|
| 220 | QUIT:$G(MON)']"" "" ;-> | 
|---|
| 221 | S:$G(STATUS)']"" STATUS="R" ; Default to RUNNING... | 
|---|
| 222 | S:STATUS="ALL" STATUS="EFQR" | 
|---|
| 223 | I STATUS'="EFQR" S STATUS=$$UP^XLFSTR($E($G(STATUS)_" ")) | 
|---|
| 224 | QUIT:"EFQR"'[STATUS "" ;-> | 
|---|
| 225 | ; | 
|---|
| 226 | ; If passed GBL, check/set limit.. | 
|---|
| 227 | S GBL=$G(GBL),LIM=$G(LIM) | 
|---|
| 228 | S LIM=$S(LIM:LIM,1:999999) | 
|---|
| 229 | ; | 
|---|
| 230 | ; It's OK to pass in the IEN... | 
|---|
| 231 | I MON'=+MON S MON=$O(^HLEV(776.1,"B",MON,0)) QUIT:MON'>0 "" ;-> | 
|---|
| 232 | ; | 
|---|
| 233 | ; Remove any data hanging around from before call... | 
|---|
| 234 | I GBL]"" KILL @GBL | 
|---|
| 235 | ; | 
|---|
| 236 | S CT=0,IEN=":" | 
|---|
| 237 | F  S IEN=$O(^HLEV(776,"M",+MON,IEN),-1) Q:'IEN  D | 
|---|
| 238 | .  S DATA=$G(^HLEV(776,+IEN,0)) | 
|---|
| 239 | .  ; Don't count if doesn't even have a status! | 
|---|
| 240 | .  QUIT:$P(DATA,U,4)']""  ;-> | 
|---|
| 241 | .  ; If STATUS="EFQR", every status should be counted... | 
|---|
| 242 | .  I STATUS'="EFQR" QUIT:$P(DATA,U,4)'=STATUS  ;-> | 
|---|
| 243 | .  S CT=CT+1 | 
|---|
| 244 | .  QUIT:$G(GBL)']""  ;-> Don't store and return... | 
|---|
| 245 | .  S CT(1)=$O(@GBL@($P(DATA,U,4),":"),-1)+1 | 
|---|
| 246 | .  QUIT:CT(1)>LIM  ;-> | 
|---|
| 247 | .  S @GBL@($P(DATA,U,4),+CT(1))=IEN_"~"_DATA | 
|---|
| 248 | ; | 
|---|
| 249 | Q $S(CT:CT,1:"") | 
|---|
| 250 | ; | 
|---|
| 251 | MARKERR ; Mark any RUNNING, but non-current entry's status to ERROR... | 
|---|
| 252 | N DATA,IEN776,HLEVIENE,HLEVIENM,STAT | 
|---|
| 253 | ; | 
|---|
| 254 | S IEN776=0 | 
|---|
| 255 | F  S IEN776=$O(^HLEV(776,IEN776)) Q:'IEN776  D | 
|---|
| 256 | .  S DATA=$G(^HLEV(776,+IEN776,0)) | 
|---|
| 257 | .  S STAT=$P(DATA,U,4) QUIT:STAT'="R"&(STAT'="Q")  ;-> | 
|---|
| 258 | .  QUIT:$$CURR^HLEVAPI1(+IEN776)  ;-> | 
|---|
| 259 | .  S HLEVIENE=$P(DATA,U,3) QUIT:$G(^HLEV(776.1,+HLEVIENE,0))']""  ;-> | 
|---|
| 260 | .  S HLEVIENM=$P(DATA,U,9) QUIT:$G(^HLEV(776.2,+HLEVIENM,0))']""  ;-> | 
|---|
| 261 | .  D EVRES^HLEVAPI0(HLEVIENM,HLEVIENE,"XE",IEN776) | 
|---|
| 262 | ; | 
|---|
| 263 | Q | 
|---|
| 264 | ; | 
|---|
| 265 | EOR ;HLEVAPI3 - Event Monitor APIs ;5/16/03 14:42 | 
|---|