I'm trying to update cart item price depends on quote grand total. I've made an observer to change price before cart is saved. My problem is that values for changed items are changed in wrong time. Example:
I have two items in cart #1 Item - $150, #2 Item - $10, when I change qty ot first item total of this item is set to $300 (it's ok), however price of #2 Item is changed to 0 (it's ok) but in database I still see price, base_price, row_total, base_row_total, price_incl_tax, base_price_incl_tax, row_total_incl_tax, base_row_incl_tax
with $10 values. When I again change qty of #1 Item, #2 Item changes price to $10 but values in database are now set to 0. Where and how should I change price to have correct data in database?
Here is my code:
events.xml:
<event name="checkout_cart_save_before">
<observer name="Vendor::save_cart” instance="Vendor\Observer\BeforeCartSaveObserver" shared="false"/>
</event>
Observer:
public function execute(\Magento\Framework\Event\Observer $observer)
{
$cart = $observer->getCart();
$quote = $this->checkoutSession->getQuote();
$quote->collectTotals();
$quote->setTotalsCollectedFlag(false);
foreach ($quote->getAllVisibleItems() as $item) {
$product = $item->getProduct();
if (!$product->getIsFree()) {
continue;
}
$freeItem = $item;
break;
}
if ($quote->getGrandTotal() > 240) {
$item->setCustomPrice(0)
->setOriginalCustomPrice(0)
->getProduct()->setIsSuperMode(true);
} else {
$product = $freeItem->getProduct();
$defaultProductPrice = $product->getPriceInfo()
->getPrice('regular_price')
->getAmount()
->getBaseAmount();
$item->setConvertedPrice($defaultProductPrice)
->setCustomPrice($defaultProductPrice)
->setOriginalCustomPrice($defaultProductPrice);
$item->setPrice($defaultProductPrice)->setBaseOriginalPrice($item->getProduct()->getPrice());
}
$item->calcRowTotal();
return $this;
}