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 TeamCapacity( IterationApiResponse iteration, IEnumerable <IterationDayOff> iterationDaysOff = null, TeamMemberListApiResponse teamMembers = null, IterationCapacityListApiResponse iterationCapacities = null) { if (iteration == null) { throw new ArgumentNullException(nameof(iteration)); } var iterationWorkDays = GetIterationWorkDays(iteration).OrderBy(x => x).Distinct().ToList(); var teamDaysOff = GetTeamDaysOff(iterationDaysOff).OrderBy(x => x).Distinct().ToList(); var workDays = iterationWorkDays.Except(teamDaysOff).OrderBy(x => x).Distinct().ToList(); var members = GetMembers(teamMembers?.Value, iterationCapacities?.Value, iterationWorkDays, teamDaysOff) .ToList(); IterationWorkDays = new ReadOnlyCollection <DateTime>(iterationWorkDays); Members = new ReadOnlyCollection <TeamMemberCapacity>(members); TeamDaysOff = new ReadOnlyCollection <DateTime>(teamDaysOff); WorkDays = new ReadOnlyCollection <DateTime>(workDays); }
public TeamCapacity( IterationApiResponse iteration, IterationDaysOffApiResponse iterationDaysOff, TeamMemberListApiResponse teamMembers = null, IterationCapacityListApiResponse iterationCapacities = null) : this(iteration, iterationDaysOff?.DaysOff, teamMembers, iterationCapacities) { }
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 <(Guid Id, Point Point)> GetPoints( IterationApiResponse iteration, IEnumerable <WorkItem> workItems, IReadOnlyCollection <TeamMemberApiResponse> teamMembers) { var doneWorkItems = workItems.Where(x => x.IsStateDone && x.IterationPath == iteration.Path).ToList(); var goals = GetGoals(doneWorkItems) .Distinct(x => new { x.Id, x.Point.Type, x.Point.Description, x.Point.Value }) .ToList(); foreach (var goal in goals) { yield return(teamMembers.Any(x => x.Id == goal.Id) ? goal : (Guid.Empty, goal.Point)); } foreach (var workItem in doneWorkItems) { var doneChildItems = workItem .ChildItems .Where(x => x.IsStateDone && x.IterationPath == iteration.Path && x.AssignedToMember?.Id != workItem.AssignedToMember?.Id) .ToList(); var value = GetAssistValue(workItem); var maxCount = GetAssistMaxCount(workItem); var assists = GetAssists(workItem, doneChildItems, value, maxCount) .Distinct(x => new { x.Id, x.Point.Type, x.Point.Description, x.Point.Value }) .ToList(); foreach (var assist in assists) { yield return(teamMembers.Any(x => x.Id == assist.Id) ? assist : (Guid.Empty, assist.Point)); } } }
public static IDictionary <Guid, Score> GetScores( IterationApiResponse iteration, IEnumerable <WorkItem> workItems, IReadOnlyCollection <TeamMemberApiResponse> teamMembers) { var points = GetPoints(iteration, workItems, teamMembers) .Where(x => x.Id == Guid.Empty || x.Point.Value > 0) .OrderByDescending(x => x.Point.EarnedAt) .ThenByDescending(x => x.Point.Value) .ThenBy(x => x.Point.Description) .ThenByDescending(x => x.Point.Type) .GroupBy(x => x.Id, x => x.Point) .ToList(); var scores = points.ToDictionary(x => x.Key, x => new Score(x)); return(scores); }
public Iteration( WorkItemListApiResponse workItems, IReadOnlyCollection <TeamMemberApiResponse> teamMembers, IterationApiResponse iteration, IterationCapacityListApiResponse capacities, bool isBacklog) { if (workItems == null) { throw new ArgumentNullException(nameof(workItems)); } if (teamMembers == null) { throw new ArgumentNullException(nameof(teamMembers)); } if (iteration == null) { throw new ArgumentNullException(nameof(iteration)); } IsBacklog = isBacklog; IterationId = iteration.Id; IterationName = iteration.Name; IterationPath = iteration.Path; IterationStartDate = iteration.Attributes?.StartDate; IterationFinishDate = iteration.Attributes?.FinishDate; IterationDayCount = IterationStartDate != null && IterationFinishDate != null ? (IterationFinishDate.Value - IterationStartDate.Value) .TotalDays + 1 : 0; var items = workItems.Value.Select(x => new WorkItem(x, teamMembers)) .OrderBy(x => x.BacklogPriority) .ToList(); foreach (var item in items) { var parent = item.ParentId > 0 ? items.FirstOrDefault(x => x.Id == item.ParentId) : null; if (parent != null) { parent.ChildItems.Add(item); } else { Items.Add(item); } } //this.Items = this.Items.Where(x => x.IsTypeProductBacklogItem || x.IsTypeBug || x.IsTypeTask).ToList(); Items = Items.OrderByDescending(x => x.BacklogPriority > 0).ThenBy(x => x.BacklogPriority).ToList(); Items.ToList().ForEach(x => x.IsTopLevel = true); if (capacities != null) { var groupedCapacities = from capacity in capacities.Value //from activity in capacity.Activities //from daysOff in capacity.DaysOff group capacity by capacity.TeamMember.Id into g select new { TeamMember = g.Select(x => x.TeamMember).First(), Activities = g.SelectMany(x => x.Activities), DaysOff = g.SelectMany(x => x.DaysOff) }; Capacities = groupedCapacities.Select(x => new Capacity(x.TeamMember, x.Activities, x.DaysOff)) .ToList(); } }