Name

global.MatchingDimensionAvailability

Description

Get agent s availability based on the timezone, schedule and current time.

Script

var MatchingDimensionAvailability = Class.create();
var MS_IN_HOUR = 3600 * 1000;
var maxAvailability = 0;
  
MatchingDimensionAvailability.prototype = {
  initialize: function() {
  },
  
  getUsersTZ : function(users) {
  	var planningUtil = new AgentScheduleUtil();
  	return planningUtil.getUsersTZ(users);
  },
  
  process : function(task, users, taskFieldValues, args){
  	var returnUsers = {};
  	var tasktimezone = null;
  	if(JSUtil.nil(taskFieldValues) || taskFieldValues.length == 0)
  		tasktimezone = task.location.time_zone;
  	else
  		tasktimezone = taskFieldValues[0];
  	
  	if(JSUtil.nil(tasktimezone))
  		tasktimezone = GlideUser.getSysTimeZone();
  	
  	var taskTZOffset = this.getTimezoneOffset(tasktimezone);
  	var availabilityData = this.getAllAgentsAvailability(users, taskTZOffset);
  	
  	for(var i=0;i<users.length;i++){
  		var availability = {};
  		var newRating = 0;
  		if (maxAvailability)
  			newRating = availabilityData[users[i]].rating / maxAvailability;
  		availability.rating = newRating.toFixed(2);
  		availability.value = availabilityData[users[i]].value;
  		availability.displayValue = availabilityData[users[i]].displayValue;
  		availability.detailedDisplayValue = availabilityData[users[i]].detailedDisplayValue;
  		availability.maxAvailability = maxAvailability;
  		returnUsers[users[i]] = availability;
  		if(new CSMUtil().isDebugOn())
  			gs.log(" MatchingDimensionAvailability = " + JSON.stringify(returnUsers[users[i]]));
  	}		
  	return returnUsers;
  },
  
  getAllAgentsAvailability : function (users, taskTZOffset) {
  	var availabilityMap = {};
  	
  	var gdtNow = new GlideDateTime();
  	var gdtEnd = this.getGlideEndTime();
  	var userTZMap = this.getUsersTZ(users);
  	
  	var planningUtil = new AgentScheduleUtil();
  	var durationMap = planningUtil.getDurationForUsers(users, gdtNow, gdtEnd);
  	for(var i=0;i<users.length;i++) {
  		var user = users[i];
  		var availability = {};
  		var durationGD = durationMap[user];
  		if(new CSMUtil().isDebugOn()) {
  			var grAgent = new GlideRecordSecure("sys_user");
  			grAgent.get(user); //bruno.smith
  		}
  		
  		if (durationGD) {
  			availability.rating = durationGD.getNumericValue();
  			availability.displayValue = Math.floor(durationGD.getNumericValue()/ MS_IN_HOUR);
  			availability.detailedDisplayValue = durationGD.getDisplayValue();
  			if(new CSMUtil().isDebugOn())
  				gs.log(grAgent.getDisplayValue() + " getAgentAvailability=" + JSON.stringify(availability)
  			+ " now = " + gdtNow.getDisplayValue() + " end =" + gdtEnd.getDisplayValue());
  		} else {
  			var agentTimeZone = userTZMap[user];
  			var userTZOffset = this.getTimezoneOffset(agentTimeZone);
  			availability.rating = Math.abs(taskTZOffset - userTZOffset);
  			if( availability.rating == 0) {
  				availability.displayValue = 0;
  				availability.detailedDisplayValue = gs.getMessage("No availability as no overlap with task timezone");
  			}
  			else {
  				availability.displayValue = availability.rating / MS_IN_HOUR;
  				var detailedHourTag = availability.displayValue == 1 ? gs.getMessage("Hour") : gs.getMessage("Hours");
  				availability.detailedDisplayValue = availability.displayValue + " " + detailedHourTag;
  			}
  		}
  		availability.value = availability.rating / MS_IN_HOUR;
  		if (maxAvailability < availability.rating)
  			maxAvailability = availability.rating;
  		var hourTag = availability.displayValue == 1 ? gs.getMessage("hour") : gs.getMessage("hours");
  		availability.displayValue += " " + hourTag;
  		if(new CSMUtil().isDebugOn())
  			gs.log(grAgent.getDisplayValue() + " getAgentAvailability::availability=" + JSON.stringify(availability));
  		
  		availabilityMap[user] = availability;
  	}
  	return availabilityMap;
  },
  
  getGlideEndTime : function() {
  	var gdt = new GlideDateTime();
  	var gsdt = new GlideScheduleDateTime();
  	gsdt.setEndOfDay();
  	return gsdt.getGlideDateTime();
  },
  
  getTimezoneOffset : function(timezone) {
  	var gsdt = new GlideScheduleDateTime();
  	gsdt.setTimeZone(timezone);
  	var gdt = new GlideDateTime();
  	gdt.setTZ(gsdt.getTimeZone());
  	var value = gdt.getTZOffset();
  	if(new CSMUtil().isDebugOn())
  		gs.log("getTimezoneOffset= " + value + " timezone=" + timezone);
  	return value;
  },
  
  type: 'MatchingDimensionAvailability'
};

Sys ID

d333d69fd703120058c92cf65e610300

Offical Documentation

Official Docs: