Name

global.ScrumPPMIntManager

Description

Scrum PPM Integration specific implementation to support Project in SDLC.

Script

var ScrumPPMIntManager = Class.create();

ScrumPPMIntManager.prototype = Object.extendsObject(ScrumSecurityManagerDefault, {
  
  initialize: function () {
  	// Nothing to do for now
  },
  
  
  /*
  * Todo; Ideally 'getStoryDotSprint' should be overridden for handling Project specific
  * cases and delegate callback to parent.
  * Copied complete implementation because of issuess with $super.
  * */
  getStoryDotSprint: function (recStory) {
  	var recSprint3;
  	var recSprint4;

  	// Case1: Return all sprints associated with story's release
  	if (!recStory.release.isNil()) {
  		var recSprint1 = new GlideRecord("rm_sprint");
  		recSprint1.addQuery("release", recStory.release);
  		recSprint1.query();
  		var arrSprintSysIds1 = [];
  		while (recSprint1.next())
  			arrSprintSysIds1.push(recSprint1.sys_id + "");
  		return arrSprintSysIds1;
  	}
  	// Case2: Retrun all sprints associated to release team. Team will have presedence over Product in Scrum PPM Integratiom
  	if (JSUtil.notNil(recStory.team)) {
  		var recSprint2 = new GlideRecord("rm_sprint");
  		recSprint2.addQuery("release_team", recStory.team);
  		recSprint2.query();
  		var arrSprintForTeam = [];
  		while (recSprint2.next())
  			arrSprintForTeam.push(recSprint2.sys_id + "");
  		return arrSprintForTeam;
  	}
  	//Case3: Return all sprints associated to project_phase
  	if (JSUtil.notNil(recStory.project_phase)){
  		var arrSprintsForProjectPhase = [];
  		recSprint3 = new GlideRecord("rm_sprint");
  		recSprint3.addQuery('assignment_group',recStory.assignment_group);
  		recSprint3.addQuery('start_date','<=',recStory.project_phase.end_date);
  		recSprint3.addQuery('end_date','>=',recStory.project_phase.start_date);
  		recSprint3.query();
  		while (recSprint3.next ()) {
  			arrSprintsForProjectPhase.push(recSprint3.sys_id + "");
  		}
  		return arrSprintsForProjectPhase;
  	}
  	//Case4: Return all sprints associated to assignment group
  	if (JSUtil.notNil(recStory.assignment_group)) {
  		recSprint4 = new GlideRecord("rm_sprint");
  		recSprint4.addQuery("assignment_group", recStory.assignment_group);
  		recSprint4.query();
  		var arrSprintForGroup = [];
  		while (recSprint4.next())
  			arrSprintForGroup.push(recSprint4.sys_id + "");
  		return arrSprintForGroup;
  	}
  	// Case5: Return all sprints associated with story's product
  	if (!recStory.product.isNil()) {
  		var arrSprintSysIds2 = [];
  		var recM2MProductRelease = new GlideRecord("m2m_product_release");
  		recM2MProductRelease.addQuery("model", recStory.product);
  		recM2MProductRelease.query();
  		while (recM2MProductRelease.next()) {
  			var recRmReleaseScrum = new GlideRecord("rm_release_scrum");
  			recRmReleaseScrum.addQuery("sys_id", recM2MProductRelease.release);
  			recRmReleaseScrum.query();
  			while (recRmReleaseScrum.next()) {
  				recSprint3 = new GlideRecord("rm_sprint");
  				recSprint3.addQuery("release", recRmReleaseScrum.sys_id);
  				recSprint3.query();
  				while (recSprint3.next()) {
  					arrSprintSysIds2.push(recSprint3.sys_id + "");
  				}
  			}
  		}
  		return arrSprintSysIds2;
  	}
  	
  	//if Project is specified
  	if (JSUtil.notNil(recStory.project)) {
  		var recSprint5 = new GlideRecord("rm_sprint");
  		recSprint5.addQuery("project", recStory.project);
  		recSprint5.query();
  		var arrSprintForProject = [];
  		while (recSprint5.next())
  			arrSprintForProject.push(recSprint5.sys_id + "");
  		return arrSprintForProject;
  	}
  	
  	// Case6: Return all sprints in system
  	recSprint4 = new GlideRecord("rm_sprint");
  	recSprint4.query();
  	var arrSprintSysIds3 = [];
  	while (recSprint4.next())
  		arrSprintSysIds3.push(recSprint4.sys_id + "");
  	return arrSprintSysIds3;
  },
  
  getStoryDotAssignedTo: function (recRmStory) {
  	var arrMemberSysIds = [];
  	
  	// Case 0: if project is assigned and project has team return all team members
  	if (!recRmStory.project.isNil()) {
  		if (!recRmStory.assignment_group.isNil()) {
  			var members = new GlideRecord('sys_user_grmember');
  			members.addQuery('group', recRmStory.getValue('assignment_group'));
  			members.query();
  			while (members.next()) {
  				arrMemberSysIds.push(members.getValue('user'));
  			}
  		}
  		if (arrMemberSysIds.length > 0)
  			return arrMemberSysIds;
  	}
  	
  	// Case 1: Return all users associated with the story's sprint's team members
  	if (!recRmStory.sprint.isNil() && recRmStory.project.isNil()) {
  		var recScrumPPSprintTeamMember = new GlideRecord("scrum_pp_sprint_team_member");
  		recScrumPPSprintTeamMember.addQuery("sprint", recRmStory.sprint);
  		recScrumPPSprintTeamMember.query();
  		while (recScrumPPSprintTeamMember.next())
  			arrMemberSysIds.push(recScrumPPSprintTeamMember.name + "");
  		if (arrMemberSysIds.length > 0)
  			return arrMemberSysIds;
  	}
  	
  	if (!recRmStory.release.isNil() && recRmStory.project.isNil()) {
  		
  		var recScrumPPReleaseTeamMember = null;
  		
  		// Case 2.1: Return all users in the story's release's default team
  		if (!recRmStory.release.default_team.isNil()) {
  			recScrumPPReleaseTeamMember = new GlideRecord("scrum_pp_release_team_member");
  			recScrumPPReleaseTeamMember.addQuery("team", recRmStory.release.default_team);
  			recScrumPPReleaseTeamMember.query();
  			while (recScrumPPReleaseTeamMember.next())
  				arrMemberSysIds.push(recScrumPPReleaseTeamMember.name + "");
  			if (arrMemberSysIds.length > 0)
  				return arrMemberSysIds;
  		}
  		
  		// Case 2.2: Return all users from all the members of all the teams in the story's release
  		var recScrumPPTeam = new GlideRecord("scrum_pp_team");
  		recScrumPPTeam.addQuery("release", recRmStory.release);
  		recScrumPPTeam.query();
  		while (recScrumPPTeam.next()) {
  			recScrumPPReleaseTeamMember = new GlideRecord("scrum_pp_release_team_member");
  			recScrumPPReleaseTeamMember.addQuery("team", recScrumPPTeam.sys_id);
  			recScrumPPReleaseTeamMember.query();
  			while (recScrumPPReleaseTeamMember.next())
  				arrMemberSysIds.push(recScrumPPReleaseTeamMember.name + "");
  		}
  		if (arrMemberSysIds.length > 0)
  			return arrMemberSysIds;
  	}
  	
  	// Case 3: Return all the users with the scrum_user role
  	var recSysUserRole = new GlideRecord("sys_user_role");
  	recSysUserRole.addQuery("name", "scrum_user");
  	recSysUserRole.query();
  	if (recSysUserRole.next()) {
  		var recSysUserHasRole = new GlideRecord("sys_user_has_role");
  		recSysUserHasRole.addQuery("role", recSysUserRole.sys_id);
  		recSysUserHasRole.query();
  		while (recSysUserHasRole.next())
  			arrMemberSysIds.push(recSysUserHasRole.user + "");
  	}
  	return arrMemberSysIds;
  },
  
  getSprintDotReleaseTeam: function (recRmSprint) {
  	// gs.log ("[DEBUG] ---> INSIDE SSMD......");
  	var arrScrumPPTeamSysIds = [];
  	var recScrumPPTeam = new GlideRecord("scrum_pp_team");
  	// Release may or may not avaialble
  	recScrumPPTeam.addQuery("release", recRmSprint.release);
  	// gs.log ("[DEBUG] release = " + recRmSprint.release);
  	//if (recRmSprint.release_team) {
  		//   recScrumPPTeam.addQuery ("sys_id", "!=", recRmSprint.release_team);
  		// gs.log ("[DEBUG] release_team = " + recRmSprint.release_team);
  		//}
  		recScrumPPTeam.query();
  		while (recScrumPPTeam.next()) {
  			// gs.log ("[DEBUG] Matched = " + recScrumPPTeam.sys_id);
  			arrScrumPPTeamSysIds.push(recScrumPPTeam.sys_id + "");
  		}
  		
  		return arrScrumPPTeamSysIds;
  	},
  	
  	/* Filter Team Memeber based on role as well as already associated with Team. */
  	getTeamMemberDotName: function (teamMember) {
  		function getScrumUsers() {
  			var arrSysIds = [];
  			var requiredRoles = [];
  			var recSysUserRole = new GlideRecord("sys_user_role");
  			recSysUserRole.addQuery("name", "IN", "scrum_user,scrum_admin");
  			recSysUserRole.query();
  			while (recSysUserRole.next()) {
  				requiredRoles.push(recSysUserRole.getValue('sys_id'));
  			}
  			if (requiredRoles.length > 0) {
  				var recSysUserHasRole = new GlideRecord("sys_user_has_role");
  				recSysUserHasRole.addQuery("role", "IN", requiredRoles.join(','));
  				recSysUserHasRole.query();
  				while (recSysUserHasRole.next()) {
  					arrSysIds.push(recSysUserHasRole.user + "");
  				}
  			}
  			return arrSysIds;
  		}
  		
  		function getTeamMember(teamMember) {
  			var arrSysIds = [];
  			var recScrumReleaseTeamMember = new GlideRecord("scrum_pp_team_member");
  			recScrumReleaseTeamMember.addQuery("team", teamMember.team);
  			recScrumReleaseTeamMember.query();
  			while (recScrumReleaseTeamMember.next()) {
  				arrSysIds.push(recScrumReleaseTeamMember.name + "");
  			}
  			return arrSysIds;
  		}
  		
  		var arrScrumUsers = getScrumUsers();
  		var arrTeamMember = getTeamMember(teamMember);
  		var arrSelectUser = new ArrayUtil().diff(arrScrumUsers, arrTeamMember);
  		return arrSelectUser;
  	},
  	
  	getStoryDotTeam: function (recStory) {
  		var teamSysIds = [];
  		if (recStory.project) {
  			var prjUtil = new ppm_int_ProjectUtil(recStory.project);
  			teamSysIds = prjUtil.getTeams();
  			return teamSysIds;
  		}
  		var scrumTeam = new GlideRecord('sys_user_group');
  		scrumTeam.addActiveQuery();
  		scrumTeam.addEncodedQuery('roles=scrum_admin^ORroles=scrum_user');
  		scrumTeam.query();
  		while (scrumTeam.next()) {
  			teamSysIds.push(scrumTeam.sys_id + "");
  		}
  		return teamSysIds;
  	},
  	getStoryDotPhases: function(recStory){
  		if(JSUtil.notNil(recStory.project)){
  			var agilePhases =[];
  			var phases = new GlideRecord('pm_project_task');
  			phases.addQuery('parent',recStory.project);
  			phases.addQuery('phase_type','agile');
  			phases.query();
  			while(phases.next()){
  				agilePhases.push(phases.getValue('sys_id'));
  			}
  			return agilePhases;
  		}
  	},
  	getPhaseDotGroup: function(phase, column_name){
  		var phaseType = phase.phase_type;
  		var query = null;
  		
  		if(JSUtil.notNil(phaseType) && phaseType == 'agile'){
  			query = 'type=1bff3b1493030200ea933007f67ffb6d';
  		}else{
  			var dbObject = GlideDBObjectManager.get();
  			var phaseTableName = phase.getTableName();
  			var parentTable = dbObject.getBase(phaseTableName);
  			var parentTableDescriptor = new GlideTableDescriptor(parentTable);
  			var elementDescriptor = parentTableDescriptor.getElementDescriptor(column_name, true);
  			query = elementDescriptor.getReferenceQualifier();
  		}
  		
  		return query;
  	},
  	
  	
  	type: "ScrumPPMIntManager"
  	
  	
  });

Sys ID

5190ebe1873121003706db5eb2e3ec6c

Offical Documentation

Official Docs: