| 1 | LR7OF5 ;slc/dcm - Setup new order from OE/RR ;2/4/99  06:42
 | 
|---|
| 2 |  ;;5.2;LAB SERVICE;**223,221,256**;Sep 27, 1994
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;This routine invokes IA #2060, #2835, #2747
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | ORES(LRDFN,SDT,TYPE,SAMP,PROV,LOC,SPEC,ENTERBY)  ;Look for match on orders already processed for this session
 | 
|---|
| 7 |  ;SDT=Requested Date time of collection
 | 
|---|
| 8 |  ;TYPE=Collection type
 | 
|---|
| 9 |  Q:'$D(TYPE) "" Q:'$G(SDT) ""
 | 
|---|
| 10 |  N EX,REF,X,STRT,ORI,END
 | 
|---|
| 11 |  S (X,REF)="",(END,STRT)=0
 | 
|---|
| 12 |  F  S STRT=$O(^TMP("OR",$J,"LRES",LRDFN,STRT)) Q:'STRT  I $D(^(STRT,TYPE)) S ORI=0 D  Q:END
 | 
|---|
| 13 |  . F  S ORI=$O(^TMP("OR",$J,"LRES",LRDFN,STRT,TYPE,ORI)) Q:'ORI  S REF=^(ORI) D  Q:END
 | 
|---|
| 14 |  .. I $$ABS^XLFMTH($$FMDIFF^XLFDT(SDT,STRT,2))>600 S REF="" Q
 | 
|---|
| 15 |  .. I REF D  Q
 | 
|---|
| 16 |  ... I $$INDAIR(LRDFN,+REF) S REF="" Q
 | 
|---|
| 17 |  ... S X=$$REF(LRDFN,$P(REF,"^",2),$P(REF,"^",3)),END=1
 | 
|---|
| 18 |  I 'REF Q ""
 | 
|---|
| 19 |  I '$L(X) S X="O."_+REF
 | 
|---|
| 20 |  Q X
 | 
|---|
| 21 | FIND(PAT,ODT,SDT,TYPE,SAMP,PROV,LOC,SPEC,ENTERBY) ;Look for match on patient, time, type, specimen, provider
 | 
|---|
| 22 |  ;PAT=LRDFN
 | 
|---|
| 23 |  ;ODT=LRODT
 | 
|---|
| 24 |  ;TYPE=COLLECTION TYPE
 | 
|---|
| 25 |  ;SDT=EST. DATE/TIME OF COLLECTION
 | 
|---|
| 26 |  ;SAMP=COLLECTION SAMPLE
 | 
|---|
| 27 |  ;PROV=PROVIDER
 | 
|---|
| 28 |  ;LOC=LRLLOC (LOCATION)
 | 
|---|
| 29 |  ;SPEC=SPECIMEN
 | 
|---|
| 30 |  Q:'$D(^LRO(69,"D",PAT,ODT)) ""
 | 
|---|
| 31 |  N EX,IFN,X,X0,X1,X4,Y,XORD
 | 
|---|
| 32 |  S IFN=9999999999,X=""
 | 
|---|
| 33 |  F  S IFN=$O(^LRO(69,"D",PAT,ODT,IFN),-1) Q:IFN<1  D  Q:$L(X)
 | 
|---|
| 34 |  . Q:+$G(^LRO(69,ODT,1,IFN,0))'=PAT  ;double check for patient match
 | 
|---|
| 35 |  . Q:$P($G(^LRO(69,ODT,1,IFN,3)),"^")  ;cannot add to 'collected' orders
 | 
|---|
| 36 |  . Q:$$ORD(ODT,IFN)  ;cannot add if any part of order's collected
 | 
|---|
| 37 |  . Q:$L($P($G(^LRO(69,ODT,1,IFN,1)),"^",7))  ;don't add to a combined order
 | 
|---|
| 38 |  . Q:'$D(^LRO(69,ODT,1,IFN,0))  S X0=^(0),X1=$G(^(.1))
 | 
|---|
| 39 |  . Q:$P(X0,"^",4)'=TYPE
 | 
|---|
| 40 |  . ;'LC' collection types must have same collection times
 | 
