Name

global.MatchingDimensionSkillAdvanced

Description

No description available

Script

var MatchingDimensionSkillAdvanced = Class.create();
MatchingDimensionSkillAdvanced.prototype = Object.extendsObject(AbstractMatchingDimension, {
  
  process : function(task, users, taskFieldValues, args){
  	var skillsRequired = []; //This will contain the list of Mandatory skills for a task.


  	/*Calculate the list of mandatory skills for this task from the m2m table.*/
  	var taskSkillRecord = new GlideRecord('task_m2m_skill');
  	taskSkillRecord.addQuery('mandatory', true);
  	taskSkillRecord.addQuery('task', task.sys_id);
  	taskSkillRecord.query();
  	while(taskSkillRecord.next()){
  		skillsRequired.push(taskSkillRecord.getValue('skill'));
  	}
  	
  	var returnUsers = {};
  	if(skillsRequired.length == 0 && taskFieldValues.length==0){
  		for(var i = 0; i < users.length; i++){
  			var skillObj = {};
  			skillObj.rating = 1.0;
  			skillObj.value = 1.0;
  			skillObj.displayValue = gs.getMessage("NA");
  			skillObj.detailedDisplayValue = gs.getMessage("Task has no skills");
  			returnUsers[users[i]] = skillObj;
  		}
  		return returnUsers;
  	}
  	var usersWithMandatory = [];
  	/*
  		Are there mandatory skills  defined for this task?
  		If yes, first calculate what agents in this assignment group have the mandatory skills, and add only those agents 
  		to the returnUsers. 
  		If not, add all the agents in an assignemnt group to the returnUsers.
  	*/
  	var skills = new GlideAggregate("sys_user_has_skill");
  	if(skillsRequired.length >0){ //If mandatory skills are defined for this task.
  		skills.addEncodedQuery("skillIN" + skillsRequired.join());
  	}
  	skills.addEncodedQuery("userIN"+ users.join());
  	skills.addActiveQuery();
  	skills.addAggregate("COUNT(DISTINCT", "skill");
  	skills.addAggregate("MIN", "user.sys_id");
  	skills.groupBy("user");
  	skills.query();
  	
  	while(skills.next()){
  		var ratingObj = {};
  		var skillCount = 0; 
  		ratingObj.detailedDisplayValue = "Task has no skills";
  		
  		if(skillsRequired.length > 0){
  			skillCount = skills.getAggregate("COUNT(DISTINCT", "skill");
  		}
  		if(skillCount != skillsRequired.length)
  			continue;
  		ratingObj.rating = Number(skillCount) * 1.0 / (skillsRequired.length + taskFieldValues.length);
  		ratingObj.value = skillCount;
  		ratingObj.displayValue = skillCount + " / " + (skillsRequired.length + taskFieldValues.length);
  		ratingObj.detailedDisplayValue = this.getDetailedDisplayValue(skills.getAggregate("MIN", "user.sys_id"), skillsRequired);
  		ratingObj.skillCount = skillCount;
  		returnUsers[skills.getAggregate("MIN","user.sys_id")] = ratingObj;
  		usersWithMandatory.push(skills.getAggregate("MIN","user.sys_id"));
  	}
  	
  	/*
  		For only the list of agents who ALREADY have the mandatory skills for this assignment group, check what users have one/more optional skills.
  		Update the JSON info for only those users.
  	*/	
  	var optionalSkills = new GlideAggregate("sys_user_has_skill");
  	optionalSkills.addEncodedQuery("skillIN" + taskFieldValues.join());
  	optionalSkills.addEncodedQuery("userIN"+ usersWithMandatory.join());
  	optionalSkills.addActiveQuery();
  	optionalSkills.addAggregate("COUNT(DISTINCT", "skill");
  	optionalSkills.addAggregate("MIN", "user.sys_id");
  	optionalSkills.groupBy("user");
  	optionalSkills.query();

  	while(optionalSkills.next()){
  		var optionalSkillCount = optionalSkills.getAggregate("COUNT(DISTINCT", "skill");
  		var userSysId = optionalSkills.user.sys_id;
  		returnUsers[userSysId].rating = (Number(returnUsers[userSysId].skillCount) + Number(optionalSkillCount)) *1.0 / (skillsRequired.length + taskFieldValues.length);
  		returnUsers[userSysId].value = Number(returnUsers[userSysId].skillCount) + Number(optionalSkillCount);
  		returnUsers[userSysId].displayValue = Number(returnUsers[userSysId].skillCount) + Number(optionalSkillCount) + " / " + (skillsRequired.length + taskFieldValues.length);
  		if(skillsRequired.length > 0){
  			returnUsers[userSysId].detailedDisplayValue += ", ";
  		}
  		returnUsers[userSysId].detailedDisplayValue += this.getDetailedDisplayValue(optionalSkills.user.sys_id, taskFieldValues);
  	}
  	if(skillsRequired.length == 0){
  		for(var i=0;i< users.length;i++){
  			if(!returnUsers[users[i]]){
  				var ratingObj = {};
  				ratingObj.rating = 0;
  				ratingObj.value = 0;
  				ratingObj.displayValue = "0 / " + taskFieldValues.length;
  				ratingObj.detailedDisplayValue = "No Matching Skills"; 
  				returnUsers[users[i]] = ratingObj;
  			}
  		}
  	}

  	return returnUsers;
  },
  			
  getDetailedDisplayValue : function(user, skillsRequired){
  	var skills = [];
  	var skillGR = new GlideRecord("sys_user_has_skill");
  	skillGR.addEncodedQuery("skillIN" + skillsRequired); //skillsRequired.join()
  	skillGR.addEncodedQuery("userIN"+ user);
  	skillGR.addActiveQuery();
  	skillGR.query();
  	while(skillGR.next())
  		skills.push(skillGR.getDisplayValue('skill'));
  	return skills.join(", ");
  },
  			
  type: 'MatchingDimensionSkillAdvanced'
});

Sys ID

80fa4f47932f030045a3f5be867ffba4

Offical Documentation

Official Docs: