/** * Apply catalog price rules to product in admin * * @param \Magento\Framework\Event\Observer $observer * @return $this */ public function execute(\Magento\Framework\Event\Observer $observer) { $product = $observer->getEvent()->getProduct(); $storeId = $product->getStoreId(); $date = $this->localeDate->scopeDate($storeId); $key = false; $ruleData = $this->coreRegistry->registry('rule_data'); if ($ruleData) { $wId = $ruleData->getWebsiteId(); $gId = $ruleData->getCustomerGroupId(); $pId = $product->getId(); $key = "{$date->format('Y-m-d H:i:s')}|{$wId}|{$gId}|{$pId}"; } elseif ($product->getWebsiteId() !== null && $product->getCustomerGroupId() !== null) { $wId = $product->getWebsiteId(); $gId = $product->getCustomerGroupId(); $pId = $product->getId(); $key = "{$date->format('Y-m-d H:i:s')}|{$wId}|{$gId}|{$pId}"; } if ($key) { if (!$this->rulePricesStorage->hasRulePrice($key)) { $rulePrice = $this->resourceRuleFactory->create()->getRulePrice($date, $wId, $gId, $pId); $this->rulePricesStorage->setRulePrice($key, $rulePrice); } if ($this->rulePricesStorage->getRulePrice($key) !== false) { $finalPrice = min($product->getData('final_price'), $this->rulePricesStorage->getRulePrice($key)); $product->setFinalPrice($finalPrice); } } return $this; }
/** * Apply catalog price rules to product on frontend * * @param \Magento\Framework\Event\Observer $observer * @return $this */ public function execute(\Magento\Framework\Event\Observer $observer) { $product = $observer->getEvent()->getProduct(); $pId = $product->getId(); $storeId = $product->getStoreId(); if ($observer->hasDate()) { $date = new \DateTime($observer->getEvent()->getDate()); } else { $date = $this->localeDate->scopeDate($storeId); } if ($observer->hasWebsiteId()) { $wId = $observer->getEvent()->getWebsiteId(); } else { $wId = $this->storeManager->getStore($storeId)->getWebsiteId(); } if ($observer->hasCustomerGroupId()) { $gId = $observer->getEvent()->getCustomerGroupId(); } elseif ($product->hasCustomerGroupId()) { $gId = $product->getCustomerGroupId(); } else { $gId = $this->customerSession->getCustomerGroupId(); } $key = "{$date->format('Y-m-d H:i:s')}|{$wId}|{$gId}|{$pId}"; if (!$this->rulePricesStorage->hasRulePrice($key)) { $rulePrice = $this->resourceRuleFactory->create()->getRulePrice($date, $wId, $gId, $pId); $this->rulePricesStorage->setRulePrice($key, $rulePrice); } if ($this->rulePricesStorage->getRulePrice($key) !== false) { $finalPrice = min($product->getData('final_price'), $this->rulePricesStorage->getRulePrice($key)); $product->setFinalPrice($finalPrice); } return $this; }
/** * Returns catalog rule value * * @return float|boolean */ public function getValue() { if (null === $this->value) { $this->value = $this->resourceRuleFactory->create()->getRulePrice($this->dateTime->scopeDate($this->storeManager->getStore()->getId()), $this->storeManager->getStore()->getWebsiteId(), $this->customerSession->getCustomerGroupId(), $this->product->getId()); $this->value = $this->value ? floatval($this->value) : false; if ($this->value) { $this->value = $this->priceCurrency->convertAndRound($this->value); } } return $this->value; }
/** * Set up */ public function setUp() { $this->saleableItemMock = $this->getMock('Magento\\Catalog\\Model\\Product', ['getId', '__wakeup', 'getPriceInfo'], [], '', false); $this->dataTimeMock = $this->getMockForAbstractClass('Magento\\Framework\\Stdlib\\DateTime\\TimezoneInterface', [], '', false, true, true, []); $this->coreStoreMock = $this->getMock('\\Magento\\Store\\Model\\Store', [], [], '', false); $this->storeManagerMock = $this->getMock('Magento\\Store\\Model\\StoreManager', [], [], '', false); $this->storeManagerMock->expects($this->any())->method('getStore')->will($this->returnValue($this->coreStoreMock)); $this->customerSessionMock = $this->getMock('Magento\\Customer\\Model\\Session', [], [], '', false); $this->priceInfoMock = $this->getMock('\\Magento\\Framework\\Pricing\\PriceInfo', ['getAdjustments'], [], '', false); $this->catalogRuleResourceFactoryMock = $this->getMock('\\Magento\\CatalogRule\\Model\\ResourceModel\\RuleFactory', ['create'], [], '', false); $this->catalogRuleResourceMock = $this->getMock('\\Magento\\CatalogRule\\Model\\ResourceModel\\Rule', [], [], '', false); $this->coreWebsiteMock = $this->getMock('\\Magento\\Store\\Model\\Website', [], [], '', false); $this->priceInfoMock->expects($this->any())->method('getAdjustments')->will($this->returnValue([])); $this->saleableItemMock->expects($this->any())->method('getPriceInfo')->will($this->returnValue($this->priceInfoMock)); $this->catalogRuleResourceFactoryMock->expects($this->any())->method('create')->will($this->returnValue($this->catalogRuleResourceMock)); $this->calculator = $this->getMockBuilder('Magento\\Framework\\Pricing\\Adjustment\\Calculator')->disableOriginalConstructor()->getMock(); $qty = 1; $this->priceCurrencyMock = $this->getMock('\\Magento\\Framework\\Pricing\\PriceCurrencyInterface'); $this->object = new CatalogRulePrice($this->saleableItemMock, $qty, $this->calculator, $this->priceCurrencyMock, $this->dataTimeMock, $this->storeManagerMock, $this->customerSessionMock, $this->catalogRuleResourceFactoryMock); }
/** * 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; }
/** * 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; }