Name

global.SkillAssignmentAPI

Description

Helper API for assigning skills to users.

Script

var SkillAssignmentAPI = Class.create();
SkillAssignmentAPI.prototype = {
  initialize: function() {
  },
  
  /* Attempts to assign a skill to a user. 
  If a skill level is also provided, also attempts to assign that skill level.
  If the user already has the skill at the same or a higher level by itself (not inherited), does nothing. 
  Returns the updated/added GlideRecord if the skill at the provided level is assigned, null otherwise. */
  assignSkillToUser: function(/*sys_id*/ user, /*sys_id*/ skill, /*sys_id*/ skill_level) {
  	if(gs.nil(user) || gs.nil(skill)) {
  		gs.error('Skill assignment failed because either user or skill was not provided');
  		return null;
  	}
  	
  	var gr_user = new GlideRecord('sys_user');
  	var gr_skill = new GlideRecord('cmn_skill');
  	var gr_skill_level = new GlideRecord('cmn_skill_level');
  	
  	if(!gr_user.get(user) || !gr_skill.get(skill)) {
  		gs.error('Skill assignment failed because either user or skill does not exist');
  		return null;
  	}
  	
  	if(gr_skill_level.get(skill_level)) {
  		//If the skill has no level type but we attempt to assign a level anyway, stop this operation
  		if(gs.nil(gr_skill.level_type)) {
  			gs.error('Skill assignment failed because skill {0} has no level type', 
  					[gr_skill.sys_id]);
  			return null;
  		}
  		
  		//If there is a new skill level to assign, but it is not same level type as the skill, stop operation
  		if(gr_skill_level.getValue('skill_level_type') != gr_skill.getValue('level_type')) { 
  			gs.error('Skill assignment failed because Skill {0} does not contain the same level type as given skill level {1}', 
  					[gr_skill.sys_id, gr_skill_level.sys_id]);
  			return null;
  		}
  	}
  	else if (!gs.nil(skill_level)) {
  		gs.error('Skill assignment failed because the provided skill level does not exist');
  		return null;
  	}
  	
  	var gr_user_has_skill = new GlideRecord('sys_user_has_skill');
  	gr_user_has_skill.addQuery('user', user);
  	gr_user_has_skill.addQuery('skill', skill);
  	gr_user_has_skill.orderByDesc('skill_level.value');
  	gr_user_has_skill.query();
  	
  	//If user already has this skill assigned on its own, update the corresponding record
  	if(gr_user_has_skill.next())
  		return this._updateSkillLevel(user, skill, skill_level, gr_skill_level.value, gr_user_has_skill);
  	else
  		return this._insertSkill(user, skill, skill_level, gr_user_has_skill);
  },
  
  /* THE FOLLOWING FUNCTIONS BELOW HERE ARE FOR INTERNAL USE AND SHOULD NOT BE USED BY THEMSELVES */
  
  _updateSkillLevel: function(user, skill, level, level_value, gr_user_has_skill) {
  	if (!gs.nil(level)) {
  		if(gr_user_has_skill.skill_level.value < level_value) {
  			gr_user_has_skill.active = true;
  			gr_user_has_skill.skill_level = level;
  			gr_user_has_skill.update();
  		}
  		else
  			gs.info('Skill at level not assigned, user {0} already has skill {1} at a higher or equal standalone level than {2}', 
  				[user, skill, level]);
  	}
  	else
  		gs.info('Skill not assigned, user {0} already has skill {1} on its own', [user, skill]);


  	return gr_user_has_skill.sys_id;
  },
  
  _insertSkill: function(user, skill, skill_level, gr_user_has_skill) {
  	gr_user_has_skill.initialize();
  	gr_user_has_skill.user = user;
  	gr_user_has_skill.skill = skill;
  	gr_user_has_skill.skill_level = skill_level;
  	gr_user_has_skill.insert();
  	
  	return gr_user_has_skill.sys_id;
  },

  type: 'SkillAssignmentAPI'
};

Sys ID

91b46d8b773323000f7a72f9691061a1

Offical Documentation

Official Docs: