public WorkItemMetricsViewModel(WorkItemMetricsModel model) { WorkItemID = model.WorkItemID; WorkItemTitle = model.WorkItemTitle; FormattedDevelopment = model.SumCompletedDev == 0 ? "Not Started" : $"{model.SumCompletedDev} / {model.SumOriginalDev} ({model.DevAccuracy.ToString("P0")})"; FormattedTesting = model.SumCompletedTesting == 0 ? "Not Started" : $"{model.SumCompletedTesting} / {model.SumOriginalTesting} ({model.TestingAccuracy.ToString("P0")})"; FormattedOverall = $"{model.SumCompleted} / {model.SumOriginal} ({model.OverallAccuracy.ToString("P0")})"; Closed = model.Closed; DevelopmentAccuracy = model.DevAccuracy * 100; TestingAccuracy = model.TestingAccuracy * 100; OverallAccuracy = model.OverallAccuracy * 100; }
/// <summary> /// Calculates metrics for a set of work items in a single sprint. /// </summary> /// <param name="workItems"></param> /// <returns></returns> private IEnumerable <WorkItemMetricsModel> CalculateSprintMetrics(IEnumerable <WorkItemModel> workItems) { return(workItems.AsParallel().Where(x => x.IsUserStory).Select(topLevelWorkItem => { var metrics = new WorkItemMetricsModel { WorkItemID = topLevelWorkItem.ID, WorkItemTitle = topLevelWorkItem.Title, Closed = topLevelWorkItem.Closed }; foreach (var childItem in topLevelWorkItem.ChildItems) { if (!childItem.Closed) { continue; } switch (childItem.Activity) { case "Development": metrics.SumCompletedDev += childItem.CompletedWork.GetValueOrDefault(); metrics.SumOriginalDev += childItem.OriginalEstimate.GetValueOrDefault(); break; case "Testing": metrics.SumCompletedTesting += childItem.CompletedWork.GetValueOrDefault(); metrics.SumOriginalTesting += childItem.OriginalEstimate.GetValueOrDefault(); break; } } metrics.SumOriginal = metrics.SumOriginalDev + metrics.SumOriginalTesting; metrics.SumCompleted = metrics.SumCompletedDev + metrics.SumCompletedTesting; if (metrics.SumCompletedDev != 0) { metrics.DevAccuracy = (float)Math.Round(metrics.SumOriginalDev / metrics.SumCompletedDev, 2); } if (metrics.SumCompletedTesting != 0) { metrics.TestingAccuracy = (float)Math.Round(metrics.SumOriginalTesting / metrics.SumCompletedTesting, 2); } if (metrics.SumCompleted != 0) { metrics.OverallAccuracy = (float)Math.Round(metrics.SumOriginal / metrics.SumCompleted, 2); } return metrics; })); }