| 1 | SCRPW71 ;BP-CIOFO/KEITH - Clinic appointment availability extract (cont.) ; 14 May 99  9:19 PM
 | 
|---|
| 2 |  ;;5.3;Scheduling;**192**;AUG 13, 1993
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | CLINIC(SC,SDFMT,SDSTRTDT,MAXDT,MAX,SDPAST) ;Evaluate a clinic
 | 
|---|
| 5 |  ;Input: SC=clinic ifn
 | 
|---|
| 6 |  ;Input: SDFMT='S' for totals only, 'D' for detail and totals
 | 
|---|
| 7 |  ;Input: SDSTRTDT=begin date for data extraction
 | 
|---|
| 8 |  ;Input: MAXDT=end date for data extraction
 | 
|---|
| 9 |  ;Input: MAX=number of days in date range
 | 
|---|
| 10 |  ;Input: SDPAST='0' for future dates, '1' for past dates
 | 
|---|
| 11 |  ;Output: # of slots found^maximum capacity^error condition (1=success,-1=failure)^comment (if failure) or sort value (if success)
 | 
|---|
| 12 |  N SC0,SDCP,X1,X2,X,%H,SDIV
 | 
|---|
| 13 |  S SC0=$G(^SC(SC,0)) Q:$P(SC0,U,3)'="C" "0^0^-1^Not a clinic location type"
 | 
|---|
| 14 |  Q:$P(SC0,U,17)="Y" "0^0^-1^Clinic defined as non-count"
 | 
|---|
| 15 |  Q:'$$CPAIR(SC0,.SDCP) "0^0^-1^Not a valid primary clinic Stop Code"
 | 
|---|
| 16 |  S X2=$P($G(^SC(SC,"SDP")),U,2) I X2 S X1=DT D C^%DTC S:X<MAXDT MAXDT=X
 | 
|---|
| 17 |  Q:'$$ACTC(SC,SDSTRTDT,MAXDT) "0^0^-1^Clinic is inactivated during these dates"
 | 
|---|
| 18 |  S SDIV=$$DIV(SC0) Q:'$L(SDIV) "0^0^-1^Invalid division number"
 | 
|---|
| 19 |  D SPAT(SC,SDSTRTDT,MAXDT)
 | 
|---|
| 20 |  Q $$CCNT(SC,MAX,SDCP,SDFMT,SDSTRTDT,SDIV,SDPAST)_"^1^"_SDCP_U_SC
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 | DIV(SC0) ;Get facility division name and number
 | 
|---|
| 23 |  ;Input: SC0=hospital location zeroeth node
 | 
|---|
| 24 |  N SDIV S SDIV=$P(SC0,U,15)
 | 
|---|
| 25 |  Q:SDIV>0 $P($$SITE^VASITE(,SDIV),U,2,3)
 | 
|---|
| 26 |  Q $P($$SITE^VASITE(),U,2,3)
 | 
|---|
| 27 |  ;
 | 
|---|
| 28 | CPAIR(SC0,SDCP) ;Validate primary stop code, get credit pair
 | 
|---|
| 29 |  ;Input: SC0=zeroeth node of HOSPITAL LOCATION record
 | 
|---|
| 30 |  ;Input: SDCP=variable to return clinic credit pair (pass by reference)
 | 
|---|
| 31 |  ;Output: 1=success, 0=invalid primary stop code
 | 
|---|
| 32 |  N SDSSC
 | 
|---|
| 33 |  S SDCP=$P($G(^DIC(40.7,+$P(SC0,U,7),0)),U,2),SDCP=$S(SDCP<100:0,SDCP>999:0,1:SDCP)
 | 
|---|
| 34 |  Q:SDCP'>0 0
 | 
|---|
| 35 |  S SDSSC=$P($G(^DIC(40.7,+$P(SC0,U,18),0)),U,2),SDCP=SDCP_$S(SDSSC<100:"000",SDSSC>999:"000",1:SDSSC)
 | 
|---|
| 36 |  Q 1
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 | ACTC(SC,SDSTRTDT,MAXDT) ;Determine if clinic is active during date range
 | 
