Name

global.ChangeCIAssociationSNC

Description

Base Change Association API. Use the ChangeCIAssociation script include to override functionality in this script if required

Script

var ChangeCIAssociationSNC = Class.create();
// Table names
ChangeCIAssociationSNC.TASK_CI = "task_ci";
ChangeCIAssociationSNC.TASK_CMDB_CI_SERVICE = "task_cmdb_ci_service";
ChangeCIAssociationSNC.TASK_SERVICE_OFFERING = "task_service_offering";

// Field names
ChangeCIAssociationSNC.CI_ITEM = "ci_item";
ChangeCIAssociationSNC.CMDB_CI_SERVICE = "cmdb_ci_service";
ChangeCIAssociationSNC.SERVICE_OFFERING = "service_offering";

// type
ChangeCIAssociationSNC.AFFECTED = "affected";
ChangeCIAssociationSNC.IMPACTED = "impacted";
ChangeCIAssociationSNC.OFFERING = "offering";

// response param
ChangeCIAssociationSNC.IGNORED_CMDB_CI_SYS_IDS = "ignored_cmdb_ci_sys_ids";

ChangeCIAssociationSNC.prototype = {

  initialize: function(taskAssociationGr) {
  	this._log = new GSLog(ChangeCommon.LOG_PROPERTY, this.type);
  	if (taskAssociationGr)
  		this._gr = taskAssociationGr;
  },

  insert: function() {
  	var associationType = this.getAssociationType();
  	if (!associationType) {
  		this.addErrorMsg(gs.getMessage("Association of type: {0} is invalid", [associationType]));
  		return null;
  	}

  	var changeSysId = this._gr ? this._gr.task + "" : "";
  	if (!changeSysId) {
  		this.addErrorMsg(gs.getMessage("changeSysId: {0} is not a valid change_request sys_id", [changeSysId]));
  		return null;
  	}

  	var cmdbCiSysId = this.getCI() + "";
  	if (!this.hasValidCI()) {
  		this.addErrorMsg(gs.getMessage("cmdbCiSysId: {0} is not a valid cmdb_ci sys_id", [cmdbCiSysId]));
  		return null;
  	}

  	var sysId = null;
  	var isNewRecord = !this._gr.isValidRecord();

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[insert] isNewRecord: " + isNewRecord);

  	if (isNewRecord) {
  		var isAssociated = this.isAssociated();
  		if (isAssociated) {
  			this.addInfoMsg(gs.getMessage("Association of type: {0} between CI: {1} and Change Request: {2} already exists", [associationType, cmdbCiSysId, changeSysId]));
  			var gr = this._getAssociatedGr();
  			if (gr && gr.next()) {
  				this._gr = gr;
  				sysId = this._gr.getUniqueValue();
  			}
  		} else {
  			var canCreate = this._gr.canCreate();

  			if (this._log.atLevel(GSLog.DEBUG))
  				this._log.debug("[insert] canCreate: " + canCreate);

  			if (canCreate)
  				sysId = this._gr.insert();
  			else
  				this.addInfoMsg(gs.getMessage("Association of type: {0} between CI: {1} and Change Request: {2} is not permitted", [associationType, cmdbCiSysId, changeSysId]));

  			if (this._log.atLevel(GSLog.DEBUG))
  				this._log.debug("[insert] isActionAborted: " + this._gr.isActionAborted());
  		}
  	} else

  	if (!sysId || this._gr.isActionAborted())
  		this.addErrorMsg(gs.getMessage("Failed to create association of type: {0} between CI: {1} and Change Request: {2}", [associationType, cmdbCiSysId, changeSysId]));

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[insert] sysId: " + sysId);

  	return sysId;
  },

  getAssociationType: function() {
  	if (!this._gr)
  		return null;

  	var tableName = this._gr.getTableName();
  	if (!tableName)
  		return null;

  	if (tableName === ChangeCIAssociation.TASK_CI)
  		return ChangeCIAssociation.AFFECTED;

  	if (tableName === ChangeCIAssociation.TASK_CMDB_CI_SERVICE)
  		return ChangeCIAssociation.IMPACTED;

  	if (tableName === ChangeCIAssociation.TASK_SERVICE_OFFERING)
  		return ChangeCIAssociation.OFFERING;

  	return null;
  },

  hasValidCI: function() {
  	var cmdbCiSysId = this.getCI() + "";

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[hasValidCI] cmdbCiSysId: " + cmdbCiSysId);

  	if (!cmdbCiSysId)
  		return false;

  	var hasValidCI;

  	// Invalid record means they are not in the DB, i.e. new
  	if (!(this._gr.isValidRecord() && this.getCI() !== null && this.getCI().changed && this.getCI().changed())) {
  		var ga = new GlideAggregate("cmdb_ci");
  		ga.addAggregate("COUNT");
  		ga.addQuery("sys_id", cmdbCiSysId);
  		ga.query();
  		hasValidCI = ga.next() && ga.getAggregate("COUNT") > 0;
  	} else
  		hasValidCI = true;

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[hasValidCI] hasValidCI: " + hasValidCI);

  	return hasValidCI;
  },

  getCI: function() {
  	if (!this._gr)
  		return null;

  	if (this._gr.isValidField(ChangeCIAssociation.CI_ITEM))
  		return this._gr.getElement(ChangeCIAssociation.CI_ITEM);
  	if (this._gr.isValidField(ChangeCIAssociation.CMDB_CI_SERVICE))
  		return this._gr.getElement(ChangeCIAssociation.CMDB_CI_SERVICE);
  	if (this._gr.isValidField(ChangeCIAssociation.SERVICE_OFFERING))
  		return this._gr.getElement(ChangeCIAssociation.SERVICE_OFFERING);

  	return null;
  },

  isAssociated: function() {
  	var gr = this._getAssociatedGr();
  	var associated = gr && gr.next() ? true : false;

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[isAssociated] associated: " + associated);

  	return associated;
  },

  _getAssociatedGr: function() {
  	if (!this._gr)
  		return null;

  	var tableName = this._gr.getTableName();
  	var taskSysId = this._gr.task + "";
  	var ge = this.getCI();
  	var fieldName = ge !== null ? ge.getName() : "";
  	var fieldValue = ge !== null ? ge + "" : "";

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[_getAssociatedGr] tableName: " + tableName + " fieldName: " + fieldName + " fieldValue: " + fieldValue + " taskSysId: " + taskSysId);

  	if (!taskSysId || !tableName || !fieldName || !fieldValue)
  		return null;

  	var gr = new GlideRecord(tableName);
  	gr.addQuery("task", taskSysId);
  	gr.addQuery(fieldName, fieldValue);
  	gr.query();
  	return gr;
  },

  addErrorMsg: function(msg) {
  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[addErrorMsg] msg: " + msg);

  	if (!this._errorMsgs)
  		this._errorMsgs = [];

  	if (msg)
  		this._errorMsgs.push(msg);

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[addErrorMsg] this._errorMsgs: " + this._errorMsgs);
  },

  addInfoMsg: function(msg) {
  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[addInfoMsg] msg: " + msg);

  	if (!this._infoMsgs)
  		this._infoMsgs = [];

  	if (msg)
  		this._infoMsgs.push(msg);

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[addInfoMsg] this._infoMsgs: " + this._infoMsgs);
  },

  hasErrors: function() {
  	var hasErrors = this.getErrorMsgs().length > 0;

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[hasErrors] hasErrors: " + hasErrors);

  	return hasErrors;
  },

  hasInfo: function() {
  	var hasInfo = this.getInfoMsgs().length > 0;

  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[hasInfo] hasInfo: " + hasInfo);

  	return hasInfo;
  },

  getInfoMsgs: function() {
  	return this._infoMsgs ? this._infoMsgs : [];
  },

  getErrorMsgs: function() {
  	return this._errorMsgs ? this._errorMsgs : [];
  },

  setCI: function(cmdbCiSysId) {
  	cmdbCiSysId = cmdbCiSysId + "";

  	if (!cmdbCiSysId)
  		return this;

  	var ge = this.getCI();
  	if (ge !== null)
  		ge.setValue(cmdbCiSysId);

  	return this;
  },
  
  setChange: function(changeSysId) {
  	changeSysId = changeSysId + "";
  	if (changeSysId)
  		this._gr.task = changeSysId;
  	return this;
  },

  toString: function() {
  	return JSON.stringify(this.toJS());
  },

  toJS: function() {
  	return ChangeCommon.toJS(this._gr);
  },

  deleteRecord: ChangeCommon.methods.deleteRecord,

  refreshGlideRecord: ChangeCommon.methods.refreshGlideRecord,

  getGlideRecord: ChangeCommon.methods.getGlideRecord,

  setValue: ChangeCommon.methods.setValue,

  setValues: ChangeCommon.methods.setValues,

  canWriteTo: ChangeCommon.methods.canWriteTo,

  type: "ChangeCIAssociationSNC"
};

Sys ID

546d2345b78323000999e4f6ee11a96f

Offical Documentation

Official Docs: