| 1 | HLEVAPI ;O-OIFO/LJA - Event Monitor APIs ;02/04/2004 14:42 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | ; Routine   Supported APIs... | 
|---|
| 5 | ; ----------------------------------------------------------------- | 
|---|
| 6 | ; HLEVAPI   START(VAR) | 
|---|
| 7 | ; HLEVAPI   CHECKIN | 
|---|
| 8 | ; HLEVAPI   CHECKOUT | 
|---|
| 9 | ; HLEVAPI   ABORT(STATUS,APPLSTAT) | 
|---|
| 10 | ; HLEVAPI   MAILIT | 
|---|
| 11 | ; HLEVAPI   VARIABLE | 
|---|
| 12 | ; ----------------------------------------------------------------- | 
|---|
| 13 | ; HLEVAPI0  ONOFFM(HLEVIENE) | 
|---|
| 14 | ; ----------------------------------------------------------------- | 
|---|
| 15 | ; HLEVAPI1  APPSTAT(STATUS) | 
|---|
| 16 | ; HLEVAPI1  MSGTEXT(GBL) | 
|---|
| 17 | ; HLEVAPI1  RUNDIARY(GBL) | 
|---|
| 18 | ; | 
|---|
| 19 | ; | 
|---|
| 20 | ; Test server code with TEST^HLEVSRV1 (Also HLEVMNU) | 
|---|
| 21 | ; Test monitor code with TEST^HLEVUTI1 (Also HLEVMNU) | 
|---|
| 22 | ; | 
|---|
| 23 | ; | 
|---|
| 24 | ;                     EVENT CODE | 
|---|
| 25 | ; | 
|---|
| 26 | VARIABLE(HLEVIENJ,HLVAR) ; Store passed in variables... | 
|---|
| 27 | ; HLVAR can be the name of a variable, like "CT", or it can be | 
|---|
| 28 | ; a list of variables passed by reference. | 
|---|
| 29 | N VAL,VAR | 
|---|
| 30 | ; | 
|---|
| 31 | D DEBUG^HLEVAPI2("VARIABLE") ; Debug data created conditionally | 
|---|
| 32 | ; | 
|---|
| 33 | ; Stop all event monitoring to enable on-site debugging... | 
|---|
| 34 | QUIT:$G(^TMP("HLEVFLAG",$J))["STOP"  ;-> | 
|---|
| 35 | ; | 
|---|
| 36 | QUIT:$G(^HLEV(776,+$G(HLEVIENJ),0))']""  ;-> | 
|---|
| 37 | ; | 
|---|
| 38 | ; Loop thru array... | 
|---|
| 39 | S VAR="" | 
|---|
| 40 | F  S VAR=$O(HLVAR(VAR)) Q:VAR']""  D | 
|---|
| 41 | .  I $E(VAR,$L(VAR))="*" D  QUIT  ;-> | 
|---|
| 42 | .  .  QUIT:VAR="*"  ;-> | 
|---|
| 43 | .  .  D VARSTAR(HLEVIENJ,VAR) | 
|---|
| 44 | .  D STOREIT(HLEVIENJ,VAR,$S($D(@VAR):@VAR,1:"---"),$G(HLVAR(VAR))) | 
|---|
| 45 | ; | 
|---|
| 46 | Q | 
|---|
| 47 | ; | 
|---|
| 48 | VARSTAR(HLEVIENJ,VAR) ; Store VAR* variables... | 
|---|
| 49 | N GBL,LP,REF,ROOT,X,X1 | 
|---|
| 50 | ; | 
|---|
| 51 | KILL ^TMP("HLORDER",$J) | 
|---|
| 52 | S GBL=$NA(^TMP("HLORDER",$J)),ROOT=$E(GBL,1,$L(GBL)-1)_"," | 
|---|
| 53 | S X=ROOT,X1(VAR)="" D ORDER^%ZOSV | 
|---|
| 54 | QUIT:'$D(GBL)  ;-> | 
|---|
| 55 | ; | 
|---|
| 56 | ; $Q thru global... | 
|---|
| 57 | S LP=GBL | 
|---|
| 58 | F  S LP=$Q(@LP) Q:LP'[ROOT  D | 
|---|
| 59 | .  S REF=$P(LP,ROOT,2) QUIT:REF'[")"  ;-> | 
|---|
| 60 | .  S REF=$P($TR(REF,"""",""),")") QUIT:REF']""  ;-> | 
|---|
| 61 | .  I $L(REF)>10 S REF=$E(REF,1,9)_"~" | 
|---|
| 62 | .  D STOREIT(+HLEVIENJ,REF,@LP) | 
|---|
| 63 | ; | 
|---|
| 64 | Q | 
|---|
| 65 | ; | 
|---|
| 66 | STOREIT(HLEVIENJ,VAR,VAL,EXPL) ; Store VAR in 776... | 
|---|
| 67 | N MIEN | 
|---|
| 68 | S EXPL=$G(EXPL) | 
|---|
| 69 | S MIEN=$O(^HLEV(776,+HLEVIENJ,52,"B",VAR,0)) | 
|---|
| 70 | I MIEN'>0 S MIEN=$O(^HLEV(776,+HLEVIENJ,52,":"),-1)+1 | 
|---|
| 71 | S ^HLEV(776,+HLEVIENJ,52,+MIEN,0)=VAR_$S(EXPL]"":U_EXPL,1:"") | 
|---|
| 72 | S ^HLEV(776,+HLEVIENJ,52,+MIEN,52)=VAL | 
|---|
| 73 | S ^HLEV(776,+HLEVIENJ,52,"B",VAR,MIEN)="" | 
|---|
| 74 | S MIEN=$O(^HLEV(776,+HLEVIENJ,52,":"),-1) | 
|---|
| 75 | I MIEN'>0 KILL ^HLEV(776,+HLEVIENJ,52) QUIT  ;-> | 
|---|
| 76 | S ^HLEV(776,+HLEVIENJ,52,0)="^776.003A^"_MIEN_U_MIEN | 
|---|
| 77 | Q | 
|---|
| 78 | ; | 
|---|
| 79 | STOREVAR ; Update VARIABLE VALUE multiple in 776... | 
|---|
| 80 | ; HLEVIENJ -- req | 
|---|
| 81 | ; | 
|---|
| 82 | ; Stop all event monitoring to enable on-site debugging... | 
|---|
| 83 | QUIT:$G(^TMP("HLEVFLAG",$J))["STOP"  ;-> | 
|---|
| 84 | ; | 
|---|
| 85 | N MIEN,VAL,VAR | 
|---|
| 86 | ; Store variable values in 776... | 
|---|
| 87 | S VAR="" | 
|---|
| 88 | F  S VAR=$O(HLEVAR(VAR)) Q:VAR']""  D | 
|---|
| 89 | .  S VAL=$S($D(@VAR):@VAR,1:"---") | 
|---|
| 90 | .  S MIEN=$O(^HLEV(776,+HLEVIENJ,52,"B",VAR,0)) | 
|---|
| 91 | .  I MIEN'>0 S MIEN=$O(^HLEV(776,+HLEVIENJ,52,":"),-1)+1 | 
|---|
| 92 | .  S ^HLEV(776,+HLEVIENJ,52,+MIEN,0)=VAR_U_HLEVAR(VAR) | 
|---|
| 93 | .  S ^HLEV(776,+HLEVIENJ,52,+MIEN,52)=VAL | 
|---|
| 94 | .  S ^HLEV(776,+HLEVIENJ,52,"B",VAR,MIEN)="" | 
|---|
| 95 | S MIEN=$O(^HLEV(776,+HLEVIENJ,52,":"),-1) | 
|---|
| 96 | I MIEN'>0 KILL ^HLEV(776,+HLEVIENJ,52) QUIT  ;-> | 
|---|
| 97 | S ^HLEV(776,+HLEVIENJ,52,0)="^776.003A^"_MIEN_U_MIEN | 
|---|
| 98 | Q | 
|---|
| 99 | ; | 
|---|
| 100 | START(VARIABLE) ; Start the whole monitoring process. | 
|---|
| 101 | ; HLEVIENE,HLEVIENJ,HLEVIENM -- req --> HLEVAR() | 
|---|
| 102 | ; | 
|---|
| 103 | ; - Pass in by reference the VARIABLEs being tracked. | 
|---|
| 104 | ; | 
|---|
| 105 | ;   >S VAR("VARNAME")="REPORT-VARNAME" | 
|---|
| 106 | ;   >D DECLARE("MONITOR-NAME",.VAR) | 
|---|
| 107 | ; | 
|---|
| 108 | N E,EXPL,I,MIEN,NO,NODE,TXT,VAR | 
|---|
| 109 | ; | 
|---|
| 110 | D DEBUG^HLEVAPI2("START") ; Debug data created conditionally | 
|---|
| 111 | ; | 
|---|
| 112 | ; Stop all event monitoring to enable on-site debugging... | 
|---|
| 113 | QUIT:$G(^TMP("HLEVFLAG",$J))["STOP"  ;-> | 
|---|
| 114 | ; | 
|---|
| 115 | ; Check STATUS-EVENT... | 
|---|
| 116 | QUIT:$P($G(^HLEV(776.999,1,0)),U,6)'="A"  ;-> | 
|---|
| 117 | ; | 
|---|
| 118 | ; Presets... | 
|---|
| 119 | S NO=0 | 
|---|
| 120 | KILL HLEVAR | 
|---|
| 121 | ; | 
|---|
| 122 | ; If passed in a variable name directly in VARIABLE | 
|---|
| 123 | I $G(VARIABLE)]"" F PCE=1:1:$L(VARIABLE,U) D | 
|---|
| 124 | .  S X=$P(VARIABLE,U,+PCE) I X]"" S NO=NO+1,HLEVAR(X)=X | 
|---|
| 125 | ; | 
|---|
| 126 | ; Convert passed in variable to format expected by CHECKIN & CHECKOUT | 
|---|
| 127 | S VAR="" | 
|---|
| 128 | F  S VAR=$O(VARIABLE(VAR)) Q:VAR']""  D | 
|---|
| 129 | .  S EXPL=VARIABLE(VAR) S:EXPL']"" EXPL=VAR | 
|---|
| 130 | .  S NO=NO+1,HLEVAR(VAR)=EXPL | 
|---|
| 131 | ; | 
|---|
| 132 | KILL VARIABLE | 
|---|
| 133 | ; | 
|---|
| 134 | ; Make initial DIARY entry... | 
|---|
| 135 | S TXT="DECLARE called - "_$P($G(^HLEV(776.1,+HLEVIENE,0)),U) | 
|---|
| 136 | D WPTXT^HLEVUTIL(776,HLEVIENJ,50,776.001,TXT) | 
|---|
| 137 | ; | 
|---|
| 138 | Q | 
|---|
| 139 | ; | 
|---|
| 140 | CHECKIN ; Call here to update the EVENT using "your" DECLARE variables... | 
|---|
| 141 | N D,D0,DA,DI,DIE,DR,NO | 
|---|
| 142 | ; | 
|---|
| 143 | D DEBUG^HLEVAPI2("CHECKIN") ; Debug data created conditionally | 
|---|
| 144 | ; | 
|---|
| 145 | ; Stop all event monitoring to enable on-site debugging... | 
|---|
| 146 | QUIT:$G(^TMP("HLEVFLAG",$J))["STOP"  ;-> | 
|---|
| 147 | ; | 
|---|
| 148 | ; Does entry exist? | 
|---|
| 149 | QUIT:$G(^HLEV(776,+$G(HLEVIENJ),0))']""  ;-> | 
|---|
| 150 | ; | 
|---|
| 151 | D STOREVAR | 
|---|
| 152 | ; | 
|---|
| 153 | ; Fill in zero node... | 
|---|
| 154 | S DA=+HLEVIENJ,DIE=776 | 
|---|
| 155 | S DR="4///R;6////"_$$NOW^XLFDT | 
|---|
| 156 | D ^DIE | 
|---|
| 157 | ; | 
|---|
| 158 | Q | 
|---|
| 159 | ; | 
|---|
| 160 | ABORT(STATUS,APPLST) ; Call here if job is to be aborted... | 
|---|
| 161 | N DA,DIE,DR,NOW | 
|---|
| 162 | ; | 
|---|
| 163 | D DEBUG^HLEVAPI2("ABORT") ; Debug data created conditionally | 
|---|
| 164 | ; | 
|---|
| 165 | ; Stop all event monitoring to enable on-site debugging... | 
|---|
| 166 | QUIT:$G(^TMP("HLEVFLAG",$J))["STOP"  ;-> | 
|---|
| 167 | ; | 
|---|
| 168 | ; Does entry exist? | 
|---|
| 169 | QUIT:$G(^HLEV(776,+$G(HLEVIENJ),0))']""  ;-> | 
|---|
| 170 | ; | 
|---|
| 171 | D CHECKIN | 
|---|
| 172 | ; | 
|---|
| 173 | S DA=+HLEVIENJ,DIE=776 | 
|---|
| 174 | S NOW=$$NOW^XLFDT | 
|---|
| 175 | S STATUS=$E($$UP^XLFSTR($G(STATUS)_" ")) | 
|---|
| 176 | S STATUS=$S("EFQR"[STATUS:STATUS,1:"E") | 
|---|
| 177 | S DR="2////"_NOW_";4///"_STATUS_";6////"_NOW | 
|---|
| 178 | S:$G(APPLST)]"" DR=DR_";5///"_$TR($E(APPLST,1,10),U,"~") | 
|---|
| 179 | D ^DIE | 
|---|
| 180 | ; | 
|---|
| 181 | D EVCHKD^HLEVAPI2($G(HLEVIENM),$G(HLEVIENE),$G(HLEVIENJ),STATUS) | 
|---|
| 182 | ; | 
|---|
| 183 | KILL HLEVAR ; Passed-in user variables... | 
|---|
| 184 | ; | 
|---|
| 185 | Q | 
|---|
| 186 | ; | 
|---|
| 187 | CHECKOUT ; Call here to end EVENT using "your" DECLARE variables... | 
|---|
| 188 | N DA,DIE,DR,NOW | 
|---|
| 189 | ; | 
|---|
| 190 | D DEBUG^HLEVAPI2("CHECKOUT") ; Debug data created conditionally | 
|---|
| 191 | ; | 
|---|
| 192 | ; Stop all event monitoring to enable on-site debugging... | 
|---|
| 193 | QUIT:$G(^TMP("HLEVFLAG",$J))["STOP"  ;-> | 
|---|
| 194 | ; | 
|---|
| 195 | ; Does entry exist? | 
|---|
| 196 | QUIT:$G(^HLEV(776,+$G(HLEVIENJ),0))']""  ;-> | 
|---|
| 197 | ; | 
|---|
| 198 | D CHECKIN | 
|---|
| 199 | ; | 
|---|
| 200 | S DA=+HLEVIENJ,DIE=776 | 
|---|
| 201 | S NOW=$$NOW^XLFDT | 
|---|
| 202 | S DR="2////"_NOW_";4///F;6////"_NOW | 
|---|
| 203 | D ^DIE | 
|---|
| 204 | ; | 
|---|
| 205 | D EVCHKD^HLEVAPI2($G(HLEVIENM),$G(HLEVIENE),$G(HLEVIENJ)) | 
|---|
| 206 | ; | 
|---|
| 207 | KILL HLEVAR ; Passed-in user variables... | 
|---|
| 208 | ; | 
|---|
| 209 | Q | 
|---|
| 210 | ; | 
|---|
| 211 | MAILIT D MAILIT^HLEVAPI3 | 
|---|
| 212 | Q | 
|---|
| 213 | ; | 
|---|
| 214 | SENDMAIL(HLEVIENE,HLEVIENJ,XMY) ; Mail info in 776 event monitor's ^(51)... | 
|---|
| 215 | ; | 
|---|
| 216 | ; PARAMETER NOTES | 
|---|
| 217 | ; --------------------------------------------------------------------- | 
|---|
| 218 | ; XMY     Pass in XMY by reference. | 
|---|
| 219 | ; XMSUB   If XMSUB pre-exists, it will be used. | 
|---|
| 220 | ; XMTEXT  The text for the mailman message will come from one of | 
|---|
| 221 | ;         three sources: | 
|---|
| 222 | ;           (1) If XMTEXT is pre-set, it will be used. | 
|---|
| 223 | ;           (2) If XMTEXT is not passed in, then the MAILMAN MESSAGE | 
|---|
| 224 | ;               TEXT global ^HLEV(776,IEN,51,#,0) will be used, if it | 
|---|
| 225 | ;               exits. | 
|---|
| 226 | ;           (3) Otherwise, a generic "message is completed" message | 
|---|
| 227 | ;               will be sent. | 
|---|
| 228 | ; | 
|---|
| 229 | N MGRP,NO,SITE,TEXT,XMDUZ,X,XMZ | 
|---|
| 230 | ; | 
|---|
| 231 | ; If no recipients passed in and no mail group exists, quit... | 
|---|
| 232 | QUIT:$O(XMY(""))']""  ;-> | 
|---|
| 233 | ; | 
|---|
| 234 | QUIT:$P($G(^HLEV(776.1,+$G(HLEVIENE),0)),U)']""  ;-> | 
|---|
| 235 | QUIT:$P($G(^HLEV(776,+$G(HLEVIENJ),0)),U)']""  ;-> | 
|---|
| 236 | ; | 
|---|
| 237 | ; Set up sending... | 
|---|
| 238 | S XMDUZ=.5 | 
|---|
| 239 | ; | 
|---|
| 240 | ; Subject... | 
|---|
| 241 | S X=$$SITE^VASITE,SITE="HL7 Monitor - "_$P(X,U,2)_"["_$P(X,U,3)_"]" | 
|---|
| 242 | S XMSUB=$S($G(XMSUB)]"":XMSUB,1:SITE_" - "_$P($G(^HLEV(776.1,+HLEVIENE,0)),U)) | 
|---|
| 243 | ; | 
|---|
| 244 | ; Load generic message text... | 
|---|
| 245 | I $G(XMTEXT)']"" D | 
|---|
| 246 | .  KILL ^TMP($J,"HLMAILMSG") | 
|---|
| 247 | .  D LOADALL^HLEVAPI1(+HLEVIENJ,"HLMAILMSG") | 
|---|
| 248 | ; | 
|---|
| 249 | ; Declare where message is stored... | 
|---|
| 250 | S XMTEXT=$S($G(XMTEXT)]"":XMTEXT,1:"^TMP("_$J_",""HLMAILMSG"",") | 
|---|
| 251 | ; | 
|---|
| 252 | D ^XMD | 
|---|
| 253 | ; | 
|---|
| 254 | I '$D(ZTQUEUED) W !!,"Mail message #",$G(XMZ),"..." | 
|---|
| 255 | ; | 
|---|
| 256 | I $G(XMZ)>0 D UPDFLDE(+HLEVIENJ,7,XMZ) | 
|---|
| 257 | ; | 
|---|
| 258 | Q | 
|---|
| 259 | ; | 
|---|
| 260 | NEWEVENT(HLEVIENE,QTIME) ; Create a new EVENT and pass back IEN... | 
|---|
| 261 | N DIC,DD,DO,X,Y | 
|---|
| 262 | ; | 
|---|
| 263 | ; Check STATUS-EVENT... | 
|---|
| 264 | QUIT:$P($G(^HLEV(776.999,1,0)),U,6)'="A"  ;-> | 
|---|
| 265 | ; | 
|---|
| 266 | S X=$$NOW^XLFDT,DIC="^HLEV(776,",DIC(0)="L" | 
|---|
| 267 | S DIC("DR")="3////"_HLEVIENE_";4///Q" | 
|---|
| 268 | I $G(HLEVIENM)>0 S DIC("DR")=DIC("DR")_";9////"_HLEVIENM | 
|---|
| 269 | I $G(QTIME)]"" S DIC("DR")=DIC("DR")_";10////"_QTIME | 
|---|
| 270 | D FILE^DICN | 
|---|
| 271 | ; | 
|---|
| 272 | Q $S(+Y>0:+Y,1:"") | 
|---|
| 273 | ; | 
|---|
| 274 | UPDFLDE(HLEVIENJ,FLD,VAL) ; Update a specific piece in 776... | 
|---|
| 275 | N DA,DIE,DR | 
|---|
| 276 | ; | 
|---|
| 277 | QUIT:$G(^HLEV(776,+$G(HLEVIENJ),0))']""  ;-> | 
|---|
| 278 | ; | 
|---|
| 279 | ; Field 50, RUN DIARY... | 
|---|
| 280 | I FLD=50 D  QUIT  ;-> | 
|---|
| 281 | .  N DIFF,NO,NOW,TIME | 
|---|
| 282 | .  S NO=$O(^HLEV(776,+HLEVIENJ,50,":"),-1)+1 | 
|---|
| 283 | .  S ^HLEV(776,+HLEVIENJ,50,0)="^776.001^"_NO_U_NO | 
|---|
| 284 | .  S ^HLEV(776,+HLEVIENJ,50,+NO,0)=$G(VAL) | 
|---|
| 285 | .  ; If FLD=50, update timestamp every 30 seconds... | 
|---|
| 286 | .  ; (This is because many 50 nodes might be updated, one after the | 
|---|
| 287 | .  ; other in a very disk-intensive way.) | 
|---|
| 288 | .  S TIME=$P($G(^HLEV(776,+HLEVIENJ,0)),U,6) ; FM format | 
|---|
| 289 | .  S NOW=$$NOW^XLFDT | 
|---|
| 290 | .  S DIFF=$$FMDIFF^XLFDT(NOW,TIME,2) S:DIFF<0 DIFF=-DIFF | 
|---|
| 291 | .  QUIT:DIFF<30  ;-> | 
|---|
| 292 | .  S DA=+HLEVIENJ,DIE=776,DR="6////"_NOW | 
|---|
| 293 | ; | 
|---|
| 294 | ; Fields 401-408... | 
|---|
| 295 | I FLD?3N&(FLD>400)&(FLD<409) D  QUIT  ;-> | 
|---|
| 296 | .  S ^HLEV(776,+HLEVIENJ,FLD)=VAL | 
|---|
| 297 | ; | 
|---|
| 298 | ; Zero node data... | 
|---|
| 299 | QUIT:$G(VAL)']""  ;-> | 
|---|
| 300 | S DA=+HLEVIENJ,DIE=776,DR=FLD_"///"_VAL_";6////"_$$NOW^XLFDT | 
|---|
| 301 | D ^DIE | 
|---|
| 302 | ; | 
|---|
| 303 | I FLD=2 D EVCHKD^HLEVAPI2($G(HLEVIENM),$G(HLEVIENE),$G(HLEVIENJ)) | 
|---|
| 304 | ; | 
|---|
| 305 | Q | 
|---|
| 306 | ; | 
|---|
| 307 | EOR ;HLEVAPI - Event Monitor APIs ;5/16/03 14:42 | 
|---|