|---|
| 39 |  ;Input: SC=clinic ifn
 | 
|---|
| 40 |  ;Input: SDSTRTDT=begin date for evaluation (TODAY+1)
 | 
|---|
| 41 |  ;Input: MAXDT=maximum date in the future to evaluate (end date)
 | 
|---|
| 42 |  ;Output: 1=active, 0=inactive during entire date range
 | 
|---|
| 43 |  N SDIN,SDRE,X1,X2,X,%H
 | 
|---|
| 44 |  S SDIN=$G(^SC(SC,"I")),SDRE=$P(SDIN,U,2),SDIN=$P(SDIN,U)
 | 
|---|
| 45 |  Q:SDIN<1 1  Q:SDIN>SDSTRTDT 1
 | 
|---|
| 46 |  I SDRE,SDRE'>MAXDT Q 1
 | 
|---|
| 47 |  Q 0
 | 
|---|
| 48 |  ;
 | 
|---|
| 49 | SPAT(SC,SDSTRTDT,ENDATE,SDS) ;Set patterns into ^TMP (modified clone of OVR^SDAUT1)
 | 
|---|
| 50 |  ;Input: SC=clinic ifn
 | 
|---|
| 51 |  ;Input: SDSTRTDT=start date for gathering patterns
 | 
|---|
| 52 |  ;Input: ENDATE=date in future to evaluate to
 | 
|---|
| 53 |  ;Input: SDS=array namespace subscript value (optional)
 | 
|---|
| 54 |  ;Output: array of clinic current availability patterns in
 | 
|---|
| 55 |  ;        ^TMP(SDS,$J,clinic_ifn,"ST",date,1)
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 |  S SDS=$G(SDS) S:'$L(SDS) SDS="SDTMP" K ^TMP(SDS,$J)
 | 
|---|
| 58 |  N SI,SDIN,SDRE,SDSOH,X,X1,X2,SM,I,D,J,Y,SS,DAY
 | 
|---|
| 59 |  S SDIN=$G(^SC(SC,"I")),SDRE=$P(SDIN,U,2),SDIN=$P(SDIN,U)
 | 
|---|
| 60 |  S DAY="SU^MO^TU^WE^TH^FR^SA"
 | 
|---|
| 61 |  S SI=$P($G(^SC(SC,"SL")),U,6),SI=$S(SI<3:4,1:SI)
 | 
|---|
| 62 |  S SDSOH=$S('$D(^SC(SC,"SL")):0,$P(^SC(SC,"SL"),"^",8)']"":0,1:1)
 | 
|---|
| 63 |  S SDIN=$G(SDIN),X=SDSTRTDT
 | 
|---|
| 64 | EN1 S:$O(^SC(SC,"T",0))>X X=$O(^SC(SC,"T",0))
 | 
|---|
| 65 |  S Y=$$DOW^XLFDT(X,1),I=Y+32,SM=X,D=Y D WM
 | 
|---|
| 66 |  K J F Y=0:1:6 I $D(^SC(+SC,"T"_Y)) S J(Y)=""
 | 
|---|
| 67 |  I '$D(J) D  Q
 | 
|---|
| 68 |  .S D=SDSTRTDT-1 F  S D=$O(^SC(SC,"ST",D)) Q:'D!(D>ENDATE)  D
 | 
|---|
| 69 |  ..S X=$G(^SC(SC,"ST",D,1)) S:$L(X) ^TMP(SDS,$J,SC,"ST",D,1)=X Q
 | 
|---|
| 70 |  .Q
 | 
|---|
| 71 | X1 Q:X>ENDATE  S X1=X\100_28
 | 
|---|
| 72 |  I '$$ACTIVE(X,SDIN,SDRE) S X1=X,X2=1 D C^%DTC G X1
 | 
|---|
| 73 | W S X=X\1
 | 
|---|
| 74 |  I $D(^SC(+SC,"ST",X,1)) S ^TMP(SDS,$J,SC,"ST",X,1)=^SC(+SC,"ST",X,1) G W1
 | 
