From df90a4a17254c9200de2c03aca78576aa754ab33 Mon Sep 17 00:00:00 2001 From: metacube Date: Tue, 14 Apr 2026 10:05:59 +0200 Subject: [PATCH] Zentrales PW --- .../Components/Pages/Settings.razor | 149 ++++++++++++++++++ .../Components/Pages/Standorte.razor | 13 ++ TrafagSalesExporter/Models/ExportSettings.cs | 6 + TrafagSalesExporter/Models/HanaServer.cs | 5 +- TrafagSalesExporter/Models/Site.cs | 4 + .../Services/DatabaseInitializationService.cs | 8 + .../Services/SiteExportService.cs | 52 +++++- 7 files changed, 235 insertions(+), 2 deletions(-) diff --git a/TrafagSalesExporter/Components/Pages/Settings.razor b/TrafagSalesExporter/Components/Pages/Settings.razor index 848d481..bedc436 100644 --- a/TrafagSalesExporter/Components/Pages/Settings.razor +++ b/TrafagSalesExporter/Components/Pages/Settings.razor @@ -1,10 +1,12 @@ @page "/settings" @using Microsoft.EntityFrameworkCore @using TrafagSalesExporter.Data +@using TrafagSalesExporter.Models @using TrafagSalesExporter.Services @inject IDbContextFactory DbFactory @inject ISharePointUploadService SpService @inject TimerBackgroundService TimerService +@inject IHanaQueryService HanaService @inject ISnackbar Snackbar Settings @@ -53,6 +55,74 @@ +Zentrale Quellsystem-Zugangsdaten + + + + + Diese Zugangsdaten werden pro Quellsystem als Standard verwendet. Ein Standort kann sie bei Bedarf mit eigenen Overrides überschreiben. + + + + SAP + + + + @if (_testingSystems.Contains("SAP")) + { + + @("Teste...") + } + else + { + @("SAP testen") + } + + + + BI1 + + + + @if (_testingSystems.Contains("BI1")) + { + + @("Teste...") + } + else + { + @("BI1 testen") + } + + + + SAGE + + + + @if (_testingSystems.Contains("SAGE")) + { + + @("Teste...") + } + else + { + @("SAGE testen") + } + + + + + Speichern + + + + + @* Export Settings *@ Export Einstellungen @@ -95,6 +165,7 @@ private SharePointConfig _spConfig = new(); private ExportSettings _exportSettings = new(); private bool _testingSp; + private readonly HashSet _testingSystems = []; protected override async Task OnInitializedAsync() { @@ -156,9 +227,87 @@ existing.TimerHour = _exportSettings.TimerHour; existing.TimerMinute = _exportSettings.TimerMinute; existing.TimerEnabled = _exportSettings.TimerEnabled; + existing.SapUsername = _exportSettings.SapUsername; + existing.SapPassword = _exportSettings.SapPassword; + existing.Bi1Username = _exportSettings.Bi1Username; + existing.Bi1Password = _exportSettings.Bi1Password; + existing.SageUsername = _exportSettings.SageUsername; + existing.SagePassword = _exportSettings.SagePassword; } await db.SaveChangesAsync(); TimerService.Recalculate(); Snackbar.Add("Export Einstellungen gespeichert", Severity.Success); } + + private async Task TestCentralCredentials(string sourceSystem) + { + if (!_testingSystems.Add(sourceSystem)) + return; + + try + { + var username = GetCentralUsername(sourceSystem); + var password = GetCentralPassword(sourceSystem); + + if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password)) + { + Snackbar.Add($"Für {sourceSystem} sind keine zentralen Zugangsdaten gepflegt.", Severity.Warning); + return; + } + + using var db = await DbFactory.CreateDbContextAsync(); + var site = await db.Sites + .Include(s => s.HanaServer) + .Where(s => (string.IsNullOrWhiteSpace(s.SourceSystem) ? "SAP" : s.SourceSystem) == sourceSystem) + .OrderBy(s => s.Land) + .FirstOrDefaultAsync(); + + if (site?.HanaServer is null) + { + Snackbar.Add($"Kein Standort mit Quellsystem {sourceSystem} und HANA-Verbindung gefunden.", Severity.Warning); + return; + } + + var testServer = new HanaServer + { + Name = $"{sourceSystem} Central Test", + Host = site.HanaServer.Host, + Port = site.HanaServer.Port, + Username = username.Trim(), + Password = password.Trim(), + DatabaseName = site.HanaServer.DatabaseName, + UseSsl = site.HanaServer.UseSsl, + ValidateCertificate = site.HanaServer.ValidateCertificate, + AdditionalParams = site.HanaServer.AdditionalParams + }; + + var result = await Task.Run(() => HanaService.TestConnectionDetailed(testServer)); + if (result.Success) + { + Snackbar.Add($"{sourceSystem}: Verbindung erfolgreich über Standort '{site.Land}'.", Severity.Success); + } + else + { + Snackbar.Add($"{sourceSystem}: {result.ExceptionType} - {result.ErrorMessage}", Severity.Error); + } + } + finally + { + _testingSystems.Remove(sourceSystem); + } + } + + private string GetCentralUsername(string sourceSystem) => sourceSystem switch + { + "BI1" => _exportSettings.Bi1Username, + "SAGE" => _exportSettings.SageUsername, + _ => _exportSettings.SapUsername + }; + + private string GetCentralPassword(string sourceSystem) => sourceSystem switch + { + "BI1" => _exportSettings.Bi1Password, + "SAGE" => _exportSettings.SagePassword, + _ => _exportSettings.SapPassword + }; } diff --git a/TrafagSalesExporter/Components/Pages/Standorte.razor b/TrafagSalesExporter/Components/Pages/Standorte.razor index 48cbefc..87012a4 100644 --- a/TrafagSalesExporter/Components/Pages/Standorte.razor +++ b/TrafagSalesExporter/Components/Pages/Standorte.razor @@ -141,11 +141,18 @@ @system } + + HANA-Verbindung + + Host, Port und technische HANA-Parameter kommen von dieser Verbindung. Username und Password hier dienen nur noch als Fallback für bestehende Einträge. + _hanaService.GetSalesRecords( - site.HanaServer, site.Schema, site.TSC, site.Land, settings.DateFilter)); + exportServer, site.Schema, site.TSC, site.Land, settings.DateFilter)); updateStatus?.Invoke("Transformationen anwenden..."); var rules = await db.FieldTransformationRules @@ -111,4 +112,53 @@ public class SiteExportService : ISiteExportService }; } } + + private static HanaServer BuildEffectiveServer(Site site, ExportSettings settings) + { + if (site.HanaServer is null) + throw new InvalidOperationException($"Standort '{site.Land}' hat keinen HANA-Server."); + + var sourceSystem = string.IsNullOrWhiteSpace(site.SourceSystem) ? "SAP" : site.SourceSystem.Trim().ToUpperInvariant(); + var inheritedUsername = GetCentralUsername(sourceSystem, settings); + var inheritedPassword = GetCentralPassword(sourceSystem, settings); + + return new HanaServer + { + Id = site.HanaServer.Id, + Name = site.HanaServer.Name, + Host = site.HanaServer.Host, + Port = site.HanaServer.Port, + Username = FirstNonEmpty(site.UsernameOverride, inheritedUsername, site.HanaServer.Username), + Password = FirstNonEmpty(site.PasswordOverride, inheritedPassword, site.HanaServer.Password), + DatabaseName = site.HanaServer.DatabaseName, + UseSsl = site.HanaServer.UseSsl, + ValidateCertificate = site.HanaServer.ValidateCertificate, + AdditionalParams = site.HanaServer.AdditionalParams + }; + } + + private static string GetCentralUsername(string sourceSystem, ExportSettings settings) => sourceSystem switch + { + "BI1" => settings.Bi1Username, + "SAGE" => settings.SageUsername, + _ => settings.SapUsername + }; + + private static string GetCentralPassword(string sourceSystem, ExportSettings settings) => sourceSystem switch + { + "BI1" => settings.Bi1Password, + "SAGE" => settings.SagePassword, + _ => settings.SapPassword + }; + + private static string FirstNonEmpty(params string[] values) + { + foreach (var value in values) + { + if (!string.IsNullOrWhiteSpace(value)) + return value.Trim(); + } + + return string.Empty; + } }