|---|
| 41 |  . I TYPE="LC",$P(X0,"^",8)'=SDT Q
 | 
|---|
| 42 |  . I TYPE'="LC",$P(X0,"^",8),SDT,$$ABS^XLFMTH($$FMDIFF^XLFDT(SDT,$P(X0,"^",8),2))>600 Q  ;don't combine if time difference is >10 min
 | 
|---|
| 43 |  . L +^LRO(69,"C",+X1):0
 | 
|---|
| 44 |  . I '$T Q
 | 
|---|
| 45 |  . L -^LRO(69,"C",+X1)
 | 
|---|
| 46 |  . I '$$GOT^LROE(+X1,ODT) Q  ;Don't combine on canceled order
 | 
|---|
| 47 |  . I $$INDAIR(PAT,+X1,1) S X=" " Q  ;Don't combine if duplicate test.
 | 
|---|
| 48 |  . S X=$$REF(PAT,ODT,IFN)
 | 
|---|
| 49 |  . S XORD=$S($L(X):"",1:+X1)
 | 
|---|
| 50 |  S:$G(XORD) X="O."_XORD
 | 
|---|
| 51 |  S:X=" " X=""
 | 
|---|
| 52 |  Q X
 | 
|---|
| 53 | REF(LRDFN,ODT,IFN)    ;Setup codes used for combining
 | 
|---|
| 54 |  ;Returns "" if no match found or:
 | 
|---|
| 55 |  ;   O.LRORD=Order # to combine with
 | 
|---|
| 56 |  ;   S.LRSN.LRORD=Specimen number to combine with
 | 
|---|
| 57 |  ;   C.LRSN.LRORD=Creates new LRSN under this order number so that unique data is retained (ENTERBY,PROVIDER,LOC,SPEC)
 | 
|---|
| 58 |  N X0,X1,X4,LRORD,LRODT,LRSN,LRCODE,GOT
 | 
|---|
| 59 |  Q:'$D(^LRO(69,+$G(ODT),1,+$G(IFN),.1)) 0 S LRORD=^(.1),(LRODT,GOT)=0,LRCODE=""
 | 
|---|
| 60 |  F  S LRODT=$O(^LRO(69,"C",LRORD,LRODT)) Q:'LRODT!GOT  S LRSN=0 F  S LRSN=$O(^LRO(69,"C",LRORD,LRODT,LRSN)) Q:'LRSN!GOT  D
 | 
|---|
| 61 |  . Q:'$D(^LRO(69,LRODT,1,LRSN,0))  S X0=^(0),X1=$G(^(.1))
 | 
|---|
| 62 |  . Q:+X0'=LRDFN  ;Patient check
 | 
|---|
| 63 |  . S X4=$G(^LRO(69,LRODT,1,LRSN,4,1,0))
 | 
|---|
| 64 |  . I $P(X0,"^",2)=ENTERBY,$P(X0,"^",3)=SAMP,$P(X0,"^",6)=PROV,$P(X0,"^",9)=LOC,X4=SPEC S LRCODE="S."_LRSN_"."_+X1,GOT=1 Q
 | 
|---|
| 65 |  . I $P(X0,"^",3)=SAMP,X4=SPEC S LRCODE="C."_LRSN_"."_+X1,GOT=1 Q
 | 
|---|
| 66 |  Q LRCODE
 | 
|---|
| 67 | ORD(ODT,SN) ;Check to see if any part of the order's been collected
 | 
|---|
| 68 |  N LRORD
 | 
|---|
| 69 |  Q:'$D(^LRO(69,+$G(ODT),1,+$G(SN),.1)) 0 S LRORD=^(.1)
 | 
|---|
| 70 |  N LRODT,LRSN,GOT
 | 
|---|
| 71 |  S LRODT=0
 | 
|---|
| 72 |  F  S LRODT=$O(^LRO(69,"C",LRORD,LRODT)) Q:'LRODT  S LRSN=0 F  S LRSN=$O(^LRO(69,"C",LRORD,LRODT,LRSN)) Q:'LRSN  D
 | 
