Name

global.AssociateCIToOutage

Description

Utility functions for Associate CI s to Outage tables.

Script

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

  // Tables
  OUTAGE_TABLE: 'cmdb_ci_outage',
  CI_TABLE: 'cmdb_ci',
  APP_SERVICE: 'cmdb_ci_service_auto',
  MAPPED_APP_SERVICE: 'cmdb_ci_service_discovered',
  TAG_BASED_MAPS: 'cmdb_ci_service_by_tags',
  DYNAMIC_CI_GROUP: 'cmdb_ci_query_based_service',
  CI_RELATIONSHIPS: 'cmdb_rel_ci',
  SERVICE_OFFERING: 'service_offering',

  // Columns
  SYS_CLASS_NAME: 'sys_class_name',
  CHILD: 'child',
  TYPE: 'type',
  PARENT: 'parent',
  SERVICE_REFERENCE: 'ref_cmdb_ci_service',
  OFFERING_REFERENCE: 'ref_service_offering',
  SERVICE_CLASSIFICATION: 'service_classification',

  CONTAINS_RELATIONSHIP: '55c95bf6c0a8010e0118ec7056ebc54d',
  DEPENDS_RELATIONSHIP: '1a9cb166f1571100a92eb60da2bce5c5',

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

  _getURL: function(outageId, addToTable) {
  	this.removeUserFilter();

  	var affectedCiTable = this.getOutageCiTable(outageId);
  	var filter = this.getFilterForCI(outageId);

  	var latestClassAdded = "";
  	var parentClass = "cmdb_ci";

  	// latestClassAdded logic
  	// 1. if there are ci's, get the latest class of the ci
  	// 2. default the latest class to parent class
  	latestClassAdded = this.getLatestClass(outageId);
  	if (!latestClassAdded)
  		latestClassAdded = parentClass;
  	var url = new GlideURL("outage_add_affected_cis.do");
  	url.set("sysparm_crTable", affectedCiTable);
  	url.set("sysparm_crSysId", outageId);
  	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_filter", filter);
  	return url;
  },

  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;
  },

  addSelected: function() {
  	var id = this.getParameter("sysparm_id");
  	var addToTable = this.getParameter("sysparm_add_to_table");
  	var listTableName = this.getParameter("sysparm_tableName");
  	var selCIsList = this.getParameter("sysparm_selCIs");
  	var selCIs = selCIsList.split(",");
  	for (var i = 0; i < selCIs.length; i++) {
  		if (selCIs[i]) {
  			var existingCI = new GlideRecordSecure(addToTable);
  			existingCI.addQuery("JOINcmdb_ci_outage.sys_id=cmdb_outage_ci_mtom.outage");
  			existingCI.addQuery("ci_item", selCIs[i]);
  			existingCI.addQuery("outage", id);
  			existingCI.query();

  			if (!existingCI.hasNext()) {
  				var affectedCI = new GlideRecordSecure(addToTable);
  				affectedCI.initialize();
  				affectedCI.outage = id;
  				affectedCI.ci_item = selCIs[i];
  				affectedCI.insert();
  			}
  		}
  	}
  	return gs.getMessage("Added selected configuration items successfully to the outage.");
  },

  getOutageCiTable: function(outageId) {
  	var outageGr = GlideRecordSecure(this.OUTAGE_TABLE);
  	outageGr.get(outageId);
  	var affectedCiId = outageGr.getValue(this.CI_TABLE);

  	var ciGr = GlideRecordSecure(this.CI_TABLE);
  	ciGr.get(affectedCiId);
  	var affectedCiClass = ciGr.getValue(this.SYS_CLASS_NAME);
  	return affectedCiClass;
  },

  getLatestClass: function(outageId) {
  	var affectedCiGR = new GlideRecordSecure("cmdb_outage_ci_mtom");
  	affectedCiGR.addQuery("JOINcmdb_ci_outage.sys_id=cmdb_outage_ci_mtom.outage");
  	affectedCiGR.addQuery("outage", outageId);
  	affectedCiGR.orderByDesc("sys_updated_on");
  	affectedCiGR.setLimit(1);
  	affectedCiGR.query();
  	if (affectedCiGR.next())
  		return affectedCiGR.ci_item.sys_class_name;
  	return "";
  },

  addAll: function() {
  	var id = this.getParameter("sysparm_id");
  	var query = this.getParameter("sysparm_query");
  	var addToTable = this.getParameter("sysparm_add_to_table");
  	var listTableName = this.getParameter("sysparm_tableName");

  	var result = [];
  	var existingCI = new GlideRecordSecure(addToTable);
  	existingCI.addQuery("JOINcmdb_ci_outage.sys_id=cmdb_outage_ci_mtom.outage");

  	existingCI.addQuery("outage", id);
  	existingCI.query();
  	while (existingCI.next()) {
  		result.push(existingCI.ci_item.sys_id);

  	}

  	var affectedCiGR = new GlideRecordSecure(listTableName);
  	var finalQuery = query;
  	affectedCiGR.addEncodedQuery(finalQuery);
  	affectedCiGR.addQuery("sys_id", "NOT IN", result.join());
  	affectedCiGR.query();
  	while (affectedCiGR.next()) {
  		var affectedCI = new GlideRecordSecure(addToTable);
  		affectedCI.initialize();
  		affectedCI.outage = id;
  		affectedCI.ci_item = affectedCiGR.sys_id;
  		affectedCI.insert();
  	}
  	return gs.getMessage("Added {0} configuration items successfully to the outage.", affectedCiGR.getRowCount());
  },

  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;
  },

  /**
   * Returns encoded query for the list of offerings that are related to the CI that the outage is opened against
   * @param {string} outageSysId - sys_id of cmdb_ci_outage record
   * @returns {string}
   */
  getFilterForCI: function(outageSysId) {
  	var outageId = this.getParameter("sysparm_id");
  	if (outageSysId) {
  		outageId = outageSysId
  	}
  	var output = [];

  	var outageGr = GlideRecordSecure(this.OUTAGE_TABLE);
  	outageGr.get(outageId);
  	var affectedCiId = outageGr.getValue(this.CI_TABLE);

  	var ciGr = GlideRecordSecure(this.CI_TABLE);
  	ciGr.get(affectedCiId);
  	var affectedCiClass = ciGr.getValue(this.SYS_CLASS_NAME);

  	var appServiceTables = [this.APP_SERVICE, this.MAPPED_APP_SERVICE, this.TAG_BASED_MAPS];

  	if (appServiceTables.indexOf(affectedCiClass) !== -1) {
  		output = this.getTechnicalOfferingsWithContainsRelationship(ciGr.getUniqueValue());
  		output = output.concat(this.getBusinessOfferingsWithDependsRelationship(ciGr.getUniqueValue()));
  	} else if (affectedCiClass == this.DYNAMIC_CI_GROUP) {
  		output = this.getTechnicalOfferingsWithContainsRelationship(ciGr.getUniqueValue());
  	}

  	if (output.length > 0) {
  		return 'nameIN' + output.toString();
  	} else {
  		return '';
  	}
  },

  /**
   * Returns list of sys_id's of technical offerings that have a Contains::Contained by relationship to the passed in Configuration Item
   * @param {string} ciSysId - sys_id of configuration item
   * @returns {array}
   */
  getTechnicalOfferingsWithContainsRelationship: function(ciSysId) {
  	var output = []
  	var cmdbRelCiGr = new GlideRecordSecure(this.CI_RELATIONSHIPS);
  	cmdbRelCiGr.addQuery(this.CHILD, ciSysId);
  	cmdbRelCiGr.addQuery(this.TYPE, this.CONTAINS_RELATIONSHIP);
  	cmdbRelCiGr.addQuery(this.PARENT + '.' + this.SYS_CLASS_NAME, this.SERVICE_OFFERING);
  	cmdbRelCiGr.addQuery(this.PARENT + '.' + this.OFFERING_REFERENCE + '.' + this.PARENT + '.' + this.SERVICE_CLASSIFICATION, 'Technical Service').addOrCondition(this.PARENT + '.' + this.OFFERING_REFERENCE + '.' + this.SERVICE_CLASSIFICATION, 'Technical Service');;
  	cmdbRelCiGr.query();
  	while (cmdbRelCiGr.next()) {
  		output.push(cmdbRelCiGr.getDisplayValue(this.PARENT));
  	}
  	return output;
  },

  /**
   * Returns list of sys_id's of business offerings that have a Depends on::Used by relationship to the passed in Configuration Item
   * @param {string} ciSysId - sys_id of configuration item
   * @returns {array}
   */
  getBusinessOfferingsWithDependsRelationship: function(ciSysId) {
  	var output = []
  	var cmdbRelCiGr = new GlideRecordSecure(this.CI_RELATIONSHIPS);
  	cmdbRelCiGr.addQuery(this.CHILD, ciSysId);
  	cmdbRelCiGr.addQuery(this.TYPE, this.DEPENDS_RELATIONSHIP);
  	cmdbRelCiGr.addQuery(this.PARENT + '.' + this.SYS_CLASS_NAME, this.SERVICE_OFFERING);
  	cmdbRelCiGr.addQuery(this.PARENT + '.' + this.OFFERING_REFERENCE + '.' + this.PARENT + '.' + this.SERVICE_CLASSIFICATION, 'Business Service').addOrCondition(this.PARENT + '.' + this.OFFERING_REFERENCE + '.' + this.SERVICE_CLASSIFICATION, 'Business Service');
  	cmdbRelCiGr.query();
  	while (cmdbRelCiGr.next()) {
  		output.push(cmdbRelCiGr.getDisplayValue(this.PARENT));
  	}
  	return output;
  },

  type: "AssociateCIToOutage"
});

Sys ID

6548a0b23b43030083bb832b44efc455

Offical Documentation

Official Docs: