diff --git a/Plugin/PluginUtility.php b/Plugin/PluginUtility.php index 1ffb50e..a1edabd 100755 --- a/Plugin/PluginUtility.php +++ b/Plugin/PluginUtility.php @@ -11,6 +11,7 @@ use Exception; use Magento\SalesRule\Model\CouponFactory; use MagePal\LimitGuestCheckoutCoupon\Helper\Data; +use Magento\Sales\Model\ResourceModel\Order\CollectionFactory; class PluginUtility { @@ -25,17 +26,26 @@ class PluginUtility protected $helperData; /** - * PluginUtility constructor. - * @param CouponFactory $couponFactory - * @param Data $helperData + * @var \Magento\Sales\Model\ResourceModel\Order\CollectionFactory + */ + protected $_orderCollectionFactory; + + /** + * @param \Magento\SalesRule\Model\CouponFactory $couponFactory + * @param \MagePal\LimitGuestCheckoutCoupon\Helper\Data $helperData + * @param \MagePal\LimitGuestCheckoutCoupon\Logger\Logger $logger + * @param \Magento\Sales\Model\ResourceModel\Order\CollectionFactory $orderCollectionFactory */ public function __construct( CouponFactory $couponFactory, - Data $helperData + Data $helperData, + CollectionFactory $orderCollectionFactory ) { $this->couponFactory = $couponFactory; $this->helperData = $helperData; + $this->_orderCollectionFactory = $orderCollectionFactory; } + /** * @param $subject * @param Closure $proceed @@ -48,17 +58,38 @@ public function aroundCanProcessRule($subject, Closure $proceed, $rule, $address { $result = $proceed($rule, $address); - $couponCode = $address->getQuote()->getCouponCode(); + if (!$this->helperData->isEnabled()) { + return $result; + } + + $quote = $address->getQuote(); + $couponCode = $quote->getCouponCode(); + + if ($couponCode) { - if ($this->helperData->isEnabled() && $couponCode) { $coupon = $this->couponFactory->create(); $coupon->load($couponCode, 'code'); - if ($coupon->getId() && $rule->getUsesPerCoupon() - && $coupon->getTimesUsed() >= $rule->getUsesPerCoupon() - ) { + if ($coupon->getId() && + $rule->getUsesPerCoupon() && + $coupon->getTimesUsed() >= $rule->getUsesPerCoupon()) { $result = false; } + + $customerId = $quote->getCustomerId(); + $email = $quote->getBillingAddress()->getEmail(); + + if ($coupon->getId() && !$customerId && $email) { + + $collection = $this->_orderCollectionFactory->create() + ->addAttributeToSelect('*') + ->addFieldToFilter('customer_email', ['eq' => $email]) + ->addFieldToFilter('coupon_code', ['eq' => $couponCode]); + + if ($collection->getSize() >= $rule->getUsesPerCustomer()) { + $result = false; + } + } } return $result;