Name

sn_hr_sp.HR_MLPortalUtilsSNC

Description

No description available

Script

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

  /* getRecommendedArticles : Fetches the topN similar Knowledge artciles for a task based on the Machine Learning predictions.The first time when task is loaded , a call is made to ML            prediction server to fetch the similar articles, these results are stored in ml_predictor_results table.Hence when the task is loaded from second time onwards the results are              fetched from ml_predictor_results table
  	Parameters: 1) taskId: SysId of the task
  				2) tableName: Name of the task table 
  				3) knowledgeBases : List of all knowledge bases supported by the portal in which the recommended articles are shown
  				4) solution : Solution name of the ML Solution definition
  				5) topN : Number of articles to be displayed
  */
  getRecommendedArticles: function(taskId, tableName, knowledgeBases, solution, topN) {
      var versioningEnabled = GlidePluginManager.isActive('com.snc.knowledge_advanced') && gs.getProperty("glide.knowman.versioning.enabled", "true") === "true";
      var knowledgeArticles = [];
      var count = 0;
      var UserProfileRecommendationUtil = new sn_hr_sp.UserRecommendationUtil();
      var articleDetails = {};
      var task = new GlideRecord(tableName);
      var results = {};
      var predictorResults = new GlideRecord("ml_predictor_results");
      var kbArticle = [];
      var predictedConfidenceTopNValue;
      var predictedConfidenceTopNList = [];
      var predictedOutputArray = [];
      var solutionGr = new GlideRecord('ml_solution');
      solutionGr.addQuery('solution_name', solution);
      solutionGr.addActiveQuery();
      solutionGr.setLimit(1);
      solutionGr.query();
      if (solutionGr.next()) {
          var thresholdLimit = solutionGr.threshold;
          if (task.get(taskId)) {
              predictorResults.addQuery('source_sys_id', taskId);
              predictorResults.addQuery('solution', solutionGr.getUniqueValue());
              predictorResults.orderByDesc('sys_created_on');
              predictorResults.setLimit(1);
              predictorResults.query();
              if (predictorResults.next()) {
                  if (predictorResults.predicted_confidence < thresholdLimit)
                      return null;
                  predictedConfidenceTopNValue = predictorResults.predicted_confidence_topn;
                  predictedConfidenceTopNList = predictedConfidenceTopNValue.split(',');
                  results = predictorResults.predicted_output_value;
                  predictedOutputArray = results.split(",");
                  for (var i = 0; i < predictedConfidenceTopNList.length; i++) {
                      if (predictedConfidenceTopNList[i] < thresholdLimit)
                          break;
                      kbArticle.push(predictedOutputArray[i]);
                  }
              } else if (tableName == "sn_ca_campaign_item") {
  				try {
                      var mlSolution = sn_ml.MLSolutionFactory.getSolution(solution);
  					var inputs = [{"short_description": String(task.content.title)}];
                      var options = {};
                      options.top_n = topN;
                      options.apply_threshold = true;
                      results = mlSolution.predict(inputs, options);
                      if (gs.nil(results))
                          return null;
                      var resultsJson = JSON.parse(results);
                  } catch (e) {
                      gs.error(e);
                      return null;
                  }
  				if (resultsJson) {
  					for(var o in resultsJson) {
  						for(var i in resultsJson[o]) {
  							kbArticle.push(resultsJson[o][i].predictedValue); 
  						}
  					}
  				}
  			} 
  			else {
                  try {
                      var mlSolution = sn_ml.SimilaritySolutionStore.get(solution);
                      var options = {};
                      options.top_n = topN;
  					options.mluc = 'MLUC-HR-00005';
                      options.apply_threshold = true;
                      results = mlSolution.getActiveVersion().predict(task, options);
                      if (gs.nil(results))
                          return null;
                      var resultsJson = JSON.parse(results);
                  } catch (e) {
                      gs.error(e);
                      return null;
                  }

                  predictedOutputArray = resultsJson[taskId];
  				if(!gs.nil(predictedOutputArray)) {
                  for (var j = 0; j < predictedOutputArray.length; j++)
                      kbArticle.push(predictedOutputArray[j].predictedValue);
  				}
              }
  			if (gs.nil(kbArticle))
                      return null;
              for (var j = 0; j < kbArticle.length; j++) {
                  articleDetails = {};
                  articleDetails = UserProfileRecommendationUtil.checkAndReturnAccessibleArticle(kbArticle[j], knowledgeBases, versioningEnabled);
                  if (!gs.nil(articleDetails)) {
                      knowledgeArticles.push(articleDetails);
                      ++count;
                      if (count == topN)
                          break;
                  }
              }
  			return knowledgeArticles;
          } else {
              gs.error(" Specified Task does not exist ");
              return null;
          }
      } else {
          gs.error("Solution GlideRecord does not exist, please train the solution definition.");
          return null;
      }

  },

  /* getSimilarUsers : To get the list of similar users for the logged in user based on similar HR profiles
  	Parameters: 1) userId: userId of the logged in user
  				2) topN: gets the topN similar users
  */
  getSimilarUsers: function(userId, topN) {
      var similarUsers = [];
      var profiles = this.getSimilarProfiles(userId, topN);
      if (!gs.nil(profiles)) {
          var userProfile = new GlideRecord('sn_hr_core_profile');
          for (var i = 0; i < profiles.length; i++) {
              if (userProfile.get(profiles[i]))
                  similarUsers.push(userProfile.getValue('user'));
          }
      }
      return similarUsers;
  },

  /* getSimilarProfiles:Gets the similar HR profiles of the logged in user.The first time when user is logged in , a call is made to ML prediction server to fetch the similar profiles,          these results are stored in ml_predictor_results table.Hence when the user is logged in from second time onwards results are fetched from ml_predictor_results table
  	Parameters: 1) userId: userId of the logged in user
  				2) topN: gets the topN similar HR Profiles
  */

  getSimilarProfiles: function(userId, topN) {
      var predictedConfidenceTopNValue;
      var predictedConfidenceTopNList = [];
      var predictedOutputArray = [];
      var similarProfiles = [];
      var results = {};
      var currentDomain;
      var user = new GlideRecord('sys_user');
      if (user.get(userId))
          currentDomain = user.sys_domain;

      var profile = new GlideRecord('sn_hr_core_profile');
      profile.addQuery('user', userId);
      profile.setLimit(1);
      profile.query();
      if (profile.next()) {
          /*Get the solution definition from HR AI Configuration */
          var config = this.fetchHRAiConfig('similar_users', currentDomain);
          if (!config.next()) {
              config = this.fetchHRAiConfig('similar_users', 'global');
              if (!config.next())
                  return;
          }
          if (config.solution_capability_definition.active) {
              var solution = config.solution_capability_definition.solution_name;
              var solutionGr = new GlideRecord('ml_solution');
              solutionGr.addQuery('solution_name', solution);
              solutionGr.addActiveQuery();
              solutionGr.setLimit(1);
              solutionGr.query();
              if (solutionGr.next()) {
                  var thresholdLimit = solutionGr.threshold;
                  var predictorResults = new GlideRecord('ml_predictor_results');
                  predictorResults.addQuery('source_sys_id', profile.getUniqueValue());
                  predictorResults.addQuery('solution', solutionGr.getUniqueValue());
                  predictorResults.orderByDesc('sys_created_on');
                  predictorResults.setLimit(1);
                  predictorResults.query();
                  if (predictorResults.next()) {
  					/* If the predicted confidence of the  ML result is less than the threshold limit set for the solution return null*/
                      if (predictorResults.predicted_confidence < thresholdLimit)
                          return null;
                      /*If ML Predictor table has the latest solution only then query the ML predictor else repredict the value for the latest results */
                      if (predictorResults.solution.version == config.solution_capability_definition.current_solution_version) {
                          predictedConfidenceTopNValue = predictorResults.predicted_confidence_topn;
                          predictedConfidenceTopNList = predictedConfidenceTopNValue.split(',');
                          results = predictorResults.predicted_output_value;
                          predictedOutputArray = results.split(",");
                          for (var i = 0; i < predictedConfidenceTopNList.length; i++) {
                              if (predictedConfidenceTopNList[i] < thresholdLimit)
                                  break;
                              similarProfiles.push(predictedOutputArray[i]);
                          }
                          return similarProfiles;
                      } else {
                          return this.predictSimilarProfiles(profile, solution, topN);
                      }
                  } else {
                      return this.predictSimilarProfiles(profile, solution, topN);
                  }
              } else {
                  gs.error("Solution GlideRecord does not exist, please train the solution definition.");
                  return null;
              }
          } else {
              gs.error("Please provide a solution defintion for similar users in the HR AI Configuration");
              return null;
          }
      } else
          return null;

  },
  
  /* predictSimilarProfiles: Returns the similar profiles of a HR Profile based on ML prediction 
  	Parameters: 1) profile: HR Profile Record for which the similar records need to be fetched
  				2) solution : Name of the solution of the corresponding ML solution definition defined for fetching similar HR Profiles
  				2) topN: gets the topN similar profiles
  */
  		
  predictSimilarProfiles: function(profile, solution, topN) {
      var mlSolution = sn_ml.SimilaritySolutionStore.get(solution);
      var similarProfiles = [];
      var results = {};
      try {
          var options = {};
  		options.mluc = "MLUC-HR-00007";
          if (gs.nil(topN))
              options.top_n = 25;
          else
              options.top_n = topN;
          options.apply_threshold = true;

          results = mlSolution.getActiveVersion().predict(profile, options);
          var resultsJson = JSON.parse(results);

      } catch (e) {
          gs.error(e);
          return null;
      }
      var pedictedResults = resultsJson[profile.getUniqueValue()];
  	if(!gs.nil(pedictedResults)) {
      for (var i = 0; i < pedictedResults.length; i++)
          similarProfiles.push(pedictedResults[i].predictedValue);
  	}

      return similarProfiles;
  },
  /* fetchHRAiConfig : Returns the HR AI Configuration Record for the use case specified based on domain 
  	Parmenters: 1) useCase : Use Case specified in HR AI Confoguration table 
  				2) domain : Current domain of the user 
  */
  
  fetchHRAiConfig: function(useCase, domain) {
      try {
          var hrAIConfiguration = new GlideRecord('sn_hr_core_ai_configuration');
          hrAIConfiguration.addQuery('use_case', useCase);
          hrAIConfiguration.addQuery('sys_domain', domain);
          hrAIConfiguration.setLimit(1);
          hrAIConfiguration.query();
          return hrAIConfiguration;
      } catch (err) {
          gs.error('Error in fetching HR AI configuration: ' + err.toString());
      }
  },

  type: 'HR_MLPortalUtilsSNC'
};

Sys ID

c2affdd2db1b00101e2ef9741d9619e4

Offical Documentation

Official Docs: