Name

sn_ads_setup.SNHelpSetupUtil

Description

No description available

Script

var SNHelpSetupUtil = Class.create();
SNHelpSetupUtil.prototype = {
  
  initialize: function() {

  	this.constants = new SNHelpSetupConstantProvider();
  	this.actions = ["next", "prev", "skip", "submitted", "closed", "started", "completed", "retake"];
  	this.pluginCategory = null;
  	this.pluginTasks = null;
  },
  
  getDependencies : function(step_id) {
  	var dependencies = this.getM2Mdependencies(step_id);
  	var result = [];
  	
  	if (!dependencies) 
  		return null;
  	
  	if(Array.isArray(dependencies) && dependencies.length > 0) {
  		var self = this;
  		dependencies.forEach(function(dependency){
  			result.push(self.getAllDependecies(dependency.setup_dependency));
  		});
  	}
  	return result;
  },
  
  getM2Mdependencies : function(step_id){
  	var dbController = new global.SNHelpDBController(this.constants.tables.m2m_step_dependency);
  	var dependencies =  dbController.getByEncodedQuery("guidance_step=" + step_id, null, ["sys_id", "setup_dependency"]);
  	
  	return dependencies ? dependencies : null;
  },
  
  // @param - sys_id of setup_dependency table
  getAllDependecies: function(sys_id) {
  	var dbController = new global.SNHelpDBController(this.constants.tables.setup_dependency);
  	return dbController.getById(sys_id, ["sys_id", "dependent_on_plugins","dependent_on_store_apps","dependent_on_steps", "name"]);
  },
  
  isStepDependent : function(step_id) {
  	var dependencies = this.getM2Mdependencies(step_id);
  	
  	if(!dependencies || (Array.isArray(dependencies) && dependencies.length === 0))
  		return false;
  	
  	return true;
  },
  
  
  isStepLocked : function(step_id, interactionId) {
  	var dependencies = this.getDependencies(step_id);
  	var length;
  	if(!dependencies || (Array.isArray(dependencies) && dependencies.length === 0))
  		return false;
  	
  	length = dependencies.length;
  	
  	for(var i = 0; i < length; i++) {
  		if (this.isAllPluginsActive(dependencies[i].dependent_on_plugins) &&
  			this.isAllStoreAppsActive(dependencies[i].dependent_on_store_apps) && 
  			this.isAllStepsCompleted(dependencies[i].dependent_on_steps, interactionId))
  				continue;
  		
  		return true;
  	}
  	return false;
  },
  
  isAllPluginsActive : function(dependentPlugins) {
  	var pgMgr;
  	
  	if(!dependentPlugins)
  		return true;
  	
  	dependentPlugins = dependentPlugins.split(",");
  	pgMgr = new GlidePluginManager();
  	
  	for(var i = 0; i < dependentPlugins.length; i++)
  		if(!pgMgr.isActive(dependentPlugins[i]))
  			return false;
  	
  	return true;
  },
  
  isAllStoreAppsActive : function(dependentStoreApps) {
  	var dbController;
  	
  	if(!dependentStoreApps)
  		return true;
  	
  	dbController =  new global.SNHelpDBController("sys_store_app");
  	
  	dependentStoreApps = dependentStoreApps.split(",");
  	
  	for(var i = 0; i < dependentStoreApps.length; i++)
  		if(!this.isStoreAppActive(dependentStoreApps[i]))
  			return false;
  	
  	return true;
  },
  
  //Revisit: check if there is a best way to check if an application is active
  isStoreAppActive : function(sys_id) {
  	var dbController =  new global.SNHelpDBController("sys_store_app");
  	var result = dbController.getById(sys_id, ["active"]);
  	if(result.active === "true")
  		return true;
  	
  	return false;
  },
  
  //Assumption : There exists only one interaction per user for personal setup and one per system for global setup
  isAllStepsCompleted : function(dependentSteps, interactionId) {
  	var dbController,
  		stepInteraction;
  	//If there is no steps return true
  	if(!dependentSteps)
  		return true;
  	
  	// If there is no interaction created, return false
  	if(!interactionId) 
  		return false;
  	
  	dbController =  new global.SNHelpDBController(this.constants.tables.user_interaction_step);
  	
  	stepInteraction = dbController.getByEncodedQuery("stepIN" + dependentSteps, null, ["status"]);
  	dependentSteps = dependentSteps.split(",");
  	
  	if(!stepInteraction ||dependentSteps.length !==  stepInteraction.length)
  		return false;
  	
  	for(var i = 0; i < stepInteraction.length; i++) 
  		if(stepInteraction[i].status != "completed")
  			return false;
  	
  	return true;
  },
  
  getDate: function(utc){
  	var gdt = new GlideDateTime(utc);
  	return  gdt.getDate().getDisplayValue(); 
  },

  /**
  * adjust step order on step delete
  * @param {string} field - field to query step table
  * @param {string} value - value to query step table again field
  * @param {object} current - current gliderecord for current step
  */
  adjustOrder: function(field, value, current) {
      // orphan record - Dont do anything (setup or category deleted)
      if (!current[field].getRefRecord().isValidRecord())
          return;

      var table = current.getRecordClassName();
      var gr = new GlideRecord(table);

      gr.addQuery(field, value);

  	if (field === 'guidance')
          gr.addNullQuery("parent");

      gr.addQuery("order", ">=", current.order);
      gr.orderBy("order");
      gr.query();

      while (gr.next()) {
          // There exist another step with same order - don't do anything
          if (gr.order == current.order)
              return;
          // Adjust the order to accommodate deleted step order.
          else if (gr.order > 0) {
              gr.order = gr.order - 1;
              gr.update();
          }
      }
  },
  /*
    Builder - Utility method to set the status of the parent. 
    @param stepId
    @param status
    @return glide update  
  */
  
  setStepStatus:function(stepId, status){
  	var gr = new GlideRecord(this.constants.tables.guidance_step);
  	gr.addEncodedQuery('sys_id='+stepId);
  	gr.query();
  	if(gr.next()){
  		gr.setValue('status', status);
  		return gr.update();
  	}
  	return; 
  },
  
  /*
    Builder - Utility method to see all the taks in the parent are completed or not. 
    @param parentId
    @return true/false
  */
  isAllTasksCompleted: function(parentId){
  	var gr, isTasksCompleted = true, 
  		query = 'parent='+parentId;
  	
  	
  	
  	gr = new GlideRecord(this.constants.tables.guidance_step);
  	gr.addEncodedQuery(query);
  	gr.query();
  	
  	//No chlild Taks return false
  	if(!gr.hasNext())
  		return false; 
  	
  	while(gr.next()){
  		if(gr.status.toString() != '0')
  			return false; //Ensure all tasks are configured
  	}
  	return isTasksCompleted;
  },
  
  /*
  	Get m2m dependencies whose dependent steps are matchted to given step id. 
  	@param stepId 
  	@return array of m2m dependnecies  
  */
  
  getDependentSteps: function(stepId){
  	var dbController; 
  	dbController = new global.SNHelpDBController(this.constants.tables.m2m_step_dependency);
  	return dbController.getByEncodedQuery("setup_dependency.dependent_on_stepsLIKE"+stepId, null, ['sys_id', 'guidance_step']);
  },
  
  /*
      @param string step id's 
  	@param stepIds 
  	@param taskKeys keys that needs to be extracted from step (id, name, order)
  	@return array matched steps from the given step id's 
  */
  
  getMatchedtasks : function(stepArray, stepIds, taskKeys){
  	var matchedSteps =[], results=[], result, arrayUtil = new global.ArrayUtil();
  	
  	if(!stepIds)
  		return [];
  	stepIds = stepIds.split(",");
  	stepArray.forEach(function(step){
  		if(arrayUtil.contains(stepIds, step.id))
  			matchedSteps.push(step);
  	});
  	
  	matchedSteps.forEach(function(step){
  		if(Array.isArray(taskKeys) && taskKeys.length > 0){
  			result = {};
  			taskKeys.forEach(function(taskKey){
  				result[taskKey] = step[taskKey];
  			});
  		}
  		results.push(result);
  	});
  	
  	return results; 
  },
  
  isValidAction: function(action) {
  	var arrayUtil = new global.ArrayUtil();
  	return arrayUtil.contains(this.actions, action);
  },
  /**
  * Check if the given setup has a plugin category
  * @param {setupId} - Setup sys_id to find plugin category
  * @returns {sys_id} - install plugin category sys_id
  */
  hasPluginStep: function(setupId) {
  	var result = null;
  	var gr = new GlideRecord("help_content");
  	gr.addQuery("guidance_step.guidance", setupId);
  	gr.addQuery("configuration_types", "install_plugin");
  	gr.query();

  	result = gr.next() && gr.guidance_step.parent;

  	return  result ? result : null;
  },
  
  
  /*
      @param arrray tasks
  	@param array stepsPayload 
  	@return array tasks with dependencies and dependents required format  {"id","name","parent", "order"} 
  */
  
  getMatchedDependencies: function(tasksPayload, stepsPayload){
  	var results = [], self = this, steps, dependentsObj = []; 
  	
  	if(!Array.isArray(tasksPayload) || !Array.isArray(stepsPayload))
  		return null; 
  	
  	steps = tasksPayload.concat(stepsPayload);
  	
  	tasksPayload.forEach(function(task){
  		if(Array.isArray(task.dependencies) && task.dependencies.length > 0){
  			task.dependenciesObj = self.getMatchedtasks(steps, task.dependencies[0].dependent_on_steps, self.constants.restAPIKeys.dependencies);
  			task.dependencies = [];
  			task.dependenciesObj.forEach(function(dependencyKey){
  				task.dependencies.push(dependencyKey.name); 
  			});
  			
  		}
  		if(Array.isArray(task.dependents) && task.dependents.length >0){
  			dependentsObj = []; 
  			task.dependents.forEach(function(dependent){
  				dependentsObj.push(dependent.guidance_step);
  			});
  			
  			task.dependents = self.getMatchedtasks(steps, dependentsObj.toString(), self.constants.restAPIKeys.dependencies);
  		}
  	});
  	
  	return tasksPayload;
  },
  
  
  /*
      @param sys_id of the parent 
  	@param task type 
  	@return true/ false - Returns if the category has childern or not 
  */
  
  hasChildOfType: function(sys_id, type){
  	var gr, query;
  	
  	if(type == "basic")
  		query = "parent="+sys_id+"^task_type=basic"; 
  	else if(type == "recommended"){
  		query = "parent="+sys_id+"^task_type=basic^ORtask_type=recommended";
  	}else if(type == "advanced"){
  		query = "parent="+sys_id+"^task_type=basic^ORtask_type=recommended^ORtask_type=advanced";
  	}
  	
  	gr = new GlideRecord(this.constants.tables.guidance_step);
  	gr.addEncodedQuery(query);
  	gr.query();
  	return gr.getRowCount() > 0 ? true: false; 

  }, 
  
  /*
   @param sys_id Guidance Id
   return true/false - checks if all the mandatory tasks are completed by the user 
  */
  isAllMandatoryTasksCompleted: function(sys_id, userItr){
  	var grStep, grInteraction, stepsQuery, interactionQuery, stepCount, itrCount; 
  	
  	stepsQuery = "parentISNOTEMPTY^task_type=basic^guidance="+sys_id;
  	interactionQuery = "step.parentISNOTEMPTY^step.task_type=basic^user_interaction="+userItr+"^status=completed";
  	
  	grStep = new GlideRecord(this.constants.tables.guidance_step);
  	grStep.addEncodedQuery(stepsQuery);
  	grStep.query();
  	stepCount = grStep.getRowCount();
  	
  	grInteraction = new GlideRecord(this.constants.tables.user_interaction_step);
  	grInteraction.addEncodedQuery(interactionQuery);
  	grInteraction.query();
  	itrCount = grInteraction.getRowCount();
  	
  	if(stepCount > 0 && itrCount > 0 && stepCount == itrCount)
  		return true;
  	return false; 
  },


  
  hasFullURI: function(uri) {
      // if :/ appears before sysparm_query then consider it a full URL, otherwise allow it since http:// can appear
      // as part of the parameter
      var slashIndex = uri.indexOf(":/");
      var sysParmQueryIndex = uri.indexOf("sysparm_query");
      if (slashIndex > -1 && (sysParmQueryIndex == -1 || slashIndex < sysParmQueryIndex))
          return true;

      var uriTrimmed = uri.trim();
      if (uriTrimmed.startsWith("//") || uriTrimmed.startsWith("\\\\") || uriTrimmed.startsWith("/\\") || uriTrimmed.startsWith("\\/"))
          return true;

      return false;
  },
  
  /*
   @param sys_id Guidance Id
   return true/false - checks if all the mandatory tasks are completed by the user 
  */
  
  
  pluginCategoryHasTasks: function(sys_id, task_type){
  	
  	var gr, stepGr, contentQuery, stepQuery, stepId;
  	
  	if(!sys_id || !task_type)
  		return false; 
  	
  	stepQuery = "parent="+sys_id+"^task_type="+task_type;
  	stepGr = new GlideRecord(this.constants.tables.guidance_step);
  	stepGr.addEncodedQuery(stepQuery);
  	stepGr.query();
  	while(stepGr.next()){
  		stepId = stepGr.getValue("sys_id").toString();
  	}
  	if(!stepId)
  		return false; 
  	
  	contentQuery = 'guidance_step='+stepId+'^recordsISNOTEMPTY';
  	gr = new GlideRecord(this.constants.tables.content);
  	gr.addEncodedQuery(contentQuery);
  	gr.query();
  	return gr.getRowCount() > 0; 
  },
  // check if the step is dependent on plugin Step
  isDependentOnPluginStep : function(step) {
  	if(!step || !step.dependencies)
  		return false;
  	
  	this.pluginCategory = this.pluginCategory || this.hasPluginStep(step.guidance);
  	
  	if(!this.pluginCategory)
  		return false;
  	
  	this.pluginTasks = this.pluginTasks || this.getPluginTasks(step.guidance, this.pluginCategory);
  	
  	for(var i = 0; i < this.pluginTasks.length; i++) {
  		if(step.dependencies[0].dependent_on_steps.indexOf(this.pluginTasks[i].sys_id) >= 0)
  			return true;
  	}
  	return false;
  },
  
  isPluginTaskCompleted : function(step, interactionId) {
  	var pluginTask, 
  		advPluginTask,
  		dependencies;
  	
  	if(!this.pluginTasks)
  		return;
  	
  	if(step.task_type == "advanced") {
  		return !this.isStepLocked(step.sys_id, interactionId);
  	} else {
  		pluginTask = this.pluginTasks.filter(function(pluginTask) {
  			return pluginTask.task_type == step.task_type;
  		});
  		advPluginTask = this.pluginTasks.filter(function(pluginTask) {
  			return pluginTask.task_type == "advanced";
  		});
  		dependencies = step.dependencies[0].dependent_on_steps.split(",");
  		dependencies = dependencies.filter(function(dependency) {
  			return dependency != advPluginTask[0].sys_id;
  		});
  		dependencies.push(pluginTask[0].sys_id);
  		dependencies = dependencies.join(",");
  		
  		return this.isAllStepsCompleted(dependencies, interactionId);
  	}	
  },
  
  getPluginTasks : function(setupId, pluginCategory) {
  	var dbController = new global.SNHelpDBController(this.constants.tables.guidance_step);
  	var query = "guidance=" + setupId + "^parent=" + pluginCategory;
  	var tasks = dbController.getByEncodedQuery(query, "", ["sys_id", "name", "task_type", "description", "rich_description"]);
  	var content;
  	if(Array.isArray(tasks) && tasks.length > 0) {
  		dbController = new global.SNHelpDBController(this.constants.tables.content);
  		for(var i = 0; i < tasks.length; i++) {
  			content = dbController.getByEncodedQuery("guidance_step=" + tasks[i].sys_id, "", ["sys_id", "records"]);
  			tasks[i].content = (Array.isArray(content) && content.length > 0) ? content[0] : {};
  		}
  	}
  	return tasks;
  },

  isAnyTaskStarted: function(guidanceId, categoryId) {
      gr = new GlideRecord(this.constants.tables.guidance_step);
      gr.addQuery("parent", categoryId);
      gr.addEncodedQuery("status!=1");
      if (categoryId == this.hasPluginStep(guidanceId))
          gr.addQuery("task_type", this.constants.taskType.ADVANCED);
      gr.query();
      return gr.getRowCount() > 0;
  },
  
  type: 'SNHelpSetupUtil'
};

Sys ID

130600a4773230106ee492b01e5a99f6

Offical Documentation

Official Docs: