Wer in der Wawi Überverkäufe erlaubt, öffnet im Shop nicht eine Prüfung, sondern den Bestand an jeder Station des Bestellwegs — von der Artikelseite bis zum Bestellabschluss. Beim Bau des Vorbestellungs-Plugins habe ich nachgelesen, wo JTL-Shop den Bestand prüft. Eine dieser Stellen entfernt Positionen noch unmittelbar vor dem Abschluss der Bestellung.
Ein gefragter Artikel ist leer, die Lieferung ist bestellt und hat einen Termin. Verkaufen will man jetzt genau so viel, wie kommt — nicht mehr. Das Häkchen, das JTL dafür mitbringt, fragt nach keiner Menge: Es erlaubt den Überverkauf ohne Grenze. Im Shop heißt das Feld dahinter cLagerKleinerNull.
Bevor ich eine Begrenzung baue, wollte ich wissen, wo der Shop überhaupt nach dem Bestand fragt — und was genau dieses Häkchen abschaltet. Die Antwort steht im Quellcode; nachgelesen an JTL-Shop 5.6.2 und noch einmal an 5.7.2.
Entlang des Bestellwegs prüft JTL-Shop den Bestand an diesen Stellen — und jede davon lässt Artikel mit erlaubtem Überverkauf durch:
| Station | Stelle im Code | Was sie ohne Häkchen tut |
|---|---|---|
| Artikelseite | Artikel::checkCanBePurchased() | markiert den Artikel als nicht in den Warenkorb legbar |
| In den Warenkorb | CartHelper::addToCartCheck() | lehnt ab, wenn Menge mal Verpackungseinheit den Bestand übersteigt |
| Menge ändern | CartHelper::applyCartChanges() | kürzt die Menge auf das, was verfügbar ist |
| Bestellabschluss | Cart::pruefeLagerbestaende() | prüft noch einmal — mit dem Bestand frisch aus der Datenbank |
| Bestellabschluss | Cart::loescheDeaktiviertePositionen() | entfernt Positionen ohne Bestand aus dem Warenkorb |
Dazu kommen weitere Stellen für Stücklisten, Konfigurationsbestandteile und Variationen. Das Häkchen wirkt an allen. Eine Begrenzung, die nur eine Station bedient, lässt die anderen offen.
Station fünf läuft unmittelbar vor dem Abschluss der Bestellung. Sie entfernt jede Position, deren Artikel keinen Bestand hat, den Bestand beachtet und keinen Überverkauf erlaubt. Ändert sich der Warenkorb dadurch, bricht der Shop den Abschluss ab und schickt den Kunden zurück in den Warenkorb — die Position ist dann nicht mehr darin.
Für eine Vorbestellung ist das der Ernstfall. Ein Plugin, das einen leeren Artikel nur auf der Artikelseite kaufbar macht, bringt ihn bis in den Warenkorb und verliert ihn dann, kurz bevor der Kunde bestellt. Ich habe diese Station beim ersten Durchgang durch den Code übersehen. Der Kern bietet dort einen Hook, mit dem ein Plugin die Entfernung seiner eigenen Positionen verhindern kann — man muss nur wissen, dass man ihn braucht.
Vier der fünf Stationen rechnen mit derselben Zahl: dem Bestand im Artikelobjekt, den der Shop beim Laden des Artikels füllt. Genau dort läuft ein Hook. Liefert ein Plugin an dieser Stelle „Bestand plus freigegebene Vorbestellmenge“, setzt der Shop die Grenze an allen vier Stationen selbst durch — ohne dass das Plugin eine einzige Prüfung nachbaut. Nur die Prüfung beim Bestellabschluss liest frisch aus der Datenbank und braucht eine eigene Antwort.
Drei Dinge gehören dazu, und alle drei stehen im Code, nicht in einer Anleitung:
Der Artikelanzeigefilter. Ist er so eingestellt, dass nur Artikel mit Lagerbestand angezeigt werden, bleibt ein leerer Artikel gesperrt — auch mit erlaubtem Überverkauf, unabhängig von jedem Plugin. Die Bedingung steht direkt in der Kaufbarkeitsprüfung.
„Lagerbestand beachten“ ist aus. Die Stationen prüfen den Bestand nur, wenn er für den Artikel beachtet wird. Ist das abgeschaltet, greift keine von ihnen — der Artikel verkauft unbegrenzt, ohne dass Überverkauf erlaubt sein muss. In einem gemessenen Shop mit rund 8.000 Artikeln waren das 69 Artikel, 57 davon ohne Überverkaufs-Häkchen. In keiner Liste der Überverkaufs-Artikel tauchen sie auf.
Wer eine Auswertung oder ein Plugin baut, das Überverkäufe betrifft, muss deshalb beide Felder lesen. Wer nur nach dem Häkchen fragt, übersieht genau die Artikel, die ohne jede Grenze verkaufen.
Stationen des Bestellwegs prüfen den Bestand — alle lassen erlaubten Überverkauf durch.
rechnen mit derselben Zahl aus dem Artikelobjekt. Dort setzt eine Begrenzung an, ohne eine Prüfung nachzubauen.
Artikel waren in einem gemessenen Shop ohne jede Grenze verkäuflich, 57 davon ohne Überverkaufs-Häkchen.
Quellcode von JTL-Shop 5.6.2 und 5.7.2; der Shop gemessen im August 2026.
Dann lohnt ein Blick darauf, an welcher Station Ihr Shop entscheidet. Manchmal ist es eine Einstellung, kein fehlendes Plugin.
Individuelle Software und Werkzeuge für Betriebe, die mit Standardlösungen an Grenzen stoßen.