1 | LRVRPOC ;DALOI/JMC - POINT OF CARE VERIFICATION ; 4 May 2004
|
---|
2 | ;;5.2;LAB SERVICE;**290**;Sep 27, 1994
|
---|
3 | ;
|
---|
4 | ; Reference to DIVSET^XUSRB2 supported by DBIA #4055
|
---|
5 | ; Reference to ADM^VADPT2 supported by DBIA #325
|
---|
6 | ;
|
---|
7 | EN ; Entry Point Call with LRLL=Load/Worklist IEN
|
---|
8 | ;
|
---|
9 | N DIQUIET
|
---|
10 | ;
|
---|
11 | S LRLL=+$G(LRLL)
|
---|
12 | ;
|
---|
13 | ; See if already running
|
---|
14 | L +^LAH("Z",LRLL):10
|
---|
15 | E D END Q
|
---|
16 | ;
|
---|
17 | I '$D(^LRO(68.2,LRLL,0))#2 D END Q
|
---|
18 | S LRLL(0)=^LRO(68.2,LRLL,0)
|
---|
19 | ;
|
---|
20 | ; Must be POC Load/Work List
|
---|
21 | I $$GET1^DIQ(68.2,LRLL,.03,"I")'=2 D Q
|
---|
22 | . S LAMSG="POC: Unable to process POC results using non-POC worklist "_$$GET1^DIQ(68.2,LRLL,.01)
|
---|
23 | . D XQA^LA7UXQA(2,0,0,0,LAMSG,"")
|
---|
24 | . D END
|
---|
25 | ;
|
---|
26 | ;
|
---|
27 | ; If rollover has not completed
|
---|
28 | ; then requeue task 1 hour in future and send alert.
|
---|
29 | I $G(^LAB(69.9,1,"RO"))'=+$H D Q
|
---|
30 | . S ZTREQ=$$HADD^XLFDT($H,0,1,0,0)
|
---|
31 | . S LAMSG="POC: Lab Rollover has not completed as of "_$$HTE^XLFDT($H,"1M")
|
---|
32 | . D XQA^LA7UXQA(2,0,0,0,LAMSG,"")
|
---|
33 | . D END
|
---|
34 | ;
|
---|
35 | D INIT^LRVRPOCU
|
---|
36 | I LREND D Q
|
---|
37 | . D XQA^LA7UXQA(2,0,0,0,"POC: "_LAMSG,"")
|
---|
38 | . D END
|
---|
39 | ;
|
---|
40 | S LAIEN=0
|
---|
41 | F S LAIEN=$O(^LAH(LRLL,1,LAIEN)) Q:LAIEN<1 D
|
---|
42 | . I $$S^%ZTLOAD S ZTSTOP=1 Q ; Task has been requested to stop
|
---|
43 | . K LRERR
|
---|
44 | . S LASSN=$P($G(^LAH(LRLL,1,LAIEN,.1,"PID","SSN")),"^")
|
---|
45 | . ; Interface message number in ^LAHM(62.49
|
---|
46 | . S LA76249=+$P($G(^LAH(LRLL,1,LAIEN,0)),U,13)
|
---|
47 | . ; File #62.48 configuration link
|
---|
48 | . S LA76248=""
|
---|
49 | . I LA76249 S LA76248=$$GET1^DIQ(62.49,LA76249_",",.5,"I")
|
---|
50 | . D LOOK,NEXT,ZAPALL^LRVR3(LRLL,LAIEN)
|
---|
51 | D END
|
---|
52 | Q
|
---|
53 | ;
|
---|
54 | ;
|
---|
55 | NEXT ; Clean up between entries
|
---|
56 | D CLEAN^LRVRPOCU
|
---|
57 | Q
|
---|
58 | ;
|
---|
59 | ;
|
---|
60 | END ; Clean up and quit
|
---|
61 | ; Release lock
|
---|
62 | L -^LAH("Z",LRLL)
|
---|
63 | ;
|
---|
64 | D SPALERT^LRVRPOCU,KVAR^VADPT,KILL^XUSCLEAN
|
---|
65 | K ^TMP("LR",$J)
|
---|
66 | I $D(ZTQUEUED),'$P($G(ZTREQ),"^") S ZTREQ="@"
|
---|
67 | Q
|
---|
68 | ;
|
---|
69 | ;
|
---|
70 | LOOK ; Check for data
|
---|
71 | K LRDFN,LRERR
|
---|
72 | S LRODT=DT,(LREND,LRERR)=0
|
---|
73 | S DFN=$$FIND1^DIC(2,"","X",LASSN,"SSN","","")
|
---|
74 | I 'DFN D Q
|
---|
75 | . S LRERR=$$CREATE^LA7LOG(101,1)
|
---|
76 | . D SENDACK^LRVRPOCU
|
---|
77 | S LADFN=DFN
|
---|
78 | I '$D(^LAH(LRLL,1,LAIEN,0))#2 D Q
|
---|
79 | . S LRERR=$$CREATE^LA7LOG(105,1)
|
---|
80 | . D SENDACK^LRVRPOCU
|
---|
81 | S LRCDT=$P($G(^LAH(LRLL,1,LAIEN,.1,"OBR","ORCDT")),"^")
|
---|
82 | I LRCDT'?7N.E D Q
|
---|
83 | . S LRERR=$$CREATE^LA7LOG(104,1)
|
---|
84 | . D SENDACK^LRVRPOCU
|
---|
85 | S LRDFN=$$FNLRDFN(LADFN)
|
---|
86 | I $S(LREND:1,LRDFN<1:1,1:0) Q
|
---|
87 | S LRSSN=$S($G(^LAH(LRLL,1,LAIEN,.1,"PID","SSN")):^("SSN"),1:"???")
|
---|
88 | I LRSSN'=$G(SSN(2)) D Q
|
---|
89 | . S LRERR=$$CREATE^LA7LOG(106,1)
|
---|
90 | . D SENDACK^LRVRPOCU
|
---|
91 | S LRTJ=""
|
---|
92 | D DATA(LRLL,LAIEN)
|
---|
93 | Q
|
---|
94 | ;
|
---|
95 | ;
|
---|
96 | FNLRDFN(DFN) ;Lookup/set LRDFN and define patient variables
|
---|
97 | D KVAR^VADPT
|
---|
98 | K ANS,ERR,LRDPF,PNM,X
|
---|
99 | I $S(+DFN'=DFN:1,'$G(DFN):1,'$D(^DPT(DFN,0))#2:1,1:0) D Q 0
|
---|
100 | . S LREND=1,LRERR=$$CREATE^LA7LOG(108,1)
|
---|
101 | . D SENDACK^LRVRPOCU
|
---|
102 | S LRDFN=$$GET1^DIQ(2,DFN_",",63,"I","ANS","ERR")
|
---|
103 | S PNM="Unknown"
|
---|
104 | I LRDFN<1 S LRDFN=$$NEWPT(DFN)
|
---|
105 | I LRDFN>0 D Q LRDFN
|
---|
106 | . D DEM^LRX
|
---|
107 | . I $G(LREND) S LRDFN=0 Q
|
---|
108 | . S VAINDT=LRCDT D ADM^VADPT2
|
---|
109 | . S VAIP("D")=$S(VADMVT:LRCDT,1:LRCDT\1) D IN5PT^LRX
|
---|
110 | . D DPT(SSN(2))
|
---|
111 | . I LRERR S LREND=1,LRDFN=0
|
---|
112 | Q 0
|
---|
113 | ;
|
---|
114 | ;
|
---|
115 | NEWPT(DFN) ;Set ^LR( root for patient
|
---|
116 | S LRDPF="2^DPT(",X="^"_$P(LRDPF,"^",2)_DFN_",""LR"")"
|
---|
117 | S LRDFN=$O(^LR("A"),-1) I 'LRDFN S LRDFN=1
|
---|
118 | L +^LR(0):99
|
---|
119 | D E2^LRDPA
|
---|
120 | L -^LR(0)
|
---|
121 | I $G(LRDFN)<1 S LREND=1,LRDFN=0
|
---|
122 | Q LRDFN
|
---|
123 | ;
|
---|
124 | ;
|
---|
125 | DPT(LRASSN) ;
|
---|
126 | N LRX,X,Y,DIC
|
---|
127 | S (LRERR,LRDFN)=""
|
---|
128 | S DFN=$$FIND1^DIC(2,"","X",LRASSN,"SSN","","")
|
---|
129 | I 'DFN D Q
|
---|
130 | . N LASSN
|
---|
131 | . S LASSN=LRASSN,LRERR=$$CREATE^LA7LOG(101,1)
|
---|
132 | . D SENDACK^LRVRPOCU
|
---|
133 | S LRDFN=$$GET1^DIQ(2,DFN_",",63,"I","ANS","ERR")
|
---|
134 | I 'LRDFN D END^LRDPA Q:'$G(LRDFN)
|
---|
135 | S LRX=$G(^LAH(LRLL,1,LAIEN,.1,"PID","LRDFN"))
|
---|
136 | I LRX,LRX'=LRDFN D Q
|
---|
137 | . S LRERR=$$CREATE^LA7LOG(103,1)
|
---|
138 | . D SENDACK^LRVRPOCU
|
---|
139 | ;
|
---|
140 | S LRX=$G(^LAH(LRLL,1,LAIEN,.1,"PID","DFN"))
|
---|
141 | I LRX,LRX'=DFN D Q
|
---|
142 | . S LRERR=$$CREATE^LA7LOG(102,1)
|
---|
143 | . D SENDACK^LRVRPOCU
|
---|
144 | ;
|
---|
145 | ; Determine ordering provider
|
---|
146 | N LRX,LRY,X,Y
|
---|
147 | S LRPRAC=""
|
---|
148 | S LRX=$G(^LAH(LRLL,1,LAIEN,.1,"OBR","ORDP"))
|
---|
149 | I '$P(LRX,"^",2),$P(LRX,"^")'="" D Q:LRERR
|
---|
150 | . S LRERR=$$CREATE^LA7LOG(119,1)
|
---|
151 | . D SENDACK^LRVRPOCU
|
---|
152 | ; Check if a valid provider
|
---|
153 | I $P(LRX,"^",2) D Q:LRERR
|
---|
154 | . I $$PROVIDER^XUSER(+LRX) S LRPRAC=+LRX Q
|
---|
155 | . S LRERR=$$CREATE^LA7LOG(119,1)
|
---|
156 | . D SENDACK^LRVRPOCU
|
---|
157 | ;
|
---|
158 | ; If no ordering provider in message then check for inpatient provider.
|
---|
159 | I 'LRPRAC D
|
---|
160 | . I $G(VAIP(7)) S LRPRAC=+VAIP(7) Q
|
---|
161 | . I $G(VAIP(18)) S LRPRAC=+VAIP(18) Q
|
---|
162 | ;
|
---|
163 | ; Use VADPT for inpatients - clinic enrollment for outpatient
|
---|
164 | ; Check if ordering location/division from message
|
---|
165 | S X=$G(^LAH(LRLL,1,LAIEN,.1,"OBR","EOL"))
|
---|
166 | S LROLLOC=+X,LROLDIV=$P(X,"^",3)
|
---|
167 | ;
|
---|
168 | ; Check for inpatient location if no location
|
---|
169 | I 'LROLLOC,$G(VAIP(5)) D
|
---|
170 | . S LROLLOC=$$GET1^DIQ(42,+VAIP(5)_",",44,"I")
|
---|
171 | . I 'LROLDIV S LROLDIV=$$GET1^DIQ(44,LROLLOC_",",3,"I")
|
---|
172 | ;
|
---|
173 | ; Check for outpatient appointments if no location
|
---|
174 | I 'LROLLOC!('LRPRAC) D VASD^LRVRPOCU
|
---|
175 | ;
|
---|
176 | ; If no location then log error.
|
---|
177 | I 'LROLLOC D Q
|
---|
178 | . S LRERR=$$CREATE^LA7LOG(107,1)
|
---|
179 | . D SENDACK^LRVRPOCU
|
---|
180 | ;
|
---|
181 | ; If no in/outpatient provider then check for primary care provider
|
---|
182 | I 'LRPRAC S LRPRAC=+$$OUTPTPR^SDUTL3(DFN,LRCDT)
|
---|
183 | ;
|
---|
184 | ; If no provider - none in message, no primary care and no provider on
|
---|
185 | ; outpatient encounter then log error.
|
---|
186 | I 'LRPRAC D Q
|
---|
187 | . S LRERR=$$CREATE^LA7LOG(110,1)
|
---|
188 | . D SENDACK^LRVRPOCU
|
---|
189 | ;
|
---|
190 | ; If division in message does not match location's division then reject.
|
---|
191 | ; Check if division not a VAMC and parent is a VAMC and division
|
---|
192 | ; matches parent - deal with multiple medical centers within an
|
---|
193 | ; integrated system.
|
---|
194 | I LROLDIV D Q:LRERR
|
---|
195 | . N DIV,OK,LRX
|
---|
196 | . S DIV=$$GET1^DIQ(44,LROLLOC_",",3,"I")
|
---|
197 | . I LROLDIV=DIV Q
|
---|
198 | . S X=$$NNT^XUAF4(DIV),OK=0
|
---|
199 | . I $P(X,"^",3)'="VAMC" D Q:OK
|
---|
200 | . . S Y=$P($$PRNT^XUAF4($P(X,"^")),"^"),X=$$NNT^XUAF4(Y)
|
---|
201 | . . I $P(X,"^",3)="VAMC",$P(Y,"^")=LROLDIV S OK=1
|
---|
202 | . S LRX=$$NNT^XUAF4(LROLDIV)
|
---|
203 | . S LRERR=$$CREATE^LA7LOG(112,1)
|
---|
204 | . D SENDACK^LRVRPOCU
|
---|
205 | ;
|
---|
206 | ; Get location abbreviation
|
---|
207 | S LRLLOC=$$GET1^DIQ(44,LROLLOC_",",1,"I")
|
---|
208 | I LRLLOC="" S LRLLOC="NO ABRV "_LROLLOC
|
---|
209 | Q
|
---|
210 | ;
|
---|
211 | ;
|
---|
212 | DATA(LRLL,LAIEN) ;Extract results into LROT(
|
---|
213 | ;
|
---|
214 | K LR642,LRDATA,LRERR,LRSPECX,LRCNT,LROSPEC,LROT,LRSAMP,LRSB,LRSPEC,LRTRAY,LRCUP,LRSQ,LRTS,LRX,LRY,LRZ
|
---|
215 | S LRSQ=LAIEN,LRDATA=1,(LR642,LRCNT,LRERR)=0,(LRDAA,LRSAMP,LRSPEC)=""
|
---|
216 | S LRLL(0)=^LRO(68.2,LRLL,0)
|
---|
217 | S LROSPEC=$P($G(^LAH(LRLL,1,LAIEN,.1,"OBR","ORDSPEC")),"^")
|
---|
218 | I LROSPEC="" D Q
|
---|
219 | . S LRERR=$$CREATE^LA7LOG(114,1)
|
---|
220 | . D SENDACK^LRVRPOCU
|
---|
221 | S LRX=$G(^LAH(LRLL,1,LAIEN,.1,"OBR","ORDNLT"))
|
---|
222 | ;
|
---|
223 | ; Change division to ordering division
|
---|
224 | S LRDUZ(2)=$S(LROLDIV:LROLDIV,1:LRDIV)
|
---|
225 | I LRDUZ(2)'=DUZ(2) D Q:LRERR
|
---|
226 | . N LA7X,LRY
|
---|
227 | . S LRY=0
|
---|
228 | . D DIVSET^XUSRB2(.LRY,"`"_LRDUZ(2))
|
---|
229 | . I LRY Q
|
---|
230 | . S LA7X="Unable to set user 'LRLAB,POC' to division "_$$GET1^DIQ(4,LRDUZ(2)_",",.01)
|
---|
231 | . S LRERR=$$CREATE^LA7LOG(37,1)
|
---|
232 | ;
|
---|
233 | ; Ordering based on NLT codes from loadlist profile and OBR segment
|
---|
234 | F I=1:1:$L(LRX,"^") S LRY=$P(LRX,"^",I) Q:LRY="" D Q:LRERR
|
---|
235 | . I '$D(LRORDNLT(LRY,LROSPEC)) S LRERR=$$CREATE^LA7LOG(120,1) Q
|
---|
236 | . S LRZ=LRORDNLT(LRY,LROSPEC)
|
---|
237 | . S LRTST=$P(LRZ,"^"),LRSPEC=$P(LRZ,"^",2),LRSAMP=$P(LRZ,"^",3)
|
---|
238 | . I '$D(^TMP("LR",$J,"VTO",LRTST)) S LRERR=$$CREATE^LA7LOG(118,1) Q
|
---|
239 | . I 'LRSPEC S LRERR=$$CREATE^LA7LOG(114,1) Q
|
---|
240 | . I 'LRSAMP S LRERR=$$CREATE^LA7LOG(115,1) Q
|
---|
241 | . S LRCNT=LRCNT+1,LROT(LRSAMP,LRSPEC,LRCNT)=LRTST
|
---|
242 | . I $P(LRZ,"^",4) S LR642=$P(LRZ,"^",4)
|
---|
243 | . I 'LRDAA,LROLDIV,$D(^LAB(60,LRTST,8,LROLDIV,0)) S LRDAA=$P(^(0),U,2)
|
---|
244 | I LRERR D SENDACK^LRVRPOCU Q
|
---|
245 | I LRDAA<1 S LRDAA=$P(^LRO(68.2,LRLL,10,LRPROF,0),"^",2)
|
---|
246 | ;
|
---|
247 | ; Check for results to process
|
---|
248 | I '$O(LROT(0)) D Q
|
---|
249 | . S LRERR=$$CREATE^LA7LOG(113,1)
|
---|
250 | . D SENDACK^LRVRPOCU
|
---|
251 | ;
|
---|
252 | ; Setup workload suffix
|
---|
253 | I LR642<1 S LR642=LRDFWKLD
|
---|
254 | D WKLD^LRVRPOCU(LR642)
|
---|
255 | ;
|
---|
256 | ; Check if results have datanames/tests on this profile.
|
---|
257 | F S LRDATA=$O(^LAH(LRLL,1,LAIEN,LRDATA)) Q:LRDATA<1 D Q:LRERR
|
---|
258 | . I $P($G(^LAH(LRLL,1,LAIEN,LRDATA)),U)="" Q
|
---|
259 | . S LRDATA(LRDATA)=^LAH(LRLL,1,LAIEN,LRDATA)
|
---|
260 | . I $P(LRDATA(LRDATA),"^",4)<1 S LRERR=$$CREATE^LA7LOG(111,1) Q
|
---|
261 | . S LRTST=+$G(LRVTS(LRDATA))
|
---|
262 | . I 'LRTST S LRERR=$$CREATE^LA7LOG(116,1) Q
|
---|
263 | . I '$D(^TMP("LR",$J,"VTO",LRTST)) S LRERR=$$CREATE^LA7LOG(118,1) Q
|
---|
264 | I LRERR D SENDACK^LRVRPOCU Q
|
---|
265 | ;
|
---|
266 | K LRCOM
|
---|
267 | S LRNT=$$NOW^XLFDT,LRORDTIM=""
|
---|
268 | ;
|
---|
269 | ; Setup the order in LRO(69
|
---|
270 | S LRNOLABL="" ; Suppress label printing
|
---|
271 | D
|
---|
272 | . N LRSPEC,LRSAMP,ZTQUEUED
|
---|
273 | . S ZTQUEUED=1
|
---|
274 | . D ORDER^LROW2,^LRORDST
|
---|
275 | ;
|
---|
276 | ; Setup LRO(68
|
---|
277 | D
|
---|
278 | . N LRSPEC,LRSAMP
|
---|
279 | . D ^LRWLST
|
---|
280 | I '$G(LRAA) D Q
|
---|
281 | . S LRERR=$$CREATE^LA7LOG(109,1)
|
---|
282 | . D SENDACK^LRVRPOCU
|
---|
283 | ;
|
---|
284 | S LRMETH="POC DEVICE"
|
---|
285 | I LA76248 S LRMETH=$E($$GET1^DIQ(62.48,LA76248_",",.01),1,10)
|
---|
286 | I LRMETH="" S LRMETH=$E($P(LRLL(0),U),1,5)_"(POC)"
|
---|
287 | ;
|
---|
288 | ; Store POC specimen id in file #63 as ordering site UID.
|
---|
289 | S X=$G(^LAH(LRLL,1,LAIEN,.1,"OBR","FID"))
|
---|
290 | I $P(X,"^")'="" D
|
---|
291 | . N FDA,LA7DIE
|
---|
292 | . S FDA(1,63.04,LRIDT_","_LRDFN_",",.342)=$P(X,"^")
|
---|
293 | . I $P(X,"^",2) S FDA(1,63.04,LRIDT_","_LRDFN_",",.32)=$P(X,"^",2)
|
---|
294 | . D FILE^DIE("","FDA(1)","LA7DIE(1)")
|
---|
295 | ;
|
---|
296 | ; Store ^LR( data [results]
|
---|
297 | S LRVF=0,LRALERT=LROUTINE,LRUSI="POC.5"
|
---|
298 | M LRSB=LRDATA
|
---|
299 | D TEST^LRVR1
|
---|
300 | S LRSB=0
|
---|
301 | F S LRSB=$O(LRSB(LRSB)) Q:LRSB<1 D Q:LRERR
|
---|
302 | . I '$G(^TMP("LR",$J,"TMP",LRSB,"P")) S LRERR=$$CREATE^LA7LOG(117,1) Q
|
---|
303 | . S LRX=$$TMPSB^LRVER1(LRSB),LRY=$P(LRSB(LRSB),U,3)
|
---|
304 | . F I=1:1:$L(LRX,"!") I $P(LRY,"!",I)="" S $P(LRY,"!",I)=$P(LRX,"!",I)
|
---|
305 | . S $P(LRSB(LRSB),U,3)=LRY
|
---|
306 | . S LRTS=$G(^TMP("LR",$J,"TMP",LRSB))
|
---|
307 | . D V25^LRVER5
|
---|
308 | . S LRX=LRNGS,LRY=$P(LRSB(LRSB),U,5)
|
---|
309 | . F I=1:1:$L(LRX,U) I $P(LRY,"!",I)="" S $P(LRY,"!",I)=$P(LRX,U,I)
|
---|
310 | . S $P(LRSB(LRSB),U,5)=LRY
|
---|
311 | . I $P(LRSB(LRSB),U,9)="" S $P(LRSB(LRSB),U,9)=$S($G(LRDUZ(2)):LRDUZ(2),1:$G(DUZ(2)))
|
---|
312 | . S ^LR(LRDFN,"CH",LRIDT,LRSB)=LRSB(LRSB)
|
---|
313 | ;
|
---|
314 | I LRERR D SENDACK^LRVRPOCU Q
|
---|
315 | ;
|
---|
316 | ; Call to set data and comments
|
---|
317 | I $O(LRSB(0)) D
|
---|
318 | . D LRSBCOM^LRVR4,A3^LRVR3
|
---|
319 | . S LRSTORE=LRSTORE+1
|
---|
320 | . I $G(LA76248) S LRSTORE(LA76248)=$G(LRSTORE(LA76248))+1
|
---|
321 | ;
|
---|
322 | ; Send application ack back to POC interface
|
---|
323 | D SENDACK^LRVRPOCU
|
---|
324 | Q
|
---|