Name

global.agile2_AjaxProcessor

Description

Generic client callable processor for Agile 2.0

Script

var agile2_AjaxProcessor = Class.create();
agile2_AjaxProcessor.prototype = Object.extendsObject(AbstractAjaxProcessor, {

  moveStoriesToReleaseAndGroup: function(){
  	var releaseId = this.getParameter('sysparm_release');
  	var groupId = this.getParameter('sysparm_group');
  	var stories = this.getParameter('sysparm_stories');
  	var result = this.newItem("result");
  	var status = 'failed';
  	var gr = new GlideRecordSecure('rm_story');
  	gr.addQuery('sys_id','IN',stories);
  	gr.query();
  	while(gr.next()){
  		if (JSUtil.notNil(releaseId))
  			gr.setValue('release',releaseId);
  		if (JSUtil.notNil(groupId)){
  			gr.setValue('assignment_group',groupId);
  			gr.setValue('assigned_to','');
  			gr.setValue('sprint','');
  		}
  		gr.update();
  		status = 'success';
  	}
  	result.setAttribute('status', status);
  	var msg = '';
  	var relRecord;
  	var groupRecord;
  	if (status === 'success'){
  		if (JSUtil.notNil(releaseId) && JSUtil.notNil(groupId)){
  			relRecord = new GlideRecordSecure('rm_release_scrum');
  			groupRecord = new GlideRecordSecure('sys_user_group');
  			if(relRecord.get(releaseId) && groupRecord.get(groupId))
  				msg = gs.getMessage('Release {0} and group {1} have been assigned to the selected stories',[this._sanitizeStrings(relRecord.getValue('short_description')),this._sanitizeStrings(groupRecord.getValue('name'))]);
  		} else if (JSUtil.notNil(releaseId)){
  			relRecord = new GlideRecordSecure('rm_release_scrum');
  			if(relRecord.get(releaseId))
  				msg = gs.getMessage('Release {0} has been assigned to the selected stories',[this._sanitizeStrings(relRecord.getValue('short_description'))]);
  		} else if (JSUtil.notNil(groupId)){
  			groupRecord = new GlideRecordSecure('sys_user_group');
  			if(groupRecord.get(groupId))
  				msg = gs.getMessage('Group {0} has been assigned to the selected stories',[this._sanitizeStrings(groupRecord.getValue('name'))]);
  		}
  	}
  	result.setAttribute('message', msg);
  	return 'true';
  },

  _sanitizeStrings: function(text) {
      return GlideStringUtil.escapeHTML(text);
  },

  createSprints: function () {
      var result = this.newItem("result");
      var startDateStr = this.getParameter('sysparm_start_date');
      var sprintCount = parseInt(this.getParameter('sysparm_count')) || 1;
      var sysId = this.getParameter('sysparm_sysid'); //For list case, multiple sysId's will be comma seperated
      var sprintName = this.getParameter('sysparm_sprint_name');
      var startingAt = this.getParameter('sysparm_start_count');
      var durationInDays = parseInt(this.getParameter('sysparm_duration'));
      var teamarr = sysId.split(",");
      var groupProcessor = new ppm_int_TeamProcessor();
      var hasOverlappingSprints;
      for (var j = 0; j < teamarr.length; j++) {
          if(groupProcessor.createSprintForGroup(teamarr[j], sprintCount, startDateStr,durationInDays, sprintName, startingAt))
  			hasOverlappingSprints = true;
      }
      if (hasOverlappingSprints)
          result.setAttribute('status', 'hasOverlappingSprints');
      else
          result.setAttribute('status', 'success');
      return "true";
  },

  calculateSprintDefaults: function () {
      var result = this.newItem("result");
      var sysId = this.getParameter('sysparm_sysid');

      /* Find duration and Sprint number */
      var ls = new GlideRecordSecure('rm_sprint'); //last Sprint
      ls.addQuery('assignment_group', 'IN', sysId);//Multiple groups case
      ls.orderByDesc('end_date');
      ls.query();
      if (ls.next()) {
          var lastEndDate = ls.end_date;
          var date = new GlideDateTime(lastEndDate);
          date.addDays(1);
          //Set default start date
          result.setAttribute('next_start_date', date.getLocalDate());
          var lastSprintName = ls.short_description;
          result.setAttribute('count', this._extractCount(lastSprintName));
          result.setAttribute('name', this._extractName(lastSprintName));
          result.setAttribute('duration', this._findDuration(ls.start_date, ls.end_date));
          return "true";
      }
      return "false";
  },

  _extractCount: function (name) {
      var pattern = /(\d+)$/g; // Matching last degit of Sprint name
      var count = name.match(pattern) ? name.match(pattern)[0] : 0;
      return ++count;
  },

  _extractName: function (name) {
      var pattern = /(\d+)$/g; // Matching last degit of Sprint name
      return name.match(pattern) ? name.substring(0, name.indexOf(name.match(pattern)[0])) : name;
  },

  _findDuration: function (st, ed) {
      var startDate = new GlideDateTime(st);
      var endDate = new GlideDateTime(ed);
      var dur = GlideDateTime.subtract(startDate, endDate); //the difference between start date and end date
      return dur.getRoundedDayPart();
  },

  getGroupsFromReleaseGroups: function(){
  	var releaseGroupIds = this.getParameter('sysparm_releasegroups');
  	var gr = new GlideRecordSecure('m2m_release_group');
  	gr.addQuery('sys_id','IN',releaseGroupIds);
  	gr.query();
  	while(gr.next()){
  		var group = this.newItem("group");
  		group.setAttribute("id", gr.group);
  	}
  	return 'true';
  },

  addStoriesToProject: function() {
  	var gr = new GlideRecord('rm_story');
  	if(!gr.canWrite())
  		return 'false';
  	var project = this.getParameter('sysparm_project');
  	var phase = this.getParameter('sysparm_phase');
  	var stories = this.getParameter('sysparm_stories');
  	var result = this.newItem("result");
  	var api = new ProjectWorkbenchAgile2Apis();
  	if(JSUtil.nil(phase)){
  		//Create a new Agile phase and assign stories to it
  		phase = api.createAgilePhaseforProject(project);
  	}
  	if ( api.moveStoriesToProject(project, phase, stories) ) {
  		result.setAttribute('status', 'success');
  		result.setAttribute('projectId', project);
  	}
  	else {
  		result.setAttribute('status', 'failed');
  	}
  	return 'true';
  },

  createProjectForStories: function() {
  	var projectName = this.getParameter('sysparm_project');
  	var startDate = this.getParameter('sysparm_startDate');
  	var stories = this.getParameter('sysparm_stories');
  	var result = this.newItem("result");
  	var api = new ProjectWorkbenchAgile2Apis();
  	var projId = api.createProjectAndMoveStories(projectName, startDate, stories);
  	if ( typeof projId !== 'undefined' && projId !== '') {
  		result.setAttribute('status', 'success');
  		result.setAttribute('projectId', projId);
  	}
  	else {
  		result.setAttribute('status', 'failed');
  	}
  	return 'true';
  },

  getAgilePhasesForProject: function(){
  	var project = this.getParameter('sysparm_project');
  	var projectTaskTable = 'pm_project_task';
  	//This will get teamspaces Phases as well when project is in teamspace
  	var agilePhase = new GlideRecordSecure(projectTaskTable);
  	agilePhase.addQuery("parent", project);
  	agilePhase.addQuery("phase_type", "agile");
  	agilePhase.query();
  	while(agilePhase.next()){
  		var phase = this.newItem("phase");
  		phase.setAttribute("id", agilePhase.sys_id);
  		phase.setAttribute("name", agilePhase.short_description);
  	}
  },

  compactStoryRanks: function(){
  	var result = this.newItem("result");
  	var context = this.getParameter('sysparm_context');
  	var contextId = this.getParameter('sysparm_context_id');
  	var api = new AgileStoryRankingAPI();
  	var stories;
  	var fieldName;
  	if(context === 'product'){
  		stories = api.getProductRankObject(contextId);
  		fieldName = 'product_rank';
  	} else if(context === 'group'){
  		stories = api.getGroupRankObject(contextId);
  		fieldName = 'group_rank';
  	} else if(context === 'overall'){
  		stories = api.getOverallRankObject();
  		fieldName = 'rank';
  	}
  	if (stories.length > 0)
  		if(api.compactStoryRanks(stories,fieldName))
  			result.setAttribute('status', 'success');
  		else
  			result.setAttribute('status', 'failed');
  	else
  		result.setAttribute('status', 'no_data');
  	return 'true';
  },

  getSprintsForGroup: function(){
  	var sprintsArr = [];
  	var groupId = this.getParameter('sysparm_group');
  	var sprintId = this.getParameter('sysparm_sprint');
  	var selectedSprint = new GlideRecordSecure('rm_sprint');
  	selectedSprint.get(sprintId);
  	var sprint = new GlideRecordSecure('rm_sprint');
  	sprint.addActiveQuery();
  	sprint.addQuery('sys_class_name', 'rm_sprint');
  	sprint.addQuery('assignment_group', groupId);
  	sprint.addQuery('sys_id', '!=', sprintId);
  	sprint.orderBy('start_date');
  	sprint.query();
  	while(sprint.next()){
  		var sprintObj = {};
  		sprintObj.id = sprint.getUniqueValue();
  		sprintObj.name = sprint.getDisplayValue('short_description');
  		sprintsArr.push(sprintObj);
  	}
  	return new JSON().encode(sprintsArr);
  },

  moveInactiveStoriesToSprint: function(){
  	var success = true;
  	var selectedSprintId = this.getParameter('sysparm_selected_sprint');
  	var currentSprintIds = this.getParameter('sysparm_current_sprint');
  	var scrumSprint = new ScrumSprint(currentSprintIds);
  	success = scrumSprint.moveIncompleteRecordsToSprint(selectedSprintId);

  	return new JSON().encode(success);
  },

  getStoryProgressBoardUrl: function() {
  	var sprintId = this.getParameter('sysparm_sprint_id');

  	if(JSUtil.nil(sprintId))
  		return null;
  	else {
  		var sprint = new GlideRecordSecure('rm_sprint');
  		sprint.get(sprintId);
  		var groupId = sprint.getValue('assignment_group');

  		var group = new GlideRecord('sys_user_group');
  		group.get(groupId);
  		var boardHelper = new AgileBoardVTBHelper();
  		var name = boardHelper.trimBoardNameForGroup(group.getValue('name'));

  		var agBoardVtb = AgileBoardVtbFactory.create();
  		var vtbUrl = agBoardVtb.findOrGenerateVtbUrl({
  			tableName: 'rm_story',
  			name: name,
  			groupId: groupId,
  			hidePicker: true
  		});

  		return vtbUrl;
  	}
  },

  createBacklogFromProject: function() {
      var backlogId = BacklogProjectUtil.createBacklogFromProject(projectId);
      var result = this.newItem("result");
      result.setAttribute("sysparm_backlog_id", backlogId);
  },

  hasTeamStoriesAssignedToSprints: function() {
      var team = this.getParameter('sysparm_team');
      var stories = new GlideAggregate('rm_story');
      stories.addQuery('assignment_group', team);
      stories.addNotNullQuery('sprint');
  	stories.addAggregate('COUNT');
      stories.query();
      if(stories.next()){
          return stories.getAggregate('COUNT') !== '0';
      }
      return false;
  },
  
  removeStoriesFromProject: function() {
      var stories = this.getParameter('sysparm_stories');
      var api = new ProjectWorkbenchAgile2Apis();
      api.removeStoriesFromProject(stories);
  	var result = this.newItem("result");
      result.setAttribute('status', 'success');
  },

  clearThemeOrRelease: function() {
  	var result = this.newItem("result");
      var productId = this.getParameter('sysparm_product_id');
      var themeId = this.getParameter('sysparm_theme_id');
  	var releaseId = this.getParameter('sysparm_release_id');
      var themeGr = new GlideRecord("scrum_theme");
      if(themeGr.get(themeId)) {
          var themeProduct = themeGr.getValue('product');
          if(JSUtil.notNil(themeProduct) && themeProduct != productId)
  			result.setAttribute('clearTheme', true);
      }
  	var m2mGr = new GlideRecord("m2m_product_release");
      m2mGr.addQuery("release", releaseId);
      m2mGr.query();
      if(m2mGr.next()) {
          m2mGr = new GlideRecord("m2m_product_release");
          m2mGr.addQuery("release", releaseId);
          m2mGr.addQuery("model", productId);
          m2mGr.query();
          if(!m2mGr.next())
              result.setAttribute('clearRelease', true);
  	}
  },
  
  getBacklog: function() {
  	var projectId = this.getParameter('sysparm_project');
  	var backlogId = BacklogProjectUtil.getBacklog(projectId, gs.getUserID()); 
  	var result = this.newItem("result");
  	result.setAttribute('backlogId', backlogId);
  },
  
  getDuration: function() {
  	var startDate = this.getInternalDateFormat(this.getParameter('sysparm_start_date'));
  	var endDate = this.getInternalDateFormat(this.getParameter('sysparm_end_date'));
  	var duration = new GlideDuration(0);
  	duration = GlideDateTime.subtract(startDate, endDate);
  	return duration.getDurationValue();
  },
  
  getInternalDateFormat: function(displayValue) {
  	var dateTime = new GlideDateTime("1970-01-01 00:00:00");
  	dateTime.setDisplayValue(displayValue);
  	if (dateTime.isValid()) {
  		return dateTime;
  	} else {
  		return new GlideDateTime("1970-01-01 00:00:00");
  	}
  },

  type: 'agile2_AjaxProcessor'
});

Sys ID

e869db280b4b2200a6acc93563673aca

Offical Documentation

Official Docs: