Name

global.ChangeCIAssociationManagerSNC

Description

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

Script

var ChangeCIAssociationManagerSNC = Class.create();
ChangeCIAssociationManagerSNC.prototype = {

  initialize: function(changeRequest, chgMgtWorker) {
  	this._log = new GSLog(ChangeCommon.LOG_PROPERTY, this.type);

  	if (typeof changeRequest === "string")
  		this.setChangeSysId(changeRequest);
  	else if (changeRequest && typeof changeRequest.instanceOf === "function" && changeRequest.instanceOf(global.ChangeRequest.CHANGE))
  		this._gr = changeRequest;

  	if (chgMgtWorker)
  		this.setChgMgtWorker(chgMgtWorker);

  	// Verify that the change request passed in matches the chgMgtWorker change request
  	if (this._gr && this._chgMgtWorker) {
  		var request = this.getChgMgtWorker().getValue("request");
  		var changeSysId = this._gr.getUniqueValue();
  		var chgMgtWorkChangeSysId = request.task + "";
  		if (changeSysId !== chgMgtWorkChangeSysId)
  			this._log.error("[create] changeSysId: " + changeSysId + " does not match chgMgtWorkChangeSysId: " + chgMgtWorkChangeSysId);
  	}
  },

  create: function(cmdbCiSysIds, associationType, fieldValues) {
  	if (this._log.atLevel(GSLog.DEBUG))
  		this._log.debug("[create] associationType: " + associationType + " cmdbCiSysIds: " + cmdbCiSysIds);

  	// default association type is AFFECTED CIs
  	associationType = (associationType + "").toLowerCase();
  	if (!associationType || (associationType !== ChangeCIAssociation.AFFECTED && associationType !== ChangeCIAssociation.IMPACTED  && associationType !== ChangeCIAssociation.OFFERING))
  		associationType = ChangeCIAssociation.AFFECTED;

  	//Validate that if the type is Service Offering that the plugin is installed.
  	if (associationType === ChangeCIAssociation.OFFERING && !GlidePluginManager.isActive("com.snc.service_portfolio_core")) {
  		this.getChgMgtWorker().addErrorMsg(gs.getMessage("Association of type: {0} is invalid as the plugin Service PortFolio Management - Core is not installed.", [associationType]));
  		return this;
  	}

  	var _fieldValues = {};

  	if (fieldValues) {
  		_fieldValues = global.ChangeCommon.assign({}, fieldValues);

  		// remove all required|option parameters
  		delete _fieldValues.association_type;
  		delete _fieldValues.cmdb_ci_sys_ids;
  		delete _fieldValues.refresh_impacted_services;
  	}

  	if (!cmdbCiSysIds) {
  		if (this.getChgMgtWorker())
  			this.getChgMgtWorker().addErrorMsg(gs.getMessage("List of Configuration Item ids not provided"));

  		return this;
  	}

  	if (typeof cmdbCiSysIds === "string")
  		cmdbCiSysIds = cmdbCiSysIds.split(",");

  	var cleanCmdbCiSysIds = [];
  	if (Array.isArray(cmdbCiSysIds)) {
  		// remove duplicates
  		var uniqueCmdbCiSysIds = cmdbCiSysIds.filter(global.ChangeCommon.filters.unique);

  		// Collect the garbage
  		this.addIgnoredCmdbCiSysIds(uniqueCmdbCiSysIds.filter(function(sysId) { return !global.ChangeCommon.filters.sysId(sysId); }));

  		// retain only well formatted sys ids
  		cleanCmdbCiSysIds = uniqueCmdbCiSysIds.filter(global.ChangeCommon.filters.sysId);
  	}

  	if (cleanCmdbCiSysIds.length === 0) {
  		if (this.getChgMgtWorker())
  			this.getChgMgtWorker().addErrorMsg(gs.getMessage("No well formatted Configuration Item ids not provided"));

  		return this;
  	}

  	var changeSysId = "";
  	if (this._gr)
  		changeSysId = this._gr.getUniqueValue();

  	if (!changeSysId && this.getChgMgtWorker()) {
  		var request = this.getChgMgtWorker().getValue("request");
  		var chgRequestGr = new GlideRecordSecure(global.ChangeRequest.CHANGE_REQUEST);
  		if (request && request.task && chgRequestGr.get(request.task)) {
  			this._gr = chgRequestGr;
  			changeSysId = this._gr.getUniqueValue();
  		}
  	}

  	if (!changeSysId) {
  		if (this.getChgMgtWorker())
  			this.getChgMgtWorker().addErrorMsg(gs.getMessage("No valid Change Request provided"));

  		return this;
  	}

  	// Create an association per cmdbCiSysId
  	cleanCmdbCiSysIds.forEach(function(cmdbCiSysId) {

  		var changeAssocGr = null;
  		if (associationType === ChangeCIAssociation.AFFECTED)
  			changeAssocGr = new GlideRecord(ChangeCIAssociation.TASK_CI);
  		else if (associationType === ChangeCIAssociation.IMPACTED)
  			changeAssocGr = new GlideRecord(ChangeCIAssociation.TASK_CMDB_CI_SERVICE);
  		else if (associationType === ChangeCIAssociation.OFFERING)
  			changeAssocGr = new GlideRecord(ChangeCIAssociation.TASK_SERVICE_OFFERING);

  		if (!changeAssocGr && this.getChgMgtWorker())
  			this.getChgMgtWorker().addErrorMsg(gs.getMessage("No valid Change Request association type"));

  		var changeCIAssociation = new ChangeCIAssociation(changeAssocGr).setChange(changeSysId).setCI(cmdbCiSysId);
  		var fields = null;
  		if (_fieldValues)
  			fields = changeCIAssociation.setValues(_fieldValues);

  		if (!changeCIAssociation.hasValidCI())
  			this.addIgnoredCmdbCiSysIds(changeCIAssociation.getCI() + "");
  		else
  			changeCIAssociation.insert();

  		if (changeCIAssociation && this.getChgMgtWorker()) {
  			if (changeCIAssociation.hasErrors())
  				this.getChgMgtWorker().addErrorMsg(changeCIAssociation.getErrorMsgs());

  			if (fields.ignored && fields.ignored.length > 0)
  				changeCIAssociation.addInfoMsg(gs.getMessage("Fields ignored: {0}", [fields.ignored.join(",")]));

  			if (changeCIAssociation.hasInfo())
  				this.getChgMgtWorker().addInfoMsg(changeCIAssociation.getInfoMsgs());
  		}
  	}, this);

  	return this;
  },

  refreshImpactedServices: function() {
  	var runRefresh = false;
  	if (this._gr && this.getChgMgtWorker() &&
  		(this.getChgMgtWorker().getRequestParam("association_type") === ChangeCIAssociation.AFFECTED || this.getChgMgtWorker().getGlideRecord().getValue("operation") === ChangeManagementWorker.REFRESH))
  		runRefresh = true;

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

  	if (runRefresh)
  		new global.ChangeUtils().refreshImpactedServices(this._gr, false);

  	return this;
  },

  setChgMgtWorker: ChangeManagementWorkerSNC.methods.setChgMgtWorker,

  getChgMgtWorker: ChangeManagementWorkerSNC.methods.getChgMgtWorker,

  setChangeSysId: function(changeSysId) {
  	if (!changeSysId)
  		return this;

  	var changeRequestGr = new GlideRecordSecure(global.ChangeRequest.CHANGE_REQUEST);
  	changeRequestGr.addQuery("sys_id", changeSysId);
  	changeRequestGr.query();
  	if (changeRequestGr.next())
  		this._gr = changeRequestGr;

  	return this;
  },

  addIgnoredCmdbCiSysIds: function(cmdbCiSysIds) {
  	this._ignoredCmdbCiSysIds = this._ignoredCmdbCiSysIds ? this._ignoredCmdbCiSysIds : [];
  	if (cmdbCiSysIds) {
  		if (typeof cmdbCiSysIds === "string")
  			cmdbCiSysIds = cmdbCiSysIds.split(",");
  		this._ignoredCmdbCiSysIds = this._ignoredCmdbCiSysIds.concat(cmdbCiSysIds);
  	}

  	if (this.getChgMgtWorker()) {
  		var ignoredCmdbCis = this.getChgMgtWorker().getResponseParam(global.ChangeCIAssociation.IGNORED_CMDB_CI_SYS_IDS) || [];

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

  		this._ignoredCmdbCiSysIds = ignoredCmdbCis.concat(this._ignoredCmdbCiSysIds).filter(global.ChangeCommon.filters.unique);
  		this.getChgMgtWorker().setResponseParam(global.ChangeCIAssociation.IGNORED_CMDB_CI_SYS_IDS, this._ignoredCmdbCiSysIds).update();
  	}

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

  	return this;
  },

  type: "ChangeCIAssociationManagerSNC"
};

Sys ID

6447e134b72323000999e4f6ee11a935

Offical Documentation

Official Docs: