| 1 | ORKLR2 ; slc/CLA - Order checking support proc for lab orders, part 2;2/13/97  10:01
 | 
|---|
| 2 |  ;;3.0;ORDER ENTRY/RESULTS REPORTING;;Dec 17, 1997
 | 
|---|
| 3 |  Q
 | 
|---|
| 4 | ORFREQ(ORKLR,OI,ORDFN,NEWORDT,SPECIMEN) ;lab order freq restrictions order check
 | 
|---|
| 5 |  N LRID,LFREQS,MAX,DAILY,MAXDT,EARLYDT,ORM,ORD,X1,X2
 | 
|---|
| 6 |  S EARLYDT=NEWORDT
 | 
|---|
| 7 |  ;get lab id from orderable item (OI):
 | 
|---|
| 8 |  S LRID=$P(^ORD(101.43,OI,0),U,2) I $L($G(LRID)) D
 | 
|---|
| 9 |  .S LFREQS=$$FREQS(+LRID,SPECIMEN),MAX=$P(LFREQS,U),DAILY=$P(LFREQS,U,2)
 | 
|---|
| 10 |  .;if max order freq exists, don't process for daily order max:
 | 
|---|
| 11 |  .I '$L($G(MAX)) S:$L($G(DAILY)) ORD(LRID_";"_SPECIMEN)=DAILY_"^0"
 | 
|---|
| 12 |  .I $L($G(MAX)) D
 | 
|---|
| 13 |  ..S X1=NEWORDT,X2="-"_MAX D C^%DTC Q:X<1  S MAXDT=X
 | 
|---|
| 14 |  ..I MAXDT<EARLYDT S EARLYDT=MAXDT ;find and keep earliest MAXDT
 | 
|---|
| 15 |  ..;
 | 
|---|
| 16 |  ..;The earliest max d/t is used because if the lab order has children,
 | 
|---|
| 17 |  ..;they  may have different (or no) maximum order freq values. By taking
 | 
|---|
| 18 |  ..;the earliest, we cover all values yet narrow the search range for the
 | 
|---|
| 19 |  ..;call into ORQ1.  In MAXFREQ2 the specific max d/ts stored in ORL are
 | 
|---|
| 20 |  ..;checked against the d/ts of orders returned by ORQ1. ORQ1 orders' d/t
 | 
|---|
| 21 |  ..;are checked to see if they fall between the max d/t of an equivalent
 | 
|---|
| 22 |  ..;parent or child lab test order stored in ORL and the d/t of the order
 | 
|---|
| 23 |  ..;being checked. 
 | 
|---|
| 24 |  ..;
 | 
|---|
| 25 |  ..S ORM(LRID_";"_SPECIMEN)=MAXDT
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  ;expand into child-level lab identifiers if children exist for this OI:
 | 
|---|
| 28 |  S LRID="" F  S LRID=$O(^ORD(101.43,OI,10,"AID",LRID)) Q:LRID=""  D
 | 
|---|
| 29 |  .S MAX="",DAILY="",LFREQS=""
 | 
|---|
| 30 |  .S LFREQS=$$FREQS(+LRID,SPECIMEN),MAX=$P(LFREQS,U),DAILY=$P(LFREQS,U,2)
 | 
|---|
| 31 |  .;if max order freq exists, don't process for daily order max:
 | 
|---|
| 32 |  .I '$L($G(MAX)),($L($G(DAILY))) S ORD(LRID_";"_SPECIMEN)=DAILY
 | 
|---|
| 33 |  .I $L($G(MAX)) D
 | 
|---|
| 34 |  ..S X1=NEWORDT,X2="-"_MAX D C^%DTC Q:X<1  S MAXDT=X
 | 
|---|
| 35 |  ..I MAXDT<EARLYDT S EARLYDT=MAXDT ;find and keep earliest MAXDT
 | 
|---|
| 36 |  ..S ORM(LRID_";"_SPECIMEN)=MAXDT
 | 
|---|
| 37 |  I $D(ORM) D MAXFREQ(.ORM,EARLYDT)
 | 
|---|
| 38 |  I $D(ORD) D DAILY(.ORD)
 | 
|---|
| 39 |  Q
 | 
|---|
| 40 | MAXFREQ(ORM,EARLYDT) ;check for maximum order frequency violation
 | 
|---|
| 41 |  N DGIEN,HOR,SEQ,X,ORIFN,ODT,ORIFNC
 | 
