Update total using ‘sales_quote_save_after’ event in magento 2?

Update total amount if selecting a shipping method on the checkout

app/code/Vendor/Module/etc/sales.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Sales:etc/sales.xsd">
    <section name="quote">
        <group name="totals">
            <item name="voucher" instance="Vendor\Module\Model\Quote\Discount" sort_order="450">
                <renderer name="adminhtml" instance="Vendor\Module\Block\Adminhtml\Order\Create\Totals\Fee"/>
                <renderer name="frontend" instance="Vendor\Module\Block\Checkout\Fee"/>
            </item>
        </group>
    </section>
</config>

app/code/Vendor/Module/Model/Quote/Discount.php

<?php

namespace Vendor\Module\Model\Quote;

use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\App\Request\Http as Request;

class Discount extends \Magento\Quote\Model\Quote\Address\Total\AbstractTotal
{
    /**
     * Discount calculation object
     *
     * @var \Magento\SalesRule\Model\Validator
     */
    protected $calculator;

    /**
     * Core event manager proxy
     *
     * @var \Magento\Framework\Event\ManagerInterface
     */
    protected $eventManager = null;

    /**
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $storeManager;

    /**
     * @var \Magento\Framework\Pricing\PriceCurrencyInterface
     */
    protected $priceCurrency;

    protected $shippingDiscountAdditional;
    protected $baseShippingDiscountAdditional;
    protected $shippingDiscount;
    protected $baseShippingDiscount;
    protected $logger;
    protected $request;


    public function __construct(
        \Magento\Framework\Event\ManagerInterface $eventManager,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency,
        \Magento\Framework\App\Request\Http $request,
        \Psr\Log\LoggerInterface $logger
    ) {
        $this->eventManager = $eventManager;
        $this->storeManager = $storeManager;
        $this->priceCurrency = $priceCurrency;
        $this->logger = $logger;
        $this->request  = $request;
    }

    /**
     * Collect address discount amount
     *
     * @param \Magento\Quote\Model\Quote $quote
     * @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment
     * @param \Magento\Quote\Model\Quote\Address\Total $total
     * @return $this
     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
     */
    public function collect(
        \Magento\Quote\Model\Quote $quote,
        \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment,
        \Magento\Quote\Model\Quote\Address\Total $total
    ) {
        parent::collect($quote, $shippingAssignment, $total);

        $store = $this->storeManager->getStore($quote->getStoreId());
        /** @var $address \Magento\Quote\Model\Shipping */
        $address = $shippingAssignment->getShipping()->getAddress();

        $items = $shippingAssignment->getItems();

        if (!count($items)) {
            return $this;
        }

        try {

        $method = $quote->getShippingAddress()->getShippingMethod();

        if ($method == 'flatrate_flatrate') {
            $charge = 10;
            $total->setTotalAmount('fee', $charge);
            $total->setBaseTotalAmount('fee', $charge);
            $total->setFee($charge);
            $quote->setFee($charge);
            $total->setGrandTotal($total->getGrandTotal() + $charge);
            $total->setBaseGrandTotal($total->getBaseGrandTotal() + $charge);
            $quote->save();
        }

        } catch (\Exception $e) {
            $this->logger->critical($e->getMessage());
        }
        return $this;
    }

    /**
     * Add discount total information to address
     *
     * @param \Magento\Quote\Model\Quote $quote
     * @param \Magento\Quote\Model\Quote\Address\Total $total
     * @return array|null
     */
    public function fetch(\Magento\Quote\Model\Quote $quote, \Magento\Quote\Model\Quote\Address\Total $total)
    {
        $result = null;
        $amount = $total->getFee();

        if ($amount != 0) {
            $description = $total->getDiscountDescription();
            $result = [
                'code' => 'fee',
                'title' => __('Fee'),
                'value' => $amount,
            ];
        }
        return $result;
    }
}

app/code/Vendor/Module/Block/Checkout/Fee.php

<?php

namespace Vendor\Module\Block\Checkout;

class Fee extends \Magento\Checkout\Block\Total\DefaultTotal
{
//Our code to be written
}

Leave a comment

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