From 105443f2e9a69a5955b0b8f2af50bf744d26c92c Mon Sep 17 00:00:00 2001 From: data Date: Tue, 24 Feb 2026 11:08:01 +0100 Subject: [PATCH] feat: Differenz-Anzeige und UI-Verbesserungen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Differenz-Anzeige (+/-) im CU/AL-Diagramm (immer sichtbar) - Differenz-Anzeige im Kabel-Diagramm (per Checkbox einblendbar) - Farbkästchen bei Kabel-Checkboxen passend zur Diagrammfarbe - Kabel-Diagramm Legende ausgeblendet (nicht doppelt) - ChangeLog und README aktualisiert Co-Authored-By: Claude Opus 4.5 --- ChangeLog.md | 11 +- README.md | 3 +- langs/de_DE/metallzuschlag.lang | 2 + langs/en_US/metallzuschlag.lang | 2 + metallzuschlagindex.php | 279 ++++++++++++++++++++++++-------- 5 files changed, 223 insertions(+), 74 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index c5ed219..ad034d6 100755 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,11 +4,18 @@ ### Neu - Dashboard: Kabel-Kupferzuschlag-Diagramm mit zeitgenauem Verlauf -- Kabel-Auswahl: Einzelne oder alle Kabel ein-/ausblenden +- Kabel-Auswahl: Einzelne oder alle Kabel ein-/ausblenden (JavaScript, ohne Seitenneuladung) - Modus-Auswahl: EUR/m (Stueckpreis) oder Gesamtbetrag (mit Mindestmenge) -- API: getProductsWithKupfergehalt() - alle Kabel mit Kupfergehalt +- Differenz-Anzeige: +/- Werte zwischen Datenpunkten im CU/AL-Diagramm +- Differenz-Anzeige: Per Checkbox im Kabel-Diagramm einblendbar +- Farbkästchen bei Kabel-Checkboxen (passend zur Diagrammfarbe) +- API: getProductsWithKupfergehalt() - alle Kabel mit Kupfergehalt (sortiert nach Querschnitt) - API: getCableChartData() - Kupferzuschlag-Verlauf berechnen +### Geaendert +- Kabel-Liste: Flexbox-Layout (3 Spalten), sortiert nach Querschnitt aufsteigend +- Kabel-Diagramm: Legende ausgeblendet (Checkboxen zeigen bereits Kabelnamen) + ## 1.2 (2026-02-24) ### Geaendert diff --git a/README.md b/README.md index b5d6f34..d1b4b7b 100755 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ Metallnotierungen (Kupfer/Aluminium) von Sonepar abrufen, verwalten und automati ## Funktionen - **Metallnotierungen abrufen**: Tageswerte und Monatsdurchschnitte (CU/AL) von der Sonepar Metal Note API -- **Dashboard**: Aktuelle Notierungen, Verlaufsdiagramm (Chart.js) und Historie +- **Dashboard**: Aktuelle Notierungen, Verlaufsdiagramme (Chart.js) und Historie +- **Kabel-Diagramm**: Kupferzuschlag-Verlauf pro Kabel, filterbar per Checkbox, mit Differenz-Anzeige - **Kupfergehalt berechnen**: Automatisch aus Aderanzahl x Querschnitt x 8,89 kg/(km*mm2) beim Speichern von Produkten - **Kupferzuschlag berechnen**: Gesamtbetrag auf Einkaufspreisen = Kupfergehalt x CU-Notiz / 100.000 x Mindestmenge - **Lieferanten-Zuschlaege**: CU/AL-Werte pro Lieferant (automatisch oder manuell) diff --git a/langs/de_DE/metallzuschlag.lang b/langs/de_DE/metallzuschlag.lang index 13be64a..cc6b6d0 100755 --- a/langs/de_DE/metallzuschlag.lang +++ b/langs/de_DE/metallzuschlag.lang @@ -89,3 +89,5 @@ MetallzuschlagPerMeter = EUR/m MetallzuschlagTotalAmount = Gesamtbetrag MetallzuschlagPerMeterEUR = Kupferzuschlag (EUR/m) MetallzuschlagTotalAmountEUR = Kupferzuschlag (EUR) +MetallzuschlagNoCablesSelected = Keine Kabel ausgewählt - bitte mindestens ein Kabel aktivieren +MetallzuschlagShowDiff = Differenz anzeigen diff --git a/langs/en_US/metallzuschlag.lang b/langs/en_US/metallzuschlag.lang index b3e7b16..9742232 100755 --- a/langs/en_US/metallzuschlag.lang +++ b/langs/en_US/metallzuschlag.lang @@ -88,3 +88,5 @@ MetallzuschlagPerMeter = EUR/m MetallzuschlagTotalAmount = Total amount MetallzuschlagPerMeterEUR = Copper surcharge (EUR/m) MetallzuschlagTotalAmountEUR = Copper surcharge (EUR) +MetallzuschlagNoCablesSelected = No cables selected - please enable at least one cable +MetallzuschlagShowDiff = Show difference diff --git a/metallzuschlagindex.php b/metallzuschlagindex.php index bd4066e..511ae30 100755 --- a/metallzuschlagindex.php +++ b/metallzuschlagindex.php @@ -221,15 +221,41 @@ if (!empty($chartData['labels'])) { print ''; print ''; - - // Kabel-Chart-Daten holen - $cableChartData = $api->getCableChartData($chartDays, $cableIds, $cableMode); - - if (!empty($cableChartData['products'])) { + // Chart Canvas + if (!empty($cableChartDataPerMeter['products'])) { print '
'; print ''; print '
'; - // Farben fuer Kabel (verschiedene Farben) - $colors = array( - '#e6194B', '#3cb44b', '#ffe119', '#4363d8', '#f58231', - '#911eb4', '#42d4f4', '#f032e6', '#bfef45', '#fabed4', - '#469990', '#dcbeff', '#9A6324', '#fffac8', '#800000', - ); - - // Datasets fuer Chart.js vorbereiten - $jsLabels = json_encode($cableChartData['labels']); - $datasets = array(); + // Datasets fuer beide Modi vorbereiten + $jsLabels = json_encode($cableChartDataPerMeter['labels']); + $datasetsPerMeter = array(); + $datasetsTotal = array(); $colorIndex = 0; - foreach ($cableChartData['products'] as $productId => $productData) { + foreach ($cableChartDataPerMeter['products'] as $productId => $productData) { $color = $colors[$colorIndex % count($colors)]; - $datasets[] = array( + $datasetsPerMeter[] = array( 'label' => $productData['label'], 'data' => $productData['data'], 'borderColor' => $color, @@ -380,49 +415,151 @@ if (!empty($cablesWithKupfer) && !empty($chartData['labels'])) { 'borderWidth' => 2, 'tension' => 0.3, 'spanGaps' => true, + 'productId' => $productId, ); $colorIndex++; } - $jsDatasets = json_encode($datasets); - $yAxisLabel = ($cableMode == 'total') ? $langs->trans("MetallzuschlagTotalAmountEUR") : $langs->trans("MetallzuschlagPerMeterEUR"); + $colorIndex = 0; + foreach ($cableChartDataTotal['products'] as $productId => $productData) { + $color = $colors[$colorIndex % count($colors)]; + $datasetsTotal[] = array( + 'label' => $productData['label'], + 'data' => $productData['data'], + 'borderColor' => $color, + 'backgroundColor' => 'transparent', + 'borderWidth' => 2, + 'tension' => 0.3, + 'spanGaps' => true, + 'productId' => $productId, + ); + $colorIndex++; + } + + $jsDatasetsPerMeter = json_encode($datasetsPerMeter); + $jsDatasetsTotal = json_encode($datasetsTotal); + $yAxisLabelPerMeter = $langs->trans("MetallzuschlagPerMeterEUR"); + $yAxisLabelTotal = $langs->trans("MetallzuschlagTotalAmountEUR"); print ''; } else { print '
'.$langs->trans("MetallzuschlagNoData").'
';