To override your CouponPost.php
controller file you can add preference
in di.xml file here..
app/code/Vendor/Module/etc/di.xml
Content for this file is..
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Checkout\Controller\Cart\CouponPost" type="Vendor\Module\Controller\Cart\CouponPost" />
</config>
app/code/Vendor/Module/Controller/Cart/CouponPost.php
Content for this file is..
<?php
namespace Vendor\Module\Controller\Cart;
class CouponPost extends \Magento\Checkout\Controller\Cart\CouponPost
{
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Checkout\Model\Session $checkoutSession,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator,
\Magento\Checkout\Model\Cart $cart,
\Magento\SalesRule\Model\CouponFactory $couponFactory,
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository
) {
parent::__construct(
$context,
$scopeConfig,
$checkoutSession,
$storeManager,
$formKeyValidator,
$cart,
$couponFactory,
$quoteRepository
);
}
public function execute()
{
$couponCode = $this->getRequest()->getParam('remove') == 1
? ''
: trim($this->getRequest()->getParam('coupon_code'));
$cartQuote = $this->cart->getQuote();
$oldCouponCode = $cartQuote->getCouponCode();
$codeLength = strlen($couponCode);
if (!$codeLength && !strlen($oldCouponCode)) {
return $this->_goBack();
}
try {
$isCodeLengthValid = $codeLength && $codeLength <= \Magento\Checkout\Helper\Cart::COUPON_CODE_MAX_LENGTH;
$itemsCount = $cartQuote->getItemsCount();
if ($itemsCount) {
$cartQuote->getShippingAddress()->setCollectShippingRates(true);
$cartQuote->setCouponCode($isCodeLengthValid ? $couponCode : '')->collectTotals();
$this->quoteRepository->save($cartQuote);
}
if ($codeLength) {
$escaper = $this->_objectManager->get(\Magento\Framework\Escaper::class);
$coupon = $this->couponFactory->create();
$coupon->load($couponCode, 'code');
if (!$itemsCount) {
if ($isCodeLengthValid && $coupon->getId()) {
$this->_checkoutSession->getQuote()->setCouponCode($couponCode)->save();
$this->messageManager->addSuccessMessage(
__(
'You used coupon code "%1".',
$escaper->escapeHtml($couponCode)
)
);
} else {
$this->messageManager->addErrorMessage(
__(
'The coupon code "%1" is not valid.',
$escaper->escapeHtml($couponCode)
)
);
}
} else {
if ($isCodeLengthValid && $coupon->getId() && $couponCode == $cartQuote->getCouponCode()) {
$this->messageManager->addSuccessMessage(
__(
'You used coupon code "%1".',
$escaper->escapeHtml($couponCode)
)
);
} else {
$this->messageManager->addErrorMessage(
__(
'The coupon code "%1" is not valid.',
$escaper->escapeHtml($couponCode)
)
);
}
}
} else {
$this->messageManager->addSuccessMessage(__('You canceled the coupon code.'));
}
} catch (\Magento\Framework\Exception\LocalizedException $e) {
$this->messageManager->addErrorMessage($e->getMessage());
} catch (\Exception $e) {
$this->messageManager->addErrorMessage(__('We cannot apply the coupon code.'));
$this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
}
return $this->_goBack();
}
}
Hope it will help you!