Name

global.OCGroup

Description

Class to represent a sys_user_group object for on-call scheduling. Extend this class to add or modify behaviour.

Script

var OCGroup = Class.create();
OCGroup.prototype = {
  initialize: function(groupId) {
  	this.log = new GSLog("com.snc.on_call_rotation.log.level", this.type);
  	this.groupId = groupId;
  },

  /* Get an array of User objects for active users in a group
   *
   * @return [Array]: An array of user objects which each contain two keys, 
   *				    'sys_id' and 'name' of the sys_user record
   */
  getMembers: function() {
  	var members = [];
  	if (JSUtil.nil(this.groupId))
  		return members;

  	var liveProfile = new GlideappLiveProfile();
  	var liveFeedApi = new SNC.LiveFeedApi();
  	var gr = new GlideRecord('sys_user_grmember');
  	gr.addQuery('group', this.groupId);
  	gr.addQuery('user.active', 'true');
  	gr.orderBy('user.name');
  	gr.query();
  	while (gr.next()) {

  		var userContactNumber = '';
  		if (!this.checkAccess) {
  			userContactNumber = (gr.user.mobile_phone + '' != '') ? gr.user.mobile_phone + '' : gr.user.phone + '';
  		} else if ((gr.user.mobile_phone + '' != '') && gr.user.mobile_phone.canRead()){
  			userContactNumber = gr.user.mobile_phone + '';
  		} else if (gr.user.phone.canRead()) {
  			userContactNumber = gr.user.phone + '';
  		}
  		
  		members.push({
  				'name': gr.user.name + '',
  				'sys_id': gr.user + '',
  				'user_email': (!this.checkAccess || gr.user.email.canRead()) ? gr.user.email + '' : '',
  				'user_contact_number': userContactNumber,
  				'userID': gr.user + '',
  				'initials': liveFeedApi.getInitials(gr.user.name + ''),
  				'avatar': liveProfile.getAvatar(liveProfile.getID(gr.user.sys_id + ''))
  			});
  	}
  	return members;
  },

  /* Get an array of User objects for active users in a group that are on-call at this point in time
   *
   * @return [Array]: An array of user objects which each contain two keys,
   *				    'sys_id' and 'name' of the sys_user record
   */
  getOnCallMembers: function() {
  	var liveProfile = new GlideappLiveProfile();
  	var liveFeedApi = new SNC.LiveFeedApi();
  	var spans = new OCRotationV2()
  	.setStartDate(this.startDateTime)
  	.setEndDate(this.endDateTime)
  	.setGroupIds(this.groupId)
  	.setRotaIds(this.rotaIds)
  	.setRosterIds(this.rosterIds)
  	.getSpans();

  	var memberSysIds = [];
  	for (var i = 0; i < spans.length; i++)
  		if (spans[i].table == 'cmn_rota_member')
  			memberSysIds.push(spans[i].user_id);

  	var members = [];
  	var gr = new GlideRecord('sys_user_grmember');
  	gr.addQuery('group', this.groupId);
  	gr.addQuery('user.active', 'true');
  	gr.addQuery('user.sys_id', 'IN', memberSysIds);
  	gr.query();
  	
  	var phone = gr.user.mobile_phone + '' != '' ? gr.user.mobile_phone : gr.user.phone;
  	while (gr.next()) {

  		var userContactNumber = '';
  		if (!this.checkAccess) {
  			userContactNumber = (gr.user.mobile_phone + '' != '') ? gr.user.mobile_phone + '' : gr.user.phone + '';
  		} else if ((gr.user.mobile_phone + '' != '') && gr.user.mobile_phone.canRead()){
  			userContactNumber = gr.user.mobile_phone + '';
  		} else if (gr.user.phone.canRead()) {
  			userContactNumber = gr.user.phone + '';
  		}
  		
  		members.push({
  				'name': gr.user.name + '',
  				'sys_id': gr.user + '',
  				'user_email': (!this.checkAccess || gr.user.email.canRead()) ? gr.user.email + '' : '',
  				'user_contact_number': userContactNumber + '',
  				'userID': gr.user + '',
  				'initials': liveFeedApi.getInitials(gr.user.name),
  				'avatar': liveProfile.getAvatar(liveProfile.getID(gr.user.sys_id + ''))
  			});
  	}
  	return members;
  },

  /* Get an array of User objects for active users in a group that are NOT on-call at this point in time
   *
   * @return [Array]: An array of user objects which each contain two keys, 
   *				    'sys_id' and 'name' of the sys_user record
   */
  getAvailableMembers: function() {
  	var allMembers = this.getMembers();
  	var onCallMembers = this.getOnCallMembers();
  	var memberIndex = this._indexFrom(onCallMembers);
  	this.log.debug("[getAvailableMembers] allMembers: " + JSON.stringify(allMembers));
  	this.log.debug("[getAvailableMembers] onCallMembers: " + JSON.stringify(onCallMembers));
  	return this._difference(allMembers, memberIndex, this._hasMember);
  },

  getRefQualAvailableMembers: function(rotaMemberGr, rosterGr) {
  	if (!JSUtil.nil(rotaMemberGr) && !JSUtil.nil(rotaMemberGr.roster.rota.group))
  		this.groupId = rotaMemberGr.roster.rota.group;
  	else if (!JSUtil.nil(rosterGr) || !JSUtil.nil(rosterGr.rota.group))
  		this.groupId = rosterGr.rota.group;
  	if (JSUtil.nil(this.groupId))
  		return "";
  	this.log.debug("[getRefQualAvailableMembers] groupId: " + this.groupId);
  	var members = [];
  	var gr = new GlideRecord("sys_user_grmember");
  	gr.addQuery("group", this.groupId);
  	gr.addQuery("user.active", "true");
  	gr.orderBy("user.name");
  	gr.query();
  	while (gr.next())
  		members.push(gr.user + "");
  	if (members.length > 0)
  		return "sys_idIN" + members.join(",");
  	return "";
  },
  
  setCheckAccess: function(checkAccess) {
  	this.checkAccess = checkAccess;
  	return this;
  },

  setGroupId: function(groupId) {
  	this.groupId = groupId;
  	return this;
  },

  setStartDateTime: function(startDateTime) {
  	this.startDateTime = startDateTime;
  	return this;
  },

  setEndDateTime: function(endDateTime) {
  	this.endDateTime = endDateTime;
  	return this;
  },

  setRotaIds: function(rotaIds) {
  	this.rotaIds = rotaIds;
  	return this;
  },

  setRosterIds: function(rosterIds) {
  	this.rosterIds = rosterIds;
  	return this;
  },

  _indexFrom: function(members) {
  	var index = {};
  	for (var i = 0; i < members.length; i++) {
  		var subindex = index.hasOwnProperty(members[i].sys_id) ? index[members[i].sys_id] : index[members[i].sys_id] = {};
  		subindex[members[i].name] = {};
  	}
  	return index;
  },

  _hasMember: function (member, index) {
  	return index.hasOwnProperty(member.sys_id);
  },

  _difference: function (members, index, has) {
  	var result = [];
  	for (var i = 0; i < members.length; i++) {
  		var member = members[i];
  		if (!has(member, index))
  			result.push(member);
  	}
  	return result;
  },

  type: 'OCGroup'
};

Sys ID

62616b9d9f7012000391b89a442e706d

Offical Documentation

Official Docs: