| 1 | RORTSK02 ;HCIOFO/SG - TASK MANAGER UTILITIES ; 1/23/06 8:11am | 
|---|
| 2 | ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006 | 
|---|
| 3 | ; | 
|---|
| 4 | Q | 
|---|
| 5 | ; | 
|---|
| 6 | ;***** RETURNS A LIST OF USER'S TASKS | 
|---|
| 7 | ; | 
|---|
| 8 | ; .TASKLIST     Reference to a local array that the task | 
|---|
| 9 | ;               list is returned to | 
|---|
| 10 | ; | 
|---|
| 11 | ; [REGIEN]      Registry IEN | 
|---|
| 12 | ; | 
|---|
| 13 | ; [TYPE]        Type of the task (1 - Generic, 2 - Report) | 
|---|
| 14 | ; | 
|---|
| 15 | ; [.FROM]       Where to start/continue the list generation. | 
|---|
| 16 | ;               By defualt (if $G(FROM)'>0), the extraction starts | 
|---|
| 17 | ;               from the beginning of the user's task list. | 
|---|
| 18 | ; | 
|---|
| 19 | ;               NOTE: The task, which number is passed via this | 
|---|
| 20 | ;               parameter, is not included in the report. | 
|---|
| 21 | ; | 
|---|
| 22 | ;               After the call, this parameter contains the last | 
|---|
| 23 | ;               extracted task number or an empty string if there | 
|---|
| 24 | ;               are no more tasks. | 
|---|
| 25 | ; | 
|---|
| 26 | ; [NUMBER]      Maximum number of tasks returned by the function. | 
|---|
| 27 | ;               By default (if $G(NUMBER)'>0), all task numbers | 
|---|
| 28 | ;               (starting from the point indicated by the FROM | 
|---|
| 29 | ;               parameter if it is defined) are retrieved. | 
|---|
| 30 | ; | 
|---|
| 31 | ; [USER]        A user IEN (DUZ). By default (if $G(USER)'>0), | 
|---|
| 32 | ;               the curent user's DUZ is used. | 
|---|
| 33 | ; | 
|---|
| 34 | ; Return values: | 
|---|
| 35 | ;       <0  Error code | 
|---|
| 36 | ;        0  No tasks have been found | 
|---|
| 37 | ;       >0  Number of tasks | 
|---|
| 38 | ; | 
|---|
| 39 | LIST(TASKLIST,REGIEN,TYPE,FROM,NUMBER,USER) ; | 
|---|
| 40 | N DIR,NTSK,RC,ROOT,RORBUF,SCR,TASK  K TASKLIST | 
|---|
| 41 | S ROOT=$$ROOT^DILFD(798.8,,1) | 
|---|
| 42 | S USER=$S($G(USER)>0:+USER,1:+$G(DUZ)) | 
|---|
| 43 | S DIR=$S($$UP^XLFSTR($G(NUMBER))["B":-1,1:1) | 
|---|
| 44 | S NUMBER=$S($G(NUMBER)>0:+NUMBER,1:999999) | 
|---|
| 45 | ;--- Generate a screen logic | 
|---|
| 46 | S SCR="I 1" | 
|---|
| 47 | S:$G(REGIEN)>0 SCR=SCR_","_"$P(RORBUF,U,3)="_(+REGIEN) | 
|---|
| 48 | S:$G(TYPE)>0 SCR=SCR_","_"$P(RORBUF,U,2)="_(+TYPE) | 
|---|
| 49 | ;--- Generate the output list | 
|---|
| 50 | S TASK=$S($G(FROM)>0:FROM,1:""),NTSK=0 | 
|---|
| 51 | F  S TASK=$O(@ROOT@("U",USER,TASK),DIR)  Q:TASK=""  D  Q:NTSK'<NUMBER | 
|---|
| 52 | . S RORBUF=$G(@ROOT@(TASK,0))  X SCR  E  Q | 
|---|
| 53 | . S NTSK=NTSK+1,TASKLIST(TASK)="" | 
|---|
| 54 | S FROM=TASK | 
|---|
| 55 | Q NTSK | 
|---|
| 56 | ; | 
|---|
| 57 | ;***** PURGES THE OLD TASKS | 
|---|
| 58 | ; | 
|---|
| 59 | ; [DKEEP]       Days to keep the old tasks (by default = 15) | 
|---|
| 60 | ; | 
|---|
| 61 | ; Return Values: | 
|---|
| 62 | ;       <0  Error code | 
|---|
| 63 | ;        0  Ok | 
|---|
| 64 | ; | 
|---|
| 65 | PURGE(DKEEP) ; | 
|---|
| 66 | N DA,DATE,DIK,FROM,RC,STATUS,TASK,TASKINFO | 
|---|
| 67 | S ROOT=$$ROOT^DILFD(798.8,,1),DIK=$$OREF^DILF(ROOT) | 
|---|
| 68 | S FROM=$$FMADD^XLFDT($$DT^XLFDT,1-$G(DKEEP,15)) | 
|---|
| 69 | ;--- | 
|---|
| 70 | S DATE=FROM,RC=0 | 
|---|
| 71 | F  S DATE=$O(@ROOT@("ACDT",DATE),-1)  Q:DATE=""  D | 
|---|
| 72 | . S TASK="" | 
|---|
| 73 | . F  S TASK=$O(@ROOT@("ACDT",DATE,TASK),-1)  Q:TASK=""  D | 
|---|
| 74 | . . Q:$$TASKINFO(TASK,.TASKINFO)<0 | 
|---|
| 75 | . . S STATUS=+TASKINFO(6) | 
|---|
| 76 | . . ;--- Do not delete pending, running and suspended tasks | 
|---|
| 77 | . . Q:(STATUS=1)!(STATUS=2)!(STATUS=102) | 
|---|
| 78 | . . ;--- If task is completed, use its completion | 
|---|
| 79 | . . ;--- date instead of the creation date | 
|---|
| 80 | . . I TASKINFO(9)>DATE  Q:TASKINFO(9)'<FROM | 
|---|
| 81 | . . ;--- Delete the record | 
|---|
| 82 | . . S DA=TASK  D ^DIK | 
|---|
| 83 | ;--- | 
|---|
| 84 | Q $S(RC<0:RC,1:0) | 
|---|
| 85 | ; | 
|---|
| 86 | ;***** RETURNS STATUS OF THE TASK | 
|---|
| 87 | ; | 
|---|
| 88 | ; TASK          Task number | 
|---|
| 89 | ; [LTO]         LOCK timeout (0 by default) | 
|---|
| 90 | ; [UNDEF83]     Return the error -83 if there is no task record. | 
|---|
| 91 | ;               By default (if +$G(UNDEF83)=0), zero is returned. | 
|---|
| 92 | ; | 
|---|
| 93 | ; Return Values: | 
|---|
| 94 | ;       <0  Error code | 
|---|
| 95 | ;        0  Undefined task/Unknown Status | 
|---|
| 96 | ;       >0  Status (Code^Description) | 
|---|
| 97 | ; | 
|---|
| 98 | ;               1  Active: Pending | 
|---|
| 99 | ;               2  Active: Running | 
|---|
| 100 | ;               3  Inactive: Finished | 
|---|
| 101 | ;               4  Inactive: Available | 
|---|
| 102 | ;               5  Inactive: Interrupted | 
|---|
| 103 | ; | 
|---|
| 104 | ;             100  Inactive: Crashed | 
|---|
| 105 | ;             101  Inactive: Errors | 
|---|
| 106 | ;             102  Active: Suspended | 
|---|
| 107 | ;             103  Active: Stopping | 
|---|
| 108 | ; | 
|---|
| 109 | STATUS(TASK,LTO,UNDEF83) ; | 
|---|
| 110 | N ACTION,IENS,RORBUF,RORMSG,STATUS,TASKNODE,TMS,ZTSK | 
|---|
| 111 | Q:TASK'>0 $$ERROR^RORERR(-85,,,,TASK) | 
|---|
| 112 | S TASKNODE=$NA(^RORDATA(798.8,TASK)) | 
|---|
| 113 | Q:'$D(@TASKNODE) $S($G(UNDEF83):-83,1:0) | 
|---|
| 114 | ;--- Get internal value of the STATUS field (2.01) | 
|---|
| 115 | S STATUS=+$G(@TASKNODE@(2)) | 
|---|
| 116 | ;--- Lock the record and check if the task is running | 
|---|
| 117 | L +@TASKNODE@("T",0):$G(LTO,0) | 
|---|
| 118 | E  S TMS=""  D  Q:TMS'="" TMS | 
|---|
| 119 | . S ACTION=+$G(@TASKNODE@("A")) | 
|---|
| 120 | . I ACTION=2    S TMS="103^Active: Stopping"   Q | 
|---|
| 121 | . I STATUS=100  S TMS="2^Active: Running"      Q | 
|---|
| 122 | . I STATUS=102  S TMS="102^Active: Suspended"  Q | 
|---|
| 123 | D | 
|---|
| 124 | . ;--- Try to get status from the Taskman | 
|---|
| 125 | . S ZTSK=TASK  D STAT^%ZTLOAD | 
|---|
| 126 | . S TMS=$S($G(ZTSK(0)):+$G(ZTSK(1)),1:0) | 
|---|
| 127 | . ;--- Pending or Available | 
|---|
| 128 | . I (TMS=1)!(TMS=4)  S STATUS=TMS_U_$G(ZTSK(2))  Q | 
|---|
| 129 | . ;--- Running (actually, crashed ;-) | 
|---|
| 130 | . I TMS=2  S STATUS=100  Q | 
|---|
| 131 | . ;--- Finished, Interrupted or Undefined | 
|---|
| 132 | . I 'STATUS  S:TMS STATUS=TMS_U_$G(ZTSK(2))  Q | 
|---|
| 133 | . ;--- If the task record is not locked and the STATUS field shows | 
|---|
| 134 | . ;    'Suspended' (102) then the task probably crashed while it | 
|---|
| 135 | . ;--- was in the suspended state | 
|---|
| 136 | . S:STATUS=102 STATUS=100 | 
|---|
| 137 | ;--- Get the external value of the STATUS field (if necessary) | 
|---|
| 138 | I STATUS>0  D:$P(STATUS,U,2)="" | 
|---|
| 139 | . S $P(STATUS,U,2)=$$EXTERNAL^DILFD(798.8,2.01,,STATUS,"RORMSG") | 
|---|
| 140 | . S:$G(DIERR) STATUS=$$DBS^RORERR("RORMSG",-9,,,798.8) | 
|---|
| 141 | ; | 
|---|
| 142 | ;--- Unlock the task record | 
|---|
| 143 | L -@TASKNODE@("T",0) | 
|---|
| 144 | Q $TR(STATUS,">",":") | 
|---|
| 145 | ; | 
|---|
| 146 | ;***** RETURNS THE TASK INFORMATION | 
|---|
| 147 | ; | 
|---|
| 148 | ; TASK          Task number | 
|---|
| 149 | ; | 
|---|
| 150 | ; .INFO         Reference to a local variable (output): | 
|---|
| 151 | ; | 
|---|
| 152 | ; INFO( | 
|---|
| 153 | ;   OFFSET+1)           Task Number | 
|---|
| 154 | ;   OFFSET+2)           Task Type           (internal^external) | 
|---|
| 155 | ;   OFFSET+3)           Registry            (IEN^Name) | 
|---|
| 156 | ;   OFFSET+4)           Report              (Code^Name) | 
|---|
| 157 | ;   OFFSET+5)           Description | 
|---|
| 158 | ;   OFFSET+6)           Task Status         (internal^external) | 
|---|
| 159 | ;   OFFSET+7)           Creation Time       (internal) | 
|---|
| 160 | ;   OFFSET+8)           User                (DUZ^Name) | 
|---|
| 161 | ;   OFFSET+9)           Completion Time     (internal) | 
|---|
| 162 | ;   OFFSET+10)          Progress Percentage | 
|---|
| 163 | ;   OFFSET+11)          Scheduled to Run at (internal) | 
|---|
| 164 | ;   OFFSET+12)          Task Log IEN | 
|---|
| 165 | ;   OFFSET+13)          Job Number | 
|---|
| 166 | ;   OFFSET+14)          User Comment | 
|---|
| 167 | ; | 
|---|
| 168 | ; [FLAGS]       Characters controlling behavior of the function | 
|---|
| 169 | ;               (they can be combined): | 
|---|
| 170 | ;                 E  Return external values also (when applicable) | 
|---|
| 171 | ; | 
|---|
| 172 | ; [OFFSET]      A number that is added to all subscripts in the | 
|---|
| 173 | ;               destination array (by default, it is zero). | 
|---|
| 174 | ; | 
|---|
| 175 | ; Return Values: | 
|---|
| 176 | ;       <0  Error code | 
|---|
| 177 | ;        0  Ok | 
|---|
| 178 | ; | 
|---|
| 179 | TASKINFO(TASK,INFO,FLAGS,OFFSET) ; | 
|---|
| 180 | N I,IENS,RORBUF,RORMSG,TMP | 
|---|
| 181 | S FLAGS=$$UP^XLFSTR($G(FLAGS)) | 
|---|
| 182 | S OFFSET=$S($G(OFFSET)>0:+OFFSET,1:0) | 
|---|
| 183 | ;--- Clear the output array | 
|---|
| 184 | K:'OFFSET INFO  S TMP=$$TIN | 
|---|
| 185 | F I=1:1:TMP  S INFO(OFFSET+I)="" | 
|---|
| 186 | ;--- Get the task status | 
|---|
| 187 | S TMP=$$STATUS(TASK,,1)  Q:TMP<0 TMP | 
|---|
| 188 | S INFO(OFFSET+1)=TASK | 
|---|
| 189 | S INFO(OFFSET+6)=$S(FLAGS["E":TMP,1:+TMP) | 
|---|
| 190 | ;--- Load the task record | 
|---|
| 191 | S IENS=TASK_",",I=$S(FLAGS["E":"EIN",1:"IN") | 
|---|
| 192 | S TMP=".02;.03;.04;.05;.07;.08;1.01;2.02;2.03;2.04;4" | 
|---|
| 193 | D GETS^DIQ(798.8,IENS,TMP,I,"RORBUF","RORMSG") | 
|---|
| 194 | I $G(DIERR)  D  Q RC | 
|---|
| 195 | . S RC=$$DBS^RORERR("RORMSG",-9,,,798.8,IENS) | 
|---|
| 196 | ;--- Format the output array | 
|---|
| 197 | Q $$FRMTI^RORTSK03(OFFSET,.INFO,IENS,.RORBUF,FLAGS) | 
|---|
| 198 | ; | 
|---|
| 199 | ;***** RETURNS NUMBER OF NODES IN THE TASK INFORMATION ARRAY | 
|---|
| 200 | TIN() Q 14 | 
|---|