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