diff --git a/F4SDM42WebApi/F4SDHelperService.cs b/F4SDM42WebApi/F4SDHelperService.cs index c8e1169..3618147 100644 --- a/F4SDM42WebApi/F4SDHelperService.cs +++ b/F4SDM42WebApi/F4SDHelperService.cs @@ -326,7 +326,12 @@ namespace C4IT.F4SD public bool IsIncident { get; set; } } - internal async Task getTicketOverviewCounts(string sid, string scope, IEnumerable keys) + internal async Task getTicketOverviewCounts( + string sid, + string scope, + IEnumerable keys, + int queueoption, + List queues) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); @@ -343,7 +348,7 @@ namespace C4IT.F4SD normalizedKeys.AddRange(TicketOverviewKeys); } - var entries = await LoadTicketOverviewEntries(sid, useRoleScope); + var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var key in normalizedKeys) @@ -364,7 +369,12 @@ namespace C4IT.F4SD } } - internal async Task getTicketOverviewCountsByRoles(string sid, IEnumerable roleGuids, IEnumerable keys) + internal async Task getTicketOverviewCountsByRoles( + string sid, + IEnumerable roleGuids, + IEnumerable keys, + int queueoption, + List queues) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); @@ -384,7 +394,7 @@ namespace C4IT.F4SD if (roleIds.Count == 0) return new TicketOverviewCountsByRoleResult(); - var entries = await LoadTicketOverviewEntriesByRoleIds(roleIds); + var entries = await LoadTicketOverviewEntriesByRoleIds(roleIds, queueoption, queues); var entriesByRole = entries .GroupBy(entry => entry.RecipientRoleId) .ToDictionary(group => group.Key, group => group.ToList()); @@ -422,7 +432,13 @@ namespace C4IT.F4SD } } - internal async Task> getTicketOverviewRelations(string sid, string scope, string key, int count) + internal async Task> getTicketOverviewRelations( + string sid, + string scope, + string key, + int count, + int queueoption, + List queues) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); @@ -432,7 +448,7 @@ namespace C4IT.F4SD return new List(); var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase); - var entries = await LoadTicketOverviewEntries(sid, useRoleScope); + var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); var filtered = entries .Where(entry => MatchesTicketOverviewKey(entry, key)) @@ -486,7 +502,11 @@ namespace C4IT.F4SD } } - private async Task> LoadTicketOverviewEntries(string sid, bool useRoleScope) + private async Task> LoadTicketOverviewEntries( + string sid, + bool useRoleScope, + int queueoption, + List queues) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); @@ -497,7 +517,7 @@ namespace C4IT.F4SD if (string.IsNullOrWhiteSpace(sid)) return new List(); - var filter = await BuildTicketOverviewFilterAsync(sid, useRoleScope); + var filter = await BuildTicketOverviewFilterAsync(sid, useRoleScope, queueoption, queues); return await LoadTicketOverviewEntriesByFilter(filter); } catch (Exception E) @@ -511,7 +531,10 @@ namespace C4IT.F4SD } } - private async Task> LoadTicketOverviewEntriesByRoleIds(IEnumerable roleIds) + private async Task> LoadTicketOverviewEntriesByRoleIds( + IEnumerable roleIds, + int queueoption, + List queues) { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); @@ -519,7 +542,7 @@ namespace C4IT.F4SD { await Task.Delay(0); - var filter = BuildTicketOverviewFilterForRoleIds(roleIds); + var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues); return await LoadTicketOverviewEntriesByFilter(filter); } catch (Exception E) @@ -607,9 +630,13 @@ namespace C4IT.F4SD } } - private async Task BuildTicketOverviewFilterAsync(string sid, bool useRoleScope) + private async Task BuildTicketOverviewFilterAsync( + string sid, + bool useRoleScope, + int queueoption, + List queues) { - var filter = BuildTicketOverviewBaseFilter(); + var filter = BuildTicketOverviewBaseFilter(queueoption, queues); if (!useRoleScope) { @@ -621,7 +648,7 @@ namespace C4IT.F4SD return BuildTicketOverviewFilterForRoleIds(roleIds, filter); } - private string BuildTicketOverviewBaseFilter() + private string BuildTicketOverviewBaseFilter(int queueoption, List queues) { var filter = "T(SPSCommonClassBase).State <> 204"; @@ -636,12 +663,19 @@ namespace C4IT.F4SD filter += " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL)"; } + filter = AppendQueueFilter(filter, queueoption, queues); return filter; } - private string BuildTicketOverviewFilterForRoleIds(IEnumerable roleIds, string baseFilter = null) + private string BuildTicketOverviewFilterForRoleIds( + IEnumerable roleIds, + string baseFilter = null, + int queueoption = 0, + List queues = null) { - var filter = string.IsNullOrWhiteSpace(baseFilter) ? BuildTicketOverviewBaseFilter() : baseFilter; + var filter = string.IsNullOrWhiteSpace(baseFilter) + ? BuildTicketOverviewBaseFilter(queueoption, queues) + : baseFilter; var roleIdList = (roleIds ?? Enumerable.Empty()) .Where(id => id != Guid.Empty) @@ -656,6 +690,53 @@ namespace C4IT.F4SD return filter; } + private string AppendQueueFilter(string filter, int queueoption, List queues) + { + if (queues != null && queues.Count > 0) + { + var escapedNames = queues + .Select(q => $"'{Escape(q.QueueName)}'") + .ToList(); + var escapedIds = queues + .Select(q => $"'{Escape(q.QueueID.ToString())}'") + .ToList(); + + string nameList = string.Join(", ", escapedNames); + string idList = string.Join(", ", escapedIds); + + switch (queueoption) + { + case 1: + filter += + $" AND (" + + "Queue IS NULL" + + $" OR Queue.Name IN ({nameList})" + + $" OR Queue.ID IN ({idList})" + + ")"; + break; + case 2: + filter += + $" AND (" + + "Queue IS NOT NULL" + + $" AND (Queue.Name IN ({nameList})" + + $" OR Queue.ID IN ({idList}))" + + ")"; + break; + case 3: + filter += " AND Queue IS NULL"; + break; + default: + break; + } + } + else if (queueoption == 3) + { + filter += " AND Queue IS NULL"; + } + + return filter; + } + private async Task> ResolveTicketOverviewRoleIdsAsync(string sid, IEnumerable roleGuids) { var roleIds = (roleGuids ?? Enumerable.Empty()) diff --git a/F4SDM42WebApi/F4SDM42WebApiController.cs b/F4SDM42WebApi/F4SDM42WebApiController.cs index d77b687..b231c22 100644 --- a/F4SDM42WebApi/F4SDM42WebApiController.cs +++ b/F4SDM42WebApi/F4SDM42WebApiController.cs @@ -98,37 +98,20 @@ namespace C4IT.F4SD } [Route("getTicketList"), HttpGet] - public async Task> getTicketList( - string sid, - int hours, - int queueoption = 0, - string queues = "" - ) - { - // "HR:2a7e..." → Tuple("HR", "2a7e..."), dann UrlDecode - var decodedPairs = queues - .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries) - .Select(part => - { - var segments = part.Split(':'); - if (segments.Length != 2) - return null; - - var name = HttpUtility.UrlDecode(segments[0]); - var idStr = HttpUtility.UrlDecode(segments[1]); - - return Guid.TryParse(idStr, out var guid) - ? new cApiM42TicketQueueInfo { QueueName = name, QueueID = guid } - : null; - }) - .Where(q => q != null) - .ToList(); - - // Nun weiterreichen an Service - return await _f4stHelperService.getTicketListByUser( - sid, - hours, - queueoption, + public async Task> getTicketList( + string sid, + int hours, + int queueoption = 0, + string queues = "" + ) + { + var decodedPairs = ParseQueues(queues); + + // Nun weiterreichen an Service + return await _f4stHelperService.getTicketListByUser( + sid, + hours, + queueoption, decodedPairs ); } @@ -151,7 +134,13 @@ namespace C4IT.F4SD } [Route("getTicketOverviewCounts"), HttpGet] - public async Task getTicketOverviewCounts(string sid, string scope = "personal", string keys = "") + public async Task getTicketOverviewCounts( + string sid, + string scope = "personal", + string keys = "", + int queueoption = 0, + string queues = "" + ) { var parsedKeys = (keys ?? string.Empty) .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) @@ -159,7 +148,8 @@ namespace C4IT.F4SD .Where(key => !string.IsNullOrWhiteSpace(key)) .ToList(); - return await _f4stHelperService.getTicketOverviewCounts(sid, scope, parsedKeys); + var decodedQueues = ParseQueues(queues); + return await _f4stHelperService.getTicketOverviewCounts(sid, scope, parsedKeys, queueoption, decodedQueues); } [Route("getTicketOverviewCountsByRoles"), HttpPost] @@ -176,13 +166,28 @@ namespace C4IT.F4SD .Distinct() .ToList(); - return await _f4stHelperService.getTicketOverviewCountsByRoles(request?.Sid, roleGuids, parsedKeys); + var decodedQueues = ParseQueues(request?.Queues ?? string.Empty); + return await _f4stHelperService.getTicketOverviewCountsByRoles( + request?.Sid, + roleGuids, + parsedKeys, + request?.QueueOption ?? 0, + decodedQueues + ); } [Route("getTicketOverviewRelations"), HttpGet] - public async Task> getTicketOverviewRelations(string sid, string scope = "personal", string key = "", int count = 0) + public async Task> getTicketOverviewRelations( + string sid, + string scope = "personal", + string key = "", + int count = 0, + int queueoption = 0, + string queues = "" + ) { - return await _f4stHelperService.getTicketOverviewRelations(sid, scope, key, count); + var decodedQueues = ParseQueues(queues); + return await _f4stHelperService.getTicketOverviewRelations(sid, scope, key, count, queueoption, decodedQueues); } /* [Route("updateActivitySolution/{objectId}"), HttpPost] @@ -271,6 +276,29 @@ namespace C4IT.F4SD public string Sid { get; set; } public List RoleGuids { get; set; } = new List(); public List Keys { get; set; } = new List(); + public int? QueueOption { get; set; } + public string Queues { get; set; } + } + + private static List ParseQueues(string queues) + { + return (queues ?? string.Empty) + .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries) + .Select(part => + { + var segments = part.Split(':'); + if (segments.Length != 2) + return null; + + var name = HttpUtility.UrlDecode(segments[0]); + var idStr = HttpUtility.UrlDecode(segments[1]); + + return Guid.TryParse(idStr, out var guid) + ? new cApiM42TicketQueueInfo { QueueName = name, QueueID = guid } + : null; + }) + .Where(q => q != null) + .ToList(); } [Route("isAlive"), HttpGet]