aktueller stand

This commit is contained in:
Meik
2026-02-13 09:08:02 +01:00
parent 134876e45b
commit 26eac54f94

View File

@@ -350,12 +350,26 @@ namespace C4IT.F4SD
} }
var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues);
List<TicketOverviewEntry> unassignedEntries = null;
if (!useRoleScope && normalizedKeys.Any(IsUnassignedOverviewKey))
{
unassignedEntries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues);
}
var counts = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase); var counts = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
foreach (var key in normalizedKeys) foreach (var key in normalizedKeys)
{
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] = entries.Count(entry => MatchesTicketOverviewKey(entry, key));
} }
}
return new TicketOverviewCountsResult { Counts = counts }; return new TicketOverviewCountsResult { Counts = counts };
} }
@@ -449,7 +463,15 @@ namespace C4IT.F4SD
return new List<TicketOverviewRelationDto>(); return new List<TicketOverviewRelationDto>();
var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase); var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase);
var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); List<TicketOverviewEntry> entries;
if (!useRoleScope && IsUnassignedOverviewKey(key))
{
entries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues);
}
else
{
entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues);
}
var filtered = entries var filtered = entries
.Where(entry => MatchesTicketOverviewKey(entry, key)) .Where(entry => MatchesTicketOverviewKey(entry, key))
@@ -533,6 +555,39 @@ namespace C4IT.F4SD
} }
} }
private async Task<List<TicketOverviewEntry>> LoadTicketOverviewUnassignedEntriesForPersonalScope(
string sid,
int queueoption,
List<cApiM42TicketQueueInfo> queues)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
await Task.Delay(0);
if (string.IsNullOrWhiteSpace(sid))
return new List<TicketOverviewEntry>();
var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null);
var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues);
if (string.IsNullOrWhiteSpace(filter))
return new List<TicketOverviewEntry>();
filter += " AND Recipient IS NULL";
return await LoadTicketOverviewEntriesByFilter(filter);
}
catch (Exception E)
{
LogException(E);
return new List<TicketOverviewEntry>();
}
finally
{
LogMethodEnd(CM);
}
}
private async Task<List<TicketOverviewEntry>> LoadTicketOverviewEntriesByRoleIds( private async Task<List<TicketOverviewEntry>> LoadTicketOverviewEntriesByRoleIds(
IEnumerable<Guid> roleIds, IEnumerable<Guid> roleIds,
int queueoption, int queueoption,
@@ -693,7 +748,8 @@ namespace C4IT.F4SD
if (!useRoleScope) 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; return filter;
} }
@@ -730,6 +786,16 @@ namespace C4IT.F4SD
? BuildTicketOverviewBaseFilter(queueoption, queues) ? BuildTicketOverviewBaseFilter(queueoption, queues)
: baseFilter; : baseFilter;
var roleClause = BuildRoleIdInClause(roleIds);
if (string.IsNullOrWhiteSpace(roleClause))
return null;
filter += $" AND {roleClause}";
return filter;
}
private static string BuildRoleIdInClause(IEnumerable<Guid> roleIds)
{
var roleIdList = (roleIds ?? Enumerable.Empty<Guid>()) var roleIdList = (roleIds ?? Enumerable.Empty<Guid>())
.Where(id => id != Guid.Empty) .Where(id => id != Guid.Empty)
.Distinct() .Distinct()
@@ -739,8 +805,7 @@ namespace C4IT.F4SD
if (roleIdList.Count == 0) if (roleIdList.Count == 0)
return null; return null;
filter += $" AND RecipientRole.T(SPSSecurityClassRole).ID IN ({string.Join(", ", roleIdList)})"; return $"RecipientRole.T(SPSSecurityClassRole).ID IN ({string.Join(", ", roleIdList)})";
return filter;
} }
private string AppendQueueFilter(string filter, int queueoption, List<cApiM42TicketQueueInfo> queues) private string AppendQueueFilter(string filter, int queueoption, List<cApiM42TicketQueueInfo> queues)
@@ -815,6 +880,21 @@ namespace C4IT.F4SD
.ToList(); .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) private static bool MatchesTicketOverviewKey(TicketOverviewEntry entry, string key)
{ {
if (entry == null || string.IsNullOrWhiteSpace(key)) if (entry == null || string.IsNullOrWhiteSpace(key))
@@ -822,7 +902,7 @@ namespace C4IT.F4SD
var isTicket = !entry.IsIncident; var isTicket = !entry.IsIncident;
var hasPerson = entry.RecipientId != Guid.Empty; 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 isCritical = entry.ReactionTimeEscalated || entry.SolutionTimeEscalated;
var isNew = entry.State == 200; var isNew = entry.State == 200;
var isActive = entry.State == 201 || entry.State == 202 || entry.State == 203; var isActive = entry.State == 201 || entry.State == 202 || entry.State == 203;
@@ -830,15 +910,15 @@ namespace C4IT.F4SD
switch (key.Trim()) switch (key.Trim())
{ {
case "TicketsNew": case "TicketsNew":
return isTicket && isAssigned && isNew; return isTicket && (entry.State == 200 || entry.State == 201);
case "TicketsActive": case "TicketsActive":
return isTicket && isAssigned && isActive; return isTicket && isActive;
case "TicketsCritical": case "TicketsCritical":
return isTicket && isAssigned && isCritical; return isTicket && isCritical;
case "TicketsNewInfo": case "TicketsNewInfo":
return isTicket && isAssigned && entry.NewInformationReceived; return isTicket && entry.NewInformationReceived;
case "IncidentNew": case "IncidentNew":
return entry.IsIncident && isNew; return entry.IsIncident && (entry.State == 200 || entry.State == 201);
case "IncidentActive": case "IncidentActive":
return entry.IsIncident && isActive; return entry.IsIncident && isActive;
case "IncidentCritical": case "IncidentCritical":
@@ -846,9 +926,9 @@ namespace C4IT.F4SD
case "IncidentNewInfo": case "IncidentNewInfo":
return entry.IsIncident && entry.NewInformationReceived; return entry.IsIncident && entry.NewInformationReceived;
case "UnassignedTickets": case "UnassignedTickets":
return !hasPerson && isNew; return !hasPerson && hasRole && isNew;
case "UnassignedTicketsCritical": case "UnassignedTicketsCritical":
return !hasPerson && isCritical; return !hasPerson && hasRole && isCritical;
default: default:
return false; return false;
} }