public Activity( IEnumerable <CommitInfo> commitData, DateTime fromDate, DateTime toDate, TeamCapacity teamCapacity, IReadOnlyDictionary <DateTime, double?> effortDone, IterationApiResponse iteration = null) { if (commitData == null) { throw new ArgumentNullException(nameof(commitData)); } TeamCapacity = teamCapacity ?? throw new ArgumentNullException(nameof(teamCapacity)); EffortDone = effortDone ?? throw new ArgumentNullException(nameof(effortDone)); FromDate = fromDate; ToDate = toDate; IterationName = iteration?.Name; var commits = commitData.ToList(); Commits = new ReadOnlyCollection <CommitInfo>(commits); var authors = GetAuthors(commits).ToList(); Authors = new ReadOnlyCollection <AuthorCommits>(authors); var repos = GetRepos(commits).ToList(); Repos = new ReadOnlyCollection <RepoAuthors>(repos); }
public Player( TeamMemberApiResponse teamMember, TeamCapacity teamCapacity, TeamMemberCapacity memberCapacity = null, Score score = null) { if (teamMember == null) { throw new ArgumentNullException(nameof(teamMember)); } if (teamCapacity == null) { throw new ArgumentNullException(nameof(teamCapacity)); } DisplayName = teamMember.DisplayName; Id = teamMember.Id; ImageUrl = teamMember.ImageUrl; UniqueName = teamMember.UniqueName; Capacity = memberCapacity ?? TeamMemberCapacity.Default(teamMember.Id, teamCapacity); CapacityMultiplier = (Capacity.DailyPercent > 0 ? 100 / Capacity.DailyPercent : MaxCapacityMultiplier) .Clamp(1, MaxCapacityMultiplier); Score = score ?? Score.Empty; ScoreAssistsSum = GetScoreSum(Score.Assists); ScoreGoalsSum = GetScoreSum(Score.Goals); ScorePointsSum = GetScoreSum(Score.Points); }
public JsonResult CapacityReport(string org, string project, string iterationPath) { List <IterationDetails> iterationsList = new List <IterationDetails>(); List <string> teamnames = new List <string>(); List <Iterations> iterations = new List <Iterations>(); if (Session["iterationsList"] != null) { iterationsList = (List <IterationDetails>)Session["iterationsList"]; foreach (IterationDetails item in iterationsList) { if (item.value.Count > 0) { var iteration = item.value.Where(x => x.path == iterationPath).ToList(); var result = iteration.ToList(); foreach (var sprint in result) { sprint.team = item.teamname; iterations.Add(sprint); } } } } TeamCapacity capacity = GetTeamCapacityDetails(org, project, iterations); return(Json(capacity, JsonRequestBehavior.AllowGet)); }
public Leaderboard( TeamMemberListApiResponse teamMembers, IterationApiResponse iteration, IterationCapacityListApiResponse capacities, IterationDaysOffApiResponse teamDaysOff, Iteration workIteration) { if (teamMembers == null) { throw new ArgumentNullException(nameof(teamMembers)); } if (iteration == null) { throw new ArgumentNullException(nameof(iteration)); } if (capacities == null) { throw new ArgumentNullException(nameof(capacities)); } if (teamDaysOff == null) { throw new ArgumentNullException(nameof(teamDaysOff)); } if (workIteration == null) { throw new ArgumentNullException(nameof(workIteration)); } IterationName = iteration.Name; var teamMemberList = teamMembers.Value.ToList(); var teamCapacity = new TeamCapacity(iteration, teamDaysOff, teamMembers, capacities); var workItems = GetWorkItems(workIteration); var scores = LeaderboardScoresHelper.GetScores(iteration, workItems, teamMemberList); var leaderboardTeamMembers = GetPlayers(teamMemberList, teamCapacity, scores); Players = new ReadOnlyCollection <Player>(leaderboardTeamMembers); TeamCapacity = teamCapacity; UnassignedScore = scores.Where(x => x.Key == Guid.Empty).Select(x => x.Value).FirstOrDefault(); TotalScoreAssistsSum = Players.Sum(x => x.ScoreAssistsSum); TotalScoreGoalsSum = Players.Sum(x => x.ScoreGoalsSum); TotalScorePointsSum = Players.Sum(x => x.ScorePointsSum); TotalHoursTotalCount = Players.Sum(x => x.Capacity.HoursTotalCount); TotalWorkDayCount = Players.Sum(x => x.Capacity.TotalWorkDayCount); }
private static IEnumerable <Player> GetPlayersInternal( IEnumerable <TeamMemberApiResponse> teamMembers, TeamCapacity teamCapacity, IDictionary <Guid, Score> scores) { return(from teamMember in teamMembers let memberCapacity = teamCapacity.Members.FirstOrDefault(x => x.MemberId == teamMember.Id) let memberScore = scores.Where(x => x.Key == teamMember.Id).Select(x => x.Value).FirstOrDefault() select new Player( teamMember, teamCapacity, memberCapacity, memberScore)); }
private static IList <Player> GetPlayers( IEnumerable <TeamMemberApiResponse> teamMembers, TeamCapacity teamCapacity, IDictionary <Guid, Score> scores) { return(GetPlayersInternal(teamMembers, teamCapacity, scores) .Where(x => x.Capacity.DailyHourCount > 0 || x.ScorePointsSum > 0) .OrderByDescending(x => x.ScorePointsSum) .ThenByDescending(x => x.ScoreGoalsSum) .ThenByDescending(x => x.ScoreAssistsSum) .ThenBy(x => x.ScorePointsSum > 0 ? x.Capacity.HoursTotalCount : 0) .ThenBy(x => x.ScorePointsSum > 0 ? x.Capacity.DailyHourCount : 0) .ThenBy(x => x.DisplayName) .ThenBy(x => x.UniqueName) .ToList()); }
private async Task <Activity> GetActivityInternal(string projectId, string teamId, string iterationId) { var iteration = await _iterationsApi.Get(projectId, teamId, iterationId); var fromDate = iteration?.Attributes?.StartDate ?? DateTime.Now; var toDate = iteration?.Attributes?.FinishDate ?? fromDate.AddDays(DefaultActivityDays); var capacitiesTask = _iterationsApi.GetCapacities(projectId, teamId, iterationId); var repositoriesTask = _gitApi.GetRepositoryList(projectId); var teamDaysOffTask = _iterationsApi.GetTeamDaysOff(projectId, teamId, iterationId); var teamMembersTask = _teamsApi.GetAllTeamMembers(); var effortDoneTask = _workIterationAppService.GetWorkIterationDoneEffortsPerDay(projectId, teamId, iterationId); await Task.WhenAll(capacitiesTask, repositoriesTask, teamDaysOffTask, teamMembersTask, effortDoneTask); var capacities = capacitiesTask.Result; var repositories = repositoriesTask.Result; var teamDaysOff = teamDaysOffTask.Result; var teamMembers = teamMembersTask.Result; var effortDones = effortDoneTask.Result; var commitInfoTasks = repositories .Value .Select(async x => await GetCommitInfo(x.Id, repositories.Value, teamMembers.Value, fromDate, toDate)) .ToList(); await Task.WhenAll(commitInfoTasks); var commitInfo = commitInfoTasks.SelectMany(x => x.Result).ToList(); var teamCapacity = new TeamCapacity(iteration, teamDaysOff, teamMembers, capacities); return(new Activity(commitInfo, fromDate, toDate, teamCapacity, effortDones, iteration)); }
private async Task <IList <object[]> > GetWorkActivityJsonData( string projectId, string teamId, string iterationId, Guid?memberId = null) { var idParams = await GetEnsuredIdParams(projectId, teamId, iterationId); var activity = await _workActivityAppService.GetActivity( idParams.ProjectId, idParams.TeamId, idParams.IterationId); var iterationTask = _iterationsApi.Get(idParams.ProjectId, idParams.TeamId, idParams.IterationId); var teamDaysOffTask = _iterationsApi.GetTeamDaysOff(idParams.ProjectId, idParams.TeamId, idParams.IterationId); await Task.WhenAll(iterationTask, teamDaysOffTask); var iteration = iterationTask.Result; var teamDaysOff = teamDaysOffTask.Result; var teamCapacity = new TeamCapacity(iteration, teamDaysOff); var commits = activity.Commits; if (memberId != null) { commits = commits.Where(x => memberId.Value == x.Author.MemberId).ToList(); var capacitiesTask = _iterationsApi.GetCapacities(idParams.ProjectId, idParams.TeamId, idParams.IterationId); var teamMembersTask = _teamsApi.GetMembers(idParams.ProjectId, idParams.TeamId); await Task.WhenAll(capacitiesTask, teamMembersTask); teamCapacity = new TeamCapacity(iteration, teamDaysOff, teamMembersTask.Result, capacitiesTask.Result); } var memberCapacity = teamCapacity.Members.FirstOrDefault(x => x.MemberId == memberId); var workDays = memberCapacity?.WorkDays ?? teamCapacity.WorkDays; var hasAnyMemberWorkDays = memberCapacity?.WorkDays?.Any() ?? false; var dates = teamCapacity.IterationWorkDays; return((from date in dates let dayCommits = commits .Where(x => (x.Commit.AuthorDate ?? DateTimeOffset.MinValue).Date == date.Date) .ToList() let hasCommits = dayCommits.Any() let isWorkDay = workDays.Contains(date) let isPastWorkDay = isWorkDay && date.Date <= DateTime.UtcNow.Date let shouldIncludeData = hasCommits || !hasAnyMemberWorkDays || isPastWorkDay let commitCount = shouldIncludeData ? dayCommits.Count : (int?)null let totalChangeCount = shouldIncludeData ? dayCommits.Sum(c => c.Commit.TotalChangeCount) : (int?)null select new object[] { date, commitCount, totalChangeCount }) .ToList()); }
public TeamCapacity GetTeamCapacityDetails(string org, string project, List <Iterations> iterations) { string responseBody = ""; TeamCapacity capacity = new TeamCapacity(); capacity.currentTeamCapacities = new List <CurrentTeamCapacity>(); capacity.totalTeamCapacities = new List <TotalTeamCapacity>(); capacity.capacitybyTeamMembers = new List <CapacitybyTeamMember>(); capacity.leavesbyTeamMembers = new List <LeavesbyTeamMember>(); List <CapacityDetails> capacityList = new List <CapacityDetails>(); foreach (var item in iterations) { CapacityDetails capacitydetails = new CapacityDetails(); string teamname = item.team; using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Add( new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String( System.Text.ASCIIEncoding.ASCII.GetBytes( string.Format("{0}:{1}", "", Session["PAT"] == null ? Request.QueryString["code"] : Session["PAT"].ToString())))); string url = "https://dev.azure.com/" + org + "/" + project + "/" + teamname + "/_apis/work/teamsettings/iterations/" + item.id + "/capacities?api-version=5.1"; using (HttpResponseMessage response = client.GetAsync(url).Result) { response.EnsureSuccessStatusCode(); responseBody = response.Content.ReadAsStringAsync().Result; capacitydetails = JsonConvert.DeserializeObject <CapacityDetails>(responseBody); capacitydetails.teamName = item.team; capacitydetails.IterationPath = item.path; capacityList.Add(capacitydetails); } } } foreach (var item in capacityList) { try { var teamiteration = iterations.FirstOrDefault(x => x.path == item.IterationPath && x.team == item.teamName); CurrentTeamCapacity currentTeamCapacity = new CurrentTeamCapacity(); TotalTeamCapacity totalTeamCapacity = new TotalTeamCapacity(); double currentCapacity = 0; double TotalCapacity = 0; if (teamiteration != null) { currentTeamCapacity.iterationPath = teamiteration.path; currentTeamCapacity.teamName = teamiteration.team; double currDays = Convert.ToDouble(DateTime.Now.ToString().GetBusinessDays(teamiteration.attributes.finishDate)); if (currDays > 0 && currDays < 1) { currDays = 1; } currentTeamCapacity.currentWorkingDays = currDays < 0 ? "0" :Convert.ToInt32(currDays).ToString(); totalTeamCapacity.iterationPath = teamiteration.path; totalTeamCapacity.teamName = teamiteration.team; totalTeamCapacity.iterationStart = Convert.ToDateTime(teamiteration.attributes.startDate).ToString("MM/dd/yyyy"); totalTeamCapacity.iterationEnd = Convert.ToDateTime(teamiteration.attributes.finishDate).ToString("MM/dd/yyyy"); totalTeamCapacity.totalWorkingDays = teamiteration.attributes.startDate.GetBusinessDays(teamiteration.attributes.finishDate); foreach (var member in item.value) { CapacitybyTeamMember capacitybyTeamMember = new CapacitybyTeamMember(); LeavesbyTeamMember leavesbyTeamMember = new LeavesbyTeamMember(); currentCapacity += (Convert.ToDouble(member.activities[0].capacityPerDay)); capacitybyTeamMember.teamMember = member.teamMember.displayName; capacitybyTeamMember.iterationPath = teamiteration.path; capacitybyTeamMember.iterationStart = Convert.ToDateTime(teamiteration.attributes.startDate).ToString("MM/dd/yyyy"); capacitybyTeamMember.iterationEnd = Convert.ToDateTime(teamiteration.attributes.finishDate).ToString("MM/dd/yyyy"); capacitybyTeamMember.capacityPerDay = member.activities[0].capacityPerDay; capacitybyTeamMember.teamName = teamiteration.team; capacity.capacitybyTeamMembers.Add(capacitybyTeamMember); leavesbyTeamMember.teamMember = member.teamMember.displayName; leavesbyTeamMember.teamName = teamiteration.team; leavesbyTeamMember.LeaveFrom = ""; leavesbyTeamMember.LeaveTo = ""; if (member.daysOff.Count > 0) { string fromleave = string.Empty; string toleave = string.Empty; foreach (var val in member.daysOff) { fromleave = val.start; toleave = val.end; leavesbyTeamMember.LeaveFrom = Convert.ToDateTime(fromleave).ToString("MM/dd/yyyy"); leavesbyTeamMember.LeaveTo = Convert.ToDateTime(toleave).ToString("MM/dd/yyyy"); } string diff = fromleave.DateDifference(toleave); leavesbyTeamMember.NoOfdaysLeave = diff == "0" ? "1" : diff; } else { leavesbyTeamMember.LeaveFrom = ""; leavesbyTeamMember.LeaveTo = ""; leavesbyTeamMember.NoOfdaysLeave = ""; } leavesbyTeamMember.iterationPath = teamiteration.path; capacity.leavesbyTeamMembers.Add(leavesbyTeamMember); } currentTeamCapacity.currentCapacity = (currentCapacity * Convert.ToDouble(currentTeamCapacity.currentWorkingDays)).ToString(); totalTeamCapacity.totalCapacity = (currentCapacity * Convert.ToDouble(totalTeamCapacity.totalWorkingDays)).ToString(); capacity.currentTeamCapacities.Add(currentTeamCapacity); capacity.totalTeamCapacities.Add(totalTeamCapacity); } } catch (Exception ex) { } } return(capacity); }