ORKLR2 ; slc/CLA - Order checking support proc for lab orders, part 2 ;May 17, 2019 17:00
;;3.0;ORDER ENTRY/RESULTS REPORTING;**510**;Dec 17, 1997;Build 11
;
;IA #2387 - ^LAB(60 fields retrieved by routine LR7OR3
;
Q
ORFREQ(ORKLR,OI,ORDFN,NEWORDT,SPECIMEN) ;lab order freq restrictions order check
N LRID,LFREQS,MAX,DAILY,MAXDT,EARLYDT,ORM,ORD,X1,X2,X,ORDIFF
S EARLYDT=NEWORDT
;get lab id from orderable item (OI):
S LRID=$P(^ORD(101.43,OI,0),U,2) I $L($G(LRID)) D
.S LFREQS=$$FREQS(+LRID,SPECIMEN),MAX=$P(LFREQS,U),DAILY=$P(LFREQS,U,2)
.;if max order freq exists, don't process for daily order max:
.I '$L($G(MAX)) S:$L($G(DAILY)) ORD(LRID_";"_SPECIMEN)=DAILY_"^0"
.I $L($G(MAX)) D
..;decrease by 1 since order frequency occurs for calendar days
..;example: every two days = equals today and tomorrow - not including
..; the day after tomorrow
..S MAX=MAX-1
..S X1=NEWORDT,X2="-"_MAX D C^%DTC Q:X<1 S MAXDT=X
..I MAXDT<EARLYDT S EARLYDT=MAXDT ;find and keep earliest MAXDT
..;
..;The earliest max d/t is used because if the lab order has children,
..;they may have different (or no) maximum order freq values. By taking
..;the earliest, we cover all values yet narrow the search range for the
..;call into ORQ1. In MAXFREQ2 the specific max d/ts stored in ORL are
..;checked against the d/ts of orders returned by ORQ1. ORQ1 orders' d/t
..;are checked to see if they fall between the max d/t of an equivalent
..;parent or child lab test order stored in ORL and the d/t of the order
..;being checked.
..;
..S ORM(LRID_";"_SPECIMEN)=MAXDT
;
;expand into child-level lab identifiers if children exist for this OI:
S LRID="" F S LRID=$O(^ORD(101.43,OI,10,"AID",LRID)) Q:LRID="" D
.S MAX="",DAILY="",LFREQS=""
.S LFREQS=$$FREQS(+LRID,SPECIMEN),MAX=$P(LFREQS,U),DAILY=$P(LFREQS,U,2)
.;if max order freq exists, don't process for daily order max:
.I '$L($G(MAX)),($L($G(DAILY))) S ORD(LRID_";"_SPECIMEN)=DAILY
.I $L($G(MAX)) D
..;decrease by 1 since order frequency occurs for calendar days
..;example: every two days = equals today and tomorrow - not including
..; the day after tomorrow
..S MAX=MAX-1
..S X1=NEWORDT,X2="-"_MAX D C^%DTC Q:X<1 S MAXDT=X
..I MAXDT<EARLYDT S EARLYDT=MAXDT ;find and keep earliest MAXDT
..S ORM(LRID_";"_SPECIMEN)=MAXDT
I $D(ORM) D
. ;expand the search range to include orders with a collection date
. ;after this order's collection date
. S ORDIFF=$$FMDIFF^XLFDT(NEWORDT,EARLYDT,"")
. S NEWORDT=$$FMADD^XLFDT(NEWORDT,ORDIFF)
. ;start EARLYDT at midnight of previous date
. S EARLYDT=$$FMADD^XLFDT(EARLYDT,"","","",-60)
. D MAXFREQ(.ORM,EARLYDT)
I $D(ORD) D DAILY(.ORD)
Q
MAXFREQ(ORM,EARLYDT) ;check for maximum order frequency violation
N DGIEN,HOR,SEQ,X,ORIFN,ODT,ORIFNC
S HOR=0,SEQ=0
;get all lab orders since earliest max order freq d/t:
S DGIEN=0,DGIEN=$O(^ORD(100.98,"B","LAB",DGIEN))
K ^TMP("ORR",$J)
D EN^ORQ1(ORDFN,DGIEN,1,"",EARLYDT,NEWORDT+.2359,1,0,"AW")
S HOR=$O(^TMP("ORR",$J,HOR)) Q:+HOR<1
F S SEQ=$O(^TMP("ORR",$J,HOR,SEQ)) Q:+SEQ<1 D
.S X=^TMP("ORR",$J,HOR,SEQ),ORIFN=+$P(X,U),ODT=$P(X,U,4)
.;break into child orders if they exist:
.I $D(^OR(100,ORIFN,2,0)) D ;child orders exist
..S ORIFNC=0 F S ORIFNC=$O(^OR(100,ORIFN,2,ORIFNC)) Q:ORIFNC="" D
...D MAXFREQ2(ORIFNC,ODT,.ORM)
.I '$D(^OR(100,ORIFN,2,0)) D MAXFREQ2(ORIFN,ODT,.ORM)
K ^TMP("ORR",$J)
Q
MAXFREQ2(ORIFN,ODT,ORL) ;second part of max order freq order check
N ORS,ORSI,ORSP,OROI,LRID,LRIDX,LRIDXC,EXDT,INVDT,MAXDT,ORKMSG
S ORS=$$STATUS^ORQOR2(ORIFN),ORSI=$P(ORS,U)
;quit if order status is canceled/discontinued/expired/lapsed/changed/delayed:
I (ORSI=13)!(ORSI=1)!(ORSI=7)!(ORSI=14)!(ORSI=12)!(ORSI=10) Q
;
;get specimen for this order:
S ORSP=$$VALUE^ORCSAVE2(ORIFN,"SPECIMEN")
Q:'$L($G(ORSP)) ;quit if no specimen found
;get orderable item for this order:
S OROI=$$OI^ORQOR2(ORIFN)
Q:'$L($G(OROI)) ;quit if no orderable item found
;get lab id and check against ordered array ORD
S:$L($G(^ORD(101.43,OROI,0))) LRIDX=$P(^ORD(101.43,OROI,0),U,2)_";"_ORSP I $L($G(LRIDX)) D
.S LRID="" F S LRID=$O(ORL(LRID)) Q:LRID="" I LRID=LRIDX D
..S MAXDT=ORL(LRID)
..;if order's dt > or equal to max dt and (order's dt < or equal to new order's dt or
..; order's date = new order's date), max order freq violated:
..; (The $P(ODT,".")=$P(NEWORDT,".") might not be necessary, but keeping it
..; in case a scenario depends on it.)
..I ODT'<MAXDT,((ODT'>NEWORDT)!($P(ODT,".")=$P(NEWORDT,"."))) D
...S ORKMSG="Max lab test order freq exceeded for: "_$E($P(^LAB(60,+LRID,0),U),1,30)
...S ORKLR(ORKMSG)=ORIFN_U_ORKMSG
;get children lab ids and check against ordered array ORD
S LRIDX="" F S LRIDX=$O(^ORD(101.43,OROI,10,"AID",LRIDX)) Q:LRIDX="" D
.S LRIDXC=LRIDX_";"_ORSP
.S LRID="" F S LRID=$O(ORL(LRID)) Q:LRID="" I LRID=LRIDXC D
..S MAXDT=ORL(LRID)
..;if order's dt > or equal to max dt and (order's dt < or equal to new order's dt or
..; order's date = new order's date), max order freq violated:
..; (The $P(ODT,".")=$P(NEWORDT,".") might not be necessary, but keeping it
..; in case a scenario depends on it.)
..I ODT'<MAXDT,((ODT'>NEWORDT)!($P(ODT,".")=$P(NEWORDT,"."))) D
...S ORKMSG="Max lab test order freq exceeded for: "_$E($P(^LAB(60,+LRID,0),U),1,30)
...S ORKLR(ORKMSG)=ORIFN_U_ORKMSG
Q
DAILY(ORD) ;check for daily order maximum violation
N DGIEN,HOR,SEQ,X,ORIFN,ODT,ORIFNC,NEWORDAY,CNT
S HOR=0,SEQ=0,CNT=0
;get all lab orders occurring on new order's date:
S NEWORDAY=$P(NEWORDT,".")
S DGIEN=0,DGIEN=$O(^ORD(100.98,"B","LAB",DGIEN))
K ^TMP("ORR",$J)
D EN^ORQ1(ORDFN,DGIEN,1,"",$$FMADD^XLFDT(NEWORDAY,"","","",-60),NEWORDAY+.2359,1,0,"AW")
S HOR=$O(^TMP("ORR",$J,HOR)) Q:+HOR<1
S SEQ=0 F S SEQ=$O(^TMP("ORR",$J,HOR,SEQ)) Q:+SEQ<1 D
.S X=^TMP("ORR",$J,HOR,SEQ),ORIFN=+$P(X,U),ODT=$P(X,U,4)
.;break into child orders if they exist:
.I $D(^OR(100,ORIFN,2,0)) D ;child orders exist
..S ORIFNC=0 F S ORIFNC=$O(^OR(100,ORIFN,2,ORIFNC)) Q:ORIFNC="" D
...D DAILY2(ORIFNC,ODT,CNT,.ORD)
.I '$D(^OR(100,ORIFN,2,0)) D DAILY2(ORIFN,ODT,CNT,.ORD)
K ^TMP("ORR",$J)
Q
DAILY2(ORIFN,ODT,CNT,ORL) ;second part of daily order max order check
N ORS,ORSI,ORSP,OROI,LRID,LRIDX,LRIDXC,EXDT,INVDT,DAILY
S ORS=$$STATUS^ORQOR2(ORIFN),ORSI=$P(ORS,U)
;quit if order status is canceled/discontinued/expired/lapsed/changed/delayed:
I (ORSI=13)!(ORSI=1)!(ORSI=7)!(ORSI=14)!(ORSI=12)!(ORSI=10) Q
;
;get specimen for this order:
S ORSP=$$VALUE^ORCSAVE2(ORIFN,"SPECIMEN")
Q:'$L($G(ORSP)) ;quit if no specimen found
;get orderable item for this order:
S OROI=$$OI^ORQOR2(ORIFN)
Q:'$L($G(OROI)) ;quit if no orderable item found
;get lab id and check against ordered array ORD
S:$L($G(^ORD(101.43,OROI,0))) LRIDX=$P(^ORD(101.43,OROI,0),U,2)_";"_ORSP I $L($G(LRIDX)) D
.;use 2nd piece of the lab id array as a counter to keep counter specific to the lab test_specimen:
.S LRID="" F S LRID=$O(ORL(LRID)) Q:LRID="" I LRID=LRIDX D
..S $P(ORL(LRID),U,2)=$P(ORL(LRID),U,2)+1,DAILY=$P(ORL(LRID),U)
..;if count for this lab test_specimen exceeds daily order max, send oc message:
..I $P(ORL(LRID),U,2)=DAILY D
...S ORKMSG="Lab test daily order max exceeded for: "_$E($P(^LAB(60,+LRID,0),U),1,30)
...S ORKLR(ORKMSG)=ORIFN_U_ORKMSG
;get children lab ids and check against ordered array ORD
S LRIDX="" F S LRIDX=$O(^ORD(101.43,OROI,10,"AID",LRIDX)) Q:LRIDX="" D
.S LRIDXC=LRIDX_";"_ORSP
.;use 2nd piece of the lab id array as a counter to keep counter specific to the lab test_specimen:
.S LRID="" F S LRID=$O(ORL(LRID)) Q:LRID="" I LRID=LRIDXC D
..S $P(ORL(LRID),U,2)=$P(ORL(LRID),U,2)+1,DAILY=$P(ORL(LRID),U)
..;if count for this lab test_specimen exceeds daily order max, send oc message:
..I $P(ORL(LRID),U,2)=DAILY D
...S ORKMSG="Lab test daily order max exceeded for: "_$E($P(^LAB(60,+LRID,0),U),1,30)
...S ORKLR(ORKMSG)=ORIFN_U_ORKMSG
Q
FREQS(LRIEN,ORSPEC) ;extrinsic funct returns max order freq and daily order max for a lab test
N LRY,LRI,SPEC,MAXFREQ,X,DAILYMAX,Y,LRCNODE
S MAXFREQ="",DAILYMAX=""
D TEST^LR7OR3(LRIEN,.LRY)
I $D(LRY) D
.S LRI="" F S LRI=$O(LRY("CollSamp",LRI)) Q:LRI="" D
..S LRCNODE=LRY("CollSamp",LRI),SPEC=$P(LRCNODE,U,3),X=+$P(LRCNODE,U,5),Y=+$P(LRCNODE,U,6)
..;if specimens match:
..I SPEC=ORSPEC D
...;get maxfreq, if more than one max freq exists for this
...; collection sample/specimen use the largest max freq:
...I X>MAXFREQ S MAXFREQ=X
...;if dailymax > 0:
...I $G(Y)>0 D
....I $L($G(DAILYMAX)),(Y<DAILYMAX) S DAILYMAX=Y ;use smallest daily mx
....I '$L($G(DAILYMAX)) S DAILYMAX=Y ;get first occurrence of dailymax
Q MAXFREQ_U_DAILYMAX
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HORKLR2 8839 printed Nov 22, 2024@17:41:04 Page 2
ORKLR2 ; slc/CLA - Order checking support proc for lab orders, part 2 ;May 17, 2019 17:00
+1 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**510**;Dec 17, 1997;Build 11
+2 ;
+3 ;IA #2387 - ^LAB(60 fields retrieved by routine LR7OR3
+4 ;
+5 QUIT
ORFREQ(ORKLR,OI,ORDFN,NEWORDT,SPECIMEN) ;lab order freq restrictions order check
+1 NEW LRID,LFREQS,MAX,DAILY,MAXDT,EARLYDT,ORM,ORD,X1,X2,X,ORDIFF
+2 SET EARLYDT=NEWORDT
+3 ;get lab id from orderable item (OI):
+4 SET LRID=$PIECE(^ORD(101.43,OI,0),U,2)
IF $LENGTH($GET(LRID))
Begin DoDot:1
+5 SET LFREQS=$$FREQS(+LRID,SPECIMEN)
SET MAX=$PIECE(LFREQS,U)
SET DAILY=$PIECE(LFREQS,U,2)
+6 ;if max order freq exists, don't process for daily order max:
+7 IF '$LENGTH($GET(MAX))
if $LENGTH($GET(DAILY))
SET ORD(LRID_";"_SPECIMEN)=DAILY_"^0"
+8 IF $LENGTH($GET(MAX))
Begin DoDot:2
+9 ;decrease by 1 since order frequency occurs for calendar days
+10 ;example: every two days = equals today and tomorrow - not including
+11 ; the day after tomorrow
+12 SET MAX=MAX-1
+13 SET X1=NEWORDT
SET X2="-"_MAX
DO C^%DTC
if X<1
QUIT
SET MAXDT=X
+14 ;find and keep earliest MAXDT
IF MAXDT<EARLYDT
SET EARLYDT=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 SET ORM(LRID_";"_SPECIMEN)=MAXDT
End DoDot:2
End DoDot:1
+26 ;
+27 ;expand into child-level lab identifiers if children exist for this OI:
+28 SET LRID=""
FOR
SET LRID=$ORDER(^ORD(101.43,OI,10,"AID",LRID))
if LRID=""
QUIT
Begin DoDot:1
+29 SET MAX=""
SET DAILY=""
SET LFREQS=""
+30 SET LFREQS=$$FREQS(+LRID,SPECIMEN)
SET MAX=$PIECE(LFREQS,U)
SET DAILY=$PIECE(LFREQS,U,2)
+31 ;if max order freq exists, don't process for daily order max:
+32 IF '$LENGTH($GET(MAX))
IF ($LENGTH($GET(DAILY)))
SET ORD(LRID_";"_SPECIMEN)=DAILY
+33 IF $LENGTH($GET(MAX))
Begin DoDot:2
+34 ;decrease by 1 since order frequency occurs for calendar days
+35 ;example: every two days = equals today and tomorrow - not including
+36 ; the day after tomorrow
+37 SET MAX=MAX-1
+38 SET X1=NEWORDT
SET X2="-"_MAX
DO C^%DTC
if X<1
QUIT
SET MAXDT=X
+39 ;find and keep earliest MAXDT
IF MAXDT<EARLYDT
SET EARLYDT=MAXDT
+40 SET ORM(LRID_";"_SPECIMEN)=MAXDT
End DoDot:2
End DoDot:1
+41 IF $DATA(ORM)
Begin DoDot:1
+42 ;expand the search range to include orders with a collection date
+43 ;after this order's collection date
+44 SET ORDIFF=$$FMDIFF^XLFDT(NEWORDT,EARLYDT,"")
+45 SET NEWORDT=$$FMADD^XLFDT(NEWORDT,ORDIFF)
+46 ;start EARLYDT at midnight of previous date
+47 SET EARLYDT=$$FMADD^XLFDT(EARLYDT,"","","",-60)
+48 DO MAXFREQ(.ORM,EARLYDT)
End DoDot:1
+49 IF $DATA(ORD)
DO DAILY(.ORD)
+50 QUIT
MAXFREQ(ORM,EARLYDT) ;check for maximum order frequency violation
+1 NEW DGIEN,HOR,SEQ,X,ORIFN,ODT,ORIFNC
+2 SET HOR=0
SET SEQ=0
+3 ;get all lab orders since earliest max order freq d/t:
+4 SET DGIEN=0
SET DGIEN=$ORDER(^ORD(100.98,"B","LAB",DGIEN))
+5 KILL ^TMP("ORR",$JOB)
+6 DO EN^ORQ1(ORDFN,DGIEN,1,"",EARLYDT,NEWORDT+.2359,1,0,"AW")
+7 SET HOR=$ORDER(^TMP("ORR",$JOB,HOR))
if +HOR<1
QUIT
+8 FOR
SET SEQ=$ORDER(^TMP("ORR",$JOB,HOR,SEQ))
if +SEQ<1
QUIT
Begin DoDot:1
+9 SET X=^TMP("ORR",$JOB,HOR,SEQ)
SET ORIFN=+$PIECE(X,U)
SET ODT=$PIECE(X,U,4)
+10 ;break into child orders if they exist:
+11 ;child orders exist
IF $DATA(^OR(100,ORIFN,2,0))
Begin DoDot:2
+12 SET ORIFNC=0
FOR
SET ORIFNC=$ORDER(^OR(100,ORIFN,2,ORIFNC))
if ORIFNC=""
QUIT
Begin DoDot:3
+13 DO MAXFREQ2(ORIFNC,ODT,.ORM)
End DoDot:3
End DoDot:2
+14 IF '$DATA(^OR(100,ORIFN,2,0))
DO MAXFREQ2(ORIFN,ODT,.ORM)
End DoDot:1
+15 KILL ^TMP("ORR",$JOB)
+16 QUIT
MAXFREQ2(ORIFN,ODT,ORL) ;second part of max order freq order check
+1 NEW ORS,ORSI,ORSP,OROI,LRID,LRIDX,LRIDXC,EXDT,INVDT,MAXDT,ORKMSG
+2 SET ORS=$$STATUS^ORQOR2(ORIFN)
SET ORSI=$PIECE(ORS,U)
+3 ;quit if order status is canceled/discontinued/expired/lapsed/changed/delayed:
+4 IF (ORSI=13)!(ORSI=1)!(ORSI=7)!(ORSI=14)!(ORSI=12)!(ORSI=10)
QUIT
+5 ;
+6 ;get specimen for this order:
+7 SET ORSP=$$VALUE^ORCSAVE2(ORIFN,"SPECIMEN")
+8 ;quit if no specimen found
if '$LENGTH($GET(ORSP))
QUIT
+9 ;get orderable item for this order:
+10 SET OROI=$$OI^ORQOR2(ORIFN)
+11 ;quit if no orderable item found
if '$LENGTH($GET(OROI))
QUIT
+12 ;get lab id and check against ordered array ORD
+13 if $LENGTH($GET(^ORD(101.43,OROI,0)))
SET LRIDX=$PIECE(^ORD(101.43,OROI,0),U,2)_";"_ORSP
IF $LENGTH($GET(LRIDX))
Begin DoDot:1
+14 SET LRID=""
FOR
SET LRID=$ORDER(ORL(LRID))
if LRID=""
QUIT
IF LRID=LRIDX
Begin DoDot:2
+15 SET MAXDT=ORL(LRID)
+16 ;if order's dt > or equal to max dt and (order's dt < or equal to new order's dt or
+17 ; order's date = new order's date), max order freq violated:
+18 ; (The $P(ODT,".")=$P(NEWORDT,".") might not be necessary, but keeping it
+19 ; in case a scenario depends on it.)
+20 IF ODT'<MAXDT
IF ((ODT'>NEWORDT)!($PIECE(ODT,".")=$PIECE(NEWORDT,".")))
Begin DoDot:3
+21 SET ORKMSG="Max lab test order freq exceeded for: "_$EXTRACT($PIECE(^LAB(60,+LRID,0),U),1,30)
+22 SET ORKLR(ORKMSG)=ORIFN_U_ORKMSG
End DoDot:3
End DoDot:2
End DoDot:1
+23 ;get children lab ids and check against ordered array ORD
+24 SET LRIDX=""
FOR
SET LRIDX=$ORDER(^ORD(101.43,OROI,10,"AID",LRIDX))
if LRIDX=""
QUIT
Begin DoDot:1
+25 SET LRIDXC=LRIDX_";"_ORSP
+26 SET LRID=""
FOR
SET LRID=$ORDER(ORL(LRID))
if LRID=""
QUIT
IF LRID=LRIDXC
Begin DoDot:2
+27 SET MAXDT=ORL(LRID)
+28 ;if order's dt > or equal to max dt and (order's dt < or equal to new order's dt or
+29 ; order's date = new order's date), max order freq violated:
+30 ; (The $P(ODT,".")=$P(NEWORDT,".") might not be necessary, but keeping it
+31 ; in case a scenario depends on it.)
+32 IF ODT'<MAXDT
IF ((ODT'>NEWORDT)!($PIECE(ODT,".")=$PIECE(NEWORDT,".")))
Begin DoDot:3
+33 SET ORKMSG="Max lab test order freq exceeded for: "_$EXTRACT($PIECE(^LAB(60,+LRID,0),U),1,30)
+34 SET ORKLR(ORKMSG)=ORIFN_U_ORKMSG
End DoDot:3
End DoDot:2
End DoDot:1
+35 QUIT
DAILY(ORD) ;check for daily order maximum violation
+1 NEW DGIEN,HOR,SEQ,X,ORIFN,ODT,ORIFNC,NEWORDAY,CNT
+2 SET HOR=0
SET SEQ=0
SET CNT=0
+3 ;get all lab orders occurring on new order's date:
+4 SET NEWORDAY=$PIECE(NEWORDT,".")
+5 SET DGIEN=0
SET DGIEN=$ORDER(^ORD(100.98,"B","LAB",DGIEN))
+6 KILL ^TMP("ORR",$JOB)
+7 DO EN^ORQ1(ORDFN,DGIEN,1,"",$$FMADD^XLFDT(NEWORDAY,"","","",-60),NEWORDAY+.2359,1,0,"AW")
+8 SET HOR=$ORDER(^TMP("ORR",$JOB,HOR))
if +HOR<1
QUIT
+9 SET SEQ=0
FOR
SET SEQ=$ORDER(^TMP("ORR",$JOB,HOR,SEQ))
if +SEQ<1
QUIT
Begin DoDot:1
+10 SET X=^TMP("ORR",$JOB,HOR,SEQ)
SET ORIFN=+$PIECE(X,U)
SET ODT=$PIECE(X,U,4)
+11 ;break into child orders if they exist:
+12 ;child orders exist
IF $DATA(^OR(100,ORIFN,2,0))
Begin DoDot:2
+13 SET ORIFNC=0
FOR
SET ORIFNC=$ORDER(^OR(100,ORIFN,2,ORIFNC))
if ORIFNC=""
QUIT
Begin DoDot:3
+14 DO DAILY2(ORIFNC,ODT,CNT,.ORD)
End DoDot:3
End DoDot:2
+15 IF '$DATA(^OR(100,ORIFN,2,0))
DO DAILY2(ORIFN,ODT,CNT,.ORD)
End DoDot:1
+16 KILL ^TMP("ORR",$JOB)
+17 QUIT
DAILY2(ORIFN,ODT,CNT,ORL) ;second part of daily order max order check
+1 NEW ORS,ORSI,ORSP,OROI,LRID,LRIDX,LRIDXC,EXDT,INVDT,DAILY
+2 SET ORS=$$STATUS^ORQOR2(ORIFN)
SET ORSI=$PIECE(ORS,U)
+3 ;quit if order status is canceled/discontinued/expired/lapsed/changed/delayed:
+4 IF (ORSI=13)!(ORSI=1)!(ORSI=7)!(ORSI=14)!(ORSI=12)!(ORSI=10)
QUIT
+5 ;
+6 ;get specimen for this order:
+7 SET ORSP=$$VALUE^ORCSAVE2(ORIFN,"SPECIMEN")
+8 ;quit if no specimen found
if '$LENGTH($GET(ORSP))
QUIT
+9 ;get orderable item for this order:
+10 SET OROI=$$OI^ORQOR2(ORIFN)
+11 ;quit if no orderable item found
if '$LENGTH($GET(OROI))
QUIT
+12 ;get lab id and check against ordered array ORD
+13 if $LENGTH($GET(^ORD(101.43,OROI,0)))
SET LRIDX=$PIECE(^ORD(101.43,OROI,0),U,2)_";"_ORSP
IF $LENGTH($GET(LRIDX))
Begin DoDot:1
+14 ;use 2nd piece of the lab id array as a counter to keep counter specific to the lab test_specimen:
+15 SET LRID=""
FOR
SET LRID=$ORDER(ORL(LRID))
if LRID=""
QUIT
IF LRID=LRIDX
Begin DoDot:2
+16 SET $PIECE(ORL(LRID),U,2)=$PIECE(ORL(LRID),U,2)+1
SET DAILY=$PIECE(ORL(LRID),U)
+17 ;if count for this lab test_specimen exceeds daily order max, send oc message:
+18 IF $PIECE(ORL(LRID),U,2)=DAILY
Begin DoDot:3
+19 SET ORKMSG="Lab test daily order max exceeded for: "_$EXTRACT($PIECE(^LAB(60,+LRID,0),U),1,30)
+20 SET ORKLR(ORKMSG)=ORIFN_U_ORKMSG
End DoDot:3
End DoDot:2
End DoDot:1
+21 ;get children lab ids and check against ordered array ORD
+22 SET LRIDX=""
FOR
SET LRIDX=$ORDER(^ORD(101.43,OROI,10,"AID",LRIDX))
if LRIDX=""
QUIT
Begin DoDot:1
+23 SET LRIDXC=LRIDX_";"_ORSP
+24 ;use 2nd piece of the lab id array as a counter to keep counter specific to the lab test_specimen:
+25 SET LRID=""
FOR
SET LRID=$ORDER(ORL(LRID))
if LRID=""
QUIT
IF LRID=LRIDXC
Begin DoDot:2
+26 SET $PIECE(ORL(LRID),U,2)=$PIECE(ORL(LRID),U,2)+1
SET DAILY=$PIECE(ORL(LRID),U)
+27 ;if count for this lab test_specimen exceeds daily order max, send oc message:
+28 IF $PIECE(ORL(LRID),U,2)=DAILY
Begin DoDot:3
+29 SET ORKMSG="Lab test daily order max exceeded for: "_$EXTRACT($PIECE(^LAB(60,+LRID,0),U),1,30)
+30 SET ORKLR(ORKMSG)=ORIFN_U_ORKMSG
End DoDot:3
End DoDot:2
End DoDot:1
+31 QUIT
FREQS(LRIEN,ORSPEC) ;extrinsic funct returns max order freq and daily order max for a lab test
+1 NEW LRY,LRI,SPEC,MAXFREQ,X,DAILYMAX,Y,LRCNODE
+2 SET MAXFREQ=""
SET DAILYMAX=""
+3 DO TEST^LR7OR3(LRIEN,.LRY)
+4 IF $DATA(LRY)
Begin DoDot:1
+5 SET LRI=""
FOR
SET LRI=$ORDER(LRY("CollSamp",LRI))
if LRI=""
QUIT
Begin DoDot:2
+6 SET LRCNODE=LRY("CollSamp",LRI)
SET SPEC=$PIECE(LRCNODE,U,3)
SET X=+$PIECE(LRCNODE,U,5)
SET Y=+$PIECE(LRCNODE,U,6)
+7 ;if specimens match:
+8 IF SPEC=ORSPEC
Begin DoDot:3
+9 ;get maxfreq, if more than one max freq exists for this
+10 ; collection sample/specimen use the largest max freq:
+11 IF X>MAXFREQ
SET MAXFREQ=X
+12 ;if dailymax > 0:
+13 IF $GET(Y)>0
Begin DoDot:4
+14 ;use smallest daily mx
IF $LENGTH($GET(DAILYMAX))
IF (Y<DAILYMAX)
SET DAILYMAX=Y
+15 ;get first occurrence of dailymax
IF '$LENGTH($GET(DAILYMAX))
SET DAILYMAX=Y
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+16 QUIT MAXFREQ_U_DAILYMAX