-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWorkItem.cs
More file actions
128 lines (110 loc) · 4.42 KB
/
WorkItem.cs
File metadata and controls
128 lines (110 loc) · 4.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using AzureDevopsStateTracker.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AzureDevopsStateTracker.Entities
{
public class WorkItem : Entity
{
public string AreaPath { get; private set; }
public string TeamProject { get; private set; }
public string IterationPath { get; private set; }
public string AssignedTo { get; private set; }
public string Type { get; private set; }
public string CreatedBy { get; private set; }
public string Title { get; private set; }
public string Tags { get; private set; }
public string Effort { get; private set; }
public string OriginalEstimate { get; private set; }
public string StoryPoints { get; private set; }
public string WorkItemParentId { get; private set; }
public string Activity { get; private set; }
private readonly List<WorkItemChange> _workItemsChanges;
public IReadOnlyCollection<WorkItemChange> WorkItemsChanges => _workItemsChanges;
private readonly List<TimeByState> _timeByState;
public IReadOnlyCollection<TimeByState> TimeByStates => _timeByState;
public string CurrentStatus => _workItemsChanges?.OrderBy(x => x.CreatedAt)?.LastOrDefault()?.NewState;
private WorkItem()
{
_workItemsChanges = new List<WorkItemChange>();
_timeByState = new List<TimeByState>();
}
public WorkItem(string workItemId) : base(workItemId)
{
_workItemsChanges = new List<WorkItemChange>();
_timeByState = new List<TimeByState>();
Validate();
}
public void Update(string title,
string teamProject, string areaPath,
string iterationPath, string type,
string createdBy, string assignedTo,
string tags,
string workItemParentId,
string effort,
string storyPoint,
string originalEstimate,
string activity)
{
TeamProject = teamProject;
AreaPath = areaPath;
IterationPath = iterationPath;
Type = type;
Title = title;
CreatedBy = createdBy;
AssignedTo = assignedTo;
Tags = tags;
WorkItemParentId = workItemParentId;
Effort = effort;
StoryPoints = storyPoint;
OriginalEstimate = originalEstimate;
Activity = activity;
}
public void Validate()
{
if (Id.IsNullOrEmpty())
throw new Exception("WorkItemId is required");
}
public void AddWorkItemChange(WorkItemChange workItemChange)
{
if (workItemChange == null)
throw new Exception("WorkItemChange is null");
_workItemsChanges.Add(workItemChange);
}
public void AddTimeByState(TimeByState timeByState)
{
if (timeByState == null)
throw new Exception("TimeByState is null");
_timeByState.Add(timeByState);
}
public void AddTimesByState(IEnumerable<TimeByState> timesByState)
{
if (!timesByState.Any())
return;
foreach (var timeByState in timesByState)
AddTimeByState(timeByState);
}
public void ClearTimesByState()
{
_timeByState.Clear();
}
public IEnumerable<TimeByState> CalculateTotalTimeByState()
{
var timesByStateList = new List<TimeByState>();
if (!_workItemsChanges.Any())
return timesByStateList;
foreach (var workItemChange in _workItemsChanges.OrderBy(x => x.CreatedAt).GroupBy(x => x.OldState).Where(x => x.Key != null))
{
var totalTime = TimeSpan.Zero;
var totalWorkedTime = TimeSpan.Zero;
foreach (var data in workItemChange)
{
totalTime += data.CalculateTotalTime();
totalWorkedTime += data.CalculateTotalWorkedTime();
}
timesByStateList.Add(new TimeByState(Id, workItemChange.Key, totalTime, totalWorkedTime));
}
return timesByStateList;
}
}
}