|---|
| 75 |  I '$D(^SC(SC,"ST",X,1)) S Y=D#7 G L:'$D(J(Y)),H:$D(^HOLIDAY(X))&('SDSOH) S SS=$O(^SC(SC,"T"_Y,X)) G L:SS<1,L:^SC(SC,"T"_Y,SS,1)="" D
 | 
|---|
| 76 |  .S ^TMP(SDS,$J,SC,"ST",X\1,1)=$P(DAY,U,Y+1)_" "_$E(X,6,7)_$J("",SI+SI-6)_^SC(SC,"T"_Y,SS,1) Q
 | 
|---|
| 77 | W1 D WM:X>SM
 | 
|---|
| 78 | L Q:X>ENDATE  S X=X+1,D=D+1 G W:X'>X1 S X2=X-X1 D C^%DTC G X1
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 | H S ^TMP(SDS,$J,SC,"ST",X,1)="   "_$E(X,6,7)_"    "_$P(^(X,0),U,2) G W1
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 | WM S SM=$S($E(X,4,5)[12:$E(X,1,3)+1_"01",1:$E(X,1,3)_$E(X,4,5)+1)_"00" Q
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 | ACTIVE(X,SDIN,SDRE) ;Determine if the clinic is active on a given date
 | 
|---|
| 85 |  ;Input: X=date to be examined
 | 
|---|
| 86 |  ;Input: SDIN=clinic inactive date
 | 
|---|
| 87 |  ;Input: SDRE=clinic reactivate date
 | 
|---|
| 88 |  ;Output: '1'=active, '0'=inactive
 | 
|---|
| 89 |  Q:'SDIN 1  Q:X<SDIN 1  Q:'SDRE 0  Q:X<SDRE 0  Q 1
 | 
|---|
| 90 |  ;
 | 
|---|
| 91 | INIT ;Initialize array for counting patterns
 | 
|---|
| 92 |  K SD N SDI
 | 
|---|
| 93 |  S SD="123456789jklmnopqrstuvwxyz"
 | 
|---|
| 94 |  F I=1:1:26 S SD($E(SD,I))=I
 | 
|---|
| 95 |  Q
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 | CCNT(SC,MAX,SDCP,SDFMT,SDSTRTDT,SDIV,SDPAST) ;Count clinic availability and capacity
 | 
|---|
| 98 |  ;Input: SC=clinic ifn
 | 
|---|
| 99 |  ;Input: MAX=maximum days to evaluate availability
 | 
|---|
| 100 |  ;Input: SDCP=credit pair
 | 
|---|
| 101 |  ;Input: SDFMT=report format
 | 
|---|
| 102 |  ;Input: SDSTRTDT=begin date of report
 | 
|---|
| 103 |  ;Input: SDIV=clinic division number
 | 
|---|
| 104 |  ;Input: SDPAST='0' for future dates, '1' for past dates
 | 
|---|
| 105 |  ;Output: total # of open slots found^maximum capacity
 | 
|---|
| 106 |  ;Output: Creates an array of:
 | 
|---|
| 107 |  ;        ^TMP("SD",$J,SDIV,SDCP)=open slots^maximum capacity^encounters
 | 
|---|
| 108 |  ;        ^TMP("SD",$J,SDIV,SDCP,SC)=open slots^maximum capacity^encounters
 | 
|---|
| 109 |  ;        ^TMP("SD",$J,SDIV,SDCP,SC,sub)=slots~capacity~encounters^slots~capacity~encounters ... etc. (up to 12 slots~capacity~encounters values)
 | 
|---|
| 110 |  ;                               where 'sub' is a number 0 to nnn, 'sub' * 12 + "^" $PIECE where the data
 | 
|---|
| 111 |  ;                               is stored equals the day which that data represents.
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 |  N SDTOE
 | 
|---|
| 114 |  S SDTOE=U_$P($G(^TMP("SD",$J,SDIV,SDCP,SC)),U,3) S:$L(SDTOE)=1 SDTOE=""
 | 
|---|
| 115 |  Q:'$D(^TMP("SDTMP",$J)) "0^0"_SDTOE
 | 
|---|
| 116 |  D:'$D(^TMP("SD",$J,SDIV,SDCP,SC)) ARRINI(SDCP,SC,MAX,SDPAST)
 | 
|---|
| 117 |  N SDDAY,SDI,SDPATT,SDTSL,SDSL,SDTCAP,SDCAP,SDY
 | 
|---|
| 118 |  S X1=SDSTRTDT,X2=-1 D C^%DTC S SDY=X
 | 
|---|
| 119 |  S (SDTSL,SDTCAP)=0 F SDI=1:1:MAX D
 | 
|---|
| 120 |  .S (SDSL,SDCAP)=0,X1=SDY,X2=SDI D C^%DTC S SDDAY=X
 | 
|---|
| 121 |  .;Count open slots
 | 
|---|
| 122 |  .S SDPATT=$E($G(^TMP("SDTMP",$J,SC,"ST",SDDAY,1)),6,999)
 | 
|---|
| 123 |  .I SDPATT["[" D
 | 
|---|
| 124 |  ..S SDSL=$$PCT(SDPATT),SDTSL=SDTSL+SDSL
 | 
|---|
| 125 |  ..;Count maximum slots
 | 
|---|
| 126 |  ..N X,%H,%T,%Y,SDDW,SDMPDT
 | 
|---|
| 127 |  ..S SDCAP=0
 | 
|---|
| 128 |  ..S SDPATT=$E($G(^SC(SC,"OST",SDDAY,1)),6,999) I $L(SDPATT) S SDCAP=$$PCT(SDPATT),SDTCAP=SDTCAP+SDCAP Q:SDCAP
 | 
|---|
| 129 |  ..S X=SDDAY D H^%DTC S SDDW="T"_%Y,SDMPDT=$O(^SC(SC,SDDW,SDDAY))
 | 
|---|
| 130 |  ..S SDPATT=$G(^SC(SC,SDDW,+SDMPDT,1)),SDCAP=$$PCT(SDPATT),SDTCAP=SDTCAP+SDCAP
 | 
|---|
| 131 |  ..Q
 | 
|---|
| 132 |  .D:SDFMT="D" ARRSET(SDCP,SC,SDI,SDSL,SDCAP) Q
 | 
|---|
| 133 |  S $P(^TMP("SD",$J,SDIV,SDCP),U)=$P(^TMP("SD",$J,SDIV,SDCP),U)+SDTSL
 | 
|---|
| 134 |  S $P(^TMP("SD",$J,SDIV,SDCP),U,2)=$P(^TMP("SD",$J,SDIV,SDCP),U,2)+SDTCAP
 | 
|---|
| 135 |  S $P(^TMP("SD",$J,SDIV,SDCP,SC),U)=$P(^TMP("SD",$J,SDIV,SDCP,SC),U)+SDTSL
 | 
|---|
| 136 |  S $P(^TMP("SD",$J,SDIV,SDCP,SC),U,2)=$P(^TMP("SD",$J,SDIV,SDCP,SC),U,2)+SDTCAP
 | 
|---|
| 137 |  I SDPAST D
 | 
|---|
| 138 |  .S $P(^TMP("SD",$J,SDIV,SDCP),U,3)=$P(^TMP("SD",$J,SDIV,SDCP),U,3)+0
 | 
|---|
| 139 |  .S $P(^TMP("SD",$J,SDIV,SDCP,SC),U,3)=$P(^TMP("SD",$J,SDIV,SDCP,SC),U,3)+0 Q
 | 
|---|
| 140 |  Q SDTSL_U_SDTCAP_SDTOE
 | 
|---|
| 141 |  ;
 | 
|---|
| 142 | PCT(SDPATT) ;Pattern count
 | 
|---|
| 143 |  ;Input: SDPATT=pattern to evaluate
 | 
|---|
| 144 |  Q:SDPATT'["[" 0
 | 
|---|
| 145 |  N X,I S X=0
 | 
|---|
| 146 |  S SDPATT=$TR(SDPATT," |[]","")
 | 
|---|
| 147 |  F I=1:1:$L(SDPATT) S X=X+$G(SD($E(SDPATT,I)))
 | 
|---|
| 148 |  Q X
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 | ARRINI(SDCP,SC,MAX,SDPAST) ;Initialize array for counts
 | 
|---|
| 151 |  ;Input: SDCP=credit pair
 | 
|---|
| 152 |  ;Input: SC=clinic ifn
 | 
|---|
| 153 |  ;Input: MAX=maximum days to report
 | 
|---|
| 154 |  ;Input: SDPAST='0' for future dates, '1' for past dates
 | 
|---|
| 155 |  N SDI,SDX,SDY,SDS,SDP
 | 
|---|
| 156 |  S SDY="0~0" S:SDPAST SDY=SDY_"~0"
 | 
|---|
| 157 |  S SDX="" F SDI=1:1:(2+SDPAST) S $P(SDX,U,SDI)=0
 | 
|---|
| 158 |  S:'$D(^TMP("SD",$J,SDIV,SDCP)) ^TMP("SD",$J,SDIV,SDCP)=SDX
 | 
|---|
| 159 |  S ^TMP("SD",$J,SDIV,SDCP,SC)=SDX Q:SDFMT'="D"
 | 
|---|
| 160 |  F SDI=0:1:(MAX-1\12) S ^TMP("SD",$J,SDIV,SDCP,SC,SDI)=""
 | 
|---|
| 161 |  F SDI=1:1:MAX D
 | 
|---|
| 162 |  .S SDS=SDI-1\12,SDP=SDI#12 S:SDP=0 SDP=12
 | 
|---|
| 163 |  .S $P(^TMP("SD",$J,SDIV,SDCP,SC,SDS),U,SDP)=SDY
 | 
|---|
| 164 |  .Q
 | 
|---|
| 165 |  Q
 | 
|---|
| 166 |  ;
 | 
|---|
| 167 | ARRSET(SDCP,SC,SDI,SDSL,SDCAP) ;Set daily counts into array
 | 
|---|
| 168 |  ;Input: SDCP=credit pair
 | 
|---|
| 169 |  ;Input: SC=clinic ifn
 | 
|---|
| 170 |  ;Input: SDI=number of days from report date
 | 
|---|
| 171 |  ;Input: SDSL=number of open slots for day SDI
 | 
|---|
| 172 |  ;Input: SDCAP=maximum slots for day SDI
 | 
|---|
| 173 |  N SDS,SDP,SDX
 | 
|---|
| 174 |  S SDS=SDI-1\12,SDP=SDI#12 S:SDP=0 SDP=12
 | 
|---|
| 175 |  S SDX=$P(^TMP("SD",$J,SDIV,SDCP,SC,SDS),U,SDP)
 | 
|---|
| 176 |  S $P(SDX,"~")=$P(SDX,"~")+SDSL
 | 
|---|
| 177 |  S $P(SDX,"~",2)=$P(SDX,"~",2)+SDCAP
 | 
|---|
| 178 |  I $G(SDPAST),$P(SDX,"~",3)="" S $P(SDX,"~",3)=0
 | 
|---|
| 179 |  S $P(^TMP("SD",$J,SDIV,SDCP,SC,SDS),U,SDP)=SDX
 | 
|---|
| 180 |  Q
 | 
|---|
| 181 |  ;
 | 
|---|
| 182 | PCNT(X) ;Count open slots in a pattern
 | 
|---|
| 183 |  ;Input: X=^SC(SC,"ST",SDT,1) node
 | 
|---|
| 184 |  ;Output: number of open slots in a single date pattern
 | 
|---|
| 185 |  N I,CT
 | 
|---|
| 186 |  S CT=0 Q:X'["[" CT
 | 
|---|
| 187 |  S X=$E(X,6,999),X=$TR(X,"|[] ","")
 | 
|---|
| 188 |  F I=1:1:$L(X) S CT=CT+$G(SD($E(X,I)))
 | 
|---|
| 189 |  Q CT
 | 
|---|