Name

sn_chg_score.ChangeSuccessGroupScoreSNC

Description

Provides functions that can be used to retreive Change success score data and associated metrics for a group. To modify behavior, use the provided ChangeSuccessGroupScore extension to override functions defined within this script include.

Script

var ChangeSuccessGroupScoreSNC = Class.create();

ChangeSuccessGroupScoreSNC.prototype = {
  initialize: function(groupId) {
  	this.NO_RATING_MSG = gs.getMessage("No rating found");
  	this.NO_RATING_COLOR = "#E6E8EA";

  	this.groupId = groupId || null;
  	this.groupGr = this._getGroup();
  	this.checkSecurity = true;
  	
  	this.changeSuccessScoreUtils = new sn_chg_score.ChangeSuccessScoreUtils();
  },

  setWithSecurity: function(trueOrFalse) {
  	this.checkSecurity = this.changeSuccessScoreUtils.isTrue(trueOrFalse);
  	
  	return this;
  },

  getScoreAndIndicators: function() {
      var scoreDetails = this.getSuccessScoreData();
      if (scoreDetails === null)
          return scoreDetails;

  	var ratingGr = this._getRating(scoreDetails.score);
  	if (ratingGr) {
  		scoreDetails.displayValue = ratingGr.getDisplayValue();
  		scoreDetails.backgroundColor = ratingGr.getValue("color");
  	} else {
  		scoreDetails.displayValue = this.NO_RATING_MSG;
  		scoreDetails.backgroundColor = this.COLOR;
  	}

  	scoreDetails.metrics = this.getChangeSuccessIndicatorData();

  	return scoreDetails;
  },

  getSuccessScoreData: function() {
  	var scoreData = {"canRead": true};

      if (this.groupGr === null || (this.checkSecurity && !this.groupGr.canRead())) {
  		scoreData.canRead = false;
  		return scoreData;
  	}

  	scoreData.hasScore = false;
  	var scoreResult = this._getBreakdownScore(this.changeSuccessScoreUtils.PA_CHANGE_SUCCESS_SCORE_INDICATOR_ID,
  		this.changeSuccessScoreUtils.PA_CHANGE_SCORE_GROUP_BREAKDOWN_ID,
  		this.groupId);
  
  	if (!scoreResult)
  		return scoreData;
  	
      scoreData.score = scoreResult.value;
  	scoreData.scoreFormatted = scoreResult.value_formatted;
  	scoreData.delta = gs.nil(scoreResult.change) ? "0" : scoreResult.change;
  	scoreData.deltaFormatted = scoreResult.change_formatted;
  	scoreData.hasScore = !global.ChangeCommon.isNil(scoreData.score);

      return scoreData;
  },
  
  getChangeSuccessIndicatorData: function() {
      var changeSuccessIndicatorData = [];

  	if (this.groupId === null)
          return changeSuccessIndicatorData;
  	
      var paIndicatorTagGr = new GlideRecord("pa_m2m_indicator_tags");
      paIndicatorTagGr.addQuery("tag", this.changeSuccessScoreUtils.PA_CHANGE_SCORE_INDICATOR_GROUP_ID);
  	paIndicatorTagGr.orderBy("order");
      paIndicatorTagGr.query();

      while (paIndicatorTagGr.next()) {
  		var scoreResult = this._getBreakdownScore(paIndicatorTagGr.getValue("indicator"),
  			this.changeSuccessScoreUtils.PA_CHANGE_SCORE_GROUP_BREAKDOWN_ID,
  			this.groupId, new global.ChangeSuccessScoreGlobalUtils().getIndicatorScoresDomain());
  		
  		if (!scoreResult)
  			continue;

  		var data = {};
  		data.name = scoreResult.indicator.display_value;
  		data.value = scoreResult.value;
  		data.valueFormatted = scoreResult.value_formatted;
  		data.delta = gs.nil(scoreResult.change) ? "0" : scoreResult.change;
  		data.deltaFormatted = scoreResult.change_formatted;

  		changeSuccessIndicatorData.push(data);
      }

  	return changeSuccessIndicatorData;
  },

  _getBreakdownScore: function(indicatorId, breakdownId, breakdownValue, domain) {
      if (!indicatorId || !breakdownId || !breakdownValue)
          return null;

      var scorecard = new PAScorecard();
  	scorecard.addParam("sysparm_display", "all");
  	scorecard.addParam("uuid", indicatorId + ":" + breakdownId + ":" + breakdownValue + (domain ? ";" + domain : ""));
  	
  	var scoreResults = scorecard.query();
      if (!scoreResults || scoreResults.length === 0)
          return null;

  	return scoreResults[0];
  },

  _getRating: function(score) {
  	if (!score || isNaN(score))
  		return null;

  	var ratingGr = new GlideRecord(this.changeSuccessScoreUtils.CHG_SUCCESS_SCORE_RATING);
  	ratingGr.addActiveQuery();
  	ratingGr.addQuery("score_start", "<=", score);
  	ratingGr.addQuery("score_end", ">=", score);		
  	ratingGr.orderBy("score_start");
  	ratingGr.query();

  	while (ratingGr.next())
  		if (score <= ratingGr.getValue("score_end"))
  			return ratingGr;

  	return null;
  },

  _getGroup: function() {
  	var groupGr = new GlideRecord("sys_user_group");
  	if (!groupGr.get(this.groupId))
  		return null;
  	
  	return groupGr;
  },
  
  type: 'ChangeSuccessGroupScoreSNC'
};

Sys ID

698c93f973405010491d235f04f6a72e

Offical Documentation

Official Docs: