async Task Update() { message.Text = "Updating from Jazz"; var dataTask = Task.Run(() => LoadData()); var sprint = (await Get(new UriBuilder("https://clm1.waters.com/ccm/rpt/repository/foundation") { Query = $"fields=foundation/developmentLine[name=%27{Uri.EscapeDataString("Acquisition")}%27]/currentIteration/(itemId|startDate|endDate|name)" }.Uri)).Elements("foundation").Elements("developmentLine").Elements("currentIteration").FirstOrDefault(); if (sprint == null) { throw new ApplicationException("No current sprint not found"); } var sprintId = (string)sprint.Element("itemId"); var startDate = ParseDateTimeOffset(sprint.Element("startDate")); var endDate = ParseDateTimeOffset(sprint.Element("endDate")); var sprintName = (string)sprint.Element("name"); var workItems = (await Get(new UriBuilder("https://clm1.waters.com/ccm/rpt/repository/workitem") { Query = $"fields=workitem/workItem[target/itemId=%27{Uri.EscapeDataString(sprintId)}%27]/(integerComplexity|state/group)" }.Uri)).Elements("workitem").Elements("workItem"); var data = await dataTask; data.Name = sprintName; // +1 for the last day var rawDuration = (endDate.Date - startDate.Date).Days + 1; data.Duration = Enumerable.Range(0, rawDuration).Select(i => startDate.AddDays(i)) .Count(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday); var checkpoint = new SprintCheckpoint { Time = DateTimeOffset.Now }; foreach (var item in workItems) { var points = (int)item.Element("integerComplexity"); var completed = (string)item.Elements("state").Elements("group").Single() == "closed"; checkpoint.Total += points; if (completed) { checkpoint.Done += points; } } data.Checkpoints.RemoveAll(c => c.Time.Date == checkpoint.Time.Date); data.Checkpoints.Add(checkpoint); var saveTask = Task.Run(() => SaveData(data)); Render(data); await saveTask; }
void Render(SprintData data) { var model = new PlotModel { Title = data.Name, Axes = { new CategoryAxis { Title = "Day", Position = AxisPosition.Bottom }, new LinearAxis { Title = "Points", Position = AxisPosition.Left, MinorGridlineStyle = LineStyle.Solid, MajorGridlineStyle = LineStyle.Solid, MinimumPadding = 0.0, MaximumPadding = 0.1 } }, IsLegendVisible = true, LegendPlacement = LegendPlacement.Outside }; var sustain = new SprintCheckpoint { Done = 0, Total = data.Checkpoints.Select(c => c.Total).LastOrDefault() }; var days = data.Checkpoints.Concat(Enumerable.Repeat(sustain, data.Duration - data.Checkpoints.Count)); var completedSeries = new ColumnSeries { Title = "Done" }; foreach (var day in days) { completedSeries.Items.Add(new ColumnItem(day.Done)); } model.Series.Add(completedSeries); var totalSeries = new LineSeries { Title = "Scope" }; var i = 0; foreach (var day in days) { totalSeries.Points.Add(new DataPoint(i++, day.Total)); } model.Series.Add(totalSeries); this.plot.Model = model; }