Name

global.SkillsUtils

Description

Functions to assist with user skills related records

Script

var SkillsUtils = Class.create();

SkillsUtils.prototype = {

  /**
   * build assigned_to reference qualifier using task assignment group and skills
   * @param GlideRecord task
   * @return String reference qualifier query for sys_user
   * usage: javascript:var util = new SkillsUtils(); util.assignedToRefQual(current, "roles=itil");
   */
  assignedToRefQual: function(/*GlideRecord*/task, defaultQual) {
  	if (JSUtil.nil(defaultQual))
  	   defaultQual = "";

  	var skills = task.skills.split(",");
  	var group = task.assignment_group;
  	if (skills && skills != "") {
  		var hasSkills = true;
  		var allSkilledUserIds = this.getAllSkilledUserIds(skills);
  	}

  	if (group && group != "") {
  		var hasGroup = true;
  		var groupUsers = this._getMembers(group);
  	}

  	//no inputs to use, return default query
  	if (!hasSkills && !hasGroup)
  		return defaultQual;

  	//group but no skills specified, return group members
  	if (hasGroup && !hasSkills) {
  		var groupUserList = [];
  		while (groupUsers.next())
  			groupUserList.push(groupUsers.getUniqueValue());

  		return "sys_idIN" + groupUserList.toString();
  	}

  	//skills but no group specified, return skilled users
  	if (!hasGroup && hasSkills) {
  		return "sys_idIN" + allSkilledUserIds.toString();
  	}

  	//only thing left is to process both the group and skills
  	var skilledMemberList = [];
  	while (groupUsers.next()) {
  		//is user in list of all skilled users
  		var au = new ArrayUtil();
  		if (au.contains(allSkilledUserIds, groupUsers.getUniqueValue()))
  			skilledMemberList.push(groupUsers.getUniqueValue());
  	}
  	return "sys_idIN" + skilledMemberList.toString();

  },

  /**
   * qualify assignment groups with those with all required skills
   * usage: javascript:var util = new SkillsUtils(); util.assignmentGroupRefQual(current);
   */
  assignmentGroupRefQual: function(/*GlideRecord*/ task) {
  	var skills = task.skills.split(",");
  	if (JSUtil.nil(skills))
  		return "type=null";  //default qualifier

  	var allSkilledGroupIds = this.getAllSkilledGroupIds(skills);
  	return "sys_idIN" + allSkilledGroupIds;
  },


  /**
   * get all group with all skills
   * @param Array skills
   * @return Array group sys_id
   */
  getAllSkilledGroupIds: function(/*Array*/skills) {
  		//how many skills do we need
  	var skillsCount = skills.length;
  	var groupIds = new Object();
  	for (var i = 0; i < skills.length; i++) {
  		var groupsProcessed = new Object();
  		var gr = new GlideRecord("sys_group_has_skill");
  		gr.addQuery("skill", skills[i]);
  		gr.query();
  		while (gr.next()) {
  			//only process if this isn't a duplicate
  			if (!groupsProcessed[gr.group]) {
  				if (!groupIds[gr.group])
  					groupIds[gr.group] = 1;
  				else
  					groupIds[gr.group] += 1;

  				//don't process this group/skill again if duplicate
  				groupsProcessed[gr.group] = true;
  			}
  		}
  		//clear temp tracking object
  		usersProcessed = null;
  	}

  	var skilledGroups = [];
  	for (group in groupIds) {
  		if (groupIds[group] == skillsCount)
  			skilledGroups.push(group);
  	}

  	return skilledGroups;
  },

  /**
   * get all users with all skills
   * @param Array skills
   * @return Array user sys_id
   */
  getAllSkilledUserIds: function(/*Array*/skills) {
  	//how many skills do we need
  	var skillsCount = skills.length;
  	var userIds = new Object();
  	for (var i = 0; i < skills.length; i++) {
  		var usersProcessed = new Object();
  		var gr = new GlideRecord("sys_user_has_skill");
  		gr.addQuery("skill", skills[i]);
  		gr.query();
  		while (gr.next()) {
  			//only process if this isn't a duplicate
  			if (!usersProcessed[gr.user]) {
  				if (!userIds[gr.user])
  					userIds[gr.user] = 1;
  				else
  					userIds[gr.user] += 1;

  				//don't process this user/skill again if duplicate
  				usersProcessed[gr.user] = true;
  			}
  		}
  		//clear temp tracking object
  		usersProcessed = null;
  	}

  	var skilledUsers = [];
  	for (user in userIds) {
  		if (userIds[user] == skillsCount)
  			skilledUsers.push(user);
  	}

  	return skilledUsers;
  },

  _getMembers: function(/*String*/groupID) {
  	var gr = new GlideRecord("sys_user_grmember");
  	gr.addQuery("group", groupID);
  	gr.query();
  	var members = [];
  	while (gr.next()) {
  		members.push(gr.user.sys_id.toString());
  	}

  	//get active user records
  	var users = new GlideRecord("sys_user");
  	users.addActiveQuery();
  	users.addQuery("sys_id", members);
  	users.query();
  	return users;
  },

  updateSkillHistory: function(user, skill, level_from, level_to) {
  	if(gs.nil(user) || gs.nil(skill)) {
  		gs.error('updateSkillHistory: invalid User or skill');
  		return false;
  	}
  	var gr = new GlideRecord('sys_user_skill_history');
  	gr.initialize();
  	gr.setValue('user', user);
  	gr.setValue('skill', skill);
  	gr.setValue('level_from', level_from);
  	gr.setValue('level_to', level_to);
  	gr.insert();
  },

  type: "SkillsUtils"
}

Sys ID

c619b4cec0a80a6d5fb4316a3ad8e74c

Offical Documentation

Official Docs: