[796] | 1 | TMGSDAU2 ;TMG/kst/Schedule Availability Utilities 2;12/22/08
|
---|
| 2 | ;;1.0;TMG-LIB;**1**;12/22/08
|
---|
| 3 | ;
|
---|
| 4 | ;"TMG SCHEDULING UTILITIES 2
|
---|
| 5 | ;"Kevin Toppenberg MD
|
---|
| 6 | ;"GNU General Public License (GPL) applies
|
---|
| 7 | ;"01/12/09
|
---|
| 8 | ;
|
---|
| 9 | ;"=======================================================================
|
---|
| 10 | ;" API -- Public Functions.
|
---|
| 11 | ;"=======================================================================
|
---|
| 12 | ;"GETDFN(PATIENT) -- return DFN value for patient
|
---|
| 13 | ;"GETCLIEN(CLINIC) - return Clinics IEN value for patient
|
---|
| 14 | ;"GETDATE(APPT) - return a FM Date-time formated value
|
---|
| 15 | ;"FILLAVAL(TMGIEN,PARRAY,TMG1DATE,TMGLIMDT,TMGERR,TMGMSG) --Fill in AVAILABILITY subfile ("T" node)
|
---|
| 16 | ;"KILLAVAL(TMGIEN,TMG1DATE,TMGLIMDT,TMGFLAGS) -- Delete AVAILABILITY ("T") node, and any linked "ST" and "OST" nodes.
|
---|
| 17 | ;"KILL1DATE(TMGIEN,TMG1DATE,FULL) -- remove 1 "T" node, and any linked ST and OST nodes
|
---|
| 18 | ;"STR2PAT(TMGIEN,STR,PARRAY) -- Convert a template pattern into an array of times.
|
---|
| 19 | ;"FRAC2TIM(TIME,HRS,MINS) -- Convert Fractional time --> Hrs & Min e.g. 3.75 --> 3 & 45 (i.e. 3:45)
|
---|
| 20 | ;"CH2NAVAL(CH)-- convert a given availability character into number of slots there.
|
---|
| 21 | ;
|
---|
| 22 | ;"=======================================================================
|
---|
| 23 | ;"Dependancies
|
---|
| 24 | ;"=======================================================================
|
---|
| 25 | ;
|
---|
| 26 | ;"=======================================================================
|
---|
| 27 | ;
|
---|
| 28 | GETDFN(PATIENT)
|
---|
| 29 | ;"Purpose: return DFN value for patient
|
---|
| 30 | ;" This is a much simpler function that TMGGDFN, different purpose
|
---|
| 31 | ;"Input: PATIENT. Either a patient name (must be unique) or IEN
|
---|
| 32 | ;"Results: IEN in PATIENT file, or -101^Message
|
---|
| 33 | ;
|
---|
| 34 | NEW RESULT SET RESULT=0
|
---|
| 35 | SET PATIENT=$GET(PATIENT)
|
---|
| 36 | IF PATIENT="" DO GOTO GDDONE
|
---|
| 37 | . SET RESULT="-101^Patient not specified."
|
---|
| 38 | IF +PATIENT=PATIENT SET RESULT=PATIENT
|
---|
| 39 | ELSE DO
|
---|
| 40 | . NEW TMG2MSG
|
---|
| 41 | . DO FIND^DIC(2,,".01","MP",ANAME,"*","","","","TMG2MSG")
|
---|
| 42 | . NEW NUM SET NUM=+$GET(TMG2MSG("DILIST",0))
|
---|
| 43 | . IF NUM=0 DO QUIT
|
---|
| 44 | . . SET RESULT="-101^Patient name: '"_PATIENT_"' NOT FOUND"
|
---|
| 45 | . IF NUM>1 DO QUIT
|
---|
| 46 | . . SET TMGMSG(TMGMSG)="-101^Name: "_PATIENT_" Not specific. Multiple patients with this name exist."
|
---|
| 47 | . SET RESULT=+$GET(TMG2MSG("DILIST",1,0))
|
---|
| 48 | GDDONE ;
|
---|
| 49 | QUIT RESULT
|
---|
| 50 | ;
|
---|
| 51 | ;
|
---|
| 52 | GETCLIEN(CLINIC)
|
---|
| 53 | ;"Purpose: return Clinics IEN value for patient
|
---|
| 54 | ;"Input: CLINIC -- Name, or IEN, of Clinic for appt (file 44)
|
---|
| 55 | ;"Results: IEN in HOSPITAL LOCATION (44), or -102^Message
|
---|
| 56 | NEW RESULT
|
---|
| 57 | SET CLINIC=$GET(CLINIC)
|
---|
| 58 | IF CLINIC="" DO GOTO GCLDONE
|
---|
| 59 | . SET RESULT="-102^Clinic location not provided."
|
---|
| 60 | IF +CLINIC=CLINIC SET RESULT=CLINIC
|
---|
| 61 | ELSE DO
|
---|
| 62 | . NEW DIC,X,Y
|
---|
| 63 | . SET DIC=44,DIC(0)="M"
|
---|
| 64 | . SET X=CLINIC DO ^DIC
|
---|
| 65 | . IF +Y>0 SET RESULT=+Y
|
---|
| 66 | . ELSE SET RESULT="-102^'"_CLINIC_"' clinic location NOT FOUND."
|
---|
| 67 | GCLDONE ;
|
---|
| 68 | QUIT RESULT
|
---|
| 69 | ;
|
---|
| 70 | ;
|
---|
| 71 | GETDATE(APPT)
|
---|
| 72 | ;"Purpose: return a FM Date-time formated value
|
---|
| 73 | ;"Input: APPT -- Desired Appointment Date & Time -- External, or FM format
|
---|
| 74 | ;"Results: FM Date-Time entry or -1^Message
|
---|
| 75 | ;
|
---|
| 76 | NEW RESULT
|
---|
| 77 | SET APPT=$GET(APPT)
|
---|
| 78 | IF APPT="" DO GOTO GAPDONE
|
---|
| 79 | . SET RESULT="-1^Date and time not provided"
|
---|
| 80 | IF +APPT=APPT SET RESULT=APPT
|
---|
| 81 | ELSE DO
|
---|
| 82 | . DO DT^DILF("T",APPT,.RESULT)
|
---|
| 83 | . IF RESULT=-1 SET RESULT="-1^'"_APPT_"' is not a valid Date-Time"
|
---|
| 84 | GAPDONE ;
|
---|
| 85 | QUIT RESULT
|
---|
| 86 | ;
|
---|
| 87 | ;
|
---|
| 88 | FILLAVAL(TMGIEN,PARRAY,TMG1DATE,TMGLIMDT,TMGERR,TMGMSG)
|
---|
| 89 | ;"Purpose: Fill in AVAILABILITY subfile ("T" node), specifying number
|
---|
| 90 | ;" of patients allowed in each slot
|
---|
| 91 | ;" Note: This creates entries for each slot, 1 for each time slot.
|
---|
| 92 | ;" The T node does not store an ending date for the pattern.
|
---|
| 93 | ;" It appears to apply until a next date is encountered (if any)
|
---|
| 94 | ;" Also, this is set for cases where set days are being specified
|
---|
| 95 | ;" as well as when date ranges are specified.
|
---|
| 96 | ;"Input: TMGIEN -- IEN in HOSPITAL LOCATION file.
|
---|
| 97 | ;" PARRAY -- PASS BY NAME. Array containing time data. e.g.:
|
---|
| 98 | ;" @PARRAY@("0800-0810")=2
|
---|
| 99 | ;" @PARRAY@("0830-0850")=1
|
---|
| 100 | ;" @PARRAY@("0900-0930")=1
|
---|
| 101 | ;" @PARRAY@("1000-1140")=1
|
---|
| 102 | ;" TMG1DATE -- Starting date of a range to put entry into
|
---|
| 103 | ;" TMGLIMDT -- Limit date of date range.
|
---|
| 104 | ;" TMGERR -- PASS BY REFERANCE
|
---|
| 105 | ;" TMGMSG -- PASS BY REFERANCE
|
---|
| 106 | ;"Globally Scoped vars used: ...
|
---|
| 107 | ;"Result: NONE
|
---|
| 108 | ;"Note: It is presumed record locking has already occured
|
---|
| 109 | ;"Note: It is assumed that prior "T" nodes are gone,
|
---|
| 110 | ;" which may be achieved by DO KILLAVAL(TMG1DATE,TMGLIMDT,TMGFLAGS)
|
---|
| 111 | ;
|
---|
| 112 | NEW STARTDAY SET STARTDAY=+$P($GET(^SC(TMGIEN,"SL")),"^",3) ;"SL;3=HR CLINIC DISPLAY BEGINS
|
---|
| 113 | IF STARTDAY'>0 SET STARTDAY=8 ;"Default to start at 8 am
|
---|
| 114 | ;
|
---|
| 115 | ;"--Delete all preexisting T nodes in new date range-- SHOULD ALREADY BE DONE VIA KILLAVAL
|
---|
| 116 | ;
|
---|
| 117 | FA1 ;" -- Set up T nodes for new date range --
|
---|
| 118 | NEW LASTTIME SET LASTTIME=STARTDAY*100
|
---|
| 119 | NEW COUNT SET COUNT=0
|
---|
| 120 | NEW TMGTIMES SET TMGTIMES=""
|
---|
| 121 | FOR SET TMGTIMES=$ORDER(@PARRAY@(TMGTIMES)) QUIT:(TMGTIMES="")!TMGERR DO
|
---|
| 122 | . NEW T1,T2,MIN,H1,H2,M1,M2
|
---|
| 123 | . SET T1=$P(TMGTIMES,"-",1)
|
---|
| 124 | . SET T2=$P(TMGTIMES,"-",2)
|
---|
| 125 | . ;"process individual times.
|
---|
| 126 | . NEW APTSPER SET APTSPER=+$GET(@PARRAY@(TMGTIMES))
|
---|
| 127 | . SET LASTTIME=T2
|
---|
| 128 | . DO MILSUB^TMGSDAU1(.T2,TMGSDUR,.H2,.M2)
|
---|
| 129 | . DO MILADD^TMGSDAU1(.T1,0,.H1,.M1)
|
---|
| 130 | . FOR DO QUIT:(T1>T2)
|
---|
| 131 | . . SET COUNT=COUNT+1
|
---|
| 132 | . . ;"Store Time^#ApptsInSlot in "T" node
|
---|
| 133 | . . SET ^SC(TMGIEN,"T",TMG1DATE,2,COUNT,0)=H1_M1_"^"_APTSPER
|
---|
| 134 | . . DO MILADD^TMGSDAU1(.T1,TMGSDUR,.H1,.M1)
|
---|
| 135 | SET ^SC(TMGIEN,"T",TMG1DATE,0)=TMG1DATE
|
---|
| 136 | ;" -- Set subsubfile header --
|
---|
| 137 | SET ^SC(TMGIEN,"T",TMG1DATE,2,0)="^44.004A^"_COUNT_"^"_COUNT
|
---|
| 138 | ;
|
---|
| 139 | ;" -- Set subfile header --
|
---|
| 140 | NEW DATE SET DATE=0
|
---|
| 141 | NEW COUNT SET COUNT=0
|
---|
| 142 | NEW LAST SET LAST=0
|
---|
| 143 | FOR SET DATE=+$ORDER(^SC(TMGIEN,"T",DATE)) QUIT:(DATE'>0) DO
|
---|
| 144 | . SET LAST=DATE
|
---|
| 145 | . SET COUNT=COUNT+1
|
---|
| 146 | SET $PIECE(^SC(TMGIEN,"T",0),"^",3)=LAST
|
---|
| 147 | SET $PIECE(^SC(TMGIEN,"T",0),"^",4)=COUNT
|
---|
| 148 | ;
|
---|
| 149 | QUIT
|
---|
| 150 | ;
|
---|
| 151 | ;
|
---|
| 152 | KILLAVAL(TMGIEN,TMG1DATE,TMGLIMDT,TMGFLAGS)
|
---|
| 153 | ;"Purpose: Delete AVAILABILITY ("T") node, and any linked "ST" and "OST" nodes.
|
---|
| 154 | ;"Input: TMGIEN -- IEN in HOSPITAL LOCATION file.
|
---|
| 155 | ;" TMG1DATE -- Starting date of a range to put entry into
|
---|
| 156 | ;" TMGLIMDT -- Limit date of date range.
|
---|
| 157 | ;" TMGFLAGS -- flags
|
---|
| 158 | ;"Globally Scoped vars used: ...
|
---|
| 159 | ;"Note: It is presumed record locking has already occured
|
---|
| 160 | ;
|
---|
| 161 | ;"Only delete "2" subnode. Leave "0" node in place to prevent extending
|
---|
| 162 | ;"date range of entry occuring before this one.
|
---|
| 163 | ;"Only delete entries falling on same day of week as TMG1DATE
|
---|
| 164 | ;
|
---|
| 165 | IF TMGFLAGS["R" DO
|
---|
| 166 | . NEW DATE SET DATE=TMG1DATE
|
---|
| 167 | . FOR DO SET DATE=$$ADD2DATE^TMGSDAU1(DATE,7) QUIT:(DATE'<TMGLIMDT)!(DATE'<DT+50000)
|
---|
| 168 | . . DO KILL1DATE(TMGIEN,DATE)
|
---|
| 169 | ELSE DO
|
---|
| 170 | . DO KILL1DATE(TMGIEN,TMG1DATE)
|
---|
| 171 | QUIT
|
---|
| 172 | ;
|
---|
| 173 | ;
|
---|
| 174 | KILL1DATE(TMGIEN,TMG1DATE,FULL)
|
---|
| 175 | ;"Purpose: To remove 1 "T" node, and any linked ST and OST nodes
|
---|
| 176 | ;"Input: TMGIEN -- IEN in HOSPITAL LOCATION file.
|
---|
| 177 | ;" TMG1DATE -- the date to remove
|
---|
| 178 | ;" FULL -- OPTIONAL. if 1 then entire T node removed, otherwise 0 node is left.
|
---|
| 179 | ;"Globally-scoped var used: ...
|
---|
| 180 | ;"Note: It is presumed record locking has already occured
|
---|
| 181 | KILL ^SC(TMGIEN,"T",DATE,2)
|
---|
| 182 | IF $DATA(^SC(TMGIEN,"ST",DATE)) DO
|
---|
| 183 | . IF $DATA(^SC(TMGIEN,"ST",DATE,9)) DO
|
---|
| 184 | . . KILL ^SC(TMGIEN,"OST",DATE)
|
---|
| 185 | . KILL ^SC(TMGIEN,"ST",DATE)
|
---|
| 186 | IF $GET(FULL)=1 KILL ^SC(TMGIEN,"T",DATE)
|
---|
| 187 | QUIT
|
---|
| 188 | ;
|
---|
| 189 | ;
|
---|
| 190 | AVAIL4DAT(TMGIEN,TMG1DATE,PARRAY)
|
---|
| 191 | ;"Purpose: To generage an array with slot time data for a given date, based on templates
|
---|
| 192 | ;" This PARRAY could be suitable for generating a "T" node entry
|
---|
| 193 | ;"Input: TMGIEN -- IEN in HOSPITAL LOCATION file.
|
---|
| 194 | ;" TMG1DATE -- the appointment date to look up. Don't pass by reference
|
---|
| 195 | ;" PARRAY -- PASS BY NAME. An OUT PARAMETER (prior contents killed)
|
---|
| 196 | ;" Output format: Array containing time data. e.g.:
|
---|
| 197 | ;" @PARRAY@("0800-0810")=2
|
---|
| 198 | ;" @PARRAY@("0830-0850")=1
|
---|
| 199 | ;" @PARRAY@("0900-0930")=1
|
---|
| 200 | ;" @PARRAY@("1000-1140")=1
|
---|
| 201 | ;"Results: 1=success, -1^Msg=error
|
---|
| 202 | ;"Output: @PARRAY is filled as above
|
---|
| 203 | ;
|
---|
| 204 | NEW TMGRESULT SET TMGRESULT=1 ;"Default to success
|
---|
| 205 | SET TMG1DATE=TMG1DATE\1
|
---|
| 206 | KILL @PARRAY
|
---|
| 207 | ;
|
---|
| 208 | ;"First see if a Special pattern exists for date in "OST" note
|
---|
| 209 | NEW STR SET STR=$GET(^SC(TMGIEN,"OST",TMG1DATE,1))
|
---|
| 210 | IF STR'="" DO GOTO A4DDONE
|
---|
| 211 | . SET STR=$PIECE(STR,"|",2,999)
|
---|
| 212 | . DO STR2PAT(TMGIEN,STR,PARRAY)
|
---|
| 213 | ;
|
---|
| 214 | ;"FIND APPLICABLE TEMPLATE (Tx NODE)
|
---|
| 215 | NEW DOW SET DOW=$$DOW^XLFDT(TMG1DATE,1) ;"DOW=Day of Week (0-6)
|
---|
| 216 | NEW DATE SET DATE=TMG1DATE
|
---|
| 217 | SET DATE=$ORDER(^SC(TMGIEN,"T"_DOW,TMG1DATE))
|
---|
| 218 | IF DATE="" DO GOTO A4DDONE
|
---|
| 219 | . SET TMGRESULT="-1^NO TEMPLATE FOUND FOR DATE"
|
---|
| 220 | SET STR=$GET(^SC(TMGIEN,"T"_DOW,DATE,1))
|
---|
| 221 | IF STR="" DO GOTO A4DDONE
|
---|
| 222 | . SET TMGRESULT="-1^NO VALID TEMPLATE FOUND FOR DATE"
|
---|
| 223 | DO STR2PAT(TMGIEN,STR,PARRAY)
|
---|
| 224 | ;
|
---|
| 225 | A4DDONE QUIT TMGRESULT
|
---|
| 226 | ;
|
---|
| 227 | ;
|
---|
| 228 | STR2PAT(TMGIEN,STR,PARRAY)
|
---|
| 229 | ;"Purpose: Convert a template pattern into an array of times.
|
---|
| 230 | ;"Input: TMGIEN -- IEN in file 44
|
---|
| 231 | ;" STR -- Template pattern (Note that DAY DATE is *NOT* at beginning of line)
|
---|
| 232 | ;" E.g. | [1] [1 1 1 1 1] [1 1 1 1 1] | | [1] [1 1] [1 1 1 1 1] [1 1 1 1 1] [1 1 1] "
|
---|
| 233 | ;" PARRAY -- PASS BY NAME. An OUT PARAMETER (prior contents killed)
|
---|
| 234 | ;" Output format: Array containing time data. e.g.:
|
---|
| 235 | ;" @PARRAY@("0800-0810")=2
|
---|
| 236 | ;" @PARRAY@("0830-0850")=1
|
---|
| 237 | ;" @PARRAY@("0900-0930")=1
|
---|
| 238 | ;" @PARRAY@("1000-1140")=1
|
---|
| 239 | ;"Globally-scoped vars used: ...
|
---|
| 240 | ;"Result: 1 if OK, -1 if error
|
---|
| 241 | ;
|
---|
| 242 | NEW TMGRESULT SET TMGRESULT=1 ;"Default to success
|
---|
| 243 | SET STR=$GET(STR) IF STR="" SET TMGRESULT=-1 GOTO S2PDONE
|
---|
| 244 | SET PARRAY=$GET(PARRAY) IF PARRAY="" SET TMGRESULT=-1 GOTO S2PDONE
|
---|
| 245 | ;
|
---|
| 246 | NEW TMGSPH SET TMGSPH=+$P($GET(^SC(TMGIEN,"SL")),"^",6) ;"SL;6 = DISPLAY INCS PER HOUR (Slots per Hr)
|
---|
| 247 | IF TMGSPH'>0 SET TMGSPH=4 ;"Default to 4 slots/hr
|
---|
| 248 | NEW APTLEN SET APTLEN=60\TMGSPH ;"Minutes length of each slot
|
---|
| 249 | NEW STARTDAY SET STARTDAY=+$P($GET(^SC(TMGIEN,"SL")),"^",3) ;"SL;3=HR CLINIC DISPLAY BEGINS
|
---|
| 250 | SET STARTDAY=STARTDAY_"00" ;"Make into military time, e.g. 8am --> 0800
|
---|
| 251 | FOR QUIT:$LENGTH(STARTDAY)'<4 SET STARTDAY="0"_STARTDAY
|
---|
| 252 | NEW STRLEN SET STRLEN=$LENGTH(STR)
|
---|
| 253 | NEW IDX FOR IDX=2:2:STRLEN DO
|
---|
| 254 | . NEW TIME1,TIME2,HRS,MINS,CH,NUMAVAIL
|
---|
| 255 | . SET CH=$EXTRACT(STR,IDX)
|
---|
| 256 | . IF (CH="")!(CH=" ") QUIT
|
---|
| 257 | . ;"CONVERT CH INFO NUMAVAIL
|
---|
| 258 | . SET NUMAVAIL=$$CH2NAVAL(CH)
|
---|
| 259 | . IF NUMAVAIL'>0 QUIT
|
---|
| 260 | . SET TIME1=((IDX-2)/2)/TMGSPH
|
---|
| 261 | . SET TIME1=$$FRAC2TIM(TIME1)
|
---|
| 262 | . SET TIME1=$$MILADD2^TMGSDAU1(TIME1,STARTDAY) ;"add 2 times
|
---|
| 263 | . DO MILADD^TMGSDAU1(TIME1,APTLEN,.HRS,.MINS) ;"add time + mins
|
---|
| 264 | . NEW TEMP SET TEMP=TIME1_"-"_HRS_MINS
|
---|
| 265 | . SET @PARRAY@(TEMP)=NUMAVAIL
|
---|
| 266 | ;
|
---|
| 267 | S2PDONE ;
|
---|
| 268 | QUIT TMGRESULT
|
---|
| 269 | ;
|
---|
| 270 | ;
|
---|
| 271 | FRAC2TIM(TIME,HRS,MINS)
|
---|
| 272 | ;"Purpose: Convert Fractional time --> Hrs & Min e.g. 3.75 --> 3 & 45 (i.e. 3:45)
|
---|
| 273 | ;"Input: TIME: Time in fractional format. E.g. 3.75
|
---|
| 274 | ;" HRS -- PASS BY REFERENCE. An OUT PARAMETER. Set to be resulting hours
|
---|
| 275 | ;" will ensure length it 2 digits. i.e. 1 --> 01
|
---|
| 276 | ;" MINS -- PASS BY REFERENCE. An OUT PARAMETER. Set to be minutes minutes
|
---|
| 277 | ;" will ensure length it 2 digits. i.e. 1 --> 01
|
---|
| 278 | ;"Result: result in military format
|
---|
| 279 | SET HRS=TIME\1 ;"Get just hrs part
|
---|
| 280 | SET MINS=TIME#1 ;"Get just minutes part, e.g. 0.3 (i.e. 30 minutes)
|
---|
| 281 | SET MINS=(MINS*0.6)*100 ;"convert .75 -> .45, * 100 = 45 minutes
|
---|
| 282 | FOR QUIT:$LENGTH(MINS)>1 SET MINS="0"_MINS
|
---|
| 283 | FOR QUIT:$LENGTH(HRS)>1 SET HRS="0"_HRS
|
---|
| 284 | ;
|
---|
| 285 | QUIT HRS_MINS
|
---|
| 286 | ;
|
---|
| 287 | ;
|
---|
| 288 | CH2NAVAL(CH)
|
---|
| 289 | ;"Purpose: convert a given availability character into number of slots there.
|
---|
| 290 | NEW CODES SET CODES="{}&%?#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz"
|
---|
| 291 | QUIT $FIND(CODES,CH)-$FIND(CODES,"0")
|
---|
| 292 | ;
|
---|
| 293 | ; |
---|