1 | ORKCHK ; slc/CLA - Main routine called by OE/RR to initiate order checks ; 9/21/07 11:54am
|
---|
2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**6,32,94,105,123,232,267,243**;Dec 17, 1997;Build 242
|
---|
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^Remote Order Checking not available - checks done 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^Remote Order Checking not available - checks done on local data only"
|
---|
154 | . K ^TMP($J,"ORRDI") S ^TMP($J,"ORRDI",ORKDFN)=1
|
---|
155 | Q
|
---|