aktueller stand
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user