fix: Kupferzuschlag mit Mindestmenge berechnen und auf 2 Stellen runden

- 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 <noreply@anthropic.com>
This commit is contained in:
Eduard Wisch 2026-02-24 09:25:05 +01:00
parent 8729b5fdb7
commit 2e2cb5b710
5 changed files with 21 additions and 12 deletions

View file

@ -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

View file

@ -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

View file

@ -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";

View file

@ -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';

View file

@ -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)) {