Durch die Einrichtung eines “Sonderpreises” überschreibt xt:Commerce (fast) alle anderen Vergünstigungen des betreffenden Artikels. Allerdings werden manche ungültig gewordenen Werte weiterhin angezeigt.

Um fehlerhafte bzw. überflüssige Angaben vermeiden zu können, müssen zunächst unterschiedliche Kombinationen durchgespielt werden:

 

Preisnachlässe - Übersicht

“Gruppenpreise”
Für jede Kundengruppe kann je Artikel ein individueller Preis festgelegt werden. Auf diese Weise könnte man z.B. Stammkunden gegenüber Neukunden Preisvorteile anbieten

“Staffelpreise”
Zusätzlich können je Artikel für jede Kundengruppe individuelle Mengenstaffelungen und die dafür gültigen Stückpreise bestimmt werden

“Artikel-Rabatt”
Ein “Maximaler Rabatt auf Produkte” muss für die jeweilige Kundengruppe zugelassen sein, damit ein “Artikelrabatt” wirksam werden kann

“Sonderangebot”
Einzelne Artikel können als Sonderangebot bestimmt werden, je Artikel kann ein Angebots-Preis eingegeben und das Angebot in Stückzahl sowie Gültigkeits-Dauer beschränkt werden

“Rabatt auf gesamte Bestellung”
Für jede Kundengruppe kann man einen Gesamt-Rabatt festlegen, der am Ende des Einkaufs vom Gesamtwert des Warenkorbs abgezogen wird.

Preisnachlässe in Kombination

“Gruppenpreise” und “Artikel-Rabatt”

  • Berechnung: Rabatt wird vom jeweils gültigen Einzelpreis abgezogen
  • Besonderheiten: Keine
  • Anzeige: Korrekt

“Staffelpreise” und “Artikel-Rabatt”

  • Berechnung: Rabatt wird vom jeweils gültigen Mengenpreis abgezogen
  • Besonderheiten: Bei Anzeige der Staffelpreistabelle wird Rabatt nicht berücksichtigt
  • Anzeige: Falsche Preisangaben in der Tabelle, korrekte Preise im Warenkorb
  • Lösung: Rabattwert in Staffelpreis-Tabelle einrechnen lassen
    Anleitung in diesem Beitrag

“Sonderangebot” und “Gruppenpreise”

  • Berechnung: Sonderangebot gilt nach Eingabe für JEDE Kundengruppe
  • Besonderheiten: liegt Angebots-Preis über dem jeweils gültigen Gruppenpreis, wirkt “Sonderangebot” preiserhöhend
  • Anzeige: Korrekt

“Sonderangebot” und “Artikel-Rabatt”

  • Berechnung: Artikel-Rabatt entfällt - Artikel erscheint zum Angebots-Preis
  • Besonderheiten: auch hier können “Sonderangebote” den Kaufpreis erhöhen
  • Anzeige: Preis ist korrekt, im Artikel-Template gibt {$DISCOUNT} jedoch weiterhin einen Wert aus
  • Lösung: Anzeige des Artikel-Rabatts bei Sonderpreisen unterbinden
    Anleitung siehe unten

“Sonderangebot” und “Staffelpreise”

  • Berechnung: Artikel sind ausschließlich zum Angebots-Preis erhältlich
  • Besonderheiten: Staffelpreise entfallen komplett
  • Anzeige: Staffelpreis-Tabelle wird angezeigt, obwohl ungültig
  • Lösung: Ausblenden der Staffelpreis-Tabelle bei Sonderpreisen
    Anleitung siehe unten

“Rabatt auf gesamte Bestellung” in allen Kombinationen

  • Berechnung: Siehe oben - Rabatt-Abzug vom gesamten Warenwert
  • Anzeige: Anzeige erst im Warenkorb, fehlerfrei

 

Anzeigefehler beseitigen

Vorüberlegung: Bei einem Sonderangebot sollte weder eine Staffelpreis-Tabelle noch ein Artikel-Rabatt angezeigt werden, da beide in diesem Fall ungültig sind.

Deshalb muss man dort, wo die Elemente einer Produkt-Ansicht erzeugt werden, entsprechende Abfragen zwischenschalten die eine Ausgabe davon abhängig machen, ob ein “Sonderangebot” vorliegt oder nicht. Zu bearbeiten ist also die System-Datei “product_info.php” im Ordner “meinshop.de/includes/modules/”

