From 26eac54f94521b852cd52804c011dc38351fba99 Mon Sep 17 00:00:00 2001 From: Meik Date: Fri, 13 Feb 2026 09:08:02 +0100 Subject: [PATCH] aktueller stand --- F4SDM42WebApi/F4SDHelperService.cs | 106 +++++++++++++++++++++++++---- 1 file changed, 93 insertions(+), 13 deletions(-) diff --git a/F4SDM42WebApi/F4SDHelperService.cs b/F4SDM42WebApi/F4SDHelperService.cs index 2153325..7345429 100644 --- a/F4SDM42WebApi/F4SDHelperService.cs +++ b/F4SDM42WebApi/F4SDHelperService.cs @@ -350,11 +350,25 @@ namespace C4IT.F4SD } var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); + List unassignedEntries = null; + if (!useRoleScope && normalizedKeys.Any(IsUnassignedOverviewKey)) + { + unassignedEntries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues); + } + var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var key in normalizedKeys) { - counts[key] = entries.Count(entry => MatchesTicketOverviewKey(entry, key)); + if (!useRoleScope && IsUnassignedOverviewKey(key)) + { + counts[key] = (unassignedEntries ?? new List()) + .Count(entry => MatchesTicketOverviewKey(entry, key)); + } + else + { + counts[key] = entries.Count(entry => MatchesTicketOverviewKey(entry, key)); + } } return new TicketOverviewCountsResult { Counts = counts }; @@ -449,7 +463,15 @@ namespace C4IT.F4SD return new List(); var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase); - var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); + List entries; + if (!useRoleScope && IsUnassignedOverviewKey(key)) + { + entries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues); + } + else + { + entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); + } var filtered = entries .Where(entry => MatchesTicketOverviewKey(entry, key)) @@ -533,6 +555,39 @@ namespace C4IT.F4SD } } + private async Task> LoadTicketOverviewUnassignedEntriesForPersonalScope( + string sid, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + + if (string.IsNullOrWhiteSpace(sid)) + return new List(); + + var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null); + var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues); + if (string.IsNullOrWhiteSpace(filter)) + return new List(); + + filter += " AND Recipient IS NULL"; + return await LoadTicketOverviewEntriesByFilter(filter); + } + catch (Exception E) + { + LogException(E); + return new List(); + } + finally + { + LogMethodEnd(CM); + } + } + private async Task> LoadTicketOverviewEntriesByRoleIds( IEnumerable roleIds, int queueoption, @@ -693,7 +748,8 @@ namespace C4IT.F4SD if (!useRoleScope) { - filter += $" AND Initiator.Accounts.T(SPSAccountClassAd).Sid = '{Escape(sid)}'"; + var recipientFilter = $"Recipient.Accounts.T(SPSAccountClassAd).Sid = '{Escape(sid)}'"; + filter += $" AND ({recipientFilter})"; return filter; } @@ -730,6 +786,16 @@ namespace C4IT.F4SD ? BuildTicketOverviewBaseFilter(queueoption, queues) : baseFilter; + var roleClause = BuildRoleIdInClause(roleIds); + if (string.IsNullOrWhiteSpace(roleClause)) + return null; + + filter += $" AND {roleClause}"; + return filter; + } + + private static string BuildRoleIdInClause(IEnumerable roleIds) + { var roleIdList = (roleIds ?? Enumerable.Empty()) .Where(id => id != Guid.Empty) .Distinct() @@ -739,8 +805,7 @@ namespace C4IT.F4SD if (roleIdList.Count == 0) return null; - filter += $" AND RecipientRole.T(SPSSecurityClassRole).ID IN ({string.Join(", ", roleIdList)})"; - return filter; + return $"RecipientRole.T(SPSSecurityClassRole).ID IN ({string.Join(", ", roleIdList)})"; } private string AppendQueueFilter(string filter, int queueoption, List queues) @@ -815,6 +880,21 @@ namespace C4IT.F4SD .ToList(); } + private static bool IsUnassignedOverviewKey(string key) + { + if (string.IsNullOrWhiteSpace(key)) + return false; + + switch (key.Trim()) + { + case "UnassignedTickets": + case "UnassignedTicketsCritical": + return true; + default: + return false; + } + } + private static bool MatchesTicketOverviewKey(TicketOverviewEntry entry, string key) { if (entry == null || string.IsNullOrWhiteSpace(key)) @@ -822,7 +902,7 @@ namespace C4IT.F4SD var isTicket = !entry.IsIncident; var hasPerson = entry.RecipientId != Guid.Empty; - var isAssigned = hasPerson || entry.RecipientRoleId != Guid.Empty; + var hasRole = entry.RecipientRoleId != Guid.Empty; var isCritical = entry.ReactionTimeEscalated || entry.SolutionTimeEscalated; var isNew = entry.State == 200; var isActive = entry.State == 201 || entry.State == 202 || entry.State == 203; @@ -830,15 +910,15 @@ namespace C4IT.F4SD switch (key.Trim()) { case "TicketsNew": - return isTicket && isAssigned && isNew; + return isTicket && (entry.State == 200 || entry.State == 201); case "TicketsActive": - return isTicket && isAssigned && isActive; + return isTicket && isActive; case "TicketsCritical": - return isTicket && isAssigned && isCritical; + return isTicket && isCritical; case "TicketsNewInfo": - return isTicket && isAssigned && entry.NewInformationReceived; + return isTicket && entry.NewInformationReceived; case "IncidentNew": - return entry.IsIncident && isNew; + return entry.IsIncident && (entry.State == 200 || entry.State == 201); case "IncidentActive": return entry.IsIncident && isActive; case "IncidentCritical": @@ -846,9 +926,9 @@ namespace C4IT.F4SD case "IncidentNewInfo": return entry.IsIncident && entry.NewInformationReceived; case "UnassignedTickets": - return !hasPerson && isNew; + return !hasPerson && hasRole && isNew; case "UnassignedTicketsCritical": - return !hasPerson && isCritical; + return !hasPerson && hasRole && isCritical; default: return false; }