1 &ANALYZE-SUSPEND _VERSION-NUMBER UIB_v8r12
3 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS Procedure
4 /*--------------------------------------------------------------------------
5 File
: workflow
/update-task.p
6 Purpose
: Update FlowTask
/FlowStep records to reflect changes
10 Description
: Program accepts a variety of instructions to revalidate
11 task and step information including setup of new tasks
12 and notification of completion of existing tasks.
14 Author
(s
) : Andrew McMillan
16 Notes
: Lacking in functionality as yet. It will grow.
17 ------------------------------------------------------------------------*/
19 DEF INPUT-OUTPUT PARAMETER in-due-date
LIKE FlowTask.DueDate
NO-UNDO.
20 DEF INPUT-OUTPUT PARAMETER in-task-no
LIKE FlowTask.FlowTaskNo
NO-UNDO.
21 DEF INPUT PARAMETER update-type
AS CHAR NO-UNDO.
22 DEF INPUT PARAMETER update-options
AS CHAR NO-UNDO.
23 DEF OUTPUT PARAMETER out-results
AS CHAR NO-UNDO.
26 * NewTask Add a new task. Options is task info.
27 * TaskDone Task is now complete
28 * StepDone Step is now complete. Options is StepNo.
29 * NewStep Add a new step. Options is step info. Results is new Step No.
30 * MoveTask Change the date of a task.
33 * Options are comma-delimited
, stringified field values.
34 * TaskInfo
: <et
>,<ec
>,<type
>
35 * StepInfo
: <step due
>,<step type
>
38 * results are comma-delimited
, stringified values.
42 /* _UIB-CODE-BLOCK-END
*/
46 &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK
48 /* ******************** Preprocessor Definitions
******************** */
50 &Scoped-define PROCEDURE-TYPE Procedure
54 /* _UIB-PREPROCESSOR-BLOCK-END
*/
58 /* ************************ Function Prototypes
********************** */
60 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD apply-rules Procedure
61 FUNCTION apply-rules
RETURNS CHARACTER
62 ( INPUT due-date
AS DATE, INPUT task-no
AS INT, INPUT step-no
AS INT ) FORWARD.
64 /* _UIB-CODE-BLOCK-END
*/
67 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD del-step Procedure
68 FUNCTION del-step
RETURNS CHARACTER
69 ( INPUT delete-options
AS CHAR ) FORWARD.
71 /* _UIB-CODE-BLOCK-END
*/
74 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD move-task Procedure
75 FUNCTION move-task
RETURNS CHARACTER
76 ( INPUT move-options
AS CHAR ) FORWARD.
78 /* _UIB-CODE-BLOCK-END
*/
81 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD new-step Procedure
82 FUNCTION new-step
RETURNS CHARACTER
83 ( INPUT step-options
AS CHAR ) FORWARD.
85 /* _UIB-CODE-BLOCK-END
*/
88 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD new-task Procedure
89 FUNCTION new-task
RETURNS CHARACTER
90 ( INPUT task-options
AS CHAR ) FORWARD.
92 /* _UIB-CODE-BLOCK-END
*/
95 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD step-done Procedure
96 FUNCTION step-done
RETURNS CHARACTER
97 ( INPUT done-options
AS CHAR ) FORWARD.
99 /* _UIB-CODE-BLOCK-END
*/
102 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD task-done Procedure
103 FUNCTION task-done
RETURNS CHARACTER
104 ( INPUT done-options
AS CHAR ) FORWARD.
106 /* _UIB-CODE-BLOCK-END
*/
110 /* *********************** Procedure Settings
************************ */
112 &ANALYZE-SUSPEND _PROCEDURE-SETTINGS
113 /* Settings for
THIS-PROCEDURE
117 Add Fields to
: Neither
118 Other Settings
: CODE-ONLY
COMPILE
120 &ANALYZE-RESUME _END-PROCEDURE-SETTINGS
122 /* ************************* Create Window
************************** */
124 &ANALYZE-SUSPEND _CREATE-WINDOW
125 /* DESIGN Window definition
(used by the UIB
)
126 CREATE WINDOW Procedure
ASSIGN
129 /* END WINDOW DEFINITION
*/
136 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Procedure
139 /* *************************** Main Block
*************************** */
142 WHEN "NewTask" THEN out-results
= new-task
( update-options
).
143 WHEN "NewStep" THEN out-results
= new-step
( update-options
).
144 WHEN "TaskDone" THEN out-results
= task-done
( update-options
).
145 WHEN "StepDone" THEN out-results
= step-done
( update-options
).
146 WHEN "DelStep" THEN out-results
= del-step
( update-options
).
147 WHEN "MoveTask" THEN out-results
= move-task
( update-options
).
150 /* _UIB-CODE-BLOCK-END
*/
154 /* ************************ Function Implementations
***************** */
156 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION apply-rules Procedure
157 FUNCTION apply-rules
RETURNS CHARACTER
158 ( INPUT due-date
AS DATE, INPUT task-no
AS INT, INPUT step-no
AS INT ) :
159 /*------------------------------------------------------------------------------
160 Purpose
: Apply rules resulting from completion of this step
161 Notes
: Task and Step are expected to be found and locked
162 ------------------------------------------------------------------------------*/
163 DEF VAR success
AS LOGI
NO-UNDO INITIAL No.
165 FIND FlowStepType
OF FlowStep
NO-LOCK NO-ERROR.
167 FOR EACH FlowRule
NO-LOCK WHERE FlowRule.FlowTaskType
= FlowStep.FlowTaskType
168 AND FlowRule.FlowStepType
= FlowStep.FlowStepType
170 RUN VALUE( FlowRule.ConditionProgram
) ( FlowRule.ConditionProgramParam
,
171 ROWID(FlowTask
), ROWID(FlowStep
), ROWID(FlowRule
),
172 OUTPUT success
) NO-ERROR.
174 RUN VALUE( FlowRule.ActionProgram
) ( FlowRule.ActionProgramParam
,
175 ROWID(FlowTask
), ROWID(FlowStep
), ROWID(FlowRule
),
176 OUTPUT success
) NO-ERROR.
185 /* _UIB-CODE-BLOCK-END
*/
189 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION del-step Procedure
190 FUNCTION del-step
RETURNS CHARACTER
191 ( INPUT delete-options
AS CHAR ) :
192 /*------------------------------------------------------------------------------
195 ------------------------------------------------------------------------------*/
196 DEF VAR step-no
AS INT NO-UNDO.
197 DEF BUFFER OtherStep
FOR FlowStep.
200 FIND FlowTask
WHERE FlowTask.DueDate
= in-due-date
201 AND FlowTask.FlowTaskNo
= in-task-no
EXCLUSIVE-LOCK NO-ERROR.
202 IF NOT AVAILABLE(FlowTask
) THEN RETURN "".
203 step-no
= INT(delete-options
).
204 FIND FlowStep
OF FlowTask
WHERE FlowStep.FlowStepNo
= step-no
EXCLUSIVE-LOCK NO-ERROR.
205 IF NOT AVAILABLE(FlowStep
) THEN RETURN "".
209 /* if there aren't any un-done steps
, then the whole task is finished
*/
210 FIND OtherStep
OF FlowTask
WHERE OtherStep.ActivityStatus
<> "DONE" NO-LOCK NO-ERROR.
211 IF NOT AVAILABLE(OtherStep
) THEN DO:
212 FlowTask.ActivityStatus
= "DONE".
213 FlowTask.StatusUpdateDate
= TODAY.
217 RETURN "".
/* Function return value.
*/
221 /* _UIB-CODE-BLOCK-END
*/
225 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION move-task Procedure
226 FUNCTION move-task
RETURNS CHARACTER
227 ( INPUT move-options
AS CHAR ) :
228 /*------------------------------------------------------------------------------
229 Purpose
: Change the date for a task
231 ------------------------------------------------------------------------------*/
232 DEF VAR new-due-date
AS DATE NO-UNDO.
233 DEF VAR date-diff
AS INT NO-UNDO.
234 DEF VAR new-task-no
AS INT NO-UNDO.
236 DEF BUFFER LastTask
FOR FlowTask.
238 new-due-date
= DATE(move-options
).
239 date-diff
= (new-due-date
- in-due-date
).
240 FIND LAST LastTask
WHERE LastTask.DueDate
= new-due-date
NO-LOCK NO-ERROR.
241 new-task-no
= 1 + (IF AVAILABLE(LastTask
) THEN LastTask.FlowTaskNo
ELSE 0).
244 FIND FlowTask
WHERE FlowTask.DueDate
= in-due-date
245 AND FlowTask.FlowTaskNo
= in-task-no
EXCLUSIVE-LOCK NO-ERROR.
246 IF NOT AVAILABLE(FlowTask
) THEN RETURN "".
247 FOR EACH FlowStep
OF FlowTask
EXCLUSIVE-LOCK:
248 FlowStep.DueDate
= new-due-date.
249 FlowStep.FlowTaskNo
= new-task-no.
250 FlowStep.StepDueDate
= FlowStep.StepDueDate
+ date-diff.
251 FlowStep.NotifyDate
= FlowStep.NotifyDate
+ date-diff.
253 FlowTask.DueDate
= new-due-date.
254 FlowTask.FlowTaskNo
= new-task-no.
255 FIND CURRENT FlowTask
NO-LOCK.
258 in-due-date
= new-due-date.
259 in-task-no
= new-task-no.
260 RETURN "".
/* Function return value.
*/
264 /* _UIB-CODE-BLOCK-END
*/
268 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION new-step Procedure
269 FUNCTION new-step
RETURNS CHARACTER
270 ( INPUT step-options
AS CHAR ) :
271 /*------------------------------------------------------------------------------
272 Purpose
: Create a new step for the task.
273 ------------------------------------------------------------------------------*/
274 DEF VAR due-date
AS DATE NO-UNDO.
275 DEF VAR task-no
AS INT NO-UNDO.
276 DEF VAR step-no
AS INT NO-UNDO.
277 DEF VAR step-type
AS CHAR NO-UNDO.
279 due-date
= in-due-date.
280 task-no
= in-task-no.
281 FIND FlowTask
WHERE FlowTask.DueDate
= due-date
282 AND FlowTask.FlowTaskNo
= task-no
NO-LOCK.
283 FIND LAST FlowStep
OF FlowTask
NO-LOCK NO-ERROR.
284 step-no
= (IF AVAILABLE(FlowStep
) THEN FlowStep.FlowStepNo
ELSE 0) + 1.
286 step-type
= ENTRY(2,step-options
).
287 FIND FlowStepType
WHERE FlowStepType.FlowTaskType
= FlowTask.FlowTaskType
288 AND FlowStepType.FlowStepType
= step-type
NO-LOCK NO-ERROR.
291 FIND CURRENT FlowTask
EXCLUSIVE-LOCK.
293 BUFFER-COPY FlowTask
TO FlowStep
ASSIGN
294 FlowStep.FlowStepNo
= step-no
295 FlowStep.FlowStepType
= step-type
296 FlowStep.StatusUpdateDate
= TODAY
297 FlowStep.ActivityStatus
= (IF AVAILABLE(FlowStepType
) THEN FlowStepType.InitialStatus
ELSE "TODO")
298 FlowStep.Priority
= (IF AVAILABLE(FlowStepType
) THEN FlowStepType.InitialPriority
ELSE 1)
299 FlowStep.Description
= (IF AVAILABLE(FlowStepType
) THEN FlowStepType.Description
ELSE "")
300 FlowStep.StepDueDate
= DATE(ENTRY(1,step-options
)).
301 FIND CURRENT FlowStep
NO-LOCK.
302 FIND CURRENT FlowTask
NO-LOCK.
305 RETURN STRING(step-no
).
309 /* _UIB-CODE-BLOCK-END
*/
313 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION new-task Procedure
314 FUNCTION new-task
RETURNS CHARACTER
315 ( INPUT task-options
AS CHAR ) :
316 /*------------------------------------------------------------------------------
317 Purpose
: Create a new task. Create a first step for the task as well
318 ------------------------------------------------------------------------------*/
319 DEF VAR due-date
AS DATE NO-UNDO.
320 DEF VAR task-no
AS INT NO-UNDO.
321 DEF VAR task-type
AS CHAR NO-UNDO.
323 due-date
= in-due-date.
324 IF due-date
= ?
THEN RETURN "BAD-DATE".
325 FIND LAST FlowTask
WHERE FlowTask.DueDate
= due-date
NO-LOCK NO-ERROR.
326 task-no
= (IF AVAILABLE(FlowTask
) THEN FlowTask.FlowTaskNo
ELSE 0) + 1.
327 task-type
= ENTRY(3,task-options
).
328 FIND FlowTaskType
WHERE FlowTaskType.FlowTaskType
= task-type
NO-LOCK NO-ERROR.
332 FlowTask.DueDate
= due-date.
333 FlowTask.FlowTaskNo
= task-no.
334 FlowTask.EntityType
= ENTRY(1,task-options
).
335 FlowTask.EntityCode
= INT(ENTRY(2,task-options
)).
336 FlowTask.FlowTaskType
= task-type.
337 FlowTask.StatusUpdateDate
= TODAY.
338 FlowTask.JobLogNo
= NEXT-VALUE( JobLogNo
).
339 FlowTask.ActivityStatus
= "TODO".
340 FlowTask.Description
= (IF AVAILABLE(FlowTaskType
) THEN FlowTaskType.Description
ELSE "").
343 in-task-no
= task-no.
345 IF AVAILABLE(FlowTaskType
) THEN DO:
346 new-step
( STRING(due-date
,"99/99/9999") + "," + FlowTaskType.InitialStep
).
353 /* _UIB-CODE-BLOCK-END
*/
357 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION step-done Procedure
358 FUNCTION step-done
RETURNS CHARACTER
359 ( INPUT done-options
AS CHAR ) :
360 /*------------------------------------------------------------------------------
361 Purpose
: Set the current step to
"DONE" and figure out what the next step is.
362 Notes
: IF done-options contains a non-null value that will be used for the
364 ------------------------------------------------------------------------------*/
365 DEF VAR step-no
AS INT NO-UNDO.
366 DEF BUFFER OtherStep
FOR FlowStep.
369 FIND FlowTask
WHERE FlowTask.DueDate
= in-due-date
370 AND FlowTask.FlowTaskNo
= in-task-no
EXCLUSIVE-LOCK NO-ERROR.
371 IF NOT AVAILABLE(FlowTask
) THEN RETURN "".
372 step-no
= INT(done-options
).
373 FIND FlowStep
OF FlowTask
WHERE FlowStep.FlowStepNo
= step-no
EXCLUSIVE-LOCK NO-ERROR.
374 IF NOT AVAILABLE(FlowStep
) THEN RETURN "".
376 FlowStep.ActivityStatus
= (IF done-options
<> ?
AND done-options
<> "" THEN done-options
ELSE "DONE").
377 FlowStep.StatusUpdateDate
= TODAY.
378 apply-rules
( in-due-date
, in-task-no
, step-no
).
380 /* if there aren't any un-done steps
, then the whole task is finished
*/
381 FIND OtherStep
OF FlowTask
WHERE OtherStep.ActivityStatus
<> "DONE" NO-LOCK NO-ERROR.
382 IF NOT AVAILABLE(OtherStep
) THEN DO:
383 FlowTask.ActivityStatus
= "DONE".
384 FlowTask.StatusUpdateDate
= TODAY.
388 RETURN "".
/* Function return value.
*/
392 /* _UIB-CODE-BLOCK-END
*/
396 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION task-done Procedure
397 FUNCTION task-done
RETURNS CHARACTER
398 ( INPUT done-options
AS CHAR ) :
399 /*------------------------------------------------------------------------------
400 Purpose
: Task is completed
- mark all steps as completed ignoring rules and
402 Notes
: Users shouldn't resort to this too often
- it's more of a System Admin
404 IF done-options contains a non-null value that will be used for the
406 ------------------------------------------------------------------------------*/
407 DEF VAR new-status
AS CHAR NO-UNDO INITIAL "DONE".
410 FIND FlowTask
WHERE FlowTask.DueDate
= in-due-date
411 AND FlowTask.FlowTaskNo
= in-task-no
EXCLUSIVE-LOCK NO-ERROR.
412 IF NOT AVAILABLE(FlowTask
) THEN RETURN "".
413 IF done-options
<> ?
AND done-options
<> "" THEN new-status
= done-options.
414 FOR EACH FlowStep
OF FlowTask
WHERE FlowStep.ActivityStatus
<> new-status
EXCLUSIVE-LOCK:
415 FlowStep.ActivityStatus
= new-status.
416 FlowStep.StatusUpdateDate
= TODAY.
418 FlowTask.ActivityStatus
= new-status.
419 FlowTask.StatusUpdateDate
= TODAY.
420 FIND CURRENT FlowTask
NO-LOCK.
423 RETURN "".
/* Function return value.
*/
427 /* _UIB-CODE-BLOCK-END
*/