Eine Funktion, mit der ein eventueller Angebots-Preis abgerufen werden kann, gibt es in den Zeilen 232 bis 239 der Datei “xtcPrice.php” - zu finden im Ordner “meinshop.de/includes/classes/” - Liegt kein “Sonderangebot” vor, gibt xtcCheckSpecial($pID) den Wert Null zurück:

function xtcCheckSpecial($pID) {
	$product_query = "select specials_new_products_price from ".TABLE_SPECIALS." where products_id = '".$pID."' and status=1";
	$product_query = xtDBquery($product_query);
	$product = xtc_db_fetch_array($product_query, true);

	return $product['specials_new_products_price'];

}

 

Lösung 1) Ausgabe der Staffelpreis-Tabelle bei Sonderangeboten unterbinden

Im Ordner “meinshop.de/includes/modules/” - Datei “product_info.php” - wird in Zeile 150 und 151 bei vorhandenen Preisstaffelungen die Funktion zum Erzeugen der Tabelle aufgerufen

if ($_SESSION['customers_status']['customers_status_graduated_prices'] == 1)
	include (DIR_WS_MODULES.FILENAME_GRADUATED_PRICE);
	

Die zugrundeliegende Bedingung muss dahingehend erweitert werden, dass ein Sonderpreis die den Aufruf unterbindet:

if (($_SESSION['customers_status']['customers_status_graduated_prices'] == 1) && ($xtPrice->xtcCheckSpecial($product->data['products_id']) == 0))
	include (DIR_WS_MODULES.FILENAME_GRADUATED_PRICE);
	

 

Lösung 2) Ausgabe des Rabatt-Wertes bei Sonderpreisen unterbinden

Ebenfalls in der “product_info.php” wird der jeweils gültige Rabatt-Wert bestimmt und in der Variablen $discount abgelegt. Das passiert in Zeile 126 bis 133:

$discount = 0.00;
if ($_SESSION['customers_status']['customers_status_public'] == 1 && $_SESSION['customers_status']['customers_status_discount'] != '0.00') {
	$discount = $_SESSION['customers_status']['customers_status_discount'];
	if ($product->data['products_discount_allowed'] < $_SESSION['customers_status']['customers_status_discount'])
		$discount = $product->data['products_discount_allowed'];
	if ($discount != '0.00')
		$info_smarty->assign('PRODUCTS_DISCOUNT', $discount.'%');
}
	

Die Anweisung $info_smarty->assign(’PRODUCTS_DISCOUNT’, $discount.’%'); darf nur ausgeführt werden, wenn es keinen Angebots-Preis gibt.

Demnach ist - ähnlich wie in Lösung 2) - die dazu notwendige Bedingung wie folgt zu erweitern:

$discount = 0.00;
if ($_SESSION['customers_status']['customers_status_public'] == 1 && $_SESSION['customers_status']['customers_status_discount'] != '0.00') {
	$discount = $_SESSION['customers_status']['customers_status_discount'];
	if ($product->data['products_discount_allowed'] < $_SESSION['customers_status']['customers_status_discount'])
		$discount = $product->data['products_discount_allowed'];
	if (($discount != '0.00') && ($xtPrice->xtcCheckSpecial($product->data['products_id']) == 0))
		$info_smarty->assign('PRODUCTS_DISCOUNT', $discount.'%');
}
	

Nach diesen Änderungen sollte bei einem “Sonderpreis” auch ausschließlich eben dieser angezeigt werden. Dass sich manche Angebote de facto preiserhöhend auswirken können, ist damit nicht behoben - denn hier werden nicht wirklich Preise berechnet, sondern nur die Anzeige den berechneten Preisen angepasst.

Und auch wenn so nicht die Werte verändert werden, mit denen xt:Commerce im Hintergrund arbeitet, ist die “product_info.php” eine System-Datei - Die übliche Sicherheitskopie also bitte nicht vergessen.

 

 

Die hier veröffentlichten Code-Beispiele wurden mit einer Installation von xt:Commerce 3.04 SP1 getestet und funktionieren vermutlich nicht mit anderen Versionen. Wer nach dieser Anleitung Änderungen an seinem Shop-System vornimmt, handelt auf eigene Gefahr. Jegliche Haftung für Datenverluste, System-Ausfälle etc. wird hiermit ausdrücklich abgelehnt.

Bitte beachten Sie unbedingt die allgemeinen Hinweise zu hier veröffentlichten Code-Beispielen!