Name

global.CalendarRESTHelper

Description

No description available

Script

var CalendarRESTHelper = Class.create();
CalendarRESTHelper.prototype = {

  initialize: function() {
  	this.response =  {};
  	this.EVENT_CONFIG_TABLE = "agent_schedule_task_config";
  	this.USER_AND_EVENT_CONFIG_REL_TABLE = "agent_schedule_task_config_rel_user_pref";
  	this.USER_CONFIG_TABLE = "agent_schedule_user_pref";
  	this.GRP_MEMBER_TABLE = "sys_user_grmember";
  	this.USER_MAX_EVENTS = 100;
  	this.USER_TABLE = "sys_user";
  	this.VISIBLE_EXTERNALLY = "8201666b0b7003004502ab5c37673adb";
  	this.VISIBLE_INTERNALLY = "a6a0666b0b7003004502ab5c37673aef";
  	this.defaultUser = gs.getUserID();
  	this.sessionConfigKey = 'FSMEventConfig';
  	this.agentScheduleUtil = new AgentScheduleUtil();
  },

  getUserInfo: function(user){
  	if(typeof user === "object")
  		user = user[0];

  	var userInfo = {};
  	var personalScheduleId = this.getUserSchedule(user);
  	if(personalScheduleId)
  		userInfo['personal_schedule_id'] = personalScheduleId;
  	return userInfo;
  },

  getUserSchedule : function(user) {
  	var personalScheduleId = "";
  	if (JSUtil.nil(user)){
  		user = this.defaultUser;
  	}
  	var personalScheduleGR = this.agentScheduleUtil.getAgentPersonalSchedule(user);
  	if (personalScheduleGR && personalScheduleGR.hasNext()) {
  		personalScheduleGR.next();
  		personalScheduleId = personalScheduleGR.getValue("personal_schedule");
  	} else {
  		personalScheduleId = this.agentScheduleUtil.createPersonalSchedule(user);
  	}
  	return personalScheduleId;
  },
  getGroups:function(user){
  	var enable = gs.getProperty("team_calendar.enable_for_grpmember");
  	if (JSUtil.nil(user))
  		user = this.defaultUser;
  	var gr = new GlideAggregate(this.GRP_MEMBER_TABLE);
  	var queryString = "group.manager=" + user;
  	queryString += "^group.active=true";

  	if (enable=="true") {
  		queryString += "^NQgroup.typeLIKE" + this.VISIBLE_EXTERNALLY;
  		queryString += "^NQgroup.typeLIKE" + this.VISIBLE_INTERNALLY;
  		queryString += "^user=" + user;
  	}
  	gr.orderBy("group.name");
  	gr.groupBy("group");
  	//gr.addActiveQuery();  //removed since there is no active column on sys_user_grmember table.
  	gr.addEncodedQuery(queryString);
  	//gr.chooseWindow(0,99);
  	gr.setCategory('list');
  	gr.query();
  	var groupIds=[];

  	while(gr.next()){
  		//var sys_id = gr.group.sys_id;
  		var groupObj = {
  			'id':gr.group.sys_id,
  			'name': gr.group.name
  		};
  		groupIds.push(groupObj);
  	}
  	return groupIds;
  },


  getGroupEvents: function (groupIdsString, startDateNum, endDateNum, userStart, userEnd,searchString) {
  	var teamMembersObj = this.getTeamMembers(groupIdsString, userStart, userEnd,searchString);
  	var result = {};
  	result["users"] = {};
  	if ( JSUtil.notNil(teamMembersObj) && JSUtil.notNil(teamMembersObj.users) ) {
  		result["users"] = teamMembersObj.users;
  		var usersSysIdString = Object.keys(teamMembersObj.users);
  		this.USER_MAX_EVENTS = this.USER_MAX_EVENTS * usersSysIdString.length; //set the maximum events that will be fetched for display on calendar.
  		usersSysIdString = usersSysIdString.join(",");
  		var eventsObj = {};
  		var usersObj = teamMembersObj.users;
  		var events = this.getUserEvents(startDateNum, endDateNum, usersSysIdString, this.defaultUser);

  		//first prepare events obj with keys for every user
  		for (var user in usersObj) {
  			if(!eventsObj[user]){
  				eventsObj[user] = {"events": []};
  			}
  		}
  		//then populate the events object for each user key.
  		for(var i in events){
  			if(!eventsObj[events[i].user_sys_id.toString()]){
  				eventsObj[events[i].user_sys_id.toString()] = {"events": []};
  			}
  			eventsObj[events[i].user_sys_id.toString()]["events"].push(events[i]);
  		}
  		this.response['events'] = eventsObj;
  	} else {
  		this.response['events'] = {};
  	}
  	return this.response;
  },

  getTeamMembers: function(groupIdsString, userStart, userEnd,searchString) {
  	var users = {};
  	var groupDetails = {};
  	var userDetails = {};
  	var memGR = new GlideRecord(this.GRP_MEMBER_TABLE);
  	var searchArray = searchString&&searchString[0]?searchString[0].split(','):null;

  	if (searchArray && searchArray.length>0){
  		var qc = memGR.addQuery("user.name","LIKE",searchArray[0].trim());
  		for(var i = 1; i<searchArray.length;i++){
  			qc.addOrCondition("user.name","LIKE",searchArray[i].trim());
  		}
  	}

  	//groupIdsString = groupIdsString.join(',');
  	if (groupIdsString == "all"){
  		var groupObjs = this.getGroups(this.defaultUser);
  		groupIdsString = [];
  		for (var i = 0; i<groupObjs.length;i++){
  			groupIdsString.push(groupObjs[i].id);
  		}
  		groupIdsString = groupIdsString.join();
  	}
  	memGR.addQuery("group","IN",groupIdsString);
  	memGR.addQuery("user.active","true");
  	memGR.orderBy("user.name");
  	//memGR.addActiveQuery();
  	//memGR.setLimit(35); //Maximum 35 users are supported. Should improve by including pagination
  	var encodedQuery = memGR.getEncodedQuery();
  	memGR = new GlideAggregate(this.GRP_MEMBER_TABLE);
  	memGR.addEncodedQuery(encodedQuery);
  	memGR.groupBy("user");

  	if (JSUtil.notNil(userStart) && JSUtil.notNil(userEnd)){
  		memGR.chooseWindow(userStart, userEnd, true);
  	}

  	memGR.setCategory('list');
  	memGR.query();
  	var newUsers = [];
  	while(memGR.next()){
  		var memUser = memGR.user;
  		var userSysId = memUser.sys_id + "";
  		var memGroup = memGR.group;
  		var groupId = memGroup.sys_id + "";
  		var groupName = memGroup.name + "";
  		if (memUser && users[userSysId]) {
  			groupDetails = {};
  			groupDetails.id = groupId;
  			groupDetails.name = groupName;
  			users[userSysId].groups.push(groupDetails);
  		} else {
  			/* thre are musts to build a preview */
  			userDetails = {};
  			groupDetails = {};
  			this.buildUserProfileData(userDetails, memUser, true);

  			/* thre are others */
  			userDetails.isLoaded = true;
  			groupDetails.id = groupId;
  			groupDetails.name = groupName;
  			userDetails.groups = [];
  			userDetails.groups.push(groupDetails);
  			users[userSysId] = userDetails;
  			newUsers.push(userSysId);
  		}
  	}

  	if (newUsers.length > 0){
  		this.populateUsersSchedule(users, newUsers);
  	}

  	this.response["users"] = users;
  	this.response["user_count"] = memGR.getRowCount();
  	return this.response;
  },

  getUserProfileData: function(user){
  	var userDetails = {};
  	var gr = new GlideRecord("sys_user");
  	gr.get(user);
  	this.buildUserProfileData(userDetails, gr);
  	return userDetails;
  },

  buildUserProfileData:function(userDetails,userGR, skip){
  	userDetails.name = userGR.name;
  	userDetails.initials =  this.getUserInitials(userGR.name);
  	userDetails.userID = userGR.sys_id;
  	userDetails.avatar = userGR.photo.getDisplayValue();
  	if (userDetails.avatar) {
  		userDetails.avatar = userDetails.avatar + "?t=small";
  	}
  	userDetails.title = userGR.title;
  	var loc = userGR.location;
  	if (loc){
  		userDetails.city = loc.city + "";
  		userDetails.state = loc.state + "";
  		userDetails.country = loc.country + "";
  	}
  	userDetails.businessPhone = userGR.phone;
  	userDetails.mobilePhone = userGR.mobile_phone;
  	userDetails.email = userGR.email;
  	userDetails.agent_status = userGR.agent_status.getDisplayValue();

  	userDetails.path = this.USER_TABLE + ".do?sys_id=" + userGR.sys_id +  "&sysparm_view=Agent_Profile";

  	if (gs.nil(skip)){
  		userDetails.schedule = this.agentScheduleUtil.getCurrentUserScheduleName(userDetails.userID);
  	}
  },


  populateUsersSchedule: function(users, newUsers){
  	var schedules = this.agentScheduleUtil.getUserScheduleNames(newUsers);
  	for (var i=0; i<newUsers.length; i++){
  		users[newUsers[i]].schedule = schedules[newUsers[i]];
  	}

  },

  getUserInitials:function(name){
  	if (!name)
  		return "--";

  	var initials = name.split(" ").map(function(word) {
  		return word.toUpperCase();
  	}).filter(function(word) {
  		return word.match(/^[A-Z]/);
  	}).map(function(word) {
  		return word.substring(0,1);
  	}).join("");
  	return (initials.length > 3)? initials.substr(0, 3): initials;
  },

  getConfigurations: function(user) {
  	var userConfig = this.getUserConfigurations(user);
  	var configurations = [];
  	for (var i in userConfig.records) {
  		var configObj = userConfig.records[i];
  		var calendarConfig = {};
  		calendarConfig["id"] = configObj.relID;
  		calendarConfig["active"] = configObj.active;
  		calendarConfig["name"] = configObj.name;
  		calendarConfig["label"] = configObj.label;
  		calendarConfig["border_color"] = configObj.bordercolorVal;
  		calendarConfig["background_color"] = configObj.backGrdcolorVal;
  		calendarConfig["target_table"] = configObj.table;
  		calendarConfig["can_edit_events"] = configObj.can_edit_events;
  		calendarConfig["can_create_events"] = configObj.can_create_events;
  		calendarConfig["can_toggle_active"] = configObj.can_toggle_active;
  		calendarConfig["hidden"] = configObj.hidden;
  		calendarConfig["text_color"] = "black";
  		calendarConfig["are_background_events"] = configObj.are_background_events;
  		calendarConfig["sysparm_query"] = configObj.sysparm_query;
  		calendarConfig["view"] = configObj.view;
  		calendarConfig["start_date_field"] = configObj.start_date_field;
  		calendarConfig["end_date_field"] = configObj.end_date_field;
  		configurations.push(calendarConfig);
  	}
  	this.response["configurations"] = configurations;
  	this.response["default_group"] = userConfig.default_group;
  	this.response[this.USER_CONFIG_TABLE] = userConfig.sys_id;
  	this.response["page_limit"] = gs.getProperty("team_calendar.max_calendar_display",25);
  	return this.response;
  },

  updateConfiguration: function(id, value){
  	var result = {};
  	var configTaskGR = new GlideRecord(this.USER_AND_EVENT_CONFIG_REL_TABLE);
  	if(configTaskGR.get(id)){
  		configTaskGR.setValue("active", value);
  		configTaskGR.update();
  		var session = gs.getSession();
  		var key = this.sessionConfigKey;
  		session.clearClientData(key);
  		return true;
  	}else
  		return false;
  },

  updateDefaultGroupConfig: function(id, value){
  	var result = {};
  	var configTaskGR = new GlideRecord(this.USER_CONFIG_TABLE);
  	if(configTaskGR.get(id)){
  		configTaskGR.setValue("default_group", value);
  		configTaskGR.update();
  		var session = gs.getSession();
  		var key = this.sessionConfigKey;
  		session.clearClientData(key);

  		return true;
  	}else
  		return false;
  },

  getEvents: function(startDateNum, endDateNum, users) {
  	var events = [];
  	var userArray = [];

  	if(typeof users === "object")
  		users = users[0];

  	if (JSUtil.notNil(users)) {
  		userArray = users.split(",");
  		if (userArray.length > 0) {
  			for(var i in userArray) {
  				var user = userArray[i];
  				events = this.getUserEvents(startDateNum, endDateNum, user, this.defaultUser);
  				var result = {"events": events};
  				this.response[user] = result;
  			}
  		}
  	} else {
  		events = this.getUserEvents(startDateNum, endDateNum, this.defaultUser);
  		this.response["events"] = events;
  	}
  	return this.response;
  },

  getUsers: function(tableName, encodedQuery, userFieldName) {
  	var gr = new GlideRecordSecure(tableName);
  	gr.addEncodedQuery(encodedQuery);
  	gr.setCategory('list');
  	gr.query();
  	var users = "";

  	while (gr.next()) {
  		var user = gr.getElement(userFieldName);
  		users = users + user.sys_id + ",";
  	}
  },

  updateEvent: function(eventID, startDateNum, endDateNum, user){
  	var startDate = new GlideDateTime();
  	startDate.setDisplayValue(startDateNum);
  	var endDate = new GlideDateTime();
  	endDate.setDisplayValue(endDateNum);
  	var userEventGR = new GlideRecord("agent_events");
  	userEventGR.addQuery("user",user);
  	userEventGR.query();
  	if(userEventGR.next()){
  		var personal_schedule = userEventGR.getValue("personal_schedule");
  		var scheduleEntryGR = new GlideRecord("cmn_schedule_span");
  		scheduleEntryGR.addQuery("schedule",personal_schedule);
  		scheduleEntryGR.addQuery("sys_id",eventID);
  		scheduleEntryGR.query();
  		if(scheduleEntryGR.hasNext()){
  			while(scheduleEntryGR.next()){
  				scheduleEntryGR.start_date_time = startDate.getDisplayValue();
  				scheduleEntryGR.end_date_time = endDate.getDisplayValue();
  				scheduleEntryGR.update();
  			}
  			return true;
  		}
  		return false;
  	}
  },

  getUserConfig: function (user) {
  	var configGR = new GlideRecordSecure(this.USER_CONFIG_TABLE);
  	configGR.addQuery("user",user);
    	configGR.setCategory('list');
  	configGR.query();
  	if(!configGR.hasNext()){
  		var configId = this.createUserConfig(user);
  		if(configId){
  			configGR = new GlideRecordSecure(this.USER_CONFIG_TABLE);
  			configGR.addQuery("sys_id",configId);
  			configGR.query();
  		}
  	}
  	return configGR;
  },

  getUserConfigurations : function(user) {
  	var session = gs.getSession();
  	var key = this.sessionConfigKey;
  	var configResult = session.getClientData(key);
  	var config = {};
  	if (configResult) {
  		config = JSON.parse(configResult);
  	} else {
  		var configGR = this.getUserConfig(user);
  		var localConfig = {};
  		if(configGR.next()){
  			localConfig.name = configGR.getValue("name");
  			localConfig.sys_id = configGR.getValue("sys_id");
  			localConfig.default_group = configGR.getValue("default_group");
  			localConfig.records = [];
  			localConfig.records = this.prepareTaskConfigJSONRecords(configGR.getValue("sys_id"),user);
  		}
  		session.putClientData(key, JSON.stringify(localConfig));
  		config = localConfig;
  	}
  	return config;
  },

  getUserEvents : function(startDateNum, endDateNum, users, managerUser){
  	var timeoffSpans = [];
  	var startDate = null, endDate = null;

  	if (!users) {
  		users = this.defaultUser;
  	}

  	if(!JSUtil.nil(startDateNum))
  	{
  		startDate = new GlideDateTime();
  		startDate.setDisplayValue(startDateNum);
  	}
  	if(!JSUtil.nil(endDateNum))
  	{
  		endDate = new GlideDateTime();
  		endDate.setDisplayValue(endDateNum);
  		//endDate.addDaysUTC(1);
  	}

  	//Restrict to a month
  	var maxEndDate = new GlideDateTime();
  	maxEndDate.setDisplayValue(startDate.getDisplayValue());
  	maxEndDate.addMonthsLocalTime(1);
  	if(endDate.compareTo(maxEndDate) > 0) {
  		endDate.setDisplayValue(maxEndDate.getDisplayValue());
  	}

  	var events = this.computeEvents(startDate, endDate, users, managerUser);
  	for( i =0 ;i < events.length; i++){
  		var timeoffData = events[i];
  		var timeOffObj = {};

  		timeOffObj.start_date = timeoffData.start_date;
  		timeOffObj.end_date = timeoffData.end_date;
  		timeOffObj.start_date_display = timeoffData.start_date_display;
  		timeOffObj.end_date_display = timeoffData.end_date_display;
  		timeOffObj.dhtmlx_start_date = timeoffData.dhtmlx_start_date;
  		timeOffObj.dhtmlx_end_date = timeoffData.dhtmlx_end_date;
  		timeOffObj["quick_view"] = [];
  		timeOffObj["quick_view"].push({"label": gs.getMessage("Name"), "value": GlideStringUtil.escapeHTML(timeoffData.number)});
  		timeOffObj["quick_view"].push({"label": gs.getMessage("Type"), "value": timeoffData.label});
  		timeOffObj["quick_view"].push({"label": gs.getMessage("When"), "value": timeOffObj.start_date_display + " - " + timeOffObj.end_date_display});
  		timeOffObj.text = GlideStringUtil.escapeHTML(timeoffData.number);
  		timeOffObj["target_record"] = {};
  		timeOffObj.target_record["sys_id"] = timeoffData.sys_id;
  		timeOffObj.target_record["path"] = timeoffData.table + ".do?sys_id=" + timeoffData.sys_id; +"&sysparm_view=fsm_profile";
  		timeOffObj.target_record["table"] = timeoffData.table;
  		timeOffObj.configuration_id = timeoffData.relID;
  		timeOffObj.id = timeoffData.relID + '_' + timeoffData.sys_id;
  		timeOffObj.parent_id = timeoffData.relID + '_' + timeoffData.sys_id;
  		timeOffObj.user_sys_id = timeoffData.user_sys_id;
  		if (timeoffData.table == "wm_task") {
  			if (!gs.nil(timeoffData.location)) {
  				timeOffObj.location = timeoffData.location;
  			}
  			timeOffObj.state = timeoffData.state ? timeoffData.state : "";
  			timeOffObj.substate = timeoffData.substate ? timeoffData.substate : "";
  			timeOffObj.priority = timeoffData.priority ? timeoffData.priority : "";
  			timeOffObj.display_name = timeoffData.display_name ? timeoffData.display_name : "";
  		}

  		timeoffSpans.push(timeOffObj);
  	}
  	return timeoffSpans;
  	//this.response["events"] = timeoffSpans;
  	//return this.response;
  },

  computeEvents : function(startDate, endDate, users, managerUser) {
  	var events = [];
  	var records = [];
  	var event = {};
  	var eventCount = 0;
  	var config;
  	var value;
  	if(users) users = users.split(",");  //convert users from comma separated sys_id string to array.
  	if (managerUser) {
  		config = this.getUserConfigurations(managerUser);
  	} else{
  		config = this.getUserConfigurations(users[0]);
  	}

  	if(!config.records)
  		return [];
  	for(var i in config.records) {
  		var eventConfig = config.records[i];
  		var configTable = eventConfig.table;
  		var configName = eventConfig.name;
  		var configTheme = eventConfig.theme;
  		var configBorderColor = eventConfig.bordercolorVal;
  		var configBackGrdColor = eventConfig.backGrdcolorVal;
  		var configLabel = eventConfig.label;
  		var configRelId = eventConfig.relID;
  		if(eventConfig.active && eventConfig.setup_options == "simple" ) {
  			var eventGR = new GlideRecord(configTable);


  			var query = eventConfig.start_date_field+">=" + startDate + "^"+eventConfig.start_date_field+"<=" + endDate;
  			query += "^NQ"+eventConfig.end_date_field+">=" + startDate + "^"+eventConfig.end_date_field+"<=" + endDate;
  			query += "^NQ"+eventConfig.start_date_field+"<=" + startDate + "^"+eventConfig.end_date_field+">=" + endDate;
  			eventGR.addEncodedQuery(query);
  			eventGR.addEncodedQuery(eventConfig.user_field + "IN" + users);
  			if(eventConfig.filter)
  				eventGR.addEncodedQuery(eventConfig.filter);
  			//maximum of 100 events are supported
  			//eventGR.chooseWindow(0,100,false);
  			eventGR.setCategory("list");
  			eventGR.query();
  			while(eventGR.next()){
  				event = {};
  				event.table = configTable;
  				event.sys_id = eventGR.getValue("sys_id");
  				event.number = eventGR.getDisplayValue(eventConfig.display_field);
  				event.desc = eventGR.getDisplayValue("short_description");
  				event.start_date_display = eventGR.getDisplayValue(eventConfig.start_date_field);
  				event.end_date_display = eventGR.getDisplayValue(eventConfig.end_date_field);
  				event.start_date = eventGR.getValue(eventConfig.start_date_field);
  				event.end_date = eventGR.getValue(eventConfig.end_date_field);
  				if (configTable == "wm_task") {
  					event.location = {
  						latitude: eventGR.location.getRefRecord().getValue("latitude"),
  						longitude: eventGR.location.getRefRecord().getValue("longitude"),
  						sys_id: eventGR.location.getRefRecord().getValue("sys_id"),
  					};
  					event.substate = eventGR.getValue("substate");
  					event.state = eventGR.getValue("state");
  					event.priority = eventGR.getValue("priority");
  					event.display_name = eventGR.getDisplayValue("number");
  				}

  				var startDateTime = new GlideDateTime(event.start_date);
  				var endDateTime = new GlideDateTime(event.end_date);
  				event.dhtmlx_start_date = event.start_date_display.split(" ")[0] + " " + startDateTime.getDisplayValueInternal().split(" ")[1];
  				event.dhtmlx_end_date = event.end_date_display.split(" ")[0] + " " + endDateTime.getDisplayValueInternal().split(" ")[1];

  				event.theme = configTheme;
  				event.bordercolorVal = configBorderColor;
  				event.backGrdcolorVal = configBackGrdColor;
  				event.label = configLabel;
  				event.name = configName;
  				event.relID = configRelId;
  				event.user = eval("eventGR." + eventConfig.user_field) + "";
  				event.user_sys_id = eval("eventGR." + eventConfig.user_field) + "";
  				events.push(event);
  				eventCount ++;
  				if(parseInt(eventCount) >= parseInt(this.USER_MAX_EVENTS))
  					return events;
  			}
  		} else if (eventConfig.active && eventConfig.setup_options == "script") {
  			var evaluator = new GlideScopedEvaluator();
  			evaluator.putVariable("users", users);
  			evaluator.putVariable("startDate", startDate);
  			evaluator.putVariable("endDate", endDate);
  			evaluator.putVariable("eventType", eventConfig.event_type);
  			evaluator.putVariable("configId",eventConfig.sys_id);
  			evaluator.putVariable("displayField",eventConfig.display_field);
  			evaluator.putVariable("result", []);

  			// Now retrieve the result
  			gr = new GlideRecord(this.EVENT_CONFIG_TABLE);
  			if (gr.get(eventConfig.sys_id)) {
  				evaluator.evaluateScript(gr, "script", null);
  				records = evaluator.getVariable("result");
  			}

  			for (var j in records) {
  				event = {};
  				var record = records[j];
  				event.table = configTable;
  				event.desc = configName;
  				event.theme = configTheme;
  				event.bordercolorVal = configBorderColor;
  				event.backGrdcolorVal = configBackGrdColor;
  				event.label = configLabel;
  				event.name = configName;
  				event.relID = configRelId;
  				event.sys_id = record.sys_id ? record.sys_id: "";
  				event.number = record.number ? record.number: configName;
  				event.start_date = record.start_date ? record.start_date: "";
  				event.end_date = record.end_date ? record.end_date: "";
  				event.start_date_display = record.start_date_display ? record.start_date_display: "";
  				event.end_date_display = record.end_date_display ? record.end_date_display: "";
  				event.origin_start_date = record.origin_start_date ? record.origin_start_date : "";
  				event.origin_end_date = record.origin_end_date ? record.origin_end_date : "";
  				event.user = record.user ? record.end_date_display : "";

  				var startDateTime = new GlideDateTime(event.start_date);
  				var endDateTime = new GlideDateTime(event.end_date);
  				event.dhtmlx_start_date = record.start_date_display.split(" ")[0] + " " + startDateTime.getDisplayValueInternal().split(" ")[1];
  				event.dhtmlx_end_date = record.end_date_display.split(" ")[0] + " " + endDateTime.getDisplayValueInternal().split(" ")[1];

  				event.user_sys_id = record.user;
  				events.push(event);
  				eventCount++;
  				if(parseInt(eventCount) >= parseInt(this.USER_MAX_EVENTS))
  					return events;
  			}
  		}
  	}
  	return events;
  },

  createUserConfig:function(userID){
  	if(userID){
  		var userGR = new GlideRecord("sys_user");
  		if(userGR.get(userID)){
  			var userConfigGR = new GlideRecord(this.USER_CONFIG_TABLE);
  			userConfigGR.initialize();
  			userConfigGR.setValue("name", userGR.name+ " Schedule Config");
  			userConfigGR.setValue("user", userID);
  			return userConfigGR.insert();
  		}
  	}
  	return "";
  },

  prepareTaskConfigJSONRecords: function(configID,user){
  	var configRecords = [];
  	var personalschedule = "";

  	if(configID){
  		var relGREntry = new GlideRecord(this.USER_AND_EVENT_CONFIG_REL_TABLE);
  		relGREntry.addQuery("config",configID);
  		relGREntry.setCategory('list');
  		relGREntry.query();
  		//Prepare a map of rel for configID with task_config records for later use in checking record presence.
  		var relGRMap = {};
  		while(relGREntry.next()){
  			relGRMap[relGREntry.getValue("task_config")] = {sys_id: relGREntry.getValue("sys_id"), task_config: relGREntry.getValue("task_config"), active: relGREntry.getValue("active")};
  		}

  		var taskTableAccessMap = {};
  		//Now query all task config records and prepare JSON array of configurations along with user preference true/false.
  		var taskConfigGR = new GlideRecord(this.EVENT_CONFIG_TABLE);
  		taskConfigGR.addActiveQuery();
  		taskConfigGR.orderBy("name");
  		taskConfigGR.setCategory('list');
  		taskConfigGR.query();
  		while(taskConfigGR.next()){
  			var taskConfig={};
  			taskConfig["name"] = taskConfigGR.getDisplayValue("name");
  			taskConfig["user_field"] = taskConfigGR.getValue("task_user_field");
  			taskConfig["display_field"] = taskConfigGR.getValue("display_field");
  			taskConfig["table"] = taskConfigGR.getValue("task_table");
  			taskConfig["filter"] = taskConfigGR.getValue("task_filter");
  			taskConfig["start_date_field"] = taskConfigGR.getValue("start_date_field");
  			taskConfig["end_date_field"] = taskConfigGR.getValue("end_date_field");
  			taskConfig["label"] = taskConfigGR.getDisplayValue("label");
  			taskConfig["theme"] = taskConfigGR.getDisplayValue("color_theme");
  			taskConfig["bordercolorVal"] = taskConfigGR.getValue("border_color");
  			taskConfig["backGrdcolorVal"] = taskConfigGR.getValue("background_color");
  			taskConfig["can_edit_events"] = taskConfigGR.getValue("can_edit_events") == "1";
  			taskConfig["can_create_events"] = taskConfigGR.getValue("can_create_events") == "1";
  			taskConfig["can_toggle_active"] = taskConfigGR.getValue("can_toggle_active") == "1";
  			taskConfig["hidden"] = taskConfigGR.getValue("hidden") == "1";
  			taskConfig["sys_id"] = taskConfigGR.getValue("sys_id");
  			taskConfig["setup_options"] = taskConfigGR.getValue("setup_options");
  			taskConfig["are_background_events"] = taskConfigGR.getValue("are_background_events") == "1";
  			taskConfig["event_type"] = taskConfigGR.getValue("event_type");
  			if (taskConfig["table"] == 'cmn_schedule_span') {
  				if (gs.nil(personalschedule))
  					personalschedule = this.getUserSchedule(user);
  				if (personalschedule) {
  					taskConfig["sysparm_query"] = "schedule="+personalschedule;
  				} else {
  					taskConfig["sysparm_query"] = "";
  				}
  				taskConfig["view"] = "Mobile_FSM";
  			} else {
  				taskConfig["view"] = "";
  				taskConfig["sysparm_query"] = "";
  			}

  			//check wether logged in user has access to task table in task Config
  			//use a map to store storing table related access and avoid repeated queries to the same task_table field value table.
  			var taskTable = taskConfigGR.getDisplayValue("task_table");
  			if(gs.nil(taskTableAccessMap[taskTable])){
  				taskTableAccessMap[taskTable] = true;
  			}
  			//check TaskConfig entry for user config
  			var relGREntryPresent = false;
  			if(!gs.nil(relGRMap[taskConfigGR.getValue("sys_id")])){
  				relGREntryPresent = true;
  			}

  			if((taskTableAccessMap[taskTable]==true) && !relGREntryPresent){
  				var relGR = new GlideRecord(this.USER_AND_EVENT_CONFIG_REL_TABLE);
  				relGR.initialize();
  				relGR.setValue("config",configID);
  				relGR.setValue("task_config",taskConfigGR.getValue("sys_id"));
  				var relID = relGR.insert();
  				if(relID){
  					taskConfig["active"] = relGR.getValue("active")=="1";
  					taskConfig["relID"] = relID;
  					configRecords.push(taskConfig);
  				}
  			}else if((taskTableAccessMap[taskTable]==true) && relGREntryPresent){
  				taskConfig["active"] = relGRMap[taskConfig.sys_id]["active"]=="1";
  				taskConfig["relID"] = relGRMap[taskConfig.sys_id]["sys_id"];
  				configRecords.push(taskConfig);
  			}
  		}
  	}
  	return configRecords;
  },

  type: "CalendarRESTHelper"
};

Sys ID

dde6f9417f232200c57212f44efa91da

Offical Documentation

Official Docs: