rulePricesStorage = $rulePricesStorage; $this->resourceRuleFactory = $resourceRuleFactory; $this->storeManager = $storeManager; $this->localeDate = $localeDate; $this->customerSession = $customerSession; $this->groupManagement = $groupManagement; } /** * Apply catalog price rules to product on frontend * * @param \Magento\Framework\Event\Observer $observer * @return $this */ public function execute(\Magento\Framework\Event\Observer $observer) { /* @var $collection ProductCollection */ $collection = $observer->getEvent()->getCollection(); $store = $this->storeManager->getStore($observer->getEvent()->getStoreId()); $websiteId = $store->getWebsiteId(); if ($observer->getEvent()->hasCustomerGroupId()) { $groupId = $observer->getEvent()->getCustomerGroupId(); } else { if ($this->customerSession->isLoggedIn()) { $groupId = $this->customerSession->getCustomerGroupId(); } else { $groupId = $this->groupManagement->getNotLoggedInGroup()->getId(); } } if ($observer->getEvent()->hasDate()) { $date = new \DateTime($observer->getEvent()->getDate()); } else { $date = (new \DateTime())->setTimestamp($this->localeDate->scopeTimeStamp($store)); } $productIds = []; /* @var $product Product */ foreach ($collection as $product) { $key = implode('|', [$date->format('Y-m-d H:i:s'), $websiteId, $groupId, $product->getId()]); if (!$this->rulePricesStorage->hasRulePrice($key)) { $productIds[] = $product->getId(); } } if ($productIds) { $rulePrices = $this->resourceRuleFactory->create()->getRulePrices( $date, $websiteId, $groupId, $productIds ); foreach ($productIds as $productId) { $key = implode('|', [$date->format('Y-m-d H:i:s'), $websiteId, $groupId, $productId]); $this->rulePricesStorage->setRulePrice( $key, isset($rulePrices[$productId]) ? $rulePrices[$productId] : false ); } } return $this; } }