Lagerbestand vs. Verfügbarer Bestand

Hallo,

was hat es mit dem Feld „Verfügbarer Bestand“ auf sich? Das lässt sich nicht anpassen, weder im Backend noch in der Datenbank (nach der nächsten Bestellung erscheint dort wieder ein Fantasiewert).
Im obigen Beispiel haben wir noch 230 Stück auf Lager, durch den „Verfügbaren Bestand“ wäre der dann allerdings nicht mehr zu verkaufen, so dass wir hier 5000 Stück angeben müssen.

Hallo,

sobald die Bestellungen, in denen dieser Artikel bestellt wurde, den Status „Abgeschlossen“ erhalten, sollte sich Lagerbestand und verfügbarer Lagerbestand wieder angleichen. So war zumindest meine Erfahrung zu diesem Thema.

Hallo,

danke für die Antwort. Wir haben allerdings keine 250 Bestellungen mit diesem Artikel offen oder in Bearbeitung.

Ist es nur bei diesem Artikel oder ein generelles Problem?

Das Problem besteht bei allen Artikeln, mal mehr mal weniger „brisant“. Mal sind es 10, mal 300 Differenz.

Das Problem ist leider immer noch akut. Hat da jemand eine Hilfestellung?

meine erfahrung ist, dass auch warenkörbe die noch nicht abgeschlossen wurden, aber artikel beinhalten den verfügbaren bestand verringern, habt ihr eventuell sehr viele kunden und diese legen dinge in ihre warenkörbe schließen die bestellung aber noch nicht ab?

Hi,
Danke für die Antwort, aber nein, so viele Besucher haben wir gar nicht auf der Webseite und abgebrochene Warenkörbe gibt es auch nicht in dieser Anzahl (vermutlich).
Es ist nur extrem nervend, wenn Artikel, die noch mit 20 Stück verfügbar sind, nicht mehr als verfügbar angezeigt werden.

also wenn es dir was bringt wann und wo shopware diese werte updated, das passiert im StockUpdater

src/Core/Content/Product/DataAbstractionLayer/StockUpdater.php

und reagiert auf folgende Events

            CheckoutOrderPlacedEvent::class => 'orderPlaced',
            StateMachineTransitionEvent::class => 'stateChanged',
            PreWriteValidationEvent::class => 'triggerChangeSet',
            OrderEvents::ORDER_LINE_ITEM_WRITTEN_EVENT => 'lineItemWritten',
            OrderEvents::ORDER_LINE_ITEM_DELETED_EVENT => 'lineItemWritten',

Hierbei wird eine SQL Anfrage direkt an die Datenbank gestellt und anhand der Bestellungen und der Stati in der sich diese Befinden der Stock und available Stock berechnet

Ich beobachte, dass nach einer Betsellung der Lagerbestand gar nicht geändert wird, nur der verfügbare Lagerbestand. Zwar wird nach einer Betsellung der verfügbare Lagerbestand rduziert, aber der Lagerbestand hat seinen alten Wert. D.h. Es kann zu einem Überverkauf kommen. Es kann nicht sein, dass erst mit „Abgeschlossen“ der Lagerbestand reduziert wird. Das ist doch ein Fehler.

@m23 hier ein anderer Beitrag dazu: Lagerbestand versus Verfügbarer Bestand - zum verzweifeln

Diese Berechnung stellt für uns ein großes Problem dar, da wir eine Warenwirtschaft angeschlossen haben und diese das führende System ist. Die Warenwirtschaft führt ebenfalls eine Berechnung durch, sodass wir nun Artikel, die eigentlich auf Lager sind nicht verkaufen können, weil beide Systeme Bestand abziehen.

Habe von Shopware leider auch keine Antwort gefunden…

@leo1 das ist so gewollt, nachdem eine bestellung abgeschickt wurde wird der verfügbare lagerbestand verringert, der lagerbestand allerdings nicht.
sobald eine bestellung den status „abgeschlossen“ erhält wird auch der lagerbestand verringert entsprechend der menge in der bestellung verringert.
wenn du nicht möchtest, dass kunden auf negativen verfügbaren bestand bestellen können, dann musst du im jeweiligen produkt „abverkauf“ anhaken. dem kunden wird dann nicht die möglichkeit gegeben mehr als den lagerbestand zu bestellen, ich glaube du kannst dann auch auswählen ob produkte, die nicht verfügbar sind, nicht mehr angezeigt werden.

1 „Gefällt mir“

@FSA, danke dass passt so. Genausso so wollte ich es haben. Ich war nur etwas irritiert wegen der Begrifflichkeiten. Ich habe es nun mit dem Abverkauf ausprobiert - das klappt sehr gut.

Also ich hänge auch an diesem Problem. Jetzt ist bei mir allerdings aufgefallen, dass die Zahlen enorm hoch sind was Reserviert wird.

Wir haben Plug-Ins wie Mollie oder Idealo Direktkauf. Ich habe mir mal die Verkäufe und offenen Körbe sowie Bestellungen in der DB angesehen.
Leider kann ich egal wie und was ich auch Rechne keinen klaren Wert ermitteln, der aussagekräftig wäre.

