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