Round Robin assignation for Incident using Schedules

prasannakumard
Tera Guru

Hi Team,

 

We have requirement about Round Robin assignment using Schedules

 

We have different schedules for a group of members like below:

Schedule 1: 7am - 4pm 

Schedule 2: 8am - 5pm 

Schedule 3: 9am - 6pm 

Schedule 4: 10am - 7pm 

 

If user is in 7am-4pm schedule, we can directly assign the tickets to him from 7am to 8am, after that second person will join and based on Round Robin, we need to assign the tickets to them.

 

Same way, if user is in 8am-5pm, based on Round robin only we need to assign the ticket to schedule 1, schedule2, and schedule 3 persons. 

 

FYI, We have idea about checking current time in schedule or not. But, how to start this requirement to satisfy all the conditions.

 

We have written sample code for above requirement: Please modify if anything required.

var usrArr = [];
var grMember = new GlideRecord('sys_user_grmember');
grMember.addQuery('group', '217db28047e12110a789fa8bd36d43a6');
grMember.orderBy('user.u_last_assigned_incident_date');
grMember.query();
while(grMember.next()) {
usrArr.push(grMember.user);

}
gs.print(usrArr.length);
for(var i=0;i<=usrArr.length;i++){
var usr = new GlideRecord('sys_user');
usr.addQuery('sys_id',grMember.user);
usr.query();
if(usr.next()){

var sched = new GlideSchedule(usr.u_shift_schedule);
var curTime = new GlideDateTime();
gs.print(sched.isInSchedule(curTime));
if(sched.isInSchedule(curTime)){
gs.print("Yes: "+grMember.user.name);
}
else{
gs.print("No: "+grMember.user.name);
}
}

}

Please provide your approaches to solve this requirement. 

Thanks & Regards,

Prasanna Kumar

1 ACCEPTED SOLUTION

  1. First, you need to identify the members who are available to take the ticket based on their schedules.

  2. For each schedule, you need to check if any member is available during the current time. You can use the GlideSchedule API to check if a member is in schedule or not.

  3. Once you have identified the available members for each schedule, you can implement the Round Robin algorithm to assign tickets to them. You can keep track of the last member who was assigned a ticket and assign the next ticket to the next available member in the list.

  4. If there are no available members for a schedule, you can skip that schedule and move on to the next one.

// Get all the members of the group
var usrArr = [];
var grMember = new GlideRecord('sys_user_grmember');
grMember.addQuery('group', '217db28047e12110a789fa8bd36d43a6');
grMember.orderBy('user.u_last_assigned_incident_date');
grMember.query();
while(grMember.next()) {
usrArr.push(grMember.user);
}

// Get the current time
var curTime = new GlideDateTime();

// Loop through each schedule
for (var i = 1; i <= 4; i++) {
var schedule = "Schedule " + i;
var availableMembers = [];

// Check if any member is available during the current time
for (var j = 0; j < usrArr.length; j++) {
    var user = new GlideRecord('sys_user');
    user.addQuery('sys_id', usrArr[j]);
    user.query();
    if (user.next()) {
        var userSchedule = new GlideSchedule(user.u_shift_schedule);
        if (userSchedule.isInSchedule(curTime)) {
            availableMembers.push(user.sys_id);
        }
    }
}

// If there are no available members for this schedule, skip it
if (availableMembers.length == 0) {
    continue;
}

// Get the last member who was assigned a ticket for this schedule
var lastAssigned = gs.getProperty(schedule + " Last Assigned");
if (lastAssigned == "") {
    lastAssigned = availableMembers[0];
}

// Assign the ticket to the next available member in the list
var nextAssigned = "";
for (var k = 0; k < availableMembers.length; k++) {
    if (availableMembers[k] == lastAssigned) {
        if (k == availableMembers.length - 1) {
            nextAssigned = availableMembers[0];
        } else {
            nextAssigned = availableMembers[k+1];
        }
        break;
    }
}

// Update the last assigned property for this schedule
gs.setProperty(schedule + " Last Assigned", nextAssigned);
gs.print("Ticket assigned to " + nextAssigned + " for " + schedule);

Note: In this code, we are using ServiceNow's global properties to store the last assigned member for each schedule. You need to create a global property for each schedule with the name "Schedule x Last Assigned" (replace "x" with the schedule number) before running the code.

View solution in original post

6 REPLIES 6

Sankar N
Kilo Guru

To implement the Round Robin assignment using Schedules in ServiceNow, you can follow the below steps:

  1. Create a group for the users who will be handling the tickets.
  2. Create a separate schedule for each member of the group based on their work timings.
  3. Create a script to fetch the members of the group based on the last assigned incident date and store them in an array.
  4. Implement a Round Robin logic to assign tickets to the members of the group based on their schedule timings.

Here's an updated version of the code with the above logic:

 

 

var groupSysID = '217db28047e12110a789fa8bd36d43a6'; // Replace with the sys_id of your group
var usrArr = [];
var grMember = new GlideRecord('sys_user_grmember');
grMember.addQuery('group', groupSysID);
grMember.orderBy('user.u_last_assigned_incident_date');
grMember.query();

while(grMember.next()) {
  usrArr.push(grMember.user.toString());
}

var currentTicketNumber = gs.getProperty('com.mycompany.current_ticket_number', 0); // Property to store the current ticket number
var totalUsers = usrArr.length;
var scheduleIndex = currentTicketNumber % totalUsers;

var currentUserID = usrArr[scheduleIndex];
var userGr = new GlideRecord('sys_user');
if (userGr.get(currentUserID)) {
  var scheduleGr = new GlideSchedule(userGr.u_shift_schedule);
  var currentTime = new GlideDateTime();
  
  if (scheduleGr.isInSchedule(currentTime)) {
    // Assign ticket to the current user
    gs.print('Assigning ticket to ' + userGr.name);
    currentTicketNumber++;
    gs.setProperty('com.mycompany.current_ticket_number', currentTicketNumber);
  } else {
    // Find the next available user based on the schedule timings
    var nextScheduleIndex = (scheduleIndex + 1) % totalUsers;
    for (var i = 0; i < totalUsers; i++) {
      var nextUserID = usrArr[nextScheduleIndex];
      if (userGr.get(nextUserID)) {
        var nextScheduleGr = new GlideSchedule(userGr.u_shift_schedule);
        if (nextScheduleGr.isInSchedule(currentTime)) {
          // Assign ticket to the next available user
          gs.print('Assigning ticket to ' + userGr.name);
          currentTicketNumber++;
          gs.setProperty('com.mycompany.current_ticket_number', currentTicketNumber);
          break;
        }
      }
      nextScheduleIndex = (nextScheduleIndex + 1) % totalUsers;
    }
  }
}

 

 

Note:

  • Replace com.mycompany.current_ticket_number with the property name that you would like to use to store the current ticket number.
  • Modify the groupSysID variable to match the sys_id of your group.

@Sankar N Thank you for great help. We have created all as you suggested above. But, 

for example, Shift 1: 6am-3pm

Shift 2: 7am-4pm

For 6am-7am, only one person get all ticket, what ever you created in that 1 hr. But, after 7am, Tickets should assign using Round Robin, like after 7am, if 1st ticket assign to Person X, 2nd ticket assign to Person Y, 3rd ticket should assign to Person X, etc.... This way Round Robin should work using schedules.

But, it is not happening by using above your script, After 7am, all tickets are assign to Person Y only. So, please help on the same.

Thanks & Regards,

Prasanna Kumar

  1. First, you need to identify the members who are available to take the ticket based on their schedules.

  2. For each schedule, you need to check if any member is available during the current time. You can use the GlideSchedule API to check if a member is in schedule or not.

  3. Once you have identified the available members for each schedule, you can implement the Round Robin algorithm to assign tickets to them. You can keep track of the last member who was assigned a ticket and assign the next ticket to the next available member in the list.

  4. If there are no available members for a schedule, you can skip that schedule and move on to the next one.

// Get all the members of the group
var usrArr = [];
var grMember = new GlideRecord('sys_user_grmember');
grMember.addQuery('group', '217db28047e12110a789fa8bd36d43a6');
grMember.orderBy('user.u_last_assigned_incident_date');
grMember.query();
while(grMember.next()) {
usrArr.push(grMember.user);
}

// Get the current time
var curTime = new GlideDateTime();

// Loop through each schedule
for (var i = 1; i <= 4; i++) {
var schedule = "Schedule " + i;
var availableMembers = [];

// Check if any member is available during the current time
for (var j = 0; j < usrArr.length; j++) {
    var user = new GlideRecord('sys_user');
    user.addQuery('sys_id', usrArr[j]);
    user.query();
    if (user.next()) {
        var userSchedule = new GlideSchedule(user.u_shift_schedule);
        if (userSchedule.isInSchedule(curTime)) {
            availableMembers.push(user.sys_id);
        }
    }
}

// If there are no available members for this schedule, skip it
if (availableMembers.length == 0) {
    continue;
}

// Get the last member who was assigned a ticket for this schedule
var lastAssigned = gs.getProperty(schedule + " Last Assigned");
if (lastAssigned == "") {
    lastAssigned = availableMembers[0];
}

// Assign the ticket to the next available member in the list
var nextAssigned = "";
for (var k = 0; k < availableMembers.length; k++) {
    if (availableMembers[k] == lastAssigned) {
        if (k == availableMembers.length - 1) {
            nextAssigned = availableMembers[0];
        } else {
            nextAssigned = availableMembers[k+1];
        }
        break;
    }
}

// Update the last assigned property for this schedule
gs.setProperty(schedule + " Last Assigned", nextAssigned);
gs.print("Ticket assigned to " + nextAssigned + " for " + schedule);

Note: In this code, we are using ServiceNow's global properties to store the last assigned member for each schedule. You need to create a global property for each schedule with the name "Schedule x Last Assigned" (replace "x" with the schedule number) before running the code.

SatyakiBose
Mega Sage

Hello @prasannakumard 

My only question to you is, why are you setting up a custom round robin scheduler, when we have the Advanced Work Assignment available.