Laut DB in product sind von einem Artikel 133 Stk. verkauft worden. Mache ich mir die order auf sehe ich die Bestellungen mit insgesamt 350 Stk.

Schaut man sich die Bestellungen genauer an, kann man sehen das diese wohl doppelt vorhanden sind. Eine Bestellung ist dann komplett abgeschlossen und hat den Status Complete die andere den Status Open.

Ich behaupte mal so kann der StockUpdater nicht korrekt Rechnen, wenn es Probleme bei den Statusen gibt.

Nachdem ich bei einem Artikel die Bestellungen angepasst hatte und die state_id mit der von Complet ersetzt hatte, war der Minus bestand verschwunden.
Sachen gibst :wink:

Jetzt darf ich nur noch den Rest aufräumen was ja aber mit ein paar SQL Abfragen fix geht.

Interessanter ist aber wohl wieso Entwickler sowas zusammen schreiben und dann verkaufen.

1 „Gefällt mir“

Vielleicht hilft es jemandem weiter: Bei uns verhält es sich so, dass die Artikel immer doppelt reserviert werden, weil vor dem abschließen der offenen Bestellung der Bestand durch das ERP System schon aktualisiert wurde.

  • D.h. in Shopware ist ein Artikel mit Lagerbestand 10, verfügbarer Bestand 10.
  • 2 Bestellungen kommen rein → Lagerbestand 10, verfügbarer Bestand 8 (es sind ja 2 Bestellungen offen)
  • ERP holt die Bestellungen ab und zählt das eigene Lager runter auf 8
  • ERP gibt den aktuellen Lagerbestand wieder an Shopware → Lagerbestand 8, verfügbarer Bestand 6 (es sind ja noch immer 2 Bestellungen offen)

Es gibt schon ein Ticket, wo man sich eine Konfigurations-Option wünscht den verfügbaren Bestand zu ignorieren und bei der Bestellung gleich vom Lager abzuziehen. Wer auch das Problem hat, bitte voten.

3 „Gefällt mir“

Müsste das ERP den Status nicht auf „In Bearbeitung“ setzen? Dann wäre die Frage, ob Shopware den Bestand dann mindert.

mit welchen SQL Anweisungen hast Du das Problem jetzt gelöst?
Ich habe auch mehrere Artikel wo der verfügbare Bestand nicht passt

Hi, Bestände werden über die Klasse „Shopware\Core\Content\Product\DataAbstractionLayer\StockUpdater.php“ geändert.

In der Funktion „updateAvailableStockAndSales“ über die SQL Anfrage

$sql = '
SELECT LOWER(HEX(order_line_item.product_id)) as product_id,
    IFNULL(
        SUM(IF(state_machine_state.technical_name = :completed_state, 0, order_line_item.quantity)),
        0
    ) as open_quantity,

    IFNULL(
        SUM(IF(state_machine_state.technical_name = :completed_state, order_line_item.quantity, 0)),
        0
    ) as sales_quantity

FROM order_line_item
    INNER JOIN `order`
        ON `order`.id = order_line_item.order_id
        AND `order`.version_id = order_line_item.order_version_id
    INNER JOIN state_machine_state
        ON state_machine_state.id = `order`.state_id
        AND state_machine_state.technical_name <> :cancelled_state

WHERE order_line_item.product_id IN (:ids)
    AND order_line_item.type = :type
    AND order_line_item.version_id = :version
    AND order_line_item.product_id IS NOT NULL
GROUP BY product_id;
        ';

abgerufen und über die Zeile

$update = new RetryableQuery(
            $this->connection,
            $this->connection->prepare('UPDATE product SET available_stock = stock - :open_quantity, sales = :sales_quantity, updated_at = :now WHERE id = :id')
        );

berechnet.

Eine Lösung für euer Problem wäre es ein Plugin zu erstellen mit einem Subscriber (alternativ die Klasse aus Performancegründen überschreiben, aber damit habe ich mich in der SW Umgebung noch nicht befasst) auf die Events in denen die Funktion aufgerufen wird und dort euer eigenes update Statement zu verwenden.

$update = new RetryableQuery(
            $this->connection,
            $this->connection->prepare('UPDATE product SET available_stock = stock , sales = :sales_quantity, updated_at = :now WHERE id = :id')
        );

Grüße

Hallo,

es würde mir erstmal reichen wenn ich manuell die Fehler beheben kann.
Habe auf den ersten Blick aber nicht gefunden aus welcher Tabelle er den verfügbaren Bestand bildet.

Ich schätze mal das es bei mir ca. 30-50 Artikel sind wo der Bestand nicht passt.

Habe auf den ersten Blick aber nicht gefunden aus welcher Tabelle er den verfügbaren Bestand bildet.

das habe ich bereits 2x in diesem Thread beantwortet, zuletzt direkt im Post vorher.

aber alle guten Dinge sind 3:

Die Klasse „Shopware\Core\Content\Product\DataAbstractionLayer\StockUpdater.php“ macht das.

Die holt sich alle LineItems, und dann zählt das Ding durch was davon ist offen oder in bearbeitung, die Teile addiert es auf, und die Summe davon wird dann vom Bestand abgezogen (pro Produkt) und das ist dann der verfügbare Bestand.

Noch mehr Infos findest du in meinem Post von 2021 in diesem Thread