|---|
| 42 |  S HOR=0,SEQ=0
 | 
|---|
| 43 |  ;get all lab orders since earliest max order freq d/t:
 | 
|---|
| 44 |  S DGIEN=0,DGIEN=$O(^ORD(100.98,"B","LAB",DGIEN))
 | 
|---|
| 45 |  K ^TMP("ORR",$J)
 | 
|---|
| 46 |  D EN^ORQ1(ORDFN,DGIEN,1,"",EARLYDT,NEWORDT,1,0)
 | 
|---|
| 47 |  S HOR=$O(^TMP("ORR",$J,HOR)) Q:+HOR<1
 | 
|---|
| 48 |  F  S SEQ=$O(^TMP("ORR",$J,HOR,SEQ)) Q:+SEQ<1  D
 | 
|---|
| 49 |  .S X=^TMP("ORR",$J,HOR,SEQ),ORIFN=+$P(X,U),ODT=$P(X,U,4)
 | 
|---|
| 50 |  .;break into child orders if they exist:
 | 
|---|
| 51 |  .I $D(^OR(100,ORIFN,2,0)) D  ;child orders exist
 | 
|---|
| 52 |  ..S ORIFNC=0 F  S ORIFNC=$O(^OR(100,ORIFN,2,ORIFNC)) Q:ORIFNC=""  D
 | 
|---|
| 53 |  ...D MAXFREQ2(ORIFNC,ODT,.ORM)
 | 
|---|
| 54 |  .I '$D(^OR(100,ORIFN,2,0)) D MAXFREQ2(ORIFN,ODT,.ORM)
 | 
|---|
| 55 |  K ^TMP("ORR",$J)
 | 
|---|
| 56 |  Q
 | 
|---|
| 57 | MAXFREQ2(ORIFN,ODT,ORL) ;second part of max order freq order check
 | 
|---|
| 58 |  N ORS,ORSI,ORSP,OROI,LRID,LRIDX,LRIDXC,EXDT,INVDT,MAXDT,ORKMSG
 | 
|---|
| 59 |  S ORS=$$STATUS^ORQOR2(ORIFN),ORSI=$P(ORS,U)
 | 
|---|
| 60 |  ;quit if order status is canceled/discontinued/expired/lapsed/changed/delayed:
 | 
|---|
| 61 |  I (ORSI=13)!(ORSI=1)!(ORSI=7)!(ORSI=14)!(ORSI=12)!(ORSI=10) Q
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 |  ;get specimen for this order:
 | 
|---|
| 64 |  S ORSP=$$VALUE^ORCSAVE2(ORIFN,"SPECIMEN")
 | 
|---|
| 65 |  Q:'$L($G(ORSP))  ;quit if no specimen found
 | 
|---|
| 66 |  ;get orderable item for this order:
 | 
|---|
| 67 |  S OROI=$$OI^ORQOR2(ORIFN)
 | 
|---|
| 68 |  Q:'$L($G(OROI))  ;quit if no orderable item found
 | 
|---|
| 69 |  ;get lab id and check against ordered array ORD
 | 
|---|
| 70 |  S:$L($G(^ORD(101.43,OROI,0))) LRIDX=$P(^ORD(101.43,OROI,0),U,2)_";"_ORSP I $L($G(LRIDX)) D
 | 
|---|
| 71 |  .S LRID="" F  S LRID=$O(ORL(LRID)) Q:LRID=""  I LRID=LRIDX D
 | 
|---|
| 72 |  ..S MAXDT=ORL(LRID)
 | 
|---|
| 73 |  ..;if order's dt > max dt and (order's dt < new order's dt or 
 | 
|---|
| 74 |  ..;   order's date = new order's date), max order freq violated:
 | 
|---|
| 75 |  ..I ODT>MAXDT,((ODT<NEWORDT)!($P(ODT,".")=$P(NEWORDT,"."))) D
 | 
|---|
| 76 |  ...S ORKMSG="Max lab test order freq exceeded for: "_$E($P(^LAB(60,+LRID,0),U),1,30)
 | 
|---|
| 77 |  ...S ORKLR(ORKMSG)=ORIFN_U_ORKMSG
 | 
|---|
| 78 |  ;get children lab ids and check against ordered array  ORD
 | 
|---|
| 79 |  S LRIDX="" F  S LRIDX=$O(^ORL(101.43,OROI,10,"AID",LRIDX)) Q:LRIDX=""  D
 | 
