Read More
Read More
Menu Close

    Set Custom Price for Product In Multiple Addresses Checkout

    Sometimes it is required to set the custom price of product on the go. The issue occurs when we try to Checkout with Multiple Addresses, the Subtotal for each address is again calculated and we get original price for the product.

    To update the Price of Product check file:

    vendor/magento/module-quote/Model/Quote/Address/Total/Subtotal.php, the price is get from product in _initItem() method and set in _calculateRowTotal() method.

        /**
         * Address item initialization
         *
         * @param Address $address
         * @param AddressItem|Item $item
         * @return bool
         */
        protected function _initItem($address, $item)
        {
            if ($item instanceof AddressItem) {
                $quoteItem = $item->getAddress()->getQuote()->getItemById($item->getQuoteItemId());
            } else {
                $quoteItem = $item;
            }
            $product = $quoteItem->getProduct();
            $product->setCustomerGroupId($quoteItem->getQuote()->getCustomerGroupId());
    
            /**
             * Quote super mode flag mean what we work with quote without restriction
             */
            if ($item->getQuote()->getIsSuperMode()) {
                if (!$product) {
                    return false;
                }
            } else {
                if (!$product || !$product->isVisibleInCatalog()) {
                    return false;
                }
            }
    
            $quoteItem->setConvertedPrice(null);
            $originalPrice = $product->getPrice();
            if ($quoteItem->getParentItem() && $quoteItem->isChildrenCalculated()) {
                $finalPrice = $quoteItem->getParentItem()->getProduct()->getPriceModel()->getChildFinalPrice(
                    $quoteItem->getParentItem()->getProduct(),
                    $quoteItem->getParentItem()->getQty(),
                    $product,
                    $quoteItem->getQty()
                );
                $this->_calculateRowTotal($item, $finalPrice, $originalPrice);
            } elseif (!$quoteItem->getParentItem()) {
                $finalPrice = $product->getFinalPrice($quoteItem->getQty());
                $this->_calculateRowTotal($item, $finalPrice, $originalPrice);
                $this->_addAmount($item->getRowTotal());
                $this->_addBaseAmount($item->getBaseRowTotal());
                $address->setTotalQty($address->getTotalQty() + $item->getQty());
            }
            return true;
        }
    
        /**
         * Processing calculation of row price for address item
         *
         * @param AddressItem|Item $item
         * @param int $finalPrice
         * @param int $originalPrice
         * @return $this
         */
        protected function _calculateRowTotal($item, $finalPrice, $originalPrice)
        {
            if (!$originalPrice) {
                $originalPrice = $finalPrice;
            }
            $item->setPrice($finalPrice)->setBaseOriginalPrice($originalPrice);
            $item->calcRowTotal();
            return $this;
        }

    You can use these methods to update the product price as per your condition. Hope, this may help someone while setting custom price for product. Thanks 🙂

    Searching for an experienced
    Magento 2 Company ?
    Read More
    . . .
    Discuss on Helpdesk

    Leave a Comment

    Your email address will not be published. Required fields are marked*


    Be the first to comment.

    Back to Top