@page "/einkauf" @using TrafagSalesExporter.Models @inject TrafagSalesExporter.Services.IUiTextService UiText @T("Einkauf", "Purchasing") @T("Einkauf", "Purchasing") @T("SAP-Einkaufsdashboard nach Power-BI-Vorlage x.pbix, vorbereitet fuer Spend, offene Bestellungen, Kontrakte und Lieferantenperformance.", "SAP purchasing dashboard based on the Power BI template x.pbix, prepared for spend, open orders, contracts and supplier performance.") @T("Die PBIX-Vorlage liefert Struktur und Kennzahlenlogik. Live-Werte werden sichtbar, sobald die SAP-Einkaufsdatenquelle angebunden ist.", "The PBIX template provides structure and KPI logic. Live values will appear once the SAP purchasing data source is connected.") @foreach (var card in KpiCards) {
@T(card.TitleDe, card.TitleEn) @card.Value @T(card.DetailDe, card.DetailEn)
}
@T("Analyseachsen", "Analysis axes") @T("Achse", "Axis") @T("PBIX-Feld", "PBIX field") @T("Verwendung", "Usage") @T(context.LabelDe, context.LabelEn) @context.Field @T(context.UsageDe, context.UsageEn) @T("SAP-Quellen aus PBIX", "SAP sources from PBIX") @foreach (var source in SapSources) {
@source.Name @source.Description
}
@T("Aus x.pbix uebernommene Seiten", "Pages derived from x.pbix") @T("Power-BI-Seite", "Power BI page") @T("Visuals", "Visuals") @T("Kennzahl", "Measure") @T("Dimensionen", "Dimensions") @context.Page @context.Visuals @context.Measure @context.Dimensions
@code { private readonly List KpiCards = [ new("Spend total", "Total spend", "-", "Netwr CHF historisch", "Historic Netwr CHF", Icons.Material.Filled.Payments, Color.Primary), new("Offene Bestellungen", "Open orders", "-", "Wert und Menge offen", "Open value and quantity", Icons.Material.Filled.PendingActions, Color.Warning), new("Kontrakte", "Contracts", "-", "Restverpflichtungen", "Remaining commitments", Icons.Material.Filled.Assignment, Color.Info), new("Lieferantenperformance", "Supplier performance", "-", "Bewertung / Liefertermintreue", "Rating / delivery reliability", Icons.Material.Filled.Verified, Color.Success) ]; private readonly List AnalysisAxes = [ new("Jahr", "Year", "EKKOSet.Bedat", "Zeitfilter und Verlauf", "Time filter and trend"), new("Lieferant", "Supplier", "Data.Name / Data.Lieferant", "Spend und Performance pro Lieferant", "Spend and performance by supplier"), new("Warengruppe", "Material group", "Data (2).Warengruppe / WG komplett", "Spend nach Warengruppe", "Spend by material group"), new("Artikel", "Article", "EKPOSet.Matnr / EKPOSet.Txz01", "Artikel- und Preisentwicklung", "Article and price development"), new("Region", "Region", "Data.Laender-/Regionenschluessel", "Regionale Spend-Verteilung", "Regional spend distribution") ]; private readonly List SapSources = [ new("EKKOSet", "Bestellkopf: Datum, Lieferant, Einkaufsbeleg."), new("EKPOSet", "Bestellposition: Artikel, Text, Netwr CHF, Preis pro Stueck."), new("eketSet", "Einteilungen/Termine: Basis fuer offene Mengen und Liefertermine."), new("Data", "Lieferanten-Mapping und Lieferantennamen."), new("Data (2)", "Warengruppen-Mapping und Warengruppentexte.") ]; private readonly List SpendRows = [ new("Spend nach Jahr", "Spend by year", "Sum(EKPOSet.Netwr CHF)", "EKKOSet.Bedat Jahr", "PBIX"), new("Spend nach Lieferant", "Spend by supplier", "Sum(EKPOSet.Netwr CHF)", "Data.Name", "PBIX"), new("Spend nach Warengruppe", "Spend by material group", "Sum(EKPOSet.Netwr CHF)", "Data (2).Warengruppe", "PBIX"), new("Spend nach Artikel", "Spend by article", "Sum(EKPOSet.Netwr CHF)", "EKPOSet.Matnr / Txz01", "PBIX") ]; private readonly List OpenOrderRows = [ new("Offener Bestellwert", "Open order value", "Bestellwert offen CHF", "Lieferant / Warengruppe / Artikel", "Neu"), new("Offene Bestellmenge", "Open order quantity", "Menge offen", "Lieferant / Warengruppe / Artikel", "Neu"), new("Faelligkeiten", "Due dates", "Termin / Rueckstand", "Lieferant / Artikel", "Neu") ]; private readonly List ContractRows = [ new("Mengenkontrakte", "Quantity contracts", "Kontraktmenge / Abrufmenge", "Lieferant / Warengruppe / Artikel", "Neu"), new("Restverpflichtung", "Remaining commitment", "Restwert CHF", "Lieferant / Warengruppe / Artikel", "Neu"), new("Kontrakt-Ausnutzung", "Contract consumption", "Abrufquote", "Lieferant / Artikel", "Neu") ]; private readonly List SupplierPerformanceRows = [ new("Liefertermintreue", "Delivery reliability", "On-time %", "Lieferant / Artikel", "Neu"), new("Preisentwicklung", "Price development", "Netwr CHF/Stk", "Lieferant / Artikel / Jahr", "PBIX"), new("Qualitaet / Reklamation", "Quality / claims", "Fehlerquote", "Lieferant / Warengruppe", "Neu"), new("Lieferantenbewertung", "Supplier rating", "Score", "Lieferant", "Neu") ]; private readonly List PowerBiPages = [ new("Besch.Volumen CHF/Lieferant", "Pivot, Slicer", "Sum(EKPOSet.Netwr CHF)", "Jahr, Lieferant, Warengruppe, Artikel"), new("Eink.Vol. CHF / Lieferant Kuchen", "Pie, Slicer", "Sum(EKPOSet.Netwr CHF)", "Lieferant, Warengruppe, Jahr"), new("Balken Vol./Lief/WG", "Column, Slicer", "Sum(EKPOSet.Netwr CHF)", "Lieferant, Warengruppe, Artikel"), new("Diagramm Vol./WG", "Column, Slicer", "Sum(EKPOSet.Netwr CHF)", "Warengruppe, Jahr"), new("Eink.Vol. CHF / Region", "Pie, Slicer", "Sum(EKPOSet.Netwr CHF)", "Region, Warengruppe, Jahr"), new("Preisentwicklung CHF", "Pivot, Slicer", "Min(EKPOSet.Netwr CHF/Stk)", "Lieferant, Artikel, Jahr"), new("Matrix Vol./WG", "Pivot, Slicer", "Sum(EKPOSet.Netwr CHF)", "Warengruppe, Lieferant, Artikel") ]; private string T(string german, string english) => UiText.Text(german, english); private sealed record PurchasingKpiCard(string TitleDe, string TitleEn, string Value, string DetailDe, string DetailEn, string Icon, Color Color); private sealed record PurchasingAxis(string LabelDe, string LabelEn, string Field, string UsageDe, string UsageEn); private sealed record PurchasingSource(string Name, string Description); private sealed record PowerBiPageInfo(string Page, string Visuals, string Measure, string Dimensions); }