Code to set Assignee to 'Auto-follow' when assigned to an Incident

Carl Fransen1
Tera Guru

Hi All,

I'm trying to implement some code to automatically set the assignee of an Incident.   I have created a Before Business Rule called 'Set Assignee to Auto-Follow', on the 'Incident' table, run on 'insert' and 'update', order 100, condition 'active=true'.   Code for this is below:

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

//Auto add user as a follower of record  

var gp = new GlideRecord('live_group_profile');  

gp.addQuery('document', current.sys_id);  

gp.addQuery('table', current.getTableName());  

gp.query();  

if (gp.next()) {  

      gs.info('Profile record == ' + gp.short_description);  

      addMember(gp.sys_id, current.assigned_to);  

}  

 

function addMember(id, user) {  

      //first need to check if assigned to user has live feed profile  

      var lpUser = checkLiveFeedProfile(user);  

      //now to check to see if user is in group already, if not, add  

      var gr = new GlideRecord('live_group_member');  

      gr.addQuery('group.sys_id', id);  

      gr.addQuery('member.sys_id', lpUser);  

      gr.query();  

      if (gr.next() && (gr.state == 'active' || gr.state == 'admin')) { //need to make sure user wasn't already following.  

              gs.info('user =' + gr.member.name + ' already a member as ' + gr.state);  

      } else {  

              //this will handle if user was in group already but inactive(meaning they unfollow record) and will just create member if not in group already  

              gs.info('User = ' + user.name + ' was added/reactivated to live group');  

              gr.state = 'active';  

              gr.group = id;  

              gr.member = lpUser;  

              gr.update();  

      }  

}  

 

function checkLiveFeedProfile(user) {  

      var lp = new GlideRecord('live_profile');  

      lp.addQuery('document', user);  

      lp.query();  

      if (lp.next()) {  

              //user already has live profile  

              gs.info('User ' + lp.name + ' had an live feed account');  

              return lp.sys_id;  

      } else {  

              //create one  

              gs.info('user ' + user.name + ' did not have live feed profile account. creating now...');  

              lp.table = 'sys_user';  

              lp.document = user.sys_id;  

              lp.type = 'user';  

              lp.name = user.name;  

              return lp.update();  

      }  

}

})(current, previous);

The code was used from another post which is Make a user a follower via a script   - but I can't get it working - although others appear to have it working successfully...

The debug below shows it's running, see below - but when I impersonate the user assigned to a ticket they aren't automatically set to 'following'.

13:51:14.103: Global ==> 'Set Assignee to Auto-Follow' on incident:INC0044360

13:51:14.104: Execute before query business rules on live_group_profile:

13:51:14.104: Global ==> 'LiveFeed Group Profile Visibility' on live_group_profile:

13:51:14.104: Global <== 'LiveFeed Group Profile Visibility' on live_group_profile:

13:51:14.104: Global ==> 'LiveFeed Group Profile Visibility 2.0' on live_group_profile:

13:51:14.105: Global <== 'LiveFeed Group Profile Visibility 2.0' on live_group_profile:

13:51:14.105: Finished executing before query business rules on live_group_profile:

13:51:14.107: Global <== 'Set Assignee to Auto-Follow' on incident:INC0044360

I'm hoping I've just forgotten something simple - any help is appreciated!

I will also need to do this for HR Cases, but once I have the above working I'll be able to transfer this across.

1 ACCEPTED SOLUTION

Hi Carl,



Made one update to the script. Please try this and let me know if it works.



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



//Auto add user as a follower of record    


var gp = new GlideRecord('live_group_profile');    


gp.addQuery('document', current.sys_id);    


gp.addQuery('table', current.getTableName());    


gp.query();    


if (gp.next()) {    


      gs.addInfoMessage('Profile record == ' + gp.short_description);    


      addMember(gp.sys_id, current.assigned_to);    


}


else


{


  gp.initialize();


gp.setWorkflow(false);


  gp.name = current.number;


  gp.short_description = current.short_description;


  gp.document = current.sys_id;


  gp.document_group = "true";


  gp.table = current.getTableName();


  gp.visible_group = "false";


  gp.public_group = "false";


  var gpid = gp.insert();


addMember(gpid, current.assigned_to);


}


   


function addMember(id, user) {    


      //first need to check if assigned to user has live feed profile    


      var lpUser = checkLiveFeedProfile(user);    


      //now to check to see if user is in group already, if not, add    


      var gr = new GlideRecord('live_group_member');    


      gr.addQuery('group.sys_id', id);    


      gr.addQuery('member.sys_id', lpUser);    


      gr.query();    


      if (gr.next() && (gr.state == 'active' || gr.state == 'admin')) { //need to make sure user wasn't already following.    


              gs.addInfoMessage('user =' + gr.member.name + ' already a member as ' + gr.state);



      } else {    


              //this will handle if user was in group already but inactive(meaning they unfollow record) and will just create member if not in group already    


              gs.addInfoMessage('User = ' + user.name + ' was added/reactivated to live group');    


              gr.state = 'active';    


              gr.group = id;    


              gr.member = lpUser;    


              gr.update();    



      }    


}    


   


function checkLiveFeedProfile(user) {    


      var lp = new GlideRecord('live_profile');    


      lp.addQuery('document', user);    


      lp.query();    


      if (lp.next()) {    


              //user already has live profile    


              gs.addInfoMessage('User ' + lp.name + ' had an live feed account');    


              return lp.sys_id;    


      } else {    


              //create one    


              gs.addInfoMessage('user ' + user.name + ' did not have live feed profile account. creating now...');    


              lp.table = 'sys_user';    


              lp.document = user.sys_id;    


              lp.type = 'user';    


              lp.name = user.name;    


              return lp.update();    


      }    


}


})(current, previous);



Please mark this response as correct or helpful if it assisted you with your question.

View solution in original post

28 REPLIES 28

Thanks for that Sanjiv - this now works all as required.



Only thing i had to do was run the business rue in the Global scope and not the HR:Code scope as the new line 'gp.setWorkflow(false);' produced an error when called under the HR scope.


You may try creating a cross scope privilege record and see if it works


How to use 'setWorkflow' in scoped app scripting


find_real_file.png



Please mark this response as correct or helpful if it assisted you with your question.

Hi Sanjiv,



Tried that - it didn;t work as it's not the 'live_group_profile' it's having trouble with - see the below error message:



Access to api 'setWorkflow' from scope 'sn_hr_core' has been refused due to the api's cross-scope access policy



It looks like it's the api 'setWorkflow' - i tried a few things but couldn't get the right value for the 'Target Name'... I'm assuming the 'Target Type' should also be set to 'script include' or 'scriptable'


I tried on my person dev instance. It worked fine for me. While creating the business rule can you make sure the Application is set to Global?


find_real_file.png



Please mark this response as correct or helpful if it assisted you with your question.

Yes that's what i ended up doing and it worked for me - i just wasn't sure if running a BR on a Global Scope in the HR Scope was an issue, but thanks!



Now if we could only get the below working when the assignee is added as a follower I'll be a happy camper!



find_real_file.png