Beispiel #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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
        }
Beispiel #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);
        }
Beispiel #5
0
 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));
 }
Beispiel #6
0
 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));
        }
Beispiel #8
0
        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());
        }
Beispiel #9
0
        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);
        }