Manche Möglichkeiten zum Anbieten von Preisnachlässen scheinen bei xt:Commerce fehlerhaft zusammen zu arbeiten. Ein Beispiel ist die Kombination von “Rabatt” und “Staffelpreisen”. Hier arbeitet das System im Hintergrund zwar korrekt - bloß werden dem Besucher de facto “falsche” Preise angezeigt.

Die gekauften Artikel würden am Ende zwar mit dem richtigen Preis im Warenkorb landen - nur steht zu befürchten, dass man mit der Präsentation von fehlerhaften Preisen Kunden eher irritiert als dass man ihnen einen Kauf attraktiv macht …

 

Rabatt und Staffelpreise

Artikel-Rabatt: Je Artikel kann ein prozentualer Wert angegeben werden, um den sich der Kaufpreis maximal reduzieren darf. Für einzelne Kundengruppen kann zudem eingestellt werden, wie viel Rabatt ihnen maximal gewährt werden kann. Auf diese Weise kann man z.B. Mitarbeitern einen höheren maximalen Preisnachlass gewähren, während sich für Neukunden ein reduzierter Preis nicht so stark bemerkbar macht.

Staffelpreise: Im Dutzend billiger. Je nach Abnahmemenge reduziert sich der Einzelpreis. Je Artikel und Kundengruppe können auch verschiedene Preis-Abstufungen eingegeben werden.

Kombination: Je mehr man kauft, desto günstiger - Staffelpreis. Und von dieser Vergünstigung wird dann noch der Rabatt abgezogen.

 

1. Staffelpreis ohne Rabatt

Angenommen, wir verkaufen einen Artikel mit Grundpreis 10,00 € und Preisnachlässen ab 5 und ab 10 Stück. Wie erwartet wird Folgendes angezeigt:

10,00 €
inkl. 16 % UST exkl. Versandkosten

Staffelpreise
1-4 Stk. 10,00 €
5-9 Stk. 9,00 €
> 10 Stk. 8,00 €

2. Staffelpreis mit Artikel-Rabatt

Unser Beispiel-Artikel soll jetzt um 20% im Preis reduziert werden. Was danach jedoch ausgegeben wird, ist ziemlich irritierend:

Statt 10,00 €
nur 8,00 €
Sie Sparen 20%
inkl. 16 % UST exkl. Versandkosten

Staffelpreise
1-4 Stk. 10,00 €
5-9 Stk. 9,00 €
> 10 Stk. 8,00 €

Die gesamte Staffelpreis-Tabelle bleibt vom festgelegten Rabatt unbeeinflusst und gibt weiterhin dieselben Werte aus wie vorher. Aber die Anzeige ist falsch: Denn wenn man neun Artikel zu je 9,00 € kauft, landen keine 81,00 € im Warenkorb, sondern 64,80 € - die 20% Rabatt werden tatsächlich wie gewünscht von den Staffelpreisen abgezogen.

 

Korrigieren der Staffelpreis-Anzeige

1) Im Ordner “meinshop.de”/”includes”/”classes” die Datei “product.php” suchen.

2) In den Zeilen 328 bis 366 findet man die Funktion getGraduated()

	function getGraduated() {
		global $xtPrice;

		$staffel_query = xtDBquery("SELECT
				                                     quantity,
				                                     personal_offer
				                                     FROM
				                                     ".TABLE_PERSONAL_OFFERS_BY.(int) $_SESSION['customers_status']['customers_status_id']."
				                                     WHERE
				                                     products_id = '".$this->pID."'
				                                     ORDER BY quantity ASC");

		$staffel = array ();
		while ($staffel_values = xtc_db_fetch_array($staffel_query, true)) {
			$staffel[] = array ('stk' => $staffel_values['quantity'], 'price' => $staffel_values['personal_offer']);
		}
		$staffel_data = array ();
		for ($i = 0, $n = sizeof($staffel); $i < $n; $i ++) {
			if ($staffel[$i]['stk'] == 1) {
				$quantity = $staffel[$i]['stk'];
				if ($staffel[$i +1]['stk'] != '')
					$quantity = $staffel[$i]['stk'].'-'. ($staffel[$i +1]['stk'] - 1);
			} else {
				$quantity = ' > '.$staffel[$i]['stk'];
				if ($staffel[$i +1]['stk'] != '')
					$quantity = $staffel[$i]['stk'].'-'. ($staffel[$i +1]['stk'] - 1);
			}
			$vpe = '';
			if ($product_info['products_vpe_status'] == 1 && $product_info['products_vpe_value'] != 0.0 && $staffel[$i]['price'] > 0) {
				$vpe = $staffel[$i]['price'] - $staffel[$i]['price'] / 100 * $discount;
				$vpe = $vpe * (1 / $product_info['products_vpe_value']);
				$vpe = $xtPrice->xtcFormat($vpe, true, $product_info['products_tax_class_id']).TXT_PER.xtc_get_vpe_name($product_info['products_vpe']);
			}
			$staffel_data[$i] = array ('QUANTITY' => $quantity, 'VPE' => $vpe, 'PRICE' => $xtPrice->xtcFormat($staffel[$i]['price'] - $staffel[$i]['price'] / 100 * $discount, true, $this->data['products_tax_class_id']));
		}

		return $staffel_data;

	}

3) Dort wird zwar an mehreren Stellen zwar ein Rabatt berechnet - allerdings geschieht dies immer auf Basis der Variablen $discount - die jedoch nirgends gefüllt wird. Daher gibt’s auch immer Null Prozent Preisnachlass.

