@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 ISapGatewayService SapGatewayService @inject ISnackbar Snackbar Settings Settings @* SharePoint Config *@ SharePoint Konfiguration Speichern @if (_testingSp) { @("Teste...") } else { @("SharePoint Verbindung testen") } 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 Speichern @* Filename Preview *@ Dateiname Vorschau Sales_{"{TSC}"}_{DateTime.Now:yyyy-MM-dd}.xlsx Beispiel: Sales_TRFR_@(DateTime.Now.ToString("yyyy-MM-dd")).xlsx @code { private SharePointConfig _spConfig = new(); private ExportSettings _exportSettings = new(); private bool _testingSp; private readonly HashSet _testingSystems = []; protected override async Task OnInitializedAsync() { using var db = await DbFactory.CreateDbContextAsync(); _spConfig = await db.SharePointConfigs.FirstOrDefaultAsync() ?? new SharePointConfig(); _exportSettings = await db.ExportSettings.FirstOrDefaultAsync() ?? new ExportSettings(); } private async Task SaveSharePoint() { using var db = await DbFactory.CreateDbContextAsync(); var existing = await db.SharePointConfigs.FirstOrDefaultAsync(); if (existing is null) { db.SharePointConfigs.Add(_spConfig); } else { existing.SiteUrl = _spConfig.SiteUrl; existing.ExportFolder = _spConfig.ExportFolder; existing.TenantId = _spConfig.TenantId; existing.ClientId = _spConfig.ClientId; existing.ClientSecret = _spConfig.ClientSecret; } await db.SaveChangesAsync(); Snackbar.Add("SharePoint Konfiguration gespeichert", Severity.Success); } private async Task TestSharePoint() { _testingSp = true; try { await SpService.TestConnectionAsync( _spConfig.TenantId, _spConfig.ClientId, _spConfig.ClientSecret, _spConfig.SiteUrl); Snackbar.Add("SharePoint Verbindung erfolgreich!", Severity.Success); } catch (Exception ex) { Snackbar.Add($"Verbindung fehlgeschlagen: {ex.Message}", Severity.Error); } finally { _testingSp = false; } } private async Task SaveExportSettings() { using var db = await DbFactory.CreateDbContextAsync(); var existing = await db.ExportSettings.FirstOrDefaultAsync(); if (existing is null) { db.ExportSettings.Add(_exportSettings); } else { existing.DateFilter = _exportSettings.DateFilter; 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 (sourceSystem == "SAP") { await TestCentralSapCredentials(); return; } await TestCentralHanaCredentials(sourceSystem); } private async Task TestCentralHanaCredentials(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 async Task TestCentralSapCredentials() { const string sourceSystem = "SAP"; 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 SAP sind keine zentralen Gateway-Zugangsdaten gepflegt.", Severity.Warning); return; } using var db = await DbFactory.CreateDbContextAsync(); var site = await db.Sites .Where(s => (string.IsNullOrWhiteSpace(s.SourceSystem) ? "SAP" : s.SourceSystem) == sourceSystem && !string.IsNullOrWhiteSpace(s.SapServiceUrl)) .OrderBy(s => s.Land) .FirstOrDefaultAsync(); if (site is null) { Snackbar.Add("Kein SAP-Standort mit Service URL gefunden.", Severity.Warning); return; } await SapGatewayService.TestConnectionAsync(site.SapServiceUrl, username.Trim(), password.Trim()); Snackbar.Add($"SAP: Gateway-Verbindung erfolgreich über Standort '{site.Land}'.", Severity.Success); } catch (Exception ex) { Snackbar.Add($"SAP: {ex.Message}", 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 }; }