Name

global.AssociateCIToTask

Description

Utility functions for Associate CI s to Task tables.

Script

var AssociateCIToTask = Class.create();
AssociateCIToTask.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  SESSION_KEY: 'com.snc.change_request.AssociateCIToTask.ci_user_filter',

  ajaxFunction_getURL: function(){
  	var chgReqId = this.getParameter("sysparm_id");
  	var addToTable = this.getParameter("sysparm_add_to") + "";
  	return this._getURL(chgReqId, addToTable);
  },

  _getURL: function(chgReqId, addToTable){
  	if (!new GlideRecord('task_ci').canCreate())
  		return;
  	this.removeUserFilter();

  	var latestClassAdded;
  	var parentClass = "";
  	var principalClassFilter = "";
  	// latestClassAdded logic
  	// 1. if there are ci's, get the latest class of the ci
  	// 2. default the latest class to parent class
  	if (addToTable === "task_ci") {
  		principalClassFilter = this.getPrincipalClassFilter(chgReqId);
  		if (!principalClassFilter)
  			latestClassAdded = this.getLatestClass(chgReqId);
  		parentClass = this.getParentClass(chgReqId);
  		if (!latestClassAdded)
  			latestClassAdded = parentClass;
  	}
  	else if (addToTable === "task_service_offering")
  		latestClassAdded = "service_offering";
  	else
  		latestClassAdded = "cmdb_ci";

  	var url = new GlideURL("task_add_affected_cis.do");
  	url.set("sysparm_crSysId", chgReqId);
  	url.set("sysparm_view", "associate_ci");
  	url.set("sysparm_add_to", addToTable);
  	url.set("sysparm_stack", "no");
  	url.set("sysparm_table", latestClassAdded);
  	url.set("sysparm_parent_class", parentClass);
  	url.set("sysparm_fixed_query", principalClassFilter);
  	return new GlideTinyURL().createTinyURL(url);
  },

  getQueryFilter: function(chgReqId, addToTable) {
  	var principalClassFilter = "";
  	if (addToTable === "task_ci")
  		principalClassFilter = this.getPrincipalClassFilter(chgReqId);
  	return principalClassFilter;
  },

  /*
  * If "Best Practice - Bulk CI Changes" plugin is active and task type is change_requests
  *     parent class = ci_class populated on the change_request
  *     if --None- is selected for ci_class, then cmdb_ci is returned
  * else
  *     parent class = cmdb_ci
  **/
  getParentClass: function(chgReqId) {
  	if (GlidePluginManager.isActive("com.snc.bestpractice.bulkchange") || GlidePluginManager.isActive("com.snc.change_management.mass_update_ci")) {
  		var chgReqGR = new GlideRecordSecure("change_request");
  		if (chgReqGR.get(chgReqId) && !chgReqGR.ci_class.nil()){
  			if ((chgReqGR.isValidField("is_bulk") && chgReqGR.getValue("is_bulk") === "1") || !chgReqGR.isValidField("is_bulk")) {
  				return chgReqGR.ci_class;
  			}
  		}
  	}
  	return "cmdb_ci";
  },

  getPrincipalClassFilter: function(chgReqId) {
  	if (!chgReqId)
  		return;
  	var taskGr = new GlideRecord("task");
  	taskGr.get(chgReqId);
  	if (!taskGr.isValidRecord()) {
  		gs.error("Invalid task record sys-id passed");
  		return;
  	}
  	return new TaskUtils().getPCFilterEvaluated(taskGr.sys_class_name + '');
  },
  storeUserFilter: function(){
  	var filter;
  	filter = this.getParameter("sysparm_filter_query");
  	gs.getSession().putClientData(this.SESSION_KEY, filter);
  	return;
  },

  removeUserFilter: function(){
  	gs.getSession().clearClientData(this.SESSION_KEY);
  	return;
  },
  
  _isValidTask: function(id) {
  	var gr = new GlideRecord('task');
  	return gr.get(id) && gr.active;
  },

  addSelected: function() {
  	var id = this.getParameter("sysparm_id");
  	if(!this._isValidTask(id)){
  		gs.error("Unable to Add CI item(s) for an inactive/invalid task {0}", id);
  		return;
  	}
  	var addToTable = this.getParameter("sysparm_add_to_table") + "";
  	var selCIsList = this.getParameter("sysparm_selCIs");

  	if (!selCIsList)
  		return;

  	var affectedCI = new GlideRecord(addToTable);
  	if (affectedCI.canCreate()) {
  		var selCIs = selCIsList.split(",");

  		var existingCI = new GlideRecord(addToTable);
  		var col = this.getCIField(addToTable);
  		existingCI.addQuery(col, "IN", selCIsList);
  		existingCI.addQuery("task", id);
  		existingCI.query();
  		var addedCIs = [];
  		while (existingCI.next())
  			addedCIs.push(existingCI.getValue(col) + '');

  		for (var i = 0; i < selCIs.length; i++) {
  			if (addedCIs.indexOf(selCIs[i] + '') == -1) {
  				affectedCI.initialize();
  				affectedCI.task = id;
  				affectedCI.setValue(col, selCIs[i]);
  				affectedCI.insert();
  			}
  		}
  	}
  },

  getLatestClass: function(chgReqId){
  	var affectedCiGR = new GlideRecordSecure("task_ci");
  	affectedCiGR.addQuery("task", chgReqId);
  	affectedCiGR.orderByDesc("sys_updated_on");
  	affectedCiGR.setLimit(1);
  	affectedCiGR.query();
  	if (affectedCiGR.next())
  		return affectedCiGR.ci_item.sys_class_name;
  	return "";
  },
  
  getCIField: function(table) {
  	if ("task_ci" === table)
  		return "ci_item";
  	else if ("task_service_offering" === table)
  		return "service_offering";
  	return "cmdb_ci_service";
  },

  addAll: function() {
  	var addToTable = this.getParameter("sysparm_add_to_table") + "";
  	var id = this.getParameter("sysparm_id");
  	if(!this._isValidTask(id)){
  		gs.error("Unable to Add CI item(s) for an inactive/invalid task {0}", id);
  		return;
  	}
  	var affectedCI = new GlideRecord(addToTable);
  	if (affectedCI.canCreate()) {
  		var fixedQuery = this.getParameter("sysparm_fixed_query");
  		var query = this.getParameter("sysparm_query");
  		var listTableName = this.getParameter("sysparm_tableName");

  		var result = [];
  		var existingCI = new GlideRecord(addToTable);
  		existingCI.addQuery("task", id);
  		existingCI.query();
  		var col = this.getCIField(addToTable);
  		while (existingCI.next())
  			result.push(existingCI.getValue(col) + '');

  		var affectedCiGR = new GlideRecordSecure(listTableName);
  		affectedCiGR.addEncodedQuery(fixedQuery);
  		affectedCiGR.addEncodedQuery(query);
  		affectedCiGR.query();
  		while (affectedCiGR.next()) {
  			//Check if the CI is already added to the list
  			if (!result.contains(affectedCiGR.sys_id + '')) {
  				affectedCI.initialize();
  				affectedCI.task = id;
  				affectedCI.setValue(col, affectedCiGR.sys_id);
  				affectedCI.insert();
  			}
  		}
  	}
  },

  getTotalNumberOfItems: function() {
  	var query = this.getParameter("sysparm_query");
  	var listTableName = this.getParameter("sysparm_table");
  	var affectedCiGR = new GlideAggregate(listTableName);

  	if (!affectedCiGR.canRead())
  		return 0;

  	affectedCiGR.addEncodedQuery(query);
  	affectedCiGR.addAggregate('COUNT');
  	affectedCiGR.query();
  	if (affectedCiGR.next())
  	   return affectedCiGR.getAggregate('COUNT') - 0;
  	return 0;
  },

  isPublic: function() {
  	return false;
  },

  type: "AssociateCIToTask"
});

Sys ID

f9c746976f5a7100e5f2b3312e3ee4bb

Offical Documentation

Official Docs: