SDAMOWB ;ALB/CAW - Waiting Times Build Arrays; 8-NOV-93
;;5.3;Scheduling;**12,1015**;Aug 13, 1993;Build 21
;
STORE(HOW,DIV,CLIN,STOP,DATE,PAT) ;save data in tmp variable
;SDCLIN^SDSTOP^SDDAY^SDDIV^DFN^SDCHKIN^SDCHKOUT^SDWTTIME^SDOTIME^SDTTTIME
; 1 2 3 4 5 6 7 8 9 10
;calc times
S SDWTTIME=$$MIN(SDCHKIN,SDT)
S SDOTTIME=$$MIN(SDT,SDCHKOUT)
S SDTTTIME=$$MIN(SDCHKIN,SDCHKOUT)
D SET(HOW,CLIN,STOP,DATE,PAT)
I "^1^2^5^"[(U_HOW_U) D
.S ^TMP("SDWAIT",$J,DIV,LEVEL1,LEVEL2,LEVEL3)=SDDATA_U_SDWTTIME_U_SDOTTIME_U_SDTTTIME
I "^3^4^"[(U_HOW_U) D
.S ^TMP("SDWAIT",$J,DIV,LEVEL1,LEVEL2,LEVEL3,LEVEL4)=SDDATA_U_SDWTTIME_U_SDOTTIME_U_SDTTTIME
S SDX=$G(^TMP("SDWTTOT",$J,DIV,LEVEL1,"PRIM")) S ^("PRIM")=$$AUGMENT(SDWTTIME,SDOTTIME,SDTTTIME,SDX)
S SDX=$G(^TMP("SDWTTOTG",$J,"GRAND")) S ^("GRAND")=$$AUGMENT(SDWTTIME,SDOTTIME,SDTTTIME,SDX)
S SDX=$G(^TMP("SDWTTOTD",$J,SDDIV,"DIV")) S ^("DIV")=$$AUGMENT(SDWTTIME,SDOTTIME,SDTTTIME,SDX)
Q
AUGMENT(WAIT,WAIT1,TOT,NODE) ;increment summary node
;NODE=#appts^cum min fm ci to appt^cum min fm appt to co^cum total min
; 1 2 3 4
S $P(NODE,U,1)=$P(NODE,U,1)+1
S $P(NODE,U,2)=$P(NODE,U,2)+WAIT
S $P(NODE,U,3)=$P(NODE,U,3)+WAIT1
S $P(NODE,U,4)=$P(NODE,U,4)+TOT
Q NODE
MIN(X,X1) ;difference between x & x1 in minutes
; for positive result, x is BEFORE x1
;
N Y
S Y=$E(X1_"000",9,10)-$E(X_"000",9,10)*60+$E(X1_"00000",11,12)-$E(X_"00000",11,12),X2=X I $P(X,".",1)'=$P(X1,".",1) S X2=X D ^%DTC S Y=X*1440+Y
Q $G(Y)
REJECT() ;set x conditions for rejection
; returns: 1|reject or 0|meets selection criteria
N X
I '$G(VAUTD),('$D(VAUTD(SDDIV))) S X=1 G QTRJ
S X=1
I $G(VAUTC)!($G(VAUTS)) S X=0 G QTRJ
I $D(VAUTC(SDCLIN))!($D(VAUTS(SDSTOP))) S X=0 G QTRJ
QTRJ Q X
EXTERN(SORTV,X) ;returns the external value of sort variables
; SORTV: 1=CLINIC,2=STOP CODE,3=DAY OF WEEK
; X: Internal value
N Y
;
I SORTV=1 S Y=$P($G(^SC(X,0)),U,1)
I SORTV=2 S Y=$P($G(^DIC(40.7,X,0)),U,2)
I SORTV=3 S Y=$P($G(^DPT(DFN,0)),U)
Q Y
;
SET(HOW,CLIN,STOP,DATE,PAT) ; Set how the sort goes
; Input: HOW = which sort was selected
; CLIN = clinic ifn
; STOP = stop code ifn
; DATE = date in fm format
; PAT = patient ifn
; Output: LEVE1-LEVEL4 in external format
;
I HOW=1 S LEVEL1=$$EXTERN(1,CLIN),LEVEL2=$$EXTERN(3,PAT),LEVEL3=DATE
I HOW=2 S LEVEL1=$$EXTERN(1,CLIN),LEVEL2=DATE,LEVEL3=$$EXTERN(3,PAT)
I HOW=3 S LEVEL1=$$EXTERN(2,STOP),LEVEL2=$$EXTERN(1,CLIN),LEVEL3=$$EXTERN(3,PAT),LEVEL4=DATE
I HOW=4 S LEVEL1=$$EXTERN(2,STOP),LEVEL2=$$EXTERN(3,PAT),LEVEL3=$$EXTERN(1,CLIN),LEVEL4=DATE
I HOW=5 S LEVEL1=$$EXTERN(3,DFN),LEVEL2=DATE,LEVEL3=$$EXTERN(1,CLIN)
Q
SDAMOWB ;ALB/CAW - Waiting Times Build Arrays; 8-NOV-93
+1 ;;5.3;Scheduling;**12,1015**;Aug 13, 1993;Build 21
+2 ;
STORE(HOW,DIV,CLIN,STOP,DATE,PAT) ;save data in tmp variable
+1 ;SDCLIN^SDSTOP^SDDAY^SDDIV^DFN^SDCHKIN^SDCHKOUT^SDWTTIME^SDOTIME^SDTTTIME
+2 ; 1 2 3 4 5 6 7 8 9 10
+3 ;calc times
+4 SET SDWTTIME=$$MIN(SDCHKIN,SDT)
+5 SET SDOTTIME=$$MIN(SDT,SDCHKOUT)
+6 SET SDTTTIME=$$MIN(SDCHKIN,SDCHKOUT)
+7 DO SET(HOW,CLIN,STOP,DATE,PAT)
+8 IF "^1^2^5^"[(U_HOW_U)
Begin DoDot:1
+9 SET ^TMP("SDWAIT",$JOB,DIV,LEVEL1,LEVEL2,LEVEL3)=SDDATA_U_SDWTTIME_U_SDOTTIME_U_SDTTTIME
End DoDot:1
+10 IF "^3^4^"[(U_HOW_U)
Begin DoDot:1
+11 SET ^TMP("SDWAIT",$JOB,DIV,LEVEL1,LEVEL2,LEVEL3,LEVEL4)=SDDATA_U_SDWTTIME_U_SDOTTIME_U_SDTTTIME
End DoDot:1
+12 SET SDX=$GET(^TMP("SDWTTOT",$JOB,DIV,LEVEL1,"PRIM"))
SET ^("PRIM")=$$AUGMENT(SDWTTIME,SDOTTIME,SDTTTIME,SDX)
+13 SET SDX=$GET(^TMP("SDWTTOTG",$JOB,"GRAND"))
SET ^("GRAND")=$$AUGMENT(SDWTTIME,SDOTTIME,SDTTTIME,SDX)
+14 SET SDX=$GET(^TMP("SDWTTOTD",$JOB,SDDIV,"DIV"))
SET ^("DIV")=$$AUGMENT(SDWTTIME,SDOTTIME,SDTTTIME,SDX)
+15 QUIT
AUGMENT(WAIT,WAIT1,TOT,NODE) ;increment summary node
+1 ;NODE=#appts^cum min fm ci to appt^cum min fm appt to co^cum total min
+2 ; 1 2 3 4
+3 SET $PIECE(NODE,U,1)=$PIECE(NODE,U,1)+1
+4 SET $PIECE(NODE,U,2)=$PIECE(NODE,U,2)+WAIT
+5 SET $PIECE(NODE,U,3)=$PIECE(NODE,U,3)+WAIT1
+6 SET $PIECE(NODE,U,4)=$PIECE(NODE,U,4)+TOT
+7 QUIT NODE
MIN(X,X1) ;difference between x & x1 in minutes
+1 ; for positive result, x is BEFORE x1
+2 ;
+3 NEW Y
+4 SET Y=$EXTRACT(X1_"000",9,10)-$EXTRACT(X_"000",9,10)*60+$EXTRACT(X1_"00000",11,12)-$EXTRACT(X_"00000",11,12)
SET X2=X
IF $PIECE(X,".",1)'=$PIECE(X1,".",1)
SET X2=X
DO ^%DTC
SET Y=X*1440+Y
+5 QUIT $GET(Y)
REJECT() ;set x conditions for rejection
+1 ; returns: 1|reject or 0|meets selection criteria
+2 NEW X
+3 IF '$GET(VAUTD)
IF ('$DATA(VAUTD(SDDIV)))
SET X=1
GOTO QTRJ
+4 SET X=1
+5 IF $GET(VAUTC)!($GET(VAUTS))
SET X=0
GOTO QTRJ
+6 IF $DATA(VAUTC(SDCLIN))!($DATA(VAUTS(SDSTOP)))
SET X=0
GOTO QTRJ
QTRJ QUIT X
EXTERN(SORTV,X) ;returns the external value of sort variables
+1 ; SORTV: 1=CLINIC,2=STOP CODE,3=DAY OF WEEK
+2 ; X: Internal value
+3 NEW Y
+4 ;
+5 IF SORTV=1
SET Y=$PIECE($GET(^SC(X,0)),U,1)
+6 IF SORTV=2
SET Y=$PIECE($GET(^DIC(40.7,X,0)),U,2)
+7 IF SORTV=3
SET Y=$PIECE($GET(^DPT(DFN,0)),U)
+8 QUIT Y
+9 ;
SET(HOW,CLIN,STOP,DATE,PAT) ; Set how the sort goes
+1 ; Input: HOW = which sort was selected
+2 ; CLIN = clinic ifn
+3 ; STOP = stop code ifn
+4 ; DATE = date in fm format
+5 ; PAT = patient ifn
+6 ; Output: LEVE1-LEVEL4 in external format
+7 ;
+8 IF HOW=1
SET LEVEL1=$$EXTERN(1,CLIN)
SET LEVEL2=$$EXTERN(3,PAT)
SET LEVEL3=DATE
+9 IF HOW=2
SET LEVEL1=$$EXTERN(1,CLIN)
SET LEVEL2=DATE
SET LEVEL3=$$EXTERN(3,PAT)
+10 IF HOW=3
SET LEVEL1=$$EXTERN(2,STOP)
SET LEVEL2=$$EXTERN(1,CLIN)
SET LEVEL3=$$EXTERN(3,PAT)
SET LEVEL4=DATE
+11 IF HOW=4
SET LEVEL1=$$EXTERN(2,STOP)
SET LEVEL2=$$EXTERN(3,PAT)
SET LEVEL3=$$EXTERN(1,CLIN)
SET LEVEL4=DATE
+12 IF HOW=5
SET LEVEL1=$$EXTERN(3,DFN)
SET LEVEL2=DATE
SET LEVEL3=$$EXTERN(1,CLIN)
+13 QUIT