I am using Magento 2 enterprise edition (2.0.6)
I want to apply discount on sub total, Discount is applied from cart page (added a button on cart which applies the discount) and then if I go to checkout discount is visible there.
Now I am trying to add button on checkout second page to apply discount. The discount is applied but the order summary is not updated. If I click on button (checkout page) and goto payment express, it shows the discounted amount.
even if i goto cart page after applying discount on checkout it is visible on cart and then visible on checkout also.
I took reference from how to add fee to order totals in magento2 to apply discount
Below is my code
[Namespace]/[ModuleName]/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="custom" instance="[Namespace]\[ModuleName]\Model\Total\Quote\Custom" sort_order="420">
</item>
</group>
</section>
</config>
I created Model under [Namespace]/[ModuleName]/Model/Total/Quote/Custom.php
namespace [Namespace]\[ModuleName]\Model\Total\Quote;
class Custom extends \Magento\Quote\Model\Quote\Address\Total\AbstractTotal
{
protected $_priceCurrency;
public function __construct(
\Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency,
\Magento\Checkout\Model\Session $checkoutSession,
\[Namespace]/[ModuleName]\Helper\Data $helper
){
$this->_priceCurrency = $priceCurrency;
$this->checkoutSession = $checkoutSession;
$this->helper = $helper;
}
public function getDiscountAmount()
{
return $this->helper->getDiscountAmount();
}
/**
* @param \Magento\Quote\Model\Quote $quote
* @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment
* @param \Magento\Quote\Model\Quote\Address\Total $total
* @return $this|bool
*/
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);
$address = $shippingAssignment->getShipping()->getAddress();
$label = 'My Custom Discount';
$discountAmount = -self::getDiscountAmount();
$appliedCartDiscount = 0;
if ($address->getAddressType() == 'shipping')
{
if($total->getDiscountDescription())
{
// If a discount exists in cart and another discount is applied, the add both discounts.
$appliedCartDiscount = $total->getDiscountAmount();
$discountAmount = $total->getDiscountAmount()+$discountAmount;
$label = $total->getDiscountDescription().', '.$label;
}
$total->setDiscountDescription($label);
$total->setDiscountAmount($discountAmount);
$total->setBaseDiscountAmount($discountAmount);
$total->setSubtotalWithDiscount($total->getSubtotal() + $discountAmount);
$total->setBaseSubtotalWithDiscount($total->getBaseSubtotal() + $discountAmount);
if(isset($appliedCartDiscount))
{
$total->addTotalAmount($this->getCode(), $discountAmount - $appliedCartDiscount);
$total->addBaseTotalAmount($this->getCode(), $discountAmount - $appliedCartDiscount);
}
else
{
$total->addTotalAmount($this->getCode(), $discountAmount);
$total->addBaseTotalAmount($this->getCode(), $discountAmount);
}
}
return $this;
}
}
checkout second page? The Shipping step? – Khoa TruongDinh Sep 13 '16 at 10:54