CouponPost.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Checkout\Controller\Cart;
  7. use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
  8. /**
  9. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  10. */
  11. class CouponPost extends \Magento\Checkout\Controller\Cart implements HttpPostActionInterface
  12. {
  13. /**
  14. * Sales quote repository
  15. *
  16. * @var \Magento\Quote\Api\CartRepositoryInterface
  17. */
  18. protected $quoteRepository;
  19. /**
  20. * Coupon factory
  21. *
  22. * @var \Magento\SalesRule\Model\CouponFactory
  23. */
  24. protected $couponFactory;
  25. /**
  26. * @param \Magento\Framework\App\Action\Context $context
  27. * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
  28. * @param \Magento\Checkout\Model\Session $checkoutSession
  29. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  30. * @param \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator
  31. * @param \Magento\Checkout\Model\Cart $cart
  32. * @param \Magento\SalesRule\Model\CouponFactory $couponFactory
  33. * @param \Magento\Quote\Api\CartRepositoryInterface $quoteRepository
  34. * @codeCoverageIgnore
  35. */
  36. public function __construct(
  37. \Magento\Framework\App\Action\Context $context,
  38. \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
  39. \Magento\Checkout\Model\Session $checkoutSession,
  40. \Magento\Store\Model\StoreManagerInterface $storeManager,
  41. \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator,
  42. \Magento\Checkout\Model\Cart $cart,
  43. \Magento\SalesRule\Model\CouponFactory $couponFactory,
  44. \Magento\Quote\Api\CartRepositoryInterface $quoteRepository
  45. ) {
  46. parent::__construct(
  47. $context,
  48. $scopeConfig,
  49. $checkoutSession,
  50. $storeManager,
  51. $formKeyValidator,
  52. $cart
  53. );
  54. $this->couponFactory = $couponFactory;
  55. $this->quoteRepository = $quoteRepository;
  56. }
  57. /**
  58. * Initialize coupon
  59. *
  60. * @return \Magento\Framework\Controller\Result\Redirect
  61. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  62. * @SuppressWarnings(PHPMD.NPathComplexity)
  63. */
  64. public function execute()
  65. {
  66. $couponCode = $this->getRequest()->getParam('remove') == 1
  67. ? ''
  68. : trim($this->getRequest()->getParam('coupon_code'));
  69. $cartQuote = $this->cart->getQuote();
  70. $oldCouponCode = $cartQuote->getCouponCode();
  71. $codeLength = strlen($couponCode);
  72. if (!$codeLength && !strlen($oldCouponCode)) {
  73. return $this->_goBack();
  74. }
  75. try {
  76. $isCodeLengthValid = $codeLength && $codeLength <= \Magento\Checkout\Helper\Cart::COUPON_CODE_MAX_LENGTH;
  77. $itemsCount = $cartQuote->getItemsCount();
  78. if ($itemsCount) {
  79. $cartQuote->getShippingAddress()->setCollectShippingRates(true);
  80. $cartQuote->setCouponCode($isCodeLengthValid ? $couponCode : '')->collectTotals();
  81. $this->quoteRepository->save($cartQuote);
  82. }
  83. if ($codeLength) {
  84. $escaper = $this->_objectManager->get(\Magento\Framework\Escaper::class);
  85. $coupon = $this->couponFactory->create();
  86. $coupon->load($couponCode, 'code');
  87. if (!$itemsCount) {
  88. if ($isCodeLengthValid && $coupon->getId()) {
  89. $this->_checkoutSession->getQuote()->setCouponCode($couponCode)->save();
  90. $this->messageManager->addSuccessMessage(
  91. __(
  92. 'You used coupon code "%1".',
  93. $escaper->escapeHtml($couponCode)
  94. )
  95. );
  96. } else {
  97. $this->messageManager->addErrorMessage(
  98. __(
  99. 'The coupon code "%1" is not valid.',
  100. $escaper->escapeHtml($couponCode)
  101. )
  102. );
  103. }
  104. } else {
  105. if ($isCodeLengthValid && $coupon->getId() && $couponCode == $cartQuote->getCouponCode()) {
  106. $this->messageManager->addSuccessMessage(
  107. __(
  108. 'You used coupon code "%1".',
  109. $escaper->escapeHtml($couponCode)
  110. )
  111. );
  112. } else {
  113. $this->messageManager->addErrorMessage(
  114. __(
  115. 'The coupon code "%1" is not valid.',
  116. $escaper->escapeHtml($couponCode)
  117. )
  118. );
  119. }
  120. }
  121. } else {
  122. $this->messageManager->addSuccessMessage(__('You canceled the coupon code.'));
  123. }
  124. } catch (\Magento\Framework\Exception\LocalizedException $e) {
  125. $this->messageManager->addErrorMessage($e->getMessage());
  126. } catch (\Exception $e) {
  127. $this->messageManager->addErrorMessage(__('We cannot apply the coupon code.'));
  128. $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
  129. }
  130. return $this->_goBack();
  131. }
  132. }