@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}";
}
}