How to close request item when all it's tasks are closed

dp11
Tera Guru

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

1 ACCEPTED SOLUTION

manikorada
ServiceNow Employee
ServiceNow Employee

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


          }


    }


}


View solution in original post

28 REPLIES 28

For some reason, when I close the WF task and the Wait for Condition executes, I found using gs.log that the query does not return any rows even if there are open manual tasks.


manikorada
ServiceNow Employee
ServiceNow Employee

Debashree,



There is s bug in your code. You are missing 'quey()'


So have your script as :


              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');


              gr_tsk.query(); // This line is missing


              if (gr_tsk.next()) {


                      return false;   // at least one manually created task is still open


              } else {


                      return true; // all manually created tasks are closed


              }


},


Darn it!….that's what I had missing. Thanks so much for inspecting the code. Although I was looking at the code all this time the missing statement hadn't registered in my head. Thanks a lot again!!!!



Debashree


manikorada
ServiceNow Employee
ServiceNow Employee

Please mark the question as helpful/answered which will help others.


OK. Have marked as helpful where it allowed me to. Thanks!