Bin heute auf Arbeit über einen vermeindlichen Bug in der xtcPrice.php Klasse gestolpert.
Zu finden in /includes/classes/.
Habe vorsichtshalber gecheckt ob es mehrere Shopversionen (2.0.4.2, 2.0.5.0, 2.0.5.1 und vermutlich noch mehr) betrifft und festgestellt, dass es das tut.
Situation: Der betreffende Shop hat mehrere Kundengruppen die unterschiedlich eingestellte Rabatte haben. Die Artikel haben neben ihrem eigentlichen Preis auch konfigurierbare Attribute (Optionen), die ggf. Zusatzkosten verursachen und entsprechend auf den Preis angerechnet werden müssen.
Problem: Die in den Artikelattributen eingestellten Werte für die Kosten der Option werden nicht berechnet. Es wird der Standardnettopreis angesetzt, den Kunden ohne Rabatt zu zahlen haben.
Ursache:In der Methode "xtcGetOptionPrice" gibt es an der folgenden Stelle einen Logikfehler in der Bedingungsabfrage.
// calculate discount
if ($this->cStatus['customers_status_discount_attributes'] == '1' && $this->cStatus['customers_status_discount'] != 0.00) {
$discount = $this->cStatus['customers_status_discount'];
if ($attribute_data['products_discount_allowed'] < $this->cStatus['customers_status_discount']) {
$discount = $attribute_data['products_discount_allowed'];
}
}
Erklärung:- In der Datenbank ist in der Tabelle "products" in der Spalte "products_discount_allowed" im betreffenden Shop (und vermutlich in vielen anderen Shops) ein Standardwert von '0.00' gespeichert.
- Zur Laufzeit beträgt der Wert im "cStatus['customers_status_discount']" den in der Kundengruppe eingestellten Rabatt (z. B. '10.00' für 10 %).
- Bei der zweiten Abfrage wird geprüft, ob der Standardwert '0.00' kleiner ist als der Kundenrabatt.
Da '0.00' immer kleiner sein wird als jeder Rabatt wird hier der '$discount' auf '0.00' gesetzt und dadurch der Standardnettopreis angesetzt.
Lösungsansatz:Einfügen einer vorgeschalteten Bedingung in der zweiten Abfrage.
if (($this->cStatus['customers_status_discount_attributes'] !== '1') && ($attribute_data['products_discount_allowed'] < $this->cStatus['customers_status_discount'])) {
$discount = $attribute_data['products_discount_allowed'];
}
Durch die bitwise Abfrage wird hier sofort Abgebrochen, wenn die erste Bedingung ein 'false' liefert. Dadurch wird der Kundenrabatt nicht auf '0.00' gesetzt.
Oder besser: // calculate discount
if ($this->cStatus['customers_status_discount_attributes'] == '1' && $this->cStatus['customers_status_discount'] != 0.00) {
$discount = $this->cStatus['customers_status_discount'];
} else {
$discount = $attribute_data['products_discount_allowed'];
}
Hier kommt die zweite Anweisung gar nicht erst ins Spiel, wenn die erste Abfrage ein 'true' geliefert hat und ausgeführt wurde. Nur bei einem 'false' wird die zweite Anweisung ausgeführt.
Dieses Problem betrifft scheinbar nur die Preise der Attribute. Die eigentlichen Artikelpreise werden korrekt berechnet.
Bitte mal drüberschauen und Rückmeldung geben.
Linkback: https://www.modified-shop.org/forum/index.php?topic=41178.0