Mengenbasierter Rabatt mit Drupal Commerce
Das Problem
Ich möchte in meinen Shop, welcher T-Shirts verkauft, einen Mengenbasierten Rabatt auf spezielle Produkte konfigurieren.
Konkret soll folgendes Beispiel umgesetzt werden:
Produkt | Menge | Preis
Schwarzes T-Shirt, Größe M | 1 Stück | 17,50 EUR
Schwarzes T-Shirt, Größe M| 2 Stück | 30,00 EUR
Schwarzes T-Shirt, Größe M| 3 Stück | 40,00 EUR
Aktuelle technische Basis
Der Shop ist auf Basis von
- Drupal und
- Drupal Commerce Kickstart (Version 7.x-1.8) aufgesetzt.
Zusätzlich sind u.a. folgende Module installiert
- Commerce Discount (7.x.-1.0-alpha3)
- Price (7.x-1.8)
Lösungsmöglichkeiten
Das von Drupal Commerce bereitgestellte Systeme zur Erstellung von Preisbasierten Regeln in Kombination mit dem Discount Modul sollte es auf den ersten Blick einfach ermöglichen, mengenbasierte Rabatte auf Produkte zu ermöglichen. Nach einigen Stunden Recherche und zahlreicher Versuche aber die Erkenntnis: mit den Bordmitteln klappt das nicht. Es lohnte sich auch nicht, weitere Stunden zu verschwenden um durch Zufall noch eine funktionierende Konfiguration zu erzielen.
Ein kurzer Lichtblick in meiner Recherche war das Modul “Price Table” welches den Anschein erweckte, das Problem zu lösen. Kurz nach der Installation aber wieder die ernüchternde Erkenntnis: es bringt den Shop zum Stillstand oder verlangsamt ihn drastisch. Abgesehen davon bietet das Modul aber nicht die gewünschte Flexibilität: ich kann entweder für ALLE Produkte nun mengenbasierte Rabatte konfigurieren, oder eben nicht. Ich hätte es gerne aber nur für BESTIMMTE Produkte.
Fazit:
Es ist also nicht auf einfache Art und Weise möglich, den Mengenbasierten Rabatt für bestimmte Produkte mit den Hausmitteln von Drupal umzusetzen. Den Ärger darüber haben auch bestehende Kunden bereits hier geäußert: https://drupalcommerce.org/discussions/789/rules-commerce-stock-how-set-quantity-based-discounts-drupal-commerce (siehe Kommentar ganz unten von vor wenigen Tagen).
Tatsächlich umgesetzte Lösung
Nicht zufrieden mit der aktuellen Situation experimentierte ich weiter mit dem Preisbasierten Regelsystem in Kombination mit dem Discount Modul. Schlussendlich gelang es mir, eine Näherungslösung zu finden, mit der der Kunde einverstanden war und die sich innerhalb eines Kosteneffizienten Rahmens umsetzen lässt.
In 3 Schritten zur Lösung:
- Discount für den Staffelrabatt (je einen für 2 Stück und 3 Stück günstiger) anlegen
- Zusätzlich über die Preisregeln die Einstellung für mehr Produktvarianten einstellen
- Testen. Fertig!
1. Discount für den ersten Staffelrabatt (2 Stück günstiger) anlegen
Im Administrationsbereich unter “Store settings” -> “Discounts” einen neuen Rabatt anlegen:
Welches Produkt man hier auswählt ist irrelevant, da es später in der Preisregel exakt spezifiziert wird (und es damit die hier getroffene Einstellung überschreibt):
2. Zusätzlich über die Preisregeln die Einstellung für mehr Produktvarianten einstellen
Im Administrationsbereicht unter “Store settings” -> “Pricing rules” die Preisregel (welche automatisch angelegt wird basierend auf dem zuvor erstellten Rabatt) anpassen:
Preisregel editieren:
Die Preisregel besteht aus folgenden Elementen:
Kümmern wir uns um die Conditions. Die erste Condition “Line item contains a specific product” regelt uns, für welche Produkte der Rabatt gewährt werden soll. Wir haben folgende Produkte basierend auf dem Produkttitel konfiguriert. Der Vorteil ist, dass man hier mehrere beliebige Produkte einfach angeben kann ohne jeweils eine neue Regel erstellen zu müssen. (Und ja ich weiss, ich sollte ein Security update installieren, aber es handelt sich hier nur um ein lokales Testsystem ;-))
Als zweite Condition habe ich eine “Data comparison” ergänzt. Mithilfe solcher Bedingungen kann man einfach auf Basis der existierenden Felder Vergleiche durchführen. Wir nutzen das um die Bestellmenge im Warenkorb zu prüfen. Der Rabatt soll ja “nur” bei 2 Stück eines bestimmten Produkts gewährt werden:
Das Ergebnis sollte dann ungefähr folgendermaßen aussehen:
Damit haben wir die Regel für 1 und 2 Stück des Produkts konfiguriert. Um das nun auch noch für 3 Stück durchzuführen, sind die Schritte 1 und 2 einfach mit einem anderen Rabatt und Menge durchzuführen. Fertig!
3. Testen
Testfall 1: passendes Produkt im Warenkorb, 1 Stück
Erwartetes Testergebnis: kein Rabatt, PASSED
Testfall 2: passendes Produkt im Warenkorb, 2 Stück
Erwartetes Testergebnis: Rabatt für 2 Stück wird abgezogen, PASSED
Testfall 3: passendes Produkt im Warenkorb, 3 Stück
Erwartetes Testergebnis: Rabatt für 3 Stück wird abgezogen, PASSED
Testfall 4: 3 Stück vom passendes Produkt und 1 zusätzliches Produkt im Warenkorb
Erwartetes Testergebnis: Rabatt für 3 Stück wird nur vom passenden Produkt abgezogen, PASSED
Testfall 5: 2 Stück vom passendes Produkt in Variation schwarz und 2 Stück vom passenden Produkt in Variation weiss und 1 zusätzliches Produkt im Warenkorb
Erwartetes Testergebnis: Rabatt für 2 Stück wird zweimal abgezogen aber nur von den 2 passenden Produkten, nicht aber vom dritten Produkt, PASSED
Testfall 6: Änderungen an Menge oder Produkte führt zu korrekter Neuberechnung des Rabatts
Erwartetes Testergebnis: Rabatt wird nicht mehr abgezogen wenn sich Menge ändert, PASSED
Testfall 6: 1 passendes Produkt in Variation weiss, 1 passendes Produkt in Variation schwarz im Warenkorb
Erwartetes Testergebnis: Rabatt wird nicht mehr abgezogen, da die Preisregel sich nur auf eine Produktzeile bezieht, nicht aber die Summe aller Teile im Warenkorb berücksichtigen kann (hier wird kommt die Einschränkung der Näherungslösung zum Vorschein), PASSED
Alternative Lösungsmöglichkeiten
Es gibt allerdings generell Alternativen für die Lösung des Problems, z.B. in dem auf ein flexibleres bzw. einfacher erweiterbare Shopsystem umgestiegen wird. Ich empfehle hier gerne WordPress in Kombination mit WooCommerce (http://www.woothemes.com/woocommerce/). Das ist soweit kostenlos und bietet viele Plugins an, die diese und andere Probleme besser abbilden können. Beispielsweise gäbe es das Plugin “Dynamic Pricing”, welches den Mengenbasierten Rabatt ermöglichen würde (http://www.woothemes.com/products/dynamic-pricing/).
Es gibt auch zahlreiche Payment Gateway Anbindung (z.B. für Novalnet (http://www.woothemes.com/products/novalnet/ oder Paypal).
Gerne berate ich dich auf dem Weg zu einem einfach wartbaren und gut erweiterbaren Shopsystem, dass deine Wünsche optimal abdeckt. Natürlich mit dem üblichen SICOnet Full-Service: Beratung, Entwicklung und Betreuung aus einer Hand:
Jetzt Beratungstermin vereinbaren
Kunde
better b. good OG / CEOs: Mag. Christine Schlögl, Mag. Pamela Glück
Zum Shop