Stock Check im Warenkorb umgehen

Hallo,

ich möchte für bestimmte BasketItems erreichen, dass der Stock nicht gecheckt wird und diese im Basket bleiben, auch wenn der Stock 0 ist und sie normalerweise entfernt würden.
Ich habe dies über Basket->addToBasket() und BasektItem->setAmount() versucht, aber leider werden die Artikel noch immer entfernt, sobald man den Warenkorb neu lädt.
Was habe ich übersehen?
Danke!

Hallo :slight_smile:

innerhalb der addToBasket() Funktion findet die Prüfung statt ob die Lagerverwaltung aktiv ist im Admin.

Diese Stelle musst über Modul überladen und bei den Artikeln eine neue Einstellung hinterlegen ob es ich um einen Artikel handelt, bei dem die Lagerverwaltung nicht angewendet werden soll.

Viele Grüße,
Tim

Hallo Tim,

danke für die schnelle Antwort!
Ich habe sowohl in Basket->addToBasket() wie auch in BasektItem->setAmount() alles auskommentiert, was mit Stock zu tun hat, und trotzdem werden die Artikel, die keinen Stock haben weiterhin entfernt.
Ich möchte, dass die Einstellung am Artikel selber unverändert bleibt, ein Artikel, der bei Stock 0 nicht bestellbar ist soll ausnahmsweise bestellbar sein. Das möchte ich über ein Feld am BasketItem erreichen. Aber im Moment kann ich noch nicht mal den Stock Check ganz allgemein deaktivieren.

Viele Grüße,
Alban

Hallo Alban,

Grundidee Deiner Anpassung ist die Lageverwaltung bei bestimmten Artikeln auszuknipsen, damit diese in Warenkorb landen können.

Von Konzeption bräuchte jeder Artikel die Information ob es ein Artikel ist der auch bei Anzahl = 0 noch bestellbar sein sollte und dann sollte bei addToBasket() eine Prüfung stattfinden wie der Artikel konfiguriert ist und wenn bestellbar sein soll, dann Lagerverwaltung temporär ausknipsen für den einen Artikel.

Generell könntest testen ob dies nicht bereits über die Standard Lagerverwaltung von OXID eShop möglich ist, indem negative Lagerbestände erlaubst. Dein Problem ist nur, dass dies dann Global für alle Artikel gelten würde und nicht auf Artikelbasis.

Viele Grüße,
Tim

05848170643ab0deb9914566391c0c63 anpassen…

Article.php
public function getStockStatus()
    {
        if($this->getId() == "05848170643ab0deb9914566391c0c63"){$this->_blNotBuyable = 0; return 0;}
        return $this->_iStockStatus;
    }



public function setBuyableState($blBuyable = false)
    {
        if($this->getId() == "05848170643ab0deb9914566391c0c63"){$blBuyable = 1;}
        $this->_blNotBuyable = !$blBuyable;
    }



Basketitem.php
public function getStockCheckStatus()
    {
        if($this->getProductId() == "05848170643ab0deb9914566391c0c63")return 0;
        return $this->_blCheckArticleStock;
    }

Hallo rubbercut,

vielen Dank auch für diese Hinweise! Dadurch habe ich BasketItem.php noch mal genauer angeschaut und endlich die Stelle gefunden, die ich brauche um den Stock Check zu überspringen, in getArticle() eine zusätzliche if Abfrage

// cant put not buyable product to basket
            if(!$this->_blMySpecificBasketItemCondition) {
                if ($blCheckProduct && !$this->_oArticle->isBuyable()) {
                    /** @var \OxidEsales\Eshop\Core\Exception\ArticleInputException $oEx */
                    $oEx = oxNew(\OxidEsales\Eshop\Core\Exception\ArticleInputException::class);
                    $oEx->setMessage('ERROR_MESSAGE_ARTICLE_ARTICLE_NOT_BUYABLE');
                    $oEx->setArticleNr($sProductId);
                    $oEx->setProductId($sProductId);
                    throw $oEx;
                }
            }

Ich benötige dann einen weiteren Schritt, wenn der Basket zu einer Order werden soll, und zwar in Order.php in validateStock()

Nur zum Verständnis: Du möchtest bestimmte Artikel bestellen können, unabhängig wie der Bestand ist, ja?
Bei Artikel->Lager einfach das Lager auf Fremdlager setzten wäre keine Lösung?

1 Like

Hi Matze,

nein, das soll nicht grundsätzlich der Fall sein, sondern nur unter bestimmten Umständen. Der Kunde soll vorbestellte Artikel wieder zu einem neuen Warenkorb hinzufügen können. Nur für diese BasketItems soll gelten, dass der Bestand egal ist. Die alten Vorbestellungen werden dann bei Abschluss der Order storniert und die Bestände daraus wieder freigegeben.