314 lines
13 KiB
Plaintext
314 lines
13 KiB
Plaintext
@page "/settings"
|
|
@using Microsoft.EntityFrameworkCore
|
|
@using TrafagSalesExporter.Data
|
|
@using TrafagSalesExporter.Models
|
|
@using TrafagSalesExporter.Services
|
|
@inject IDbContextFactory<AppDbContext> DbFactory
|
|
@inject ISharePointUploadService SpService
|
|
@inject TimerBackgroundService TimerService
|
|
@inject IHanaQueryService HanaService
|
|
@inject ISnackbar Snackbar
|
|
|
|
<PageTitle>Settings</PageTitle>
|
|
|
|
<MudText Typo="Typo.h4" Class="mb-4">Settings</MudText>
|
|
|
|
@* SharePoint Config *@
|
|
<MudText Typo="Typo.h5" Class="mb-2">SharePoint Konfiguration</MudText>
|
|
<MudPaper Class="pa-4 mb-6" Elevation="1">
|
|
<MudGrid>
|
|
<MudItem xs="12" md="6">
|
|
<MudTextField @bind-Value="_spConfig.SiteUrl" Label="Site URL" />
|
|
</MudItem>
|
|
<MudItem xs="12" md="6">
|
|
<MudTextField @bind-Value="_spConfig.ExportFolder" Label="Export Folder" />
|
|
</MudItem>
|
|
<MudItem xs="12" md="4">
|
|
<MudTextField @bind-Value="_spConfig.TenantId" Label="Tenant ID" />
|
|
</MudItem>
|
|
<MudItem xs="12" md="4">
|
|
<MudTextField @bind-Value="_spConfig.ClientId" Label="Client ID" />
|
|
</MudItem>
|
|
<MudItem xs="12" md="4">
|
|
<MudTextField @bind-Value="_spConfig.ClientSecret" Label="Client Secret" InputType="InputType.Password" />
|
|
</MudItem>
|
|
<MudItem xs="12">
|
|
<MudStack Row Spacing="2">
|
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="SaveSharePoint"
|
|
StartIcon="@Icons.Material.Filled.Save">
|
|
Speichern
|
|
</MudButton>
|
|
<MudButton Variant="Variant.Outlined" Color="Color.Info" OnClick="TestSharePoint"
|
|
StartIcon="@Icons.Material.Filled.NetworkCheck" Disabled="_testingSp">
|
|
@if (_testingSp)
|
|
{
|
|
<MudProgressCircular Size="Size.Small" Indeterminate Class="mr-2" />
|
|
@("Teste...")
|
|
}
|
|
else
|
|
{
|
|
@("SharePoint Verbindung testen")
|
|
}
|
|
</MudButton>
|
|
</MudStack>
|
|
</MudItem>
|
|
</MudGrid>
|
|
</MudPaper>
|
|
|
|
<MudText Typo="Typo.h5" Class="mb-2">Zentrale Quellsystem-Zugangsdaten</MudText>
|
|
<MudPaper Class="pa-4 mb-6" Elevation="1">
|
|
<MudGrid>
|
|
<MudItem xs="12">
|
|
<MudAlert Severity="Severity.Info" Dense="true" Variant="Variant.Outlined">
|
|
Diese Zugangsdaten werden pro Quellsystem als Standard verwendet. Ein Standort kann sie bei Bedarf mit eigenen Overrides überschreiben.
|
|
</MudAlert>
|
|
</MudItem>
|
|
<MudItem xs="12" md="4">
|
|
<MudText Typo="Typo.h6" Class="mb-2">SAP</MudText>
|
|
<MudTextField @bind-Value="_exportSettings.SapUsername" Label="SAP Username" />
|
|
<MudTextField @bind-Value="_exportSettings.SapPassword" Label="SAP Password" InputType="InputType.Password" />
|
|
<MudButton Variant="Variant.Outlined" Color="Color.Info" OnClick='@(() => TestCentralCredentials("SAP"))'
|
|
StartIcon="@Icons.Material.Filled.NetworkCheck" Disabled='@_testingSystems.Contains("SAP")' Class="mt-2">
|
|
@if (_testingSystems.Contains("SAP"))
|
|
{
|
|
<MudProgressCircular Size="Size.Small" Indeterminate Class="mr-2" />
|
|
@("Teste...")
|
|
}
|
|
else
|
|
{
|
|
@("SAP testen")
|
|
}
|
|
</MudButton>
|
|
</MudItem>
|
|
<MudItem xs="12" md="4">
|
|
<MudText Typo="Typo.h6" Class="mb-2">BI1</MudText>
|
|
<MudTextField @bind-Value="_exportSettings.Bi1Username" Label="BI1 Username" />
|
|
<MudTextField @bind-Value="_exportSettings.Bi1Password" Label="BI1 Password" InputType="InputType.Password" />
|
|
<MudButton Variant="Variant.Outlined" Color="Color.Info" OnClick='@(() => TestCentralCredentials("BI1"))'
|
|
StartIcon="@Icons.Material.Filled.NetworkCheck" Disabled='@_testingSystems.Contains("BI1")' Class="mt-2">
|
|
@if (_testingSystems.Contains("BI1"))
|
|
{
|
|
<MudProgressCircular Size="Size.Small" Indeterminate Class="mr-2" />
|
|
@("Teste...")
|
|
}
|
|
else
|
|
{
|
|
@("BI1 testen")
|
|
}
|
|
</MudButton>
|
|
</MudItem>
|
|
<MudItem xs="12" md="4">
|
|
<MudText Typo="Typo.h6" Class="mb-2">SAGE</MudText>
|
|
<MudTextField @bind-Value="_exportSettings.SageUsername" Label="SAGE Username" />
|
|
<MudTextField @bind-Value="_exportSettings.SagePassword" Label="SAGE Password" InputType="InputType.Password" />
|
|
<MudButton Variant="Variant.Outlined" Color="Color.Info" OnClick='@(() => TestCentralCredentials("SAGE"))'
|
|
StartIcon="@Icons.Material.Filled.NetworkCheck" Disabled='@_testingSystems.Contains("SAGE")' Class="mt-2">
|
|
@if (_testingSystems.Contains("SAGE"))
|
|
{
|
|
<MudProgressCircular Size="Size.Small" Indeterminate Class="mr-2" />
|
|
@("Teste...")
|
|
}
|
|
else
|
|
{
|
|
@("SAGE testen")
|
|
}
|
|
</MudButton>
|
|
</MudItem>
|
|
<MudItem xs="12">
|
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="SaveExportSettings"
|
|
StartIcon="@Icons.Material.Filled.Save">
|
|
Speichern
|
|
</MudButton>
|
|
</MudItem>
|
|
</MudGrid>
|
|
</MudPaper>
|
|
|
|
@* Export Settings *@
|
|
<MudText Typo="Typo.h5" Class="mb-2">Export Einstellungen</MudText>
|
|
<MudPaper Class="pa-4 mb-6" Elevation="1">
|
|
<MudGrid>
|
|
<MudItem xs="12" md="4">
|
|
<MudTextField @bind-Value="_exportSettings.DateFilter" Label="Datum-Filter (ab)"
|
|
HelperText="Format: yyyy-MM-dd" />
|
|
</MudItem>
|
|
<MudItem xs="12" md="2">
|
|
<MudNumericField @bind-Value="_exportSettings.TimerHour" Label="Timer Stunde" Min="0" Max="23" />
|
|
</MudItem>
|
|
<MudItem xs="12" md="2">
|
|
<MudNumericField @bind-Value="_exportSettings.TimerMinute" Label="Timer Minute" Min="0" Max="59" />
|
|
</MudItem>
|
|
<MudItem xs="12" md="4">
|
|
<MudSwitch @bind-Value="_exportSettings.TimerEnabled" Label="Timer aktiviert" Color="Color.Primary" />
|
|
</MudItem>
|
|
<MudItem xs="12">
|
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="SaveExportSettings"
|
|
StartIcon="@Icons.Material.Filled.Save">
|
|
Speichern
|
|
</MudButton>
|
|
</MudItem>
|
|
</MudGrid>
|
|
</MudPaper>
|
|
|
|
@* Filename Preview *@
|
|
<MudText Typo="Typo.h5" Class="mb-2">Dateiname Vorschau</MudText>
|
|
<MudPaper Class="pa-4" Elevation="1">
|
|
<MudText Typo="Typo.body1">
|
|
<MudIcon Icon="@Icons.Material.Filled.InsertDriveFile" Size="Size.Small" Class="mr-1" />
|
|
Sales_{"{TSC}"}_{DateTime.Now:yyyy-MM-dd}.xlsx
|
|
</MudText>
|
|
<MudText Typo="Typo.caption" Class="mt-1">
|
|
Beispiel: Sales_TRFR_@(DateTime.Now.ToString("yyyy-MM-dd")).xlsx
|
|
</MudText>
|
|
</MudPaper>
|
|
|
|
@code {
|
|
private SharePointConfig _spConfig = new();
|
|
private ExportSettings _exportSettings = new();
|
|
private bool _testingSp;
|
|
private readonly HashSet<string> _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 (!_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
|
|
};
|
|
}
|