From 9b287c15ef4c7bf8934486608428d121a22b4548 Mon Sep 17 00:00:00 2001 From: metacube Date: Fri, 5 Jun 2026 07:22:05 +0200 Subject: [PATCH] Expand purchasing dashboard from PBIX --- .../Pages/PurchasingDashboard.razor | 224 +++++++++++++++++- .../Components/Pages/PurchasingSection.razor | 42 ++++ .../Models/PurchasingAnalysisRow.cs | 3 + .../docs/PURCHASING_DASHBOARD_2026-06-05.md | 62 +++++ TrafagSalesExporter/docs/rag/PROJECT.md | 4 +- TrafagSalesExporter/lastchange.md | 26 +- 6 files changed, 346 insertions(+), 15 deletions(-) create mode 100644 TrafagSalesExporter/Components/Pages/PurchasingSection.razor create mode 100644 TrafagSalesExporter/Models/PurchasingAnalysisRow.cs create mode 100644 TrafagSalesExporter/docs/PURCHASING_DASHBOARD_2026-06-05.md diff --git a/TrafagSalesExporter/Components/Pages/PurchasingDashboard.razor b/TrafagSalesExporter/Components/Pages/PurchasingDashboard.razor index bd39503..8de7df6 100644 --- a/TrafagSalesExporter/Components/Pages/PurchasingDashboard.razor +++ b/TrafagSalesExporter/Components/Pages/PurchasingDashboard.razor @@ -1,23 +1,221 @@ @page "/einkauf" +@using TrafagSalesExporter.Models @inject TrafagSalesExporter.Services.IUiTextService UiText @T("Einkauf", "Purchasing") -@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("Einkauf Dashboard", "Purchasing dashboard") - - @T("Dieser Bereich ist als Einstiegspunkt fuer Einkaufsauswertungen vorbereitet.", - "This area is prepared as the entry point for purchasing analytics.") - -
-
-
+ + @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); } + + diff --git a/TrafagSalesExporter/Components/Pages/PurchasingSection.razor b/TrafagSalesExporter/Components/Pages/PurchasingSection.razor new file mode 100644 index 0000000..3e7379a --- /dev/null +++ b/TrafagSalesExporter/Components/Pages/PurchasingSection.razor @@ -0,0 +1,42 @@ +@inject TrafagSalesExporter.Services.IUiTextService UiText +@using TrafagSalesExporter.Models + + + @T(TitleDe, TitleEn) + @T(DescriptionDe, DescriptionEn) + + + + @T("Analyse", "Analysis") + @T("Kennzahl", "Measure") + @T("Dimension", "Dimension") + @T("Quelle", "Source") + + + @T(context.TitleDe, context.TitleEn) + @context.Measure + @context.Dimension + + + @context.Source + + + + + + +@code { + [Parameter, EditorRequired] public string TitleDe { get; set; } = string.Empty; + [Parameter, EditorRequired] public string TitleEn { get; set; } = string.Empty; + [Parameter, EditorRequired] public string DescriptionDe { get; set; } = string.Empty; + [Parameter, EditorRequired] public string DescriptionEn { get; set; } = string.Empty; + [Parameter, EditorRequired] public IReadOnlyList Rows { get; set; } = []; + + private string T(string german, string english) => UiText.Text(german, english); +} + + diff --git a/TrafagSalesExporter/Models/PurchasingAnalysisRow.cs b/TrafagSalesExporter/Models/PurchasingAnalysisRow.cs new file mode 100644 index 0000000..7e1585a --- /dev/null +++ b/TrafagSalesExporter/Models/PurchasingAnalysisRow.cs @@ -0,0 +1,3 @@ +namespace TrafagSalesExporter.Models; + +public sealed record PurchasingAnalysisRow(string TitleDe, string TitleEn, string Measure, string Dimension, string Source); diff --git a/TrafagSalesExporter/docs/PURCHASING_DASHBOARD_2026-06-05.md b/TrafagSalesExporter/docs/PURCHASING_DASHBOARD_2026-06-05.md new file mode 100644 index 0000000..5a0bbcb --- /dev/null +++ b/TrafagSalesExporter/docs/PURCHASING_DASHBOARD_2026-06-05.md @@ -0,0 +1,62 @@ +# Einkaufsdashboard 2026-06-05 + +## Ziel + +Der neue Bereich `Einkauf` soll die vorhandene Power-BI-Vorlage `x.pbix` aufnehmen und um weitere SAP-Einkaufsanalysen ergaenzen. + +## Aus `x.pbix` uebernommene Struktur + +Analysierte PBIX-Seiten: + +- Beschaffungsvolumen CHF je Lieferant. +- Einkaufsvolumen CHF je Lieferant als Kuchenansicht. +- Balkenansicht Volumen je Lieferant und Warengruppe. +- Diagramm Volumen je Warengruppe. +- Einkaufsvolumen CHF je Region. +- Preisentwicklung CHF. +- Matrix Volumen je Warengruppe. + +Sichtbare PBIX-Felder: + +- `EKPOSet.Netwr CHF` +- `EKPOSet.Netwr CHF/Stk` +- `EKKOSet.Bedat` +- `Data.Name` +- `Data (2).WG komplett` +- `EKPOSet.Matnr` +- `EKPOSet.Txz01` + +## Zusaetzlich aufgenommene SAP-Themen + +Das Dashboard wurde fachlich um diese Bereiche erweitert: + +- Spend total vergangen nach Jahr, Lieferant, Warengruppe und Artikel. +- Offene Bestellwerte und offene Mengen nach Lieferant, Warengruppe und Artikel. +- Offene Verpflichtungen / Mengenkontrakte nach Lieferant, Warengruppe und Artikel. +- Lieferantenbewertungen und Performance nach Lieferant, Warengruppe und Artikel. + +## Aktueller Implementierungsstand + +- Route: `/einkauf`. +- Hauptnavigation: eigener Punkt `Einkauf` mit Einkaufswagen-Icon. +- Tabs im Einkaufsdashboard: + - `Uebersicht` + - `Spend` + - `Offene Bestellungen` + - `Kontrakte` + - `Lieferanten` + - `PBIX Vorlage` +- Die Seite ist als Cockpit-Struktur umgesetzt und zweisprachig ueber den vorhandenen UI-Sprachservice vorbereitet. +- Die Kennzahlen sind noch nicht live an SAP gebunden. + +## Naechster Schritt fuer Live-Daten + +Fuer echte Werte muessen die Einkaufsquellen sauber gemappt werden: + +- Bestellkopf, z. B. `EKKOSet`. +- Bestellpositionen, z. B. `EKPOSet`. +- Offene Liefer-/Terminmengen, voraussichtlich Termin-/Schedule-Daten. +- Kontrakte und offene Verpflichtungen. +- Lieferantenbewertung / Performance, falls im SAP-System als OData- oder HANA-Quelle verfuegbar. + +Danach koennen Filter, Aggregationen und Delta-/Refresh-Prozess analog zu Finance/Spain umgesetzt werden. diff --git a/TrafagSalesExporter/docs/rag/PROJECT.md b/TrafagSalesExporter/docs/rag/PROJECT.md index 2a92e23..99032aa 100644 --- a/TrafagSalesExporter/docs/rag/PROJECT.md +++ b/TrafagSalesExporter/docs/rag/PROJECT.md @@ -10,7 +10,8 @@ Stand: 2026-06-05 - Letzter dokumentierter Finance-Deploy: 2026-06-05 auf `\\trch-webapp-bidashboard.trafagch.local\BiDashboard$\`. - Neu im Finance/Management-Cockpit: einfache Schnelluebersicht links sichtbar; tiefere Funktionen bleiben unter `Experten`. - Neu in der Navigation: Menuebaum wird aus `NavigationMenuItems` gerendert; Admins koennen bestehende Punkte unter `Admin > Menuestruktur` umhaengen, sortieren und aus-/einblenden. -- Neu als Hauptbereich: `Einkauf` mit Einkaufswagen-Icon und Einstieg `Einkauf Dashboard`. +- Neu als Hauptbereich: `Einkauf` mit Einkaufswagen-Icon und erweitertem `Einkauf Dashboard`. +- Einkauf: `x.pbix` wurde als Vorlage analysiert; `/einkauf` enthaelt jetzt Struktur fuer Spend, offene Bestellungen, Mengenkontrakte, Lieferantenperformance und die PBIX-Reportseiten. Live-SAP-Anbindung ist noch offen. - Neu im Expertenbereich: `3D Datenanalyse` mit drehbarer 3D-Grafik, Achsen, Diagrammarten, Indikatorauswahl, Labelgroesse und Simulation per Schieberegler. - Spanien: `Run-SpainRangeExportAndUpload-AllInOne.ps1` exportiert Sage-Range direkt und laedt CSV/Summary via rclone nach SharePoint `trafag-bi:Import/Finance/Spanien`. - Spanien: Default-Range ist heute minus 7 Tage bis heute; `ToDate` ist exklusiv. @@ -27,6 +28,7 @@ Stand: 2026-06-05 - HR KPI: `docs/rag/HR_KPI.md` - Deployment/IIS: `docs/rag/DEPLOYMENT.md` - Admin/Startseite: `docs/rag/ADMIN.md` +- Einkauf: `docs/PURCHASING_DASHBOARD_2026-06-05.md` ## Rohquellen Nur Bei Bedarf diff --git a/TrafagSalesExporter/lastchange.md b/TrafagSalesExporter/lastchange.md index 91eaf71..e0738f6 100644 --- a/TrafagSalesExporter/lastchange.md +++ b/TrafagSalesExporter/lastchange.md @@ -50,7 +50,31 @@ Diese Datei ist fuer tokenarme RAG-Nutzung komprimiert. - Spanien-Delta-Sync im Dashboard-Import wurde am 2026-06-05 publiziert. Publish brauchte kurz `app_offline.htm`, weil `BiDashboard.dll` gesperrt war; danach wurde `app_offline.htm` wieder entfernt. - Neu umgesetzt: Linker Menuebaum ist datengetrieben und ueber `Admin > Menuestruktur` umhaengbar/sortierbar; bestehende Punkte koennen in andere Untermenues verschoben werden. - Neu umgesetzt: Neuer Hauptpunkt `Einkauf` mit Einkaufswagen-Icon und vorbereiteter Einstiegseite `Einkauf Dashboard`. -- Letzte Validierung: `dotnet test TrafagSalesExporter.sln --verbosity minimal --artifacts-path C:\TMP\trafag-test-artifacts-finance-session-proof` mit `82/82` Tests gruen. +- Neu umgesetzt: `x.pbix` als Einkaufs-/SAP-Vorlage analysiert und `Einkauf Dashboard` auf Spend, offene Bestellungen, Kontrakte, Lieferantenperformance und PBIX-Vorlagenstruktur erweitert. +- Wichtig Einkauf: Aktuell ist die Seite fachlich strukturiert, aber noch nicht live an SAP/OData angebunden; fuer Echtwerte muessen Einkaufsquellen wie `EKKOSet`, `EKPOSet`, ggf. Termin-/Kontrakt- und Lieferantenbewertungsdaten gemappt werden. +- Letzte Validierung: `dotnet test TrafagSalesExporter.sln --verbosity minimal` mit `83/83` Tests gruen. + +## Nachtrag 2026-06-05 Einkauf / PBIX + +Quelle: + +- Lokale Vorlage `x.pbix` wurde geoeffnet und die Report-Struktur ausgewertet. +- PBIX-Reportseiten: Beschaffungsvolumen CHF je Lieferant, Einkaufsvolumen als Lieferanten-Kuchen, Balken Lieferant/Warengruppe, Diagramm Warengruppe, Einkaufsvolumen CHF je Region, Preisentwicklung CHF und Matrix Volumen/Warengruppe. +- In der PBIX sichtbare Felder: `EKPOSet.Netwr CHF`, `EKKOSet.Bedat`, `Data.Name`, `Data (2).WG komplett`, `EKPOSet.Matnr`, `EKPOSet.Txz01` und `EKPOSet.Netwr CHF/Stk`. + +Umgesetzt: + +- Einkaufsseite `/einkauf` von Platzhalter zu fachlichem Cockpit erweitert. +- Tabs: `Uebersicht`, `Spend`, `Offene Bestellungen`, `Kontrakte`, `Lieferanten`, `PBIX Vorlage`. +- Zusaetzlich zu den PBIX-Sichten wurden die vom Einkauf genannten SAP-Themen aufgenommen: + - Spend total vergangen nach Jahr, Lieferant, Warengruppe, Artikel. + - Offene Bestellwerte und Mengen nach Lieferant, Warengruppe, Artikel. + - Offene Verpflichtungen / Mengenkontrakte nach Lieferant, Warengruppe, Artikel. + - Lieferantenbewertung / Performance nach Lieferant, Warengruppe, Artikel. + +Naechster technischer Schritt: + +- Live-Anbindung der Einkaufsdatenquellen definieren und implementieren. Die UI ist vorbereitet; echte Kennzahlen brauchen noch SAP/OData-Feldmapping, Filterlogik und Aktualisierungsprozess. ## Nachtrag 2026-06-05 Spanien Sage / rclone Upload