|---|
| 73 |  . I $D(^LRO(69,LRODT,1,LRSN,3)) S GOT=1 Q
 | 
|---|
| 74 |  Q +$G(GOT)
 | 
|---|
| 75 | INDAIR(LRDFN,LRORD,CHK) ;Check for test duplication and tests that require their own order #
 | 
|---|
| 76 |  ;Function returns 0 if test allowed, 1 if not
 | 
|---|
| 77 |  ;CHK=1 if called from FIND, 0 if called from ORES (doesn't check ORES array)
 | 
|---|
| 78 |  Q:'$G(LRORD) 1
 | 
|---|
| 79 |  N UTS,X,X4,ODT,LRSN,TST,EX
 | 
|---|
| 80 |  S ODT=0,EX=0
 | 
|---|
| 81 |  F  S ODT=$O(^LRO(69,"C",LRORD,ODT)) Q:'ODT!(EX)  S LRSN=0 F  S LRSN=$O(^LRO(69,"C",LRORD,ODT,LRSN)) Q:'LRSN!(EX)  D
 | 
|---|
| 82 |  . I +$G(^LRO(69,LRODT,1,LRSN,0))'=LRDFN Q  ;Check for same patient
 | 
|---|
| 83 |  . S UTS=0 F  S UTS=$O(^TMP("OR",$J,"LROT",SDT,TYPE,SAMP,SPEC,UTS)) Q:'UTS  S X=^(UTS) D  Q:EX
 | 
|---|
| 84 |  .. S X4=$G(^LRO(69,LRODT,1,LRSN,4,1,0))
 | 
|---|
| 85 |  .. I X4=SPEC,$D(^LRO(69,ODT,1,LRSN,2,"B",+X)) S EX=1 Q  ;Duplicate test
 | 
|---|
| 86 |  .. I $P($G(^LAB(60,+X,0)),"^",20) S EX=1 Q  ;Combining not allowed
 | 
|---|
| 87 |  .. S TST=0 F  S TST=$O(^LRO(69,ODT,1,LRSN,2,"B",TST)) Q:'TST  D  Q:EX  ;Duplicate check for all tests
 | 
|---|
| 88 |  ... I $P($G(^LAB(60,TST,0)),"^",20) S EX=1 Q
 | 
|---|
| 89 |  ... N EXY
 | 
|---|
| 90 |  ... D EXPAND^LR7OU1(TST,.EXY)
 | 
|---|
| 91 |  ... S EXY=0 F  S EXY=$O(EX(EXY)) Q:'EXY  I $D(^LRO(69,ODT,1,LRSN,2,"B",EXY)) S EX=1 Q  ;Check panels for duplicate
 | 
|---|
| 92 |  ... Q:EX
 | 
|---|
| 93 |  ... I $G(CHK) S EX=$$ESTEST(TST,LRXZ,LRSDT)
 | 
|---|
| 94 |  Q EX
 | 
|---|
| 95 | ESTEST(TEST,TYPE,STARTDT)       ;Check ORES array for potential duplicates
 | 
|---|
| 96 |  Q:'$G(TEST) 0 Q:'$D(TYPE) 0 Q:'$G(STARTDT) 0
 | 
|---|
| 97 |  N IFN,ACT,LRI,ES,X
 | 
|---|
| 98 |  S ES=0,LRI=""
 | 
|---|
| 99 |  F  S LRI=$O(ORES(LRI)) Q:'LRI!(ES)  S IFN=+LRI,ACT=$P(LRI,";",2)  I $$VALUE^ORCSAVE2(IFN,"COLLECT")=TYPE D
 | 
|---|
| 100 |  . I +$P($G(^ORD(101.43,+$$VALUE^ORCSAVE2(IFN,"ORDERABLE"),0)),"^",2)'=TEST S ES=0 Q
 | 
|---|
| 101 |  . S X=$P($G(^OR(100,IFN,8,ACT,0)),"^")
 | 
|---|
| 102 |  . I X,$$ABS^XLFMTH($$FMDIFF^XLFDT(X,STARTDT,2))<600 S ES=1 Q
 | 
|---|
| 103 |  Q ES
 | 
|---|