From 195d5c91885fd508588c898c3740c80a6f22bda0 Mon Sep 17 00:00:00 2001 From: Meik Date: Wed, 4 Feb 2026 11:22:55 +0100 Subject: [PATCH] aktueller Stand --- FasdDesktopUi/App.xaml.cs | 2 +- .../Ticket/CloseCaseDialogWithTicket.xaml.cs | 73 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/FasdDesktopUi/App.xaml.cs b/FasdDesktopUi/App.xaml.cs index 9bf006c..09c1b36 100644 --- a/FasdDesktopUi/App.xaml.cs +++ b/FasdDesktopUi/App.xaml.cs @@ -506,7 +506,7 @@ namespace FasdDesktopUi closeUserSessionTask = cFasdCockpitCommunicationBase.Instance?.CloseUserSession(cFasdCockpitConfig.SessionId).ConfigureAwait(false); } - await cFasdCockpitCommunicationBase.Instance.TerminateAsync(); + await cFasdCockpitCommunicationBase.Instance?.TerminateAsync(); if (notifyIcon != null) { diff --git a/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml.cs b/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml.cs index bee7782..6203b34 100644 --- a/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml.cs +++ b/FasdDesktopUi/Basics/UserControls/Ticket/CloseCaseDialogWithTicket.xaml.cs @@ -69,6 +69,8 @@ namespace FasdDesktopUi.Basics.UserControls private const string CategoryTableNamePrimary = "M42Wpm-Ticket-Categories"; private const string CategoryTableNameLegacy = "M42Wpm-Ticket-CloseCase-Categories"; + private const string TicketDetailsTableName = "M42Wpm-Tickets"; + private const string TicketDetailsCategoryIdColumnName = "CategoryId"; private string activeCategoryTableName = CategoryTableNamePrimary; private static readonly Brush SharedValidationBorderBrush = CreateValidationBrush(); @@ -240,6 +242,7 @@ namespace FasdDesktopUi.Basics.UserControls EnableHoldTicketAction = statusId != enumTicketStatus.OnHold; } TrySelectTicketCategoryFromTicketInfos(); + _ = EnsureSelectedTicketCategoryFromDetailsAsync(_selectedTicket); } } @@ -1182,6 +1185,76 @@ namespace FasdDesktopUi.Basics.UserControls } } + private bool ShouldLoadCategoryFromDetails(cF4sdApiSearchResultRelation ticket) + { + if (ticket == null || ticket == _newTicketRelation || ticket == _selectTicketRelation || ticket == _noTicketRelation) + return false; + + if (ticket.Infos == null) + return true; + + if (!ticket.Infos.TryGetValue(TicketInfoKeys.Category, out var categoryValue) || string.IsNullOrWhiteSpace(categoryValue)) + return true; + + return !Guid.TryParse(categoryValue, out _); + } + + private async Task EnsureSelectedTicketCategoryFromDetailsAsync(cF4sdApiSearchResultRelation ticket) + { + try + { + if (!ShouldLoadCategoryFromDetails(ticket)) + return; + + var communication = cFasdCockpitCommunicationBase.Instance; + if (communication == null) + return; + + var request = new cF4sdHealthCardRawDataRequest + { + Tables = new List { TicketDetailsTableName }, + Identities = new cF4sdIdentityList + { + new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = ticket.id } + }, + MaxAge = 1 + }; + + var rawData = await communication.GetHealthCardData(request).ConfigureAwait(false); + if (rawData?.Tables == null) + return; + + if (!rawData.Tables.TryGetValue(TicketDetailsTableName, out var ticketTable)) + return; + + if (!ticketTable.Columns.TryGetValue(TicketDetailsCategoryIdColumnName, out var categoryColumn)) + return; + + var categoryId = categoryColumn.Values?.FirstOrDefault()?.ToString(); + if (string.IsNullOrWhiteSpace(categoryId)) + return; + + await Dispatcher.InvokeAsync(() => + { + if (SelectedTicket == null) + return; + + if (!ReferenceEquals(SelectedTicket, ticket) && SelectedTicket.id != ticket.id) + return; + + if (SelectedTicket.Infos == null) + SelectedTicket.Infos = new Dictionary(StringComparer.OrdinalIgnoreCase); + + SelectedTicket.Infos[TicketInfoKeys.Category] = categoryId; + TrySelectTicketCategoryFromTicketInfos(); + }); + } + catch (Exception E) + { + LogException(E); + } + } + private Guid? GetSelectedCategoryGuid() { if (SelectedCategory == null || string.IsNullOrWhiteSpace(SelectedCategory.Id))