diff --git a/FasdCockpitCommunicationDemo/Config/F4SD-Global-Configuration.xml b/FasdCockpitCommunicationDemo/Config/F4SD-Global-Configuration.xml new file mode 100644 index 0000000..58bbaec --- /dev/null +++ b/FasdCockpitCommunicationDemo/Config/F4SD-Global-Configuration.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FasdCockpitCommunicationDemo/F4SD-Cockpit-Client-Demo.csproj b/FasdCockpitCommunicationDemo/F4SD-Cockpit-Client-Demo.csproj index 9fdd009..08124f8 100644 --- a/FasdCockpitCommunicationDemo/F4SD-Cockpit-Client-Demo.csproj +++ b/FasdCockpitCommunicationDemo/F4SD-Cockpit-Client-Demo.csproj @@ -116,12 +116,15 @@ Designer PreserveNewest - - Always - - - Always - + + Always + + + Always + + + Always + Designer diff --git a/FasdCockpitCommunicationDemo/F4SDCockpitCommunicationDemo.cs b/FasdCockpitCommunicationDemo/F4SDCockpitCommunicationDemo.cs index f113cbd..9ff4823 100644 --- a/FasdCockpitCommunicationDemo/F4SDCockpitCommunicationDemo.cs +++ b/FasdCockpitCommunicationDemo/F4SDCockpitCommunicationDemo.cs @@ -3,18 +3,20 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.IO; -using System.Threading.Tasks; -using System.Threading; -using System.Diagnostics; - -using Newtonsoft.Json; - -using FasdCockpitBase.Models; -using FasdCockpitCommunicationDemo; -using C4IT.FASD.Base; -using static C4IT.Logging.cLogManager; -using FasdCockpitBase; -using C4IT.Logging; +using System.Threading.Tasks; +using System.Threading; +using System.Diagnostics; +using System.Xml; + +using Newtonsoft.Json; + +using FasdCockpitBase.Models; +using FasdCockpitCommunicationDemo; +using C4IT.Configuration; +using C4IT.FASD.Base; +using static C4IT.Logging.cLogManager; +using FasdCockpitBase; +using C4IT.Logging; namespace C4IT.FASD.Cockpit.Communication @@ -245,18 +247,19 @@ namespace C4IT.FASD.Cockpit.Communication scopeDictionary[scopeKey] = definitions; } - if (!definitions.Any(d => d.TicketId == record.TicketId)) - { - definitions.Add(new TicketOverviewRelationDefinition - { - TicketId = record.TicketId, - UserId = record.UserId, - DisplayName = record.DisplayName, - Summary = record.Summary, - StatusId = record.StatusId, - UserDisplayName = record.UserDisplayName, - UserAccount = record.UserAccount, - UserDomain = record.UserDomain + if (!definitions.Any(d => d.TicketId == record.TicketId)) + { + definitions.Add(new TicketOverviewRelationDefinition + { + TicketId = record.TicketId, + UserId = record.UserId, + DisplayName = record.DisplayName, + ActivityType = record.ActivityType, + Summary = record.Summary, + StatusId = record.StatusId, + UserDisplayName = record.UserDisplayName, + UserAccount = record.UserAccount, + UserDomain = record.UserDomain }); } @@ -490,6 +493,9 @@ namespace C4IT.FASD.Cockpit.Communication var summary = definition.Summary ?? string.Empty; if (detailTicket != null && !string.IsNullOrWhiteSpace(detailTicket.Summary)) summary = detailTicket.Summary; + var activityType = string.IsNullOrWhiteSpace(definition.ActivityType) + ? null + : definition.ActivityType.Trim(); var relation = new cF4sdApiSearchResultRelation { @@ -504,12 +510,13 @@ namespace C4IT.FASD.Cockpit.Communication ["StatusId"] = definition.StatusId ?? string.Empty, ["UserDisplayName"] = definition.UserDisplayName ?? string.Empty, ["UserAccount"] = definition.UserAccount ?? string.Empty, - ["UserDomain"] = definition.UserDomain ?? string.Empty + ["UserDomain"] = definition.UserDomain ?? string.Empty, + ["ActivityType"] = activityType }, - Identities = new cF4sdIdentityList - { - new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = definition.TicketId }, - new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = definition.UserId } + Identities = new cF4sdIdentityList + { + new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = definition.TicketId }, + new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = definition.UserId } } }; relations.Add(relation); @@ -555,10 +562,133 @@ namespace C4IT.FASD.Cockpit.Communication return fallbackData.Tickets.FirstOrDefault(ticket => ticket.Id == definition.TicketId); } + private static string ResolveTicketActivityType(string displayName, cF4SDTicket detailTicket = null) + { + var linkType = TryGetActivityTypeFromTicketLinks(detailTicket); + if (!string.IsNullOrWhiteSpace(linkType)) + return linkType; + + var ticketName = displayName ?? detailTicket?.Name; + if (string.IsNullOrWhiteSpace(ticketName)) + return "SPSActivityTypeTicket"; + + if (ticketName.StartsWith("INC", StringComparison.OrdinalIgnoreCase)) + return "SPSActivityTypeIncident"; + + if (ticketName.StartsWith("SRQ", StringComparison.OrdinalIgnoreCase)) + return "SPSActivityTypeServiceRequest"; + + if (ticketName.StartsWith("PRB", StringComparison.OrdinalIgnoreCase)) + return "SPSActivityTypeGroupTicket"; + + if (ticketName.StartsWith("ALT", StringComparison.OrdinalIgnoreCase)) + return "SPSActivityTypeAlert"; + + if (ticketName.StartsWith("CHG", StringComparison.OrdinalIgnoreCase)) + return "SVMChangeRequestType"; + + if (ticketName.StartsWith("TSK", StringComparison.OrdinalIgnoreCase)) + return "SPSActivityTypeBase"; + + return "SPSActivityTypeTicket"; + } + + private static string TryGetActivityTypeFromTicketLinks(cF4SDTicket ticket) + { + if (ticket?.DirectLinks == null || ticket.DirectLinks.Count == 0) + return null; + + foreach (var link in ticket.DirectLinks.Values) + { + var type = TryGetActivityTypeFromUrl(link); + if (!string.IsNullOrWhiteSpace(type)) + return type; + } + + return null; + } + + private static string TryGetActivityTypeFromUrl(string url) + { + if (string.IsNullOrWhiteSpace(url)) + return null; + + var markerList = new[] { "preview-object/", "edit-object/", "create-object/" }; + foreach (var marker in markerList) + { + var markerIndex = url.IndexOf(marker, StringComparison.OrdinalIgnoreCase); + if (markerIndex < 0) + continue; + + var start = markerIndex + marker.Length; + var end = url.IndexOf('/', start); + if (end < 0) + end = url.IndexOf('?', start); + if (end < 0) + end = url.Length; + + if (end <= start) + continue; + + var activityType = url.Substring(start, end - start).Trim(); + if (!string.IsNullOrWhiteSpace(activityType)) + return activityType; + } + + // Fallback for view-options based deeplinks. + var decodedUrl = Uri.UnescapeDataString(url); + const string queryTypeToken = "\"type\":\""; + var typeStart = decodedUrl.IndexOf(queryTypeToken, StringComparison.OrdinalIgnoreCase); + if (typeStart < 0) + return null; + + typeStart += queryTypeToken.Length; + var typeEnd = decodedUrl.IndexOf('"', typeStart); + if (typeEnd <= typeStart) + return null; + + var parsedType = decodedUrl.Substring(typeStart, typeEnd - typeStart).Trim(); + return string.IsNullOrWhiteSpace(parsedType) ? null : parsedType; + } + + private string ResolveDemoM42Server() + { + foreach (var sampleData in MockupData) + { + if (sampleData?.Tickets == null) + continue; + + foreach (var ticket in sampleData.Tickets) + { + if (ticket?.DirectLinks == null) + continue; + + foreach (var link in ticket.DirectLinks.Values) + { + if (TryExtractServerBase(link, out var serverBase)) + return serverBase; + } + } + } + + return "https://srvwsm001.imagoverum.com"; + } + + private static bool TryExtractServerBase(string url, out string serverBase) + { + serverBase = null; + + if (!Uri.TryCreate(url, UriKind.Absolute, out var uri)) + return false; + + serverBase = uri.GetLeftPart(UriPartial.Authority); + return !string.IsNullOrWhiteSpace(serverBase); + } + private static Task SimulateTicketOverviewLatencyAsync(int count) { - int baseMs = 420; - int perItem = 100; + int baseMs = 420; + int perItem = 100; int capped = Math.Max(0, Math.Min(count, 5)); int delay = Math.Max(240, Math.Min(baseMs + capped * perItem, 2000)); return Task.Delay(delay); @@ -1126,10 +1256,10 @@ namespace C4IT.FASD.Cockpit.Communication var demoTickets = await GetDemoTicketData(new cF4sdHealthCardRawDataRequest() { Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Computer, Id = Guid.NewGuid() } } }); - foreach (var demoTicket in demoTickets) - { - output.Add(new cF4sdApiSearchResultRelation() { id = demoTicket.Id, Name = demoTicket.Name, DisplayName = demoTicket.Name, Infos = new Dictionary() { ["Summary"] = demoTicket.Summary, ["Status"] = demoTicket.Status.ToString(), ["StatusId"] = ((int)demoTicket.Status).ToString(), ["Asset"] = demoTicket.Asset }, Type = enumF4sdSearchResultClass.Ticket, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Ticket, Id = demoTicket.Id } } }); - } + foreach (var demoTicket in demoTickets) + { + output.Add(new cF4sdApiSearchResultRelation() { id = demoTicket.Id, Name = demoTicket.Name, DisplayName = demoTicket.Name, Infos = new Dictionary() { ["Summary"] = demoTicket.Summary, ["Status"] = demoTicket.Status.ToString(), ["StatusId"] = ((int)demoTicket.Status).ToString(), ["Asset"] = demoTicket.Asset, ["ActivityType"] = ResolveTicketActivityType(demoTicket.Name, demoTicket) }, Type = enumF4sdSearchResultClass.Ticket, Identities = new cF4sdIdentityList() { new cF4sdIdentityEntry() { Class = enumFasdInformationClass.User, Id = Guid.Parse(constGuidTimoTicket) }, new cF4sdIdentityEntry() { Class = enumFasdInformationClass.Ticket, Id = demoTicket.Id } } }); + } break; case constGuidTimoTicketComputer: @@ -1187,7 +1317,8 @@ namespace C4IT.FASD.Cockpit.Communication ["Summary"] = demoTicket.Summary ?? string.Empty, ["Status"] = demoTicket.Status.ToString(), ["StatusId"] = ((int)demoTicket.Status).ToString(), - ["Asset"] = demoTicket.Asset ?? string.Empty + ["Asset"] = demoTicket.Asset ?? string.Empty, + ["ActivityType"] = ResolveTicketActivityType(demoTicket.Name, demoTicket) }, Identities = new cF4sdIdentityList() { @@ -2007,16 +2138,43 @@ namespace C4IT.FASD.Cockpit.Communication return true; } - public override async Task GetCockpitConfiguration() - { - cCockpitConfiguration.Instance = new cCockpitConfiguration(); - cCockpitConfiguration.Instance.agentApiConfiguration = new cAgentApiConfiguration() { ApiUrl = "", ClientId = "", ClientSecret = "", LogonUrl = "", OrganizationCode = 0 }; - cCockpitConfiguration.Instance.m42ServerConfiguration = new cM42ServerConfiguration() { Server = "" }; - await Task.CompletedTask; - return true; - } - - public override Task GetAgentOnlineStatus(int AgentDeviceId, int? AgentUserId = null) => Task.FromResult(true); + public override async Task GetCockpitConfiguration() + { + cCockpitConfiguration.Instance = new cCockpitConfiguration(); + cCockpitConfiguration.Instance.agentApiConfiguration = new cAgentApiConfiguration() { ApiUrl = "", ClientId = "", ClientSecret = "", LogonUrl = "", OrganizationCode = 0 }; + cCockpitConfiguration.Instance.m42ServerConfiguration = new cM42ServerConfiguration() { Server = ResolveDemoM42Server() }; + cCockpitConfiguration.Instance.GlobalConfig = LoadDemoGlobalConfig(); + await Task.CompletedTask; + return true; + } + + private static cConfigHelperParameterList LoadDemoGlobalConfig() + { + try + { + var executingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + var filePath = Path.Combine(executingDirectory, "Config", "F4SD-Global-Configuration.xml"); + if (!File.Exists(filePath)) + return null; + + var xmlDocument = new XmlDocument(); + xmlDocument.Load(filePath); + + var root = xmlDocument.DocumentElement; + if (root == null || !string.Equals(root.Name, "F4SD-Global-Configuration", StringComparison.OrdinalIgnoreCase)) + return null; + + return cF4sdGlobalConfigParameterParser.Parse(root); + } + catch (Exception E) + { + LogException(E); + } + + return null; + } + + public override Task GetAgentOnlineStatus(int AgentDeviceId, int? AgentUserId = null) => Task.FromResult(true); public override Task GetQuickActionOfAgent(int ScriptId) => Task.FromResult(new cF4sdAgentScript() { Id = ScriptId, Name = "AgentScript", Type = enumAgentScriptType.user, UserPermissionRequired = false }); diff --git a/FasdCockpitCommunicationDemo/MockupTicketOverview/TicketOverviewGeneratedTickets.json b/FasdCockpitCommunicationDemo/MockupTicketOverview/TicketOverviewGeneratedTickets.json index cf553d4..35d78f8 100644 --- a/FasdCockpitCommunicationDemo/MockupTicketOverview/TicketOverviewGeneratedTickets.json +++ b/FasdCockpitCommunicationDemo/MockupTicketOverview/TicketOverviewGeneratedTickets.json @@ -3,6 +3,7 @@ { "TileKey": "TicketsNew", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayNamePrefix": "TCK", "Summary": "Neue Störung: VPN trennt nach wenigen Minuten", @@ -30,6 +31,7 @@ { "TileKey": "TicketsNew", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayNamePrefix": "TCK", "Summary": "Teams-Meldungen kommen verzögert an", @@ -57,6 +59,7 @@ { "TileKey": "TicketsNew", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayNamePrefix": "TCK", "Summary": "Anfrage: Gerät startet nicht zuverlässig", @@ -84,6 +87,7 @@ { "TileKey": "TicketsNew", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayNamePrefix": "TCK", "Summary": "Bitte um Rückmeldung: Ticketsystem reagiert langsam", @@ -111,6 +115,7 @@ { "TileKey": "TicketsNew", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayNamePrefix": "TCK", "Summary": "Passwort-Reset für AD-Benutzer erforderlich", @@ -138,6 +143,7 @@ { "TileKey": "TicketsNew", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayNamePrefix": "TCK", "Summary": "Netzwerkdrucker druckt nur leere Seiten", @@ -165,6 +171,7 @@ { "TileKey": "TicketsNew", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayNamePrefix": "TCK", "Summary": "Outlook: Speicherlimit erreicht – Postfach voll", @@ -192,6 +199,7 @@ { "TileKey": "TicketsNew", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayNamePrefix": "TCK", "Summary": "Softwareanfrage: Microsoft Visio Standard", @@ -219,6 +227,7 @@ { "TileKey": "TicketsNew", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayNamePrefix": "TCK", "Summary": "Konto gesperrt nach mehrfachen Fehlversuchen", @@ -250,6 +259,7 @@ "UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2", "TileKey": "UnassignedTickets", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "DisplayName": "TCK00414", "Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt", "StatusId": "New", @@ -278,6 +288,7 @@ "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "TileKey": "UnassignedTickets", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "DisplayName": "TCK00415", "Summary": "Etikettendrucker im Lager meldet Papierstau", "StatusId": "New", @@ -306,6 +317,7 @@ "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "TileKey": "UnassignedTicketsCritical", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "DisplayName": "TCK00416", "Summary": "WLAN Controller im Werk startet zyklisch neu", "StatusId": "InProgress", @@ -334,6 +346,7 @@ "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "TileKey": "UnassignedTicketsCritical", "UseRoleScope": false, + "ActivityType": "SPSActivityTypeTicket", "DisplayName": "TCK00417", "Summary": "SAP Buchungsjob bricht nachts wiederholt ab", "StatusId": "InProgress", diff --git a/FasdCockpitCommunicationDemo/MockupTicketOverview/TicketOverviewRelations.json b/FasdCockpitCommunicationDemo/MockupTicketOverview/TicketOverviewRelations.json index a03cbc7..b6c7a86 100644 --- a/FasdCockpitCommunicationDemo/MockupTicketOverview/TicketOverviewRelations.json +++ b/FasdCockpitCommunicationDemo/MockupTicketOverview/TicketOverviewRelations.json @@ -5,6 +5,7 @@ "TicketId": "2e9cb83d-ecb7-c93b-e8e4-08daaa97265f", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayName": "TCK00186", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Mein OneDrive synchronisiert nicht mehr", "UserDisplayName": "Ticket, Timo", "UserAccount": "TT007", @@ -17,6 +18,7 @@ "TicketId": "bb2e4a9d-2c1e-4b32-8f75-6e7c9f99f2d4", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayName": "TCK00761", + "ActivityType": "SPSActivityTypeTicket", "Summary": "VPN-Verbindung bricht nach wenigen Minuten ab", "UserDisplayName": "Ticket, Timo", "UserAccount": "TT007", @@ -27,6 +29,7 @@ "TicketId": "d63e5ea1-0785-4998-82ad-9a9e5a0f8c37", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayName": "TCK00765", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Teams-Benachrichtigungen kommen verzögert an", "UserDisplayName": "Ticket, Timo", "UserAccount": "TT007", @@ -37,6 +40,7 @@ "TicketId": "f7771fde-33ba-421a-8d9b-cdf468e7541c", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "DisplayName": "TCK00403", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Neuer Monitor fuer Hotline Arbeitsplatz", "UserDisplayName": "Busch, Andrea", "UserAccount": "AB014", @@ -47,6 +51,7 @@ "TicketId": "6294eec7-fb80-42f3-8ce8-7f7982ae200c", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "DisplayName": "TCK00404", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Monitor flackert seit Firmware Update", "UserDisplayName": "Anwender, Peter", "UserAccount": "PA010", @@ -61,6 +66,7 @@ "TicketId": "75e08a29-4103-41d6-962c-009c3342bc46", "UserId": "6180aa17-ba2d-455a-bf2f-ec4a075c2d64", "DisplayName": "TCK00406", + "ActivityType": "SPSActivityTypeTicket", "Summary": "CAD Software startet nach Update nicht mehr", "UserDisplayName": "Kohl, Carlos", "UserAccount": "CK102", @@ -73,6 +79,7 @@ "TicketId": "2e9cb83d-ecb7-c93b-e8e4-08daaa97265f", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayName": "TCK00405", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Mein OneDrive synchronisiert nicht mehr", "UserDisplayName": "Ticket, Timo", "UserAccount": "TT007", @@ -83,6 +90,7 @@ "TicketId": "ff62a3e2-5004-4a8c-b71c-7ebb1877d1a4", "UserId": "0fad5e21-5a29-44c6-b532-46f862ea8694", "DisplayName": "TCK00407", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Netzlaufwerk Projekt X nicht erreichbar", "UserDisplayName": "Hanova, Hans", "UserAccount": "HH101", @@ -97,6 +105,7 @@ "TicketId": "1507691c-6d47-4ae3-83b3-ef483d84a246", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "TCK00408", + "ActivityType": "SPSActivityTypeTicket", "Summary": "VPN Konzentrator in Aussenstelle offline", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -107,6 +116,7 @@ "TicketId": "5c6d981e-9e67-4fde-b249-8c6288d325a7", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "DisplayName": "TCK00409", + "ActivityType": "SPSActivityTypeTicket", "Summary": "SAP Produktionsauftrag bricht ab", "UserDisplayName": "Boss, Bernd", "UserAccount": "BB003", @@ -119,6 +129,7 @@ "TicketId": "1507691c-6d47-4ae3-83b3-ef483d84a246", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "TCK00408", + "ActivityType": "SPSActivityTypeTicket", "Summary": "VPN Konzentrator in Aussenstelle offline", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -129,6 +140,7 @@ "TicketId": "9b7710d4-72da-4b2a-9d0c-be02575d2c52", "UserId": "a2c35ad1-7cc7-4b2b-9aa5-d03fdaecd155", "DisplayName": "TCK00410", + "ActivityType": "SPSActivityTypeTicket", "Summary": "WLAN im Lager faellt minutenweise aus", "UserDisplayName": "Kiefer, Maximilian", "UserAccount": "MK009", @@ -139,6 +151,7 @@ "TicketId": "5c6d981e-9e67-4fde-b249-8c6288d325a7", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "DisplayName": "TCK00409", + "ActivityType": "SPSActivityTypeTicket", "Summary": "SAP Produktionsauftrag bricht ab", "UserDisplayName": "Boss, Bernd", "UserAccount": "BB003", @@ -153,6 +166,7 @@ "TicketId": "de403992-98cb-4476-9e04-d645ab22e6de", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayName": "TCK00411", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Passwort muss zur\u00fcckgesetzt werden", "UserDisplayName": "Ticket, Timo", "UserAccount": "TT007", @@ -163,6 +177,7 @@ "TicketId": "7c29dd33-1247-453c-9db6-f7a59107d276", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "DisplayName": "TCK00412", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Techniker bittet um Rueckmeldung zum Notebook", "UserDisplayName": "Anwender, Peter", "UserAccount": "PA010", @@ -175,6 +190,7 @@ "TicketId": "de403992-98cb-4476-9e04-d645ab22e6de", "UserId": "42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a", "DisplayName": "TCK00411", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Passwort muss zur\u00fcckgesetzt werden", "UserDisplayName": "Ticket, Timo", "UserAccount": "TT007", @@ -185,6 +201,7 @@ "TicketId": "b207822d-7e1c-42a7-b8c9-4246f711dd18", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "TCK00413", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Wartungsfenster fuer Firewall verschieben", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -199,6 +216,7 @@ "TicketId": "e0ba7c81-f9b1-4e99-a4d6-efecc5e4312e", "UserId": "f69dd1a9-591f-4004-b950-264238663bf0", "DisplayName": "INC00401", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Teams Telefonie ist fuer Standort Sued offline", "UserDisplayName": "Ottmann, Thomas", "UserAccount": "TO011", @@ -209,6 +227,7 @@ "TicketId": "a8deb50d-9f15-4371-9ebc-a28791f27d5c", "UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2", "DisplayName": "INC00402", + "ActivityType": "SPSActivityTypeIncident", "Summary": "SharePoint Bereich Vertrieb laedt extrem langsam", "UserDisplayName": "Virtual, Vera", "UserAccount": "VV004", @@ -221,6 +240,7 @@ "TicketId": "fe15284f-f553-4434-8b59-7d8b9f481bf7", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "INC00403", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Firewall Cluster meldet Sync Fehler", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -231,6 +251,7 @@ "TicketId": "9cdddacf-9395-476b-811a-09c5f1491d4b", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "DisplayName": "INC00404", + "ActivityType": "SPSActivityTypeIncident", "Summary": "CRM Anmeldung liefert Timeout fuer Kundencenter", "UserDisplayName": "Anwender, Peter", "UserAccount": "PA010", @@ -245,6 +266,7 @@ "TicketId": "7e852bb9-420b-4caa-b79a-9178d793fc06", "UserId": "a2c35ad1-7cc7-4b2b-9aa5-d03fdaecd155", "DisplayName": "INC00405", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Windows Rollout haengt auf mehreren Clients", "UserDisplayName": "Kiefer, Maximilian", "UserAccount": "MK009", @@ -255,6 +277,7 @@ "TicketId": "3c3c70cf-5c60-4ecc-9313-b5f9c1968fc7", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "DisplayName": "INC00406", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Remotedesktop Sitzung trennt nach wenigen Minuten", "UserDisplayName": "Busch, Andrea", "UserAccount": "AB014", @@ -267,6 +290,7 @@ "TicketId": "486df93d-15b6-41d4-b902-2c1e1838c74b", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "INC00407", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Firewall Cluster meldet weiterhin Sync Fehler", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -277,6 +301,7 @@ "TicketId": "86da28b0-013b-4542-bcff-175044d5bb02", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "DisplayName": "INC00408", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Produktionslinie meldet keine Sensordaten", "UserDisplayName": "Zufall, Rainer", "UserAccount": "RZ011", @@ -287,6 +312,7 @@ "TicketId": "a1cf6635-a5c4-4401-b4f0-60b9c65b4d75", "UserId": "0fad5e21-5a29-44c6-b532-46f862ea8694", "DisplayName": "INC00409", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Exchange Transportdienst setzt Mails in Warteschlange", "UserDisplayName": "Hanova, Hans", "UserAccount": "HH101", @@ -301,6 +327,7 @@ "TicketId": "9aae7eca-39d7-441e-8b33-5fc6f34765c8", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "INC00410", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Kuehlung im Rechenzentrum U3 ausgefallen", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -313,6 +340,7 @@ "TicketId": "9aae7eca-39d7-441e-8b33-5fc6f34765c8", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "INC00410", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Kuehlung im Rechenzentrum U3 ausgefallen", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -323,6 +351,7 @@ "TicketId": "130ec52f-dac3-427d-803e-e7cf67e4a744", "UserId": "f69dd1a9-591f-4004-b950-264238663bf0", "DisplayName": "INC00411", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Kartenzahlung in den Filialen nicht moeglich", "UserDisplayName": "Ottmann, Thomas", "UserAccount": "TO011", @@ -333,6 +362,7 @@ "TicketId": "b7d22b65-c11e-459c-ac31-5b1c08e4118d", "UserId": "8c3ca0fb-f18c-4893-ad83-290e6e02f352", "DisplayName": "INC00412", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Datenbank Cluster benoetigt manuellen Failover", "UserDisplayName": "Perschmann, Paul", "UserAccount": "PP201", @@ -347,6 +377,7 @@ "TicketId": "d1a2c544-4f59-4f2b-875f-3621a23d4228", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "DisplayName": "INC00413", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Backup Team hat Rueckfrage zur Sicherung", "UserDisplayName": "Busch, Andrea", "UserAccount": "AB014", @@ -359,6 +390,7 @@ "TicketId": "74846c1b-9a97-420f-8bf2-91e88aa0516a", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "DisplayName": "INC00415", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Lieferant bittet um Rueckmeldung zu Offsite Backup", "UserDisplayName": "Anwender, Peter", "UserAccount": "PA010", @@ -369,6 +401,7 @@ "TicketId": "1372b3cf-5d87-4099-ab83-ec0cccf7194e", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "DisplayName": "INC00416", + "ActivityType": "SPSActivityTypeIncident", "Summary": "Fernwartung benoetigt Zugangsdaten zur SPS", "UserDisplayName": "Zufall, Rainer", "UserAccount": "RZ011", @@ -383,6 +416,7 @@ "TicketId": "e2e49f85-1a81-47e8-935b-d76898c155f6", "UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2", "DisplayName": "TCK00414", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt", "UserDisplayName": "Virtual, Vera", "UserAccount": "VV004", @@ -393,6 +427,7 @@ "TicketId": "ebe8818e-b197-411e-b56e-40b77b623ae2", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "DisplayName": "TCK00415", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Etikettendrucker im Lager meldet Papierstau", "UserDisplayName": "Anwender, Peter", "UserAccount": "PA010", @@ -405,6 +440,7 @@ "TicketId": "e2e49f85-1a81-47e8-935b-d76898c155f6", "UserId": "916db36b-fb6e-4212-81c1-e72acdab77d2", "DisplayName": "TCK00414", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Pool Notebook fuer Schulungsteilnehmer fehlt", "UserDisplayName": "Virtual, Vera", "UserAccount": "VV004", @@ -415,6 +451,7 @@ "TicketId": "ebe8818e-b197-411e-b56e-40b77b623ae2", "UserId": "436e8d67-1b9b-4b1a-83e9-0b1e8fa0173b", "DisplayName": "TCK00415", + "ActivityType": "SPSActivityTypeTicket", "Summary": "Etikettendrucker im Lager meldet Papierstau", "UserDisplayName": "Anwender, Peter", "UserAccount": "PA010", @@ -425,6 +462,7 @@ "TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "TCK00416", + "ActivityType": "SPSActivityTypeTicket", "Summary": "WLAN Controller im Werk startet zyklisch neu", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -439,6 +477,7 @@ "TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "TCK00416", + "ActivityType": "SPSActivityTypeTicket", "Summary": "WLAN Controller im Werk startet zyklisch neu", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -451,6 +490,7 @@ "TicketId": "9e1d5d1b-5a22-430e-99ea-59840257caab", "UserId": "deece196-d8b6-4a9c-a2b9-3c2ae9c6d4ec", "DisplayName": "TCK00416", + "ActivityType": "SPSActivityTypeTicket", "Summary": "WLAN Controller im Werk startet zyklisch neu", "UserDisplayName": "Seifert, Dominik", "UserAccount": "DS014", @@ -461,6 +501,7 @@ "TicketId": "d427dc61-9842-4464-b37a-612878d3de0f", "UserId": "a2164ecd-791f-482c-bea3-f089f14bec8a", "DisplayName": "TCK00417", + "ActivityType": "SPSActivityTypeTicket", "Summary": "SAP Buchungsjob bricht nachts wiederholt ab", "UserDisplayName": "Boss, Bernd", "UserAccount": "BB003", diff --git a/FasdCockpitCommunicationDemo/TicketOverviewDataStore.cs b/FasdCockpitCommunicationDemo/TicketOverviewDataStore.cs index 03a4841..5177bbc 100644 --- a/FasdCockpitCommunicationDemo/TicketOverviewDataStore.cs +++ b/FasdCockpitCommunicationDemo/TicketOverviewDataStore.cs @@ -34,6 +34,7 @@ namespace FasdCockpitCommunicationDemo public string TileKey { get; set; } = "TicketsNew"; public bool UseRoleScope { get; set; } public Guid? UserId { get; set; } + public string ActivityType { get; set; } public string DisplayNamePrefix { get; set; } = "TCK"; public string Summary { get; set; } public string StatusId { get; set; } = "New"; @@ -49,6 +50,7 @@ namespace FasdCockpitCommunicationDemo public Guid UserId { get; set; } public string TileKey { get; set; } public bool UseRoleScope { get; set; } + public string ActivityType { get; set; } public string DisplayName { get; set; } public string Summary { get; set; } public string StatusId { get; set; } @@ -167,6 +169,7 @@ namespace FasdCockpitCommunicationDemo TileKey = source.TileKey, UseRoleScope = source.UseRoleScope, UserId = source.UserId, + ActivityType = source.ActivityType, DisplayNamePrefix = source.DisplayNamePrefix, Summary = source.Summary, StatusId = source.StatusId, @@ -188,6 +191,7 @@ namespace FasdCockpitCommunicationDemo UserId = source.UserId, TileKey = source.TileKey, UseRoleScope = source.UseRoleScope, + ActivityType = source.ActivityType, DisplayName = source.DisplayName, Summary = source.Summary, StatusId = source.StatusId, diff --git a/FasdCockpitCommunicationDemo/TicketOverviewRelationDefinition.cs b/FasdCockpitCommunicationDemo/TicketOverviewRelationDefinition.cs index b98e0f6..f9f66d9 100644 --- a/FasdCockpitCommunicationDemo/TicketOverviewRelationDefinition.cs +++ b/FasdCockpitCommunicationDemo/TicketOverviewRelationDefinition.cs @@ -2,15 +2,16 @@ using System; namespace FasdCockpitCommunicationDemo { - public class TicketOverviewRelationDefinition - { - public Guid TicketId { get; set; } - public Guid UserId { get; set; } - public string DisplayName { get; set; } - public string Summary { get; set; } - public string StatusId { get; set; } - public string UserDisplayName { get; set; } - public string UserAccount { get; set; } - public string UserDomain { get; set; } + public class TicketOverviewRelationDefinition + { + public Guid TicketId { get; set; } + public Guid UserId { get; set; } + public string DisplayName { get; set; } + public string ActivityType { get; set; } + public string Summary { get; set; } + public string StatusId { get; set; } + public string UserDisplayName { get; set; } + public string UserAccount { get; set; } + public string UserDomain { get; set; } } } diff --git a/FasdDesktopUi/Basics/Services/TicketOverviewUpdateService.cs b/FasdDesktopUi/Basics/Services/TicketOverviewUpdateService.cs index 12e5243..6cc90a9 100644 --- a/FasdDesktopUi/Basics/Services/TicketOverviewUpdateService.cs +++ b/FasdDesktopUi/Basics/Services/TicketOverviewUpdateService.cs @@ -538,13 +538,14 @@ namespace FasdDesktopUi.Basics.Services } } - private cF4sdApiSearchResultRelation CreateRelationFromRecord(DemoTicketRecord record) - { - var relation = new cF4sdApiSearchResultRelation - { - Type = enumF4sdSearchResultClass.Ticket, - DisplayName = record.DisplayName, - Name = record.DisplayName, + private cF4sdApiSearchResultRelation CreateRelationFromRecord(DemoTicketRecord record) + { + var activityType = ResolveDemoActivityType(record?.ActivityType); + var relation = new cF4sdApiSearchResultRelation + { + Type = enumF4sdSearchResultClass.Ticket, + DisplayName = record.DisplayName, + Name = record.DisplayName, id = record.TicketId, Status = enumF4sdSearchResultStatus.Active, Infos = new Dictionary(StringComparer.OrdinalIgnoreCase) @@ -553,17 +554,25 @@ namespace FasdDesktopUi.Basics.Services ["StatusId"] = record.StatusId ?? string.Empty, ["UserDisplayName"] = record.UserDisplayName ?? string.Empty, ["UserAccount"] = record.UserAccount ?? string.Empty, - ["UserDomain"] = record.UserDomain ?? string.Empty + ["UserDomain"] = record.UserDomain ?? string.Empty, + ["ActivityType"] = activityType }, - Identities = new cF4sdIdentityList - { - new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = record.TicketId }, - new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = record.UserId } + Identities = new cF4sdIdentityList + { + new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = record.TicketId }, + new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = record.UserId } } }; - - return relation; - } + + return relation; + } + + private static string ResolveDemoActivityType(string configuredActivityType) + { + return string.IsNullOrWhiteSpace(configuredActivityType) + ? null + : configuredActivityType.Trim(); + } private DemoTicketDetail CloneDetail(DemoTicketDetail source) { @@ -734,15 +743,16 @@ namespace FasdDesktopUi.Basics.Services entry.CreationDate = createdAt; } - return new DemoTicketRecord - { - TicketId = relationId, - TileKey = string.IsNullOrWhiteSpace(template.TileKey) ? "TicketsNew" : template.TileKey, - UseRoleScope = template.UseRoleScope, - DisplayName = displayName, - Summary = summary, - StatusId = string.IsNullOrWhiteSpace(template.StatusId) ? "New" : template.StatusId, - UserDisplayName = template.UserDisplayName ?? detail.AffectedUser ?? "Ticket, Timo", + return new DemoTicketRecord + { + TicketId = relationId, + TileKey = string.IsNullOrWhiteSpace(template.TileKey) ? "TicketsNew" : template.TileKey, + UseRoleScope = template.UseRoleScope, + ActivityType = ResolveDemoActivityType(template.ActivityType), + DisplayName = displayName, + Summary = summary, + StatusId = string.IsNullOrWhiteSpace(template.StatusId) ? "New" : template.StatusId, + UserDisplayName = template.UserDisplayName ?? detail.AffectedUser ?? "Ticket, Timo", UserAccount = template.UserAccount ?? "TT007", UserDomain = template.UserDomain ?? "CONTOSO", UserId = template.UserId ?? Guid.Parse("42c760d6-90e8-469f-b2fe-ac7d4cc6cb0a"),