Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 public TeamCapacity(
     IterationApiResponse iteration,
     IterationDaysOffApiResponse iterationDaysOff,
     TeamMemberListApiResponse teamMembers = null,
     IterationCapacityListApiResponse iterationCapacities = null)
     : this(iteration, iterationDaysOff?.DaysOff, teamMembers, iterationCapacities)
 {
 }
Esempio n. 4
0
        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);
        }
Esempio n. 7
0
        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();
            }
        }