LineItem in den Warenkorb hinzufügen

Falls noch jemand auf dasselbe Problem stößt, hier mein Code.

public function addBonus(Request $request, SalesChannelContext $context)
    {
        $this->denyAccessUnlessLoggedIn();

        $data = $request->request;

        $cart = $this->cartService->getCart($context->getToken(), $context);

        //check if products are in cart
        $products = $this->findProducts($cart);

        $bonus = $this->findCustomBonus($cart);

        if ($products->count() === 0) {
            return;
        }

        if($bonus->count() !== 0){
            return $this->forwardToRoute($data->get("redirectTo"));
        }

        //create a discount
        $discountLineItem = $this->createDiscount();

        $definition = new QuantityPriceDefinition("-" . $data->get("add_bonus_balance"), new TaxRuleCollection(), $context->getContext()->getCurrencyPrecision(), 1, true);

        $discountLineItem->setPriceDefinition($definition);

        // add discount to new cart
        $cart->add($discountLineItem, $context);
        $this->cartService->recalculate($cart, $context);

        return $this->forwardToRoute($data->get("redirectTo"));
    }

    private function findProducts(Cart $cart): LineItemCollection
    {
        return $cart->getLineItems()->filter(function (LineItem $item) {
            if ($item->getType() !== LineItem::PRODUCT_LINE_ITEM_TYPE) {
                return false;
            }

            return $item;
        });
    }

    private function findCustomBonus(Cart $cart): LineItemCollection
    {
        return $cart->getLineItems()->filter(function (LineItem $item) {
            if ($item->getType() !== LineItem::CUSTOM_LINE_ITEM_TYPE) {
                return false;
            }

            if($item->getDescription() !== 'avs-custom-bonus'){
                return false;
            }

            return $item;
        });
    }

    private function createDiscount(): LineItem
    {
        $discountLineItem = new LineItem(Uuid::randomHex(), 'custom');

        $discountLineItem->setLabel('Bonusguthaben');
        $discountLineItem->setGood(false);
        $discountLineItem->setStackable(false);
        $discountLineItem->setDescription("avs-custom-bonus");
        $discountLineItem->setRemovable(true);
        $discountLineItem->setPayload([]);

        return $discountLineItem;
    }

 

1 „Gefällt mir“