Name

sn_customerservice.AccountTeamUtil

Description

Util API s for CS Account team responsibility module

Script

var AccountTeamUtil = Class.create();
AccountTeamUtil.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
  
  TABLE_TEAM_MEMBER : "sn_customerservice_team_member",
  TABLE_RESPONSIBILITY_DEF : "sn_customerservice_responsibility_def",
  ACCOUNT : "account",
  RESPONSIBILITY : "responsibility",
  UNIQUE : "unique",
  PREFERRED_TECHNICIAN_ID: "08b25ad1c3b20200b0449f2974d3ae05",
  TABLE_SYS_USER_HAS_ROLE: "sys_user_has_role",

  getUserRefQualForAccountTeamMember: function(member){
  	var responsibility = member.responsibility;
  	if(this.isSysUser(responsibility)){
  		return "sys_class_nameINsys_user,sn_csm_service_organization_external_staff";
  	}
  	else
  		return "sys_class_name=customer_contact";
  },
  
  isSysUser: function(responsibility) {
  	if (gs.nil(responsibility)) {
  		return false;
  	}
  	var gr = new GlideRecord(this.TABLE_RESPONSIBILITY_DEF);
  	if (!gr.canRead())  
  		return false;
  	gr.get(responsibility);
  	var type = gr.type + '';
  	if (type == 'sys_user') {
  		return true;
  	}
  	return false;
  },
  
  hasAccountTeamResponsibility: function(account, responsibility) {
  	
  	if (gs.nil(account) || gs.nil(responsibility))
  		return false;
  	
  	var gr = new GlideRecord(this.TABLE_TEAM_MEMBER);
  	if (!gr.canRead())
  		return false;
  	gr.addQuery(this.ACCOUNT, account);
  	gr.addQuery(this.RESPONSIBILITY, responsibility);
  	gr.query();
  	if(gr.next())
  		return true;
  	return false;
  	
  },
  
  hasUniqueResponsibility: function(responsibility) {
  	var gr = new GlideRecord(this.TABLE_RESPONSIBILITY_DEF);
  	if (gr.get(responsibility) && gr.canRead())
  		return gr.unique;
  	return false;
  },
  
  
  getAccountTeamUserIds: function(account, responsibility) {
  	
  	var ids = [];
  	if (gs.nil(account) || gs.nil(responsibility))
  		return ids;
  	
  	var gr = new GlideRecord(this.TABLE_TEAM_MEMBER);
  	if (!gr.canRead())
  		return ids;
  	gr.addQuery(this.ACCOUNT, account);
  	gr.addQuery(this.RESPONSIBILITY, responsibility);
  	gr.query();
  	while(gr.next()) {
  		ids.push(gr.getValue("user"));
  	}
  	return ids;
  },

  getPreferredTechnicianAccountForCurrent: function() {
  	var account = "";
  	var gr = new GlideRecord(this.TABLE_TEAM_MEMBER);
  	if (!gs.nil(current) && !gs.nil(current.account) && gr.canRead())
  		if (this.hasAccountTeamResponsibility(current.account, this.PREFERRED_TECHNICIAN_ID))
  		account = current.account;
  	
  	return account;
  },
  
  getPreferredTechnicianUserIDsByAccount: function(account) {
  	var userIds = [];
  	var gr = new GlideRecord(this.TABLE_TEAM_MEMBER);
  	if (!gs.nil(account) && gr.canRead()) {
  		userIds = this.getAccountTeamUserIds(account, this.PREFERRED_TECHNICIAN_ID);
  		//sort the agents by least loaded
  		if (!gs.nil(userIds) && userIds.length > 1)
  			userIds = this.getAgentsByLeaseLoaded(userIds, account);
  	}
  	
  	return userIds;
  },
  
  getAgentsByLeaseLoaded: function(agents, account) {
  	var ids = [];
  	if (gs.nil(agents))
  		return [];
  	try {
  		var assignCount ={};
  		var count = new GlideAggregate('sn_customerservice_case');
  		var gr = new GlideRecord('sn_customerservice_case');
  		if (!gr.canRead())
  			return ids;
  		count.addQuery('assigned_to', 'IN', agents);
  		count.addQuery('active', 'true');
  		count.addQuery('account', account);
  		count.addAggregate('COUNT', 'assigned_to');
  		count.orderByAggregate('COUNT', 'assigned_to', true);
  		count.query();
  		while (count.next()) {
  			var assigned_to = count.assigned_to;
  			var caseCount = count.getAggregate('COUNT', 'assigned_to');
  			assignCount[assigned_to] = caseCount;
  			//gs.info(assignCount[assigned_to] + " ,The are currently " + caseCount + " case with a category of " + count.assigned_to.getDisplayValue() +"/"+assigned_to);
  		}
  		
  		var list = [];
  		for (var i = 0; i  < agents.length; i++) {
  			var id = agents[i];
  			var obj = {'id' : id};
  			var c = assignCount[id];
  			if (!gs.nil(c))
  				obj['value'] = c;
  			else
  				obj['value'] = 0;

  			list.push(obj);
  		}
  		//sort the list by count
  		list.sort(function (a, b) {
  			if (a.value > b.value)
  				return 1;
  			if (a.value < b.value)
  				return -1;
  			return 0;
  		});
  		
  		for (var index = 0; index  < list.length; index++)
  			ids.push(list[index]['id']);
  		
  	} catch (err) {
  		gs.error("Error in get agents by least loaded list: "+ err.message);
  		ids = agents;
  	}
  	
  	return ids;
  },
  
  isCustomerContact: function(teamMember) {
      var roleGr = new GlideRecord(this.TABLE_SYS_USER_HAS_ROLE);
      roleGr.addQuery("user", teamMember);
      roleGr.addQuery("role", "3a64fc24d7700200e5982cf65e610357"); // role - sn_customerservice.customer 
      roleGr.query();
      if (roleGr.next())
          return true;
      return false;
  },

  type: 'AccountTeamUtil'
});

Sys ID

a262d3a0c3320200b0449f2974d3aee9

Offical Documentation

Official Docs: