| 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 | 
|---|