Add service request categories to ticket overview API

This commit is contained in:
Meik
2026-07-17 18:38:21 +02:00
parent cec49319da
commit cd47a8d0b7
4 changed files with 85 additions and 38 deletions

View File

@@ -117,7 +117,7 @@ namespace C4IT.F4SD
var source = !useRoleScope && IsUnassignedOverviewKey(key)
? unassignedEntries ?? new List<TicketOverviewEntry>()
: entries;
counts[key] = source.Count(entry => MatchesTicketOverviewKey(entry, key));
counts[key] = CountTicketOverviewEntries(source, key);
}
return new TicketOverviewCountsResult { Counts = counts };

View File

@@ -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<TicketOverviewEntry>())
.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<string, int>(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<TicketOverviewEntry> entries, string key)
{
if (string.Equals(key?.Trim(), "ServiceRequestsEnabled", StringComparison.OrdinalIgnoreCase))
return ticketAndServiceRequestEnabled() ? 1 : 0;
return (entries ?? Enumerable.Empty<TicketOverviewEntry>())
.Count(entry => MatchesTicketOverviewKey(entry, key));
}
private static bool GetBoolValue(object value)
{