| 1 | ORRCACK ;SLC/MKB - Result Acknowledgement file utilities ; 25 Jul 2003  9:31 AM | 
|---|
| 2 | ;;1.0;CARE MANAGEMENT;;Jul 15, 2003 | 
|---|
| 3 | ; | 
|---|
| 4 | ; ID = "ORR:"_order# everywhere below | 
|---|
| 5 | ; | 
|---|
| 6 | PARAM(PROV) ; -- Return ORRC ACTIVATION DATE parameter for PROV | 
|---|
| 7 | N SERV,Y S PROV=+$G(PROV),SERV=+$G(^VA(200,PROV,5)) | 
|---|
| 8 | S Y=$$GET^XPAR("ALL^USR.`"_PROV_"^SRV.`"_SERV,"ORRC ACTIVATION DATE") | 
|---|
| 9 | Q Y | 
|---|
| 10 | ; | 
|---|
| 11 | ADD(ORDER,PROV,ACK) ; -- Create new entry in file #102.4 when results are posted | 
|---|
| 12 | ;  [called from HL7 messages: ORMLR, ORMRA, ORMGMRC] | 
|---|
| 13 | Q:'$G(ORDER)  N X,Y,DIC,DO,STOP | 
|---|
| 14 | I '$G(ACK),+$G(PROV) D  Q:$G(STOP) | 
|---|
| 15 | . I $D(^ORA(102.4,"ACK",PROV,+$G(ORDER))) S STOP=1 Q  ;exists | 
|---|
| 16 | . N ACTDT S ACTDT=$$PARAM(PROV) | 
|---|
| 17 | . I (ACTDT<1)!(ACTDT>DT) S STOP=1 Q  ;not [yet] active | 
|---|
| 18 | S DIC="^ORA(102.4,",DIC(0)="" S:$G(PROV) DIC("DR")="2////"_+PROV | 
|---|
| 19 | S X=+ORDER D FILE^DICN | 
|---|
| 20 | Q | 
|---|
| 21 | ; | 
|---|
| 22 | ACK(ORY,ORUSR,ORDER) ; -- Acknowledge results of ORDERs by ORUSR | 
|---|
| 23 | ; where ORDER(#) = ID ^ 1 or 0, if acknowledged | 
|---|
| 24 | ; Returns ORY(#) = ID ^ 1 or 0, if successful | 
|---|
| 25 | ; RPC = ORRC RESULTS ACKNOWLEDGE | 
|---|
| 26 | Q:'$G(ORUSR)  N X,Y,DA,DR,DIE,ORI,ORIFN,ORACK,ORXQ | 
|---|
| 27 | S DIE="^ORA(102.4,",ORUSR=+$G(ORUSR) | 
|---|
| 28 | S ORI="" F  S ORI=$O(ORDER(ORI)) Q:ORI=""  D | 
|---|
| 29 | . S X=ORDER(ORI),ORIFN=$P(X,U),ORACK=+$P(X,U,2) | 
|---|
| 30 | . S ORY(ORI)=ORIFN_"^0",ORIFN=+$P(ORIFN,":",2) Q:ORIFN<1 | 
|---|
| 31 | . I '$D(^ORA(102.4,"ACK",+ORUSR,+ORIFN)) D ADD(ORIFN,ORUSR,1) | 
|---|
| 32 | . S DA=+$O(^ORA(102.4,"ACK",+ORUSR,+ORIFN,0)) Q:DA<1 | 
|---|
| 33 | . S DR="3///"_$S(ORACK:"NOW",1:"@") D ^DIE | 
|---|
| 34 | . S $P(ORY(ORI),U,2)=1,ORXQ(+ORIFN)="" | 
|---|
| 35 | D:$D(ORXQ) RSLT^ORRCXQ(.ORXQ,ORUSR) | 
|---|
| 36 | Q | 
|---|
| 37 | ; | 
|---|
| 38 | DEL(DA) ; -- Delete old acknowledgment stub | 
|---|
| 39 | N DIK S DIK="^ORA(102.4," | 
|---|
| 40 | I $G(DA),'$P($G(^ORA(102.4,DA,0)),U,3) D ^DIK | 
|---|
| 41 | Q | 
|---|
| 42 | ; | 
|---|
| 43 | PATS(ORY,ORUSR) ; -- Return list of patients for whom ORUSR has unack'd results | 
|---|
| 44 | ; in @ORY@(PAT) = #orders ^ 1 if any are abnormal | 
|---|
| 45 | ;    @ORY@(PAT,ID) = * if abnormal, else null | 
|---|
| 46 | ; [from ORRCDPT] | 
|---|
| 47 | N ORIFN,PAT,ABN,X,CNT,ACTDT,RDT,ACK | 
|---|
| 48 | S ORUSR=+$G(ORUSR),ACTDT=$$PARAM(ORUSR) | 
|---|
| 49 | S ORY=$NA(^TMP($J,"ORRCRSLT")) K @ORY,^TMP($J,"ORSLT") | 
|---|
| 50 | S ORIFN=0 F  S ORIFN=+$O(^ORA(102.4,"ACK",ORUSR,ORIFN)) Q:ORIFN<1  D | 
|---|
| 51 | . Q:+$P($G(^OR(100,ORIFN,3)),U,3)=9  ;partial results | 
|---|
| 52 | . S PAT=+$P($G(^OR(100,ORIFN,0)),U,2),RDT=+$G(^(7)),ABN=$P($G(^(7)),U,2) | 
|---|
| 53 | . I $D(^TMP($J,"ORRCLST")),'$D(^TMP($J,"ORRCY",PAT)) Q  ;pt not on list | 
|---|
| 54 | . I 'ACTDT!(RDT<ACTDT) S ACK=+$O(^ORA(102.4,"ACK",ORUSR,ORIFN,0)) D DEL(ACK) Q  ;remove old stub | 
|---|
| 55 | . S X=$G(ORY(PAT)),CNT=+X | 
|---|
| 56 | . S CNT=CNT+1,@ORY@(PAT)=CNT_$S(ABN!$P(X,U,2):"^1",1:"") | 
|---|
| 57 | . S @ORY@(PAT,"ORR:"_ORIFN)=$S(ABN:"*",1:"") | 
|---|
| 58 | . D ORSLT ;temp xref for PATS^ORRCEVT | 
|---|
| 59 | Q | 
|---|
| 60 | ; | 
|---|
| 61 | ORSLT ; -- Add ORIFN to ^TMP($J,"ORSLT",PAT,pkgid) for use by Events | 
|---|
| 62 | N OR0,OR4,NMSP,X | 
|---|
| 63 | S OR0=$G(^OR(100,+ORIFN,0)),OR4=$G(^(4)),X="" | 
|---|
| 64 | S NMSP=$$NMSP^ORCD($P(OR0,U,14)) I NMSP="RA" D  Q | 
|---|
| 65 | . N IDX S IDX="^RADPT(""AO"",+OR4,PAT)" | 
|---|
| 66 | . F  S IDX=$Q(@IDX) Q:$P(IDX,",",2)'=+OR4  Q:$P(IDX,",",3)'=PAT  S X=$P(IDX,",",4)_"~"_$P(IDX,",",5),^TMP($J,"ORSLT",PAT,X)=+ORIFN | 
|---|
| 67 | I NMSP="LR" S X=+ORIFN_"@OR" | 
|---|
| 68 | I NMSP="GMRC" S X=+OR4 | 
|---|
| 69 | S:$L(X) ^TMP($J,"ORSLT",PAT,X)=+ORIFN | 
|---|
| 70 | Q | 
|---|
| 71 | ; | 
|---|
| 72 | IDS(ORY,ORPAT,ORUSR,SDATE,EDATE) ; -- Return new results for ORPAT | 
|---|
| 73 | ; between ORBEG & OREND that ORUSR has not acknowledged | 
|---|
| 74 | ; in @ORY@(ORPAT) = #orders ^ 1 if any are abnormal | 
|---|
| 75 | ;    @ORY@(ORPAT,ID) = * if abnormal, else null | 
|---|
| 76 | ; [from ORRCDPT1] | 
|---|
| 77 | N CNT,ORIFN,ORDT,ABN,X | 
|---|
| 78 | S ORY=$NA(^TMP($J,"ORRCRSLT")) K @ORY | 
|---|
| 79 | S ORUSR=+$G(ORUSR),ORPAT=+$G(ORPAT)_";DPT(",CNT=0 | 
|---|
| 80 | S SDATE=$G(SDATE),EDATE=$G(EDATE) D DT1 ;defaults ?? | 
|---|
| 81 | S ORDT=SDATE F  S ORDT=$O(^OR(100,"ARS",ORPAT,ORDT)) Q:ORDT<1  Q:ORDT>EDATE  D | 
|---|
| 82 | . S ORIFN=0 F  S ORIFN=+$O(^OR(100,"ARS",ORPAT,ORDT,ORIFN)) Q:ORIFN<1  D | 
|---|
| 83 | .. Q:+$P($G(^OR(100,ORIFN,3)),U,3)=9  ;partial results | 
|---|
| 84 | .. Q:$$ACKD(ORIFN,ORUSR)  S CNT=CNT+1,X=$P($G(^OR(100,ORIFN,7)),U,2) | 
|---|
| 85 | .. S @ORY@(+ORPAT,"ORR:"_ORIFN)=$S(X:"*",1:"") S:X ABN=1 | 
|---|
| 86 | S:CNT @ORY@(+ORPAT)=CNT_U_$G(ABN) | 
|---|
| 87 | Q | 
|---|
| 88 | ; | 
|---|
| 89 | LIST(ORY,ORUSR,ORPAT,ORSLT) ; -- Return orders by ORUSR for ORPAT with new results | 
|---|
| 90 | ; in @ORY@(#) = Item=ID^Text^ResultDate in HL7 format, and also if ORSLT | 
|---|
| 91 | ;             = Data=Test^Value^Units^ReferenceRange^CriticalFlag | 
|---|
| 92 | ;             = Cmnt=result comment | 
|---|
| 93 | ;            or Text=line of report text | 
|---|
| 94 | ; RPC = ORRC RESULTS BY PATIENT | 
|---|
| 95 | N ORN,ORIFN,ORTX,ORDT | 
|---|
| 96 | S ORY=$NA(^TMP($J,"ORRCRSLT")) K @ORY | 
|---|
| 97 | S ORUSR=+$G(ORUSR),ORPAT=+$G(ORPAT),ORN=0 | 
|---|
| 98 | S ORIFN=0 F  S ORIFN=+$O(^ORA(102.4,"ACK",ORUSR,ORIFN)) Q:ORIFN<1  I +$P($G(^OR(100,ORIFN,0)),U,2)=ORPAT D | 
|---|
| 99 | . Q:+$P($G(^OR(100,ORIFN,3)),U,3)=9  ;partial results | 
|---|
| 100 | . D TEXT^ORQ12(.ORTX,ORIFN) S ORDT=+$G(^OR(100,ORIFN,7)) | 
|---|
| 101 | . S ORN=ORN+1,@ORY@(ORN)="Item=ORR:"_ORIFN_U_ORTX(1)_U_$$FMTHL7^XLFDT(ORDT) | 
|---|
| 102 | . I $G(ORSLT) D ORD ;add results data to ORY(#) | 
|---|
| 103 | ;S ORY(0)=CNT | 
|---|
| 104 | Q | 
|---|
| 105 | ; | 
|---|
| 106 | LISTD(ORY,ORPAT,ORUSR,ORBEG,OREND,ORSLT) ; -- Return new results for ORPAT | 
|---|
| 107 | ; between ORBEG & OREND that ORUSR has not acknowledged | 
|---|
| 108 | ; in @ORY@(#) = Item=ID^Text^ResultDate in HL7 format, and also if ORSLT | 
|---|
| 109 | ;             = Data=Test^Value^Units^ReferenceRange^CriticalFlag | 
|---|
| 110 | ;             = Cmnt=result comment | 
|---|
| 111 | ;            or Text=line of report text | 
|---|
| 112 | ; RPC = ORRC RESULTS BY DATE | 
|---|
| 113 | N ORN,ORIFN,ORTX,ORDT,SDATE,EDATE | 
|---|
| 114 | S ORY=$NA(^TMP($J,"ORRCRSLT")) K @ORY | 
|---|
| 115 | S ORUSR=+$G(ORUSR),ORPAT=+$G(ORPAT)_";DPT(",ORN=0 D DATES | 
|---|
| 116 | S ORDT=SDATE F  S ORDT=$O(^OR(100,"ARS",ORPAT,ORDT)) Q:ORDT<1  Q:ORDT>EDATE  D | 
|---|
| 117 | . S ORIFN=0 F  S ORIFN=+$O(^OR(100,"ARS",ORPAT,ORDT,ORIFN)) Q:ORIFN<1  D | 
|---|
| 118 | .. Q:+$P($G(^OR(100,ORIFN,3)),U,3)=9  ;partial results | 
|---|
| 119 | .. Q:$$ACKD(ORIFN,ORUSR)  D TEXT^ORQ12(.ORTX,ORIFN) | 
|---|
| 120 | .. S ORN=ORN+1,@ORY@(ORN)="Item=ORR:"_ORIFN_U_ORTX(1)_U_$$FMTHL7^XLFDT(ORDT) | 
|---|
| 121 | .. I $G(ORSLT) D ORD ;add results data to ORY(#) | 
|---|
| 122 | Q | 
|---|
| 123 | ; | 
|---|
| 124 | DATES ; -- Return SDATE and EDATE from ORBEG and OREND | 
|---|
| 125 | ;    [Inverted for rev-chron search] | 
|---|
| 126 | S SDATE=$$HL7TFM^XLFDT($G(ORBEG)),EDATE=$$HL7TFM^XLFDT($G(OREND)) | 
|---|
| 127 | DT1 I EDATE S EDATE=$S($L(EDATE,".")=2:EDATE+.0001,1:EDATE+1) | 
|---|
| 128 | I SDATE S SDATE=$S($L(SDATE,".")=2:SDATE-.0001,1:SDATE) | 
|---|
| 129 | S SDATE=9999999-$S(SDATE:SDATE,1:0),EDATE=9999999-$S(EDATE:EDATE,1:9999998) | 
|---|
| 130 | S X=EDATE,EDATE=SDATE,SDATE=X | 
|---|
| 131 | Q | 
|---|
| 132 | ; | 
|---|
| 133 | ACKD(ORDER,USER) ; -- Returns 1 or 0, if USER has acknowledged ORDER | 
|---|
| 134 | N Y S Y=0 | 
|---|
| 135 | S IFN=0 F  S IFN=$O(^ORA(102.4,"B",+$G(ORDER),IFN)) Q:IFN<1  D  Q:Y | 
|---|
| 136 | . S X=$G(^ORA(102.4,IFN,0)) I $P(X,U,3),$P(X,U,2)=+$G(USER) S Y=1 Q | 
|---|
| 137 | Q Y | 
|---|
| 138 | ; | 
|---|
| 139 | RESULT(ORY,ORDER) ; -- Return results of ORDERs | 
|---|
| 140 | ; where ORDER(#) = ID | 
|---|
| 141 | ; in @ORY@(#) = Item=ID^Text^ResultDate in HL7 format, and | 
|---|
| 142 | ;             = Data=Test^Value^Units^ReferenceRange^CriticalFlag | 
|---|
| 143 | ;             = Cmnt=result comment | 
|---|
| 144 | ;            or Text=line of report text | 
|---|
| 145 | ; RPC = ORRC RESULTS BY ID | 
|---|
| 146 | N ORN,ORI,ORIFN,ORDT,ORTX | 
|---|
| 147 | S ORN=0,ORY=$NA(^TMP($J,"ORRCRSLT")) K @ORY | 
|---|
| 148 | S ORI="" F  S ORI=$O(ORDER(ORI)) Q:ORI=""  S ORIFN=ORDER(ORI) D | 
|---|
| 149 | . S ORIFN=+$P(ORIFN,":",2),ORDT=+$G(^OR(100,ORIFN,7)) | 
|---|
| 150 | . D TEXT^ORQ12(.ORTX,ORIFN) | 
|---|
| 151 | . S ORN=ORN+1,@ORY@(ORN)="Item=ORR:"_ORIFN_U_ORTX(1)_U_$$FMTHL7^XLFDT(ORDT) | 
|---|
| 152 | . D ORD | 
|---|
| 153 | Q | 
|---|
| 154 | ; | 
|---|
| 155 | ORD ; -- Add results for ORIFN to @ORY@(ORN) | 
|---|
| 156 | N PKG Q:'+$G(ORIFN) | 
|---|
| 157 | S PKG=+$P($G(^OR(100,ORIFN,0)),U,14),PKG=$$NMSP^ORCD(PKG) | 
|---|
| 158 | I "^LR^RA^GMRC^"'[(U_PKG_U)!'ORIFN S ORY(1)="Text=No results available." Q  ;DT?? | 
|---|
| 159 | D @PKG | 
|---|
| 160 | Q | 
|---|
| 161 | LR ; -- Lab results | 
|---|
| 162 | N ORVP,LRID,LRTST,LRSUB,I,X K ^TMP("LRRR",$J) | 
|---|
| 163 | S ORVP=$P($G(^OR(100,ORIFN,0)),U,2),LRID=$G(^(4)) | 
|---|
| 164 | I '$L(LRID) S ORN=ORN+1,@ORY@(ORN)="Text=No results available." Q | 
|---|
| 165 | S X=$$VALUE^ORCSAVE2(ORIFN,"ORDERABLE"),LRTST=+$P($G(^ORD(101.43,+X,0)),U,2) | 
|---|
| 166 | I +LRID  D RR^LR7OR1(+ORVP,LRID,,,,LRTST) I '$D(^TMP("LRRR",$J,+ORVP)) S $P(LRID,";",1,3)=";;" ;Order possibly purged, reset to lookup on file 63 | 
|---|
| 167 | I '+LRID,$P(LRID,";",5)  D RR^LR7OR1(+ORVP,,9999999-$P(LRID,";",5),9999999-$P(LRID,";",5),$P(LRID,";",4),LRTST) | 
|---|
| 168 | I '$D(^TMP("LRRR",$J,+ORVP)) S ORN=ORN+1,@ORY@(ORN)="Text=No results available." Q | 
|---|
| 169 | S LRSUB=$O(^TMP("LRRR",$J,+ORVP,"")) Q:LRSUB="" | 
|---|
| 170 | S LRDT=$O(^TMP("LRRR",$J,+ORVP,LRSUB,0)) I LRDT S LRDT=9999999-LRDT,$P(@ORY@(ORN),U,3)=$$FMTHL7^XLFDT(LRDT) ;return Coll Dt instead of Results Dt | 
|---|
| 171 | I LRSUB="CH" D  K ^TMP("LRRR",$J) Q | 
|---|
| 172 | . N TEST,LRDT,LRN,LRI M TEST=^TMP("LRRR",$J,+ORVP,"CH") | 
|---|
| 173 | . S LRDT=0 F  S LRDT=$O(TEST(LRDT)) Q:LRDT<1  S LRN=0 F  S LRN=$O(TEST(LRDT,LRN)) Q:LRN=""  D | 
|---|
| 174 | .. I LRN S I=$G(TEST(LRDT,LRN)),X=$P($G(^LAB(60,+I,0)),U)_U_$P(I,U,2)_U_$P(I,U,4,5)_U_$P(I,U,3) S ORN=ORN+1,@ORY@(ORN)="Data="_X | 
|---|
| 175 | .. I LRN="N" S LRI=0 F  S LRI=$O(TEST(LRDT,LRN,LRI)) Q:LRI<1  S ORN=ORN+1,@ORY@(ORN)="Cmnt="_$G(TEST(LRDT,LRN,LRI)) | 
|---|
| 176 | K ^TMP("LRC",$J) D EN1^LR7OSBR(+ORVP):LRSUB="BB",EN^LR7OSMZ0(+ORVP):LRSUB="MI" | 
|---|
| 177 | S I=0 F  S I=+$O(^TMP("LRC",$J,I)) Q:I<1  S X=$G(^(I,0)),ORN=ORN+1,@ORY@(ORN)="Text="_X | 
|---|
| 178 | K ^TMP("LRC",$J),^TMP("LRRR",$J) | 
|---|
| 179 | Q | 
|---|
| 180 | RA ; -- Radiology results | 
|---|
| 181 | N ORVP,RAID,CASE,PROC,PSET,FIRST | 
|---|
| 182 | S ORVP=$P($G(^OR(100,ORIFN,0)),U,2),RAID=+$G(^(4)) D EN30^RAO7PC3(RAID) | 
|---|
| 183 | S PSET=$D(^TMP($J,"RAE3",+ORVP,"PRINT_SET")),FIRST=1 | 
|---|
| 184 | I 'PSET S CASE=0 F  S CASE=$O(^TMP($J,"RAE3",+ORVP,CASE)) Q:CASE'>0  D | 
|---|
| 185 | . S PROC="" F  S PROC=$O(^TMP($J,"RAE3",+ORVP,CASE,PROC)) Q:PROC=""  D XRPT | 
|---|
| 186 | I PSET S CASE=$O(^TMP($J,"RAE3",+ORVP,0)),PROC=$O(^(CASE,"")) D XRPT | 
|---|
| 187 | K ^TMP($J,"RAE3",+ORVP) | 
|---|
| 188 | Q | 
|---|
| 189 | XRPT ; -- body of report for CASE, PROC | 
|---|
| 190 | N ORD,X,I | 
|---|
| 191 | I 'FIRST S ORN=ORN+1,@ORY@(ORN)="Text="_$$REPEAT^XLFSTR(" * ",24) | 
|---|
| 192 | S ORD=$S($L($G(^TMP($J,"RAE3",+ORVP,"ORD"))):^("ORD"),$L($G(^("ORD",CASE))):^(CASE),1:"") I $L(ORD),ORD'=PROC S ORN=ORN+1,@ORY@(ORN)="Text=Proc Ord: "_ORD | 
|---|
| 193 | S I=1 F  S I=$O(^TMP($J,"RAE3",+ORVP,CASE,PROC,I)) Q:I'>0  S X=^(I),ORN=ORN+1,@ORY@(ORN)="Text="_X ;Skip pt ID on line 1 | 
|---|
| 194 | S FIRST=0 | 
|---|
| 195 | Q | 
|---|
| 196 | GMRC ; -- Consult results | 
|---|
| 197 | N GMRCID,I,X,SUB S GMRCID=+$G(^OR(100,ORIFN,4)),SUB="RT" N ORIFN ;protect | 
|---|
| 198 | I '$D(^GMR(123,GMRCID,50,"B")),'$D(^GMR(123,GMRCID,51,"B")) S SUB="DT" | 
|---|
| 199 | D RT^GMRCGUIA(GMRCID,"^TMP(""GMRCR"",$J,""RT"")"):SUB="RT",DT^GMRCSLM2(GMRCID):SUB="DT" | 
|---|
| 200 | S I=0 F  S I=$O(^TMP("GMRCR",$J,SUB,I)) Q:I'>0  S X=$G(^(I,0)),ORN=ORN+1,@ORY@(ORN)="Text="_X | 
|---|
| 201 | K ^TMP("GMRCR",$J) | 
|---|
| 202 | Q | 
|---|