4) $discount muss also mit dem für den jeweiligen Artikel und die Kundengruppe des Besuchers geltenden Rabatt-Wert gefüllt werden. Dazu bietet sich die Funktion xtcCheckDiscount($pID) an, mit der in der Datei “xtcPrice.php” (ebenfalls im Ordner “meinshop.de”/”includes”/”classes”) u.a. die Rabatt-Preisnachlässe für Einzelpreise korrekt berechnet werden.

5) In der “product.php” muss demnach in Zeile 339 Folgendes eingefügt werden:

$discount = $xtPrice->xtcCheckDiscount($this->pID);

 

Die geänderte Funktion getGraduated() [Zeile 328 bis 366] noch einmal im Zusammenhang:

	function getGraduated() {
		global $xtPrice;

		$staffel_query = xtDBquery("SELECT
				                                     quantity,
				                                     personal_offer
				                                     FROM
				                                     ".TABLE_PERSONAL_OFFERS_BY.(int) $_SESSION['customers_status']['customers_status_id']."
				                                     WHERE
				                                     products_id = '".$this->pID."'
				                                     ORDER BY quantity ASC");
		$discount = $xtPrice->xtcCheckDiscount($this->pID); //EINGEFÜGT!
		$staffel = array ();
		while ($staffel_values = xtc_db_fetch_array($staffel_query, true)) {
			$staffel[] = array ('stk' => $staffel_values['quantity'], 'price' => $staffel_values['personal_offer']);
		}
		$staffel_data = array ();
		for ($i = 0, $n = sizeof($staffel); $i < $n; $i ++) {
			if ($staffel[$i]['stk'] == 1) {
				$quantity = $staffel[$i]['stk'];
				if ($staffel[$i +1]['stk'] != '')
					$quantity = $staffel[$i]['stk'].'-'. ($staffel[$i +1]['stk'] - 1);
			} else {
				$quantity = ' > '.$staffel[$i]['stk'];
				if ($staffel[$i +1]['stk'] != '')
					$quantity = $staffel[$i]['stk'].'-'. ($staffel[$i +1]['stk'] - 1);
			}
			$vpe = '';
			if ($product_info['products_vpe_status'] == 1 && $product_info['products_vpe_value'] != 0.0 && $staffel[$i]['price'] > 0) {
				$vpe = $staffel[$i]['price'] - $staffel[$i]['price'] / 100 * $discount;
				$vpe = $vpe * (1 / $product_info['products_vpe_value']);
				$vpe = $xtPrice->xtcFormat($vpe, true, $product_info['products_tax_class_id']).TXT_PER.xtc_get_vpe_name($product_info['products_vpe']);
			}
			$staffel_data[$i] = array ('QUANTITY' => $quantity, 'VPE' => $vpe, 'PRICE' => $xtPrice->xtcFormat($staffel[$i]['price'] - $staffel[$i]['price'] / 100 * $discount, true, $this->data['products_tax_class_id']));
		}

		return $staffel_data;

	}

 

Ergebnis nach der Änderung

Unser Beispiel-Artikel - Die Staffelpreise bleiben dieselben wie eingangs festgelegt, und wieder werden 20% als Rabatt gewährt. Nach Speichern der wie beschrieben geänderten “product.php” gibt es keine überraschenden Preis-Angaben mehr:

Statt 10,00 €
nur 8,00 €
Sie Sparen 20%
inkl. 16 % UST exkl. Versandkosten

Staffelpreise
1-4 Stk. 8,00 €
5-9 Stk. 7,20 €
> 10 Stk. 6,40 €

Der Rabatt wird jetzt korrekt von den Staffelpreisen abgezogen - und die Tabelle zeigt dieselben Preise, mit denen die Artikel auch im Warenkorb abgelegt werden.

 

 

Dieser Artikel bezieht sich auf eine Installation von xt:Commerce 3.04 SP1. Desweiteren: Ich habe zwar mit etlichen unterschiedlichen Preis-Staffelungen und Kundengruppen getestet sowie mehrere “Warenkörbe nachgerechnet”, komplette Test-Bestellungen habe ich jedoch noch nicht durchgeführt. Daher ist es nicht hundertprozentig auszuschließen, dass durch diese Änderungen “weiter hinten” Fehler entstehen, die ich so noch nicht bemerkt habe.

Allerdings scheint sich die Funktion getGraduated() ausschließlich auf die HTML-Ausgabe des Shops auszuwirken. Dennoch ist bei Änderungen an System-Dateien generell Vorsicht geboten: Sollten in Folge der hier beschriebenen Bearbeitung Probleme oder Systemfehler auftauchen, bitte ich um Benachrichtigung.

Bitte beachten Sie unbedingt die allgemeinen Hinweise zur Verwendung hier veröffentlichter Code-Beispiele!