WorkItem more

This commit is contained in:
Mike Phares 2024-09-06 16:23:27 -07:00
parent c7bcb4a5ea
commit 9c6740becb
6 changed files with 180 additions and 148 deletions

8
.vscode/launch.json vendored
View File

@ -13,8 +13,8 @@
"args": [ "args": [
"s", "s",
"X", "X",
"T:/MESAFIBACKLOG/06_SourceCode/MESAFIBACKLOG/Adaptation/.vscode/helper", "L:/DevOps/Mesa_FI/File-Folder-Helper/.vscode/helper/tfs",
"Day-Helper-2024-08-09", "Day-Helper-2024-08-30",
"MES", "MES",
"https://tfs.intra.infineon.com", "https://tfs.intra.infineon.com",
"/tfs/FactoryIntegration", "/tfs/FactoryIntegration",
@ -22,9 +22,7 @@
"/0d06e969-e1f5-4835-a359-620d557c7595/_apis/wit", "/0d06e969-e1f5-4835-a359-620d557c7595/_apis/wit",
"/wiql/3373b300-8de3-4301-9795-e990c3b226f9", "/wiql/3373b300-8de3-4301-9795-e990c3b226f9",
"4n7d2jcql6bkq32f66tohddonfxajkypq66lm5y3zqemtlohawsa", "4n7d2jcql6bkq32f66tohddonfxajkypq66lm5y3zqemtlohawsa",
"FI Backlog Mesa - Request List.json", "FI Backlog Mesa - Request List.json"
"Chase|infineon\\TuckerC,Dakota(SRP)|infineon\\Mitchem,Daniel|infineon\\StieberD,Jonathan|infineon\\Ouellette,Mike|infineon\\Phares",
"Chad B|infineon\\cbecker1,Debra Q|infineon\\Quinones,Jeanne M|infineon\\jmcinty2,Jessica F|infineon\\jfuente1,Jonathon S|infineon\\jsperli1,Justin H|infineon\\jhollan2,Kelly C|infineon\\kclark1,Mark C|infineon\\mcouste1,Marti J|infineon\\mjarsey1,Nik C|infineon\\nclark1,Peyton M|infineon\\McChesne,Ron O|infineon\\HendersS,Susan H|infineon\\HendersS,Tiffany M|infineon\\tmunoz1,Todd C|infineon\\tcarrie1"
], ],
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
"console": "integratedTerminal", "console": "integratedTerminal",

View File

@ -37,6 +37,8 @@
"SUBM", "SUBM",
"SURN", "SURN",
"SYSLIB", "SYSLIB",
"WIQL" "VSTS",
"WIQL",
"WSJF"
] ]
} }

View File

@ -582,7 +582,7 @@ internal static partial class Helper20240809
Update(httpClient, basePage, api, workItemTrackingHttpClient, sync, valueWithReq); Update(httpClient, basePage, api, workItemTrackingHttpClient, sync, valueWithReq);
continue; continue;
} }
if (!isBugFix && int.TryParse(fiBacklogMesa.EstEffortDays, out int estEffortDays) && valueWithReq.Value.Fields.Effort != estEffortDays) if (!isBugFix && int.TryParse(fiBacklogMesa.EstEffortDays, out int estEffortDays) && valueWithReq.Value.Fields.MicrosoftVSTSSchedulingEffort != estEffortDays)
{ {
result += 1; result += 1;
Update(httpClient, basePage, api, workItemTrackingHttpClient, sync, valueWithReq); Update(httpClient, basePage, api, workItemTrackingHttpClient, sync, valueWithReq);
@ -591,7 +591,7 @@ internal static partial class Helper20240809
dateTime = GetCommitDate(fiBacklogMesa); dateTime = GetCommitDate(fiBacklogMesa);
if (dateTime is not null) if (dateTime is not null)
{ {
timeSpan = new(valueWithReq.Value.Fields.TargetDate.Ticks - dateTime.Value.Ticks); timeSpan = new(valueWithReq.Value.Fields.MicrosoftVSTSSchedulingTargetDate.Ticks - dateTime.Value.Ticks);
if (timeSpan.Hours is > 32 or < -32) if (timeSpan.Hours is > 32 or < -32)
{ {
result += 1; result += 1;

View File

@ -14,8 +14,30 @@ namespace File_Folder_Helper.Day.Q32024;
internal static partial class Helper20240830 internal static partial class Helper20240830
{ {
public record WorkItem(string? AssignedTo,
int? BusinessValue,
DateTime ChangedDate,
int CommentCount,
DateTime CreatedDate,
string Description,
float? Effort,
int Id,
int? Priority,
string? Requester,
int Revision,
int? RiskReductionMinusOpportunityEnablement,
DateTime? StartDate,
string State,
string Tags,
DateTime? TargetDate,
float? TimeCriticality,
string Title,
string WorkItemType,
float? WeightedShortestJobFirst);
private static string GetIds(HttpClient httpClient, string basePage, string api, string query) private static string GetIds(HttpClient httpClient, string basePage, string api, string query)
{ {
List<int> results = [];
StringBuilder result = new(); StringBuilder result = new();
Task<HttpResponseMessage> httpResponseMessageTask = httpClient.GetAsync(string.Concat(basePage, api, query)); Task<HttpResponseMessage> httpResponseMessageTask = httpClient.GetAsync(string.Concat(basePage, api, query));
httpResponseMessageTask.Wait(); httpResponseMessageTask.Wait();
@ -30,13 +52,19 @@ internal static partial class Helper20240830
if (root is null || root.WorkItems is null) if (root is null || root.WorkItems is null)
throw new NullReferenceException(nameof(root)); throw new NullReferenceException(nameof(root));
foreach (WIQL.WorkItem workItem in root.WorkItems) foreach (WIQL.WorkItem workItem in root.WorkItems)
_ = result.Append(workItem.Id).Append(','); {
results.Add(workItem.Id);
if (results.Count > 199)
break;
}
foreach (int id in results)
_ = result.Append(id).Append(',');
if (result.Length > 0) if (result.Length > 0)
_ = result.Remove(result.Length - 1, 1); _ = result.Remove(result.Length - 1, 1);
return result.ToString(); return result.ToString();
} }
private static ReadOnlyCollection<ValueWithReq> GetWorkItems(HttpClient httpClient, string basePage, string api, string sourceDirectory, string ids) private static ReadOnlyCollection<ValueWithReq> GetWorkItems(HttpClient httpClient, string basePage, string api, string targetFileLocation, string ids)
{ {
List<ValueWithReq> results = []; List<ValueWithReq> results = [];
string json; string json;
@ -66,7 +94,7 @@ internal static partial class Helper20240830
value = JsonSerializer.Deserialize(json, ValueSourceGenerationContext.Default.Value); value = JsonSerializer.Deserialize(json, ValueSourceGenerationContext.Default.Value);
if (value is null) if (value is null)
continue; continue;
file = Path.Combine(sourceDirectory, $"{-1}-{value.Id}.json"); file = Path.Combine(targetFileLocation, $"{-1}-{value.Id}.json");
File.WriteAllText(file, json); File.WriteAllText(file, json);
results.Add(new(value, -1, json)); results.Add(new(value, -1, json));
} }
@ -74,7 +102,41 @@ internal static partial class Helper20240830
return new(results); return new(results);
} }
private static ReadOnlyCollection<WorkItem> GetWorkItems(ReadOnlyCollection<ValueWithReq> valueWithReqCollection)
{
List<WorkItem> results = [];
Fields fields;
WorkItem workItem;
foreach (ValueWithReq valueWithReq in valueWithReqCollection)
{
fields = valueWithReq.Value.Fields;
workItem = new(fields.SystemAssignedTo?.DisplayName,
fields.MicrosoftVSTSCommonBusinessValue == 0 ? null : fields.MicrosoftVSTSCommonBusinessValue,
fields.SystemChangedDate,
fields.SystemCommentCount,
fields.SystemCreatedDate,
fields.SystemDescription,
fields.MicrosoftVSTSSchedulingEffort == 0 ? null : fields.MicrosoftVSTSSchedulingEffort,
valueWithReq.Value.Id,
fields.MicrosoftVSTSCommonPriority == 0 ? null : fields.MicrosoftVSTSCommonPriority,
fields.CustomRequester?.DisplayName,
valueWithReq.Value.Rev,
fields.CustomRRminusOE == 0 ? null : fields.CustomRRminusOE,
fields.MicrosoftVSTSSchedulingStartDate == DateTime.MinValue ? null : fields.MicrosoftVSTSSchedulingStartDate,
fields.SystemState,
fields.SystemTags,
fields.MicrosoftVSTSSchedulingTargetDate == DateTime.MinValue ? null : fields.MicrosoftVSTSSchedulingTargetDate,
fields.MicrosoftVSTSCommonTimeCriticality == 0 ? null : fields.MicrosoftVSTSCommonTimeCriticality,
fields.SystemTitle,
fields.SystemWorkItemType,
fields.CustomWSJF == 0 ? null : fields.CustomWSJF);
results.Add(workItem);
}
return new(results);
}
private static void CompareWorkItems(WorkItemTrackingHttpClient workItemTrackingHttpClient, private static void CompareWorkItems(WorkItemTrackingHttpClient workItemTrackingHttpClient,
string sourceDirectory,
string project, string project,
string site, string site,
ReadOnlyCollection<ValueWithReq> valueWithReqCollection) ReadOnlyCollection<ValueWithReq> valueWithReqCollection)
@ -82,14 +144,24 @@ internal static partial class Helper20240830
ArgumentNullException.ThrowIfNull(workItemTrackingHttpClient); ArgumentNullException.ThrowIfNull(workItemTrackingHttpClient);
if (string.IsNullOrEmpty(project)) if (string.IsNullOrEmpty(project))
throw new ArgumentException($"'{nameof(project)}' cannot be null or empty.", nameof(project)); throw new ArgumentException($"'{nameof(project)}' cannot be null or empty.", nameof(project));
if (string.IsNullOrEmpty(sourceDirectory))
throw new ArgumentException($"'{nameof(sourceDirectory)}' cannot be null or empty.", nameof(site));
if (string.IsNullOrEmpty(site)) if (string.IsNullOrEmpty(site))
throw new ArgumentException($"'{nameof(site)}' cannot be null or empty.", nameof(site)); throw new ArgumentException($"'{nameof(site)}' cannot be null or empty.", nameof(site));
ArgumentNullException.ThrowIfNull(valueWithReqCollection); ReadOnlyCollection<WorkItem> workItems = GetWorkItems(valueWithReqCollection);
string file = Path.Combine(sourceDirectory, $"_.json");
string json = JsonSerializer.Serialize(workItems);
File.WriteAllText(file, json);
foreach (WorkItem workItem in workItems)
{
if (workItem is null)
{ }
}
// https://stackoverflow.com/questions/18153998/how-do-i-remove-all-html-tags-from-a-string-without-knowing-which-tags-are-in-it // https://stackoverflow.com/questions/18153998/how-do-i-remove-all-html-tags-from-a-string-without-knowing-which-tags-are-in-it
} }
private static void CompareWorkItems(HttpClient httpClient, private static void CompareWorkItems(HttpClient httpClient,
string sourceDirectory, string targetFileLocation,
string basePage, string basePage,
string api, string api,
string query, string query,
@ -98,11 +170,11 @@ internal static partial class Helper20240830
string site) string site)
{ {
string ids = GetIds(httpClient, basePage, api, query); string ids = GetIds(httpClient, basePage, api, query);
ReadOnlyCollection<ValueWithReq> valueWithReqCollection = string.IsNullOrEmpty(ids) ? new([]) : GetWorkItems(httpClient, basePage, api, sourceDirectory, ids); ReadOnlyCollection<ValueWithReq> valueWithReqCollection = string.IsNullOrEmpty(ids) ? new([]) : GetWorkItems(httpClient, basePage, api, targetFileLocation, ids);
CompareWorkItems(workItemTrackingHttpClient, project, site, valueWithReqCollection); CompareWorkItems(workItemTrackingHttpClient, targetFileLocation, project, site, valueWithReqCollection);
} }
private static void CreateWorkItems(ILogger<Worker> logger, string sourceDirectory, string api, string site, string query, string project, string basePage, string baseAddress, byte[] bytes, MediaTypeWithQualityHeaderValue mediaTypeWithQualityHeaderValue, WorkItemTrackingHttpClient workItemTrackingHttpClient, HttpClient httpClient) private static void CompareWorkItems(ILogger<Worker> logger, string sourceDirectory, string api, string site, string query, string project, string basePage, string baseAddress, byte[] bytes, MediaTypeWithQualityHeaderValue mediaTypeWithQualityHeaderValue, WorkItemTrackingHttpClient workItemTrackingHttpClient, HttpClient httpClient)
{ {
string base64 = Convert.ToBase64String(bytes); string base64 = Convert.ToBase64String(bytes);
httpClient.DefaultRequestHeaders.Authorization = new("Basic", base64); httpClient.DefaultRequestHeaders.Authorization = new("Basic", base64);
@ -127,7 +199,7 @@ internal static partial class Helper20240830
MediaTypeWithQualityHeaderValue mediaTypeWithQualityHeaderValue = new("application/json"); MediaTypeWithQualityHeaderValue mediaTypeWithQualityHeaderValue = new("application/json");
WorkItemTrackingHttpClient workItemTrackingHttpClient = connection.GetClient<WorkItemTrackingHttpClient>(); WorkItemTrackingHttpClient workItemTrackingHttpClient = connection.GetClient<WorkItemTrackingHttpClient>();
HttpClient httpClient = new(new HttpClientHandler() { UseDefaultCredentials = true }) { BaseAddress = new(baseAddress) }; HttpClient httpClient = new(new HttpClientHandler() { UseDefaultCredentials = true }) { BaseAddress = new(baseAddress) };
CreateWorkItems(logger, sourceDirectory, api, site, query, project, basePage, baseAddress, bytes, mediaTypeWithQualityHeaderValue, workItemTrackingHttpClient, httpClient); CompareWorkItems(logger, sourceDirectory, api, site, query, project, basePage, baseAddress, bytes, mediaTypeWithQualityHeaderValue, workItemTrackingHttpClient, httpClient);
} }
} }

View File

@ -6,42 +6,29 @@ public class CustomRequester
{ {
[JsonConstructor] [JsonConstructor]
public CustomRequester( public CustomRequester(
string descriptor,
string displayName, string displayName,
string url,
Links links,
string id, string id,
string uniqueName,
string imageUrl, string imageUrl,
string descriptor Links links,
string uniqueName,
string url
) )
{ {
DisplayName = displayName;
Url = url;
Links = links;
Id = id;
UniqueName = uniqueName;
ImageUrl = imageUrl;
Descriptor = descriptor; Descriptor = descriptor;
DisplayName = displayName;
Id = id;
ImageUrl = imageUrl;
Links = links;
UniqueName = uniqueName;
Url = url;
} }
[JsonPropertyName("displayName")] [JsonPropertyName("descriptor")] public string Descriptor { get; }
public string DisplayName { get; } [JsonPropertyName("displayName")] public string DisplayName { get; }
[JsonPropertyName("id")] public string Id { get; }
[JsonPropertyName("url")] [JsonPropertyName("imageUrl")] public string ImageUrl { get; }
public string Url { get; } [JsonPropertyName("_links")] public Links Links { get; }
[JsonPropertyName("uniqueName")] public string UniqueName { get; }
[JsonPropertyName("_links")] [JsonPropertyName("url")] public string Url { get; }
public Links Links { get; }
[JsonPropertyName("id")]
public string Id { get; }
[JsonPropertyName("uniqueName")]
public string UniqueName { get; }
[JsonPropertyName("imageUrl")]
public string ImageUrl { get; }
[JsonPropertyName("descriptor")]
public string Descriptor { get; }
} }

View File

@ -5,113 +5,86 @@ namespace File_Folder_Helper.Day.Q32024.WorkItems;
public class Fields public class Fields
{ {
[JsonConstructor] [JsonConstructor]
public Fields( public Fields(int customRRminusOE,
string systemAreaPath, CustomRequester? customRequester,
string systemTeamProject, float customWSJF,
string systemIterationPath, float? microsoftVSTSSchedulingEffort,
string systemWorkItemType, int microsoftVSTSCommonBusinessValue,
string systemState, int microsoftVSTSCommonPriority,
string systemReason, DateTime microsoftVSTSCommonStateChangeDate,
CustomRequester customRequester, float microsoftVSTSCommonTimeCriticality,
SystemAssignedTo systemAssignedTo, DateTime microsoftVSTSSchedulingStartDate,
DateTime systemCreatedDate, string systemAreaPath,
SystemCreatedBy systemCreatedBy, SystemAssignedTo systemAssignedTo,
DateTime systemChangedDate, SystemChangedBy systemChangedBy,
SystemChangedBy systemChangedBy, DateTime systemChangedDate,
int systemCommentCount, int systemCommentCount,
string systemTitle, SystemCreatedBy systemCreatedBy,
DateTime microsoftVSTSCommonStateChangeDate, DateTime systemCreatedDate,
int microsoftVSTSCommonPriority, string systemDescription,
string systemDescription, string systemHistory,
string systemTags, string systemIterationPath,
string systemHistory, string systemReason,
float? effort, string systemState,
DateTime targetDate string systemTags,
) string systemTeamProject,
string systemTitle,
string systemWorkItemType,
DateTime microsoftVSTSSchedulingTargetDate)
{ {
SystemAreaPath = systemAreaPath; CustomRRminusOE = customRRminusOE;
SystemTeamProject = systemTeamProject;
SystemIterationPath = systemIterationPath;
SystemWorkItemType = systemWorkItemType;
SystemState = systemState;
SystemReason = systemReason;
CustomRequester = customRequester; CustomRequester = customRequester;
SystemAssignedTo = systemAssignedTo; CustomWSJF = customWSJF;
SystemCreatedDate = systemCreatedDate; MicrosoftVSTSSchedulingEffort = microsoftVSTSSchedulingEffort;
SystemCreatedBy = systemCreatedBy; MicrosoftVSTSCommonBusinessValue = microsoftVSTSCommonBusinessValue;
SystemChangedDate = systemChangedDate;
SystemChangedBy = systemChangedBy;
SystemCommentCount = systemCommentCount;
SystemTitle = systemTitle;
MicrosoftVSTSCommonStateChangeDate = microsoftVSTSCommonStateChangeDate;
MicrosoftVSTSCommonPriority = microsoftVSTSCommonPriority; MicrosoftVSTSCommonPriority = microsoftVSTSCommonPriority;
MicrosoftVSTSCommonStateChangeDate = microsoftVSTSCommonStateChangeDate;
MicrosoftVSTSCommonTimeCriticality = microsoftVSTSCommonTimeCriticality;
MicrosoftVSTSSchedulingStartDate = microsoftVSTSSchedulingStartDate;
SystemAreaPath = systemAreaPath;
SystemAssignedTo = systemAssignedTo;
SystemChangedBy = systemChangedBy;
SystemChangedDate = systemChangedDate;
SystemCommentCount = systemCommentCount;
SystemCreatedBy = systemCreatedBy;
SystemCreatedDate = systemCreatedDate;
SystemDescription = systemDescription; SystemDescription = systemDescription;
SystemTags = systemTags;
SystemHistory = systemHistory; SystemHistory = systemHistory;
Effort = effort; SystemIterationPath = systemIterationPath;
TargetDate = targetDate; SystemReason = systemReason;
SystemState = systemState;
SystemTags = systemTags;
SystemTeamProject = systemTeamProject;
SystemTitle = systemTitle;
SystemWorkItemType = systemWorkItemType;
MicrosoftVSTSSchedulingTargetDate = microsoftVSTSSchedulingTargetDate;
} }
[JsonPropertyName("System.AreaPath")] [JsonPropertyName("Custom.RRminusOE")] public int CustomRRminusOE { get; } // { init; get; }
public string SystemAreaPath { get; } // { init; get; } [JsonPropertyName("Custom.Requester")] public CustomRequester? CustomRequester { get; } // { init; get; }
[JsonPropertyName("Custom.WSJF")] public float CustomWSJF { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Scheduling.Effort")] public float? MicrosoftVSTSSchedulingEffort { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Common.BusinessValue")] public int MicrosoftVSTSCommonBusinessValue { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Common.Priority")] public int MicrosoftVSTSCommonPriority { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Common.StateChangeDate")] public DateTime MicrosoftVSTSCommonStateChangeDate { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Common.TimeCriticality")] public float MicrosoftVSTSCommonTimeCriticality { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Scheduling.StartDate")] public DateTime MicrosoftVSTSSchedulingStartDate { get; } // { init; get; }
[JsonPropertyName("System.AreaPath")] public string SystemAreaPath { get; } // { init; get; }
[JsonPropertyName("System.AssignedTo")] public SystemAssignedTo? SystemAssignedTo { get; } // { init; get; }
[JsonPropertyName("System.ChangedBy")] public SystemChangedBy SystemChangedBy { get; } // { init; get; }
[JsonPropertyName("System.ChangedDate")] public DateTime SystemChangedDate { get; } // { init; get; }
[JsonPropertyName("System.CommentCount")] public int SystemCommentCount { get; } // { init; get; }
[JsonPropertyName("System.CreatedBy")] public SystemCreatedBy SystemCreatedBy { get; } // { init; get; }
[JsonPropertyName("System.CreatedDate")] public DateTime SystemCreatedDate { get; } // { init; get; }
[JsonPropertyName("System.Description")] public string SystemDescription { get; } // { init; get; }
[JsonPropertyName("System.History")] public string SystemHistory { get; } // { init; get; }
[JsonPropertyName("System.IterationPath")] public string SystemIterationPath { get; } // { init; get; }
[JsonPropertyName("System.Reason")] public string SystemReason { get; } // { init; get; }
[JsonPropertyName("System.State")] public string SystemState { get; } // { init; get; }
[JsonPropertyName("System.Tags")] public string SystemTags { get; } // { init; get; }
[JsonPropertyName("System.TeamProject")] public string SystemTeamProject { get; } // { init; get; }
[JsonPropertyName("System.Title")] public string SystemTitle { get; } // { init; get; }
[JsonPropertyName("System.WorkItemType")] public string SystemWorkItemType { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Scheduling.TargetDate")] public DateTime MicrosoftVSTSSchedulingTargetDate { get; } // { init; get; }
[JsonPropertyName("System.TeamProject")]
public string SystemTeamProject { get; } // { init; get; }
[JsonPropertyName("System.IterationPath")]
public string SystemIterationPath { get; } // { init; get; }
[JsonPropertyName("System.WorkItemType")]
public string SystemWorkItemType { get; } // { init; get; }
[JsonPropertyName("System.State")]
public string SystemState { get; } // { init; get; }
[JsonPropertyName("System.Reason")]
public string SystemReason { get; } // { init; get; }
[JsonPropertyName("Custom.Requester")]
public CustomRequester CustomRequester { get; } // { init; get; }
[JsonPropertyName("System.AssignedTo")]
public SystemAssignedTo SystemAssignedTo { get; } // { init; get; }
[JsonPropertyName("System.CreatedDate")]
public DateTime SystemCreatedDate { get; } // { init; get; }
[JsonPropertyName("System.CreatedBy")]
public SystemCreatedBy SystemCreatedBy { get; } // { init; get; }
[JsonPropertyName("System.ChangedDate")]
public DateTime SystemChangedDate { get; } // { init; get; }
[JsonPropertyName("System.ChangedBy")]
public SystemChangedBy SystemChangedBy { get; } // { init; get; }
[JsonPropertyName("System.CommentCount")]
public int SystemCommentCount { get; } // { init; get; }
[JsonPropertyName("System.Title")]
public string SystemTitle { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Common.StateChangeDate")]
public DateTime MicrosoftVSTSCommonStateChangeDate { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Common.Priority")]
public int MicrosoftVSTSCommonPriority { get; } // { init; get; }
[JsonPropertyName("System.Description")]
public string SystemDescription { get; } // { init; get; }
[JsonPropertyName("System.Tags")]
public string SystemTags { get; } // { init; get; }
[JsonPropertyName("System.History")]
public string SystemHistory { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Scheduling.Effort")]
public float? Effort { get; } // { init; get; }
[JsonPropertyName("Microsoft.VSTS.Scheduling.TargetDate")]
public DateTime TargetDate { get; } // { init; get; }
} }