Vor gut zwei Jahren habe ich schon über unsere ersten Erfahrungen mit Drupal Commerce berichtet, und schon damals hat sich das E-Commerce Framework für Drupal 7 als unglaublich mächtiges Werkzeug erwiesen. Doch mit der Zeit kommen neue Projekte und Herausforderungen, die bestehende Werkzeuge auf die Probe stellen. Jetzt kann ich mit Gewissheit sagen dass ich vor zwei Jahren nur an der Spitze des Eisbergs vorbeigeschrammt bin.

Gestiegene Anforderungen

Im letzten Jahr durften wir uns in Sachen E-Commerce an etwas Neuem versuchen. In den meisten Fällen enthält ein Webshop nur die ersten Schritte im Verkaufsprozess weltlicher Güter. Im Falle von Garden Gnome Software, einem Projekt, an dem wir letztes Jahr gearbeitet haben, ging es jedoch um den Vertrieb von digitalen Gütern, konkret Softwarelizenzen. Kein Mitarbeiter der Bestellungen entgegen nimmt und diese durchführt. Der komplette Prozess, von der Produktpräsentation bis zur Lieferung wird komplett vom Shopsystem übernommen.

Drupal Commerce erweitern

Zugegeben, Drupal Commerce kann das nicht out of the box. Aber Dank der soliden Basis aus Views und Rules ist es bekannter Maßen keine Schwierigkeit die Funktionalität zu erweitern.

Die grundlegende API von Rules ist genauso einfach wie mächtig. Eigene Conditions und Actions sind einfach zu realisieren (siehe Dokumentation). Die Lizenzen, die von Kunden gekauft werden, wurden als eigene Entity Typen umgesetzt. Dank der Entity API sind diese automatisch mit Rules kompatibel und können problemlos im Kaufprozess von Drupal Commerce generiert oder verändert werden.

Praktische Zusatzmodule für Rules, die zum Einsatz kamen sind Conditional Rules und das Rules Bonus Pack. Ersteres ermöglicht konditionale Verzweigungen innerhalb der Aktionen einer Regel. Prinzipiell ist das auch immer mithilfe von Rules Components lösbar. In einigen Fällen, wo der verzweigte Pfad nur aus wenigen Aktionen besteht und auch nicht anderwertig wiederverwendet wird, bekommt man mehr Übersichtlichkeit für weniger Konfigurationsaufwand. Das Rules Bonus Pack stellt eigentlich ein experimentelles Modul für potentielle Features von Rules dar, wird nie in einem stabilen Zustand verfügbar sein und ist dementsprechend mit Vorsicht zu genießen. Features wie das laden von Entities aus einer View und die Integration mit Panels kann aber Gold wert sein.

Produktvarianten und konfigurierbare Produkte

In meinem letzten Beitrag zum Thema Drupal Commerce habe ich die gedankliche Hürde erwähnt, vor der man steht, wenn man andere Shopsysteme gewohnt ist. Zur Erinnerung: Ein T-Shirt in drei verschiedenen Farben und vier verschiedenen Größen ist kein konfigurierbares Produkt sondern ein Aggregation von 12 Produkten die im selben Produkt Display dargestellt werden. Was für diesen Fall Sinn macht, da diese auch verschiedene SKU-Nummern, Preise und Lagerbestände haben können.

Das bedeutet aber nicht, dass der umgekehrte Weg unmöglich ist. Im Fall von Garden Gnome Software sind die vertriebenen Produkte Lizenzen. Diese können erstens in beliebiger Menge bestellt werden und haben zusätzlich eine variable Anzahl der inkludierten Seats, also Arbeitsplätze für die diese genutzt werden dürfen. Es macht jedoch keinen Sinn, für jede mögliche Seat-Menge eine eigene Produktvariante zu erstellen.

Die Lösung ist nicht allzu kompliziert: Line Items stellen in Drupal Commerce einzelne Zeilen einer Bestellung dar. Also zum Beispiel „3 rote Shirts in Größe L“Line Items sind aber gleichzeitg Entities, und wie Nodes oder Produkte mit weiteren Feldern bestückbar. Also wurde kurzerhand neben dem bereits eingebauten Feld für die Bestellmenge auch noch eine Seats-Menge eingeführt. Der darin enthaltene Wert hat natürlich Auswirkung auf den entgültigen Preis, was sich aber mit Product Pricing Rules sehr einfach lösen lässt.

Spannender war es, die Menge der Seats im Warenkorb verändern zu können. Da der Commerce Warenkorb auch nichts anderes als eine View – beziehungsweise eine Form View – darstellt, muss dazu ein Views Field Handler implementieren der ein Formularfeld hinzufügt werden. Wie das funktioniert lässt sich am Beispiel des Views Handlers für die Bestellmenge erlernen.

Kaufabschluss und Auslieferung

Ein Punkt den man in seiner Komplexität leicht unterschätzt ist der automatische Abschluss einer Bestellung. Sobald die Bezahlung eingeht, wird die Bestellung in den Status completed versetzt und die gekauften Lizenzen werden generiert. Klingt einfach, ist es aber nicht. Einige wichtige Punkte auf die man achten sollte:

Drupal Commerce schließt eine Bestellung (aus gutem Grund) nicht automatisch ab,wenn diese vollständig bezahlt wurde. Es existiert jedoch ein Event namens „When an order is first paid in full“, welches ausgelöst wird sobald die Order Balance 0 erreicht.

Wann die Order Balance 0 erreicht ist je nach Payment Provider jedoch zum Teil nicht kalkulierbar. Wir hatten Fälle, in denen Paypal erst Stunden später das Clearing bekannt gab und gleichzeitig solche, in denen die Order schon voll bezahlt war, bevor der Benutzer überhaupt den Kaufprozess ganz abgeschlossen hatte. Letzterer Fall führt vor allem zu Problemen, da Commerce Accounts für anonyme Kunden erst bei vollständigem Bestellabschluss generiert. Das macht Sinn, da man die eigene Datenbank nicht mit Benutzeraccounts von abgebrochenen Bestellungen befüllen möchte. Es führt jedoch zu Problemen wenn man sich darauf verlässt, dass bei Transaktionsabschluss auch schon eine User-ID existiert der man eine neu erstellte Lizenz zuweisen möchte.

Versucht man das Problem direkt mit aufwändigen Rules Conditions zu erschlagen, läuft man recht schnell Gefahr in einem Sumpf von Race Conditions zu versinken. Ich würde raten stattdessen die Weiterverarbeitung gleich im Rules Scheduler abzuwickeln, was eine weitaus stabilere und einfachere Lösung darstellt.

Fazit

Drupal Commerce hat wieder einmal eindrucksvoll bewiesen dass es wohl das flexibelste E-Commerce Framework auf dem Markt darstellt. So viel Flexibilität erfordert natürlich auch ein wenig Know How um sie einzusetzen, sich dieses anzueignen zahlt sich aber aus. Und die Roadmap von Commerce 2.0 lässt zusammen mit Drupal 8 auf wirklich Großes hoffen.