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