Name

sn_grc_pa.GRCPAIndicatorUtilsBase

Description

General GRC PA Utilities Base

Script

var GRCPAIndicatorUtilsBase = Class.create();
GRCPAIndicatorUtilsBase.prototype = {
  initialize: function() {
  	
  },
  
  getBreakdownForPAIndicator: function(paIndicator) {
  	return this._getBreakdownForPAIndicator(paIndicator);
  },
  
  refreshScores: function(item, type) {
  	return this._refreshScores(item, type);
  },
  
  generatePAIndicatorRelationship: function(contentId, paIndicatorId) {
  	return this._generatePAIndicatorRelationship(contentId, paIndicatorId);
  },
  
  generatePAIndicatorItemRelationship: function(item, paIndicatorId, breakdown) {
  	this._generatePAIndicatorItemRelationship(item, paIndicatorId, breakdown);
  },
  
  hasContentPAIndicatorRelationship: function(contentId) {
  	return this._hasContentPAIndicatorRelationship(contentId);
  },
  
  hasItemPAIndicatorRelationship: function(itemId) {
  	return this._hasItemPAIndicatorRelationship(itemId);
  },
  
  getIndicatorBreakdownList: function(contentId) {
  	return this._getIndicatorBreakdownList(contentId);
  },
  
  _getIndicatorBreakdownList: function(contentId) {
  	var paContentIndicatorList = {};
  	
  	var paContentIndicator = new GlideRecord("sn_grc_pa_m2m_content_pa_indicator");
  	paContentIndicator.addQuery("sn_grc_content", contentId);
  	paContentIndicator.query();
  		
  	while (paContentIndicator.next()) {
  		var paIndicatorBreakdown = new GlideRecord("pa_indicator_breakdowns");
  		paIndicatorBreakdown.addQuery("indicator", paContentIndicator.pa_indicator);
  		paIndicatorBreakdown.query();
  	
  		var breakdown = [];
  	
  		while(paIndicatorBreakdown.next()) {
  			var sourceFactTable = paIndicatorBreakdown.breakdown.dimension.facts_table + '';
  			var sourceCondition = paIndicatorBreakdown.breakdown.dimension.conditions + '';
  			var sourceBreakdown = paIndicatorBreakdown.breakdown + '';
  		
  			breakdown.push({sourceBreakdown: sourceBreakdown, sourceFactTable: sourceFactTable, sourceCondition: sourceCondition});
  		}
  			
  		paContentIndicatorList[paContentIndicator.pa_indicator] = breakdown;
  	}
  	
  	return paContentIndicatorList;
  },
  
  _hasContentPAIndicatorRelationship: function(contentId) {
  	var paIndicatorRelationship = new GlideRecord("sn_grc_pa_m2m_content_pa_indicator");
  	paIndicatorRelationship.addQuery("sn_grc_content", contentId);
  	paIndicatorRelationship.setLimit(1);
  	paIndicatorRelationship.query();
  	
  	return paIndicatorRelationship.hasNext();
  },
  
  _hasItemPAIndicatorRelationship: function(itemId) {
  	var paIndicatorRelationship = new GlideRecord("sn_grc_pa_m2m_item_pa_indicator");
  	paIndicatorRelationship.addQuery("sn_grc_item", itemId);
  	paIndicatorRelationship.setLimit(1);
  	paIndicatorRelationship.query();
  	
  	return paIndicatorRelationship.hasNext();
  },
  
  _generatePAIndicatorRelationship: function(contentId, paIndicatorId) {
  	var paIndicatorBreakdown = new GlideRecord("pa_indicator_breakdowns");
  	paIndicatorBreakdown.addQuery("indicator", paIndicatorId);
  	paIndicatorBreakdown.query();
  	
  	var breakdown = [];
  	
  	while(paIndicatorBreakdown.next()) {
  		var sourceFactTable = paIndicatorBreakdown.breakdown.dimension.facts_table + '';
  		var sourceCondition = paIndicatorBreakdown.breakdown.dimension.conditions + '';
  		var sourceBreakdown = paIndicatorBreakdown.breakdown + '';
  		
  		breakdown.push({sourceBreakdown: sourceBreakdown, sourceFactTable: sourceFactTable, sourceCondition: sourceCondition});
  	}
  	
  	var item = new GlideRecord("sn_grc_item");
  	item.addQuery("content", contentId);
  	item.query();
  		
  	while(item.next())
  		this._generatePAIndicatorItemRelationship(item, paIndicatorId, breakdown);

  },
  
  _generatePAIndicatorItemRelationship: function(item, paIndicatorId, breakdown) {
  	var profile = new GlideRecord("sn_grc_profile");
  	if (profile.get(item.profile)) {
  		var profileTable = profile.table;
  		var profileId = profile.applies_to;

  		var tableHierarchy = (new GlideTableHierarchy(profileTable)).getHierarchy();
  		var tableHierarchyMap = {};
  			
  		for (var table=0; table<tableHierarchy.length; table++)
  			tableHierarchyMap[tableHierarchy[table]] = true;
  			
  		var itemToPAIndicator = null;
  		var hasCreatedRelationship = false;
  		for (var i=0; i<breakdown.length; i++) {
  			if (tableHierarchyMap[breakdown[i].sourceFactTable]) {
  				var breakdownSource = new GlideRecord(profileTable);
  				breakdownSource.addEncodedQuery(breakdown[i].sourceCondition);
  				breakdownSource.addQuery("sys_id", profileId);
  				breakdownSource.query();
  					
  				var breakdownId = breakdown[i].sourceBreakdown;
  							
  				if (!this._isRelationshipPresent(item.sys_id, paIndicatorId, breakdownId, profileId)) {							
  					if (breakdownSource.hasNext()) {
  						itemToPAIndicator = new GlideRecord("sn_grc_pa_m2m_item_pa_indicator");
  						itemToPAIndicator.setValue("sn_grc_item", item.sys_id);
  						itemToPAIndicator.setValue("pa_indicator", paIndicatorId);
  						itemToPAIndicator.setValue("pa_breakdown", breakdownId);
  						itemToPAIndicator.setValue("pa_element", profileId);
  						itemToPAIndicator.insert();

  						hasCreatedRelationship = true;
  					}
  				}
  				else
  					hasCreatedRelationship = true;									
  			}
  		}
  			
  		if (!hasCreatedRelationship && !this._isRelationshipPresent(item.sys_id, paIndicatorId, "", "")) {
  			itemToPAIndicator = new GlideRecord("sn_grc_pa_m2m_item_pa_indicator");
  			itemToPAIndicator.setValue("sn_grc_item", item.sys_id);
  			itemToPAIndicator.setValue("pa_indicator", paIndicatorId);
  			itemToPAIndicator.setValue("pa_breakdown", "");
  			itemToPAIndicator.setValue("pa_element", "");
  			itemToPAIndicator.insert();
  		}			
  	}
  },
  
  _isRelationshipPresent: function(item, pa_indicator, pa_breakdown, pa_element) {
  	var itemToPAIndicator = new GlideRecord("sn_grc_pa_m2m_item_pa_indicator");
  	itemToPAIndicator.addQuery("sn_grc_item", item);
  	itemToPAIndicator.addQuery("pa_indicator", pa_indicator);
  	itemToPAIndicator.addQuery("pa_breakdown", pa_breakdown);
  	itemToPAIndicator.addQuery("pa_element", pa_element);
  	itemToPAIndicator.query();
  
  	return itemToPAIndicator.hasNext();
  },
  
  _refreshScores: function(item, type) {
  	var paIndicatorRelation = null;
  
  	if (type == "content") {
  		paIndicatorRelation = new GlideRecord("sn_grc_pa_m2m_content_pa_indicator");
  		paIndicatorRelation.addQuery("sn_grc_content", item);			
  	}
  	else {
  		paIndicatorRelation = new GlideRecord("sn_grc_pa_m2m_item_pa_indicator");
  		paIndicatorRelation.addQuery("sn_grc_item", item);
  	}
  	
  	paIndicatorRelation.query();
  	
  	while (paIndicatorRelation.next())
  		this._resetTrend(type, paIndicatorRelation);
  },
  
  _resetTrend: function(type, paIndicatorRelation) {
  	var scorecards = null;
  		
  	if (type != "content")
  		scorecards = (new global.GRCPerformanceAnalytics()).getPAScorecards(paIndicatorRelation.pa_indicator, paIndicatorRelation.pa_breakdown, paIndicatorRelation.pa_element);
  	else
  		scorecards = (new global.GRCPerformanceAnalytics()).getPAScorecards(paIndicatorRelation.pa_indicator);
  		
  	var uuid = scorecards.uuid;
  	var changepercFormatted = scorecards.changepercFormatted;
  	var direction = scorecards.direction;
  	var changeFormatted = scorecards.changeFormatted;			
  	
  	var directionSymbol = "";
  	var trend = "";
  	if (direction == "1") {
  		if (changeFormatted == "0" || changeFormatted == null)
  			color = "black";
  		else
  			color = "red";
  	} 
  	else if (direction == "2") {
  		if (changeFormatted != null && changeFormatted != "") {
  			if (changeFormatted == "0") {
  				color = "black";
  			}
  			else if (changeFormatted.indexOf('-') !== -1) {
  				directionSymbol = "▼ ";
  				color = "green";
  			} 
  			else {
  				directionSymbol = "▲ ";
  				color = "red";
  			}
  		}
  	}
  	else {
  		if (changeFormatted != null && changeFormatted != "") {
  			if (changeFormatted == "0") {
  				color = "black";
  			}
  			else if (changeFormatted.indexOf('-') === -1) {
  				directionSymbol = "▲ ";
  				color = "green";
  			} 
  			else {
  				directionSymbol = "▼ ";
  				color = "red";
  			}
  		}
  	}
  						
  	if (changeFormatted != null && changepercFormatted != null && changeFormatted != "" && changepercFormatted != "") {
  		trend = directionSymbol + changeFormatted + " (" + changepercFormatted + ")";
  	} else {
  		color = "black";
  		trend = gs.getMessage("No score");
  	}
  			
  	paIndicatorRelation.trend = trend;
  	paIndicatorRelation.trend_color = color;
  	paIndicatorRelation.update();		
  },
  
  _getBreakdownForPAIndicator: function(paIndicator) {
  	var indicatorBreakdown = new GlideRecord("pa_indicator_breakdowns");
  	indicatorBreakdown.addQuery("indicator", paIndicator.pa_indicator);		
  	indicatorBreakdown.query();

  	var query = "";
  	if (indicatorBreakdown.hasNext()) {
  		indicatorBreakdown.next();
  		query="sys_idIN" + indicatorBreakdown.breakdown;
  		while (indicatorBreakdown.next())
  			query += "," + indicatorBreakdown.breakdown;
  		query += "^EQ";
  	}
  	else
  		query="sys_id=-1^EQ";
  	
  	return query;
  },

  type: 'GRCPAIndicatorUtilsBase'
};

Sys ID

02752811c303120044b2db1122d3ae17

Offical Documentation

Official Docs: