using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text.Json.Serialization; namespace Adaptation.FileHandlers.Priority; #nullable enable public class WorkItem { [JsonConstructor] public WorkItem(double? costOfDelay, Aggregation? businessValue, Aggregation? effort, int id, int? sortBeforeId, int? sortPriority, int? sortPriorityGroup, Aggregation? riskReductionOpportunityEnablement, string? site, int? sortOrder, Aggregation? timeCriticality, double? weightedShortestJobFirst) { CostOfDelay = costOfDelay; BusinessValue = businessValue; Effort = effort; Id = id; Site = site; SortBeforeId = sortBeforeId; SortPriority = sortPriority; SortPriorityGroup = sortPriorityGroup; RiskReductionOpportunityEnablement = riskReductionOpportunityEnablement; SortOrder = sortOrder; TimeCriticality = timeCriticality; WeightedShortestJobFirst = weightedShortestJobFirst; } const string _PageEffort = "effort"; const string _PageTimeCriticality = "time"; const string _PageBusinessValue = "business"; const string _PageRiskReductionOpportunityEnablement = "risk"; public double? CostOfDelay { get; } // [JsonPropertyName("CostOfDelay")] public Aggregation? BusinessValue { get; } // [JsonPropertyName("BusinessValue")] public Aggregation? Effort { get; } // [JsonPropertyName("Effort")] public int Id { get; } // [JsonPropertyName("Id")] public string? Site { get; } // [JsonPropertyName("Site")] public int? SortBeforeId { get; } // [JsonPropertyName("SortBeforeId")] public int? SortPriority { get; } // [JsonPropertyName("SortPriority")] public int? SortPriorityGroup { get; } // [JsonPropertyName("SortPriorityGroup")] public Aggregation? RiskReductionOpportunityEnablement { get; } // [JsonPropertyName("RiskReductionOpportunityEnablement")] public int? SortOrder { get; } // [JsonPropertyName("SortOrder")] public Aggregation? TimeCriticality { get; } // [JsonPropertyName("TimeCriticality")] public double? WeightedShortestJobFirst { get; } // [JsonPropertyName("WeightedShortestJobFirst")] internal static WorkItem GetWorkItem(WorkItem workItem, int i, int? sortBeforeId, int? sortPriority, int? sortPriorityGroup) => new(workItem.CostOfDelay, workItem.BusinessValue, workItem.Effort, workItem.Id, sortBeforeId, sortPriority, sortPriorityGroup, workItem.RiskReductionOpportunityEnablement, workItem.Site, i, workItem.TimeCriticality, workItem.WeightedShortestJobFirst); private static string? GetSite(Aggregation? effort, Aggregation? businessValue, Aggregation? timeCriticality, Aggregation? riskReductionOpportunityEnablement) { string? result = null; if (result is null && effort is not null) { foreach (Notification notification in effort.Notifications) { if (notification.Site is not null) { result = notification.Site; break; } } } if (result is null && businessValue is not null) { foreach (Notification notification in businessValue.Notifications) { if (notification.Site is not null) { result = notification.Site; break; } } } if (result is null && timeCriticality is not null) { foreach (Notification notification in timeCriticality.Notifications) { if (notification.Site is not null) { result = notification.Site; break; } } } if (result is null && riskReductionOpportunityEnablement is not null) { foreach (Notification notification in riskReductionOpportunityEnablement.Notifications) { if (notification.Site is not null) { result = notification.Site; break; } } } return result; } internal static ReadOnlyDictionary GetWorkItems(Settings settings, ReadOnlyDictionary> keyValuePairs) { Dictionary results = new(); string? site; WorkItem? workItem; double? costOfDelay; Aggregation? effort; List ids = new(); Aggregation? businessValue; Aggregation? timeCriticality; double? weightedShortestJobFirst; Aggregation? riskReductionOpportunityEnablement; Dictionary effortCollection = new(); Dictionary businessValueCollection = new(); Dictionary timeCriticalityCollection = new(); Dictionary riskReductionOpportunityEnablementCollection = new(); foreach (KeyValuePair> keyValuePair in keyValuePairs) { foreach (KeyValuePair keyValue in keyValuePair.Value) { if (!ids.Contains(keyValue.Key)) ids.Add(keyValue.Key); if (keyValuePair.Key == _PageEffort) effortCollection.Add(keyValue.Key, keyValue.Value); else if (keyValuePair.Key == _PageTimeCriticality) timeCriticalityCollection.Add(keyValue.Key, keyValue.Value); else if (keyValuePair.Key == _PageBusinessValue) businessValueCollection.Add(keyValue.Key, keyValue.Value); else if (keyValuePair.Key == _PageRiskReductionOpportunityEnablement) riskReductionOpportunityEnablementCollection.Add(keyValue.Key, keyValue.Value); else throw new NotImplementedException(); } } foreach (int id in ids) { if (!effortCollection.TryGetValue(id, out effort)) effort = null; if (!businessValueCollection.TryGetValue(id, out businessValue)) businessValue = null; if (!timeCriticalityCollection.TryGetValue(id, out timeCriticality)) timeCriticality = null; if (!riskReductionOpportunityEnablementCollection.TryGetValue(id, out riskReductionOpportunityEnablement)) riskReductionOpportunityEnablement = null; site = GetSite(effort, businessValue, timeCriticality, riskReductionOpportunityEnablement); costOfDelay = businessValue is null || timeCriticality is null || riskReductionOpportunityEnablement is null ? null : businessValue.FibonacciAverage + timeCriticality.FibonacciAverage + riskReductionOpportunityEnablement.FibonacciAverage; weightedShortestJobFirst = costOfDelay is null || effort is null ? null : Math.Round(costOfDelay.Value / effort.FibonacciAverage, settings.Digits); workItem = new(costOfDelay: costOfDelay, businessValue: businessValue, effort: effort, id: id, sortBeforeId: null, sortPriority: null, sortPriorityGroup: null, riskReductionOpportunityEnablement: riskReductionOpportunityEnablement, site: site, sortOrder: null, timeCriticality: timeCriticality, weightedShortestJobFirst: weightedShortestJobFirst); results.Add(id, workItem); } return new(results); } internal static ReadOnlyDictionary GetKeyValuePairs(Settings settings) { ReadOnlyDictionary results; ReadOnlyDictionary> keyValuePairs = Aggregation.GetKeyValuePairsAndWriteFiles(settings); results = GetWorkItems(settings, keyValuePairs); return results; } } [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(Dictionary))] internal partial class WorkItemDictionarySourceGenerationContext : JsonSerializerContext { } [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(KeyValuePair))] internal partial class KeyValuePairStringWorkItemSourceGenerationContext : JsonSerializerContext { }