Need to time out approvals after no response, cancelling the parent record. Should we Cancel or Reject the approvals?

josh_tessaro
Giga Expert

We have written a scheduled job that sends an 'Approval Pending' reminder to approvers every 3 days. We would like to eventually cancel the approvals due to no response and close the parent record while notifying the requester.

Initially it seams like setting the <sysapproval_approver.state> field to 'Cancelled' was the right move but this seems to have no affect on the parent record (sc_request or sc_req_item). So my options are either to write all the necessary business rules/ script includes to cancell the parent record when the approval is cancelled or to set <sysapproval_approver.state> field to 'Rejected'.

Has any one else encountered this? I am trying to determine the bast way to handle this.

1 ACCEPTED SOLUTION

Brad Tilton
ServiceNow Employee
ServiceNow Employee

It would probably be a little easier just to reject the approval and have it kick off all the automation through the workflow. You could have it add a note to the approval as well that it was auto-rejected or something like that.


View solution in original post

4 REPLIES 4

Brad Tilton
ServiceNow Employee
ServiceNow Employee

It would probably be a little easier just to reject the approval and have it kick off all the automation through the workflow. You could have it add a note to the approval as well that it was auto-rejected or something like that.


robpickering
ServiceNow Employee
ServiceNow Employee

Josh, we do exactly this, but instead of canceling the approval, we auto-reject it.



Here is the Script Include that I use, which is called from a Scheduled Job.


There are two fields we added to the sysapproval_approver table:   u_num_of_reminders and u_reminder_date, that are used to determine the last reminder sent, and the total number of reminders sent.   Once you hit 3 reminders, the approval is rejected.   It can obviously be tuned to your business practice.



var ReqApprovalReminder = Class.create();
ReqApprovalReminder.prototype = {
      initialize: function() {
      },
      RequestApproReminder : function(){
              var appr = new GlideRecord('sysapproval_approver');
              appr.addQuery('state','requested');
              appr.addEncodedQuery('sys_created_onRELATIVELE@hour@ago@24');
              appr.query();
              var noOfdays = 0;
              while(appr.next()){
                      if(appr.u_reminder_date!= ""){
                              var dateDiff = gs.dateDiff(appr.u_reminder_date.getDisplayValue(),gs.nowDateTime(),false);
                              noOfdays = dateDiff.split(" ")[0];
                      }
                      if((appr.u_num_of_reminders == "") || (appr.u_num_of_reminders == 0)) {
                              //gs.eventQueue("reminder.emails", appr, gs.getUserID(), gs.getUserName());
                              // If you want to some specific order guide uncomment if
                              //if(appr.sysapproval.u_order_guide == 'OrderGuid_Sys_is'){      
                              gs.eventQueue("approval.reminders", appr, appr.approver.sys_id, appr.approver.name);
                              appr.u_num_of_reminders += 1;   // 1st Reminder sent
                              appr.u_reminder_date = gs.nowDateTime();                              
                              //}
                        } else if ((appr.u_num_of_reminders == 1) && (noOfdays > 2)) {
                              //if(appr.sysapproval.u_order_guide == 'OrderGuid_Sys_is'){
                              gs.eventQueue("approval.reminders", appr, appr.approver.sys_id, appr.approver.name);
                              appr.u_num_of_reminders += 1;// 2nd Reminder sent
                              appr.u_reminder_date = gs.nowDateTime();
                              //}              
                      } else if ((appr.u_num_of_reminders == 2) && (noOfdays > 10)) {
                              //if(appr.sysapproval.u_order_guide == 'OrderGuid_Sys_is'){
                              gs.eventQueue("approval.cancelled", appr, appr.approver.sys_id, appr.approver.name);
                              appr.state = 'rejected'; // Now Request Cancelled
                              appr.comments = 'Approval automatically rejected by system due to time expiration';
                              appr.u_num_of_reminders += 1;
                              appr.u_reminder_date = gs.nowDateTime();
                                                     
                              //var reqNum = appr.sysapproval.number;
                              //this._cancellRequest(reqNum);                      
                              //}
                      }
                      appr.update();
              }
      },
      _cancellRequest: function(reqNum){                      
              var scReq = new GlideRecord("sc_request");
              scReq.addQuery('number',reqNum);
              scReq.query();
              if(scReq.next()){                      
                      scReq.state = 4;
                      scReq.stage = 'closed_incomplete';
                      scReq.request_state = 'closed_cancelled';
                      scReq.update();
              }
      }};


Thie is close to what I am trying to do. Does cancelling the request in this manner leave the approval record and Requested items open?


That's what _cancelrequest will do, but I didn't implement it, because our workflow automatically cancels the requests whenever the approval is rejected, so we rely on the Workflow to handle those issues, not the Script Include.



-Rob