Really, this should be it, for the passing income.
[capital-apms-progress.git] / workflow / update-task.p
blob525e3055ac40268ecddcca7e6d86a34829011050
1 &ANALYZE-SUSPEND _VERSION-NUMBER UIB_v8r12
2 &ANALYZE-RESUME
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
8 Syntax :
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
15 Created : 17/1/1999
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.
25 /* Update-Types:
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.
32 * Update-Options:
33 * Options are comma-delimited, stringified field values.
34 * TaskInfo: <et>,<ec>,<type>
35 * StepInfo: <step due>,<step type>
37 * Results:
38 * results are comma-delimited, stringified values.
39 * Step ID: <step no>
42 /* _UIB-CODE-BLOCK-END */
43 &ANALYZE-RESUME
46 &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK
48 /* ******************** Preprocessor Definitions ******************** */
50 &Scoped-define PROCEDURE-TYPE Procedure
54 /* _UIB-PREPROCESSOR-BLOCK-END */
55 &ANALYZE-RESUME
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 */
65 &ANALYZE-RESUME
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 */
72 &ANALYZE-RESUME
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 */
79 &ANALYZE-RESUME
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 */
86 &ANALYZE-RESUME
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 */
93 &ANALYZE-RESUME
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 */
100 &ANALYZE-RESUME
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 */
107 &ANALYZE-RESUME
110 /* *********************** Procedure Settings ************************ */
112 &ANALYZE-SUSPEND _PROCEDURE-SETTINGS
113 /* Settings for THIS-PROCEDURE
114 Type: Procedure
115 Allow:
116 Frames: 0
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
127 HEIGHT = .17
128 WIDTH = 40.
129 /* END WINDOW DEFINITION */
131 &ANALYZE-RESUME
136 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK Procedure
139 /* *************************** Main Block *************************** */
141 CASE update-type:
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 ).
148 END CASE.
150 /* _UIB-CODE-BLOCK-END */
151 &ANALYZE-RESUME
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
169 WHILE success = No:
170 RUN VALUE( FlowRule.ConditionProgram ) ( FlowRule.ConditionProgramParam,
171 ROWID(FlowTask), ROWID(FlowStep), ROWID(FlowRule),
172 OUTPUT success ) NO-ERROR.
173 IF success THEN DO:
174 RUN VALUE( FlowRule.ActionProgram ) ( FlowRule.ActionProgramParam,
175 ROWID(FlowTask), ROWID(FlowStep), ROWID(FlowRule),
176 OUTPUT success ) NO-ERROR.
177 RETURN RETURN-VALUE.
178 END.
179 END.
181 RETURN "".
183 END FUNCTION.
185 /* _UIB-CODE-BLOCK-END */
186 &ANALYZE-RESUME
189 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION del-step Procedure
190 FUNCTION del-step RETURNS CHARACTER
191 ( INPUT delete-options AS CHAR ) :
192 /*------------------------------------------------------------------------------
193 Purpose:
194 Notes:
195 ------------------------------------------------------------------------------*/
196 DEF VAR step-no AS INT NO-UNDO.
197 DEF BUFFER OtherStep FOR FlowStep.
199 DO TRANSACTION:
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 "".
207 DELETE FlowStep.
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.
214 END.
215 END.
217 RETURN "". /* Function return value. */
219 END FUNCTION.
221 /* _UIB-CODE-BLOCK-END */
222 &ANALYZE-RESUME
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
230 Notes:
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).
243 DO TRANSACTION:
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.
252 END.
253 FlowTask.DueDate = new-due-date.
254 FlowTask.FlowTaskNo = new-task-no.
255 FIND CURRENT FlowTask NO-LOCK.
256 END.
258 in-due-date = new-due-date.
259 in-task-no = new-task-no.
260 RETURN "". /* Function return value. */
262 END FUNCTION.
264 /* _UIB-CODE-BLOCK-END */
265 &ANALYZE-RESUME
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.
290 DO TRANSACTION:
291 FIND CURRENT FlowTask EXCLUSIVE-LOCK.
292 CREATE FlowStep.
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.
303 END.
305 RETURN STRING(step-no).
307 END FUNCTION.
309 /* _UIB-CODE-BLOCK-END */
310 &ANALYZE-RESUME
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.
330 DO TRANSACTION:
331 CREATE FlowTask.
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 "").
341 END.
343 in-task-no = task-no.
345 IF AVAILABLE(FlowTaskType) THEN DO:
346 new-step( STRING(due-date,"99/99/9999") + "," + FlowTaskType.InitialStep ).
347 END.
349 RETURN "".
351 END FUNCTION.
353 /* _UIB-CODE-BLOCK-END */
354 &ANALYZE-RESUME
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
363 new status.
364 ------------------------------------------------------------------------------*/
365 DEF VAR step-no AS INT NO-UNDO.
366 DEF BUFFER OtherStep FOR FlowStep.
368 DO TRANSACTION:
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.
385 END.
386 END.
388 RETURN "". /* Function return value. */
390 END FUNCTION.
392 /* _UIB-CODE-BLOCK-END */
393 &ANALYZE-RESUME
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
401 so forth.
402 Notes: Users shouldn't resort to this too often - it's more of a System Admin
403 sort of function.
404 IF done-options contains a non-null value that will be used for the
405 new status.
406 ------------------------------------------------------------------------------*/
407 DEF VAR new-status AS CHAR NO-UNDO INITIAL "DONE".
409 DO TRANSACTION:
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.
417 END.
418 FlowTask.ActivityStatus = new-status.
419 FlowTask.StatusUpdateDate = TODAY.
420 FIND CURRENT FlowTask NO-LOCK.
421 END.
423 RETURN "". /* Function return value. */
425 END FUNCTION.
427 /* _UIB-CODE-BLOCK-END */
428 &ANALYZE-RESUME