| 1 | SDMANA ;BP-CIOFO/KEITH - Make Appointment 'Next Available' functionality ; 30 Nov 99  2:38 PM
 | 
|---|
| 2 |  ;;5.3;Scheduling;**206**;AUG 13, 1993
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | NAVA(SC,SDT,SDUR) ;Compute 'next available' indicator
 | 
|---|
| 5 |  ;Input: SC=clinic ifn
 | 
|---|
| 6 |  ;Input: SDT=date of appointment being scheduled
 | 
|---|
| 7 |  ;Input: SDUR=User response (optional)
 | 
|---|
| 8 |  ;            'N' for user defined 'next available' scheduling request
 | 
|---|
| 9 |  ;            'C' other than 'next available' at clinician request
 | 
|---|
| 10 |  ;            'P' other than 'next available' at patient request
 | 
|---|
| 11 |  ;            'W' for walkin (unscheduled) appointment
 | 
|---|
| 12 |  ;            'M' for multiple appointment booking
 | 
|---|
| 13 |  ;            'A' for auto rebook
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 |  ;Output: '0' = not defined or computed to be a 'next available' appt.
 | 
|---|
| 16 |  ;        '1' = user defined 'next available' scheduling request
 | 
|---|
| 17 |  ;        '2' = computed to be a 'next available' appointment
 | 
|---|
| 18 |  ;        '3' = user defined and computed to be 'next available' appt.
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 |  N SD,SDAY,SDOUT,SDIND
 | 
|---|
| 21 |  ;Initialize variables
 | 
|---|
| 22 |  S SDUR=$G(SDUR),SDT=SDT\1,(SDOUT,SDIND)=0 D INIT
 | 
|---|
| 23 |  I SC'>0!'SDT!(SDT<DT) Q SDIND  ;Check input variables
 | 
|---|
| 24 |  S SDAY=DT F  D  Q:SDOUT
 | 
|---|
| 25 |  .I $$PCNT($$PAT(SC,SDAY)) S SDOUT=1,SDIND=$$IND(SDT,SDAY,SDUR) Q
 | 
|---|
| 26 |  .S SDAY=$$FMADD^XLFDT(SDAY,1)  ;Increment days
 | 
|---|
| 27 |  .I SDAY>SDT S SDOUT=1,SDIND=$$IND(SDT,SDAY,SDUR)
 | 
|---|
| 28 |  .Q
 | 
|---|
| 29 |  Q SDIND
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 | IND(SDT,SDAY,SDUR) ;Compute indicator
 | 
|---|
| 32 |  ;Input/Output: as described in NAVA entry point
 | 
|---|
| 33 |  Q $S(SDAY=SDT:2,1:0)+$S(SDUR="N":1,1:0)
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 | PAT(SC,SDT) ;Return pattern for specified date (modified clone of OVR^SDAUT1)
 | 
|---|
| 36 |  ;Input: SC=clinic ifn
 | 
|---|
| 37 |  ;Input: SDT=date of pattern
 | 
|---|
| 38 |  ;Output: Current availability pattern for date selected
 | 
|---|
| 39 |  ;        in the format of ^SC(clinic,"ST",date,1) nodes
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 |  N SDI,SDIN,SDRE,SDSOH,SDD,SDJ,SDY,SDS,SDAY
 | 
|---|
| 42 |  S SDT=SDT\1
 | 
|---|
| 43 |  ;Inactivate/reactivate dates
 | 
|---|
| 44 |  S SDIN=$G(^SC(SC,"I")),SDRE=$P(SDIN,U,2),SDIN=$P(SDIN,U)
 | 
|---|
| 45 |  I '$$ACTIVE(SDT,SDIN,SDRE) Q ""  ;Quit if not active on this date
 | 
|---|
| 46 |  S SDAY="SU^MO^TU^WE^TH^FR^SA" ;Day abbreviations
 | 
|---|
| 47 |  S SDI=$P($G(^SC(SC,"SL")),U,6),SDI=$S(SDI<3:4,1:SDI) ;Increments/hour
 | 
|---|
| 48 |  ;Schedule on holidays?
 | 
|---|
| 49 |  S SDSOH=$S('$D(^SC(SC,"SL")):0,$P(^SC(SC,"SL"),"^",8)']"":0,1:1)
 | 
|---|
| 50 |  Q:$O(^SC(SC,"T",0))>SDT ""  ;Earlier than first availability date
 | 
|---|
| 51 |  S SDD=$$DOW^XLFDT(SDT,1)  ;Day of week
 | 
|---|
| 52 |  K SDJ F SDY=0:1:6 I $D(^SC(+SC,"T"_SDY)) S SDJ(SDY)=""  ;Patterns
 | 
|---|
| 53 |  I $D(^SC(+SC,"ST",SDT,1)) Q ^SC(+SC,"ST",SDT,1)  ;Current availability
 | 
|---|
| 54 |  ;No ava. on file, quit if no pattern
 | 
|---|
| 55 |  I '$D(^SC(SC,"ST",SDT,1)) S SDY=SDD#7 Q:'$D(SDJ(SDY)) ""
 | 
|---|
| 56 |  ;Quit if holiday and no schedule
 | 
|---|
| 57 |  Q:$D(^HOLIDAY(SDT))&('SDSOH) "   "_$E(SDT,6,7)_"    "_$P(^(SDT,0),U,2)
 | 
|---|
| 58 |  ;Create availability string, quit if no pattern
 | 
|---|
| 59 |  S SDS=$O(^SC(SC,"T"_SDY,SDT)) Q:SDS<1 ""
 | 
|---|
| 60 |  Q:(^SC(SC,"T"_SDY,SDS,1)="") ""
 | 
|---|
| 61 |  Q $P(SDAY,U,SDY+1)_" "_$E(SDT,6,7)_$J("",SDI+SDI-6)_^SC(SC,"T"_SDY,SDS,1)
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 | ACTIVE(X,SDIN,SDRE) ;Determine if the clinic is active on a given date
 | 
|---|
| 64 |  ;Input: X=date to be examined
 | 
|---|
| 65 |  ;Input: SDIN=clinic inactive date
 | 
|---|
| 66 |  ;Input: SDRE=clinic reactivate date
 | 
|---|
| 67 |  ;Output: '1'=active, '0'=inactive
 | 
|---|
| 68 |  Q:'SDIN 1  Q:X<SDIN 1  Q:'SDRE 0  Q:X<SDRE 0  Q 1
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 | INIT ;Initialize array for counting patterns
 | 
|---|
| 71 |  K SD N SDI
 | 
|---|
| 72 |  S SD="123456789jklmnopqrstuvwxyz"
 | 
|---|
| 73 |  F I=1:1:26 S SD($E(SD,I))=I
 | 
|---|
| 74 |  Q
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 | PCNT(X) ;Count open slots in a pattern
 | 
|---|
| 77 |  ;Input: X=clinic availability pattern
 | 
|---|
| 78 |  ;Output: number of open slots in a single date pattern
 | 
|---|
| 79 |  N I,CT
 | 
|---|
| 80 |  S CT=0 Q:X'["[" CT
 | 
|---|
| 81 |  S X=$E(X,6,999),X=$TR(X,"|[] ","")
 | 
|---|
| 82 |  F I=1:1:$L(X) S CT=CT+$G(SD($E(X,I)))
 | 
|---|
| 83 |  Q CT
 | 
|---|