@page "/management-cockpit"
@rendermode @(Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer)
@using System.Globalization
@using Microsoft.AspNetCore.Components
@using Microsoft.JSInterop
@using TrafagSalesExporter.Models
@using TrafagSalesExporter.Services
@inject IManagementCockpitPageService CockpitPageService
@inject ISnackbar Snackbar
@inject IUiTextService UiText
@inject IJSRuntime JsRuntime
@T("Management Analyse", "Management analysis")@T("Management Analyse", "Management analysis")
@foreach (var year in _financeYearOptions)
{
@year
}
@foreach (var option in _financeCountryOptions)
{
@option
}
@foreach (var option in _financeCurrencyOptions)
{
@option
}
@(_analyzingFinance ? T("Lade...", "Loading...") : T("Finance Summary laden", "Load finance summary"))
@if (_financeResult is not null)
{
@T("Net Sales Actual", "Net sales actual")@FormatValue(_financeResult.NetSalesActual, _financeResult.DisplayCurrency)@($"{_financeResult.Filter.Year}")@T("Laender OK", "Countries OK")@_financeResult.CountryRows.Count(row => row.Status == "OK").ToString("N0")@T("Soll/Ist ohne Abweichung", "Actual/reference without deviation")@T("Zu pruefen", "To check")@_financeResult.CountryRows.Count(row => row.Status == "Pruefen").ToString("N0")@T("Abweichung oder offene Regel", "Deviation or open rule")@T("Datenstandorte", "Data sites")@_financeResult.DataStatusRows.Count(row => row.IsActive).ToString("N0")@T("aktive Quellen", "active sources")@T("Finance-Freigabe je Land", "Finance approval by country")@T("Status", "Status")@T("Land", "Country")@T("Ist", "Actual")@T("Soll", "Reference")@T("Differenz", "Difference")@T("Datenstand", "Data status")@T("Hinweis", "Note")@context.Status@FormatCountryWithFlag(context.CountryKey)@FormatValue(context.NetSalesActual, context.Currency)@FormatNullableValue(context.ReferenceValue, context.Currency)@FormatNullableValue(context.Difference, context.Currency)@BuildDataStatusText(context)@BuildQuickFinanceNote(context)@T("Letzter Datenstand je Standort", "Latest data status by site")@T("Aktiv", "Active")@T("Land", "Country")TSC@T("Quelle", "Source")@T("Zentrale Zeilen", "Central rows")@T("Letzter Export", "Latest export")@T("Status", "Status")@T("Manual Import", "Manual import")@context.Land@context.Tsc@context.SourceSystem@context.RowCount.ToString("N0")@FormatDateTime(context.LatestExportAt)@(string.IsNullOrWhiteSpace(context.LatestExportStatus) ? "-" : context.LatestExportStatus)@FormatManualImportStatus(context)@T("Sparten-Abdeckung nach Land", "Division coverage by country")@T("Land", "Country")TSC@T("Gesamtumsatz", "Total sales")@T("Zugeordnet", "Assigned")@T("Nicht im Stamm", "Not in master")@T("Abdeckung", "Coverage")@FormatCountryWithFlag(context.CountryKey)@context.Tsc@FormatValue(context.TotalValue, context.Currency)@FormatValue(context.AssignedValue, context.Currency)@FormatValue(context.MissingReferenceValue, context.Currency)@FormatPercent(context.AssignedValuePercent)@T("Net Sales Actual", "Net sales actual")@FormatValue(_financeResult.NetSalesActual, _financeResult.DisplayCurrency)@T("gefiltertes Endergebnis", "filtered final result")@T("Enthaltene Zeilen", "Included rows")@_financeResult.IncludedRows.ToString("N0")@T("Finance Include = TRUE", "Finance Include = TRUE")@T("Ausgeschlossen", "Excluded")@_financeResult.ExcludedRows.ToString("N0")@T("Finance-Regeln", "Finance rules")@T("Laender / Waehrungen", "Countries / currencies")@($"{_financeResult.CountryCount:N0} / {_financeResult.CurrencyCount:N0}")@($"{_financeResult.Filter.Year}")@T("Summen wie im Excel-Blatt Finance Summary", "Totals matching the Finance Summary Excel sheet")@T("Jahr", "Year")@T("Land", "Country")@T("Waehrung", "Currency")@T("Net Sales Actual", "Net sales actual")@T("Enthalten", "Included")@T("Ausgeschlossen", "Excluded")@context.Year@FormatCountryWithFlag(context.CountryKey)@context.Currency@FormatValue(context.NetSalesActual, context.Currency)@context.IncludedRows.ToString("N0")@context.ExcludedRows.ToString("N0")
@T("Keine Finance-Summary-Daten fuer diese Filter.", "No finance summary data for these filters.")
@T("Hinweise", "Notes")
@foreach (var notice in _financeResult.Notices)
{
@notice
}
@T("Jahresvergleich mit aktuellem Filter", "Year comparison with current filter")@T("Jahr", "Year")@T("Waehrung", "Currency")@T("Net Sales Actual", "Net sales actual")@T("Enthalten", "Included")@T("Ausgeschlossen", "Excluded")@context.Year@context.Currency@FormatValue(context.NetSalesActual, context.Currency)@context.IncludedRows.ToString("N0")@context.ExcludedRows.ToString("N0")@T("Finance-Status nach Land", "Finance status by country")@T("Status", "Status")@T("Land", "Country")TSC@T("Quelle", "Source")@T("Waehrung", "Currency")@T("Ist", "Actual")@T("IC/2nd-party", "IC/2nd-party")@T("Ist ohne IC", "Actual excl. IC")@T("Soll", "Reference")@T("Differenz", "Difference")@T("Zeilen", "Rows")@context.Status@FormatCountryWithFlag(context.CountryKey)@context.Tscs@context.SourceSystems@context.Currency@FormatValue(context.NetSalesActual, context.Currency)@FormatValue(context.IntercompanyValue, context.Currency)@FormatValue(context.NetSalesActualExcludingIntercompany, context.Currency)@FormatNullableValue(context.ReferenceValue, context.Currency)@FormatNullableValue(context.Difference, context.Currency)@context.IncludedRows.ToString("N0") / @context.ExcludedRows.ToString("N0")@T("Keine Laenderdaten fuer diese Filter.", "No country data for these filters.")@T("Datenbestand nach Standort", "Data inventory by site")@T("Aktiv", "Active")@T("Land", "Country")TSC@T("Quelle", "Source")@T("Zentrale Zeilen", "Central rows")@T("Letzter Export", "Latest export")@T("Exportstatus", "Export status")@T("Letzte Speicherung", "Latest stored")@T("Manual Import", "Manual import")@context.Land@context.Tsc@context.SourceSystem@context.RowCount.ToString("N0")@FormatDateTime(context.LatestExportAt)@(string.IsNullOrWhiteSpace(context.LatestExportStatus) ? "-" : context.LatestExportStatus)@FormatDateTime(context.LatestStoredAtUtc)@FormatManualImportStatus(context)@T("Soll/Ist-Abweichungen", "Actual/reference deviations")@T("Status", "Status")@T("Land", "Country")@T("Waehrung", "Currency")@T("Ist", "Actual")@T("Soll", "Reference")@T("Differenz", "Difference")%@context.Status@FormatCountryWithFlag(context.CountryKey)@context.Currency@FormatValue(context.NetSalesActual, context.Currency)@FormatNullableValue(context.ReferenceValue, context.Currency)@FormatNullableValue(context.Difference, context.Currency)@FormatPercent(context.DifferencePercent)@T("Keine Sollwerte oder keine Abweichungen fuer diese Filter.", "No reference values or deviations for these filters.")@T("Gutschriften-Kandidaten", "Credit-note candidates")
@T("Diese Sicht zeigt technische Kandidaten anhand negativer Werte und erkennbarer Belegtypen/-nummern. Sie ersetzt keine landesspezifische Fachfreigabe.",
"This view shows technical candidates based on negative values and recognizable document types/numbers. It does not replace country-specific business approval.")
@T("Land", "Country")TSC@T("Rechnung", "Invoice")@T("Typ", "Type")@T("Wert", "Value")@T("Menge", "Quantity")@T("Grund", "Reason")@FormatCountryWithFlag(context.CountryKey)@context.Tsc@context.InvoiceNumber@context.DocumentType@FormatValue(context.NetSalesActual, context.Currency)@context.Quantity.ToString("N2")@context.Reason@T("Keine Gutschriften-Kandidaten fuer diese Filter.", "No credit-note candidates for these filters.")@T("Pruefpunkte", "Checkpoints")@T("Status", "Status")@T("Pruefpunkt", "Checkpoint")@T("Anzahl", "Count")@context.Severity@context.Issue@context.Count.ToString("N0")@T("Keine Datenqualitaetsauffaelligkeiten fuer diese Filter.", "No data-quality findings for these filters.")@T("Gesamtumsatz", "Total sales")@FormatValue(_financeResult.ProductFinanceSummary.TotalValue, _financeResult.ProductFinanceSummary.DisplayCurrency)@T("Zugeordneter Umsatz", "Assigned sales")@FormatValue(_financeResult.ProductFinanceSummary.AssignedValue, _financeResult.ProductFinanceSummary.DisplayCurrency)@FormatPercent(_financeResult.ProductFinanceSummary.AssignedValuePercent)@T("Nicht zugeordnet", "Unassigned")@FormatValue(_financeResult.ProductFinanceSummary.UnassignedValue, _financeResult.ProductFinanceSummary.DisplayCurrency)@FormatPercent(_financeResult.ProductFinanceSummary.UnassignedValuePercent)@T("Nicht im Stamm", "Not in master")@FormatValue(_financeResult.ProductFinanceSummary.MissingReferenceValue, _financeResult.ProductFinanceSummary.DisplayCurrency)@FormatPercent(_financeResult.ProductFinanceSummary.MissingReferenceValuePercent)
@if (IsProductFinanceMixedCurrency)
{
@T("Diese Sparten-Finanzanalyse enthaelt mehrere Waehrungen. Die Summary-Karten mit `Mixed` addieren lokale Werte numerisch; fuer belastbare Prozentwerte bitte eine einzelne Waehrung oder ein einzelnes Land filtern.",
"This division finance analysis contains multiple currencies. Summary cards marked `Mixed` add local values numerically; filter to one currency or one country for reliable percentages.")
}
@T("Umsatz nach Produktsparte", "Sales by product division")
@foreach (var option in _productFinanceGroupingOptions)
{
@T(option.GermanLabel, option.EnglishLabel)
}
@T("Top 10 anzeigen", "Show top 10")
@T("Produktsparte", "Product division")
@if (ShowProductFamilyColumn)
{
@T("Produktfamilie", "Product family")
}
@if (ShowProductHierarchyColumn)
{
PAPH1
}
@T("Umsatz", "Sales")@T("Anteil", "Share")@T("Materialien", "Materials")@T("Zeilen", "Rows")@T("Laender", "Countries")
@BuildCodeText(context.ProductDivisionCode, context.ProductDivisionText)
@if (ShowProductFamilyColumn)
{
@BuildCodeText(context.ProductFamilyCode, context.ProductFamilyText)
}
@if (ShowProductHierarchyColumn)
{
@BuildCodeText(context.ProductHierarchyCode, context.ProductHierarchyText)
}
@FormatValue(context.NetSalesActual, context.Currency)@FormatPercent(context.SharePercent)@context.MaterialCount.ToString("N0")@context.RowCount.ToString("N0")@FormatCountriesWithFlags(context.Countries)@T("Keine zugeordneten Spartenumsaetze fuer diese Filter.", "No assigned division sales for these filters.")@T("Groesste Treiber: Nicht im Stamm", "Top drivers: not in master")@T("Land", "Country")TSC@T("Material", "Material")@T("Text", "Text")@T("Umsatz", "Sales")@T("Zeilen", "Rows")@FormatCountryWithFlag(context.CountryKey)@context.Tsc@context.Material
@context.ArticleName
@FormatValue(context.NetSalesActual, context.Currency)@context.RowCount.ToString("N0")@T("Keine fehlenden TR-AG-Referenzen fuer diese Filter.", "No missing TR AG references for these filters.")@T("Umsatzabdeckung nach Land", "Sales coverage by country")@T("Land", "Country")TSC@T("Gesamt", "Total")@T("Zugeordnet", "Assigned")@T("Nicht zugeordnet", "Unassigned")@T("Nicht im Stamm", "Not in master")@T("Material fehlt", "Material missing")@T("Abdeckung", "Coverage")@FormatCountryWithFlag(context.CountryKey)@context.Tsc@FormatValue(context.TotalValue, context.Currency)@FormatValue(context.AssignedValue, context.Currency)@FormatValue(context.UnassignedValue, context.Currency)@FormatValue(context.MissingReferenceValue, context.Currency)@FormatValue(context.MissingMaterialValue, context.Currency)@FormatPercent(context.AssignedValuePercent)@T("Keine Umsatzabdeckung fuer diese Filter.", "No sales coverage for these filters.")@T("Materialien", "Materials")@_financeResult.ProductAssignmentSummary.DistinctMaterialCount.ToString("N0")@T("Zugeordnet", "Assigned")@_financeResult.ProductAssignmentSummary.MatchedMaterialCount.ToString("N0")@T("Nicht zugeordnet", "Unassigned")@_financeResult.ProductAssignmentSummary.UnassignedMaterialCount.ToString("N0")@T("Nicht im Stamm", "Not in master")@_financeResult.ProductAssignmentSummary.MissingReferenceMaterialCount.ToString("N0")@T("Material fehlt", "Material missing")@_financeResult.ProductAssignmentSummary.MissingMaterialNumberCount.ToString("N0")@T("TR-AG Referenz", "TR AG reference")@_financeResult.ProductAssignmentSummary.ReferenceMaterialCount.ToString("N0")
@T("Diese Sicht prueft Materialnummern aller gefilterten Laender gegen die fuehrende TR-AG-Referenz aus `ProductDivisionRefSet`. Die Produktsparten der lokalen ERPs werden nicht verwendet.",
"This view checks material numbers from all filtered countries against the leading TR AG reference from `ProductDivisionRefSet`. Local ERP product divisions are not used.")
@T("Abdeckung nach Land", "Coverage by country")@T("Land", "Country")TSC@T("Materialien", "Materials")@T("Zugeordnet", "Assigned")@T("Nicht zugeordnet", "Unassigned")@T("Nicht im Stamm", "Not in master")@T("Material fehlt", "Material missing")@T("Trefferquote", "Match rate")@FormatCountryWithFlag(context.CountryKey)@context.Tsc@context.DistinctMaterialCount.ToString("N0")@context.MatchedMaterialCount.ToString("N0")@context.UnassignedMaterialCount.ToString("N0")@context.MissingReferenceMaterialCount.ToString("N0")@context.MissingMaterialNumberCount.ToString("N0")@FormatPercent(context.MatchPercent)@T("Keine Materialdaten fuer diese Filter.", "No material data for these filters.")@T("Materialpruefung gegen TR-AG-Referenz", "Material check against TR AG reference")@T("Status", "Status")@T("Land", "Country")TSC@T("Land-Material", "Local material")@T("Land-Text", "Local text")@T("TR-AG-MATNR", "TR AG MATNR")PAPH1@T("Produktfamilie", "Product family")@T("Produktsparte", "Product division")@T("Zeilen", "Rows")@T("Finance-Wert", "Finance value")@context.Status@FormatCountryWithFlag(context.CountryKey)@context.Tsc@context.Material@context.ArticleName@context.ReferenceMaterial@BuildCodeText(context.ProductHierarchyCode, context.ProductHierarchyText)@BuildCodeText(context.ProductFamilyCode, context.ProductFamilyText)
@BuildCodeText(context.ProductDivisionCode, context.ProductDivisionText)
@context.RowCount.ToString("N0")@FormatValue(context.NetSalesActual, context.Currency)@T("Keine Materialpruefung fuer diese Filter.", "No material check for these filters.")
@foreach (var option in _finance3dIndicatorOptions)
{
@T(option.GermanLabel, option.EnglishLabel)
}
@foreach (var option in _finance3dChartTypeOptions)
{
@T(option.GermanLabel, option.EnglishLabel)
}
@T("Szenario-Faktor / Wechselkurs", "Scenario factor / exchange rate")
@if (Finance3dScenarioAffectsValue)
{
@T("Basis", "Base"): @FormatFinance3dValue(Finance3dBaseTotal) |
@T("Szenario", "Scenario"): @FormatFinance3dValue(Finance3dScenarioTotal) |
@T("Delta", "Delta"): @FormatFinance3dValue(Finance3dScenarioDelta)
}
else
{
@T("Der Faktor wirkt nur auf Wertindikatoren, nicht auf Zeilenanzahlen.",
"The factor only affects value indicators, not row counts.")
}
@T("Beschriftung", "Labels")