| 1 | ORKCHK ; slc/CLA - Main routine called by OE/RR to initiate order checks ; 1/16/07 6:28am | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**6,32,94,105,123,232,267**;Dec 17, 1997;Build 6 | 
|---|
| 3 | EN(ORKY,ORKDFN,ORKA,ORKMODE) ;initiate order checking | 
|---|
| 4 | ;ORKY: array of returned msgs in format: ornum^orderchk ien^clin danger^msg | 
|---|
| 5 | ;ORKDFN: patient dfn | 
|---|
| 6 | ;ORKA: array of order information in the format: | 
|---|
| 7 | ; orderable item ien| | 
|---|
| 8 | ; display group-filler app| | 
|---|
| 9 | ; nat'l id^nat'l text^nat'l code sys^local id^local text^local code sys| | 
|---|
| 10 | ; effective d/t| | 
|---|
| 11 | ; order number| | 
|---|
| 12 | ; filler data (LR: specimen ien, PS: meds prev ordered during this session in format med1^med2^...) | 
|---|
| 13 | ;ORKMODE: mode/event trigger (DISPLAY,SELECT,ACCEPT,SESSION,ALL,NOTIF) | 
|---|
| 14 | ; PS: meds previously ordered during this session med1^med2^... | 
|---|
| 15 | ; | 
|---|
| 16 | N ORKQ,ORKN S ORKQ=0,ORKN=1 | 
|---|
| 17 | S:+$G(ORKDFN)<1 ORKY(ORKN)="^^^Order Checking Unavailable - invalid patient id",ORKQ=1,ORKN=ORKN+1 | 
|---|
| 18 | S:'$L($G(ORKMODE)) ORKY(ORKN)="^^^Order Checking Unavailable - invalid mode/event",ORKQ=1,ORKN=ORKN+1 | 
|---|
| 19 | Q:$G(ORKQ)=1 | 
|---|
| 20 | Q:+$G(ORKA)<1 | 
|---|
| 21 | N ORKX,ORKS,DNGR,ORENT,ORKENT,ORKNENT,ORNUM,ORKOFF,ORKTMODE | 
|---|
| 22 | N ORKADUZ,ORKNDUZ,ORKI,ORKPRIM,ORKNMSG,ORKMSG,ORKLOG,ORKLD,ORKLI,ORKOI | 
|---|
| 23 | N ORKDG,ORKLPS,ORKPSA,ORKCNT,ORKDGI | 
|---|
| 24 | ; | 
|---|
| 25 | ;save array of orders for use in session processing: | 
|---|
| 26 | M ^TMP("ORKA",$J)=ORKA | 
|---|
| 27 | ; | 
|---|
| 28 | ;get patient's location flag (INPATIENT ONLY - outpt locations cannot be | 
|---|
| 29 | ;reliably determined, and many simultaneous outpt locations can occur): | 
|---|
| 30 | N DFN,ORKLOC | 
|---|
| 31 | S DFN=ORKDFN,VA200="" D OERR^VADPT | 
|---|
| 32 | S ORKLOC=+$G(^DIC(42,+VAIN(4),44)) | 
|---|
| 33 | K VA200,VAIN | 
|---|
| 34 | ; | 
|---|
| 35 | ;get user's service/section flag: | 
|---|
| 36 | N ORKSRV | 
|---|
| 37 | S ORKSRV=$$GET1^DIQ(200,DUZ,29,"I") I +ORKSRV>0 S ORKSRV=$P(ORKSRV,U) | 
|---|
| 38 | ; | 
|---|
| 39 | ;log order check debug messages (or not) | 
|---|
| 40 | S ORKLOG=$$GET^XPAR("DIV^SYS^PKG","ORK DEBUG ENABLE/DISABLE",1,"I") | 
|---|
| 41 | I $G(ORKLOG)="D" K ^XTMP("ORKLOG") S ^XTMP("ORKLOG",0)="" | 
|---|
| 42 | I +$P($G(^XTMP("ORKLOG",0)),U,3)>5000 K ^XTMP("ORKLOG") | 
|---|
| 43 | ; | 
|---|
| 44 | ;if SESSION mode & pharmacy order occurred in session get unsigned med orders | 
|---|
| 45 | I ORKMODE="SESSION" D | 
|---|
| 46 | .S ORKDG=$P(ORKA(1),"|",2) | 
|---|
| 47 | .I $E($G(ORKDG),1,2)="PS" D | 
|---|
| 48 | ..S ORKDGI=0,ORKDGI=$O(^ORD(100.98,"B","PHARMACY",ORKDGI)) | 
|---|
| 49 | ..K ^TMP("ORR",$J) | 
|---|
| 50 | ..D EN^ORQ1(DFN_";DPT(",ORKDGI,11,"","","",0,0) | 
|---|
| 51 | ..;store unsigned med orders in ^TMP("ORR",$J for processing in ORKPS | 
|---|
| 52 | ; | 
|---|
| 53 | ;main processing loop: | 
|---|
| 54 | S ORKX="" F  S ORKX=$O(ORKA(ORKX)) Q:ORKX=""  D | 
|---|
| 55 | .S ORKOI=$P(ORKA(ORKX),"|") | 
|---|
| 56 | .; | 
|---|
| 57 | .;log debug msgs if parameter is enabled: | 
|---|
| 58 | .I $G(ORKLOG)="E" D | 
|---|
| 59 | ..S ORKLD=$$NOW^XLFDT | 
|---|
| 60 | ..S ORKLI=0 | 
|---|
| 61 | ..I +$P($G(^XTMP("ORKLOG",0)),U,3)<1 S $P(^XTMP("ORKLOG",0),U,3)=0 | 
|---|
| 62 | ..S ORKCNT=$P(^XTMP("ORKLOG",0),U,3)+1 | 
|---|
| 63 | ..S ^XTMP("ORKLOG",0)=$$FMADD^XLFDT(ORKLD,3,"","","")_U_ORKLD_U_ORKCNT | 
|---|
| 64 | ..S ^XTMP("ORKLOG",ORKLD,ORKDFN,+$G(ORKOI),ORKMODE,DUZ,ORKLI)=ORKA(ORKX) | 
|---|
| 65 | .; | 
|---|
| 66 | .S ORKDG=$P(ORKA(ORKX),"|",2),ORKTMODE="" | 
|---|
| 67 | .S ORKENT="USR^LOC.`"_+$G(ORKLOC)_"^SRV.`"_+$G(ORKSRV)_"^DIV^SYS^PKG" | 
|---|
| 68 | .Q:'$L($G(ORKDG)) | 
|---|
| 69 | .; | 
|---|
| 70 | .;if pharmacy order and multiple pharmacy orders in session add data node: | 
|---|
| 71 | .I $E(ORKDG,1,2)="PS",($L($G(ORKPSA))) D | 
|---|
| 72 | ..S $P(ORKA(ORKX),"|",6)=ORKPSA | 
|---|
| 73 | .; | 
|---|
| 74 | .S ORNUM=$P(ORKA(ORKX),"|",5) | 
|---|
| 75 | .; get correct DUZ for notification processing if in NOTIF mode: | 
|---|
| 76 | .I ORKMODE="NOTIF" D | 
|---|
| 77 | ..S:+$G(ORNUM)>0 ORKNDUZ=$$ORDERER^ORQOR2(ORNUM) ;ordering provider | 
|---|
| 78 | ..S:+$G(ORNUM)<1 ORKNDUZ=$P($$PRIM^ORQPTQ4(ORKDFN),U) ;prim provider | 
|---|
| 79 | ..I +$G(ORKNDUZ)>0 D | 
|---|
| 80 | ...S ORKSRV=$$GET1^DIQ(200,ORKNDUZ,29,"I") I +ORKSRV>0 S ORKSRV=$P(ORKSRV,U) | 
|---|
| 81 | ...S ORKNENT="USR.`"_+ORKNDUZ_"^LOC.`"_+$G(ORKLOC)_"^SRV.`"_+$G(ORKSRV)_"^DIV^SYS^PKG" | 
|---|
| 82 | ..S:+$G(ORKNDUZ)<1 ORKNENT="LOC.`"_+$G(ORKLOC)_"^DIV^SYS^PKG" | 
|---|
| 83 | .S ORENT=$S(ORKMODE="NOTIF":ORKNENT,1:ORKENT) | 
|---|
| 84 | .; | 
|---|
| 85 | .;If the order is a delayed release order (NOTIF) process all nodes. | 
|---|
| 86 | .;If it is a renewal, edit or delayed signature order (ALL) process all | 
|---|
| 87 | .;modes except SESSION which gets processed just before signature: | 
|---|
| 88 | .I ORKMODE="NOTIF"!(ORKMODE="ALL") S ORKTMODE=ORKMODE D | 
|---|
| 89 | ..D EN^ORKCHK3(.ORKS,ORKDFN,ORKA(ORKX),ORENT,ORKTMODE)  ;DISPLAY | 
|---|
| 90 | ..D EN^ORKCHK4(.ORKS,ORKDFN,ORKA(ORKX),ORENT,ORKTMODE)  ;SELECT | 
|---|
| 91 | ..D EN^ORKCHK5(.ORKS,ORKDFN,ORKA(ORKX),ORENT,ORKTMODE)  ;ACCEPT | 
|---|
| 92 | ..I ORKMODE="NOTIF" D EN^ORKCHK6(.ORKS,ORKDFN,ORKA(ORKX),ORENT,ORKTMODE)  ;SESSION | 
|---|
| 93 | ..S ORKMODE=ORKTMODE | 
|---|
| 94 | .; | 
|---|
| 95 | .;Process regular orders/modes: | 
|---|
| 96 | .I '$L($G(ORKTMODE)) D | 
|---|
| 97 | ..I ORKMODE="DISPLAY" D EN^ORKCHK3(.ORKS,ORKDFN,ORKA(ORKX),ORENT,ORKTMODE) | 
|---|
| 98 | ..I ORKMODE="SELECT" D EN^ORKCHK4(.ORKS,ORKDFN,ORKA(ORKX),ORENT,ORKTMODE) | 
|---|
| 99 | ..I ORKMODE="ACCEPT" D EN^ORKCHK5(.ORKS,ORKDFN,ORKA(ORKX),ORENT,ORKTMODE) | 
|---|
| 100 | ..I ORKMODE="SESSION" D EN^ORKCHK6(.ORKS,ORKDFN,ORKA(ORKX),ORENT,ORKTMODE) | 
|---|
| 101 | ; | 
|---|
| 102 | ;set messages into sorting array then into ORKY ORKS("ORK",clinical danger level,oi,msg)=ornum^order check ien^clin danger level^message | 
|---|
| 103 | S ORKX="",ORKI=1 | 
|---|
| 104 | F  S ORKX=$O(ORKS("ORK",ORKX)) Q:ORKX=""  D | 
|---|
| 105 | .S ORKY(ORKI)=$E(ORKS("ORK",ORKX),1,250) | 
|---|
| 106 | .; | 
|---|
| 107 | .;log debug msgs if parameter is enabled: | 
|---|
| 108 | .I $G(ORKLOG)="E" D | 
|---|
| 109 | ..S ORKLI=$G(ORKLI)+1 | 
|---|
| 110 | ..S ^XTMP("ORKLOG",$$NOW^XLFDT,ORKDFN,+$G(ORKOI),ORKMODE,DUZ,ORKLI)=ORKY(ORKI) | 
|---|
| 111 | ..S $P(^XTMP("ORKLOG",0),U,3)=$P($G(^XTMP("ORKLOG",0)),U,3)+1 | 
|---|
| 112 | .; | 
|---|
| 113 | .;send moderate and high danger order checks for delayed orders as notifications: | 
|---|
| 114 | .I ORKMODE="NOTIF" S DNGR=$P(ORKY(ORKI),U,3) I $G(DNGR)<3 D | 
|---|
| 115 | ..S ORKADUZ="",ORNUM=$P(ORKY(ORKI),U) | 
|---|
| 116 | ..S:+$G(ORKNDUZ)>0 ORKADUZ(ORKNDUZ)="" | 
|---|
| 117 | ..S ORKNMSG="Order check: "_$P(ORKY(ORKI),U,4) | 
|---|
| 118 | ..D EN^ORB3(54,ORKDFN,$G(ORNUM),.ORKADUZ,ORKNMSG,"") | 
|---|
| 119 | .S ORKI=ORKI+1 | 
|---|
| 120 | ; | 
|---|
| 121 | K ^TMP("ORKA",$J),^TMP("ORR",$J) | 
|---|
| 122 | I $G(ORKLOG)="E" D | 
|---|
| 123 | .S ORKLI=$G(ORKLI)+1 | 
|---|
| 124 | .S ^XTMP("ORKLOG",$$NOW^XLFDT,ORKDFN,+$G(ORKOI),ORKMODE,DUZ,ORKLI)="LEAVING ORDER CHECKING" | 
|---|
| 125 | .S $P(^XTMP("ORKLOG",0),U,3)=$P($G(^XTMP("ORKLOG",0)),U,3)+1 | 
|---|
| 126 | D CHKRMT | 
|---|
| 127 | Q | 
|---|
| 128 | ; | 
|---|
| 129 | OI2DD(ORPSA,OROI,ORPSPKG) ;rtn dispense drugs for a PS OI | 
|---|
| 130 | N PSOI | 
|---|
| 131 | Q:'$D(^ORD(101.43,OROI,0)) | 
|---|
| 132 | S PSOI=$P($P(^ORD(101.43,OROI,0),U,2),";") | 
|---|
| 133 | Q:+$G(PSOI)<1 | 
|---|
| 134 | D DRG^PSSUTIL1(.ORPSA,PSOI,ORPSPKG) | 
|---|
| 135 | Q | 
|---|
| 136 | CHKRMT ; | 
|---|
| 137 | N I,ORQFLAG | 
|---|
| 138 | S ORQFLAG=1 | 
|---|
| 139 | S I=0 F  S I=$O(ORKA(I)) Q:'I  I $E($P(ORKA(I),"|",2),1,2)="PS"!($E($P(ORKA(I),"|",2),1,2)="RA") S ORQFLAG=0 | 
|---|
| 140 | Q:$G(ORQFLAG) | 
|---|
| 141 | Q:'$$HAVEHDR^ORRDI1 | 
|---|
| 142 | Q:$$LDPTTVAL^ORRDI2($G(DFN)) | 
|---|
| 143 | Q:$P($G(^XTMP("ORRDI","PSOO",ORKDFN,0)),U,3)'<0&($P($G(^XTMP("ORRDI","ART",ORKDFN,0)),U,3)'<0) | 
|---|
| 144 | I $G(ORKMODE)="ACCEPT" D | 
|---|
| 145 | . N IFN | 
|---|
| 146 | . S IFN=$O(ORKY(""),-1)+1 | 
|---|
| 147 | . S ORKY(IFN)="^99^2^Order check performed on local data only" | 
|---|
| 148 | . K ^TMP($J,"ORRDI") S ^TMP($J,"ORRDI",ORKDFN)=1 | 
|---|
| 149 | I $G(ORKMODE)="SESSION" D | 
|---|
| 150 | . N I,IFN,ORARR | 
|---|
| 151 | . S IFN=$O(ORKY(""),-1) | 
|---|
| 152 | . S I=0 F  S I=$O(ORKY(I)) Q:'I  S ORARR(+ORKY(I))="" | 
|---|
| 153 | . S I=0 F  S I=$O(ORARR(I)) Q:'I  S IFN=IFN+1,ORKY(IFN)=I_"^99^2^Order check performed on local data only." | 
|---|
| 154 | . K ^TMP($J,"ORRDI") S ^TMP($J,"ORRDI",ORKDFN)=1 | 
|---|
| 155 | Q | 
|---|