Name

global.Agile2SecurityManager

Description

Agile Development 2.0 specific implementation to support unified Agile in SDLC.

Script

var Agile2SecurityManager = Class.create();
Agile2SecurityManager.prototype = Object.extendsObject(ScrumSecurityManagerDefault,{
  initialize: function() {
  },
  
  /*
  * 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 table = recStory.getTableName();
  	if (table !== 'rm_story' && recStory.isValidField('story')) {
  		if (!recStory.story.nil())
  			recStory = recStory.story.getRefRecord();
  		else {
  			gs.warn('Unsupported reference qualifier for type : ' + table);
  			return;
  		}
  	}
  	//Case1: Return all active sprints associated to assignment group
  	if (JSUtil.notNil(recStory.assignment_group)) {
  		return 'sys_class_name=rm_sprint^assignment_group='+recStory.assignment_group+'^active=true';
  	}
  	// Case2: Return all active sprints in system
  	return 'sys_class_name=rm_sprint^active=true';
  },
  
  getStoryDotAssignedTo: function (recRmStory) {
  	var arrMemberSysIds = [];
  	
  	// Case 0: if assignment group is populated, return all members of it
  	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 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;
  	},
  	getStoryDotGroup: function (recStory) {
  		var groupSysIds = [];
  		if (recStory.product){
  			var productGroup = new GlideRecord('m2m_product_group');
  			productGroup.addQuery('product',recStory.product);
  			productGroup.query();
  			while(productGroup.next())
  				groupSysIds.push(productGroup.getValue('group'));
  		}
  		if (gs.tableExists("pm_project_task") && recStory.project_phase){
  			var projectTask = new GlideRecord('pm_project_task');
  			if(projectTask.get(recStory.project_phase)&&projectTask.assignment_group)
  				groupSysIds.push(projectTask.assignment_group);
  		}
  		if (groupSysIds.length > 0)
  			return groupSysIds;
  		
  		var agileTeam = new GlideRecord('sys_user_group');
  		agileTeam.addActiveQuery();
  		agileTeam.addQuery('type', 'CONTAINS', '1bff3b1493030200ea933007f67ffb6d');
  		agileTeam.query();
  		while (agileTeam.next()) {
  			groupSysIds.push(agileTeam.sys_id + "");
  		}
  		return groupSysIds;
  	},
  	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.getValue('phase_type');
  		var query;
  		
  		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;
  	},
  	
  	getStoryDotRelease: function (recStory) {
  		var arrReleaseSysIds = [];
  		if(JSUtil.notNil(recStory.product)){
  			var recProductRelease = new GlideRecord("m2m_product_release");
  			recProductRelease.addQuery('model',recStory.product);
  			recProductRelease.addQuery('release.active',true);
  			recProductRelease.query();
  			while (recProductRelease.next ()) {
  				arrReleaseSysIds.push(recProductRelease.release + "");
  			}
  			return 'sys_idIN' + arrReleaseSysIds.join(',');
  		}else{
  			return 'active=true';
  		}
  	},
  	
  	validateSprintFields: function(sprintRecord){
  		var abortSave = false;
  		/* Validate alterntive mandatory fields */
  		if(JSUtil.nil(sprintRecord.assignment_group)) {
  			gs.addErrorMessage(gs.getMessage("Please provide Group with which this sprint should associate"));
  			abortSave = true;
  		}else {// Validate Sprints for Team
  			var sprintStart = JSUtil.notNil(sprintRecord.start_date) ? sprintRecord.start_date.getGlideObject().getNumericValue() : -1;
  			var sprintEnd = JSUtil.notNil(sprintRecord.end_date) ? sprintRecord.end_date.getGlideObject().getNumericValue() : -1;
  			
  			if(sprintStart === -1 || sprintEnd === -1) {
  				if (sprintStart === -1)
  					sprintRecord.start_date.setError(gs.getMessage("Please provide a date from which this sprint should start"));
  				if (sprintEnd === -1)
  					sprintRecord.end_date.setError(gs.getMessage("Please provide a date for when this sprint should end"));
  				abortSave = true;
  			} else if(sprintStart > sprintEnd) {
  				sprintRecord.start_date.setError(gs.getMessage("Please ensure sprint start is not after sprint end"));
  				abortSave = true;
  			}
  		}
  		return abortSave;
  	},
  	
  	getStoryDotEpic: function (recStory) {
  		var encodedQuery = 'sys_class_name=rm_epic^state!=4';
  		
  		if (!recStory.product.nil())
  			encodedQuery += '^product=' + recStory.getValue('product') + '^ORproductISEMPTY';

  		return encodedQuery;
  	},
  	
  	getStoryDotTheme: function (recStory) {
  		var arrSysIdsOfThemes = [];
  		var recScrumThemes = new GlideRecord("scrum_theme");
  		if(recStory.product)
  			recScrumThemes.addQuery("product", recStory.product).addOrCondition("product", "NULL");
  		recScrumThemes.query();
  		while(recScrumThemes.next()) {
  			arrSysIdsOfThemes.push(recScrumThemes.sys_id + "");
  		}
  		return arrSysIdsOfThemes;
  	},
  	
  	getReleaseGroupAssignmentDotSprints: function(releaseGroupAssignment){
  		var release = releaseGroupAssignment.release.getRefRecord();
  		var group = releaseGroupAssignment.group;
  		var releaseStartDate = release.getValue('start_date');
  		var releaseEndDate = release.getValue('end_date');
  		var requiredSprints = [];
  		var sprints = new GlideRecord('rm_sprint');
  		sprints.addQuery('assignment_group',group);
  		sprints.addQuery('start_date', '<=',releaseEndDate);
  		sprints.addQuery('end_date', '>=',releaseStartDate);
  		sprints.query();
  		while(sprints.next()) {
  			requiredSprints.push(sprints.sys_id + "");
  		}
  		return requiredSprints;
  	},
  	
  	getStoryDotProject: function(story){
  		var projectId;
  		var qualifier = 'sys_class_nameIN'+PPMRoleClassMapper.getClasses('project', gs.getUser());
  		if(JSUtil.notNil(story.demand)){
  			projectId = story.demand.project + '';
  			qualifier = 'sys_idIN'+projectId;
  		}
  		qualifier += '^execution_typeNOT INwaterfall';
  		return qualifier;
  	},
  	
  	isAgileGroup: function(recGroup){
  		return ((typeof recGroup !== 'undefined' && recGroup.type.indexOf(ScrumSecurityManager.AGILE_TEAM) >= 0));
  	},
  	
  	getEpicDotTheme: function (recEpic) {
  		var arrSysIdsOfThemes = [];
  		var recScrumThemes = new GlideRecord("scrum_theme");
  		recScrumThemes.addQuery("product", recEpic.product).addOrCondition("product", "NULL");
  		recScrumThemes.query();
  		while(recScrumThemes.next()) {
  			arrSysIdsOfThemes.push(recScrumThemes.sys_id + "");
  		}
  		return arrSysIdsOfThemes;
  	},
  	
  	type: 'Agile2SecurityManager'
  });

Sys ID

84104f500b722200a6acc93563673a02

Offical Documentation

Official Docs: