How to copy approver name, approved datetime and approval status into a field in task

omsa1
Kilo Guru

Hi All,

I need help with this , i'm trying to copy approval details into task field

i tried with script include, but something   missing here ,it is not creating a task after approval.

var AddApproverDateTime = Class.create();  

AddApproverDateTime.prototype = {  

  initialize: function() {  

  },  

  addDateTime: function(id) {  

  var sys_updated_on =' ';  

  var gr= new GlideRecord('sc_req_item');  

  gr.get(id);  

  var apv = new GlideRecord('sysapproval_approver');  

  var qc=apv.addQuery('sysapproval',gr.getValue('request'));  

  qc.addOrCondition('sysapproval', gr.getValue('sys_id'));  

  apv.addQuery('sys_updated_on','!=',''); // add this to only find approvals that have comments on them  

  apv.query();  

  while (apv.next()) { // change if to while so it will go through all approvals with comments  

  DateTime += "\nApproval DateTime: from " + apv.approver.name + "\n" + apv.sys_updated_on; // add approver name here  

  }  

  return DateTime;  

 

},  

type: 'AddApproverDateTime'  

};  

1 ACCEPTED SOLUTION

Rama Chandra D
Kilo Guru

Hi,



Follow the steps:



  1. Create a BR on sc_task table.   Set when as 'after' and check 'advanced' and 'insert' options .
  2. Check the script to ensure, all the field names are populated as per your instance.
  3. Use the script below and paste it into 'advance script'.
  4. It is advised to test the script on non-production instances before implementing this modification


Script



(function executeRule(current, previous /*null when async*/) {



  var msg1 = '';


  var msg2 = '';


  var app =[];


  var count = 0;


  getApprovalDetails();


  gs.info(current.request_item.sys_id);



  function getApprovalDetails() {


  var thisTask = new GlideRecord('sysapproval_approver');


  thisTask.addEncodedQuery('sysapproval='+current.request_item.sys_id);


  thisTask.orderBy('sys_updated_on');


  thisTask.query();


  while(thisTask.next()){


  count = count+1;


  gs.info(thisTask.approver.getDisplayValue());


  gs.info("Updated: "+thisTask.sys_updated_on.getDisplayValue());


  updateFields(thisTask,count);


  }


  gs.info(count);


  updateTask();


  }



  function updateFields(rec,count) {


  if(count>1){


  msg2 = "Approved by "+rec.approver.getDisplayValue() + " on "+ rec.sys_updated_on.getDisplayValue();


  gs.info("MSG 2: "+msg2);


  }


  else {


  msg1= "Approved by "+rec.approver.getDisplayValue() + " on "+ rec.sys_updated_on.getDisplayValue();


  gs.info("MSG 1: "+msg1);



  }


  }



  function updateTask() {


  var task = new GlideRecord('sc_task');


  task.addQuery('sys_id',current.sys_id);


  task.query();


  if(task.next()){


  task.u_manager_s_approval.setValue(msg1);


  task.u_marketing_ops_approval.setValue(msg2);


  task.update();


  }


  }


})(current, previous);



The gs.info statements are to debug. You can remove them or keep them.



Please, see the image for the output.



Darshak


View solution in original post

24 REPLIES 24

and also i would like to standardize the time zone for approval to MST



field names :



u_marketing_ops_approval


u_manager_s_approval





Is there any reason you want to do this in workflow? Since you have two approvals and task is created after the approval, you may need to store the values at each stage on scratchpad and then write the values to appropriate fields in Catalog Task activity.


Is there a better way to do this?


so far i only manage to find by adding script include.


i'm fine with any solution as long as it work as expected.


Well, I Initially thought of a BR to update the fields. But, I'm still thinking a better way since you need to make a distinction between two stages. I can write a BR on update on approval tables, to update the manager approval fields but I'm curious if the order works all the time, since the first record on approval table will be managers and the second for the same record would be of Joan and Dhatre.


Rama Chandra D
Kilo Guru

Hi,



Follow the steps:



  1. Create a BR on sc_task table.   Set when as 'after' and check 'advanced' and 'insert' options .
  2. Check the script to ensure, all the field names are populated as per your instance.
  3. Use the script below and paste it into 'advance script'.
  4. It is advised to test the script on non-production instances before implementing this modification


Script



(function executeRule(current, previous /*null when async*/) {



  var msg1 = '';


  var msg2 = '';


  var app =[];


  var count = 0;


  getApprovalDetails();


  gs.info(current.request_item.sys_id);



  function getApprovalDetails() {


  var thisTask = new GlideRecord('sysapproval_approver');


  thisTask.addEncodedQuery('sysapproval='+current.request_item.sys_id);


  thisTask.orderBy('sys_updated_on');


  thisTask.query();


  while(thisTask.next()){


  count = count+1;


  gs.info(thisTask.approver.getDisplayValue());


  gs.info("Updated: "+thisTask.sys_updated_on.getDisplayValue());


  updateFields(thisTask,count);


  }


  gs.info(count);


  updateTask();


  }



  function updateFields(rec,count) {


  if(count>1){


  msg2 = "Approved by "+rec.approver.getDisplayValue() + " on "+ rec.sys_updated_on.getDisplayValue();


  gs.info("MSG 2: "+msg2);


  }


  else {


  msg1= "Approved by "+rec.approver.getDisplayValue() + " on "+ rec.sys_updated_on.getDisplayValue();


  gs.info("MSG 1: "+msg1);



  }


  }



  function updateTask() {


  var task = new GlideRecord('sc_task');


  task.addQuery('sys_id',current.sys_id);


  task.query();


  if(task.next()){


  task.u_manager_s_approval.setValue(msg1);


  task.u_marketing_ops_approval.setValue(msg2);


  task.update();


  }


  }


})(current, previous);



The gs.info statements are to debug. You can remove them or keep them.



Please, see the image for the output.



Darshak