1 | TMGTICKL ;TMG/kst-Tickler Text objects for use in CPRS ;08/27/08
|
---|
2 | ;;1.0;TMG-LIB;**1**;08/27/08
|
---|
3 |
|
---|
4 | ;"TMG Tickler text object and surrounding support code.
|
---|
5 | ;"
|
---|
6 | ;"These are bits of code that return text to be included in progress notes etc.
|
---|
7 | ;"They are called when the user puts text like this in a note:
|
---|
8 | ;" ... Mrs. Jone's vitals today are |VITALS|, measured in the office...
|
---|
9 | ;" 'VITALS' would be a TIU TEXT OBJECT, managed through menu option TIUFJ CREATE OBJECTS MGR
|
---|
10 |
|
---|
11 | ;"---------------------------------------------------------------------------
|
---|
12 | ;"PUBLIC FUNCTIONS
|
---|
13 | ;"---------------------------------------------------------------------------
|
---|
14 | ;"$$TICKLER^TMGTICKL(DFN,.TIU) -- Entry point for TIU Text object caller
|
---|
15 | ;"HANDLE^TMGTICKL -- entry point for Task to handle tickler messages, called at scheduled intervals
|
---|
16 | ;"ERRSHOW^TMGTICKL -- Handle Alerts, showing details about error.
|
---|
17 |
|
---|
18 | ;"---------------------------------------------------------------------------
|
---|
19 | ;"PRIVATE FUNCTIONS
|
---|
20 | ;"---------------------------------------------------------------------------
|
---|
21 | ;"$$HasTickler(DocIEN,DateStr) -- return if TIU DOCUMENT contains the signals for a TICKLER message.
|
---|
22 | ;"SendAddendum(DocIEN,AuthorIEN,TklIEN,TMGWP) -- place an addendum to the specified note with message
|
---|
23 | ;"SendErrAddendum(DocIEN,TklIEN,TMGMSG) -- send an addendum to note showing database error.
|
---|
24 | ;"SendAlert(UserIEN,TklIEN,Msg,TMGMSG) -- send a message alert to the user (for error reporting)
|
---|
25 | ;"RescheduleTask -- reschedule task for handling the next cycle of tickler messages.
|
---|
26 | ;"PressToCont -- provide a 'press key to continue' action
|
---|
27 | ;"GetErrStr(ErrArray) -- convert a standard DIERR array into a string for output
|
---|
28 |
|
---|
29 | ;"---------------------------------------------------------------------------
|
---|
30 | ;"---------------------------------------------------------------------------
|
---|
31 |
|
---|
32 | TICKLER(DFN)
|
---|
33 | ;"Purpose: A call point for TIU objects, to launch a tickler for the given note.
|
---|
34 | ;"Input: DFN -- the patient's unique ID (record#)
|
---|
35 | ;"Result: returns text that will be put into the note in CPRS
|
---|
36 |
|
---|
37 | new result
|
---|
38 |
|
---|
39 | set DFN=+$get(DFN)
|
---|
40 | if DFN=0 do goto TKDone
|
---|
41 | . set result="ERROR: DFN not defined. Contact IT support (Source: TMGTICKL.m)"
|
---|
42 |
|
---|
43 | set result=""
|
---|
44 | set result=result_" ======= [TICKLER MESSGE] ======="_$CHAR(13)_$CHAR(10)
|
---|
45 | set result=result_" #DUE#: Put-DUE-DATE-here "_$CHAR(13)_$CHAR(10)
|
---|
46 | set result=result_" ================================"_$CHAR(13)_$CHAR(10)
|
---|
47 | set result=result_" Message: ... "_$CHAR(13)_$CHAR(10)
|
---|
48 | set result=result_" "_$CHAR(13)_$CHAR(10)
|
---|
49 | set result=result_" ================================"_$CHAR(13)_$CHAR(10)
|
---|
50 | set result=result_$CHAR(13)_$CHAR(10)
|
---|
51 |
|
---|
52 | ;"Create an entry in TMG TICKLER file, for later processing.
|
---|
53 | ;"Processing will need to wait until after document is signed, so that due date is fixed.
|
---|
54 | new TMGFDA,TMGMSG,TMGIEN
|
---|
55 | set TMGFDA(22705.5,"+1,",.01)=DFN ;"IEN in PATIENT file
|
---|
56 | set TMGFDA(22705.5,"+1,",2)="U" ;"U=Unsigned
|
---|
57 | set TMGFDA(22705.5,"+1,",3)=DUZ ;"Current user
|
---|
58 |
|
---|
59 | do UPDATE^DIE("","TMGFDA","TMGIEN","TMGMSG")
|
---|
60 | if $data(TMGMSG("DIERR")) do goto TKDone
|
---|
61 | . set result="ERROR: Fileman error creating Tickler Message. Contact IT support (Source: TMGTICKL.m)"
|
---|
62 | . set result=result_$$GetErrStr(.TMGMSG)
|
---|
63 |
|
---|
64 | TKDone quit result
|
---|
65 |
|
---|
66 |
|
---|
67 | HANDLE
|
---|
68 | ;"Purpose: An entry point for Taskman Task to handle tickler messages
|
---|
69 | ;" This will be called at scheduled intervals
|
---|
70 |
|
---|
71 | do RescheduleTask
|
---|
72 |
|
---|
73 | new X,%,TMGFDA,TMGMSG
|
---|
74 | do NOW^%DTC ;"get current time into %
|
---|
75 | set TMGFDA(22705.4,"1,",3)=%
|
---|
76 | do FILE^DIE("","TMGFDA","TMGMSG") ;"set time of last scan in 22705.4
|
---|
77 |
|
---|
78 | new DIC,Y
|
---|
79 | set DIC=8925.6 ;"TIU STATUS file
|
---|
80 | set X="COMPLETED"
|
---|
81 | DO ^DIC
|
---|
82 | new StatusIEN set StatusIEN=+Y
|
---|
83 | if StatusIEN'>0 do goto HandlDone
|
---|
84 | . do SendAlert(DUZ,0,"Tickler Error: Can't find IEN for 'COMPLETED' status")
|
---|
85 |
|
---|
86 | ;"For each TMG TICKLER entry that is UNSIGNED, and missing a DOCUMENT
|
---|
87 | ;"pointer, a scan of all a patient's documents is carried out, looking
|
---|
88 | ;"for one with a Tickler Message that has not already been noted. When
|
---|
89 | ;"found, the DOCUMENT pointer is stored. Search is by date, in
|
---|
90 | ;"reverse chronological order (most recent first).
|
---|
91 | new TklIEN set TklIEN=0
|
---|
92 | for set TklIEN=$order(^TMG(22705.5,"S","U",TklIEN)) quit:(+TklIEN'>0) do
|
---|
93 | . new found set found=0
|
---|
94 | . new DocIEN set DocIEN=+$piece($get(^TMG(22705.5,TklIEN,0)),"^",4)
|
---|
95 | . if DocIEN>0 quit ;"Document for this Tickler already found, so don't search again. SHOULDN'T EVER HAPPEN
|
---|
96 | . new PtIEN set PtIEN=+$piece($get(^TMG(22705.5,TklIEN,0)),"^",1)
|
---|
97 | . new UserIEN set UserIEN=+$piece($get(^TMG(22705.5,TklIEN,0)),"^",5)
|
---|
98 | . new DateStr set DateStr=""
|
---|
99 | . new DocClIEN set DocClIEN=0
|
---|
100 | . ;"Note: ADCPT xref --> Patient,Doc CLASS,Status,InverseRefDate,DocIEN
|
---|
101 | . for set DocClIEN=$order(^TIU(8925,"ADCPT",PtIEN,DocClIEN)) quit:(+DocClIEN'>0)!found do
|
---|
102 | . . new RefDate set RefDate=""
|
---|
103 | . . for set RefDate=$order(^TIU(8925,"ADCPT",PtIEN,DocClIEN,StatusIEN,RefDate)) quit:(RefDate="")!found do
|
---|
104 | . . . set DocIEN=""
|
---|
105 | . . . for set DocIEN=$order(^TIU(8925,"ADCPT",PtIEN,DocClIEN,StatusIEN,RefDate,DocIEN)) quit:(+DocIEN'>0)!found do
|
---|
106 | . . . . ;"DocIEN should be a COMPLETED document for patient
|
---|
107 | . . . . if $data(^TMG(22705.5,"C",DocIEN)) quit ;"document already linked by another tickler
|
---|
108 | . . . . if $$HasTickler(DocIEN,.DateStr)=0 quit
|
---|
109 | . . . . set found=1
|
---|
110 | . . . . new TMGFDA,TMGMSG
|
---|
111 | . . . . set TMGFDA(22705.5,TklIEN_",",.05)="`"_DocIEN
|
---|
112 | . . . . set TMGFDA(22705.5,TklIEN_",",2)="S" ;"S=SIGNED
|
---|
113 | . . . . set TMGFDA(22705.5,TklIEN_",",1)=DateStr
|
---|
114 | . . . . do FILE^DIE("E","TMGFDA","TMGMSG")
|
---|
115 | . . . . if $data(TMGMSG("DIERR"))=0 quit ;"no errors, so we are done here...
|
---|
116 | . . . . do SendErrAddendum(DocIEN,TklIEN,.TMGMSG)
|
---|
117 | . if found=0 do ;"no match COMPLETED document found for TICKLER entry
|
---|
118 | . . ;"Check if patient has any non-COMPLETED documents, if so, wait longer
|
---|
119 | . . set DocIEN=""
|
---|
120 | . . for set DocIEN=$order(^TIU(8925,"C",PtIEN,DocIEN)) quit:(+DocIEN'>0)!found do
|
---|
121 | . . . set found=(+$piece($get(^TIU(8925,DocIEN,0)),"^",5)=StatusIEN)
|
---|
122 | . . if found=0 do ;"TICKLER entry doesn't refer to any real message (must have been deleted in CPRS)
|
---|
123 | . . . new TMGFDA,TMGMSG
|
---|
124 | . . . set TMGFDA(22705.5,TklIEN_",",2)="O" ;"O=ORPHANED
|
---|
125 | . . . do FILE^DIE("E","TMGFDA","TMGMSG")
|
---|
126 | . . . if $data(TMGMSG("DIERR"))=0 quit ;"no errors, so we are done here...
|
---|
127 | . . . do SendErrAddendum(DocIEN,TklIEN,.TMGMSG)
|
---|
128 |
|
---|
129 | ;"Scan all TMG TICKLER entries that have a status of SIGNED,
|
---|
130 | ;"and if the due date has arrived,then process. Change status to COMPLETED, and
|
---|
131 | ;"create an new document that is an ADDENDUM to the document.
|
---|
132 | ;"Send message 'Your message is now due' etc...
|
---|
133 | ;"ADDENDUM: I changed the external text of status (S)/SIGNED to be 'PENDING' for user clarity
|
---|
134 | set TklIEN=0
|
---|
135 | for set TklIEN=$order(^TMG(22705.5,"S","S",TklIEN)) quit:(+TklIEN'>0) do
|
---|
136 | . new DocIEN set DocIEN=+$piece($get(^TMG(22705.5,TklIEN,0)),"^",4)
|
---|
137 | . new AuthorIEN set AuthorIEN=+$piece($get(^TMG(22705.5,TklIEN,0)),"^",5) ;"0;5 = USER
|
---|
138 | . new X,X1,X2,%,%Y,DueDateT,NowDateT
|
---|
139 | . set (X1,DueDateT)=$piece(^TMG(22705.5,TklIEN,0),"^",2) ;" 0;2 = DUE DATE, Field 1
|
---|
140 | . do NOW^%DTC set (X2,NowDateT)=%
|
---|
141 | . do ^%DTC ;"returns X=X1-X2 (ie X=DUE-NOW); If %Y=, dates were imprecise and unworkable.
|
---|
142 | . if %Y=0 do quit
|
---|
143 | . . if DocIEN'>0 set X=0 quit ;"Bigger problem exists, will be reported below.
|
---|
144 | . . set s(1)="**Error Processing Dates for Tickler Message**"
|
---|
145 | . . set s(2)="(This note may be edited or deleted--until signed.)"
|
---|
146 | . . set s(3)="Date found was imprecise and unworkable, or '#DUE#:' text was not found."
|
---|
147 | . . set s(4)="TO FIX: Please create an addendum to the original note and add a NEW TICKLER message."
|
---|
148 | . . do SendAddendum(DocIEN,AuthorIEN,TklIEN,.s)
|
---|
149 | . . ;"If we don't specified the tickler to be Completed, the error will be sent repeatedly
|
---|
150 | . . new TMGFDA,TMGMSG
|
---|
151 | . . set TMGFDA(22705.5,TklIEN_",",2)="C" ;"C=COMPLETED
|
---|
152 | . . do FILE^DIE("","TMGFDA","TMGMSG")
|
---|
153 | . . if $data(TMGMSG("DIERR"))=0 quit ;"no errors, so we are done here...
|
---|
154 | . . do SendErrAddendum(DocIEN,TklIEN,.TMGMSG)
|
---|
155 | . if X'<1 quit ;"Tickler not yet due, so wait longer.
|
---|
156 | . new waitMore set waitMore=0
|
---|
157 | . if X=0 do quit:waitMore=1
|
---|
158 | . . new dueTime set dueTime=$$LJ^XLFSTR($piece(DueDateT,".",2),6,"0")
|
---|
159 | . . new nowTime set nowTime=$$LJ^XLFSTR($piece(NowDateT,".",2),6,"0")
|
---|
160 | . . if dueTime>nowTime set waitMore=1
|
---|
161 | . ;"Success! Tickler is due. Send addendum
|
---|
162 | . if DocIEN=0 do quit
|
---|
163 | . . do SendAlert(AuthorIEN,TklIEN,"Can't find Document for Tickler record. (Shouldn't happen). Check TMGTICKL.m")
|
---|
164 | . new s
|
---|
165 | . set s(1)=" "
|
---|
166 | . set s(2)=" * * Tickler message due date has arrived * * "
|
---|
167 | . set s(3)="================================================"
|
---|
168 | . set s(4)=" This note may be edited if needed until signed"
|
---|
169 | . set s(5)=" "
|
---|
170 | . set s(6)=" Please note original tickler message."
|
---|
171 | . set s(7)=" "
|
---|
172 | . do SendAddendum(DocIEN,AuthorIEN,TklIEN,.s)
|
---|
173 | . new TMGFDA,TMGMSG
|
---|
174 | . set TMGFDA(22705.5,TklIEN_",",2)="C" ;"C=COMPLETED
|
---|
175 | . do FILE^DIE("","TMGFDA","TMGMSG")
|
---|
176 | . if $data(TMGMSG("DIERR"))=0 quit ;"no errors, so we are done here...
|
---|
177 | . do SendErrAddendum(DocIEN,TklIEN,.TMGMSG)
|
---|
178 |
|
---|
179 | HandlDone
|
---|
180 | set ZTREQ="@" ;"delete completed task.
|
---|
181 | quit
|
---|
182 |
|
---|
183 |
|
---|
184 | HasTickler(DocIEN,DateStr)
|
---|
185 | ;"Purpose: To determine if the REPORT TEXT for the TIU DOCUMENT (DocIEN) WP field
|
---|
186 | ;" contains the string that signals a TICKLER message.
|
---|
187 | ;" Notice: The string matched here *same* string as is found in TICKLER()
|
---|
188 | ;"Input: DocIEN -- IEN in 8925
|
---|
189 | ;" DateStr -- PASS BY REFERENCE, an OUT PARAMETER
|
---|
190 | ;" Returns Due Date *String* from '#DUE#: <Place-Due-Date-Here>
|
---|
191 | ;" on line AFTER [TICKLER MESSAGE]
|
---|
192 | ;"Result: 1 if found, 0 if not.
|
---|
193 |
|
---|
194 | set DateStr=""
|
---|
195 | new isHTML set isHTML=$$IsHTML^TMGSTUTL(DocIEN)
|
---|
196 | new found,line set (found,line)=0
|
---|
197 | for set line=$order(^TIU(8925,DocIEN,"TEXT",line)) quit:(+line'>0)!found do
|
---|
198 | . set found=($get(^TIU(8925,DocIEN,"TEXT",line,0))["[TICKLER MESSGE]")
|
---|
199 | . new done set done=0
|
---|
200 | . if found for set line=$order(^TIU(8925,DocIEN,"TEXT",line)) quit:(+line'>0)!done do
|
---|
201 | . . if $get(^TIU(8925,DocIEN,"TEXT",line,0))'["#DUE#:" quit
|
---|
202 | . . set done=1
|
---|
203 | . . set DateStr=$piece(^TIU(8925,DocIEN,"TEXT",line,0),"#DUE#:",2)
|
---|
204 | . . if isHTML set DateStr=$$TrimTags^TMGSTUTL(DateStr)
|
---|
205 | . . set DateStr=$$TRIM^XLFSTR(DateStr)
|
---|
206 | . . ;"new ch for set ch=$extract(DateStr,1) quit:(ch'=" ") do ;"trim off leading spaces
|
---|
207 | . . ;". set DateStr=$extract(DateStr,2,200)
|
---|
208 | . . ;"for quit:(DateStr'["@ ") do ;"handle 'mm/dd/yy @ time' format (i.e. spaces after @)
|
---|
209 | . . ;". new spec set spec("@ ")="@"
|
---|
210 | . . ;". set DateStr=$$REPLACE^XLFSTR(DateStr,.spec)
|
---|
211 | . . new %DT,X,Y
|
---|
212 | . . set X=DateStr,%DT="TF" ;"assume future dates, and time is allowed.
|
---|
213 | . . do ^%DT ;"returns Y=-1, or Y=fileman date format.
|
---|
214 | . . if Y>-1 do
|
---|
215 | . . . do DD^%DT
|
---|
216 | . . . set DateStr=Y ;"This should be a standardized date.
|
---|
217 |
|
---|
218 | quit found
|
---|
219 |
|
---|
220 |
|
---|
221 | SendAddendum(DocIEN,AuthorIEN,TklIEN,TMGWP)
|
---|
222 | ;"Purpose: To place an addendum to the specified note (or the note's parent if
|
---|
223 | ;" the note is itself already an addendum.
|
---|
224 | ;"Input: DocIEN -- IEN in 8925
|
---|
225 | ;" AuthorIEN -- IEN in 200 of author
|
---|
226 | ;" TklIEN -- Tickler IEN 22705.5
|
---|
227 | ;" TMGWP --PASS BY REFERENCE. message to put in addendum.
|
---|
228 | ;" e.g. TMGWP(1)="First line of text."
|
---|
229 | ;" TMGWP(2)="Second line of text."
|
---|
230 | ;"Result: 1 if successful, 0 if error. <--- NO. No result returned.
|
---|
231 |
|
---|
232 | new result set result=1 ;"default to success.
|
---|
233 |
|
---|
234 | new parentIEN set parentIEN=+$piece($get(^TIU(8925,DocIEN,0)),"^",6) ;"0;6= FIELD .06, PARENT
|
---|
235 | if parentIEN>0 set DocIEN=parentIEN
|
---|
236 | new PtIEN set PtIEN=+$piece($get(^TMG(22705.5,TklIEN,0)),"^",1)
|
---|
237 | new visitIEN set visitIEN=+$piece($get(^TIU(8925,DocIEN,0)),"^",3)
|
---|
238 | new locIEN set locIEN=+$piece($get(^TIU(8925,DocIEN,12)),"^",11)
|
---|
239 | new HlocIEN set HlocIEN=+$piece($get(^TIU(8925,DocIEN,12)),"^",5)
|
---|
240 | new divIEN set divIEN=+$piece($get(^TIU(8925,DocIEN,12)),"^",12)
|
---|
241 | new serviceIEN set serviceIEN=+$piece($get(^TIU(8925,DocIEN,14)),"^",4)
|
---|
242 |
|
---|
243 | new DIC,X,Y
|
---|
244 | set DIC=8925.1
|
---|
245 | set DIC("S")="I $P(^(0),U,4)=""DOC""" ;"screen for Type=Title
|
---|
246 | set X="ADDENDUM"
|
---|
247 | do ^DIC
|
---|
248 | if +Y'>0 do goto SendADone
|
---|
249 | . set result=0
|
---|
250 | . do SendAlert(AuthorIEN,TklIEN,"Unable to find ADDENDUM Title for Tickler Note")
|
---|
251 | new docTypeIEN set docTypeIEN=+Y
|
---|
252 |
|
---|
253 | set DIC("S")="I $P(^(0),U,4)=""DC""" ;"screen for Type=Class
|
---|
254 | set X="ADDENDUM"
|
---|
255 | do ^DIC
|
---|
256 | if +Y'>0 do goto SendADone
|
---|
257 | . set result=0
|
---|
258 | . do SendAlert(AuthorIEN,TklIEN,"Unable to find ADDENDUM class for Tickler Note")
|
---|
259 | new DocClassIEN set DocClassIEN=+Y
|
---|
260 |
|
---|
261 | new TMGFDA,TMGMSG,TMGIEN
|
---|
262 | set TMGFDA(8925,"+1,",.01)="`"_docTypeIEN ;".01 = DOCUMENT TYPE
|
---|
263 | set TMGFDA(8925,"+1,",.02)="`"_PtIEN ;".02 = PATIENT
|
---|
264 | set TMGFDA(8925,"+1,",.03)="`"_visitIEN ;".03 = VISIT
|
---|
265 | set TMGFDA(8925,"+1,",.04)="`"_DocClassIEN;".04 = PARENT DOCUMENT TYPE
|
---|
266 | set TMGFDA(8925,"+1,",.05)="UNSIGNED" ;".05 = STATUS
|
---|
267 | set TMGFDA(8925,"+1,",.06)="`"_DocIEN ;".06 = PARENT
|
---|
268 | set TMGFDA(8925,"+1,",.07)="NOW" ;".07 = EPISODE BEGIN DATE/TIME
|
---|
269 | set TMGFDA(8925,"+1,",.13)="A" ;".13 = VISIT TYPE
|
---|
270 | set TMGFDA(8925,"+1,",1201)="NOW" ;"1201 = ENTRY DATE/TIME
|
---|
271 | set TMGFDA(8925,"+1,",1202)="`"_AuthorIEN ;"1202 = AUTHOR/DICTATOR
|
---|
272 | set TMGFDA(8925,"+1,",1204)="`"_AuthorIEN ;"1204 = EXPECTED SIGNER
|
---|
273 | set TMGFDA(8925,"+1,",1205)="`"_HlocIEN ;"1205 = HOSPITAL LOCATION
|
---|
274 | set TMGFDA(8925,"+1,",1211)="`"_locIEN ;"1211 = VISIT LOCATION
|
---|
275 | set TMGFDA(8925,"+1,",1212)="`"_divIEN ;"1212 = DIVISION
|
---|
276 | set TMGFDA(8925,"+1,",1301)="NOW" ;"1301 = REFERENCE DATE
|
---|
277 | set TMGFDA(8925,"+1,",1302)="`"_AuthorIEN ;"1302 = ENTERED BY
|
---|
278 | set TMGFDA(8925,"+1,",1303)="direct" ;"1303 = CAPTURE METHOD
|
---|
279 | set TMGFDA(8925,"+1,",1404)="`"_serviceIEN;"1404 = SERVICE
|
---|
280 | set TMGFDA(8925,"+1,",1506)="NO" ;"1506 = COSIGNATURE NEEDED
|
---|
281 |
|
---|
282 | do UPDATE^DIE("E","TMGFDA","TMGIEN","TMGMSG")
|
---|
283 |
|
---|
284 | if $data(TMGMSG("DIERR")) do goto SendADone
|
---|
285 | . set result=0
|
---|
286 | . do SendAlert(AuthorIEN,TklIEN,"Error creating Tickler addendum.",.TMGMSG)
|
---|
287 |
|
---|
288 | new newDocIEN set newDocIEN=TMGIEN(1)
|
---|
289 | Do SEND^TIUALRT(newDocIEN) ;"create alert regarding note needing to be signed.
|
---|
290 |
|
---|
291 | kill TMGMSG
|
---|
292 | do WP^DIE(8925,newDocIEN_",",2,"","TMGWP","TMGMSG")
|
---|
293 |
|
---|
294 | if $data(TMGMSG("DIERR")) do goto SendADone
|
---|
295 | . set result=0
|
---|
296 | . do SendAlert(AuthorIEN,TklIEN,"Error filing message into Tickler addendum.",.TMGMSG)
|
---|
297 |
|
---|
298 | SendADone
|
---|
299 | ;"quit result
|
---|
300 | quit
|
---|
301 |
|
---|
302 |
|
---|
303 | SendErrAddendum(DocIEN,TklIEN,TMGMSG)
|
---|
304 | ;"Purpose: to send an addendum to note showing database error.
|
---|
305 | ;"Input: DocIEN: the document that should have the addendum added.
|
---|
306 | ;" TklIEN: the IEN of the tickler record
|
---|
307 | ;" TMGMSG: PASS BY REFERENCE. The error array, as returned by fileman.
|
---|
308 | ;"result: none.
|
---|
309 |
|
---|
310 | new ErrStr
|
---|
311 | set ErrStr(1)="Database error encountered handling tickler message."
|
---|
312 | set ErrStr(2)="Note: This may be deleted..."
|
---|
313 | set ErrStr(3)=$$GetErrStr(.TMGMSG)
|
---|
314 | new AuthorIEN set AuthorIEN=$piece($get(^TMG(22705.5,TklIEN,0)),"^",5)
|
---|
315 | do SendAddendum(DocIEN,AuthorIEN,TklIEN,.ErrStr)
|
---|
316 | quit
|
---|
317 |
|
---|
318 |
|
---|
319 | SendAlert(UserIEN,TklIEN,Msg,TMGMSG)
|
---|
320 | ;"Purpose: to send a message alert to the user (for error reporting)
|
---|
321 | ;"Input: UserIEN -- IEN in 200, the target of the message
|
---|
322 | ;" TklIEN -- the IEN of the tickler message
|
---|
323 | ;" Msg -- the message to send. **ONLY UP TO 80 characters**
|
---|
324 | ;" No ^ allowed in the message!
|
---|
325 | ;" TMGMSG -- OPTIONAL, PASS BY REFERENCE.
|
---|
326 | ;" An error array as created by Fileman.
|
---|
327 | ;"results: none
|
---|
328 |
|
---|
329 | ;"initialize vars for alert code
|
---|
330 | new XQA,XQAARCH,XQADATA,XQAFLG,XQAGUID,XQAID,XQAMSG
|
---|
331 | new XQAOPT,XQAROU,XQASUPV,XQASURO,XQATEXT
|
---|
332 |
|
---|
333 | set XQADATA=TklIEN_"^"_Msg
|
---|
334 | if $data(TMGMSG) set XQADATA=XQADATA_"^"_$$GetErrStr(.TMGMSG)
|
---|
335 | set XQA(UserIEN)=""
|
---|
336 | set XQAMSG=Msg
|
---|
337 | set XQAROU="ERRSHOW^TMGTICKL"
|
---|
338 |
|
---|
339 | do SETUP^XQALERT ;"send the alert
|
---|
340 |
|
---|
341 | quit
|
---|
342 |
|
---|
343 | ERRSHOW
|
---|
344 | ;"Purpose: To show details about error.
|
---|
345 | ;"Input: Global-scoped variable XQADATA will hold TklIEN^Msg^FMErrStr
|
---|
346 | ;" Note: TklIEN could be 0
|
---|
347 | ;"Results: none
|
---|
348 |
|
---|
349 | write !,!
|
---|
350 | write "Notice: There was an error processing a tickler message.",!
|
---|
351 | write "This notice is to provide as much detail as is possible,",!
|
---|
352 | write "so that the tickler message does not get lost.",!,!
|
---|
353 |
|
---|
354 | new TklIEN,Msg,FMErrStr
|
---|
355 |
|
---|
356 | if $data(XQADATA)=0 do goto ErShDone
|
---|
357 | . write "But XQADATA doesn't hold info(??). Aborting.",!
|
---|
358 | . do PressToCont
|
---|
359 |
|
---|
360 | set TklIEN=+$piece(XQADATA,"^",1)
|
---|
361 | set Msg=$piece(XQADATA,"^",2)
|
---|
362 | set FMErrStr=$piece(XQADATA,"^",3)
|
---|
363 |
|
---|
364 | write "The error message was:",!
|
---|
365 | write Msg,!
|
---|
366 | do PressToCont
|
---|
367 |
|
---|
368 | if TklIEN>0 do
|
---|
369 | . write !
|
---|
370 | . write "PATIENT:",$$GET1^DIQ(22705.5,TklIEN,.01),!
|
---|
371 | . write "DOCUMENT:",$$GET1^DIQ(22705.5,TklIEN,.05)," (#",$$GET1^DIQ(22705.5,TklIEN,.05,"I"),")",!
|
---|
372 | . write "DUE DATE:",$$GET1^DIQ(22705.5,TklIEN,1),!
|
---|
373 | . write "AUTHOR:",$$GET1^DIQ(22705.5,TklIEN,3),!
|
---|
374 | . write "AUTHOR:",$$GET1^DIQ(22705.5,TklIEN,3),!
|
---|
375 | . write "TICKLER STATUS:",$$GET1^DIQ(22705.5,TklIEN,2),!
|
---|
376 | . write "1st LINE OF MESSAGE:",$$GET1^DIQ(22705.5,TklIEN,5),!
|
---|
377 | . do PressToCont
|
---|
378 |
|
---|
379 | if FMErrStr'="" do
|
---|
380 | . write !,"The Fileman (database) error message was:",!
|
---|
381 | . write FMErrStr,!
|
---|
382 | . do PressToCont
|
---|
383 |
|
---|
384 | write !,!
|
---|
385 | write "Hopefully this will be enough information for you",!
|
---|
386 | write "to fix the tickler message.",!
|
---|
387 | write "Please follow up on this NOW....",!
|
---|
388 | write "This will be the *only* reminder!",!!
|
---|
389 | do PressToCont
|
---|
390 |
|
---|
391 | ErShDone
|
---|
392 | quit
|
---|
393 |
|
---|
394 |
|
---|
395 | RescheduleTask
|
---|
396 | ;"Purpose: to set up task to periodically handle tickler messages.
|
---|
397 | ;"Result: None
|
---|
398 |
|
---|
399 | new temp set temp=1
|
---|
400 | if temp=0 quit ;"a debugging measure so that launching a duplicate task can be avoided
|
---|
401 |
|
---|
402 | new ZTRTN,ZTDESC,ZTDTH,ZTIO,ZTUCI,ZTCPU
|
---|
403 | new ZTPRI,ZTSAVE,ZTKIL,ZTSYNC,ZTSK
|
---|
404 |
|
---|
405 | set ZTRTN="HANDLE^TMGTICKL"
|
---|
406 | set ZTDESC="TMG TICKLER MESSAGES HANDLER"
|
---|
407 | set ZTIO=""
|
---|
408 |
|
---|
409 | new hrInterval set hrInterval=+$piece($get(^TMG(22705.4,1,0)),"^",2) ;"0;2=Interval
|
---|
410 | if hrInterval<1 do goto SchTDone
|
---|
411 | . do SendAlert(DUZ,0,"Tickler Error: Interval (field #1) in file 22705.4 < 1 hr")
|
---|
412 | . set ZTSK=0
|
---|
413 |
|
---|
414 | new X,Y,%,%DT
|
---|
415 | set %DT="XR" set X="NOW+"_hrInterval_"H" do ^%DT
|
---|
416 | set ZTDTH=Y ;"schedule time.
|
---|
417 |
|
---|
418 | do ^%ZTLOAD
|
---|
419 | SchTDone
|
---|
420 | set $piece(^TMG(22705.4,1,0),"^",3)=ZTSK ;"there are no XRefs on this field, and I own it...
|
---|
421 | quit
|
---|
422 |
|
---|
423 |
|
---|
424 | CHECKRUN
|
---|
425 | ;"Purpose: To check that the background processor for the Tickler is running.
|
---|
426 | ;" If not running, give user a chance to start it.
|
---|
427 | ;"Input: None
|
---|
428 | ;"Results: None.
|
---|
429 |
|
---|
430 | do KillOldTasks
|
---|
431 | new Status
|
---|
432 | CR1 set Status=$$TaskStatus(0)
|
---|
433 | if +Status=1 do goto CRDN
|
---|
434 | . write !,"SUCCESS! The TICKLER MESSAGES task is running.",!
|
---|
435 | . write "Details:",!
|
---|
436 | . write " Task#: ",$piece(Status,"^",3),!
|
---|
437 | . write " Scheduled to run next: ",$$HTE^XLFDT($piece(Status,"^",4)),!
|
---|
438 | . do PressToCont^TMGUSRIF
|
---|
439 | write "There is a problem. Task is NOT running.",!
|
---|
440 | new prob set prob=$piece(Status,"^",2)
|
---|
441 | if prob'="" write "Problem: ",prob,!
|
---|
442 | new % set %=1
|
---|
443 | write "Try to launch task now" DO YN^DICN write !
|
---|
444 | if %=1 do goto CR1
|
---|
445 | . do RescheduleTask
|
---|
446 |
|
---|
447 | CRDN quit
|
---|
448 |
|
---|
449 | TaskStatus(Verbose)
|
---|
450 | ;"Purpose: To determine the status of the Tickler background task.
|
---|
451 | ;"Input: Verbose : OPTIONAL. If 1 then output shown. 0 (default) is quiet.
|
---|
452 | ;"Output: 1^Active^TaskNumber^NextRun($H), or -1^Message
|
---|
453 |
|
---|
454 | new ZTRTN,ZTDESC,ZTDTH,ZTIO,ZTUCI,ZTCPU
|
---|
455 | new ZTPRI,ZTSAVE,ZTKIL,ZTSYNC,ZTSK
|
---|
456 |
|
---|
457 | set ZTDESC="TMG TICKLER MESSAGES HANDLER"
|
---|
458 | set ZTIO=""
|
---|
459 |
|
---|
460 | set Verbose=+$get(Verbose)
|
---|
461 | new Result set Result="-1^No Task Found" ;"default to error
|
---|
462 | new NextRun set NextRun=""
|
---|
463 |
|
---|
464 | if $$TM^%ZTLOAD=0 do goto TSDone
|
---|
465 | . set Result="-1^Taskman not running on current volume set"
|
---|
466 |
|
---|
467 | new TMGLIST,TSK
|
---|
468 | do DESC^%ZTLOAD(ZTDESC,"TMGLIST")
|
---|
469 | new done set done=0
|
---|
470 | set TSK=0
|
---|
471 | for set TSK=$ORDER(TMGLIST(TSK)) quit:(TSK="")!done do
|
---|
472 | . new ZTSK set ZTSK=TSK
|
---|
473 | . do ISQED^%ZTLOAD
|
---|
474 | . if Verbose write "Task ",ZTSK,": "
|
---|
475 | . set ZTSK(0)=$GET(ZTSK(0))
|
---|
476 | . if ZTSK(0)=1 if Verbose write "Pending/Waiting",!
|
---|
477 | . else if ZTSK(0)=0 do
|
---|
478 | . . if Verbose write "Done",! ;"Not Pending/Waiting",!
|
---|
479 | . else if ZTSK(0)="" do
|
---|
480 | . . if Verbose write "Lookup error.",!
|
---|
481 | . if $data(ZTSK("E")) do
|
---|
482 | . . if 'Verbose quit
|
---|
483 | . . if $GET(ZTSK("E"))="IT" write " The task number was not valid (0, negative, or non numeric).",! quit
|
---|
484 | . . if $GET(ZTSK("E"))="I" write " The task does not exist on the specified volume set.",! quit
|
---|
485 | . . if $GET(ZTSK("E"))="IS" write " The task set is not listed in the VOLUME SET file (#14.5).",! quit
|
---|
486 | . . if $GET(ZTSK("E"))="LS" write " The link to that volume set is not available.",! quit
|
---|
487 | . . if $GET(ZTSK("E"))="U" write " An unexpected error arose (e.g., disk full, protection, etc.).",!
|
---|
488 | . if $data(ZTSK("D")) do
|
---|
489 | . . set NextRun=$get(ZTSK("D"))
|
---|
490 | . . if 'Verbose quit
|
---|
491 | . . write " Task scheduled to start: ",$$HTE^XLFDT($GET(ZTSK("D"))),!
|
---|
492 | . kill ZTSK set ZTSK=TSK
|
---|
493 | . do STAT^%ZTLOAD
|
---|
494 | . if ZTSK(0)=0 do quit
|
---|
495 | . . if 'Verbose quit
|
---|
496 | . . write "?? task undefined??"
|
---|
497 | . set ZTSK(1)=$get(ZTSK(1))
|
---|
498 | . if Verbose write " Status: ",ZTSK(1)," ",ZTSK(2),!
|
---|
499 | . if (ZTSK(1)=1)&(ZTSK(2)="Active: Pending") do quit
|
---|
500 | . . set done=1
|
---|
501 | . . set Result="1^Active^"_TSK_"^"_NextRun
|
---|
502 | .
|
---|
503 | TSDone quit Result
|
---|
504 |
|
---|
505 |
|
---|
506 | KillOldTasks
|
---|
507 | ;"Purpose: To clear out old, completed tasks
|
---|
508 | ;"Input: none
|
---|
509 | ;"Output:
|
---|
510 |
|
---|
511 | new ZTRTN,ZTDESC,ZTDTH,ZTIO,ZTUCI,ZTCPU
|
---|
512 | new ZTPRI,ZTSAVE,ZTKIL,ZTSYNC,ZTSK
|
---|
513 | new TMGLIST,TSK
|
---|
514 | set ZTDESC="TMG TICKLER MESSAGES HANDLER"
|
---|
515 | do DESC^%ZTLOAD(ZTDESC,"TMGLIST")
|
---|
516 | set TSK=0
|
---|
517 | for set TSK=$ORDER(TMGLIST(TSK)) quit:(TSK="") do
|
---|
518 | . new ZTSK set ZTSK=TSK
|
---|
519 | . do ISQED^%ZTLOAD
|
---|
520 | . set ZTSK(0)=$GET(ZTSK(0))
|
---|
521 | . if $data(ZTSK("E")) do quit
|
---|
522 | . . write "Task ",ZTSK,": ",$GET(ZTSK("E")),!
|
---|
523 | . if ZTSK(0)="" write "Lookup error for task: ",TSK,! quit
|
---|
524 | . if ZTSK(0)'=0 quit
|
---|
525 | . kill ZTSK set ZTSK=TSK
|
---|
526 | . do STAT^%ZTLOAD
|
---|
527 | . if ZTSK(0)=0 write "Task ",ZTSK,": ?? task undefined??" quit
|
---|
528 | . if ($GET(ZTSK(1))=3)&($GET(ZTSK(2))="Inactive: Finished") do
|
---|
529 | . . do KILL^%ZTLOAD
|
---|
530 | quit
|
---|
531 |
|
---|
532 | ;"===========================================================================
|
---|
533 | ;"Below are copies of functions from TMG Libarary, put here to avoid dependancies
|
---|
534 | ;"===========================================================================
|
---|
535 |
|
---|
536 | PressToCont
|
---|
537 | ;"Purpose: to provide a 'press key to continue' action
|
---|
538 |
|
---|
539 | write "----- Press Key To Continue -----"
|
---|
540 | new ch read ch:$get(DTIME,3600)
|
---|
541 | write !
|
---|
542 | quit
|
---|
543 |
|
---|
544 |
|
---|
545 | GetErrStr(ErrArray)
|
---|
546 | ;"Purpose: convert a standard DIERR array into a string for output
|
---|
547 | ;"Input: ErrArray -- PASS BY REFERENCE. example:
|
---|
548 | ;" array("DIERR")="1^1"
|
---|
549 | ;" array("DIERR",1)=311
|
---|
550 | ;" array("DIERR",1,"PARAM",0)=3
|
---|
551 | ;" array("DIERR",1,"PARAM","FIELD")=.02
|
---|
552 | ;" array("DIERR",1,"PARAM","FILE")=2
|
---|
553 | ;" array("DIERR",1,"PARAM","IENS")="+1,"
|
---|
554 | ;" array("DIERR",1,"TEXT",1)="The new record '+1,' lacks some required identifiers."
|
---|
555 | ;" array("DIERR","E",311,1)=""
|
---|
556 | ;"Results: returns one long equivalent string from above array.
|
---|
557 | ;"Note: This is a copy of the function GetErrStr^TMGDEBUG
|
---|
558 | ;" I copied it here so that this file has no TMG* dependencies.
|
---|
559 |
|
---|
560 | new ErrStr
|
---|
561 | new TMGIDX
|
---|
562 | new ErrNum
|
---|
563 |
|
---|
564 | set ErrStr=""
|
---|
565 | for ErrNum=1:1:+$get(ErrArray("DIERR")) do
|
---|
566 | . set ErrStr=ErrStr_"Fileman says: '"
|
---|
567 | . if ErrNum'=1 set ErrStr=ErrStr_"(Error# "_ErrNum_") "
|
---|
568 | . set TMGIDX=$order(ErrArray("DIERR",ErrNum,"TEXT",""))
|
---|
569 | . if TMGIDX'="" for do quit:(TMGIDX="")
|
---|
570 | . . set ErrStr=ErrStr_$get(ErrArray("DIERR",ErrNum,"TEXT",TMGIDX))_" "
|
---|
571 | . . set TMGIDX=$order(ErrArray("DIERR",ErrNum,"TEXT",TMGIDX))
|
---|
572 | . if $get(ErrArray("DIERR",ErrNum,"PARAM",0))>0 do
|
---|
573 | . . set TMGIDX=$order(ErrArray("DIERR",ErrNum,"PARAM",0))
|
---|
574 | . . set ErrStr=ErrStr_"Details: "
|
---|
575 | . . for do quit:(TMGIDX="")
|
---|
576 | . . . if TMGIDX="" quit
|
---|
577 | . . . set ErrStr=ErrStr_"["_TMGIDX_"]="_$get(ErrArray("DIERR",1,"PARAM",TMGIDX))_" "
|
---|
578 | . . . set TMGIDX=$order(ErrArray("DIERR",ErrNum,"PARAM",TMGIDX))
|
---|
579 |
|
---|
580 | quit ErrStr
|
---|
581 |
|
---|