Name

global.ppm_int_TeamProcessor

Description

Ajax Processor to handle Team in SDLC

Script

var ppm_int_TeamProcessor = Class.create();
ppm_int_TeamProcessor.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  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');
      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(","); //Multiple groups case
      var hasOverlappingSprints;
      for (var j = 0; j < teamarr.length; j++) {
          if(this.createSprintForGroup(teamarr[j], sprintCount, startDateStr, durationInDays, sprintName, startingAt))
              hasOverlappingSprints = true;
      }
      if (hasOverlappingSprints)
          result.setAttribute('status', 'hasOverlappingSprints');
      else
          result.setAttribute('status', 'success');
      return "true";
  },
  createSprintForGroup: function(groupId, sprintCount, startDateStr, durationInDays, sprintName, startingAt){
      var teamPoints = this._pointsForTeam(groupId);
      var hasOverlappingSprints = false;
  	var startDateTime = new GlideDateTime();
  	startDateTime.setDisplayValue(startDateStr);

      for (var i = 0; i < sprintCount; i++) {
  		var startDate = this._calculateNextStartDate(startDateTime, durationInDays, i);
          if(!this._createSprint(startDate.getLocalDate().getDisplayValue(), durationInDays, groupId, sprintName, startingAt, i, teamPoints)){
              hasOverlappingSprints = true;
              return hasOverlappingSprints;
          }
      }
      return hasOverlappingSprints;
  },
  _calculateNextStartDate: function (startDate, durationInDays, index) {
  	var nextStartDate = new GlideDateTime(startDate);
  	nextStartDate.addDaysLocalTime(durationInDays * index);
  	return nextStartDate;
  },
  /* Created sprint records with team reference */
  _createSprint: function (start, durationInDays, team, sprintName, startingAt, count, teamPoints) {
      var shortDesc = this._getSprintShortDescription(sprintName, startingAt, count);
  	var startDateTime = new GlideDateTime();
      startDateTime.setDisplayValue(start);
      var endDateTime = new GlideDateTime();
      endDateTime.setDisplayValue(startDateTime.getLocalDate());
      endDateTime.addDaysLocalTime(durationInDays);
      endDateTime.addSeconds(-1);

      var sprint = new GlideRecordSecure('rm_sprint');
      sprint.initialize();
  	sprint.setValue('start_date', startDateTime.getValue());
      sprint.setValue('end_date', endDateTime.getValue());
      sprint.assignment_group = team;
      sprint.short_description = shortDesc;
      sprint.team_points = teamPoints;
      sprint.sys_domain = this.getGroupsDomain(team);
  	return sprint.insert();
  },
 getGroupsDomain: function (strGroupSysId) {
    var recGroup = new GlideRecordSecure("sys_user_group");
    recGroup.get(strGroupSysId);
    return recGroup.getValue('sys_domain');
 },
  /* Get increamental Sprint short description */
  _getSprintShortDescription: function (sprintName, startingAt, count) {
      return sprintName + ' ' + (parseInt(startingAt) + parseInt(count));
  },

  _pointsForTeam: function(teamId) {
      var gr = new GlideRecordSecure('sys_user_group');
      gr.get(teamId);
      return gr.getValue('points');
  },
  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('sys_class_name', 'rm_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().getDisplayValue());
          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";
  },

  calculateSprintDefaultsForScrumView: function () {
      var result = this.newItem("result");
      var sysId = this.getParameter('sysparm_sysid');
      var ls = new GlideRecordSecure('rm_sprint');

      ls.addQuery('sys_class_name', 'rm_sprint');
      ls.addQuery('assignment_group', '=', sysId);//Only one group case
      ls.orderByDesc('end_date');
      ls.query();
      if (ls.next()) {
          var lastSprintName = ls.short_description;
          var count = this._extractCount(lastSprintName);
          var sprintName = this._extractName(lastSprintName).trim() + ' ' + count;
          result.setAttribute('name', sprintName);

          var lastStartDate = ls.start_date.getGlideObject();
          var lastEndDate = ls.end_date.getGlideObject();
  		var dur = this._findDuration(lastStartDate, lastEndDate);

          var startDate = this._calculateNextStartDate(lastEndDate, 0, 0);
          startDate.addSeconds(1);
          var endDate = this._calculateNextStartDate(lastEndDate, dur, 1);
          result.setAttribute('startDate', startDate.getDisplayValue());
          result.setAttribute('endDate', endDate.getDisplayValue());
          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.lastIndexOf(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();
  }
});

Sys ID

82369df7871221003706db5eb2e3ec6d

Offical Documentation

Official Docs: