Name

global.MatchingDimensionLastAssigned

Description

Get agent prioritized based on the last assigned work so that work load can be shared fairly.

Script

var MatchingDimensionLastAssigned = Class.create();

var MS_IN_HOUR = 3600 * 1000;

MatchingDimensionLastAssigned.prototype = {
  initialize: function() {
  },
  
  process : function(task, users, taskFieldValues, args){
  	var returnUsers = {};
  	var userTaskStats = new GlideRecord("user_task_stats");
  	userTaskStats.addQuery("userIN" + users.join());
  	userTaskStats.orderBy("last_work_assigned");
  	userTaskStats.query();
  	var lastWorkedMax = 0;
  	while(userTaskStats.next()){
  		var gdt = new GlideDateTime();
  		gdt.setDisplayValue(userTaskStats.getDisplayValue("last_work_assigned"));

  		var ratingObj = {};
  		var lastWorked = userTaskStats.last_work_assigned.getGlideObject().getNumericValue();;
  		ratingObj.value = this.getDurationSinceLastAssigned(gdt, userTaskStats.user);
  		if (ratingObj.value > lastWorkedMax)
  			lastWorkedMax = ratingObj.value;
  		ratingObj.rating = ratingObj.value;

  		ratingObj.displayValue = this.getTimeAgo(gdt);
  		ratingObj.detailedDisplayValue = userTaskStats.getDisplayValue("last_work_assigned");
  		returnUsers[userTaskStats.user] =  ratingObj;
  	}
  	lastWorkedMax = lastWorkedMax * 10; //So that agent with lastWorkedMax never gets rating 1
  	for(var i=0;i<users.length;i++){
  		if(!returnUsers.hasOwnProperty(users[i])) {
  			var ratingObj = {};
  			ratingObj.rating = 1.0; 
  			ratingObj.displayValue = "never assigned";
  			ratingObj.detailedDisplayValue = "never assigned";
  			returnUsers[users[i]] = ratingObj;
  		} else {
  			returnUsers[users[i]].rating = 
  				returnUsers[users[i]].rating / lastWorkedMax;
  			returnUsers[users[i]].lastWorkedMax = lastWorkedMax;
  			
  		}
  	}
  	return returnUsers;
  },
  
  getTimeAgo:function(glidedatetime){
  	if(glidedatetime){
  		var timeago = new GlideTimeAgo();
  		return timeago.format(glidedatetime);
  	}
  	return "";
  },
  
  getDurationSinceLastAssigned : function(gdtLastWorkAssigned, agentID) {
  	var gdtNow = new GlideDateTime();
  	var durationSinceLastUsed = gdtNow.getNumericValue() - gdtLastWorkAssigned.getNumericValue();
  	return durationSinceLastUsed / MS_IN_HOUR;
  },
  
  getDurationSinceLastAssignedPerSchedule : function(gdtLastWorkAssigned, agentID) {
  	var grAgent = new GlideRecordSecure("sys_user");
  	grAgent.get(agentID);
  	var durationSinceLastUsed = 8; //Default
  	var gdtNow = new GlideDateTime();
  	var matchingDimensionUtil = new MatchingDimensionUtil();
  	var schedule = matchingDimensionUtil.getAgentSchedule(agentID);
  	var agentTimeZone = matchingDimensionUtil.getAgentTimeZone(agentID);

  	if (schedule) {
  		var sched = new GlideSchedule(schedule, agentTimeZone);
  		var durationGD = sched.duration(gdtLastWorkAssigned, gdtNow, agentTimeZone);
  		if (durationGD.getNumericValue())
  			durationSinceLastUsed = durationGD.getNumericValue() / MS_IN_HOUR;	
  	}
  	if(new CSMUtil().isDebugOn())
  		gs.log("MatchingDimensionLastAssigned::getDurationSinceLastUsed =" + durationSinceLastUsed +
  		   " hours gdtLastWorkAssigned=" + gdtLastWorkAssigned.getDisplayValue() + " now=" + gdtNow.getDisplayValue() + 
  		   " schedule=" + sched.getName() + " agentTimeZone=" + 
  		   JSON.stringify(agentTimeZone) + " agent=" + grAgent.getDisplayValue() + " agentID=" + agentID);

  	return durationSinceLastUsed;
  },
  		
  type: 'MatchingDimensionLastAssigned'
};

Sys ID

841016c4d723120058c92cf65e6103b7

Offical Documentation

Official Docs: