- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-08-2015 08:18 AM
Hi,
I have a workflow on requested item table that creates a single catalog task. When this task closes, the item closes as expected. But when users
have added new catalog tasks outside of the WF using the New button, the requested item does not close after all it's tasks are closed. Any idea
how this can be achieved? I have put a 'Wait for Condition' that has the following code, but that doesn't seem to be helping:
checkTask();
function checkTask() {
var task_cnt = 0;
var closed_tasks = 0;
var catalog_task = new GlideRecord('sc_task');
catalog_task.addQuery('request_item',current.sys_id);
catalog_task.query();
task_cnt = catalog_task.getRowCount();
while(catalog_task.next()){
// We are checking, whether the state of task is closed, so "3" is the database value of closed complete state,
// "4" is closed incomplete and "7" is closed skipped
if(catalog_task.state == "3" || catalog_task.state == "4" || catalog_task.state == "7") {
closed_tasks = closed_tasks + 1;
}
}
if( closed_tasks == task_cnt)
{
answer = true;
}
}
Thanks,
Debashree
Solved! Go to Solution.
- 18,235 Views
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-08-2015 04:15 PM
Debashree,
The issue here is whenever the Workflow created task is closed then there will be a business rule which will run and invoke the Workflow on RITM. You need to have similarly for Manually created Tasks.
So, have a Business Rule on sc_task something like this:
Name: Invoke Workflow On RITM
When : onAfter
Order: 800
Condition : current.wf_activity.nil() && (current.state.changesTo(3) || current.state.changesTo(4) || current.state.changesTo(7))
Script:
// Run any workflow(s) so this task's state changes can be checked
runWorkflow_task();
function runWorkflow_task() {
if (!current.request_item.nil()) {
var gr = new GlideRecord('sc_req_item');
gr.addQuery("sys_id",current.request_item.toString());
gr.query();
if (gr.next()) {
new Workflow().broadcastEventToCurrentsContexts(gr, 'update', null);
}
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-09-2015 09:39 AM
Debashree,
That should not be a problem. As the other Business Rule(OOTB) though its running actually not doing anything as 'parent' field is blank.
Also, please mark the question as answered which will help others.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎04-09-2015 09:42 AM
Thanks a lot again!!!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-05-2015 09:22 AM
Hi Mani,
I will really really appreciate some help with this. Having got your suggested code to work, I decided to put it inside a script include and then call it in multiple WFs by doing the following:
var u_WorkFlow_wait_for_all_tasks_to_close = Class.create();
u_WorkFlow_wait_for_all_tasks_to_close.prototype = {
initialize: function() {
},
checkTaskState: function(task_id){
var gr_tsk = new GlideRecord("sc_task");
gr_tsk.addQuery('request_item', task_id); // get all tasks whose request_item field matches current.sys_id
gr_tsk.addQuery('active','true');
if (gr_tsk.next()) {
return false; // at least one manually created task is still open
} else {
return true; // all manually created tasks are closed
}
},
type: 'u_WorkFlow_wait_for_all_tasks_to_close'
};
Script in Wait for Condition on RITM WF:
var wait_for_close = new u_WorkFlow_wait_for_all_tasks_to_close();
wait_for_close.checkTaskState(current.sys_id);
I also have the business rule that invokes RITM WF when manually created task gets closed.
I am completely confused as to why this doesn't work. Any idea what I might be doing wrong????
Thanks,
Debashree
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-05-2015 09:46 AM
In the Wait for Condition try something like this:
var wait_for_close = new u_WorkFlow_wait_for_all_tasks_to_close();
answer = wait_for_close.checkTaskState(current.sys_id);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-05-2015 09:53 AM
Thanks for the suggestion. I had typed it incorrectly. I actually already had it the way you've suggested and it still doesn't work.