예제 #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;
 }
 /**
  * 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\\Resource\\RuleFactory', ['create'], [], '', false);
     $this->catalogRuleResourceMock = $this->getMock('\\Magento\\CatalogRule\\Model\\Resource\\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);
 }
예제 #3
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;
 }
예제 #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 = $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;
 }
예제 #5
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;
 }