@page "/management-cockpit" @using TrafagSalesExporter.Models @using TrafagSalesExporter.Services @inject IManagementCockpitService CockpitService @inject ISnackbar Snackbar Management Cockpit Management Cockpit @foreach (var file in _files) { @file.DisplayName } Dateien laden @(_analyzing ? "Analysiere..." : "Cockpit erzeugen") @if (_result is not null) { Land@_result.Summary.Land TSC@_result.Summary.Tsc Umsatz@_result.Summary.SalesValueTotal.ToString("N2") Geschätzte Marge@($"{_result.Summary.EstimatedMarginPercent:F1}%") Management Aussagen @foreach (var finding in _result.Findings) { @finding.Title: @finding.Detail } Top Kunden @foreach (var item in _result.TopCustomers) { @($"{item.Label}: {item.Value:N2} ({item.SharePercent:F1}%)") } Top Produktgruppen @foreach (var item in _result.TopProductGroups) { @($"{item.Label}: {item.Value:N2} ({item.SharePercent:F1}%)") } Top Sales Owner @foreach (var item in _result.TopSalesEmployees) { @($"{item.Label}: {item.Value:N2} ({item.SharePercent:F1}%)") } Datenqualität @foreach (var entry in _result.DataQualityCounts.OrderByDescending(x => x.Value)) { @($"{entry.Key}: {entry.Value}") } } @code { private List _files = []; private string? _selectedFilePath; private ManagementCockpitResult? _result; private bool _loadingFiles; private bool _analyzing; protected override async Task OnInitializedAsync() { await ReloadFiles(); } private async Task ReloadFiles() { _loadingFiles = true; try { _files = await CockpitService.GetAvailableFilesAsync(); _selectedFilePath ??= _files.FirstOrDefault()?.Path; } finally { _loadingFiles = false; } } private async Task Analyze() { if (string.IsNullOrWhiteSpace(_selectedFilePath)) return; _analyzing = true; try { _result = await CockpitService.AnalyzeAsync(_selectedFilePath); } catch (Exception ex) { Snackbar.Add($"Cockpit konnte nicht erzeugt werden: {ex.Message}", Severity.Error); } finally { _analyzing = false; } } private static Severity MapSeverity(string severity) => severity switch { "Warning" => Severity.Warning, "Error" => Severity.Error, _ => Severity.Info }; }