Name

global.ScrumTeam

Description

Provides common utility methods related to scrum team

Script

var ScrumTeam = Class.create();

ScrumTeam.prototype = {
  initialize: function(gr) {
  	this.gr = gr;
  	this.sprints = [];
  	this.agileGroupTypeSysId = '1bff3b1493030200ea933007f67ffb6d';
  },
  
  sysId: function() {
  	return this.gr.getValue('sys_id');
  },
  
  convertToGroup: function() {
  	var group = new GlideRecord('sys_user_group');
  	var groupExists = group.get('name', this.gr.show_name);
  	var groupId;
  	
  	this.sprints = [];
  	
  	if (groupExists) {
  		groupId = group.getValue('sys_id');
  		this._updateGroupType(group);
  	} else
  		groupId = this._createGroup();
  	
  	if (!JSUtil.nil(groupId)) {
  		this._syncTeamMembers(groupId);
  		var tableUtils = new TableUtils("pm_project_task");
  		if(tableUtils.tableExists())
  			this._updateGroupInRecords('pm_project_task', 'scrum_team',groupId);
  		
  		this._updateGroupInRecords('rm_sprint', 'release_team', groupId);
  		this._updateGroupInRecords('rm_story', 'team', groupId);
  		this._updateGroupInStoriesOfSprints(groupId);
  		this._createM2MReleaseGroup(this.gr.release, groupId);
  		return true;
  	}
  	
  	return false;
  },
  
  _updateGroupInRecords: function(table, teamColumn, groupId) {
  	var rec = new GlideRecord(table);
  	
  	rec.addQuery(teamColumn, this.sysId());
  	rec.query();
  	
  	while (rec.next()) {
  		if (rec.assignment_group.nil()) {
  			rec.setValue('assignment_group', groupId);
  			rec.update();
  			
  			if (table == 'rm_sprint')
  				this.sprints.push(rec.getValue('sys_id'));
  		}
  	}
  },
  
  //For cases where team is not populated on Story, get the assignment_group from sprint
  _updateGroupInStoriesOfSprints: function(groupId) {
  	var rec = new GlideRecord('rm_story');
  	
  	rec.addQuery('sprint','IN',this.sprints.join(','));
  	rec.addNullQuery('team');
  	rec.addNullQuery('assignment_group');
  	rec.query();
  	
  	while (rec.next()) {
  		rec.setValue('assignment_group', groupId);
  		rec.update();
  	}	
  },
  
  _createM2MReleaseGroup: function(releaseId, groupId) {
  	var rec = new GlideRecord('m2m_release_group');
  	
  	rec.addQuery('release',releaseId);
  	rec.addQuery('group',groupId);
  	rec.query();
  	
  	if (!rec.next()) {
  		rec.initialize();
  		rec.setValue('release',releaseId);
  		rec.setValue('group',groupId);
  		rec.insert();
  	}
  },
  
  _createGroup: function() {
  	var group = new GlideRecord('sys_user_group');
  	
  	group.initialize();
  	group.setValue('name', this.gr.show_name);
  	group.setValue('description', this.gr.team_name.short_description);
  	group.setValue('points', this.gr.points);
  	group.setValue('manager', this.gr.manager);
  	group.setValue('type', this.agileGroupTypeSysId);
  	group.setValue('sys_domain', this.gr.getValue('sys_domain'));
  	
  	return group.insert();
  },
  
  _getGroupMemberSysIds: function(groupId) {
  	var sysIds = [];
  	var grMember = new GlideRecord('sys_user_grmember');

  	grMember.addQuery('group', groupId);
  	grMember.query();
  	
  	while (grMember.next()) {
  		sysIds.push(grMember.getValue('user'));
  	}
  	
  	return sysIds;
  },
  
  _updateGroupType: function(group) {
  	if (JSUtil.nil(group))
  		return;
  	
  	var typeStr = group.getValue('type');
  	var typeArr = JSUtil.nil(typeStr) ? [] : typeStr.split(',');
  	
  	if (typeArr.indexOf(this.agileGroupTypeSysId) < 0) {
  		typeArr.push(this.agileGroupTypeSysId);
  		group.setValue('type', typeArr.join(','));
  		group.update();
  	}
  },
  
  _syncTeamMembers: function(groupId) {
  	var grMember;
  	var groupMemberSysIds = this._getGroupMemberSysIds(groupId);
  	var teamMembers = new GlideRecord('scrum_pp_team_member');

  	teamMembers.addActiveQuery();
  	teamMembers.addQuery('team', this.sysId());
  	teamMembers.addQuery('name', 'NOT IN', groupMemberSysIds.join(','));
  	teamMembers.addQuery('sys_class_name','scrum_pp_team_member');
  	teamMembers.query();
  	
  	while (teamMembers.next()) {
  		grMember = new GlideRecord('sys_user_grmember');
  		grMember.initialize();
  		grMember.setValue('group',groupId);
  		grMember.setValue('user',teamMembers.name);
  		
  		if (grMember.isValidField('points') && teamMembers.isValidField('default_sprint_points'))
  			grMember.setValue('points',teamMembers.getValue('default_sprint_points'));
  		
  		if (grMember.isValidField('scrum_role') && teamMembers.isValidField('scrum_role'))
  			grMember.setValue('scrum_role',teamMembers.getValue('scrum_role'));
  		
  		grMember.insert();
  	}
  	
  	var releaseTeamMembers = new GlideRecord('scrum_pp_release_team_member');
  	
  	releaseTeamMembers.addActiveQuery();
  	releaseTeamMembers.addQuery('team', this.sysId());
  	releaseTeamMembers.addQuery('name', 'NOT IN', groupMemberSysIds.join(','));
  	releaseTeamMembers.query();
  	
  	while (releaseTeamMembers.next()) {
  		grMember = new GlideRecord('sys_user_grmember');
  		grMember.initialize();
  		grMember.setValue('group', groupId);
  		grMember.setValue('user', releaseTeamMembers.name);
  		
  		if (grMember.isValidField('points') && releaseTeamMembers.isValidField('default_sprint_points'))
  			grMember.setValue('points', releaseTeamMembers.getValue('default_sprint_points'));
  		
  		if (grMember.isValidField('scrum_role') && releaseTeamMembers.isValidField('scrum_role'))
  			grMember.setValue('scrum_role', releaseTeamMembers.getValue('scrum_role'));
  		
  		grMember.insert();
  	}
  },

  type: 'ScrumTeam'
};

Sys ID

fe23480693330200ea933007f67ffb59

Offical Documentation

Official Docs: