| 1 | OCXDEBUG ;SLC/RJS,CLA - ORDER CHECK COMPILED CODE DEBUGGER (SINGLE/MULTI);10/29/98  12:37 | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**32**;Dec 17,1997 | 
|---|
| 3 | ;;  ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998 | 
|---|
| 4 | ; | 
|---|
| 5 | SINGLE ; | 
|---|
| 6 | ; | 
|---|
| 7 | N OCXOLOG,IOP | 
|---|
| 8 | ; | 
|---|
| 9 | I '$O(^OCXD(861,1)) W !!,"No entries in the raw data log..." Q | 
|---|
| 10 | ; | 
|---|
| 11 | K ^TMP("OCXDEBUG",$J) | 
|---|
| 12 | S ^TMP("OCXDEBUG",$J)=($P($H,",",2)+($H*86400)+(4*60*60))_" <- ^TMP ENTRY EXPIRATION DATE FOR ^OCXOPURG" | 
|---|
| 13 | S IOP=0 D ^%ZIS K IOP S X=132 U IO X ^%ZOSF("RM") | 
|---|
| 14 | ; | 
|---|
| 15 | F  W !! S OCXOLOG=+$$LOOKUP("Select Log entry number: ") Q:'OCXOLOG  D RUN(OCXOLOG,$$ASKFLAG,$$ASKPURG),REPORT | 
|---|
| 16 | Q | 
|---|
| 17 | ; | 
|---|
| 18 | ASKFLAG() Q ('$$READ("Y","Do you want to send any alerts generated ","NO")*10)+1 | 
|---|
| 19 | ; | 
|---|
| 20 | ASKPURG() Q $$READ("Y","Do you want purge rule events ","NO") | 
|---|
| 21 | ; | 
|---|
| 22 | SMOKE(OCXTRACE) ; | 
|---|
| 23 | N OCXOLOG,OCXP,OCX1,OCX2,OCX3 | 
|---|
| 24 | ; | 
|---|
| 25 | I '$O(^OCXD(861,1)) W !!,"No entries in the raw data log..." Q | 
|---|
| 26 | S:'$L($G(OCXTRACE)) OCXTRACE=11 | 
|---|
| 27 | ; | 
|---|
| 28 | W ! | 
|---|
| 29 | W !,"First Entry: ",+$O(^OCXD(861,1)) | 
|---|
| 30 | W !,"Last Entry: ",+$O(^OCXD(861," "),-1) | 
|---|
| 31 | K ^TMP("OCXDEBUG",$J) | 
|---|
| 32 | S ^TMP("OCXDEBUG",$J)=($P($H,",",2)+($H*86400)+(4*60*60))_" <- ^TMP ENTRY EXPIRATION DATE FOR ^OCXOPURG" | 
|---|
| 33 | S IOP=0 D ^%ZIS K IOP S X=132 U IO X ^%ZOSF("RM") | 
|---|
| 34 | ; | 
|---|
| 35 | S OCXP=$$ASKPURG | 
|---|
| 36 | S OCX1=$$LOOKUP("Start at Log Number: ") | 
|---|
| 37 | S OCX2=$$LOOKUP(" Stop at Log Number: ") | 
|---|
| 38 | S:(OCX1>OCX2) OCX3=OCX2,OCX2=OCX1,OCX1=OCX3 | 
|---|
| 39 | S OCXOLOG=OCX1 D  F  S OCXOLOG=$O(^OCXD(861,OCXOLOG)) Q:'OCXOLOG  Q:(OCXOLOG>OCX2)  D | 
|---|
| 40 | .W @IOF D RUN(OCXOLOG,OCXTRACE,OCXP) | 
|---|
| 41 | D ^%ZIS | 
|---|
| 42 | U IO D REPORT D ^%ZISC | 
|---|
| 43 | Q | 
|---|
| 44 | ; | 
|---|
| 45 | REPORT ; | 
|---|
| 46 | N OCXD0,OCXD1 | 
|---|
| 47 | I '$O(^TMP("OCXDEBUG",$J,0)) W !!,"No rules triggered.",!! Q | 
|---|
| 48 | W !!,"************* Rules triggered ****************",! | 
|---|
| 49 | S OCXD0=0 F  S OCXD0=$O(^TMP("OCXDEBUG",$J,OCXD0)) Q:'OCXD0  D | 
|---|
| 50 | .S OCXD1=0 F  S OCXD1=$O(^TMP("OCXDEBUG",$J,OCXD0,OCXD1)) Q:'OCXD1  D | 
|---|
| 51 | ..W !,"Rule: (",(+OCXD0),")  ",$P($G(^OCXS(860.2,+OCXD0,0)),U,1) | 
|---|
| 52 | ..W !,"Relation: (",(+OCXD1),")  ",$G(^OCXS(860.2,+OCXD0,"R",+OCXD1,"E")) | 
|---|
| 53 | ..W !,"       Number triggered: ",+$G(^TMP("OCXDEBUG",$J,OCXD0,OCXD1)) | 
|---|
| 54 | ..W ! | 
|---|
| 55 | Q | 
|---|
| 56 | ; | 
|---|
| 57 | RUN(OCXDEBUG,OCXTRACE,OCXPURGE) ; | 
|---|
| 58 | ; | 
|---|
| 59 | Q:'$D(^OCXD(861,OCXDEBUG))  Q:'$D(^OCXD(861,OCXDEBUG,"SOURCE")) | 
|---|
| 60 | ; | 
|---|
| 61 | N OCXA,OCXAR,OCXD0 | 
|---|
| 62 | ; | 
|---|
| 63 | M OCXA=^OCXD(861,OCXDEBUG) | 
|---|
| 64 | ; | 
|---|
| 65 | W !,"RUN: ",OCXDEBUG,"   ",OCXA("SOURCE") | 
|---|
| 66 | ; | 
|---|
| 67 | I OCXPURGE D | 
|---|
| 68 | .N DFN S DFN=+$P($G(OCXA("PATIENT")),"[",2) Q:'DFN | 
|---|
| 69 | .K ^OCXD(860.7,DFN,1) | 
|---|
| 70 | .K ^OCXD(860.7,"AT",+$H,DFN) | 
|---|
| 71 | ; | 
|---|
| 72 | I (OCXA("SOURCE")="HL7") D  Q | 
|---|
| 73 | .S OCXAR=OCXA("ARRAY") | 
|---|
| 74 | .I '(OCXAR[U) N @OCXAR | 
|---|
| 75 | .N OCXDBMSG | 
|---|
| 76 | .S OCXD0=0 F  S OCXD0=$O(OCXA("DATA",OCXD0)) Q:'OCXD0  D | 
|---|
| 77 | ..N LAST,TEXT | 
|---|
| 78 | ..S LAST=$O(@OCXAR@(" "),-1) | 
|---|
| 79 | ..S TEXT=OCXA("DATA",OCXD0,0) | 
|---|
| 80 | ..I LAST,($E(TEXT,1,3)=">>>") S TEXT=$E(TEXT,4,$L(TEXT)) | 
|---|
| 81 | ..E  S LAST=LAST+1 | 
|---|
| 82 | ..S @OCXAR@(LAST)=$G(@OCXAR@(LAST))_TEXT | 
|---|
| 83 | .S OCXDBMSG="" | 
|---|
| 84 | .W !! | 
|---|
| 85 | .I '(OCXAR[U) X "D SILENT^OCXOHL7(."_OCXAR_",.OCXDBMSG)" I 1 | 
|---|
| 86 | .E  D SILENT^OCXOHL7(.OCXAR,.OCXDBMSG) | 
|---|
| 87 | .I ($D(OCXDBMSG)>1) D ZW("OCXDBMSG") | 
|---|
| 88 | .I (OCXAR[U) K @OCXAR | 
|---|
| 89 | ; | 
|---|
| 90 | I (OCXA("SOURCE")="DGPM") D  Q | 
|---|
| 91 | .N DGPM0,DGPMA,DGPMDA,DFN,OCXDBMSG | 
|---|
| 92 | .S OCXD0=0 F  S OCXD0=$O(OCXA("DATA",OCXD0)) Q:'OCXD0  D | 
|---|
| 93 | ..N TEXT S TEXT=OCXA("DATA",OCXD0,0) | 
|---|
| 94 | ..S @$P(TEXT,"=",1)=$P(TEXT,"=",2,999) | 
|---|
| 95 | .S DFN=+$P($G(OCXA("PATIENT")),"[",2) | 
|---|
| 96 | .S OCXDBMSG="" | 
|---|
| 97 | .W !! D SILENT^OCXODGPM(.OCXDBMSG) | 
|---|
| 98 | .I ($D(OCXDBMSG)>1) D ZW("OCXDBMSG") | 
|---|
| 99 | ; | 
|---|
| 100 | I (OCXA("SOURCE")="OEPS") D  Q | 
|---|
| 101 | .N OCXPSD,OCXPSM,DFN,OCXDBMSG | 
|---|
| 102 | .S OCXD0=0 F  S OCXD0=$O(OCXA("DATA",OCXD0)) Q:'OCXD0  D | 
|---|
| 103 | ..N TEXT S TEXT=OCXA("DATA",OCXD0,0) | 
|---|
| 104 | ..S @$P(TEXT,"=",1)=$P(TEXT,"=",2,999) | 
|---|
| 105 | .S DFN=+$P($G(OCXA("PATIENT")),"[",2) | 
|---|
| 106 | .S OCXDBMSG="" | 
|---|
| 107 | .W ! D EN^OCXOEPS(.OCXDBMSG,DFN,OCXPSD,OCXPSM) ; | 
|---|
| 108 | .I ($D(OCXDBMSG)>1) D ZW("OCXDBMSG") | 
|---|
| 109 | ; | 
|---|
| 110 | I (OCXA("SOURCE")="OERR") D  Q | 
|---|
| 111 | .N OCXORD,DFN,OCXDBMSG | 
|---|
| 112 | .S OCXD0=0 F  S OCXD0=$O(OCXA("DATA",OCXD0)) Q:'OCXD0  D | 
|---|
| 113 | ..N TEXT S TEXT=OCXA("DATA",OCXD0,0) | 
|---|
| 114 | ..S @$P(TEXT,"=",1)=$P(TEXT,"=",2,999) | 
|---|
| 115 | .S DFN=+$P($G(OCXA("PATIENT")),"[",2) | 
|---|
| 116 | .S OCXDBMSG="" | 
|---|
| 117 | .W ! D SILENT^OCXOERR(OCXORD,.OCXDBMSG) ; | 
|---|
| 118 | .I ($D(OCXDBMSG)>1) D ZW("OCXDBMSG") | 
|---|
| 119 | Q | 
|---|
| 120 | ; | 
|---|
| 121 | LOOKUP(OCXDLG) ; | 
|---|
| 122 | ; | 
|---|
| 123 | N DIC,X,Y | 
|---|
| 124 | S:$L($G(OCXDLG)) DIC("A")=OCXDLG | 
|---|
| 125 | S DIC="^OCXD(861,",DIC(0)="AMNEQ" | 
|---|
| 126 | S DIC("S")="I (Y>1)" | 
|---|
| 127 | S DIC("W")="W ""  "",$G(^(""SOURCE"")),""  "",$G(^(""PATIENT""))" | 
|---|
| 128 | S Y=0 D ^DIC | 
|---|
| 129 | Q:(Y<0) 0 Q +Y | 
|---|
| 130 | ; | 
|---|
| 131 | ZW(ARRAY) ; | 
|---|
| 132 | W !,ARRAY | 
|---|
| 133 | N NODE | 
|---|
| 134 | I ($D(@ARRAY)#10) W !,ARRAY," = ",@ARRAY | 
|---|
| 135 | S:($E(ARRAY,$L(ARRAY))=")") ARRAY=$E(ARRAY,1,$L(ARRAY)-1)_"," | 
|---|
| 136 | S NODE=ARRAY F  S NODE=$Q(@NODE) Q:'$L(NODE)  Q:'($E(NODE,1,$L(ARRAY))=ARRAY)  W !,NODE," = ",@NODE | 
|---|
| 137 | Q | 
|---|
| 138 | ; | 
|---|
| 139 | LOGAL(OCXR0,OCXR1,OCXN,OCXDFN,OCXNUM,OCXADUZ,OCXPMSG,OCXPDATA) ; | 
|---|
| 140 | ; | 
|---|
| 141 | ;    OCXR0: Rule IEN | 
|---|
| 142 | ;    OCXR1: Relation IEN | 
|---|
| 143 | ;     OCXN: notification identifier (required) | 
|---|
| 144 | ;   OCXDFN: patient identifier   (required) | 
|---|
| 145 | ;   OCXNUM: order number - used to determine ordering provider | 
|---|
| 146 | ;  OCXADUZ: array of package-identified recipients | 
|---|
| 147 | ;  OCXPMSG: package-defined message | 
|---|
| 148 | ; OCXPDATA: package-defined data for follow-up action | 
|---|
| 149 | ; | 
|---|
| 150 | I $G(OCXR0),$G(OCXR1) S ^TMP("OCXDEBUG",$J,+OCXR0,+OCXR1)=$G(^TMP("OCXDEBUG",$J,+OCXR0,+OCXR1))+1 | 
|---|
| 151 | ; | 
|---|
| 152 | Q | 
|---|
| 153 | ; | 
|---|
| 154 | READ(OCXZ0,OCXZA,OCXZB,OCXZL) ; | 
|---|
| 155 | N OCXLINE,DIR,DTOUT,DUOUT,DIRUT,DIROUT | 
|---|
| 156 | Q:'$L($G(OCXZ0)) U | 
|---|
| 157 | S DIR(0)=OCXZ0 | 
|---|
| 158 | S:$L($G(OCXZA)) DIR("A")=OCXZA | 
|---|
| 159 | S:$L($G(OCXZB)) DIR("B")=OCXZB | 
|---|
| 160 | F OCXLINE=1:1:($G(OCXZL)-1) W ! | 
|---|
| 161 | D ^DIR | 
|---|
| 162 | I $D(DTOUT)!$D(DUOUT)!$D(DIRUT)!$D(DIROUT) Q U | 
|---|
| 163 | Q Y | 
|---|
| 164 | ; | 
|---|
| 165 | TIME ; | 
|---|
| 166 | ; | 
|---|
| 167 | N OCXD0,OCXT1,OCXT2,OCXT3,OCXTIME,OCXMAX | 
|---|
| 168 | ; | 
|---|
| 169 | S (OCXMAX,OCXD0)=0 F  S OCXD0=$O(^OCXD(861,OCXD0)) Q:'OCXD0  D | 
|---|
| 170 | .Q:'$D(^OCXD(861,OCXD0,"STATUS")) | 
|---|
| 171 | .S OCXT1=+$G(^OCXD(861,OCXD0,0)) | 
|---|
| 172 | .S OCXT1=$P(OCXT1,".",2) | 
|---|
| 173 | .S OCXT1=$E(OCXT1_"000000",1,6) | 
|---|
| 174 | .S OCXT1=($E(OCXT1,1,2)*3600)+($E(OCXT1,3,4)*60)+($E(OCXT1,5,6)) | 
|---|
| 175 | .S OCXT2=$G(^OCXD(861,OCXD0,"STATUS")) | 
|---|
| 176 | .S OCXT2=+$P(OCXT2," AT ",2) | 
|---|
| 177 | .S OCXT2=$P(OCXT2,".",2) | 
|---|
| 178 | .S OCXT2=$E(OCXT2_"000000",1,6) | 
|---|
| 179 | .S OCXT2=($E(OCXT2,1,2)*3600)+($E(OCXT2,3,4)*60)+($E(OCXT2,5,6)) | 
|---|
| 180 | .S OCXT3=(OCXT2-OCXT1) Q:(OCXT3<0) | 
|---|
| 181 | .I (OCXT3>OCXMAX) S OCXMAX=OCXT3_U_OCXD0 | 
|---|
| 182 | .S OCXTIME(OCXT3)=$G(OCXTIME(OCXT3))+1 | 
|---|
| 183 | ; | 
|---|
| 184 | W !!,"Number of seconds",?20,"Number of occurences",! | 
|---|
| 185 | S OCXT1="" F  S OCXT1=$O(OCXTIME(OCXT1)) Q:'$L(OCXT1)  D | 
|---|
| 186 | .I OCXT1 W !,$J(OCXT1,4) | 
|---|
| 187 | .E  W !,"Less than 1 second" | 
|---|
| 188 | .W ?20,$J(+$G(OCXTIME(OCXT1)),6) | 
|---|
| 189 | I $P(OCXMAX,U,2) W !!,"Maximum wait: ",+OCXMAX," second(s).  Log entry: ",$P(OCXMAX,U,2) | 
|---|
| 190 | ; | 
|---|
| 191 | Q | 
|---|
| 192 | ; | 
|---|