Name

global.ChangeModelAJAXProcessorSNC

Description

ServiceNow code for the ChangeModelAJAXProcessor.

Script

var ChangeModelAJAXProcessorSNC = Class.create();
ChangeModelAJAXProcessorSNC.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  initialize: function (request, responseXML, gc) {
  	AbstractAjaxProcessor.prototype.initialize.call(this, request, responseXML, gc);
  },

  getModel: function () {

  	function getAllFieldChoices(table, field) {
  		var fieldChoices = {};
  		var choiceGr = new GlideSysChoice(table, field).getChoices();
  		var order = 0;
  		while (choiceGr.next()) {
  			if (choiceGr.getValue("inactive") === "1")
  				continue;

  			var choice = {
  				"value": choiceGr.getValue("value"),
  				"label": choiceGr.getDisplayValue("label"),
  				"order": order++
  			};

  			fieldChoices[choice.value] = choice;
  		}
  		return fieldChoices;
  	}

  	var typeCompatibility = gs.getProperty('com.snc.change_management.change_model.type_compatibility', false) === 'true';
  	var hideChangeModel = gs.getProperty('com.snc.change_management.change_model.hide', false) === 'true';

  	// Same structure as BR 'Populate scratchpad with model' on change_request
  	var model = {
  		"field": "state",
  		"available_states": [],
  		"field_choices": {},
  		"initial_state": "-5",
  		"record_preset": {},
  		"hidden": typeCompatibility && hideChangeModel
  	};

  	// Order of operations, change sys id takes precedent, then model, then type. Always check and prevent value set to: "undefined"
  	var changeSysId = JSUtil.nil(this.getParameter('sysparm_change_sys_id')) ? '' : this.getParameter('sysparm_change_sys_id') + '';
  	var changeType = JSUtil.nil(this.getParameter('sysparm_change_type')) ? '' : this.getParameter('sysparm_change_type') + '';
  	var modelId = JSUtil.nil(this.getParameter('sysparm_model_sys_id')) ? '' : this.getParameter('sysparm_model_sys_id') + '';
  	var modelOnForm = 'true' === (this.getParameter('sysparm_model_on_form') + '').toLowerCase();
  	var tableName = JSUtil.nil(this.getParameter('sysparm_table')) ? '' : this.getParameter('sysparm_table') + '';

  	var changeRequest = null;
  	var changeRequestGr = new GlideRecord(tableName);
  	changeRequestGr.initialize();
  	var validChange = changeSysId && changeRequestGr.get(changeSysId);
  	if (validChange && !modelId && !modelOnForm)
  		modelId = changeRequestGr.getValue('chg_model');

  	var changeModel = null;
  	var changeModelGr = new GlideRecord('chg_model');

  	var validModel = modelId && changeModelGr.get(modelId);
  	if (validModel)
  		changeModel = new ChangeModel(changeModelGr);

  	if (validModel && !tableName)
  		tableName = changeModelGr.getValue('table_name');

  	if (!validModel && !tableName)
  		tableName = 'change_request';

  	var modelChanged = validChange && validModel && (modelId !== changeRequestGr.getValue('chg_model') && !!modelId !== changeRequestGr.chg_model.nil());
  	var modelChangedToType = validChange && !validModel && modelChanged;

  	// only relevant if no model, i.e. type based change
  	var typeChanged = validChange && !validModel && (changeType !== changeRequestGr.getValue('type') && !!changeType !== changeRequestGr.type.nil());
  	var typeChangedToModel = validChange && validModel && changeRequestGr.chg_model.nil();

  	var setInitialState = false;

  	if (validChange) {
  		if (modelChanged || typeChanged)
  			setInitialState = true;

  		if (modelChangedToType)
  			changeRequestGr.setValue('chg_model', '');

  		if (typeChangedToModel)
  			changeRequestGr.setValue('chg_model', modelId);
  	}

  	if (!validChange) {
  		changeRequestGr = new GlideRecord(tableName);
  		changeRequestGr.initialize();
  		setInitialState = true;

  		// New records with model passed in
  		if (validModel)
  			changeModel.applyModel(changeRequestGr);

  		// If we haven't got a Change Request and Model on form but empty
  		if (!validModel && modelOnForm && changeType)
  			changeRequestGr.setValue('type', changeType);

  		// If we haven't got a Change Request and no Model on form
  		if (!validModel && !modelOnForm) {
  			if (typeCompatibility && changeType)
  				changeRequestGr.setValue('type', changeType);

  			// change models but removed model from form
  			if (!typeCompatibility) {
  				changeModelGr = new GlideRecord('chg_model');
  				validModel = changeModelGr.get(ChangeModel.getDefaultModelValue(changeRequestGr));

  				if (validModel) {
  					changeModel = new ChangeModel(changeModelGr);
  					changeRequestGr.setValue('chg_model', changeModelGr.getUniqueValue());
  					changeModel.applyModel(changeRequestGr);
  				}
  			}
  		}
  	}

  	changeRequest = new ChangeRequest(changeRequestGr);

  	model.field = changeRequest.getStateFieldName();
  	model.initial_state = changeRequest.getInitialState();

  	if (setInitialState)
  		changeRequestGr.setValue("state", changeRequest.getInitialState());

  	if (changeRequest.getState())
  		model.available_states = [changeRequest.getState()].concat(changeRequest.getNextManualStates());

  	if (validModel)
  		model.record_preset = changeModel.getRecordPresetValues();

  	model.field_choices = getAllFieldChoices(tableName, model.field);
  	model.available_states.sort(function (a, b) {
  		return model.field_choices[a].order - model.field_choices[b].order;
  	});

  	return JSON.stringify(model);
  },

  type: 'ChangeModelAJAXProcessorSNC'
});

Sys ID

d13dc09d5397101034d1ddeeff7b129d

Offical Documentation

Official Docs: