private void AnalyzeHighRiskForPersonByTask() { Dictionary <string, List <UTrackTask> > personToTasks = new Dictionary <string, List <UTrackTask> >(); Dictionary <string, List <decimal> > personToWorkToDo = new Dictionary <string, List <decimal> >(); foreach (var story in Stories) { foreach (var task in story.Tasks) { string ownerEngName = NameUtil.ConvertToEngName(task.Owner); if (!personToWorkToDo.ContainsKey(ownerEngName)) { personToWorkToDo[ownerEngName] = new List <decimal>(); personToTasks[ownerEngName] = new List <UTrackTask>(); } personToWorkToDo[ownerEngName].Add(task.WorkToDo); personToTasks[ownerEngName].Add(task); } } int availableDays = DateTimeUtil.GetWorkingDays(DateTime.Now, CurrentSprint.EndTime); foreach (var item in personToWorkToDo) { decimal totalWorkToDoInDays = 0; item.Value.ForEach(t => totalWorkToDoInDays += t); totalWorkToDoInDays = totalWorkToDoInDays / 8; if (totalWorkToDoInDays > availableDays) { string errorDesc = $"This member has a total of {item.Value.Count} task(s). They still need {totalWorkToDoInDays} day(s), but there are only {availableDays} day(s) left in the sprint"; var owningTasks = personToTasks[item.Key].Select(t => t.Type + " " + t.ID + " " + t.Description + " - Size:" + t.Estimate); var persionRiskItem = new PersonRiskItem() { Owner = item.Key, ExceedDay = totalWorkToDoInDays - availableDays, OwningStories = string.Join("\n", owningTasks), RiskDetail = errorDesc }; if (!HighRiskPersons.Any(t => t.Owner == persionRiskItem.Owner)) { HighRiskPersons.Add(persionRiskItem); } } } }
private void AnalyzeHighRiskForPersonByStory() { Dictionary <string, List <Story> > personToStories = new Dictionary <string, List <Story> >(); Dictionary <string, List <decimal> > personToWorkToDo = new Dictionary <string, List <decimal> >(); foreach (var story in CurrentSprint.GetUnCompletedStories()) { string ownerEngName = NameUtil.ConvertToEngName(story.Owner); if (!personToWorkToDo.ContainsKey(ownerEngName)) { personToWorkToDo[ownerEngName] = new List <decimal>(); personToStories[ownerEngName] = new List <Story>(); } personToWorkToDo[ownerEngName].Add(GetTotalStoryWorkToDo(story)); personToStories[ownerEngName].Add(story); } int availableDays = DateTimeUtil.GetWorkingDays(DateTime.Now, CurrentSprint.EndTime); foreach (var item in personToWorkToDo) { decimal totalWorkToDoInDays = 0; item.Value.ForEach(t => totalWorkToDoInDays += t); if (totalWorkToDoInDays > availableDays) { string errorDesc = $"This member has a total of {item.Value.Count} story/stories.They still need {totalWorkToDoInDays} day(s), but there are only {availableDays} day(s) left in the sprint."; var ownerStories = personToStories[item.Key].Select(t => t.Type + " " + t.ID + " " + t.Title + "- Size:" + t.Size); var persionRiskItem = new PersonRiskItem() { Owner = item.Key, ExceedDay = totalWorkToDoInDays - availableDays, OwningStories = string.Join("\n", ownerStories), RiskDetail = errorDesc }; HighRiskPersons.Add(persionRiskItem); } } }