1 | ORQRY ; SLC/MKB/JDL - Order Query utilities ;3/17/03 14:45
|
---|
2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**153,174**;Dec 17, 1997
|
---|
3 | ;
|
---|
4 | ;
|
---|
5 | PP(DFN,PROV) ; -- Returns 1 or 0, if PROV is prim prov for DFN
|
---|
6 | N X,Y I '$G(DFN)!'$G(PROV) Q ""
|
---|
7 | S X=$$OUTPTPR^SDUTL3(+DFN),Y=$S(+X=+PROV:1,1:0)
|
---|
8 | Q Y
|
---|
9 | ;
|
---|
10 | ACT(DFN,BEG,END,LOC) ; -- Returns 1 or 0, if recent activity for DFN
|
---|
11 | ; BEG = beginning date [default = DT-1yr]
|
---|
12 | ; END = ending date [default = DT]
|
---|
13 | ; LOC(IEN) = list of clinic IENs from #44 [default = all]
|
---|
14 | N X,YY,VASD,VAERR,IDT,DA
|
---|
15 | N VSTH,IX,JX
|
---|
16 | S DFN=+$G(DFN),YY=0 I '$G(DFN) Q ""
|
---|
17 | S BEG=$G(BEG,DT-10000),END=$G(END,DT) ;default=last year
|
---|
18 | I END<BEG S X=END,END=BEG,BEG=X
|
---|
19 | I '$D(LOC) D G:YY ACTQ ;check inpatient, Rx data
|
---|
20 | . ;curr inpt
|
---|
21 | . I $G(^DPT(DFN,.105)) S YY=1 Q
|
---|
22 | . S X=+$O(^DGPM("APRD",DFN,BEG))
|
---|
23 | . ; admission
|
---|
24 | . I X,X'>END S YY=1 Q
|
---|
25 | . ;Rx
|
---|
26 | . D OCL^PSOORRL(DFN,BEG,END) I $O(^TMP("PS",$J,0)) S YY=1 Q
|
---|
27 | S VSTH="",(IX,JX)=0
|
---|
28 | D VST^ORWCV(.VSTH,DFN,BEG,END)
|
---|
29 | F S IX=$O(VSTH(IX)) Q:'IX D
|
---|
30 | . F S JX=$O(LOC(JX)) Q:'JX D
|
---|
31 | . . I +$P($G(VSTH(IX)),";",3)=JX S YY=1 Q
|
---|
32 | I YY=1 G ACTQ
|
---|
33 | S IDT=BEG-.0001 F S IDT=$O(^SCE("ADFN",DFN,IDT)) Q:IDT<1!(IDT>END) D Q:YY ;IA #2065
|
---|
34 | . I '$D(LOC) S YY=1 Q
|
---|
35 | . S DA=0 F S DA=+$O(^SCE("ADFN",DFN,IDT,DA)) Q:DA<1 I $D(LOC(+$P($G(^SCE(DA,0)),U,4))) S YY=1 Q
|
---|
36 | ACTQ K ^UTILITY("VASD",$J),^TMP("PS",$J)
|
---|
37 | Q YY
|
---|
38 | ;
|
---|
39 | BYPT(ORY,DFN,QRY) ; -- Returns report data in @ORY based on QRY parameters
|
---|
40 | Q:'$G(DFN) N PAT,ORYPAT,VA,VADM,VAIN,VAERR ;M ^XTMP("ORQRY",$G(DUZ)_";"_$H)=QRY
|
---|
41 | S ORY=$G(ORY,"^TMP($J)"),DFN=+DFN D OERR^VADPT
|
---|
42 | S ORYPAT("Patient.DFN")=DFN,PAT=DFN_";DPT("
|
---|
43 | S ORYPAT("Patient.Age")=VADM(4),ORYPAT("Patient.Name")=VADM(1)
|
---|
44 | S ORYPAT("Patient.Last4")=$E(VADM(1))_VA("BID")
|
---|
45 | S ORYPAT("Patient.Ward")=$S(VAIN(4):$P(VAIN(4),U,2)_" "_VAIN(5),1:"")
|
---|
46 | I $D(QRY("Document")) D DOCMTS
|
---|
47 | I $D(QRY("Order")) D ORDERS
|
---|
48 | I $D(QRY("Consult")) D CSLTS
|
---|
49 | I $D(QRY("Visit")) D VISITS
|
---|
50 | Q
|
---|
51 | ;
|
---|
52 | DOCMTS ; -- Find documents
|
---|
53 | N DOCMT
|
---|
54 | M DOCMT=QRY("Document")
|
---|
55 | D DOCDT^ORQRY01(.DOCMT)
|
---|
56 | D QUERY^TIUQRY(ORY,.DOCMT,.ORYPAT)
|
---|
57 | I $D(DOCMT("NegativeSearch")) D NEGATE("Documents")
|
---|
58 | Q
|
---|
59 | ;
|
---|
60 | CSLTS ; -- Find consults (treats consults as special case of orders)
|
---|
61 | N ORDER,ORGRP,SDATE,EDATE,ORCNT,X,CSLTMODE
|
---|
62 | M ORDER=QRY("Consult") S ORCNT=0,CSLTMODE=1
|
---|
63 | I '$D(ORDER("DisplayGroup")) D
|
---|
64 | . S ORDER("DisplayGroup",$O(^ORD(100.98,"B","CSLT",0)))=""
|
---|
65 | G ORDERS1
|
---|
66 | ;
|
---|
67 | ORDERS ; -- Find orders
|
---|
68 | N ORDER,ORGRP,SDATE,EDATE,ORCNT,I
|
---|
69 | M ORDER=QRY("Order") S ORCNT=0
|
---|
70 | ORDERS1 N ORCBO I $D(ORDER("ItemCombo1"))>1 S (ORCBO(1),ORCBO(2))=-1
|
---|
71 | I $D(ORDER("DisplayGroup"))>1 S I=0 F S I=$O(ORDER("DisplayGroup",I)) Q:'I D GRP(I)
|
---|
72 | D DATES,@$S($D(ORDER("Abnormal")):"ARSX",1:"ACTX") ;$G(ORDER("View")):"AVWX"
|
---|
73 | ; if looking for a combination and both not there, remove the orders
|
---|
74 | I $D(ORCBO),((ORCBO(1)=-1)!(ORCBO(2)=-1)) D
|
---|
75 | . D RMOV($S($G(CSLTMODE):"CST",1:"ORD"))
|
---|
76 | . S ORCNT=0
|
---|
77 | S:'$D(CSLTMODE) @ORY@(0,"Orders")=ORCNT
|
---|
78 | S:$D(CSLTMODE) @ORY@(0,"Consults")=ORCNT
|
---|
79 | I $D(ORDER("NegativeSearch")) D NEGATE($S($G(CSLTMODE):"Consults",1:"Orders"))
|
---|
80 | Q
|
---|
81 | ;
|
---|
82 | GRP(DG) ; -- Setup display group DG in ORGRP()
|
---|
83 | N STK,MEM
|
---|
84 | S ORGRP(DG)="",STK=1,STK(STK)=DG_"^0",STK(0)=0,MEM=0
|
---|
85 | F S MEM=$O(^ORD(100.98,+STK(STK),1,MEM)) D @$S(+MEM'>0:"POP",1:"PROC") Q:STK<1
|
---|
86 | Q
|
---|
87 | POP S STK=STK-1,MEM=$P(STK(STK),"^",2)
|
---|
88 | Q
|
---|
89 | PROC S $P(STK(STK),"^",2)=MEM,DG=$P(^ORD(100.98,+STK(STK),1,MEM,0),"^",1)
|
---|
90 | S ORGRP(DG)="",STK=STK+1,STK(STK)=DG_"^0",MEM=0
|
---|
91 | Q
|
---|
92 | ;
|
---|
93 | DATES ; -- Return SDATE and EDATE from TimeFrame
|
---|
94 | ; [Inverted for rev-chron search]
|
---|
95 | N X S X=$O(ORDER("TimeFrame","")),SDATE=$P(X,":"),EDATE=$P(X,":",2)
|
---|
96 | I EDATE S EDATE=$S($L(EDATE,".")=2:EDATE+.0001,1:EDATE+1)
|
---|
97 | I SDATE S SDATE=$S($L(SDATE,".")=2:SDATE-.0001,1:SDATE)
|
---|
98 | S SDATE=9999999-$S(SDATE:SDATE,1:0),EDATE=9999999-$S(EDATE:EDATE,1:9999998)
|
---|
99 | S X=EDATE,EDATE=SDATE,SDATE=X
|
---|
100 | Q
|
---|
101 | ;
|
---|
102 | AVWX ; -- use ORQ1 for order view
|
---|
103 | N X,DG,MULT,ORLIST,ORI,IFN,ACT
|
---|
104 | S X=$O(ORDER("TimeFrame","")),SDATE=$P(X,":"),EDATE=$P(X,":",2)
|
---|
105 | S DG=+$O(^ORD(100.98,"B","ALL",0)),X=$G(ORDER("View"))
|
---|
106 | S MULT=$S("^1^6^8^9^10^11^13^14^20^22^"[(U_X_U):1,1:0)
|
---|
107 | D EN^ORQ1(PAT,,X,,SDATE,EDATE,,MULT)
|
---|
108 | S ORI=0 F S ORI=$O(^TMP("ORR",$J,ORLIST,ORI)) Q:ORI'>0 S IFN=$G(^(ORI)),ACT=$P(IFN,";",2) D CONT
|
---|
109 | K ^TMP("ORR",$J,ORLIST)
|
---|
110 | Q
|
---|
111 | ;
|
---|
112 | ARSX ; -- loop on ARS xref
|
---|
113 | N IDX,IFN
|
---|
114 | S IDX="^OR(100,""ARS"",PAT,SDATE)"
|
---|
115 | F S IDX=$Q(@IDX) Q:$P(IDX,"""",4)'=PAT Q:$P(IDX,",",4)>EDATE D
|
---|
116 | . S IFN=+$P(IDX,",",5) D CONT
|
---|
117 | Q
|
---|
118 | ACTX ; -- loop on "ACT" xref
|
---|
119 | N IDX,IFN,ACT
|
---|
120 | S IDX="^OR(100,""ACT"",PAT,SDATE)"
|
---|
121 | F S IDX=$Q(@IDX) Q:$P(IDX,"""",4)'=PAT Q:$P(IDX,",",4)>EDATE D
|
---|
122 | . S IFN=+$P(IDX,",",6),ACT=+$P(IDX,",",7)
|
---|
123 | . I $P($G(^OR(100,IFN,8,ACT,0)),U,2)="NW"!$D(ORDER("SignStatus")) D CONT
|
---|
124 | Q
|
---|
125 | CONT ; -- Proceed with checking order ORDER() & IFN [from ARS,ACT]
|
---|
126 | N X,X0,X3,X7,X8,ACTN
|
---|
127 | S X0=$G(^OR(100,IFN,0)),X3=$G(^(3)),X7=$G(^(7))
|
---|
128 | Q:$P(X3,U,8) I $P(X3,U,9),'$P($G(^OR(100,+$P(X3,U,9),3)),U,8) Q
|
---|
129 | ;I $L($P(X0,U,17)),"^10^11^"[(U_STS_U) S X=$$LAPSED^OREVNTX($P(X0,U,17))
|
---|
130 | I $D(ORGRP) Q:'$D(ORGRP(+$P(X0,U,11)))
|
---|
131 | I $D(ORDER("Requestor")) Q:'$D(ORDER("Requestor",+$P(X0,U,4))) ;X8?
|
---|
132 | I $D(ORDER("Status")) Q:'$D(ORDER("Status",+$P(X3,U,3)))
|
---|
133 | I $D(ORDER("Abnormal")) Q:'$P(X7,U,2)
|
---|
134 | I $D(ORDER("Orderable")) Q:'$$OI(IFN)
|
---|
135 | S ACTN=$S($G(ACT):ACT,1:$$LAST(IFN)),X8=$G(^OR(100,IFN,8,ACTN,0))
|
---|
136 | S TXT=+$P(X8,U,14) I $D(ORDER("Text")) Q:'$$TEXT(IFN,TXT)
|
---|
137 | I $D(ORDER("SignStatus")) Q:'$L($P(X8,U,4)) Q:'$D(ORDER("SignStatus",+$P(X8,U,4)))
|
---|
138 | ;I $D(ORDER("Requestor")) Q:'$D(ORDER("Requestor",+$P(X8,U,3)))
|
---|
139 | D SAVEORD
|
---|
140 | Q
|
---|
141 | ;
|
---|
142 | LAST(IFN) ; -- Returns DA of current/latest action for order IFN
|
---|
143 | ; (Only NW or XX actions?)
|
---|
144 | N Y S Y=+$P($G(^OR(100,IFN,3)),U,7)
|
---|
145 | I Y<1 S Y=+$O(^OR(100,IFN,8,"?"),-1)
|
---|
146 | Q Y
|
---|
147 | ;
|
---|
148 | OI(IFN) ; -- Return 1 or 0, if IFN contains any requested OI's
|
---|
149 | N ITM,Y S Y=0
|
---|
150 | S ITM=0 F S ITM=$O(ORDER("Orderable",ITM)) Q:ITM<1 I $D(^OR(100,IFN,.1,"B",ITM)) S Y=1 Q
|
---|
151 | Q Y
|
---|
152 | ;
|
---|
153 | TEXT(IFN,TXT) ; -- Return 1 or 0, if IFN;TXT text contains requested string
|
---|
154 | N X,Y,I S Y=0
|
---|
155 | S X="" F S X=$O(ORDER("Text",X)) Q:X="" S I=0 D
|
---|
156 | . F S I=+$O(^OR(100,IFN,8,TXT,.1,I)) Q:I<1 I $$UP^XLFSTR($G(^(I,0)))[$$UP^XLFSTR(X) S Y=1 Q
|
---|
157 | Q Y
|
---|
158 | ;
|
---|
159 | SAVEORD ; -- Save order number in @ORY@("ORD:IFN;ACTN")
|
---|
160 | ; Called from CONT: also uses X0,X3,X8,TXT,ORYPAT
|
---|
161 | N ID,X
|
---|
162 | S ID=$S($D(CSLTMODE):"CST:",1:"ORD:")_IFN_";"_ACTN,ORCNT=ORCNT+1
|
---|
163 | S @ORY@(ID,"Order.Datetime")=$S($P(X0,U,8):$P(X0,U,8),1:$P(X8,U,16))
|
---|
164 | S @ORY@(ID,"Order.DisplayGroup")=$P($G(^ORD(100.98,+$P(X0,U,11),0)),U)
|
---|
165 | S @ORY@(ID,"Order.Provider")=$P($G(^VA(200,+$P(X0,U,4),0)),U)
|
---|
166 | S X=$P(X8,U,4),@ORY@(ID,"Order.Signature")=$S(X=0!(X=4):"on chart",X=1:"electronically signed",X=2:"unsigned",X=3:"not required",X=5:"cancelled",X=6:"service correction",X=7:"digitally signed",1:"")
|
---|
167 | S @ORY@(ID,"Order.Status")=$$LOW^XLFSTR($P($G(^ORD(100.01,+$P(X3,U,3),0)),U))
|
---|
168 | S @ORY@(ID,"Order.Abnormal")=$S($P(X7,U,2):"YES",X7:"NO",1:"")
|
---|
169 | S @ORY@(ID,"Order.Finding")=$P(X7,U,3)
|
---|
170 | S @ORY@(ID,"Order.Text")=$$BLDTXT(IFN,TXT)
|
---|
171 | M @ORY@(ID)=ORYPAT
|
---|
172 | I $D(ORCBO) D SETCBO(IFN)
|
---|
173 | Q
|
---|
174 | BLDTXT(IFN,TXT) ; -- Return concatenated order text up to 245 chars
|
---|
175 | N I,ALL,PART,MAX S ALL="",MAX=0
|
---|
176 | S I=0 F S I=$O(^OR(100,IFN,8,TXT,.1,I)) Q:'I D Q:MAX
|
---|
177 | . S PART=$G(^OR(100,IFN,8,TXT,.1,I,0))
|
---|
178 | . I ($L(ALL)+$L(PART))<245 S ALL=ALL_$S($L(ALL):" ",1:"")_PART
|
---|
179 | . E S MAX=1
|
---|
180 | I MAX S ALL=ALL_"..."
|
---|
181 | Q ALL
|
---|
182 | ;
|
---|
183 | SETCBO(IFN) ; -- Set flags when looking for combinations of orderable items
|
---|
184 | N I,OI
|
---|
185 | S I=0 F S I=$O(^OR(100,IFN,.1,I)) Q:'I D
|
---|
186 | . S OI=+^OR(100,IFN,.1,I,0)
|
---|
187 | . I $D(ORDER("ItemCombo1",OI)) S ORCBO(1)=1
|
---|
188 | . I $D(ORDER("ItemCombo2",OI)) S ORCBO(2)=1
|
---|
189 | Q
|
---|
190 | ;
|
---|
191 | VISITS ; -- Find clinic visits
|
---|
192 | ; Save in @ORY@("VST:TYPE;DT;LOC")
|
---|
193 | N VISIT,X,SDATE,EDATE,ORV,ORCNT,I,ID,VTYPE
|
---|
194 | M VISIT=QRY("Visit")
|
---|
195 | S X=$O(VISIT("TimeFrame","")),SDATE=$P(X,":"),EDATE=$P(X,":",2)
|
---|
196 | S SDATE=SDATE-.0001 S:$L(EDATE,".")<2 EDATE=EDATE+.9999
|
---|
197 | D VST^ORWCV(.ORV,DFN,SDATE,EDATE,1) S ORCNT=0
|
---|
198 | S I=0 F S I=+$O(ORV(I)) Q:I<1 D
|
---|
199 | . S X=ORV(I) Q:'$$ISVALID(X)
|
---|
200 | . Q:$P(X,";",2)>(EDATE+1)
|
---|
201 | . S VTYPE=$P(ORV(I),";")
|
---|
202 | . S ID="VST:"_$P(X,U),ORCNT=ORCNT+1
|
---|
203 | . S @ORY@(ID,"Visit.Datetime")=$P(ID,";",2)
|
---|
204 | . S @ORY@(ID,"Visit.Location")=$P(X,U,3)
|
---|
205 | . S @ORY@(ID,"Visit.NoShow")=$S($E(X)'="A":"",$$UP^XLFSTR($P(X,U,4))["NO-SHOW":"YES",1:"NO")
|
---|
206 | . S:VTYPE'="I" @ORY@(ID,"Visit.Status")=$P(X,U,4)
|
---|
207 | . M @ORY@(ID)=ORYPAT
|
---|
208 | S @ORY@(0,"Visits")=ORCNT
|
---|
209 | I $D(VISIT("NegativeSearch")) D NEGATE("Visits")
|
---|
210 | Q
|
---|
211 | ;
|
---|
212 | ISVALID(VST) ; -- True: valid visit data
|
---|
213 | N IX,VSTID,ISVAL
|
---|
214 | S VSTID=+$P(VST,";",3)
|
---|
215 | S (IX,ISVAL)=0
|
---|
216 | F S IX=$O(VISIT("Location",IX)) Q:'IX D
|
---|
217 | . I IX=VSTID S ISVAL=1 Q
|
---|
218 | S:'$D(VISIT("Location")) ISVAL=1
|
---|
219 | Q ISVAL
|
---|
220 | ;
|
---|
221 | NEGATE(SRCHITM) ; -- set report to return nodes only when nothing found
|
---|
222 | N ID,RTNCNT,PRE
|
---|
223 | I SRCHITM="Consults" S ID="PTC:"_DFN,PRE="CST"
|
---|
224 | I SRCHITM="Orders" S ID="PTO:"_DFN,PRE="ORD"
|
---|
225 | I SRCHITM="Documents" S ID="PTD:"_DFN,PRE="DOC"
|
---|
226 | I SRCHITM="Visits" S ID="PTV:"_DFN,PRE="VST"
|
---|
227 | S RTNCNT=@ORY@(0,SRCHITM)
|
---|
228 | I RTNCNT=0 D
|
---|
229 | . M @ORY@(ID)=ORYPAT
|
---|
230 | . S @ORY@(ID,"Patient.NoneFound")=SRCHITM
|
---|
231 | . S @ORY@(0,SRCHITM)=1
|
---|
232 | E D
|
---|
233 | . D RMOV(PRE)
|
---|
234 | . S @ORY@(0,SRCHITM)=0
|
---|
235 | Q
|
---|
236 | ;
|
---|
237 | RMOV(PRE) ; -- Remove nodes based on ID prefix
|
---|
238 | N ID
|
---|
239 | S ID="" F S ID=$O(@ORY@(ID)) Q:ID="" I $P(ID,":")=PRE K @ORY@(ID)
|
---|
240 | Q
|
---|