|---|
| 80 |  .S LRIDXC=LRIDX_";"_ORSP
 | 
|---|
| 81 |  .S LRID="" F  S LRID=$O(ORL(LRID)) Q:LRID=""  I LRID=LRIDXC D
 | 
|---|
| 82 |  ..S MAXDT=ORL(LRID)
 | 
|---|
| 83 |  ..;if order's dt > max dt and (order's dt < new order's dt or 
 | 
|---|
| 84 |  ..;   order's date = new order's date), max order freq violated:
 | 
|---|
| 85 |  ..I ODT>MAXDT,((ODT<NEWORDT)!($P(ODT,".")=$P(NEWORDT,"."))) D
 | 
|---|
| 86 |  ...S ORKMSG="Max lab test order freq exceeded for: "_$E($P(^LAB(60,+LRID,0),U),1,30)
 | 
|---|
| 87 |  ...S ORKLR(ORKMSG)=ORIFN_U_ORKMSG
 | 
|---|
| 88 |  Q
 | 
|---|
| 89 | DAILY(ORD) ;check for daily order maximum violation
 | 
|---|
| 90 |  N DGIEN,HOR,SEQ,X,ORIFN,ODT,ORIFNC,NEWORDAY,CNT
 | 
|---|
| 91 |  S HOR=0,SEQ=0,CNT=0
 | 
|---|
| 92 |  ;get all lab orders occurring on new order's date:
 | 
|---|
| 93 |  S NEWORDAY=$P(NEWORDT,".")
 | 
|---|
| 94 |  S DGIEN=0,DGIEN=$O(^ORD(100.98,"B","LAB",DGIEN))
 | 
|---|
| 95 |  K ^TMP("ORR",$J)
 | 
|---|
| 96 |  D EN^ORQ1(ORDFN,DGIEN,1,"",NEWORDAY+.0001,NEWORDAY+.24,1,0)
 | 
|---|
| 97 |  S HOR=$O(^TMP("ORR",$J,HOR)) Q:+HOR<1
 | 
|---|
| 98 |  S SEQ=0 F  S SEQ=$O(^TMP("ORR",$J,HOR,SEQ)) Q:+SEQ<1  D
 | 
|---|
| 99 |  .S X=^TMP("ORR",$J,HOR,SEQ),ORIFN=+$P(X,U),ODT=$P(X,U,4)
 | 
|---|
| 100 |  .;break into child orders if they exist:
 | 
|---|
| 101 |  .I $D(^OR(100,ORIFN,2,0)) D  ;child orders exist
 | 
|---|
| 102 |  ..S ORIFNC=0 F  S ORIFNC=$O(^OR(100,ORIFN,2,ORIFNC)) Q:ORIFNC=""  D
 | 
|---|
| 103 |  ...D DAILY2(ORIFNC,ODT,CNT,.ORD)
 | 
|---|
| 104 |  .I '$D(^OR(100,ORIFN,2,0)) D DAILY2(ORIFN,ODT,CNT,.ORD)
 | 
|---|
| 105 |  K ^TMP("ORR",$J)
 | 
|---|
| 106 |  Q
 | 
|---|
| 107 | DAILY2(ORIFN,ODT,CNT,ORL) ;second part of daily order max order check
 | 
|---|
| 108 |  N ORS,ORSI,ORSP,OROI,LRID,LRIDX,LRIDXC,EXDT,INVDT,DAILY
 | 
|---|
| 109 |  S ORS=$$STATUS^ORQOR2(ORIFN),ORSI=$P(ORS,U)
 | 
|---|
| 110 |  ;quit if order status is canceled/discontinued/expired/lapsed/changed/delayed:
 | 
|---|
| 111 |  I (ORSI=13)!(ORSI=1)!(ORSI=7)!(ORSI=14)!(ORSI=12)!(ORSI=10) Q
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 |  ;get specimen for this order:
 | 
|---|
| 114 |  S ORSP=$$VALUE^ORCSAVE2(ORIFN,"SPECIMEN")
 | 
|---|
| 115 |  Q:'$L($G(ORSP))  ;quit if no specimen found
 | 
|---|
| 116 |  ;get orderable item for this order:
 | 
|---|
| 117 |  S OROI=$$OI^ORQOR2(ORIFN)
 | 
|---|
| 118 |  Q:'$L($G(OROI))  ;quit if no orderable item found
 | 
