Example #1
0
 /**
  * Returns catalog rule value
  *
  * @return float|boolean
  */
 public function getValue()
 {
     if (null === $this->value) {
         $this->value = $this->resourceRuleFactory->create()->getRulePrice($this->dateTime->scopeTimeStamp($this->storeManager->getStore()->getId()), $this->storeManager->getStore()->getWebsiteId(), $this->customerSession->getCustomerGroupId(), $this->product->getId());
         $this->value = $this->value ? floatval($this->value) : false;
     }
     return $this->value;
 }
Example #2
0
 /**
  * Calculate product price based on special price data and price rules
  *
  * @param   float $basePrice
  * @param   float $specialPrice
  * @param   string $specialPriceFrom
  * @param   string $specialPriceTo
  * @param   bool|float|null $rulePrice
  * @param   mixed|null $wId
  * @param   integer|null $gId
  * @param   int|null $productId
  * @return  float
  */
 public function calculatePrice($basePrice, $specialPrice, $specialPriceFrom, $specialPriceTo, $rulePrice = false, $wId = null, $gId = null, $productId = null)
 {
     \Magento\Framework\Profiler::start('__PRODUCT_CALCULATE_PRICE__');
     if ($wId instanceof Store) {
         $sId = $wId->getId();
         $wId = $wId->getWebsiteId();
     } else {
         $sId = $this->_storeManager->getWebsite($wId)->getDefaultGroup()->getDefaultStoreId();
     }
     $finalPrice = $basePrice;
     $finalPrice = $this->calculateSpecialPrice($finalPrice, $specialPrice, $specialPriceFrom, $specialPriceTo, $sId);
     if ($rulePrice === false) {
         $date = $this->_localeDate->scopeDate($sId);
         $rulePrice = $this->_ruleFactory->create()->getRulePrice($date, $wId, $gId, $productId);
     }
     if ($rulePrice !== null && $rulePrice !== false) {
         $finalPrice = min($finalPrice, $rulePrice);
     }
     $finalPrice = max($finalPrice, 0);
     \Magento\Framework\Profiler::stop('__PRODUCT_CALCULATE_PRICE__');
     return $finalPrice;
 }
Example #3
0
 /**
  * @param EventObserver $observer
  * @return $this
  */
 public function prepareCatalogProductCollectionPrices(EventObserver $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 (!isset($this->_rulePrices[$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->_rulePrices[$key] = isset($rulePrices[$productId]) ? $rulePrices[$productId] : false;
         }
     }
     return $this;
 }
Example #4
0
 /**
  * @param EventObserver $observer
  * @return $this
  */
 public function prepareCatalogProductCollectionPrices(EventObserver $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 = Group::NOT_LOGGED_IN_ID;
         }
     }
     if ($observer->getEvent()->hasDate()) {
         $date = $observer->getEvent()->getDate();
     } else {
         $date = $this->_localeDate->scopeTimeStamp($store);
     }
     $productIds = array();
     /* @var $product Product */
     foreach ($collection as $product) {
         $key = implode('|', array($date, $websiteId, $groupId, $product->getId()));
         if (!isset($this->_rulePrices[$key])) {
             $productIds[] = $product->getId();
         }
     }
     if ($productIds) {
         $rulePrices = $this->_resourceRuleFactory->create()->getRulePrices($date, $websiteId, $groupId, $productIds);
         foreach ($productIds as $productId) {
             $key = implode('|', array($date, $websiteId, $groupId, $productId));
             $this->_rulePrices[$key] = isset($rulePrices[$productId]) ? $rulePrices[$productId] : false;
         }
     }
     return $this;
 }