Name

sn_grc.IssueGroupingBase

Description

No description available

Script

var IssueGroupingBase = Class.create();
IssueGroupingBase.prototype = {
  initialize: function() {
  },
  
  getDefaultIssueGroupRule: function(set) {
  	return this._getDefaultIssueGroupRule(set);
  },
  
  groupIssueBasedOnRule: function(issue) {
  	return this._groupIssueBasedOnRule(issue);
  },
  hasOpenTasks: function(issue) {
  	return this._hasOpenTasks(issue);
  },
  hasOpenAccTasks: function(poam) {
           return this._hasOpenAccTasks(poam);
    },

    hasOpenMilestones: function(poam) {
           return this._hasOpenMilestones(poam);
    },
  
  closeChildIssues: function(issue) {
  	return this._closeChildIssues(issue);
  },
  
  _getDefaultIssueGroupRule: function(set) {
      var rule = new GlideRecord('sn_grc_issue_group_rule');
      rule.addQuery('is_default', true);
      rule.addQuery('set', set);
      rule.setLimit(1);
      rule.query();
      if (rule.next())
          return rule.sys_id + '';
      return null;
  },
  
  _groupIssueBasedOnRule: function(issue) {
  	var rule = issue.item.content.issue_group_rule + '';
  	var content = issue.item.content + '';
  	var groupColumn1 = issue.item.content.issue_group_rule.group_by_column_1 + '';
  	var groupColumn2 = issue.item.content.issue_group_rule.group_by_column_2 + '';
  	var groupColumn3 = issue.item.content.issue_group_rule.group_by_column_3 + '';
  	var group1 = issue.getElement(groupColumn1);
  	var group2 = '';
  	var group3 = '';
  	if (groupColumn2 != '')
  		group2 = issue.getElement(groupColumn2);
  	if (groupColumn3 != '')
  		group3 = issue.getElement(groupColumn3);
  	var groupId = '';	
  	var issueCandidate = new GlideRecord('sn_grc_issue');
  	issueCandidate.addActiveQuery();
  	issueCandidate.addQuery('sys_id', '!=', issue.sys_id + '');
  	issueCandidate.addQuery('item.content', content);
  	issueCandidate.addQuery('parent_issue.issue_group_rule', rule);
  	issueCandidate.addQuery(groupColumn1, group1);
  	if (group2 != '')
  		issueCandidate.addQuery(groupColumn2, group2);
  	if (group3 != '')
  		issueCandidate.addQuery(groupColumn3, group3);
  	issueCandidate.query();
  	if (issueCandidate.next()) {
  		groupId = issueCandidate.parent_issue.sys_id + '';
  	}
  	else {
  		var assigned_to = '';
  		if (group1 != '' && group1.getReferenceTable() == 'sys_user')
  			assigned_to = group1;
  		else if (group2 != '' && group2.getReferenceTable() == 'sys_user')
  			assigned_to = group2;
  		else if (group3 != '' && group3.getReferenceTable() == 'sys_user')
  			assigned_to = group3;
  		
  		var newIssueGroup = new GlideRecord('sn_grc_issue');
  		newIssueGroup.issue_group_rule = rule;
  		newIssueGroup.short_description = gs.getMessage('Issue created from {0}', [issue.item.content.issue_group_rule.getDisplayValue()]);
  		newIssueGroup.content = content;			
  		newIssueGroup.assigned_to = assigned_to;
  		if (groupColumn1.indexOf('.') < 0)
  			newIssueGroup[groupColumn1] = group1;
  		if ((groupColumn2.indexOf('.') < 0) && (groupColumn2 != ''))
  			newIssueGroup[groupColumn2] =  group2;
  		if ((groupColumn3.indexOf('.') < 0) && (groupColumn3 != ''))
  			newIssueGroup[groupColumn3] =  group3;
  		
  		newIssueGroup.is_group = true;
  		groupId = newIssueGroup.insert();
  	}
  	return groupId;
  },
  
  _hasOpenTasks: function(issue) {		
  	var visited = {};
  	visited[issue.sys_id + ''] = true;
  	
  	var queue = [];		
  	var rootId = issue.sys_id + '';
  	var nodeId = '';
  	var taskList = [];
  	queue.push(rootId);
  	
  	taskList = this.getTaskList(rootId, taskList);
  	while(queue.length != 0) {
          nodeId = queue.shift();
  		
  		var childIssue = new GlideRecord('sn_grc_issue');
  		childIssue.addQuery('parent_issue', nodeId);
  		childIssue.addActiveQuery();
  		childIssue.query();
  		while(childIssue.next()) {
  			if(!visited[childIssue.sys_id + '']) {
  				taskList = this.getTaskList(childIssue.sys_id + '', taskList);
  				visited[childIssue.sys_id + ''] = true;
  				queue.push(childIssue.sys_id + '');
  			}
  		}
  	}
  	return taskList;
  },
  
  _hasOpenAccTasks: function(issue) {
  	var visited = {};
  	var issueSysID = issue.sys_id;
  	visited[issueSysID + ''] = true;
  	var queue = [];
  	var rootId = issueSysID + '';
  	var nodeId = '';
  	var taskList = [];
  	queue.push(rootId);
  	taskList = this.getAccTaskList(rootId, taskList);
  	
  	while (queue.length != 0) {
                  nodeId = queue.shift();
                  var childIssue = new GlideRecord('sn_grc_issue');
                  childIssue.addQuery('parent_issue', nodeId);
                  childIssue.addActiveQuery();
                  childIssue.query();

                  while (childIssue.next()) {
                      var childIssueSysID = childIssue.getUniqueValue();
                      if (!visited[childIssueSysID + '']) {
                        taskList = this.getAccTaskList(childIssueSysID + '', taskList);
                        visited[childIssueSysID + ''] = true;
                        queue.push(childIssueSysID + '');
                      }
                  }
  	}
  	return taskList;
   },

  _hasOpenMilestones: function(issue) {
  	var visited = {};
  	var issueSysID = issue.sys_id;
  	visited[issueSysID + ''] = true;
  	var queue = [];
  	var rootId = issueSysID + '';
  	var nodeId = '';
  	var taskList = [];
  	queue.push(rootId);
  	taskList = this.getMilestoneList(rootId, taskList);
  	
  	while (queue.length != 0) {
                  nodeId = queue.shift();
                  var childIssue = new GlideRecord('sn_grc_issue');
                  childIssue.addQuery('parent_issue', nodeId);
                  childIssue.addActiveQuery();
                  childIssue.query();

                  while (childIssue.next()) {
                      var childIssueSysID = childIssue.getUniqueValue();
                      if (!visited[childIssueSysID + '']) {
                        taskList = this.getMilestoneList(childIssueSysID + '', taskList);
                        visited[childIssueSysID + ''] = true;
                        queue.push(childIssueSysID + '');
                      }
                  }
  	}
  	return taskList;
   },
  
  getTaskList: function(issueId, taskList) {		
  	var task = new GlideRecord('sn_grc_task');
  	task.addQuery('issue', issueId);
  	task.addActiveQuery();
  	task.query();
  	while(task.next()) 
  		taskList.push(task.sys_id + '');		
  	return taskList;
  },
  
  getAccTaskList: function(issueId, taskList) {
         var task = new GlideRecord('sn_irm_cont_auth_acceptance_task');
         if(!task.isValid()) return null;  		   
         task.addQuery('issue', issueId);
         task.addActiveQuery();
         task.query();

         while (task.next())
                    taskList.push(task.sys_id + '');
         return taskList;
    },

   getMilestoneList: function(issueId, taskList) {
         var task = new GlideRecord('sn_irm_cont_auth_milestone_task');
         if(!task.isValid()) return null; 		   
         task.addQuery('issue', issueId);
         task.addActiveQuery();
         task.query();

         while (task.next())
                    taskList.push(task.sys_id + '');
         return taskList;
    },
  
  _closeChildIssues: function(parentIssue) {
  	var childIssue = new GlideRecord('sn_grc_issue');
  	childIssue.addQuery('parent_issue', parentIssue.sys_id);
  	childIssue.addActiveQuery();
  	childIssue.query();
  	
  	while(childIssue.next()) {
  		childIssue.state = parentIssue.state;
  		childIssue.response = parentIssue.response + '';
  		childIssue.explanation = parentIssue.explanation + '';
  		childIssue.update();
  	}
  },
  
  groupIssues: function(parentIssueId, ids, groupingType, content, configurationItem,
  						   location, profile, deleteGroup) {
  	
  	return this._groupIssues(parentIssueId, ids, groupingType, content, configurationItem,
  						   location, profile, deleteGroup);
  },
  
  _groupIssues: function(parentIssueId, ids, groupingType, content, configurationItem,
  						   location, profile, deleteGroup) {	
  	var returnValue = false;
  	if(groupingType == 'child')
  		returnValue = this._groupChildIssues(parentIssueId, ids);
  	if(groupingType == 'parent')
  		returnValue =  this._groupParentIssues(parentIssueId, ids, deleteGroup);
  	
  	var parentIssue = new GlideRecord('sn_grc_issue');
  	if(parentIssue.get(parentIssueId)) {
  		parentIssue.is_reparenting_group = false;
  		parentIssue.update();
  	}
  	
  	return returnValue;
  },
  
  _groupChildIssues: function(parentIssueId, childIds) {
  	var success = true;
  	var parentIssueListIds = {};
  	
  	for(var i in childIds) {
  		var issue = new GlideRecord('sn_grc_issue');
  		if(issue.get(childIds[i])) {
  			parentIssueListIds[issue.parent_issue + ''] = "true";
  			
  			issue.parent_issue = parentIssueId;
  			if(!issue.update())
  				success = false;
  		}
  		else
  			success = false;
  	}
  	
  	var newParentIssue = new GlideRecord("sn_grc_issue");
  	newParentIssue.get(parentIssueId);
  	
  	for (var parentIssueListId in parentIssueListIds) {
  		var childIssue = new GlideAggregate("sn_grc_issue");
  		childIssue.addQuery("parent_issue", parentIssueListId);
  		childIssue.query();
  		
  		if(!childIssue.hasNext()) {				
  			var parentIssue = new GlideRecord('sn_grc_issue');
  			parentIssue.get(parentIssueListId);
  			var l10nATI = gs.getMessage("aggregated to issue");
  			var l10nATI2 = gs.getMessage("aggregated to issue {0}", newParentIssue.number);
  			var index = parentIssue.short_description.indexOf("(" + l10nATI);	
  			if(index == -1)
  				parentIssue.short_description += " (" + l10nATI2 + ")"; 
  			else
  				parentIssue.short_description = parentIssue.short_description.substring(0, index)  + "(" + l10nATI2 + ")";
  			
  			var messages = [];
  			messages.push(newParentIssue.number);
  			messages.push(newParentIssue.short_description);
  			
  			parentIssue.comments = gs.getMessage("The issues originally under this group have been moved to the group \"{0}: {1}\" hence this group has been closed.", messages);
  			parentIssue.state = "3";
  			parentIssue.update();	
  		} 
  	}
  	
  	// If something goes wrong, roll back
  	if(!success) {
  		for(var j in childIds) {
  			var childIssue = new GlideRecord('sn_grc_issue');
  			if(childIssue.get(childIds[j])) {
  				childIssue.parent_issue = '';
  				childIssue.update();
  			}
  		}			
  	}
  	return success;
  },
  
  
  
  _groupParentIssues: function(parentIssueId, parentIds, deleteGroup) {
  	var success = true;
  	for(var i in parentIds) {
  		var issue = new GlideRecord('sn_grc_issue');
  		issue.addQuery("parent_issue", parentIds[i]);
  		issue.query();
  		
  		while(issue.next()) {
  			issue.parent_issue = parentIssueId;
  			if(!issue.update())
  				success = false;
  		}
  			
  		var newParentIssue = new GlideRecord("sn_grc_issue");
  		newParentIssue.get(parentIssueId);
  		
  		var parentIssue = new GlideRecord('sn_grc_issue');
  		if(parentIssue.get(parentIds[i])) {
  			
  			var remediationTask = new GlideRecord("sn_grc_task");
  			remediationTask.addQuery("issue", parentIds[i]);
  			remediationTask.query();
  			
  			while(remediationTask.next()) {
  				remediationTask.setValue("issue", parentIssueId);
  				remediationTask.update();
  			}
  			
  			if(deleteGroup == 'true')
  				parentIssue.deleteRecord();
  			else {
  				var l10nATI = gs.getMessage("aggregated to issue");
  				var l10nATI2 = gs.getMessage("aggregated to issue {0}", newParentIssue.number);
  				var index = parentIssue.short_description.indexOf("(" + l10nATI);
  				
  				if(index == -1)
  					parentIssue.short_description += " (" + l10nATI2 + ")";
  				else
  					parentIssue.short_description = parentIssue.short_description.substring(0, index)  + " (" + l10nATI2 + ")";
  				
  				var messages = [];
  				messages.push(newParentIssue.number);
  				messages.push(newParentIssue.short_description);
  				
  				parentIssue.comments = gs.getMessage("The issues originally under this group have been moved to the group \"{0}: {1}\" hence this group has been closed.", messages);
  				parentIssue.state = "3";
  				parentIssue.update();					
  			}
  		}
  	}
  	return success;
  },	
  
  reopenParentIssue: function(issueId) {
  	return this._reopenParentIssue(issueId);
  },
  
  _reopenParentIssue: function(issueId) {
  	var issue = new GlideRecord("sn_grc_issue");
  	if (issue.get(issueId)) {
  		if (!issue.parent_issue.nil()) {
  			var parentIssue = new GlideRecord("sn_grc_issue");
  			if (parentIssue.get(issue.parent_issue)) {
  				if (parentIssue.state == "3" || parentIssue.state == "4") {
  					parentIssue.state = "2";
  					parentIssue.update();
  				}
  			}
  		}
  	}
  	return true;
  },
  type: 'IssueGroupingBase'
};

Sys ID

a427298ad7100300bbc783e80e6103bb

Offical Documentation

Official Docs: