Name

global.AgileBoardVtb

Description

No description available

Script

var AgileBoardVtb = Class.create();

AgileBoardVtb.prototype = {
  initialize: function() {
  },
  
  addMemberToBoard: function(userId, boardId) {
  	if(!this.isVtbMember(boardId, userId)) {
  		var gr = new GlideRecord('vtb_board_member');
  		gr.setValue('user', userId);
  		gr.setValue('board', boardId);
  		gr.insert();
  	}
  },
  
  getActiveSprintsCount: function(groupId) {
  	
  	var count = new GlideAggregate('rm_sprint');
  	var sprints = 0;
  	
  	count.addQuery('assignment_group', groupId);
  	count.addQuery('sys_class_name', "rm_sprint");
  	count.addQuery('state', '2');
  	count.addAggregate('COUNT');
  	count.query();
  	
  	if (count.next()) 
  		sprints = count.getAggregate('COUNT');
  	
  	return sprints;
  },
  
  getGroupMembers: function(groupId) {
  	
  	var members = [];
  	var gr = new GlideRecordSecure('sys_user_grmember');
  	gr.addQuery('group', groupId);
  	gr.orderBy('user');
  	gr.query();
  	
  	while(gr.next()) {
  		members.push(gr.getValue('user'));
  	}
  	
  	return members;
  },
  
  isVtbMember: function(boardId, userId) {
  	
  	var vtbMem = new GlideRecord('vtb_board_member');
  	
  	vtbMem.addQuery('user', userId);
  	vtbMem.addQuery('board', boardId);
  	vtbMem.query();
  	
  	if(vtbMem.next()) {
  		return true;
  	}
  	
  	return false;
  },
  
  findOrGenerateVtbUrl: function(config) {
  	var boardId;
  	var id;
  	
  	boardId = this.findVtb(config.groupId, config.tableName);
  		
  	if ( JSUtil.nil(boardId) )
  		id = this._createVtb(config);
  	else
  		id = boardId;
  	
  	if(!this.isVtbMember(id, gs.getUserID())) {
  		this.addMemberToBoard(gs.getUserID(), id);
  	}
  	
  	return this._getVtbUrlFromId(id);
  },
  
  _getVtbUrlFromId: function(id) {
  	return '/$vtb.do?sysparm_board=' + id;
  },
  
  findVtb: function(groupId, tableName) {
  	var board = new GlideRecord("agile_group_vtb_board");
  	board.addQuery('group', groupId);
  	board.addQuery('vtb_board.table', tableName);
  	board.query();
  	
  	if (board.next())
  		return board.getValue('vtb_board');
  	else
  		return null;
  },
  
  _createVtb: function(config) {
  	var members = [];
  	if(JSUtil.nil(config.groupId))
  		members.push(gs.getUserID());
  	else
  		members = this.getGroupMembers(config.groupId);

  	var length = members.length;
  	var helper = new AgileBoardVTBHelper();
  	var roleNames = ['scrum_master', 'scrum_product_owner', 'scrum_admin'];
  	var owner = helper.findBoardOwner(config.groupId, members, roleNames);
  	
  	var vtbBoard = this._getBoardConfiguration(config, owner);
  			
  	if(config.hidePicker)
  		vtbBoard.hideBoardPicker();
  	
  	for(var i = 0; i< length;i++) {
  		vtbBoard.addMember(members[i]);
  	}
  	var boardId = vtbBoard.create();
  	
  	this._setAssignmentGroupForBoard(boardId, config.groupId);
  	
  	this._onBoardCreate(boardId, config.tableName);
  	
  	this._saveVtbBoardForGroup(boardId, config.groupId);
  	
  	return boardId;
  },
  
  _onBoardCreate: function(boardId, tableName) {
  	this._updateVtbLanesOrder(boardId, tableName);
  },
  
  _getBoardConfiguration: function(config, owner) {
  	
  	if (JSUtil.nil(config.filter))
  		config.filter = 'sprint.state=2^assignment_group=' + config.groupId + '^EQ';
  	
  	var vtbBoard = GlideVTBBoardBuilder.guided(config.tableName, 'state')
  					.withOwner(owner)
  					.withFilter(config.filter)
  					.withName(config.name)
  					.withExcludeChildTableLanes(true);
  	
  	if (JSUtil.notNil(config.swimLaneField))
  		vtbBoard.withSwimLaneField(config.swimLaneField)
  				.withSwimLaneFilter(config.swimLaneFilter);
  	
  	return vtbBoard;
  },
  
  _updateVtbLanesOrder: function(boardId, tableName) {
  	var map = {};
  	
  	var choices = new GlideSysChoice(tableName, "state");
  	var recChoices = choices.getChoices();
  	
  	var laneValuePrefix = tableName + ':';
  	while (recChoices.next()) {
  		map[(laneValuePrefix + recChoices.value)] = recChoices.sequence + "";
  	}

  	var laneGr = new GlideRecord("vtb_lane");
  	laneGr.addQuery("board", boardId);
  	laneGr.addQuery('is_swim_lane', false);
  	laneGr.addNotNullQuery('value');
  	laneGr.query();
  	
  	while(laneGr.next()){
  		var laneValue = laneGr.getValue('value');
  		var valueParts = laneValue.split(',');
  		var rmStoryValuePart;
  		for (var i = 0; i < valueParts.length; ++i) {
  			if (valueParts[i].indexOf(laneValuePrefix) > -1) {
  				rmStoryValuePart = valueParts[i];
  				break;
  			}
  		}
  		var sequence = map[rmStoryValuePart];
  		if (sequence) {
  			laneGr.setValue("order", sequence);
  			laneGr.update();
  		}
  	}
  },
  
  _setAssignmentGroupForBoard: function(boardId, groupId) {
  	var boardGr = new GlideRecord('vtb_board');
  	boardGr.get(boardId);
  	boardGr.setValue('assignment_group', groupId);
  	boardGr.update();
  },
  
  _saveVtbBoardForGroup: function(boardId, groupId) {
  	var groupBoardGr = new GlideRecord('agile_group_vtb_board');
  	groupBoardGr.setValue('group', groupId);
  	groupBoardGr.setValue('vtb_board', boardId);
  	
  	groupBoardGr.insert();
  },
  
  type: 'AgileBoardVtb'
};

Sys ID

dfd60be453233200d044ddeeff7b12b9

Offical Documentation

Official Docs: