Name

sn_risk_advanced.RiskAdvancedHeatmapBase

Description

No description available

Script

var RiskAdvancedHeatmapBase = Class.create();
RiskAdvancedHeatmapBase.prototype = {
  initialize: function() {},

  getHeatmapFactor: function(assessmentType, dimension) {
      return this._getHeatmapFactor(assessmentType, dimension);
  },

  createHeatmapColorMatrix: function(assessmentType) {
      this._createHeatmapColorMatrix(assessmentType);
  },

  deleteOldHeatmapEntries: function(assessmentType) {
      this._deleteOldHeatmapEntries(assessmentType);
  },

  getAdvancedRiskHeatmapData: function(heatmapType, includeColor, ramID, encodedQuery, limit) {
      if (!gs.hasRole('sn_grc.reader') && !gs.hasRole('sn_risk.reader') && !gs.hasRole('sn_grc.business_user') && !gs.hasRole('sn_grc.business_user_lite'))
          return '';
      return this._getAdvancedRiskHeatmapData(heatmapType, includeColor, ramID, encodedQuery, limit);
  },

  getHeatmapRiskDetails: function(riskId, assessmentId) {
      return this._getHeatmapRiskDetails(riskId, assessmentId);
  },

  getAdvancedRiskHeatMapRisksInfo: function(assessmentsInfo, heatmapType) {
      return this._getAdvancedRiskHeatMapRisksInfo(assessmentsInfo, heatmapType);
  },

  getRiskCoordinateValues: function(heatmapType, assessmentId, viewType, limit) {
      if (viewType == "risk_movement") {
          return this._getRiskCoordinateValues(assessmentId);
      } else if (viewType == "risk_trend") {
          return this._getRiskTrendValues(heatmapType, assessmentId, limit);
      }
  },

  getFactorResponseValues: function(tableName, ramID, asmtType, asmtState, assessmentId, factorId) {
      return this._getFactorResponseValues(tableName, ramID, asmtType, asmtState, assessmentId, factorId);
  },

  getFactorTransformationInfo: function(assessmentId, asmtType, factorId) {
      return this._getFactorTransformationInfo(assessmentId, asmtType, factorId);
  },

  isChoiceFactor: function(factorId) {
      return this._isChoiceFactor(factorId);
  },

  validateHeatMapFactorValues: function(ramID, asmtID) {
      return this._validateHeatMapFactorValues(ramID, asmtID);
  },

  _validateHeatMapFactorValues: function(ramID, asmtID) {
      var inherentRecordInfo = this._getAssessmentRecordFactorValues(ramID, 'sn_risk_advanced_inherent_assessment', asmtID);
      var residualRecordInfo = this._getAssessmentRecordFactorValues(ramID, 'sn_risk_advanced_residual_assessment', asmtID);
      var targetRecordInfo = this._getAssessmentRecordFactorValues(ramID, 'sn_risk_advanced_target_assessment', asmtID);
      var flag = false;
      var msg = '';
      if (inherentRecordInfo.recordSysId != '' && residualRecordInfo.recordSysId != '' && targetRecordInfo.recordSysId != '') {
          if (this._compareFactors(inherentRecordInfo, residualRecordInfo) && this._compareFactors(residualRecordInfo, targetRecordInfo)) {
              flag = true;
          } else {
              msg = gs.getMessage("The inherent, residual and target factors configured in RAM are not the same.");
          }
      } else if (inherentRecordInfo.recordSysId != '' && residualRecordInfo.recordSysId != '') {
          if (this._compareFactors(inherentRecordInfo, residualRecordInfo)) {
              flag = true;
          } else {
              msg = gs.getMessage("The residual and inherent factors configured in RAM are not the same.");
          }
      } else if (inherentRecordInfo.recordSysId != '' && targetRecordInfo.recordSysId != '') {
          if (this._compareFactors(inherentRecordInfo, targetRecordInfo)) {
              flag = true;
          } else {
              msg = gs.getMessage("The inherent and target factors configured in RAM are not the same.");
          }
      } else if (residualRecordInfo.recordSysId != '' && targetRecordInfo.recordSysId != '') {
          if (this._compareFactors(residualRecordInfo, targetRecordInfo)) {
              flag = true;
          } else {
              msg = gs.getMessage("The residual and target factors configured in RAM are not the same.");
          }
      }
      var result = {
          flag: flag,
          message: msg
      };
      return result;
  },

  _compareFactors: function(info1, info2) {
      return (info1.xFactor == info2.xFactor) && (info1.yFactor == info2.yFactor);
  },

  _isChoiceFactor: function(factorId) {
      var userResponse = new GlideRecord('sn_risk_advanced_manual_factor');
      userResponse.get(factorId);
      return (userResponse.getValue('user_response') == 1);
  },

  _getFormatedDate: function(dateValue, format) {
      var glideDate = new GlideDateTime(dateValue);
      var myDate = glideDate.getDate();
      var formatDate = new GlideDate();
      formatDate.setValue(myDate);
      return formatDate.getByFormat(format).toString();
  },

  _getRamIdForRisk: function(assessmentId) {
      var ramIdvalue = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
      ramIdvalue.get(assessmentId);
      return ramIdvalue.getValue('risk_assessment_methodology');
  },

  _getAssessmentRecordsBasedOnFactors: function(ramID, assessmentId, heatmapType, xFactorId, yFactorId, xValues, yValues, limit) {
      var risk = '';
      var entity = '';
      var asmtType = '';
      var coordinateArray = [];
      var assessmentSysId = '';
      var assessmentState = '';
      var createdDate = '';
      var assessmentRecord = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
      assessmentRecord.get(assessmentId);
      if (heatmapType == 'inherent') {
          asmtType = '1';
      } else if (heatmapType == 'residual') {
          asmtType = '3';
      } else {
          asmtType = '4';
      }

      var assessmentRecordDetails = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
      assessmentRecordDetails.addQuery('risk', assessmentRecord.risk);
      assessmentRecordDetails.addQuery('entity_1', assessmentRecord.entity_1);
      assessmentRecordDetails.addQuery('risk_assessment_methodology.sys_id', ramID); //dot-walk gave the proper record values
      assessmentRecordDetails.addQuery('state', 'IN', '7,8');
      assessmentRecordDetails.orderByDesc('sys_created_on');
      if (heatmapType == 'inherent') {
          assessmentRecordDetails.addQuery('summary_inherent_risk', "!=", "");
      } else if (heatmapType == 'residual') {
          assessmentRecordDetails.addQuery('summary_residual_risk', "!=", "");
      } else {
          assessmentRecordDetails.addQuery('summary_target_risk', "!=", "");
      }
      if (gs.nil(limit)) {
          assessmentRecordDetails.setLimit(5);
      } else {
          assessmentRecordDetails.setLimit(limit);
      }

      assessmentRecordDetails.query();

      var appetiteUtils = new sn_risk_advanced.RiskAppetiteUtils();
      var appetiteStatusColorList = appetiteUtils.getAppetiteStatusColorsAndIconsWS();

      while (assessmentRecordDetails.next()) {
          var assessmentCoords = [];
          assessmentSysId = assessmentRecordDetails.getUniqueValue();
          assessmentState = assessmentRecordDetails.getValue('state');
          createdDate = assessmentRecordDetails.getDisplayValue('sys_created_on');
          var formatedDate = this._getFormatedDate(createdDate, "MMM''yy");
          var XFactorResponse = this._getFactorResponseValues('sn_risk_advanced_risk_assessment_instance_response', ramID, asmtType, assessmentState, assessmentSysId, xFactorId);

          var YFactorResponse = this._getFactorResponseValues('sn_risk_advanced_risk_assessment_instance_response', ramID, asmtType, assessmentState, assessmentSysId, yFactorId);

          var xFactorRating = this._getFactorTransformationInfo(assessmentSysId, asmtType, xFactorId, XFactorResponse);

          var yFactorRating = this._getFactorTransformationInfo(assessmentSysId, asmtType, yFactorId, YFactorResponse);

          assessmentCoords.push(xValues.indexOf(xFactorRating));
          assessmentCoords.push(yValues.indexOf(yFactorRating));
          assessmentCoords.push(formatedDate);



          var overallAppetiteStatus = assessmentRecordDetails.getValue("overall_appetite_status");
          if (!gs.nil(overallAppetiteStatus) && appetiteUtils.isRiskAppetiteEnabled()) {
              var iconConfiguration = appetiteStatusColorList[overallAppetiteStatus];
              assessmentCoords.push(iconConfiguration);
          }
          coordinateArray.push(assessmentCoords);

      }

      return coordinateArray;

  },

  _getAssessmentRecordsBasedOnMatrix: function(ramID, assessmentId, xValues, yValues, limit) {
      var xAxisValue = '';
      var yAxisValue = '';
      var risk = '';
      var entity = '';
      var coordinateArray = [];

      var residualRecordInfo = new GlideRecord('sn_risk_advanced_residual_assessment');
      residualRecordInfo.addQuery("risk_assessment_methodology", ramID);
      residualRecordInfo.query();
      while (residualRecordInfo.next()) {
          xAxisValue = residualRecordInfo.getValue('x_dimension');
          yAxisValue = residualRecordInfo.getValue('y_dimension');
      }

      var assessmentRecord = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
      assessmentRecord.get(assessmentId);

      var assessmentRecordDetails = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
      assessmentRecordDetails.addQuery('risk', assessmentRecord.risk);
      assessmentRecordDetails.addQuery('entity_1', assessmentRecord.entity_1);
      assessmentRecordDetails.addQuery('risk_assessment_methodology.sys_id', ramID);
      assessmentRecordDetails.orderByDesc('sys_created_on');
      assessmentRecordDetails.addQuery('summary_inherent_risk', "!=", "");
      assessmentRecordDetails.addQuery('summary_control_effectiveness', "!=", "");
      if (gs.nil(limit)) {
          assessmentRecordDetails.setLimit(5);
      } else {
          assessmentRecordDetails.setLimit(limit);
      }
      assessmentRecordDetails.query();

      while (assessmentRecordDetails.next()) {
          var assessmentCoords = [];
          var xFactorRatingValue = '';
          var yFactorRatingValue = '';


          if (xAxisValue == "inherent_risk") {

              xFactorRatingValue = assessmentRecordDetails.getValue('summary_inherent_risk');

              yFactorRatingValue = assessmentRecordDetails.getValue('summary_control_effectiveness');

              assessmentCoords = this._getAssessmentRecordDetails(assessmentRecordDetails, xFactorRatingValue, yFactorRatingValue, xValues, yValues);

              coordinateArray.push(assessmentCoords);

          } else {

              xFactorRatingValue = assessmentRecordDetails.getValue('summary_control_effectiveness');

              yFactorRatingValue = assessmentRecordDetails.getValue('summary_inherent_risk');

              assessmentCoords = this._getAssessmentRecordDetails(assessmentRecordDetails, xFactorRatingValue, yFactorRatingValue, xValues, yValues);

              coordinateArray.push(assessmentCoords);
          }
      }
      return coordinateArray;
  },

  _getAssessmentRecordDetails: function(assessmentRecordDetails, xfactorRatingValue, yFactorRatingValue, xValues, yValues) {
      var appetiteUtils = new sn_risk_advanced.RiskAppetiteUtils();
      var xFactorRating = '';
      var yFactorRating = '';
      var createdDate = '';
      var formatedDate = '';
      var assessmentCoords = [];
      var ratingCriteria = new GlideRecord('sn_risk_advanced_rating_criteria');
      ratingCriteria.get(xfactorRatingValue);
      xFactorRating = ratingCriteria.getValue('rating');

      ratingCriteria.get(yFactorRatingValue);
      yFactorRating = ratingCriteria.getValue('rating');

      createdDate = assessmentRecordDetails.getDisplayValue('sys_created_on');
      formatedDate = this._getFormatedDate(createdDate, "MMM''yy");
      assessmentCoords.push(xValues.indexOf(xFactorRating));
      assessmentCoords.push(yValues.indexOf(yFactorRating));
      assessmentCoords.push(formatedDate);

      var overallAppetiteStatus = assessmentRecordDetails.getValue("overall_appetite_status");
      var appetiteStatusColorList = new sn_risk_advanced.RiskAppetiteUtils().getAppetiteStatusColorsAndIconsWS();

      if (!gs.nil(overallAppetiteStatus) && appetiteUtils.isRiskAppetiteEnabled()) {
          var iconConfiguration = appetiteStatusColorList[overallAppetiteStatus];
          assessmentCoords.push(iconConfiguration);
      }

      return assessmentCoords;

  },

  _getAssessmentRecordFactorValues: function(ramID, className, asmtID) {
      var assessmentRecordSysId = '';
      var xFactorSysId = '';
      var yFactorSysId = '';
      var assessmentRecordInfo = {};
      var hasFactorResponses = true;

      if (className == "sn_risk_advanced_target_assessment") {
          var ramReference = new GlideRecord('sn_risk_advanced_risk_assessment_methodology');
          ramReference.get(ramID);
          if (!this._isTargetAssessmentEnabledFactorBased(ramReference, asmtID)) {
              hasFactorResponses = false;
          }
      }
      if (className == "sn_risk_advanced_residual_assessment" && this._checkIfResidualNotApplicable(asmtID)) {
          hasFactorResponses = false;
      }

      if (hasFactorResponses) {
          var assessmentType = new GlideRecord(className);
          assessmentType.addQuery("risk_assessment_methodology", ramID);
          assessmentType.query();
          if (assessmentType.next()) {

              assessmentRecordSysId = assessmentType.getUniqueValue();
              xFactorSysId = assessmentType.getValue('x_axis_factor');
              yFactorSysId = assessmentType.getValue('y_axis_factor');

          }
      }
      assessmentRecordInfo = {
          "recordSysId": assessmentRecordSysId,
          "xFactor": xFactorSysId,
          "yFactor": yFactorSysId
      };
      return assessmentRecordInfo;
  },

  _isTargetAssessmentEnabledFactorBased: function(ram, assessmentId) {
      if (ram.getValue('target_risk') == true) {
          var target = new GlideRecord("sn_risk_advanced_target_assessment");
          target.addQuery("risk_assessment_methodology", ram.getUniqueValue());
          target.query();
          if (target.next()) {
              if (target.state == '2') {
                  if (target.getValue("calculate_based_on") == "overall_assessment")
                      return false;
                  else {
                      var factorResponses = new GlideRecord("sn_risk_advanced_risk_assessment_instance_response");
                      factorResponses.addQuery("assessment_instance_id", assessmentId);
                      factorResponses.addQuery('assessment_type', 4);
                      factorResponses.setLimit(1);
                      factorResponses.query();
                      return factorResponses.hasNext();
                  }
              }
          }
      }
      return false;
  },

  _checkIfResidualNotApplicable: function(asmtID) {
      var asmt = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
      asmt.get(asmtID);
      return asmt.getValue("residual_risk_not_applicable") == true;
  },

  _getFactorResponseValues: function(tableName, ramID, asmtType, asmtState, assessmentId, factorId) {
      var factorResponseResult = '';
      var factorResponse = new GlideRecord(tableName);
      factorResponse.addQuery('assessment_instance_id.risk_assessment_methodology', ramID);
      factorResponse.addQuery('assessment_type', asmtType);
      factorResponse.addQuery('assessment_instance_id.state', asmtState);
      factorResponse.addQuery('assessment_instance_id', assessmentId);
      factorResponse.addQuery('factor.sys_id', factorId);
      factorResponse.query();
      while (factorResponse.next()) {
          factorResponseResult = factorResponse.getValue('factor_response');
      }
      return factorResponseResult;
  },


  _getFactorTransformationInfo: function(assessmentId, asmtType, factorId, factorResponse) {
      var value = '';
      var display_value = '';
      var riskRating = '';
      var criterias = [];
      var factorRating = '';
      var transformationCriteriaId = '';

      var factorResponseValue = new GlideRecord('sn_risk_advanced_risk_assessment_instance_response');
      factorResponseValue.addQuery('assessment_instance_id', assessmentId);
      factorResponseValue.addQuery('assessment_type', asmtType);
      factorResponseValue.addQuery('factor.sys_id', factorId);
      factorResponseValue.query();
      while (factorResponseValue.next()) {
          transformationCriteriaId = factorResponseValue.getValue(('transformation_criteria'));
      }

      var transformationCriteriaValue = new GlideRecord('sn_risk_advanced_transformation_criteria');
      transformationCriteriaValue.get(transformationCriteriaId);
      factorRating = transformationCriteriaValue.getValue('display_text');
      //validate factor type is choice
      var isFactorTypeChoice = this._isChoiceFactor(factorId);

      if (gs.nil(factorRating) && (isFactorTypeChoice == true)) {
          //Transformation criteria is empty,getting factor choices
          var choices = new GlideRecord('sn_risk_advanced_factor_choice');
          choices.addQuery('factor', factorId);
          choices.addQuery('score', factorResponse);
          choices.query();
          while (choices.next()) {
              factorRating = choices.getValue(('display_value'));
          }
      }

      return factorRating;
  },

  _getRiskTrendValues: function(heatmapType, assessmentId, limit) {
      var xFactorId = '';
      var yFactorId = '';
      var coordsArray = [];
      var assessmentArrayValues = [];

      var ramID = this._getRamIdForRisk(assessmentId);

      var xyCategories = this._getXYAxisForHeatmap(ramID, heatmapType);
      var xValues = xyCategories.xValuesArray.split(",");
      var yValues = xyCategories.yValuesArray.split(",");

      xFactorId = xyCategories.xFactorId;
      yFactorId = xyCategories.yFactorId;
      if (ramID == '' || assessmentId == '') {
          return coordsArray;
      }

      //If residual assessment is based on inherent and control then fetch assessments based on inherent and control rating
      if (heatmapType == "residual" && gs.nil(xFactorId) && (gs.nil(yFactorId))) {

          assessmentArrayValues = this._getAssessmentRecordsBasedOnMatrix(ramID, assessmentId, xValues, yValues, limit);

      } else {

          assessmentArrayValues = this._getAssessmentRecordsBasedOnFactors(ramID, assessmentId, heatmapType, xFactorId, yFactorId, xValues, yValues, limit);
      }
      assessmentArrayValues.reverse();
      return assessmentArrayValues;

  },

  _getRiskCoordinateValues: function(assessmentId) {
      var xFactorId = '';
      var yFactorId = '';
      var coordsArray = [];
      var inherentCoords = [];
      var residualCoords = [];
      var targetCoords = [];

      var ramID = this._getRamIdForRisk(assessmentId);
      var ram = new GlideRecord("sn_risk_advanced_risk_assessment_methodology");
      ram.get(ramID);
      var heatmapType = "inherent";
      if (!ram.inherent_risk)
          heatmapType = "residual";

      var xyCategories = this._getXYAxisForHeatmap(ramID, heatmapType);
      var xValues = xyCategories.xValuesArray.split(",");
      var yValues = xyCategories.yValuesArray.split(",");
      xFactorId = xyCategories.xFactorId;
      yFactorId = xyCategories.yFactorId;

      if (ramID == '' || assessmentId == '') {
          return coordsArray;
      }
      //Inherent Data
      if (ram.inherent_risk) {
          var inherentXFactorResponse = this._getFactorResponseValues('sn_risk_advanced_risk_assessment_instance_response', ramID, '1', '7', assessmentId, xFactorId);

          var inherentYFactorResponse = this._getFactorResponseValues('sn_risk_advanced_risk_assessment_instance_response', ramID, '1', '7', assessmentId, yFactorId);

          var xFactorRatingInherent = this._getFactorTransformationInfo(assessmentId, '1', xFactorId, inherentXFactorResponse);

          var yFactorRatingInherent = this._getFactorTransformationInfo(assessmentId, '1', yFactorId, inherentYFactorResponse);

          inherentCoords.push(xValues.indexOf(xFactorRatingInherent));
          inherentCoords.push(yValues.indexOf(yFactorRatingInherent));
          inherentCoords.push(gs.getMessage("Inherent"));
          coordsArray.push(inherentCoords);
      }
      //Residual data		
      if (ram.residual_risk && !this._checkIfResidualNotApplicable(assessmentId)) {
          var residualXFactorResponse = this._getFactorResponseValues('sn_risk_advanced_risk_assessment_instance_response', ramID, '3', '7', assessmentId, xFactorId);

          var residualYFactorResponse = this._getFactorResponseValues('sn_risk_advanced_risk_assessment_instance_response', ramID, '3', '7', assessmentId, yFactorId);

          var xFactorRatingResidual = this._getFactorTransformationInfo(assessmentId, '3', xFactorId, residualXFactorResponse);

          var yFactorRatingResidual = this._getFactorTransformationInfo(assessmentId, '3', yFactorId, residualYFactorResponse);

          residualCoords.push(xValues.indexOf(xFactorRatingResidual));
          residualCoords.push(yValues.indexOf(yFactorRatingResidual));
          residualCoords.push(gs.getMessage("Residual"));
          coordsArray.push(residualCoords);
      }
      //Target Data
      if (this._isTargetAssessmentEnabledFactorBased(ram, assessmentId)) {

          var targetXFactorResponse = this._getFactorResponseValues('sn_risk_advanced_risk_assessment_instance_response', ramID, '4', '7', assessmentId, xFactorId);

          var targetYFactorResponse = this._getFactorResponseValues('sn_risk_advanced_risk_assessment_instance_response', ramID, '4', '7', assessmentId, yFactorId);

          var xFactorRatingTarget = this._getFactorTransformationInfo(assessmentId, '4', xFactorId, targetXFactorResponse);

          var yFactorRatingTarget = this._getFactorTransformationInfo(assessmentId, '4', yFactorId, targetYFactorResponse);

          targetCoords.push(xValues.indexOf(xFactorRatingTarget));
          targetCoords.push(yValues.indexOf(yFactorRatingTarget));
          targetCoords.push(gs.getMessage("Target"));
          coordsArray.push(targetCoords);

      }

      return coordsArray;


  },

  _getAdvancedRiskHeatmapData: function(heatmapType, includeColor, ramID, encodedQuery, limit) {
      if (heatmapType == 'risk_movement') {
          var ram = new GlideRecord("sn_risk_advanced_risk_assessment_methodology");
          ram.get(ramID);
          heatmapType = "inherent";
          if (!ram.inherent_risk)
              heatmapType = "residual";
      }
      var heatmapObject = {};
      heatmapObject.xyCategories = this._getXYAxisForHeatmap(ramID, heatmapType);
      heatmapObject.data = this._getRiskHeatmapData(heatmapType, includeColor, ramID, encodedQuery, limit);
      return heatmapObject;
  },

  _getAdvancedRiskHeatMapRisksInfo: function(assessmentsInfo) {
      var risksInfo = {};
      var assessmentIds = Object.keys(assessmentsInfo);

      if (assessmentIds) {
          var assessment = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
          assessment.addQuery("sys_id", "IN", assessmentIds);
          assessment.query();
          var riskToAssessmentMapping = {};

          while (assessment.next()) {
              var ratingDetails = this._getRiskRatingDetails(assessment);
              var riskId = assessment.getValue("risk");
              riskToAssessmentMapping[riskId] = {
                  assessmentId: assessment.getUniqueValue(),
                  ratingDetails: ratingDetails,
                  overallAppetiteStatus: assessment.getValue("overall_appetite_status")
              };
          }
          var riskIds = Object.keys(riskToAssessmentMapping);
          var risks = new GlideRecord("sn_risk_risk");
          risks.addQuery("sys_id", "IN", riskIds);
          risks.query();

          var appetiteStatusColorList = new sn_risk_advanced.RiskAppetiteUtils().getAppetiteStatusColorsAndIconsWS();

          while (risks.next()) {
              var riskToAssessmentMap = riskToAssessmentMapping[risks.getUniqueValue()];
              var assessmentId = riskToAssessmentMap.assessmentId;
              var assessmentInfo = assessmentsInfo[assessmentId];
              var riskData = this._getBasicRiskInfo(risks);
              riskData.riskIndex = {
                  "label": riskData.indexNumber,
                  "size": "sm",
                  "level": "6",
                  "variant": 'teritiary'
              };
              riskData.assessmentId = assessmentId;
              riskData.color = assessmentInfo.color;
              riskData.x = assessmentInfo.x;
              riskData.y = assessmentInfo.y;
              riskData.ratingDetails = riskToAssessmentMap.ratingDetails;
              if (!gs.nil(riskToAssessmentMap.overallAppetiteStatus)) {
                  riskData.iconConfiguration = appetiteStatusColorList[riskToAssessmentMap.overallAppetiteStatus];
              }

              risksInfo[assessmentId] = riskData;
          }
      }

      return risksInfo;
  },

  _getBasicRiskInfo: function(risk) {
      var riskData = {};
      riskData.name = risk.getValue("name");
      riskData.sysId = risk.getUniqueValue();
      riskData.description = risk.getValue("description");
      riskData.indexNumber = risk.getValue("number");
      riskData.entity = risk.getDisplayValue("profile");
      riskData.owner = risk.getDisplayValue("owner");
      riskData.category = risk.getDisplayValue("category");
      riskData.labelValues = [{
              "label": gs.getMessage("Owner"),
              "value": {
                  "type": "string",
                  "value": riskData.owner
              }
          },
          {
              "label": gs.getMessage("Entity"),
              "value": {
                  "type": "string",
                  "value": riskData.entity,
                  "sysId": risk.getValue("profile")
              }
          },
          {
              "label": gs.getMessage("Category"),
              "value": {
                  "type": "string",
                  "value": riskData.category ? riskData.category : "-"
              }
          }
      ];
      return riskData;
  },

  _getHeatmapRiskDetails: function(riskId, assessmentId) {
      var riskInfo = {};
      var risk = new GlideRecord("sn_risk_risk");
      if (risk.get(riskId)) {
          riskInfo = this._getBasicRiskInfo(risk);
          var riskStatement = risk.getValue('statement');
          riskInfo.heirarchy = {};
          if (riskStatement) {
              riskInfo.heirarchy.data = new sn_grc_workspace.FetchHierarchyJSON().getHierarchyJSON('sn_risk_definition', riskStatement);
              riskInfo.heirarchy.hasHierarchy = true;
          } else {
              riskInfo.heirarchy.hasHierarchy = false;
          }
          riskInfo.riskTrackingLabelValues = this._getRiskTrackingInfo(riskId);
          var assessment = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
          if (assessment.get(assessmentId)) {
              riskInfo.ratingInfo = this._getRiskRatingDetails(assessment);
              riskInfo.responseInfo = this._getRiskResponseDetails(riskId, assessment);
          }
          riskInfo.riskAppetiteInfo = this._getRiskAppetiteDetails(riskId);
      }
      return riskInfo;
  },

  _getRiskAppetiteDetails: function(riskId) {
      var riskAppetiteInfo = new sn_risk_advanced.RiskAppetiteUtils()._getRiskAppetiteDetails(riskId);
      return riskAppetiteInfo;
  },

  _getRiskRatingDetails: function(assessment) {
      var inherentRating = assessment.getValue("summary_inherent_risk_score");
      var residualRating = assessment.getValue("summary_residual_risk_score");
      var targetRating = assessment.getValue("summary_target_risk_score");
      var inherentColor = "";
      var residualColor = "";
      var targetColor = "";
      var inherentBackgroundColor = "";
      var residualBackgroundColor = "";
      var targetBackgroundColor = "";
      var hasInherentRating = false;
      var hasResidualRating = false;
      var hasTargetRating = false;
      var riskColorStyle = "";
      if (inherentRating) {
          riskColorStyle = assessment.summary_inherent_risk.risk_color_style;
          inherentColor = riskColorStyle.background_color + "";
          inherentBackgroundColor = riskColorStyle.background_color_new + "";
          hasInherentRating = true;
      }

      if (residualRating) {
          riskColorStyle = assessment.summary_residual_risk.risk_color_style;
          residualColor = riskColorStyle.background_color + "";
          residualBackgroundColor = riskColorStyle.background_color_new + "";
          hasResidualRating = true;
      }

      if (targetRating) {
          riskColorStyle = assessment.summary_target_risk.risk_color_style;
          targetColor = riskColorStyle.background_color + "";
          targetBackgroundColor = riskColorStyle.background_color_new + "";
          hasTargetRating = true;
      }

      return {
          "inherent": {
              "hasRating": hasInherentRating,
              "rating": inherentRating,
              "color": inherentColor,
              "backgroundColor": inherentBackgroundColor
          },
          "residual": {
              "hasRating": hasResidualRating,
              "rating": residualRating,
              "color": residualColor,
              "backgroundColor": residualBackgroundColor
          },
          "target": {
              "hasRating": hasTargetRating,
              "rating": targetRating,
              "color": targetColor,
              "backgroundColor": targetBackgroundColor
          }
      };
  },

  _getRiskResponseDetails: function(riskId, assessment) {
      var responseInfo = {};
      responseInfo.hasResponseData = false;

      if (assessment.getValue("risk_response"))
          responseInfo.hasResponseData = true;

      var responseTask = new GlideRecord("sn_risk_response_task");
      responseTask.addQuery("risk_assessment_instance", assessment.getUniqueValue());
      responseTask.query();
      var responses = [];
      var responseStates = [];
      while (responseTask.next()) {
          responses.push({
              "type": "string",
              "value": this._getResponseName(responseTask.getValue("sys_class_name"))
          });

          responseStates.push({
              "type": "string",
              "value": responseTask.getDisplayValue("state")
          });
      }

      if (responseInfo.hasResponseData) {
          responseInfo.responses = [{
              "label": gs.getMessage("Risk response"),
              "value": responses
          }];

          responseInfo.responseStates = [{
              "label": gs.getMessage("Task status"),
              "value": responseStates
          }];
          responseInfo.query = "risk_assessment_instance=" + assessment.getUniqueValue();
      } else {
          responseInfo.data = [{
              "label": gs.getMessage("Risk response"),
              "value": gs.getMessage("Not applicable")
          }];
      }
      return responseInfo;
  },

  _getResponseName: function(responseType) {
      switch (responseType) {
          case "sn_risk_acceptance_task":
              return gs.getMessage("Accept");
          case "sn_risk_avoidance_task":
              return gs.getMessage("Avoid");
          case "sn_risk_mitigation_task":
              return gs.getMessage("Mitigate");
          case "sn_risk_transfer_task":
              return gs.getMessage("Transfer");
          default:
              return gs.getMessage("Risk response task");
      }
  },

  _getRiskTrackingInfo: function(riskId) {
      var openRiskEvents = 0;
      var openIssues = 0;
      var kriBreached = 0;
      var riskEventIds = [];

      var gr = new GlideRecord("sn_risk_advanced_m2m_event_risk");
      gr.addQuery("risk", riskId);
      gr.addQuery("risk_event.state", "NOT IN", "3,4");
      gr.query();
      while (gr.next()) {
          openRiskEvents++;
          riskEventIds.push(gr.getValue("risk_event"));
      }

      gr = new GlideAggregate("sn_grc_m2m_issue_item");
      gr.addQuery("sn_grc_item", riskId);
      gr.addQuery("sn_grc_issue.state", "NOT IN", "3,4");
      gr.addAggregate("COUNT");
      gr.query();

      if (gr.next()) {
          openIssues = gr.getAggregate("COUNT");
      }

      var query = "";
      if ((GlidePluginManager.isActive('sn_risk_advanced') || GlidePluginManager.isActive('com.sn_risk_advanced')) && (GlidePluginManager.isActive('com.sn_grc_metric') || GlidePluginManager.isActive('sn_grc_metric')) && gs.getProperty('sn_risk_advanced.migrate_to_metrics_from_indicators', false) == 'true') {
          gr = new GlideAggregate("sn_grc_metric_metric");
          gr.addEncodedQuery("active=true^metric_status=amber^ORmetric_status=red^riskIN" + riskId);
          gr.addAggregate("COUNT");
          gr.query();

          if (gr.next()) {
              kriBreached = gr.getAggregate("COUNT");
          }
          query = "active=true^metric_status=amber^ORmetric_status=red^riskIN" + riskId;
      } else {
          gr = new GlideAggregate("sn_grc_indicator");
          gr.addQuery("item", riskId);
          gr.addQuery("status", "2");
          gr.addAggregate("COUNT");
          gr.query();

          if (gr.next()) {
              kriBreached = gr.getAggregate("COUNT");
          }
          query = "item=" + riskId + "^status=2";
      }
      return {
          "kriBreached": {
              "value": kriBreached,
              "query": query

          },
          "openIssues": {
              "value": openIssues,
              "query": "sn_grc_item=" + riskId + "^sn_grc_issue.stateNOT IN3,4"
          },
          "openRiskEvents": {
              "value": openRiskEvents,
              "query": "sys_idIN" + riskEventIds
          }
      };
  },

  clearHeatmapConfigOnFactorDeletion: function(asmmtTypeFactorm2m) {
      this._clearHeatmapConfigOnFactorDeletion(asmmtTypeFactorm2m);
  },

  updateHeatmapFlag: function(asmtTypeFactorm2m) {
      this._updateHeatmapFlag(asmtTypeFactorm2m);
  },

  _updateHeatmapFlag: function(asmtTypeFactorm2m) {
      if (asmtTypeFactorm2m.sn_risk_advanced_assessment_type.sys_class_name == 'sn_risk_advanced_residual_assessment') {
          var residual = new GlideRecord('sn_risk_advanced_residual_assessment');
          residual.get(asmtTypeFactorm2m.sn_risk_advanced_assessment_type);
          if (residual.getValue('calculate_based_on') == 'inherent_control' || (residual.getValue('calculate_based_on') == 'factor_responses' && residual.getValue('factors_same_as_inherent') == true))
              return;
      }

      var m2m = new GlideAggregate('sn_risk_advanced_asmt_type_m2m_factor');
      m2m.addQuery('sn_risk_advanced_assessment_type', asmtTypeFactorm2m.sn_risk_advanced_assessment_type);
      m2m.addAggregate('COUNT');
      m2m.query();
      if (m2m.next()) {
          if (m2m.getAggregate('COUNT') < 2) {
              this._updateAssessmentType(asmtTypeFactorm2m.sn_risk_advanced_assessment_type, false);
          } else if (m2m.getAggregate('COUNT') == 2 && asmtTypeFactorm2m.operation() == 'insert') {
              this._updateAssessmentType(asmtTypeFactorm2m.sn_risk_advanced_assessment_type, true);
          }
      }
  },

  _updateAssessmentType: function(assessmentType, enableHeatmap) {
      var asmt = new GlideRecord('sn_risk_advanced_assessment_type');
      if (asmt.get(assessmentType)) {
          asmt.setValue('enable_heatmap', enableHeatmap);
          asmt.update();
      }
  },

  _clearHeatmapConfigOnFactorDeletion: function(asmmtTypeFactorm2m) {
      var assessmentType = new GlideRecord('sn_risk_advanced_assessment_type');
      var isExist = assessmentType.get(asmmtTypeFactorm2m.sn_risk_advanced_assessment_type);

      this._deleteOldHeatmapEntries(assessmentType);
      if (isExist) {
          if (assessmentType.x_axis_factor == asmmtTypeFactorm2m.sn_risk_advanced_factor) {
              assessmentType.x_axis_factor = '';
          } else if (assessmentType.y_axis_factor == asmmtTypeFactorm2m.sn_risk_advanced_factor) {
              assessmentType.y_axis_factor = '';
          }
          assessmentType.update();
      }
  },

  _createHeatmapColorMatrix: function(assessmentType) {
      this._deleteOldHeatmapEntries(assessmentType);
      var x_values = [],
          y_values = [];
      var sequence = 0;
      var color_matrix = new GlideRecord('sn_risk_advanced_heatmap_color_matrix');

      x_values = this._getFactorTransformationValues(assessmentType.x_axis_factor).criteriaValues;
      y_values = this._getFactorTransformationValues(assessmentType.y_axis_factor).criteriaValues;

      for (var i = 0; i < x_values.length; i++) {
          for (var j = 0; j < y_values.length; j++) {
              color_matrix.initialize();
              color_matrix.assessment_type = assessmentType.getUniqueValue();
              color_matrix.x_axis_factor_score = x_values[i];
              color_matrix.y_axis_factor_score = y_values[j];
              color_matrix.display_order = sequence++;
              color_matrix.insert();
          }
      }

  },

  _deleteOldHeatmapEntries: function(assessmentType) {
      var color_matrix = new GlideRecord('sn_risk_advanced_heatmap_color_matrix');
      color_matrix.get('assessment_type', assessmentType.getUniqueValue());
      color_matrix.deleteMultiple();
  },

  _getHeatmapFactor: function(assessmentType, dimension) {
      var factorList = [];
      var m2m = new GlideRecord('sn_risk_advanced_asmt_type_m2m_factor');
      m2m.addQuery('sn_risk_advanced_assessment_type', assessmentType.getUniqueValue());
      m2m.addQuery('sn_risk_advanced_factor.factor_contributionIN2,3');
      m2m.query();

      while (m2m.next()) {
          factorList.push(m2m.sn_risk_advanced_factor + '');
      }

      var factorString = '';

      if (factorList.length > 0) {

          var factor = new GlideRecord('sn_risk_advanced_factor');
          factor.addQuery('sys_id', 'IN', factorList);
          factor.addQuery('transform_score', 'true');
          factor.query();
          while (factor.next()) {
              factorString = factorString.concat(factor.getUniqueValue() + ',');
          }

          // choice factors are allowed to be selected even if no transformation criteria
          var manual_factor = new GlideRecord('sn_risk_advanced_manual_factor');
          manual_factor.addQuery('sys_id', 'IN', factorList);
          manual_factor.addQuery('transform_score', 'false');
          manual_factor.addQuery('user_response', '1');
          manual_factor.query();
          while (manual_factor.next()) {
              factorString = factorString.concat(manual_factor.getUniqueValue() + ',');
          }

          if (dimension == 'x_axis')
              return factorString.replace(current.y_axis_factor, '');
          else
              return factorString.replace(current.x_axis_factor, '');

      }
      return factorString;
  },

  _getRiskHeatmapXYAxisFromFactors: function(ramID, heatmapType) {
      var xyCats = {};
      var asmtTypeRecord, categories1 = [],
          categories2 = [],
          factorNames = [];
      if (heatmapType == 'inherent')
          asmtTypeRecord = new GlideRecord('sn_risk_advanced_inherent_assessment');
      else if (heatmapType == 'residual')
          asmtTypeRecord = new GlideRecord('sn_risk_advanced_residual_assessment');
      else
          asmtTypeRecord = new GlideRecord('sn_risk_advanced_target_assessment');
      asmtTypeRecord.get('risk_assessment_methodology', ramID);

      var xFactor = asmtTypeRecord.x_axis_factor;
      var yFactor = asmtTypeRecord.y_axis_factor;

      xyCats.xFactorName = asmtTypeRecord.x_axis_factor.name + '';
      xyCats.yFactorName = asmtTypeRecord.y_axis_factor.name + '';

      var criteriaData = this._getFactorTransformationValues(xFactor);
      xyCats.xValues = criteriaData.criteriaValues.join(',');
      xyCats.xValuesArray = criteriaData.criteriaInfo.join(',');

      criteriaData = this._getFactorTransformationValues(yFactor);
      xyCats.yValues = criteriaData.criteriaValues.join(',');
      xyCats.yValuesArray = criteriaData.criteriaInfo.join(',');

      xyCats.xFactorId = xFactor + '';
      xyCats.yFactorId = yFactor + '';
      return xyCats;
  },

  _getXYAxisForHeatmap: function(ramID, heatmapType) {
      var assessmentTypeRecord;
      if (heatmapType == 'inherent') {
          assessmentTypeRecord = this._getAssessmentTypeRecord(ramID, 'sn_risk_advanced_inherent_assessment');
          if (assessmentTypeRecord.getValue('enable_heatmap') == true) {
              return this._getRiskHeatmapXYAxisFromFactors(ramID, heatmapType);
          }
      } else if (heatmapType == 'residual') {
          assessmentTypeRecord = this._getAssessmentTypeRecord(ramID, 'sn_risk_advanced_residual_assessment');
          if (assessmentTypeRecord.getValue('enable_heatmap') == true) {
              if (assessmentTypeRecord.getValue('calculate_based_on') == 'factor_responses') {
                  return this._getRiskHeatmapXYAxisFromFactors(ramID, heatmapType);
              } else {
                  return this._getRiskHeatmapXYAxisFromMatrix(ramID, assessmentTypeRecord);
              }
          }
      } else if (heatmapType == 'target') {
          assessmentTypeRecord = this._getAssessmentTypeRecord(ramID, 'sn_risk_advanced_target_assessment');
          if (assessmentTypeRecord.getValue('enable_heatmap') == true) {
              return this._getRiskHeatmapXYAxisFromFactors(ramID, heatmapType);
          }
      }
  },

  _getRiskHeatmapXYAxisFromMatrix: function(ramID, residualAsmt) {
      var xyCats = {};
      var inherent_criteria = [],
          control_criteria = [],
          inherent_criteria_values = [],
          control_criteria_values = [];

      xyCats.xFactorName = residualAsmt.x_dimension.getDisplayValue() + '';
      xyCats.yFactorName = residualAsmt.y_dimension.getDisplayValue() + '';

      var inherentRatingCriteria = this._getRiskRatingCriteriaEntries(ramID, 'sn_risk_advanced_inherent_assessment', 'rating');

      inherent_criteria = inherentRatingCriteria.ratings.join(',');
      inherent_criteria_values = inherentRatingCriteria.ratingsValues.join(',');

      var controlRatingCriteria = this._getRiskRatingCriteriaEntries(ramID, 'sn_risk_advanced_control_assessment', 'rating');

      control_criteria = controlRatingCriteria.ratings.join(',');
      control_criteria_values = controlRatingCriteria.ratingsValues.join(',');

      if (residualAsmt.getValue('x_dimension') == 'inherent_risk') {
          xyCats.xValues = inherent_criteria;
          xyCats.xValuesArray = inherent_criteria_values;
          xyCats.yValues = control_criteria;
          xyCats.yValuesArray = control_criteria_values;

      } else {
          xyCats.xValues = control_criteria;
          xyCats.xValuesArray = control_criteria_values;
          xyCats.yValues = inherent_criteria;
          xyCats.yValuesArray = inherent_criteria_values;
      }
      return xyCats;
  },

  _getFactorTransformationValues: function(factorID) {

      var criteriaData = {
          criteriaValues: [],
          criteriaInfo: [],
      };
      var fransformationCriteria = new GlideRecord('sn_risk_advanced_transformation_criteria');
      fransformationCriteria.addQuery('factor', factorID);
      fransformationCriteria.orderBy('score');
      fransformationCriteria.query();
      if (fransformationCriteria.hasNext()) {
          while (fransformationCriteria.next()) {
              criteriaData.criteriaValues.push(fransformationCriteria.getDisplayValue('display_text'));
              criteriaData.criteriaInfo.push(fransformationCriteria.getValue('display_text'));
          }
      } else {
          var choices = new GlideRecord('sn_risk_advanced_factor_choice');
          choices.addQuery('factor', factorID);
          choices.orderBy('score');
          choices.query();
          while (choices.next()) {
              criteriaData.criteriaValues.push(choices.getDisplayValue('display_value'));
              criteriaData.criteriaInfo.push(choices.getValue('display_value'));
          }
      }

      return criteriaData;
  },

  _getDataUsingFactors: function(heatmapType, includeColor, ramID, encodedQuery, limit) {
      var riskData = [];
      var xFactor = '',
          yFactor = '';
      var xValues = [],
          yValues = [];
      var assessmentTypeRecord = '';
      var asmtType = '';
      var sysids = '';

      if (ramID == '') {
          return riskData;
      }

      if (heatmapType == 'inherent') {
          assessmentTypeRecord = new GlideRecord('sn_risk_advanced_inherent_assessment');
          asmtType = '1';
      } else if (heatmapType == 'residual') {
          assessmentTypeRecord = new GlideRecord('sn_risk_advanced_residual_assessment');
          asmtType = '3';
      } else if (heatmapType == 'target') {
          assessmentTypeRecord = new GlideRecord('sn_risk_advanced_target_assessment');
          asmtType = '4';
      }
      assessmentTypeRecord.get('risk_assessment_methodology', ramID);

      if (assessmentTypeRecord.getValue('enable_heatmap') != true) {
          return riskData;
      }

      xFactor = assessmentTypeRecord.x_axis_factor;
      yFactor = assessmentTypeRecord.y_axis_factor;
      var xFactorObject = this._getFactorTransformationSysIds(xFactor, 'score');
      var yFactorObject = this._getFactorTransformationSysIds(yFactor, 'score');
      xValues = xFactorObject.criterias;
      yValues = yFactorObject.criterias;

      var asmtArray = this._getAssessmentsWithQuery(encodedQuery, ramID, limit);
      var xInstances = [],
          yInstances = [];
      for (var i = 0; i < xValues.length; i++) {
          //xInstances = [];

          xInstances = this._getRiskAssessmentInstances(ramID, asmtType, xFactor, xValues[i], '', xFactorObject.responseType, encodedQuery, asmtArray);
          for (var j = 0; j < yValues.length; j++) {

              yInstances = [];
              if (xInstances.length > 0)
                  yInstances = this._getRiskAssessmentInstances(ramID, asmtType, yFactor, yValues[j], xInstances.join(','), yFactorObject.responseType, encodedQuery, asmtArray);

              var count = yInstances.length;
              var riskColor = this._getRiskColor(xValues[i], yValues[j], assessmentTypeRecord.getUniqueValue());
              var riskUrl = 'sn_risk_advanced_risk_assessment_instance_list.do?sysparm_query=sys_idIN' + yInstances.join();

              if (encodedQuery)
                  riskUrl += '%5E' + encodedQuery;
              if (includeColor)
                  riskData.push({
                      x: i,
                      y: j,
                      value: count,
                      color: riskColor.color,
                      tooltipHeading: riskColor.colorName,
                      url: riskUrl,
                      listOfSysIds: yInstances.join()
                  });
              else
                  riskData.push({
                      x: i,
                      y: j,
                      value: count,
                      url: riskUrl,
                      listOfSysIds: yInstances.join()
                  });
          }
      }

      return riskData;
  },

  _getAssessmentsWithQuery: function(query, ramId, limit) {
      var asmtArray = [];
      if (query || limit != -1) {
          var asmt = new GlideRecord('sn_risk_advanced_risk_assessment_instance');
          asmt.addQuery('risk_assessment_methodology', ramId);
          asmt.addQuery('state', '7');
          asmt.addEncodedQuery(query);
          if (limit != -1)
              asmt.setLimit(limit);
          asmt.query();
          while (asmt.next()) {
              asmtArray.push(asmt.getUniqueValue());
          }
      }
      return asmtArray;
  },

  _getRiskAssessmentInstances: function(ramID, asmtType, factorID, criteria, sysIDArray, responseType, encodedQuery, asmtArray) {
      //If there are no assessments with given encoded query no need to query responses further
      if (encodedQuery != "" && asmtArray.length == 0)
          return [];

      var asmtInstances = [];
      var responses = new GlideRecord('sn_risk_advanced_risk_assessment_instance_response');
      if (encodedQuery != '') {
          responses.addQuery('assessment_instance_id', 'IN', asmtArray);
      }
      responses.addQuery('assessment_instance_id.risk_assessment_methodology', ramID);
      responses.addQuery('assessment_type', asmtType);
      responses.addQuery('factor', factorID);
      responses.addQuery('assessment_instance_id.state', '7');
      if (responseType == 'transformationCriteria')
          responses.addQuery('transformation_criteria', criteria.sys_id);
      else
          responses.addQuery('factor_response', criteria.score);
      if (sysIDArray != '')
          responses.addQuery('assessment_instance_id', 'IN', sysIDArray);
      //adding this instead of addQuery because it is giving a garbage value sys_idNotValidnull instead of the actual query
      responses.addEncodedQuery('assessment_instance_id.risk_assessment_methodology.state=2');
      responses.query();

      while (responses.next()) {
          asmtInstances.push(responses.getValue('assessment_instance_id') + '');
      }
      return asmtInstances;
  },

  _getRiskHeatmapData: function(heatmapType, includeColor, ramID, encodedQuery, limit) {
      if (heatmapType == 'residual') {
          var residualRecord = this._getAssessmentTypeRecord(ramID, 'sn_risk_advanced_residual_assessment');
          if (residualRecord.getValue('enable_heatmap') == true) {
              if (residualRecord.getValue('calculate_based_on') == 'factor_responses')
                  return this._getDataUsingFactors(heatmapType, includeColor, ramID, encodedQuery, limit);
              else
                  return this._getDataUsingMatrix(encodedQuery, includeColor, residualRecord, ramID, limit);
          }
      } else {
          return this._getDataUsingFactors(heatmapType, includeColor, ramID, encodedQuery, limit);
      }
  },

  _getFactorTransformationSysIds: function(factorID, orderByColumn) {
      var criterias = [];
      var responseType = '';
      var value = '',
          display_value = '';
      var fransformationCriteria = new GlideRecord('sn_risk_advanced_transformation_criteria');
      fransformationCriteria.addQuery('factor', factorID);
      fransformationCriteria.orderBy(orderByColumn);
      fransformationCriteria.query();
      if (fransformationCriteria.hasNext()) {
          responseType = 'transformationCriteria';
          while (fransformationCriteria.next()) {
              value = fransformationCriteria.getUniqueValue() + '';
              display_value = fransformationCriteria.getValue('display_text');
              criterias.push({
                  sys_id: value,
                  display_text: display_value
              });
          }
      } else {
          //Choice factor with no transformation criteria
          responseType = 'choiceFactor';
          var choices = new GlideRecord('sn_risk_advanced_factor_choice');
          choices.addQuery('factor', factorID);
          choices.orderBy(orderByColumn);
          choices.query();
          while (choices.next()) {
              value = choices.getValue('score');
              display_value = choices.getValue('display_value');
              criterias.push({
                  score: value,
                  display_text: display_value
              });
          }
      }

      var response = {};
      response.responseType = responseType;
      response.criterias = criterias;

      return response;
  },

  _getRiskColor: function(xFactor, yFactor, asmtTypeSysID) {
      var colorSetting = new GlideRecord('sn_risk_advanced_heatmap_color_matrix');
      colorSetting.addQuery('assessment_type', asmtTypeSysID);
      colorSetting.addQuery('x_axis_factor_score', xFactor.display_text);
      colorSetting.addQuery('y_axis_factor_score', yFactor.display_text);
      colorSetting.setLimit(1);
      colorSetting.query();
      if (colorSetting.next()) {
          var colorDetails = {
              color: (colorSetting.risk_color_style.background_color + ''),
              colorName: (colorSetting.risk_color_style.color_style + '')
          };
          return colorDetails;
      }

      return {
          color: '#49A252'
      };
  },

  _getDataUsingMatrix: function(encodedQuery, includeColor, residualRecord, ramID, limit) {
      var riskData = [],
          sysids = [];
      var xCriteria = [],
          yCriteria = [];
      var matrixRecord;

      if (residualRecord.getValue('x_dimension') == 'inherent_risk') {
          xCriteria = this._getRiskRatingCriteriaEntries(ramID, 'sn_risk_advanced_inherent_assessment', 'sys_id').ratings;
          yCriteria = this._getRiskRatingCriteriaEntries(ramID, 'sn_risk_advanced_control_assessment', 'sys_id').ratings;
      } else {
          xCriteria = this._getRiskRatingCriteriaEntries(ramID, 'sn_risk_advanced_control_assessment', 'sys_id').ratings;
          yCriteria = this._getRiskRatingCriteriaEntries(ramID, 'sn_risk_advanced_inherent_assessment', 'sys_id').ratings;
      }

      var asmtArray = this._getAssessmentsWithQuery(encodedQuery, ramID, limit);
      for (var i = 0; i < xCriteria.length; i++) {
          for (var j = 0; j < yCriteria.length; j++) {
              matrixRecord = this._getMatrixRecord(xCriteria[i], yCriteria[j], residualRecord);
              sysids = this._getAssessmentCountForMatrix(ramID, residualRecord, xCriteria[i], yCriteria[j], encodedQuery, asmtArray);
              var count = sysids.length;
              var riskColor = matrixRecord.risk_color_style.background_color + '';
              var riskColorName = matrixRecord.risk_color_style.color_style + '';
              var riskUrl = 'sn_risk_advanced_risk_assessment_instance_list.do?sysparm_query=sys_idIN' + sysids.join();

              if (encodedQuery)
                  riskUrl += '%5E' + encodedQuery;
              if (includeColor)
                  riskData.push({
                      x: i,
                      y: j,
                      value: count,
                      color: riskColor,
                      tooltipHeading: riskColorName,
                      url: riskUrl,
                      listOfSysIds: sysids.join()
                  });
              else
                  riskData.push({
                      x: i,
                      y: j,
                      value: count,
                      url: riskUrl,
                      listOfSysIds: sysids.join()
                  });
          }
      }
      return riskData;
  },

  _getMatrixRecord: function(xRating, yRating, residualRecord) {
      var inherentRating, controlRating;
      if (residualRecord.getValue('x_dimension') == 'inherent_risk') {
          inherentRating = xRating;
          controlRating = yRating;
      } else {
          inherentRating = yRating;
          controlRating = xRating;
      }
      var matrix = new GlideRecord('sn_risk_advanced_residual_assessment_matrix');
      matrix.addQuery('sn_risk_advanced_assessment_type', residualRecord.getUniqueValue());
      matrix.addQuery('inherent_risk', inherentRating);
      matrix.addQuery('control_effectiveness', controlRating);
      matrix.query();
      matrix.next();
      return matrix;
  },

  _getAssessmentCountForMatrix: function(ramID, residualRecord, xRating, yRating, encodedQuery, asmtArray) {
      if (encodedQuery != '' && asmtArray.length == 0)
          return [];

      var sysIds = [];
      var instances = new GlideRecord('sn_risk_advanced_risk_assessment_instance');
      if (encodedQuery != '')
          instances.addQuery('sys_id', 'IN', asmtArray);
      instances.addQuery('risk_assessment_methodology', ramID);
      instances.addQuery('state', '7');
      if (residualRecord.getValue('x_dimension') == 'inherent_risk') {
          instances.addQuery('summary_inherent_risk', xRating);
          instances.addQuery('summary_control_effectiveness', yRating);
      } else {
          instances.addQuery('summary_inherent_risk', yRating);
          instances.addQuery('summary_control_effectiveness', xRating);
      }
      instances.query();
      while (instances.next()) {
          sysIds.push(instances.getUniqueValue() + '');
      }
      return sysIds;
  },

  _getAssessmentTypeRecord: function(ramID, className) {
      var assessmentType = new GlideRecord(className);
      assessmentType.addQuery('risk_assessment_methodology', ramID);
      assessmentType.addQuery('state', "2");
      assessmentType.query();
      assessmentType.next();
      return assessmentType;
  },

  _getRiskRatingCriteriaEntries: function(ramID, className, columnToGet) {
      return this._getRiskRatingCriteria(this._getAssessmentTypeRecord(ramID, className), columnToGet);
  },

  _getRiskRatingCriteria: function(assessmentType, columnToGet) {

      var ratingsData = {
          ratings: [],
          ratingsValues: []
      };
      var ratingCriteria = new GlideRecord('sn_risk_advanced_rating_criteria');
      ratingCriteria.addQuery('assessment_type', assessmentType.getUniqueValue());
      if (assessmentType.sys_class_name == 'sn_risk_advanced_inherent_assessment')
          ratingCriteria.orderBy('lower_interval');
      else
          ratingCriteria.orderByDesc('lower_interval');
      ratingCriteria.query();

      while (ratingCriteria.next()) {
          ratingsData.ratings.push(ratingCriteria.getDisplayValue(columnToGet));
          ratingsData.ratingsValues.push(ratingCriteria.getValue(columnToGet));
      }
      return ratingsData;
  },

  syncHeatmapColors: function(colorMatrixRecord) {
      this._syncHeatmapColors(colorMatrixRecord);
  },

  _syncHeatmapColors: function(colorMatrixRecord) {
      var residual = new GlideRecord('sn_risk_advanced_residual_assessment');
      var exists = residual.get('risk_assessment_methodology', colorMatrixRecord.assessment_type.risk_assessment_methodology);

      if (exists && residual.getValue('calculate_based_on') == 'factor_responses' && residual.getValue('factors_same_as_inherent') == true && residual.getValue('enable_heatmap') == true) {
          this._updateResidualColorMatrix(residual, colorMatrixRecord);
      }
  },

  copyHeatmapColors: function(toAsmtGr, fromAsmtType) {
      this._copyHeatmapColors(toAsmtGr, fromAsmtType);
  },

  _copyHeatmapColors: function(toAsmtGr, fromAsmtType) {
      var asmt = new GlideRecord(fromAsmtType);
      var exists = asmt.get('risk_assessment_methodology', toAsmtGr.risk_assessment_methodology);

      if (exists && asmt.getValue('enable_heatmap') == true) {
          if (this._isColorMatrixPresentForAssmt(toAsmtGr) == false)
              this._createHeatmapColorMatrix(toAsmtGr);

          var colorMatrix = new GlideRecord('sn_risk_advanced_heatmap_color_matrix');
          colorMatrix.addQuery('assessment_type', asmt.getUniqueValue());
          colorMatrix.query();
          while (colorMatrix.next()) {
              this._updateResidualColorMatrix(toAsmtGr, colorMatrix);
          }
      }
  },

  _updateResidualColorMatrix: function(toAsmtGr, colorMatrixRecord) {
      var colorMatrix = new GlideRecord('sn_risk_advanced_heatmap_color_matrix');
      colorMatrix.addQuery('assessment_type', toAsmtGr.getUniqueValue());
      colorMatrix.addQuery('x_axis_factor_score', colorMatrixRecord.x_axis_factor_score);
      colorMatrix.addQuery('y_axis_factor_score', colorMatrixRecord.y_axis_factor_score);
      colorMatrix.query();
      if (colorMatrix.next()) {
          colorMatrix.setValue('risk_color_style', colorMatrixRecord.risk_color_style);
          colorMatrix.update();
      }
  },

  _isColorMatrixPresentForAssmt: function(residualAsmt) {
      var colorMatrix = new GlideRecord('sn_risk_advanced_heatmap_color_matrix');
      colorMatrix.addQuery('assessment_type', residualAsmt.getUniqueValue());
      colorMatrix.setLimit(1);
      colorMatrix.query();

      return colorMatrix.hasNext();
  },

  type: 'RiskAdvancedHeatmapBase'
};

Sys ID

14b059c4535300105f9fddeeff7b1283

Offical Documentation

Official Docs: