Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: LRVRPOC

LRVRPOC.m

Go to the documentation of this file.
LRVRPOC ;VA/DALOI/JMC - POINT OF CARE VERIFICATION ; 4 May 2004
 ;;5.2;LAB SERVICE;**1031**;NOV 1, 1997
 ;
 ;;VA LR Patch(s): 290
 ;
 ; Reference to DIVSET^XUSRB2 supported by DBIA #4055
 ; Reference to ADM^VADPT2 supported by DBIA #325
 ;
EN ; Entry Point Call with LRLL=Load/Worklist IEN
 ;
 N DIQUIET
 ;
 S LRLL=+$G(LRLL)
 ;
 ; See if already running
 L +^LAH("Z",LRLL):10
 E  D END Q
 ;
 I '$D(^LRO(68.2,LRLL,0))#2 D END Q
 S LRLL(0)=^LRO(68.2,LRLL,0)
 ;
 ; Must be POC Load/Work List
 I $$GET1^DIQ(68.2,LRLL,.03,"I")'=2 D  Q
 . S LAMSG="POC: Unable to process POC results using non-POC worklist "_$$GET1^DIQ(68.2,LRLL,.01)
 . D XQA^LA7UXQA(2,0,0,0,LAMSG,"")
 . D END
 ;
 ;
 ; If rollover has not completed
 ; then requeue task 1 hour in future and send alert.
 I $G(^LAB(69.9,1,"RO"))'=+$H D  Q
 . S ZTREQ=$$HADD^XLFDT($H,0,1,0,0)
 . S LAMSG="POC: Lab Rollover has not completed as of "_$$HTE^XLFDT($H,"1M")
 . D XQA^LA7UXQA(2,0,0,0,LAMSG,"")
 . D END
 ;
 D INIT^LRVRPOCU
 I LREND D  Q
 . D XQA^LA7UXQA(2,0,0,0,"POC: "_LAMSG,"")
 . D END
 ;
 S LAIEN=0
 F  S LAIEN=$O(^LAH(LRLL,1,LAIEN)) Q:LAIEN<1  D
 . I $$S^%ZTLOAD S ZTSTOP=1 Q  ; Task has been requested to stop
 . K LRERR
 . S LASSN=$P($G(^LAH(LRLL,1,LAIEN,.1,"PID","SSN")),"^")
 . ; Interface message number in ^LAHM(62.49
 . S LA76249=+$P($G(^LAH(LRLL,1,LAIEN,0)),U,13)
 . ; File #62.48 configuration link
 . S LA76248=""
 . I LA76249 S LA76248=$$GET1^DIQ(62.49,LA76249_",",.5,"I")
 . D LOOK,NEXT,ZAPALL^LRVR3(LRLL,LAIEN)
 D END
 Q
 ;
 ;
NEXT ; Clean up between entries
 D CLEAN^LRVRPOCU
 Q
 ;
 ;
END ; Clean up and quit
 ; Release lock
 L -^LAH("Z",LRLL)
 ;
 D SPALERT^LRVRPOCU,KVAR^VADPT,KILL^XUSCLEAN
 K ^TMP("LR",$J)
 I $D(ZTQUEUED),'$P($G(ZTREQ),"^") S ZTREQ="@"
 Q
 ;
 ;
LOOK ; Check for data
 K LRDFN,LRERR
 S LRODT=DT,(LREND,LRERR)=0
 S DFN=$$FIND1^DIC(2,"","X",LASSN,"SSN","","")
 I 'DFN D  Q
 . S LRERR=$$CREATE^LA7LOG(101,1)
 . D SENDACK^LRVRPOCU
 S LADFN=DFN
 I '$D(^LAH(LRLL,1,LAIEN,0))#2 D  Q
 . S LRERR=$$CREATE^LA7LOG(105,1)
 . D SENDACK^LRVRPOCU
 S LRCDT=$P($G(^LAH(LRLL,1,LAIEN,.1,"OBR","ORCDT")),"^")
 I LRCDT'?7N.E D  Q
 . S LRERR=$$CREATE^LA7LOG(104,1)
 . D SENDACK^LRVRPOCU
 S LRDFN=$$FNLRDFN(LADFN)
 I $S(LREND:1,LRDFN<1:1,1:0) Q
 S LRSSN=$S($G(^LAH(LRLL,1,LAIEN,.1,"PID","SSN")):^("SSN"),1:"???")
 I LRSSN'=$G(SSN(2)) D  Q
 . S LRERR=$$CREATE^LA7LOG(106,1)
 . D SENDACK^LRVRPOCU
 S LRTJ=""
 D DATA(LRLL,LAIEN)
 Q
 ;
 ;
FNLRDFN(DFN) ;Lookup/set LRDFN and define patient variables
 D KVAR^VADPT
 K ANS,ERR,LRDPF,PNM,X
 I $S(+DFN'=DFN:1,'$G(DFN):1,'$D(^DPT(DFN,0))#2:1,1:0) D  Q 0
 . S LREND=1,LRERR=$$CREATE^LA7LOG(108,1)
 . D SENDACK^LRVRPOCU
 S LRDFN=$$GET1^DIQ(2,DFN_",",63,"I","ANS","ERR")
 S PNM="Unknown"
 I LRDFN<1 S LRDFN=$$NEWPT(DFN)
 I LRDFN>0 D  Q LRDFN
 . D DEM^LRX
 . I $G(LREND) S LRDFN=0 Q
 . S VAINDT=LRCDT D ADM^VADPT2
 . S VAIP("D")=$S(VADMVT:LRCDT,1:LRCDT\1) D IN5PT^LRX
 . D DPT(SSN(2))
 . I LRERR S LREND=1,LRDFN=0
 Q 0
 ;
 ;
NEWPT(DFN) ;Set ^LR( root for patient
 S LRDPF="2^DPT(",X="^"_$P(LRDPF,"^",2)_DFN_",""LR"")"
 S LRDFN=$O(^LR("A"),-1) I 'LRDFN S LRDFN=1
 L +^LR(0):99
 D E2^LRDPA
 L -^LR(0)
 I $G(LRDFN)<1 S LREND=1,LRDFN=0
 Q LRDFN
 ;
 ;
DPT(LRASSN) ;
 N LRX,X,Y,DIC
 S (LRERR,LRDFN)=""
 S DFN=$$FIND1^DIC(2,"","X",LRASSN,"SSN","","")
 I 'DFN D  Q
 . N LASSN
 . S LASSN=LRASSN,LRERR=$$CREATE^LA7LOG(101,1)
 . D SENDACK^LRVRPOCU
 S LRDFN=$$GET1^DIQ(2,DFN_",",63,"I","ANS","ERR")
 I 'LRDFN D END^LRDPA Q:'$G(LRDFN)
 S LRX=$G(^LAH(LRLL,1,LAIEN,.1,"PID","LRDFN"))
 I LRX,LRX'=LRDFN D  Q
 . S LRERR=$$CREATE^LA7LOG(103,1)
 . D SENDACK^LRVRPOCU
 ;
 S LRX=$G(^LAH(LRLL,1,LAIEN,.1,"PID","DFN"))
 I LRX,LRX'=DFN D  Q
 . S LRERR=$$CREATE^LA7LOG(102,1)
 . D SENDACK^LRVRPOCU
 ;
 ; Determine ordering provider
 N LRX,LRY,X,Y
 S LRPRAC=""
 S LRX=$G(^LAH(LRLL,1,LAIEN,.1,"OBR","ORDP"))
 I '$P(LRX,"^",2),$P(LRX,"^")'="" D  Q:LRERR
 . S LRERR=$$CREATE^LA7LOG(119,1)
 . D SENDACK^LRVRPOCU
 ; Check if a valid provider
 I $P(LRX,"^",2) D  Q:LRERR
 . I $$PROVIDER^XUSER(+LRX) S LRPRAC=+LRX Q
 . S LRERR=$$CREATE^LA7LOG(119,1)
 . D SENDACK^LRVRPOCU
 ;
 ; If no ordering provider in message then check for inpatient provider.
 I 'LRPRAC D
 . I $G(VAIP(7)) S LRPRAC=+VAIP(7) Q
 . I $G(VAIP(18)) S LRPRAC=+VAIP(18) Q
 ;
 ; Use VADPT for inpatients - clinic enrollment for outpatient
 ; Check if ordering location/division from message
 S X=$G(^LAH(LRLL,1,LAIEN,.1,"OBR","EOL"))
 S LROLLOC=+X,LROLDIV=$P(X,"^",3)
 ;
 ; Check for inpatient location if no location
 I 'LROLLOC,$G(VAIP(5)) D
 . S LROLLOC=$$GET1^DIQ(42,+VAIP(5)_",",44,"I")
 . I 'LROLDIV S LROLDIV=$$GET1^DIQ(44,LROLLOC_",",3,"I")
 ;
 ; Check for outpatient appointments if no location
 I 'LROLLOC!('LRPRAC) D VASD^LRVRPOCU
 ;
 ; If no location then log error.
 I 'LROLLOC D  Q
 . S LRERR=$$CREATE^LA7LOG(107,1)
 . D SENDACK^LRVRPOCU
 ;
 ; If no in/outpatient provider then check for primary care provider
 I 'LRPRAC S LRPRAC=+$$OUTPTPR^SDUTL3(DFN,LRCDT)
 ;
 ; If no provider - none in message, no primary care and no provider on
 ; outpatient encounter then log error.
 I 'LRPRAC D  Q
 . S LRERR=$$CREATE^LA7LOG(110,1)
 . D SENDACK^LRVRPOCU
 ;
 ; If division in message does not match location's division then reject.
 ; Check if division not a VAMC and parent is a VAMC and division
 ;  matches parent - deal with multiple medical centers within an
 ;  integrated system.
 I LROLDIV D  Q:LRERR
 . N DIV,OK,LRX
 . S DIV=$$GET1^DIQ(44,LROLLOC_",",3,"I")
 . I LROLDIV=DIV Q
 . S X=$$NNT^XUAF4(DIV),OK=0
 . I $P(X,"^",3)'="VAMC" D  Q:OK
 . . S Y=$P($$PRNT^XUAF4($P(X,"^")),"^"),X=$$NNT^XUAF4(Y)
 . . I $P(X,"^",3)="VAMC",$P(Y,"^")=LROLDIV S OK=1
 . S LRX=$$NNT^XUAF4(LROLDIV)
 . S LRERR=$$CREATE^LA7LOG(112,1)
 . D SENDACK^LRVRPOCU
 ;
 ; Get location abbreviation
 S LRLLOC=$$GET1^DIQ(44,LROLLOC_",",1,"I")
 I LRLLOC="" S LRLLOC="NO ABRV "_LROLLOC
 Q
 ;
 ;
DATA(LRLL,LAIEN) ;Extract results into LROT(
 ;
 K LR642,LRDATA,LRERR,LRSPECX,LRCNT,LROSPEC,LROT,LRSAMP,LRSB,LRSPEC,LRTRAY,LRCUP,LRSQ,LRTS,LRX,LRY,LRZ
 S LRSQ=LAIEN,LRDATA=1,(LR642,LRCNT,LRERR)=0,(LRDAA,LRSAMP,LRSPEC)=""
 S LRLL(0)=^LRO(68.2,LRLL,0)
 S LROSPEC=$P($G(^LAH(LRLL,1,LAIEN,.1,"OBR","ORDSPEC")),"^")
 I LROSPEC="" D  Q
 . S LRERR=$$CREATE^LA7LOG(114,1)
 . D SENDACK^LRVRPOCU
 S LRX=$G(^LAH(LRLL,1,LAIEN,.1,"OBR","ORDNLT"))
 ;
 ; Change division to ordering division
 S LRDUZ(2)=$S(LROLDIV:LROLDIV,1:LRDIV)
 I LRDUZ(2)'=DUZ(2) D  Q:LRERR
 . N LA7X,LRY
 . S LRY=0
 . D DIVSET^XUSRB2(.LRY,"`"_LRDUZ(2))
 . I LRY Q
 . S LA7X="Unable to set user 'LRLAB,POC' to division "_$$GET1^DIQ(4,LRDUZ(2)_",",.01)
 . S LRERR=$$CREATE^LA7LOG(37,1)
 ;
 ; Ordering based on NLT codes from loadlist profile and OBR segment
 F I=1:1:$L(LRX,"^") S LRY=$P(LRX,"^",I) Q:LRY=""  D  Q:LRERR
 . I '$D(LRORDNLT(LRY,LROSPEC)) S LRERR=$$CREATE^LA7LOG(120,1) Q
 . S LRZ=LRORDNLT(LRY,LROSPEC)
 . S LRTST=$P(LRZ,"^"),LRSPEC=$P(LRZ,"^",2),LRSAMP=$P(LRZ,"^",3)
 . I '$D(^TMP("LR",$J,"VTO",LRTST)) S LRERR=$$CREATE^LA7LOG(118,1) Q
 . I 'LRSPEC S LRERR=$$CREATE^LA7LOG(114,1) Q
 . I 'LRSAMP S LRERR=$$CREATE^LA7LOG(115,1) Q
 . S LRCNT=LRCNT+1,LROT(LRSAMP,LRSPEC,LRCNT)=LRTST
 . I $P(LRZ,"^",4) S LR642=$P(LRZ,"^",4)
 . I 'LRDAA,LROLDIV,$D(^LAB(60,LRTST,8,LROLDIV,0)) S LRDAA=$P(^(0),U,2)
 I LRERR D SENDACK^LRVRPOCU Q
 I LRDAA<1 S LRDAA=$P(^LRO(68.2,LRLL,10,LRPROF,0),"^",2)
 ;
 ; Check for results to process
 I '$O(LROT(0)) D  Q
 . S LRERR=$$CREATE^LA7LOG(113,1)
 . D SENDACK^LRVRPOCU
 ;
 ; Setup workload suffix
 I LR642<1 S LR642=LRDFWKLD
 D WKLD^LRVRPOCU(LR642)
 ;
 ; Check if results have datanames/tests on this profile.
 F  S LRDATA=$O(^LAH(LRLL,1,LAIEN,LRDATA)) Q:LRDATA<1  D  Q:LRERR
 . I $P($G(^LAH(LRLL,1,LAIEN,LRDATA)),U)="" Q
 . S LRDATA(LRDATA)=^LAH(LRLL,1,LAIEN,LRDATA)
 . I $P(LRDATA(LRDATA),"^",4)<1 S LRERR=$$CREATE^LA7LOG(111,1) Q
 . S LRTST=+$G(LRVTS(LRDATA))
 . I 'LRTST S LRERR=$$CREATE^LA7LOG(116,1) Q
 . I '$D(^TMP("LR",$J,"VTO",LRTST)) S LRERR=$$CREATE^LA7LOG(118,1) Q
 I LRERR D SENDACK^LRVRPOCU Q
 ;
 K LRCOM
 S LRNT=$$NOW^XLFDT,LRORDTIM=""
 ;
 ; Setup the order in LRO(69
 S LRNOLABL="" ; Suppress label printing
 D
 . N LRSPEC,LRSAMP,ZTQUEUED
 . S ZTQUEUED=1
 . D ORDER^LROW2,^LRORDST
 ;
 ; Setup LRO(68
 D
 . N LRSPEC,LRSAMP
 . D ^LRWLST
 I '$G(LRAA) D  Q
 . S LRERR=$$CREATE^LA7LOG(109,1)
 . D SENDACK^LRVRPOCU
 ;
 S LRMETH="POC DEVICE"
 I LA76248 S LRMETH=$E($$GET1^DIQ(62.48,LA76248_",",.01),1,10)
 I LRMETH="" S LRMETH=$E($P(LRLL(0),U),1,5)_"(POC)"
 ;
 ; Store POC specimen id in file #63 as ordering site UID.
 S X=$G(^LAH(LRLL,1,LAIEN,.1,"OBR","FID"))
 I $P(X,"^")'="" D
 . N FDA,LA7DIE
 . S FDA(1,63.04,LRIDT_","_LRDFN_",",.342)=$P(X,"^")
 . I $P(X,"^",2) S FDA(1,63.04,LRIDT_","_LRDFN_",",.32)=$P(X,"^",2)
 . D FILE^DIE("","FDA(1)","LA7DIE(1)")
 ;
 ; Store ^LR( data [results]
 S LRVF=0,LRALERT=LROUTINE,LRUSI="POC.5"
 M LRSB=LRDATA
 D TEST^LRVR1
 S LRSB=0
 F  S LRSB=$O(LRSB(LRSB)) Q:LRSB<1  D  Q:LRERR
 . I '$G(^TMP("LR",$J,"TMP",LRSB,"P")) S LRERR=$$CREATE^LA7LOG(117,1) Q
 . S LRX=$$TMPSB^LRVER1(LRSB),LRY=$P(LRSB(LRSB),U,3)
 . F I=1:1:$L(LRX,"!") I $P(LRY,"!",I)="" S $P(LRY,"!",I)=$P(LRX,"!",I)
 . S $P(LRSB(LRSB),U,3)=LRY
 . S LRTS=$G(^TMP("LR",$J,"TMP",LRSB))
 . D V25^LRVER5
 . S LRX=LRNGS,LRY=$P(LRSB(LRSB),U,5)
 . F I=1:1:$L(LRX,U) I $P(LRY,"!",I)="" S $P(LRY,"!",I)=$P(LRX,U,I)
 . S $P(LRSB(LRSB),U,5)=LRY
 . I $P(LRSB(LRSB),U,9)="" S $P(LRSB(LRSB),U,9)=$S($G(LRDUZ(2)):LRDUZ(2),1:$G(DUZ(2)))
 . S ^LR(LRDFN,"CH",LRIDT,LRSB)=LRSB(LRSB)
 ;
 I LRERR D SENDACK^LRVRPOCU Q
 ;
 ; Call to set data and comments
 I $O(LRSB(0)) D
 . D LRSBCOM^LRVR4,A3^LRVR3
 . S LRSTORE=LRSTORE+1
 . I $G(LA76248) S LRSTORE(LA76248)=$G(LRSTORE(LA76248))+1
 ;
 ; Send application ack back to POC interface
 D SENDACK^LRVRPOCU
 Q