Name

global.ChangeModelSNC

Description

ServiceNow code for the ChangeModel class. Extends State Transition Model.

Script

var ChangeModelSNC = Class.create();
ChangeModelSNC.prototype = Object.extendsObject(STTRMModel, {

  IMPLEMENTATION_STATES: "implementation_states",

  initialize: function(modelGr, _gs) {
  	STTRMModel.prototype.initialize.call(this, modelGr, _gs);
  },

  // Applies a change model to a Change Request
  applyModel: function(changeRequestGr) {
  	changeRequestGr.setValue("chg_model", this._gr.getUniqueValue());
  	this.applyRecordPresets(changeRequestGr);
  	this.applyInitialState(changeRequestGr, changeRequestGr.chg_model.changes());
  },

  // Applies the record presets defined in the model to the Change Request
  applyRecordPresets: function(changeRequestGr) {
  	if (!this._gr.record_preset.nil())
  		changeRequestGr.applyEncodedQuery(this._gr.getValue("record_preset"));
  },

  getRecordPresetValues: function() {
  	if (this._gr.record_preset.nil())
  		return {};

  	var templateGR = new GlideRecord("sys_template");
  	templateGR.initialize();
  	templateGR.setValue("template", this._gr.getValue("record_preset"));
  	templateGR.setValue("table", this._gr.getValue("table_name"));
  	var changeGR = new GlideRecord(this._gr.getValue("table_name"));
  	changeGR.initialize();
  	if (GlideTemplate.getFromRecord(templateGR).apply(changeGR) !== 0)
  		return {};

  	var nvp = {};
  	var encoded = this._gr.getValue("record_preset");
  	var elements = encoded.split("^");
  	elements.forEach(function(element) {
  		if (element === "EQ")
  			return;
  		var pair = element.split("=");
  		var vals = {};
  		vals.value = changeGR.getValue(pair[0]);
  		vals.displayValue = changeGR.getDisplayValue(pair[0]);
  		nvp[pair[0]] = vals;
  	});

  	return nvp;
  },

  // Returns an array of implementation state values defined for this model
  getImplementationStates: function() {
  	var implementationStates = this.getFromCache(this.IMPLEMENTATION_STATES);
  	
  	if (implementationStates !== null)
  		return implementationStates;
  	
  	implementationStates = [];

  	var definedStates = this._gr.getValue(this.IMPLEMENTATION_STATES);
  	if (!definedStates || definedStates.length === 0)
  		return implementationStates;
  	
  	var stateGr = new GlideRecord("sttrm_state");
  	stateGr.addQuery("sys_id","IN",this._gr.getValue(this.IMPLEMENTATION_STATES));
  	stateGr.query();
  	
  	while (stateGr.next()) {
  		implementationStates.push(stateGr.getValue("state_value"));
  	}

  	this.addToCache("implementation_states", implementationStates);
  	return implementationStates;
  },
  
  type: 'ChangeModelSNC'
});

ChangeModelSNC.getDefaultReadRoles = function() {
  var defaultReadRoles = (gs.getProperty('com.snc.change_management.change_model.default_read_roles') + '').split(',');
  if (!Array.isArray(defaultReadRoles) || defaultReadRoles.length < 1)
  	return '';

  var validRoles = [];

  var gr = new GlideRecord('sys_user_role');
  gr.addQuery('name', 'IN', defaultReadRoles);
  gr.query();
  while (gr.next())
  	validRoles.push(gr.getValue('name') + '');

  return validRoles.join(',');
};

ChangeModelSNC.getRefQualForChangeRequest = function(changeRequestGr) {
  var refQual = "active=true^available_in_ui=true^table_name=" + changeRequestGr.getTableName();
  if (changeRequestGr.chg_model.nil())
  	return refQual + "^EQ";

  return refQual + "^NQsys_id=" + changeRequestGr.getValue("chg_model") + "^EQ";
};

ChangeModelSNC.getDefaultModelValue = function(changeRequestGr) {
  var tableName = changeRequestGr ? changeRequestGr.getTableName() : "change_request";
  
  // For the Change Request table we want to preserve type compatability functionality if the property is set.
  // For extensions we don't need to preserve this, either there's a model or leave blank.
  if (tableName === "change_request") {
  	var typeCompatibility = gs.getProperty(ChangeRequestSNC.TYPE_COMPATIBILITY, "false") === "true";
  	if (typeCompatibility)
  		return "";
  }
  
  var chgModelGr = new GlideRecord("chg_model");
  chgModelGr.addActiveQuery();
  chgModelGr.addQuery("default_change_model", "1");
  chgModelGr.addQuery("table_name", tableName);
  chgModelGr.setLimit(1);
  chgModelGr.query();
  if (chgModelGr.next())
  	return chgModelGr.getUniqueValue();
  return "";
};

ChangeModelSNC.getDefaultTypeValue = function() {
  var typeCompatibility = gs.getProperty(ChangeRequestSNC.TYPE_COMPATIBILITY, "false") === "true";
  return (typeCompatibility) ? "normal" : "";
};

Sys ID

9f6f8ff05303101034d1ddeeff7b1280

Offical Documentation

Official Docs: