diff --git a/F4SDM42WebApi/F4SDHelperService.UserId.cs b/F4SDM42WebApi/F4SDHelperService.UserId.cs index 0749414..6e50578 100644 --- a/F4SDM42WebApi/F4SDHelperService.UserId.cs +++ b/F4SDM42WebApi/F4SDHelperService.UserId.cs @@ -117,7 +117,7 @@ namespace C4IT.F4SD var source = !useRoleScope && IsUnassignedOverviewKey(key) ? unassignedEntries ?? new List() : entries; - counts[key] = source.Count(entry => MatchesTicketOverviewKey(entry, key)); + counts[key] = CountTicketOverviewEntries(source, key); } return new TicketOverviewCountsResult { Counts = counts }; diff --git a/F4SDM42WebApi/F4SDHelperService.cs b/F4SDM42WebApi/F4SDHelperService.cs index da035bd..39ab77b 100644 --- a/F4SDM42WebApi/F4SDHelperService.cs +++ b/F4SDM42WebApi/F4SDHelperService.cs @@ -305,12 +305,17 @@ namespace C4IT.F4SD "TicketsActive", "TicketsCritical", "TicketsNewInfo", - "IncidentNew", - "IncidentActive", - "IncidentCritical", - "IncidentNewInfo", - "UnassignedTickets", - "UnassignedTicketsCritical" + "IncidentNew", + "IncidentActive", + "IncidentCritical", + "IncidentNewInfo", + "ServiceRequestsNew", + "ServiceRequestsActive", + "ServiceRequestsCritical", + "ServiceRequestsNewInfo", + "UnassignedTickets", + "UnassignedTicketsCritical", + "ServiceRequestsEnabled" }; public class TicketOverviewCountsResult @@ -396,12 +401,11 @@ namespace C4IT.F4SD { if (!useRoleScope && IsUnassignedOverviewKey(key)) { - counts[key] = (unassignedEntries ?? new List()) - .Count(entry => MatchesTicketOverviewKey(entry, key)); - } - else - { - counts[key] = entries.Count(entry => MatchesTicketOverviewKey(entry, key)); + counts[key] = CountTicketOverviewEntries(unassignedEntries, key); + } + else + { + counts[key] = CountTicketOverviewEntries(entries, key); } } @@ -458,7 +462,7 @@ namespace C4IT.F4SD var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var key in normalizedKeys) { - counts[key] = roleEntries.Count(entry => MatchesTicketOverviewKey(entry, key)); + counts[key] = CountTicketOverviewEntries(roleEntries, key); } countsByRole[roleId.ToString()] = counts; @@ -929,13 +933,16 @@ namespace C4IT.F4SD } } - private static bool MatchesTicketOverviewKey(TicketOverviewEntry entry, string key) - { - if (entry == null || string.IsNullOrWhiteSpace(key)) - return false; - - var isTicket = !entry.IsIncident; - var hasPerson = entry.RecipientId != Guid.Empty; + private static bool MatchesTicketOverviewKey(TicketOverviewEntry entry, string key) + { + if (entry == null || string.IsNullOrWhiteSpace(key)) + return false; + + // TODO: Fachlich klaeren, ob Service Requests zusaetzlich unter "Tickets" aggregiert werden sollen. + var isTicket = string.Equals(entry.ActivityType, "SPSActivityTypeTicket", StringComparison.OrdinalIgnoreCase) + || (!entry.IsIncident && string.IsNullOrWhiteSpace(entry.ActivityType)); + var isServiceRequest = string.Equals(entry.ActivityType, "SPSActivityTypeServiceRequest", StringComparison.OrdinalIgnoreCase); + var hasPerson = entry.RecipientId != Guid.Empty; var hasRole = entry.RecipientRoleId != Guid.Empty; var isCritical = entry.ReactionTimeEscalated || entry.SolutionTimeEscalated; var isNew = entry.State == 200; @@ -957,16 +964,33 @@ namespace C4IT.F4SD return entry.IsIncident && isActive; case "IncidentCritical": return entry.IsIncident && isCritical; - case "IncidentNewInfo": - return entry.IsIncident && entry.NewInformationReceived; - case "UnassignedTickets": - return !hasPerson && hasRole && isNew; + case "IncidentNewInfo": + return entry.IsIncident && entry.NewInformationReceived; + case "ServiceRequestsNew": + return isServiceRequest && (entry.State == 200 || entry.State == 201); + case "ServiceRequestsActive": + return isServiceRequest && isActive; + case "ServiceRequestsCritical": + return isServiceRequest && isCritical; + case "ServiceRequestsNewInfo": + return isServiceRequest && entry.NewInformationReceived; + case "UnassignedTickets": + return !hasPerson && hasRole && isNew; case "UnassignedTicketsCritical": return !hasPerson && hasRole && isCritical; default: return false; - } - } + } + } + + private static int CountTicketOverviewEntries(IEnumerable entries, string key) + { + if (string.Equals(key?.Trim(), "ServiceRequestsEnabled", StringComparison.OrdinalIgnoreCase)) + return ticketAndServiceRequestEnabled() ? 1 : 0; + + return (entries ?? Enumerable.Empty()) + .Count(entry => MatchesTicketOverviewKey(entry, key)); + } private static bool GetBoolValue(object value) { diff --git a/Legacy/F4SDM42WebApi/F4SDHelperService.cs b/Legacy/F4SDM42WebApi/F4SDHelperService.cs index 3f60c2d..5804a0e 100644 --- a/Legacy/F4SDM42WebApi/F4SDHelperService.cs +++ b/Legacy/F4SDM42WebApi/F4SDHelperService.cs @@ -388,8 +388,13 @@ namespace C4IT.F4SD "IncidentActive", "IncidentCritical", "IncidentNewInfo", + "ServiceRequestsNew", + "ServiceRequestsActive", + "ServiceRequestsCritical", + "ServiceRequestsNewInfo", "UnassignedTickets", - "UnassignedTicketsCritical" + "UnassignedTicketsCritical", + "ServiceRequestsEnabled" }; public class cF4SDTicket : cF4SDTicketSummary @@ -532,12 +537,11 @@ namespace C4IT.F4SD { if (!useRoleScope && IsUnassignedOverviewKey(key)) { - counts[key] = (unassignedEntries ?? new List()) - .Count(entry => MatchesTicketOverviewKey(entry, key)); + counts[key] = CountTicketOverviewEntries(unassignedEntries, key); } else { - counts[key] = entries.Count(entry => MatchesTicketOverviewKey(entry, key)); + counts[key] = CountTicketOverviewEntries(entries, key); } } @@ -589,12 +593,11 @@ namespace C4IT.F4SD { if (!useRoleScope && IsUnassignedOverviewKey(key)) { - counts[key] = (unassignedEntries ?? new List()) - .Count(entry => MatchesTicketOverviewKey(entry, key)); + counts[key] = CountTicketOverviewEntries(unassignedEntries, key); } else { - counts[key] = entries.Count(entry => MatchesTicketOverviewKey(entry, key)); + counts[key] = CountTicketOverviewEntries(entries, key); } } @@ -652,7 +655,7 @@ namespace C4IT.F4SD var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var key in normalizedKeys) { - counts[key] = roleEntries.Count(entry => MatchesTicketOverviewKey(entry, key)); + counts[key] = CountTicketOverviewEntries(roleEntries, key); } countsByRole[roleId.ToString()] = counts; @@ -715,7 +718,7 @@ namespace C4IT.F4SD var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var key in normalizedKeys) { - counts[key] = roleEntries.Count(entry => MatchesTicketOverviewKey(entry, key)); + counts[key] = CountTicketOverviewEntries(roleEntries, key); } countsByRole[roleId.ToString()] = counts; @@ -1374,7 +1377,10 @@ namespace C4IT.F4SD if (entry == null || string.IsNullOrWhiteSpace(key)) return false; - var isTicket = !entry.IsIncident; + // TODO: Fachlich klaeren, ob Service Requests zusaetzlich unter "Tickets" aggregiert werden sollen. + var isTicket = string.Equals(entry.ActivityType, "SPSActivityTypeTicket", StringComparison.OrdinalIgnoreCase) + || (!entry.IsIncident && string.IsNullOrWhiteSpace(entry.ActivityType)); + var isServiceRequest = string.Equals(entry.ActivityType, "SPSActivityTypeServiceRequest", StringComparison.OrdinalIgnoreCase); var hasPerson = entry.RecipientId != Guid.Empty; var hasRole = entry.RecipientRoleId != Guid.Empty; var isCritical = entry.ReactionTimeEscalated || entry.SolutionTimeEscalated; @@ -1399,6 +1405,14 @@ namespace C4IT.F4SD return entry.IsIncident && isCritical; case "IncidentNewInfo": return entry.IsIncident && entry.NewInformationReceived; + case "ServiceRequestsNew": + return isServiceRequest && (entry.State == 200 || entry.State == 201); + case "ServiceRequestsActive": + return isServiceRequest && isActive; + case "ServiceRequestsCritical": + return isServiceRequest && isCritical; + case "ServiceRequestsNewInfo": + return isServiceRequest && entry.NewInformationReceived; case "UnassignedTickets": return !hasPerson && hasRole && isNew; case "UnassignedTicketsCritical": @@ -1408,6 +1422,15 @@ namespace C4IT.F4SD } } + private static int CountTicketOverviewEntries(IEnumerable entries, string key) + { + if (string.Equals(key?.Trim(), "ServiceRequestsEnabled", StringComparison.OrdinalIgnoreCase)) + return ticketAndServiceRequestEnabled() ? 1 : 0; + + return (entries ?? Enumerable.Empty()) + .Count(entry => MatchesTicketOverviewKey(entry, key)); + } + private static bool GetBoolValue(object value) { if (value == null || value is DBNull) diff --git a/docs/postman/C4IT-F4SD-M42WebApi.postman_collection.json b/docs/postman/C4IT-F4SD-M42WebApi.postman_collection.json index 253165b..f91d235 100644 --- a/docs/postman/C4IT-F4SD-M42WebApi.postman_collection.json +++ b/docs/postman/C4IT-F4SD-M42WebApi.postman_collection.json @@ -119,7 +119,7 @@ }, { "key": "overviewKeys", - "value": "TicketsNew,TicketsActive,TicketsCritical,TicketsNewInfo,IncidentNew,IncidentActive,IncidentCritical,IncidentNewInfo,UnassignedTickets,UnassignedTicketsCritical" + "value": "TicketsNew,TicketsActive,TicketsCritical,TicketsNewInfo,IncidentNew,IncidentActive,IncidentCritical,IncidentNewInfo,ServiceRequestsNew,ServiceRequestsActive,ServiceRequestsCritical,ServiceRequestsNewInfo,UnassignedTickets,UnassignedTicketsCritical,ServiceRequestsEnabled" }, { "key": "queueOption",