@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") Zentrale Roh-Auswertung Diese Sicht arbeitet direkt auf `CentralSalesRecords` und zeigt nur fachlich neutrale Rohkennzahlen. Kein Intercompany-Filter, keine CHF-Umrechnung, kein Budget, keine Spartenlogik. @foreach (var year in _centralYears) { @year } @foreach (var month in Enumerable.Range(1, 12)) { @($"{month:D2}") } @(_analyzingCentral ? "Analysiere..." : "Zentrale Auswertung laden") @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}") } } @if (_centralResult is not null) { Zeilen@_centralResult.Summary.RowCount.ToString("N0") Rechnungen@_centralResult.Summary.InvoiceCount.ToString("N0") Standorte@_centralResult.Summary.SiteCount.ToString("N0") Länder@_centralResult.Summary.CountryCount.ToString("N0") Währungen@_centralResult.Summary.CurrencyCount.ToString("N0") Periode@BuildPeriodLabel(_centralResult) Hinweise @foreach (var notice in _centralResult.Notices) { @notice } Jahresumsatz 2025/2026 Jahr Währung Umsatz Zeilen @context.Year @context.Currency @context.SalesValue.ToString("N2") @context.RowCount.ToString("N0") Monatsumsatz Monat Währung Umsatz Zeilen @context.Label @context.Currency @context.SalesValue.ToString("N2") @context.RowCount.ToString("N0") Tagesumsatz im ausgewählten Monat Tag Währung Umsatz Zeilen @context.Label @context.Currency @context.SalesValue.ToString("N2") @context.RowCount.ToString("N0") Für die Tagessicht bitte zusätzlich einen Monat wählen. Umsatz nach Quelle Quelle Währung Umsatz Rechnungen @context.Label @context.Currency @context.SalesValue.ToString("N2") @context.InvoiceCount.ToString("N0") Umsatz nach Land Land Währung Umsatz Rechnungen Zeilen @context.Label @context.Currency @context.SalesValue.ToString("N2") @context.InvoiceCount.ToString("N0") @context.RowCount.ToString("N0") } @code { private List _files = []; private List _centralYears = []; private string? _selectedFilePath; private ManagementCockpitResult? _result; private ManagementCockpitCentralResult? _centralResult; private int _selectedCentralYear; private int? _selectedCentralMonth; private bool _loadingFiles; private bool _analyzing; private bool _analyzingCentral; protected override async Task OnInitializedAsync() { await ReloadFiles(); await ReloadCentralYears(); } private async Task ReloadFiles() { _loadingFiles = true; try { _files = await CockpitService.GetAvailableFilesAsync(); _selectedFilePath ??= _files.FirstOrDefault()?.Path; } finally { _loadingFiles = false; } } private async Task ReloadCentralYears() { _centralYears = await CockpitService.GetAvailableCentralYearsAsync(); if (_selectedCentralYear == 0) _selectedCentralYear = _centralYears.LastOrDefault(); } 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 async Task AnalyzeCentral() { if (_selectedCentralYear == 0) return; _analyzingCentral = true; try { _centralResult = await CockpitService.AnalyzeCentralAsync(_selectedCentralYear, _selectedCentralMonth); } catch (Exception ex) { Snackbar.Add($"Zentrale Auswertung konnte nicht erzeugt werden: {ex.Message}", Severity.Error); } finally { _analyzingCentral = false; } } private static Severity MapSeverity(string severity) => severity switch { "Warning" => Severity.Warning, "Error" => Severity.Error, _ => Severity.Info }; private static string BuildPeriodLabel(ManagementCockpitCentralResult result) { if (result.Summary.PeriodStart is null || result.Summary.PeriodEnd is null) return "-"; return $"{result.Summary.PeriodStart.Value:dd.MM.yyyy} - {result.Summary.PeriodEnd.Value:dd.MM.yyyy}"; } }