|---|
| 119 |  ;get lab id and check against ordered array ORD
 | 
|---|
| 120 |  S:$L($G(^ORD(101.43,OROI,0))) LRIDX=$P(^ORD(101.43,OROI,0),U,2)_";"_ORSP I $L($G(LRIDX)) D
 | 
|---|
| 121 |  .;use 2nd piece of the lab id array as a counter to keep counter specific to the lab test_specimen: 
 | 
|---|
| 122 |  .S LRID="" F  S LRID=$O(ORL(LRID)) Q:LRID=""  I LRID=LRIDX D
 | 
|---|
| 123 |  ..S $P(ORL(LRID),U,2)=$P(ORL(LRID),U,2)+1,DAILY=$P(ORL(LRID),U)
 | 
|---|
| 124 |  ..;if count for this lab test_specimen exceeds daily order max, send oc message:
 | 
|---|
| 125 |  ..I $P(ORL(LRID),U,2)=DAILY D
 | 
|---|
| 126 |  ...S ORKMSG="Lab test daily order max exceeded for: "_$E($P(^LAB(60,+LRID,0),U),1,30)
 | 
|---|
| 127 |  ...S ORKLR(ORKMSG)=ORIFN_U_ORKMSG
 | 
|---|
| 128 |  ;get children lab ids and check against ordered array  ORD
 | 
|---|
| 129 |  S LRIDX="" F  S LRIDX=$O(^ORL(101.43,OROI,10,"AID",LRIDX)) Q:LRIDX=""  D
 | 
|---|
| 130 |  .S LRIDXC=LRIDX_";"_ORSP
 | 
|---|
| 131 |  .;use 2nd piece of the lab id array as a counter to keep counter specific to the lab test_specimen: 
 | 
|---|
| 132 |  .S LRID="" F  S LRID=$O(ORL(LRID)) Q:LRID=""  I LRID=LRIDXC D
 | 
|---|
| 133 |  ..S $P(ORL(LRID),U,2)=$P(ORL(LRID),U,2)+1,DAILY=$P(ORL(LRID),U)
 | 
|---|
| 134 |  ..;if count for this lab test_specimen exceeds daily order max, send oc message:
 | 
|---|
| 135 |  ..I $P(ORL(LRID),U,2)=DAILY D
 | 
|---|
| 136 |  ...S ORKMSG="Lab test daily order max exceeded for: "_$E($P(^LAB(60,+LRID,0),U),1,30)
 | 
|---|
| 137 |  ...S ORKLR(ORKMSG)=ORIFN_U_ORKMSG
 | 
|---|
| 138 |  Q
 | 
|---|
| 139 | FREQS(LRIEN,ORSPEC) ;extrinsic funct returns max order freq and daily order max for a lab test
 | 
|---|
| 140 |  N LRY,LRI,SPEC,MAXFREQ,X,DAILYMAX,Y,LRCNODE
 | 
|---|
| 141 |  S MAXFREQ="",DAILYMAX=""
 | 
|---|
| 142 |  D TEST^LR7OR3(LRIEN,.LRY)
 | 
|---|
| 143 |  I $D(LRY) D
 | 
|---|
| 144 |  .S LRI="" F  S LRI=$O(LRY("CollSamp",LRI)) Q:LRI=""  D
 | 
|---|
| 145 |  ..S LRCNODE=LRY("CollSamp",LRI),SPEC=$P(LRCNODE,U,3),X=+$P(LRCNODE,U,5),Y=+$P(LRCNODE,U,6)
 | 
|---|
| 146 |  ..;if specimens match:
 | 
|---|
| 147 |  ..I SPEC=ORSPEC D
 | 
|---|
| 148 |  ...;get maxfreq, if more than one max freq exists for this
 | 
|---|
| 149 |  ...;  collection sample/specimen use the largest max freq:
 | 
|---|
| 150 |  ...I X>MAXFREQ S MAXFREQ=X
 | 
|---|
| 151 |  ...;if dailymax > 0:
 | 
|---|
| 152 |  ...I $G(Y)>0 D
 | 
|---|
| 153 |  ....I $L($G(DAILYMAX)),(Y<DAILYMAX) S DAILYMAX=Y ;use smallest daily mx
 | 
|---|
| 154 |  ....I '$L($G(DAILYMAX)) S DAILYMAX=Y ;get first occurrence of dailymax
 | 
|---|
| 155 |  Q MAXFREQ_U_DAILYMAX
 | 
|---|