From 2e2cb5b71078b59c30d40975ca1a4322e3024f2d Mon Sep 17 00:00:00 2001 From: data Date: Tue, 24 Feb 2026 09:25:05 +0100 Subject: [PATCH] fix: Kupferzuschlag mit Mindestmenge berechnen und auf 2 Stellen runden MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Formel: Kupfergehalt × CU-Notiz / 100.000 × Mindestmenge - Ergebnis auf 2 Nachkommastellen gerundet - Cronjob und Trigger angepasst - Dokumentation aktualisiert - Version auf 1.2 erhöht Co-Authored-By: Claude Opus 4.5 --- ChangeLog.md | 7 +++++++ README.md | 10 +++++----- class/metallzuschlagapi.class.php | 7 ++++--- core/modules/modMetallzuschlag.class.php | 2 +- ..._modMetallzuschlag_MetallzuschlagTriggers.class.php | 7 ++++--- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 6db5cca..033788d 100755 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,12 @@ # Changelog - Metallzuschlag Modul +## 1.2 (2026-02-24) + +### Geaendert +- Kupferzuschlag-Berechnung: Jetzt Gesamtbetrag fuer Mindestmenge statt EUR/m +- Formel: Kupfergehalt x CU-Notiz / 100.000 x Mindestmenge +- Rundung auf 2 Nachkommastellen + ## 1.1 (2026-02-19) ### Neu diff --git a/README.md b/README.md index e01e6f8..b5d6f34 100755 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Metallnotierungen (Kupfer/Aluminium) von Sonepar abrufen, verwalten und automati - **Metallnotierungen abrufen**: Tageswerte und Monatsdurchschnitte (CU/AL) von der Sonepar Metal Note API - **Dashboard**: Aktuelle Notierungen, Verlaufsdiagramm (Chart.js) und Historie - **Kupfergehalt berechnen**: Automatisch aus Aderanzahl x Querschnitt x 8,89 kg/(km*mm2) beim Speichern von Produkten -- **Kupferzuschlag berechnen**: EUR/m auf Einkaufspreisen = Kupfergehalt x CU-Notiz / 100.000 +- **Kupferzuschlag berechnen**: Gesamtbetrag auf Einkaufspreisen = Kupfergehalt x CU-Notiz / 100.000 x Mindestmenge - **Lieferanten-Zuschlaege**: CU/AL-Werte pro Lieferant (automatisch oder manuell) - **Cronjobs**: Woechentlicher API-Abruf + Neuberechnung aller Kupferzuschlaege @@ -31,18 +31,18 @@ Metallnotierungen (Kupfer/Aluminium) von Sonepar abrufen, verwalten und automati - `kupfergehalt` - Berechnetes Kupfergewicht in kg/km (automatisch per Trigger) ### Auf Einkaufspreisen (product_fournisseur_price) -- `kupferzuschlag` - Berechneter Kupferzuschlag in EUR/m (automatisch per Trigger + Cronjob) +- `kupferzuschlag` - Berechneter Kupferzuschlag in EUR (Gesamtbetrag fuer Mindestmenge, automatisch per Trigger + Cronjob) ## Berechnung ``` Kupfergehalt (kg/km) = Aderanzahl x Querschnitt (mm2) x 8,89 -Kupferzuschlag (EUR/m) = Kupfergehalt (kg/km) x CU-Notiz (EUR/100kg) / 100.000 +Kupferzuschlag (EUR) = Kupfergehalt (kg/km) x CU-Notiz (EUR/100kg) / 100.000 x Mindestmenge ``` -Beispiel: NYM-J 3x1,5mm2 bei CU = 1.092,10 EUR/100kg +Beispiel: NYM-J 3x1,5mm2 bei CU = 1.092,10 EUR/100kg, Mindestmenge 100m - Kupfergehalt = 3 x 1,5 x 8,89 = 40,005 kg/km -- Kupferzuschlag = 40,005 x 1.092,10 / 100.000 = 0,4369 EUR/m +- Kupferzuschlag = 40,005 x 1.092,10 / 100.000 x 100 = 43,69 EUR ## CU-Notiz Logik diff --git a/class/metallzuschlagapi.class.php b/class/metallzuschlagapi.class.php index 2fa1512..c52cf94 100644 --- a/class/metallzuschlagapi.class.php +++ b/class/metallzuschlagapi.class.php @@ -371,7 +371,7 @@ class MetallzuschlagApi $productId = (int) $product->fk_object; // Alle Einkaufspreise dieses Produkts - $sqlPrices = "SELECT pf.rowid, pf.fk_soc"; + $sqlPrices = "SELECT pf.rowid, pf.fk_soc, pf.quantity"; $sqlPrices .= " FROM ".$this->db->prefix()."product_fournisseur_price pf"; $sqlPrices .= " WHERE pf.fk_product = ".$productId; @@ -388,8 +388,9 @@ class MetallzuschlagApi continue; } - // Kupferzuschlag EUR/m = Kupfergehalt (kg/km) × CU (EUR/100kg) / 100.000 - $kupferzuschlag = $kupfergehalt * $cuNotiz / 100000; + // Kupferzuschlag = Kupfergehalt (kg/km) × CU (EUR/100kg) / 100.000 × Mindestmenge + $quantity = (float) $price->quantity > 0 ? (float) $price->quantity : 1; + $kupferzuschlag = round($kupfergehalt * $cuNotiz / 100000 * $quantity, 2); // UPDATE oder INSERT $sqlUpd = "UPDATE ".$this->db->prefix()."product_fournisseur_price_extrafields"; diff --git a/core/modules/modMetallzuschlag.class.php b/core/modules/modMetallzuschlag.class.php index e775041..b074cfa 100755 --- a/core/modules/modMetallzuschlag.class.php +++ b/core/modules/modMetallzuschlag.class.php @@ -49,7 +49,7 @@ class modMetallzuschlag extends DolibarrModules $this->descriptionlong = "MetallzuschlagDescriptionLong"; $this->editor_name = 'Alles Watt laeuft'; $this->editor_url = ''; - $this->version = '1.0'; + $this->version = '1.2'; $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); $this->picto = 'fa-coins'; diff --git a/core/triggers/interface_99_modMetallzuschlag_MetallzuschlagTriggers.class.php b/core/triggers/interface_99_modMetallzuschlag_MetallzuschlagTriggers.class.php index c9c1b27..39b3d24 100644 --- a/core/triggers/interface_99_modMetallzuschlag_MetallzuschlagTriggers.class.php +++ b/core/triggers/interface_99_modMetallzuschlag_MetallzuschlagTriggers.class.php @@ -124,7 +124,7 @@ class InterfaceMetallzuschlagTriggers extends DolibarrTriggers private function updateKupferzuschlagForProduct($productId, $kupfergehalt) { // Alle Einkaufspreise des Produkts holen - $sql = "SELECT pf.rowid, pf.fk_soc"; + $sql = "SELECT pf.rowid, pf.fk_soc, pf.quantity"; $sql .= " FROM ".$this->db->prefix()."product_fournisseur_price pf"; $sql .= " WHERE pf.fk_product = ".((int) $productId); @@ -145,8 +145,9 @@ class InterfaceMetallzuschlagTriggers extends DolibarrTriggers continue; } - // Kupferzuschlag EUR/m = Kupfergehalt (kg/km) × CU (EUR/100kg) / 100.000 - $kupferzuschlag = $kupfergehalt * $cuNotiz / 100000; + // Kupferzuschlag = Kupfergehalt (kg/km) × CU (EUR/100kg) / 100.000 × Mindestmenge + $quantity = (float) $obj->quantity > 0 ? (float) $obj->quantity : 1; + $kupferzuschlag = round($kupfergehalt * $cuNotiz / 100000 * $quantity, 2); // In Einkaufspreis-Extrafield schreiben if ($this->saveKupferzuschlag((int) $obj->rowid, $kupferzuschlag)) {