WERKSTATTBERICHT · WARENKORB

„Lagerbestand kleiner null“: ein Häkchen öffnet den ganzen Bestellweg.

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.

DIE FRAGE

Gesucht war eine Zahl zwischen an und aus.

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.

DER BESTELLWEG

Fünf Stationen, an denen der Shop nach dem Bestand fragt

Entlang des Bestellwegs prüft JTL-Shop den Bestand an diesen Stellen — und jede davon lässt Artikel mit erlaubtem Überverkauf durch:

StationStelle im CodeWas sie ohne Häkchen tut
ArtikelseiteArtikel::checkCanBePurchased()markiert den Artikel als nicht in den Warenkorb legbar
In den WarenkorbCartHelper::addToCartCheck()lehnt ab, wenn Menge mal Verpackungseinheit den Bestand übersteigt
Menge ändernCartHelper::applyCartChanges()kürzt die Menge auf das, was verfügbar ist
BestellabschlussCart::pruefeLagerbestaende()prüft noch einmal — mit dem Bestand frisch aus der Datenbank
BestellabschlussCart::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.

DIE LETZTE STATION

Die letzte Station räumt den Warenkorb auf — auch die Vorbestellung.

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.

DER HEBEL

Nicht die Sperre öffnen, sondern die richtige Zahl liefern.

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:

  • Die Anzeige verrät die Zahl. Steht die Bestandsanzeige auf der genauen Menge, sieht der Kunde den angehobenen Wert. Vorher nachsehen, wie der Shop eingestellt ist.
  • Der Artikel-Cache speichert mit. Der Shop legt das Artikelobjekt erst nach dem Hook in den Zwischenspeicher. Wer dort relativ rechnet — „plus fünf“ —, addiert bei jedem Aufruf erneut. Nur absolute Werte setzen.
  • Zur Laufzeit entscheiden, nicht in die Datenbank schreiben. Ein Überverkaufs-Flag, das ein Plugin in die Artikeltabelle schreibt, macht den Artikel bei einem Ausfall des Plugins unbegrenzt verkäuflich — unbemerkt — und landet über die Exportformate auf den Marktplätzen. Entscheidet das Plugin nur zur Laufzeit, ist der Artikel bei einem Ausfall schlicht nicht kaufbar: sichtbar und harmlos.
ZWEI AUSNAHMEN

Zwei Einstellungen, die das Häkchen überstimmen

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.

GEMESSEN, NICHT BEHAUPTET

Nachgelesen und gezählt

5

Stationen des Bestellwegs prüfen den Bestand — alle lassen erlaubten Überverkauf durch.

4 von 5

rechnen mit derselben Zahl aus dem Artikelobjekt. Dort setzt eine Begrenzung an, ohne eine Prüfung nachzubauen.

69

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.

PASST DAZU

Das Plugin dazu

KONTAKT

Verkauft Ihr Shop mehr, als kommt — oder weniger, als er könnte?

Dann lohnt ein Blick darauf, an welcher Station Ihr Shop entscheidet. Manchmal ist es eine Einstellung, kein fehlendes Plugin.

4VEX.

Individuelle Software und Werkzeuge für Betriebe, die mit Standardlösungen an Grenzen stoßen.

© 2026 4VEX<EX/>