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;
}