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 | ; |
---|